Если вы являетесь владельцем DIY устройств с Tasmota или по каким то причинам ваше устройство отдает в MQTT топик значения в виде JSON строки, то можно сделать шаблон для Sprut.hub который сможет разобрать эту строку и использовать значения из нее.
Разберем пример, когда значение в топике выглядит как:
{"Time":"2022-08-04T13:53:47","DS18B20":{"Temperature":27.2},"TempUnit":"C"}
То в шаблоне нужно будет просто вставить функцию inFunc, которая будет вычленять из строки с JSON нужную часть:
{
"name": "TH16 Temp",
"manufacturer": "Sonoff",
"model": "18B20",
"services": [
{
"type": "TemperatureSensor",
"characteristics": [
{
"type": "CurrentTemperature",
"link": {
"topicSearch": "(tele/name)/SENSOR",
"type": "Float",
"topicGet": "(1)/SENSOR",
"inFunc": "JSON.parse(value).DS18B20.Temperature"
}
}
]
}
]
}
{
"name": "TH16 Temp",
"manufacturer": "Sonoff",
"model": "18B20",
"services": [
{
"type": "TemperatureSensor",
"characteristics": [
{
"type": "CurrentTemperature",
"link": {
"topicSearch": "(tele/name)/SENSOR",
"type": "Float",
"topicGet": "(1)/SENSOR",
"inFunc": "JSON.parse(value).DS18B20.Temperature"
}
}
]
}
]
}
При этом хочется напомнить, что TopicSearch должен быть уникальным для каждого шаблона. Если у вас уже где то в других шаблонах есть вероятность совпадения области поиска (в скобках) с другим шаблоном, то нужно сузить области поиска, например добавив туда неизменные текстовые части MQTT топиков чтобы сделать сегмент поиска уникальным.
Второй пример - если у вас есть датчик движения (например у камеры), который умеет отдавать определение движения и значение топика выглядит вот так:
{"motion":true,"humanoid":false}
соответственно в шаблоне мы можем использовать лишь его части, например motion:
{
"name": "Датчик движения",
"manufacturer": "Xiaomi",
"model": "MJSXJ02HL",
"catalogId": -1,
"services": [
{
"type": "MotionSensor",
"characteristics": [
{
"type": "MotionDetected",
"link": {
"type": "Integer",
"topicSearch": "(mjsxj02hl_cam[0-9]{1,2})/(cam[0-9]{1,2})/alarm",
"topicGet": "(1)/(2)/alarm",
"inFunc": "JSON.parse(value).motion"
}
}
]
}
]
}