Для интеграции большинства устройств, прошитых Tasmota, используется плагин «Homebridge MQTT-Thing»1). Если не указано иное, как раз он и используется.
Все манипуляции с настройками необходимо производить напрямую в файле конфигурации, т.к. в интерфейсе плагина реализованы далеко не все необходимые параметры2)!
Помимо этого, необходим настроенный MQTT-брокер.
Одна из самых простых конфигураций, т.к. для розетки используется родной тип «outlet». Однако, для работы параметра «getInUse», пришлось использовать дополнительное правило.
{ "type": "outlet", "name": "Fumigator", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "topics": { "getOnline": "fumigator_3878DF/tele/LWT", "getOn": "fumigator_3878DF/stat/POWER", "setOn": "fumigator_3878DF/cmnd/POWER", "getInUse": "fumigator_3878DF/stat/OutletInUse" }, "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Athom", "model": "ZEU-003", "firmwareRevision": "9.2.0", "serialNumber": "67855234" }
Простой конфиг. Для удобства оба передаваемых значения упакованы в особый тип «custom».
Пришлось только немного схитрить при пробросе сигнала низкого заряда, т.к. датчик не предоставляет логического значения для этого параметра, только проценты.
{ "type": "custom", "name": "Weather Sensors In The Shade", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "services": [ { "type": "temperatureSensor", "name": "Temperature In The Shade", "topics": { "getOnline": "zigbee2mqtt/bridge/state", "getCurrentTemperature": { "topic": "zigbee2mqtt/0x00124b002268acb0", "apply": "return JSON.parse(message).temperature" }, "getStatusLowBattery": { "topic": "zigbee2mqtt/0x00124b002268acb0", "apply": "return (JSON.parse(message).battery < 40) ? true : false" } } }, { "type": "humiditySensor", "name": "Humidity In The Shade", "topics": { "getCurrentRelativeHumidity": { "topic": "zigbee2mqtt/0x00124b002268acb0", "apply": "return JSON.parse(message).humidity" } } } ], "onlineValue": "online", "offlineValue": "offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "SNZB-02", "serialNumber": "cb0" }
Базовый код для включения датчика в экосистему умного дома от Apple.
{ "type": "contactSensor", "name": "Entrance Door Sensor", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "topics": { "getOnline": "zigbee2mqtt/bridge/state", "getContactSensorState": { "topic": "zigbee2mqtt/0x0000000000000000", "apply": "return (JSON.parse(message).contact == true) ? false : true" }, "getStatusTampered": { "topic": "zigbee2mqtt/0x0000000000000000", "apply": "return JSON.parse(message).tamper" }, "getStatusLowBattery": { "topic": "zigbee2mqtt/0x0000000000000000", "apply": "return JSON.parse(message).battery_low" } }, "onlineValue": "online", "offlineValue": "offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "SNZB-04", "serialNumber": "96d" }
Код, для работы потока «Управление сигнализацией». Используется тип «securitySystem».
{ "type": "securitySystem", "name": "Security Entrance System", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "topics": { "getOnline": "zigbee2mqtt/bridge/state", "setTargetState": "entrance_doors/0x0000000000000000/cmnd/target", "getTargetState": "entrance_doors/0x0000000000000000/state/target", "getCurrentState": "entrance_doors/0x0000000000000000/state/current", "getStatusTampered": { "topic": "zigbee2mqtt/0x0000000000000000", "apply": "return JSON.parse(message).tamper" } }, "targetStateValues": [ "athome", "notathome", "night", "disarmed" ], "currentStateValues": [ "athome", "notathome", "night", "disarmed", "triggered" ], "restrictTargetState": [ 0, 1, 3 ], "onlineValue": "online", "offlineValue": "offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "SNZB-04", "serialNumber": "96d" }
Все штатно, никаких извращений. Использован родной тип «leakSensor».
{ "accessory": "mqttthing", "type": "leakSensor", "name": "Kitchen Leak Sensor", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "topics": { "getLeakDetected": { "topic": "zigbee2mqtt/0x00158d0006334159", "apply": "return JSON.parse(message).water_leak" }, "getStatusTampered": { "topic": "zigbee2mqtt/0x00158d0006334159", "apply": "return JSON.parse(message).tamper" }, "getStatusLowBattery": { "topic": "zigbee2mqtt/0x00158d0006334159", "apply": "return JSON.parse(message).battery_low" }, "getOnline": "zigbee2mqtt/bridge/state" }, "onlineValue": "online", "offlineValue": "offline", "manufacturer": "Aqara", "model": "SJCGQ11LM", "serialNumber": "159" }
Для удобства управления, данный аксессуар был разделен на два – кнопка и сенсоры3).
В этом случае также используется родной тип «switch».
{ "type": "switch", "name": "Ventilation", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "topics": { "getOnline": "ventilation_000457/tele/LWT", "getOn": "ventilation_000457/stat/POWER", "setOn": "ventilation_000457/cmnd/POWER" }, "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "TH10", "firmwareRevision": "9.2.0", "serialNumber": "67784587" },
Если в web-интерфейс добавлена дополнительная кнопка, использовать нужно такой код:
{ "type": "switch", "name": "Ventilation", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "topics": { "getOnline": "ventilation_000457/tele/LWT", "getOn": "ventilation_000457/stat/POWER1", "setOn": "ventilation_000457/cmnd/POWER1" }, "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "TH10", "firmwareRevision": "9.2.0", "serialNumber": "67784587" }
Для управления режимами «Ручная корректировка» и «Не выключать» из приложения «Дом», нужно использовать такой код:
{ "type": "custom", "name": "Ventilation", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "services": [ { "type": "switch", "name": "Main Power", "topics": { "getOnline": "ventilation_000457/tele/LWT", "getOn": "ventilation_000457/stat/POWER1", "setOn": "ventilation_000457/cmnd/POWER1" } }, { "type": "switch", "name": "Manual Correction", "topics": { "getOnline": "ventilation_000457/tele/LWT", "getOn": "ventilation_000457/stat/POWER2", "setOn": "ventilation_000457/cmnd/POWER2" } }, { "type": "switch", "name": "Manual Power", "topics": { "getOnline": "ventilation_000457/tele/LWT", "getOn": "ventilation_000457/stat/POWER3", "setOn": "ventilation_000457/cmnd/POWER3" } } ], "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "TH10", "firmwareRevision": "9.2.0", "serialNumber": "67784587" }
А для сенсоров используется особый тип «custom», позволяющий объединить в один аксессуар несколько типов, что несколько снижает количество кода. В данном случае, это «temperatureSensor» и «humiditySensor».
{ "type": "custom", "name": "Ventilation sensors", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "services": [ { "type": "temperatureSensor", "name": "Temperature", "topics": { "getCurrentTemperature": { "topic": "ventilation_000457/tele/SENSOR", "apply": "return JSON.parse(message).SI7021.Temperature" } } }, { "type": "humiditySensor", "name": "Humidity", "topics": { "getCurrentRelativeHumidity": { "topic": "ventilation_000457/tele/SENSOR", "apply": "return JSON.parse(message).SI7021.Humidity" } } } ], "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "Si7021", "firmwareRevision": "9.2.0", "serialNumber": "67784588" }
Тут уже пришлось отбирать из полезной нагрузки топика «SENSOR» необходимые данные с помощью ключа «apply» и метода «return». Сам, если честно, не до конца понимаю, как именно это работает, но работает.
Конфигурация с двумя кнопками – одна для включения/выключения освещения, вторая для временного отключения таймера.
{ "type": "custom", "name": "Corridor Lighting", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "services": [ { "type": "switch", "name": "Lighting", "topics": { "getOnline": "corridorlighting_0F7B7C/tele/LWT", "getOn": "corridorlighting_0F7B7C/stat/POWER1", "setOn": "corridorlighting_0F7B7C/cmnd/POWER1" } }, { "type": "switch", "name": "Do Not Turn Off Automatically", "topics": { "getOnline": "corridorlighting_0F7B7C/tele/LWT", "getOn": "corridorlighting_0F7B7C/stat/POWER2", "setOn": "corridorlighting_0F7B7C/cmnd/POWER2" } } ], "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "RFR2", "firmwareRevision": "9.5.0", "serialNumber": "48768497" }
Для объединения кнопок типа «switch» в один аксессуар используется специальный тип «custom».
{ "type": "custom", "name": "Kitchen Lighting", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "services": [ { "type": "switch", "name": "Main Lighting", "topics": { "getOnline": "kitchenlighting_0D3B02/tele/LWT", "getOn": "kitchenlighting_0D3B02/stat/POWER1", "setOn": "kitchenlighting_0D3B02/cmnd/POWER1" } }, { "type": "switch", "name": "Additional Lighting", "topics": { "getOnline": "kitchenlighting_0D3B02/tele/LWT", "getOn": "kitchenlighting_0D3B02/stat/POWER2", "setOn": "kitchenlighting_0D3B02/cmnd/POWER2" } } ], "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Sonoff", "model": "DualR2", "firmwareRevision": "9.5.0", "serialNumber": "48779497" }
Это максимальный демонстрационный конфиг, где присутствуют все возможные кнопки и ползунки. В реальной жизни, все они одновременно не нужны – какими-то функциями вы пользуетесь, а какими-то нет. Соответственно, и засорять эфир ими не нужно.
Для всех кнопок используется родной тип «switch», а для всех ползунков единственный более-менее подходящий – «fan». Объединены они все в один аксессуар особым типом «custom».
Типы с именами «Mist level», «Humidity» и «Baby mode» связаны между собой единой логикой – когда один включается, два других отключаются. Для «Humidity» необходимо специальное правило. Для правильной индикации состояния «Timer», также необходимо правило.
Все остальное, пожалуй, без комментариев, ибо описывать этот ад… Если есть вопросы, го в обсуждение.
{ "type": "custom", "name": "Humidifier", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "services": [ { "type": "fan", "name": "Mist level", "topics": { "getOn": { "topic": "humidifier_00896D/stat/RESULT", "apply": "return JSON.parse(message).TuyaEnum3" }, "setOn": "humidifier_00896D/cmnd/tuyaenum3", "getRotationSpeed": { "topic": "humidifier_00896D/stat/RESULT", "apply": "return Math.round(JSON.parse(message).TuyaEnum4 * 16.6)" }, "setRotationSpeed": { "topic": "humidifier_00896D/cmnd/tuyaenum4", "apply": "return Math.round(message / 16.6)" } }, "onValue": "3", "offValue": "0", "otherValueOff": true }, { "type": "fan", "name": "Humidity", "topics": { "getOn": { "topic": "humidifier_00896D/stat/RESULT", "apply": "return JSON.parse(message).TuyaEnum3" }, "setOn": "humidifier_00896D/cmnd/tuyaenum3", "getRotationSpeed": { "topic": "humidifier_00896D/stat/HumidityLVL", "apply": "return Math.round(message * 10)" }, "setRotationSpeed": { "topic": "humidifier_00896D/cmnd/HumidityLVL", "apply": "return Math.round(message / 10)" } }, "onValue": "2", "offValue": "0", "otherValueOff": true }, { "type": "fan", "name": "Timer", "topics": { "setOn": { "topic": "humidifier_00896D/cmnd/tuyaenum1" }, "getOn": { "topic": "humidifier_00896D/stat/humTimer" }, "getRotationSpeed": { "topic": "humidifier_00896D/stat/RESULT", "apply": "return Math.round(JSON.parse(message).TuyaEnum1 * 10)" }, "setRotationSpeed": { "topic": "humidifier_00896D/cmnd/tuyaenum1", "apply": "return Math.round(message / 10)" } }, "onValue": "15", "offValue": "0" }, { "type": "switch", "name": "Power", "topics": { "getOnline": "humidifier_00896D/tele/LWT", "getOn": "humidifier_00896D/stat/POWER1", "setOn": "humidifier_00896D/cmnd/POWER1" } }, { "type": "switch", "name": "Night mode", "topics": { "getOn": "humidifier_00896D/stat/POWER4", "setOn": "humidifier_00896D/cmnd/POWER4" } }, { "type": "switch", "name": "Heating", "topics": { "getOn": "humidifier_00896D/stat/POWER2", "setOn": "humidifier_00896D/cmnd/POWER2" } }, { "type": "switch", "name": "Anion", "topics": { "getOn": "humidifier_00896D/stat/POWER3", "setOn": "humidifier_00896D/cmnd/POWER3" } }, { "type": "switch", "name": "Night light", "topics": { "getOn": "humidifier_00896D/stat/POWER5", "setOn": "humidifier_00896D/cmnd/POWER5" } }, { "type": "switch", "name": "Baby mode", "topics": { "getOn": { "topic": "humidifier_00896D/stat/RESULT", "apply": "return JSON.parse(message).TuyaEnum3;" }, "setOn": "humidifier_00896D/cmnd/tuyaenum3" }, "onValue": "1", "offValue": "0", "otherValueOff": true } ], "onValue": "ON", "offValue": "OFF", "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Proscenic", "model": "808c", "firmwareRevision": "9.2.0", "serialNumber": "67785599" }
Т.к. в этом устройстве очень много функций, дабы немного разгрузить интерфейс, сенсоры были выделены в отдельный аксессуар также типа «custom». Первые два типа родные – «temperatureSensor» и «humiditySensor», а для индикации наличия воды был выбран единственный более-менее подходящий тип «contactSensor», для работы которого пришлось писать дополнительное правило.
{ "type": "custom", "name": "Humidifier Sensors", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": false, "services": [ { "type": "temperatureSensor", "name": "Temperature", "topics": { "getOnline": "humidifier_00896D/tele/LWT", "getCurrentTemperature": { "topic": "humidifier_00896D/tele/SENSOR", "apply": "return JSON.parse(message).TuyaSNS.Temperature" } } }, { "type": "humiditySensor", "name": "Humidity", "topics": { "getCurrentRelativeHumidity": { "topic": "humidifier_00896D/tele/SENSOR", "apply": "return JSON.parse(message).TuyaSNS.Humidity" } } }, { "type": "contactSensor", "name": "Water level", "topics": { "getContactSensorState": "humidifier_00896D/stat/waterLevel" }, "onValue": "low", "offValue": "normal" } ], "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "Proscenic", "model": "808c-Sensors", "firmwareRevision": "9.2.0", "serialNumber": "67785491" }
Полноценное управление холодильником из приложения «Дом» на iPhone. Конфигурация состоит из трех аксессуаров, которые, в принципе, можно было бы объединить в один, но так получается стройнее и логичнее – каждый аксессуар содержит в себе определенные свойства.
Указанный в коде произвольный серийный номер «YSFB4XSPFA43» необходимо заменить на реальный, полученный в процессе настройки потока Node-RED4).
Для работы используется тип «switch», обернутый в «custom».
{ "type": "custom", "name": "Fridge Freezer Settings", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "services": [ { "type": "switch", "name": "Power State", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/PowerState", "apply": "return (message == 'BSH.Common.EnumType.PowerState.On') ? true : false" }, "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/FakePowerState" } }, { "type": "switch", "name": "Freezer Super Mode", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/SuperModeFreezer", "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/SuperModeFreezer" } }, { "type": "switch", "name": "Refrigerator Super Mode", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/SuperModeRefrigerator", "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/SuperModeRefrigerator" } }, { "type": "switch", "name": "Eco Mode", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/EcoMode", "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/EcoMode" } }, { "type": "switch", "name": "Vacation Mode", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/VacationMode", "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/VacationMode" } }, { "type": "switch", "name": "Sabbath Mode", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/SabbathMode", "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/SabbathMode" } }, { "type": "switch", "name": "Fresh Mode", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/FreshMode", "setOn": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/FreshMode" } } ], "accessory": "mqttthing", "onlineValue": "online", "offlineValue": "offline", "manufacturer": "BOSCH", "model": "KGN39AI32R", "serialNumber": "YSFB4XSPFA43" }
Использует стандартный тип «contactSensor».
{ "type": "contactSensor", "name": "Fridge Freezer Door State", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getContactSensorState": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/DoorState" }, "accessory": "mqttthing", "onlineValue": "online", "offlineValue": "offline", "manufacturer": "BOSCH", "model": "KGN39AI32R", "serialNumber": "YSFB4XSPFA43" }
Для работы используется тип «thermostat», обернутый в «custom».
{ "type": "custom", "name": "Temperature In The Fridge Freezer", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "services": [ { "type": "thermostat", "name": "In The Refrigerator", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getCurrentHeatingCoolingState": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/PowerState", "apply": "return (message == 'BSH.Common.EnumType.PowerState.On') ? true : false" }, "setTargetHeatingCoolingState": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/FakePowerState", "getTargetHeatingCoolingState": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/PowerState", "apply": "return (message == 'BSH.Common.EnumType.PowerState.On') ? true : false" }, "getCurrentTemperature": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/SetpointTemperatureRefrigerator", "setTargetTemperature": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/SetpointTemperatureRefrigerator", "apply": "return Math.round(message)" }, "getTargetTemperature": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/SetpointTemperatureRefrigerator" }, "minTemperature": 2, "maxTemperature": 8, "heatingCoolingStateValues": [ false, "heat", true, "auto" ], "restrictHeatingCoolingState": [ 0, 2 ] }, { "type": "thermostat", "name": "In The Freezer", "topics": { "getOnline": "BOSCH-KGN39AI32R-YSFB4XSPFA43/tele/LWT", "getCurrentHeatingCoolingState": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/PowerState", "apply": "return (message == 'BSH.Common.EnumType.PowerState.On') ? true : false" }, "setTargetHeatingCoolingState": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/FakePowerState", "getTargetHeatingCoolingState": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/settings/PowerState", "apply": "return (message == 'BSH.Common.EnumType.PowerState.On') ? true : false" }, "getCurrentTemperature": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/SetpointTemperatureFreezer", "setTargetTemperature": { "topic": "BOSCH-KGN39AI32R-YSFB4XSPFA43/cmnd/homeconnect/SetpointTemperatureFreezer", "apply": "return Math.round(message)" }, "getTargetTemperature": "BOSCH-KGN39AI32R-YSFB4XSPFA43/stat/SetpointTemperatureFreezer" }, "minTemperature": -24, "maxTemperature": -16, "heatingCoolingStateValues": [ false, "heat", true, "auto" ], "restrictHeatingCoolingState": [ 0, 2 ] } ], "accessory": "mqttthing", "onlineValue": "online", "offlineValue": "offline", "manufacturer": "BOSCH", "model": "KGN39AI32R", "serialNumber": "YSFB4XSPFA43" }
Для объединения всех аксессуаров в один, используется тип «custom», который содержит в себе 2 стандартных типа – «contactSensor» и «switch».
{ "type": "custom", "name": "Circuit Breaker", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "services": [ { "type": "switch", "name": "Switch Relay", "topics": { "getOnline": "circuitbreaker_0B6A01/tele/LWT", "getOn": "circuitbreaker_0B6A01/stat/POWER2", "setOn": "circuitbreaker_0B6A01/cmnd/POWER2" }, "onValue": "ON", "offValue": "OFF" }, { "type": "switch", "name": "Confirm Action", "topics": { "getOnline": "circuitbreaker_0B6A01/tele/LWT", "getOn": "circuitbreaker_0B6A01/stat/POWER3", "setOn": "circuitbreaker_0B6A01/cmnd/POWER3" }, "onValue": "ON", "offValue": "OFF" }, { "type": "contactSensor", "name": "Relay Status", "topics": { "getOnline": "circuitbreaker_0B6A01/tele/LWT", "getContactSensorState": { "topic": "circuitbreaker_0B6A01/stat/POWER1", "apply": "return (message == 'ON') ? false : true" } } } ], "onlineValue": "Online", "offlineValue": "Offline", "accessory": "mqttthing", "manufacturer": "TOMZN", "model": "TOB15-63 WIFI", "firmwareRevision": "9.5.0", "serialNumber": "45779497" }
Код для интеграции экрана для проектора DEXP WE-80 в Apple Home.
Кнопка, полностью разворачивающая и сворачивающая экран, работает с Siri.
{ "type": "switch", "accessory": "mqttthing", "name": "Projector Screen", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "onlineValue": "Online", "offlineValue": "Offline", "manufacturer": "DEXP", "model": "WE-80", "firmwareRevision": "13.0.0", "serialNumber": "45779390", "topics": { "getOnline": "projector/screen_CF4CBF/tele/LWT", "getOn": "projector/screen_CF4CBF/stat/POWER4", "setOn": "projector/screen_CF4CBF/cmnd/POWER4" }, "onValue": "ON", "offValue": "OFF" }
Дополнительные кнопки, позволяющие точно настроить положение экрана.
{ "type": "custom", "accessory": "mqttthing", "name": "Projector Screen", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "onlineValue": "Online", "offlineValue": "Offline", "manufacturer": "DEXP", "model": "WE-80", "firmwareRevision": "13.0.0", "serialNumber": "45779399", "services": [ { "type": "switch", "name": "Down", "caption": "Screen Down", "topics": { "getOnline": "projector/screen_CF4CBF/tele/LWT", "getOn": "projector/screen_CF4CBF/stat/POWER3", "setOn": "projector/screen_CF4CBF/cmnd/POWER3" }, "onValue": "ON", "offValue": "OFF", "resetStateAfterms": "200" }, { "type": "switch", "name": "Stop Screen", "caption": "Stop", "topics": { "getOnline": "projector/screen_CF4CBF/tele/LWT", "getOn": "projector/screen_CF4CBF/stat/POWER2", "setOn": "projector/screen_CF4CBF/cmnd/POWER2" }, "onValue": "ON", "offValue": "OFF", "resetStateAfterms": "200" }, { "type": "switch", "name": "Screen Up", "caption": "Up", "topics": { "getOnline": "projector/screen_CF4CBF/tele/LWT", "getOn": "projector/screen_CF4CBF/stat/POWER1", "setOn": "projector/screen_CF4CBF/cmnd/POWER1" }, "onValue": "ON", "offValue": "OFF", "resetStateAfterms": "200" } ] }
{ "accessory": "mqttthing", "type": "fan", "name": "Floor Fan", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "onlineValue": "Online", "offlineValue": "Offline", "manufacturer": "Polaris", "model": "PSF 40RC", "firmwareRevision": "13.0.0", "serialNumber": "95779310", "topics": { "getOn": "floorfan_69BF68/stat/FANPOWER", "setOn": "floorfan_69BF68/cmnd/FanPower", "getRotationSpeed": "floorfan_69BF68/stat/FANSPEED", "setRotationSpeed": "floorfan_69BF68/cmnd/FanSpeed" }, "integerValue": true }
{ "type": "custom", "accessory": "mqttthing", "name": "Fan Settings", "username": "RGEHrther", "password": "jkyuk56e4t", "logMqtt": true, "onlineValue": "Online", "offlineValue": "Offline", "manufacturer": "Polaris", "model": "PSF 40RC", "firmwareRevision": "13.0.0", "serialNumber": "45479399", "services": [ { "type": "switch", "name": "Forest Mode", "topics": { "getOnline": "floorfan_69BF68/tele/LWT", "getOn": "floorfan_69BF68/stat/FORESTMODE", "setOn": "floorfan_69BF68/cmnd/ForestMode" }, "integerValue": true }, { "type": "switch", "name": "Mode", "topics": { "getOnline": "floorfan_69BF68/tele/LWT", "getOn": "floorfan_69BF68/stat/POWER2", "setOn": "floorfan_69BF68/cmnd/POWER2" }, "onValue": "ON", "offValue": "OFF", "resetStateAfterms": "200" }, { "type": "switch", "name": "Speed", "topics": { "getOnline": "floorfan_69BF68/tele/LWT", "getOn": "floorfan_69BF68/stat/POWER3", "setOn": "floorfan_69BF68/cmnd/POWER3" }, "onValue": "ON", "offValue": "OFF", "resetStateAfterms": "200" }, { "type": "switch", "name": "Timer", "topics": { "getOnline": "floorfan_69BF68/tele/LWT", "getOn": "floorfan_69BF68/stat/POWER4", "setOn": "floorfan_69BF68/cmnd/POWER4" }, "onValue": "ON", "offValue": "OFF", "resetStateAfterms": "200" } ] }
{ "accessory": "mqttthing", "type": "television", "name": "Projector", "username": "RGEHrther", "password": "$%^43534#@$", "logMqtt": true, "onlineValue": "Online", "offlineValue": "Offline", "manufacturer": "Xnano", "model": "X1", "firmwareRevision": "13.0.0", "serialNumber": "95779390", "topics": { "getOnline": "projector/projector_80FA30/tele/LWT", "setActive": "projector/projector_80FA30/cmnd/POWER2", "getActive": "projector/projector_80FA30/stat/POWER2", "setRemoteKey": "projector/remote_DEEBB4/cmnd/REMOTE" }, "onValue": "ON", "offValue": "OFF" }
Статья о прошивке и настройке.
Обсуждение