Создание кастомного шаблона MQTT если в payload есть JSON

Материал из Sprut.hub Wiki

Если вы являетесь владельцем 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"
          }
        }
      ]
    }
  ]
}

При этом хочется напомнить, что 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"          
          }
        }
      ]
    }
  ]
}