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

Материал из Sprut.hub Wiki
Версия от 08:38, 20 ноября 2022; Bigmanekb (обсуждение | вклад) (Новая страница: «Если вы являетесь владельцем DIY устройств с Tasmota или по каким то причинам ваше устройство отдает в MQTT топик значения в виде JSON строки, то можно сделать шаблон для Sprut.hub который сможет разобрать эту строку и использовать значения из нее. Разберем пример,...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

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