Создание кастомного шаблона MQTT если в payload есть JSON: различия между версиями

Материал из Sprut.hub Wiki
(Новая страница: «Если вы являетесь владельцем DIY устройств с Tasmota или по каким то причинам ваше устройство отдает в MQTT топик значения в виде JSON строки, то можно сделать шаблон для Sprut.hub который сможет разобрать эту строку и использовать значения из нее. Разберем пример,...»)
 
Нет описания правки
Строка 25: Строка 25:
   ]
   ]
}  
}  
</syntaxhighlight>{
</syntaxhighlight>{{QuoteYellow|При этом хочется напомнить, что TopicSearch должен быть уникальным для каждого шаблона}}


  "name": "TH16 Temp",
Если у вас уже где то в других шаблонах есть вероятность совпадения области поиска (в скобках) с другим шаблоном, то нужно сузить области поиска, например добавив туда неизменные текстовые части MQTT топиков чтобы сделать сегмент поиска уникальным.


  "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 топиков чтобы сделать сегмент поиска уникальным.


Второй пример - если у вас есть датчик движения (например у камеры), который умеет отдавать определение движения и значение топика выглядит вот так:<syntaxhighlight lang="json">
Второй пример - если у вас есть датчик движения (например у камеры), который умеет отдавать определение движения и значение топика выглядит вот так:<syntaxhighlight lang="json">

Версия от 08:39, 20 ноября 2022

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