Bigmanekb (обсуждение | вклад) Нет описания правки |
Bigmanekb (обсуждение | вклад) Метка: визуальный редактор отключён |
||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 34: | Строка 34: | ||
Теперь можно перейти к более сложному - созданию собственного шаблона, который мы потом сможем добавить на хаб в [[Добавление кастомных шаблонов для любых устройств#Загрузка кастомного шаблона|соответствии с инструкцией]] в папку, где должны располагаться MQTT шаблоны | Теперь можно перейти к более сложному - созданию собственного шаблона, который мы потом сможем добавить на хаб в [[Добавление кастомных шаблонов для любых устройств#Загрузка кастомного шаблона|соответствии с инструкцией]] в папку, где должны располагаться MQTT шаблоны | ||
В новом шаблоне, который мы позаимствовали у подобного устройства WirenBoard, мы удаляем строчку с '''"catalogId"''' потому как устройства которое мы добавляем скорее всего в каталоге нет. Топики для обнаружения и управления меняем на свои. В результате | В новом шаблоне, который мы позаимствовали у подобного устройства WirenBoard, мы удаляем строчку с '''"catalogId"''' потому как устройства которое мы добавляем скорее всего в каталоге нет. Топики для обнаружения и управления меняем на свои. | ||
{{QuoteBlue|Если вы не знаете куда "приземлить" тот или иной параметр, у хаба есть [[Справочник типов сервисов и характеристик|справочник, в котором перечислены все поддерживаемые сервисы и характеристики]].}} | |||
В результате получаем вот такой шаблон:<syntaxhighlight lang="json" line="1"> | |||
{ | { | ||
"manufacturer": "Itead", | "manufacturer": "Itead", | ||
"model": "Sonoff Basic", | "model": "Sonoff Basic", | ||
"modelId": "esphome/switch/(.*)/state", | |||
"services": [ | "services": [ | ||
{ | { | ||
Строка 46: | Строка 51: | ||
"link": { | "link": { | ||
"type": "String", | "type": "String", | ||
"topicGet": "esphome/switch/(1)/state", | "topicGet": "esphome/switch/(1)/state", | ||
"topicSet": "esphome/switch/(1)/command", | "topicSet": "esphome/switch/(1)/command", | ||
Строка 61: | Строка 65: | ||
</syntaxhighlight>Разберем по порядку. | </syntaxhighlight>Разберем по порядку. | ||
Тут пишем производителя устройства. | |||
<syntaxhighlight lang="json" line="0">"manufacturer": "Itead"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"manufacturer": "Itead"</syntaxhighlight> | ||
Тут пишем модель устройства. | Тут пишем модель устройства. | ||
<syntaxhighlight lang="json" line="0">"model": "Sonoff Basic" </syntaxhighlight> | |||
Это топик для определения самого устройства (ранее использовался в разделе TopicSearch). Что бы не делать шаблон на каждое новое устройство достаточно правильно задать данный параметр. В нем можно использовать регулярные выражения. В моем случае ищется вхождение любой фразы в топике '''esphome/switch'''. Фраза эта запоминается и используется дальше. | |||
<syntaxhighlight lang="json" line="0">"modelId": "esphome/switch/(.*)/state"</syntaxhighlight> | |||
Описываем сервисы, которые будут использоваться в устройстве. | |||
<syntaxhighlight lang="json" line="0">"services"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"services"</syntaxhighlight> | ||
Указываем тип устройства, который в Spruthub стандартизирован гайдлайнами HomeKit | |||
<syntaxhighlight lang="json" line="0">"type": "Switch"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"type": "Switch"</syntaxhighlight> | ||
Описываем характеристики добавляемого устройства | |||
<syntaxhighlight lang="json" line="0">"characteristics"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"characteristics"</syntaxhighlight> | ||
Изменяем тип передаваемых и принимаемых данных для управления устройством. Это актуально для ESPhome, потому что топики управляются сообщениями ON/OFF, но об этом дальше. | |||
<syntaxhighlight lang="json" line="0">"type": "String"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"type": "String"</syntaxhighlight> | ||
Топик, в котором считывается текущее состояние устройства. | |||
<syntaxhighlight lang="json" line="0">"topicGet": "esphome/switch/(1)/state"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"topicGet": "esphome/switch/(1)/state"</syntaxhighlight> | ||
Топик которым управляется устройство. В случае ESPhome ему надо передать ON или OFF | |||
<syntaxhighlight lang="json" line="0">"topicSet": "esphome/switch/(1)/command"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"topicSet": "esphome/switch/(1)/command"</syntaxhighlight> | ||
А тут самое интересное, о чем писалось ранее. Так как ESPhome надо передать для управления '''ON''' или '''OFF''', а хаб передает '''true''' или '''false''', нам необходимо переопределить эти параметры, что мы и делаем ниже: | |||
<syntaxhighlight lang="json" line="0">"map"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"map"</syntaxhighlight> | ||
<syntaxhighlight lang="json" line="0">"false": "OFF"</syntaxhighlight> | <syntaxhighlight lang="json" line="0">"false": "OFF"</syntaxhighlight> | ||
Строка 99: | Строка 103: | ||
"manufacturer": "ESPhome", | "manufacturer": "ESPhome", | ||
"model": "Esp sensor", | "model": "Esp sensor", | ||
"modelId": "esphome/sensor/(mh-z.*)_temperature/state", | |||
"services": [ | "services": [ | ||
{ | { | ||
Строка 106: | Строка 111: | ||
"type": "CurrentTemperature", | "type": "CurrentTemperature", | ||
"link": { | "link": { | ||
"type": " | "type": "Double", | ||
"topicGet": "esphome/sensor/(1)_temperature/state" | "topicGet": "esphome/sensor/(1)_temperature/state" | ||
} | } | ||
Строка 119: | Строка 123: | ||
"type": "CurrentRelativeHumidity", | "type": "CurrentRelativeHumidity", | ||
"link": { | "link": { | ||
"type": " | "type": "Double", | ||
"topicGet": "esphome/sensor/(1)_humidity/state" | "topicGet": "esphome/sensor/(1)_humidity/state" | ||
} | } | ||
Строка 165: | Строка 169: | ||
"type": "CurrentAmbientLightLevel", | "type": "CurrentAmbientLightLevel", | ||
"link": { | "link": { | ||
"type": " | "type": "Double", | ||
"topicGet": "esphome/sensor/(1)_light_level/state" | "topicGet": "esphome/sensor/(1)_light_level/state" | ||
} | } | ||
Строка 210: | Строка 214: | ||
</syntaxhighlight>Можно заметить две вещи. | </syntaxhighlight>Можно заметить две вещи. | ||
# ''' | # '''modelId''' используется для идентификации однотипных устройств. Если правильно задать имена сенсоров в ESPhome, то эта уловка сработает и вы получите универсальный шаблон для всех сенсоров на этой прошивке. | ||
# Для датчика CO2 и датчика VOC используется виртуальная логика определения превышения допустимого уровня, в результате чего в HomeKit вы получите бинарный датчик, который будет срабатывать при заданном вами пороге. | # Для датчика CO2 и датчика VOC используется виртуальная логика определения превышения допустимого уровня, в результате чего в HomeKit вы получите бинарный датчик, который будет срабатывать при заданном вами пороге. |
Текущая версия от 19:11, 22 февраля 2025
Для начала необходимо установить на ESP прошивку, которая поддерживает MQTT отправку сообщений. Это может быть:
- ESPhome
- Tasmota
- Esp easy
- WiFi iot
Теперь в настройках устройства указываем в качестве MQTT брокера Spruthub.
- IP брокера - IP вашего хаба
- Логин - оставяем пустой
- Пароль - оставляем пустой
- Порт - 44444
Если смотреть на примере ESPhome, то настройка будет выглядеть так:
mqtt:
broker: 192.168.2.79
port: 44444
topic_prefix: esphome
discovery: false
topic_prefix указывается, что бы в дальнейшем все устройства искать по одному шаблону а не вычленять нужные топики из корня.
Затем, надо узнать структуру MQTT топиков, которые типичны для прошивки, которую вы выбрали. Сделать это можно либо в мануале по соответсвующей прошивке, либо подключившись к SprutHub брокеру MQTT в приложении MqttExplorer.


И даже в логах самого ESPhome можно будет увидеть топики, которые используются для управления:
[16:35:24][C][mqtt.switch:038]: MQTT Switch 'Heat':
[16:35:24][C][mqtt.switch:039]: State Topic: 'esphome/switch/heat/state'
[16:35:24][C][mqtt.switch:039]: Command Topic: 'esphome/switch/heat/command'
Шаблон для хаба
Теперь можно перейти к более сложному - созданию собственного шаблона, который мы потом сможем добавить на хаб в соответствии с инструкцией в папку, где должны располагаться MQTT шаблоны
В новом шаблоне, который мы позаимствовали у подобного устройства WirenBoard, мы удаляем строчку с "catalogId" потому как устройства которое мы добавляем скорее всего в каталоге нет. Топики для обнаружения и управления меняем на свои.
Если вы не знаете куда "приземлить" тот или иной параметр, у хаба есть справочник, в котором перечислены все поддерживаемые сервисы и характеристики.
В результате получаем вот такой шаблон:
{
"manufacturer": "Itead",
"model": "Sonoff Basic",
"modelId": "esphome/switch/(.*)/state",
"services": [
{
"type": "Switch",
"characteristics": [
{
"type": "On",
"link": {
"type": "String",
"topicGet": "esphome/switch/(1)/state",
"topicSet": "esphome/switch/(1)/command",
"map": {
"false": "OFF",
"true": "ON"
}
}
}
]
}
]
}
Разберем по порядку.
Тут пишем производителя устройства.
"manufacturer": "Itead"
Тут пишем модель устройства.
"model": "Sonoff Basic"
Это топик для определения самого устройства (ранее использовался в разделе TopicSearch). Что бы не делать шаблон на каждое новое устройство достаточно правильно задать данный параметр. В нем можно использовать регулярные выражения. В моем случае ищется вхождение любой фразы в топике esphome/switch. Фраза эта запоминается и используется дальше.
"modelId": "esphome/switch/(.*)/state"
Описываем сервисы, которые будут использоваться в устройстве.
"services"
Указываем тип устройства, который в Spruthub стандартизирован гайдлайнами HomeKit
"type": "Switch"
Описываем характеристики добавляемого устройства
"characteristics"
Изменяем тип передаваемых и принимаемых данных для управления устройством. Это актуально для ESPhome, потому что топики управляются сообщениями ON/OFF, но об этом дальше.
"type": "String"
Топик, в котором считывается текущее состояние устройства.
"topicGet": "esphome/switch/(1)/state"
Топик которым управляется устройство. В случае ESPhome ему надо передать ON или OFF
"topicSet": "esphome/switch/(1)/command"
А тут самое интересное, о чем писалось ранее. Так как ESPhome надо передать для управления ON или OFF, а хаб передает true или false, нам необходимо переопределить эти параметры, что мы и делаем ниже:
"map"
"false": "OFF"
"true": "ON"
Еще один, но более сложный пример. Шаблон основан на шаблоне WirenBoard WB-MSW.json и добавляет в хаб сенсоры, подключенные к esphome:
{
"name": "Набор датчиков",
"manufacturer": "ESPhome",
"model": "Esp sensor",
"modelId": "esphome/sensor/(mh-z.*)_temperature/state",
"services": [
{
"type": "TemperatureSensor",
"characteristics": [
{
"type": "CurrentTemperature",
"link": {
"type": "Double",
"topicGet": "esphome/sensor/(1)_temperature/state"
}
}
]
},
{
"type": "HumiditySensor",
"characteristics": [
{
"type": "CurrentRelativeHumidity",
"link": {
"type": "Double",
"topicGet": "esphome/sensor/(1)_humidity/state"
}
}
]
},
{
"type": "AirQualitySensor",
"data": {
"Logic": {
"selected": "AirQualityFromVOCDensity"
}
},
"characteristics": [
{
"type": "VOCDensity",
"link": {
"type": "Integer",
"topicGet": "esphome/sensor/(1)_voc/state"
}
}
]
},
{
"type": "CarbonDioxideSensor",
"data": {
"Logic": {
"selected": "CarbonDioxideDetectedFromCarbonDioxideLevel"
}
},
"characteristics": [
{
"type": "CarbonDioxideLevel",
"link": {
"type": "Integer",
"topicGet": "esphome/sensor/(1)_co2_value/state"
}
}
]
},
{
"type": "LightSensor",
"characteristics": [
{
"type": "CurrentAmbientLightLevel",
"link": {
"type": "Double",
"topicGet": "esphome/sensor/(1)_light_level/state"
}
}
]
},
{
"type": "MotionSensor",
"characteristics": [
{
"type": "MotionDetected",
"link": {
"type": "Integer",
"topicGet": "esphome/sensor/(1)_motion_level/state",
"map": {
"0": "OFF",
"1": "ON"
}
},
"data": {
"OnAfterLevel": 200
}
}
]
},
{
"type": "ContactSensor",
"characteristics": [
{
"type": "ContactSensorState",
"link": {
"type": "String",
"topicGet": "esphome/sensor/(1)_contact/state",
"map": {
"0": "OFF",
"1": "ON"
}
}
}
]
}
]
}
Можно заметить две вещи.
- modelId используется для идентификации однотипных устройств. Если правильно задать имена сенсоров в ESPhome, то эта уловка сработает и вы получите универсальный шаблон для всех сенсоров на этой прошивке.
- Для датчика CO2 и датчика VOC используется виртуальная логика определения превышения допустимого уровня, в результате чего в HomeKit вы получите бинарный датчик, который будет срабатывать при заданном вами пороге.