Статья

Управление климатом в комнате с радиаторным отоплением при помощи сенсорной панели термостата

Этой статьей я начинаю цикл описания - что сделано на сегодняшний день в доме по улучшению комфортного проживания. 

Я за прогресс! Но всегда помню, что меня окружают разные люди и умный дом делаю таким, чтобы каждый чувствовал себя в нем комфортно. И это не только связано с удобством включения голосом, например, лампочки, а чтобы эту лампочку можно было включить и традиционным способом. Чтобы гости не чувствовали себя идиотами, пытаясь справиться с незнакомыми для себя способами управления традиционными вещами. 

 Речь сегодня пойдет о способе задания температуры в помещении.

Краткое техническое задание: 

 - Контроллер умного дома:  Wiren Board 6 Универсальный контроллер для автоматизации с открытым ПО на базе Linux. 

 - Комплектующие к контроллеру: Модельный ряд реле, датчиков, вспомогательных устройств Wiren Board.

 - Устройства общения человек-машина-человек: Термостаты, информационные электронные доски, извещатели, кнопки, переключатели, лампы. 

 - Программное обеспечение: Встроенное ПО Wiren Board, Node-red, Apple ПО, Sprut-Hub.

Так как по своей профессии я инженер, то первым делом занялся анализом, что же есть на рынке из устройств, позволяющих задавать температуру в помещении. Одним из условий была возможность интеграции в систему Умный Дом по протоколу Modbus RTU (RS485), чтобы иметь понятный, простой интерфейс, и, по возможности, не содержать бесполезной информации, типа расписания работы на неделю, лишних иконок и т.д. 

Ищем далее, и находим ПУ-3. Простой, без лишней информации на экране, с ярким сенсорным дисплеем, из коммутаций - только шина RS485 и питание. А самое главное, производится в родном городе, есть в наличии и цена ниже китайского.

Возможности

  • Задание температуры в помещении.

  • Измерение температуры при помощи встроенного датчика.

  • Вывод дополнительной информации, например, заданной температуры или температуры на улице. 

  • Задание режимов работы вентиляции.

  •  Вывод текущего времени.

Так как в качестве основы Умного Дома выбран универсальный контроллер Wiren Board 6 (WB6), далее я опишу последовательность действий для подключения устройств по Modbus к данному контроллеру и дальнейшего использования его в управлении Умным Домом. Сразу хочу сказать, что без помощи Андрея Попова (Белоруссия), у меня вряд ли что-либо получилось, поэтому ему отдельное спасибо.

Последовательность

Получение таблицы адресов управления устройством по шине RS485. Написание файла конфигурации устройства для контроллера WB6. Подключение к контроллеру. Написание алгоритма применения в Node-red и использование в Homekit. Написание шаблона для SprutHub (в доработке).

Из документации видим доступные нам адреса для считывания или записи в регистры термостата, я описываю только необходимые адреса регистров для домашнего использования.

АдресОписание0

Чтение текущей температуры на встроенном датчике1

Задание желаемой температуры2

Включение и выключение термостата3

Режим работы термостата, 0-авто, 1-нагрев, 2-охлаждение, 3-вентиляция 4

Скорость вентилятора9

Внешняя температура20

Задание времени. Часы 21

Задание времени. Минуты22

День недели

На основе этих данных пишем файл конфигурации устройства для контроллера WB6.

{ "device_type":"TemperatureControlPanel", "device":{ "name":"Temperature Control Panel", "id":"temp", "max_read_registers":0, "channels":[ { "name":"Current temperature", "reg_type":"holding", "readonly":false, "address":0, "type":"temperature", "scale":0.1, "format":"s16" }, { "name":"Mode", "reg_type":"holding", "readonly":false, "address":3, "type":"value", "scale":1, "format":"s16" }, { "name":"Speed Vent", "reg_type":"holding", "readonly":false, "address":4, "type":"range", "scale":1, "max":5 }, { "name":"Temperature Set", "reg_type":"holding", "readonly":false, "address":1, "type":"range", "scale":0.1, "max":35 }, { "name":"The thermostat works", "reg_type":"holding", "readonly":false, "address":2, "type":"switch" }, { "name":"Outdoor temperature", "reg_type":"holding", "readonly":false, "address":9, "type":"value", "scale":0.1, "format":"s16" } ] } }

Внешний вид устройства в разделе Wiren Board config.

Как мы видим, можно менять скорость вращения вентилятора, устанавливать желаемую температуру, включать или отключать термостат. Из информационных топиков можно увидеть текущую температуру , измеряемую встроенным датчиком, режим работы термостата, а также внешнюю температуру, отображаемую на термостате. Внешнюю температуру можно получать от любого датчика, имеющего топики в Wiren Board.

Данный термостат не имеет силовых выходов для подключения нагрузки, поэтому для реализации возможности управления нагрузкой пишем правила в Node-red. В качестве нагрузки можно использовать реле Wiren Board, подключенное также к контроллеру WB6 по RS485. 

Создаем простое правило в Node-red.  Для этого используем написанную ноду node-red-contrib-wirenboard. Для управления нагрузкой сравниваем заданную температуру с текущей. На выходе функции имеем Ноль или Единицу, в зависимости от величин заданной температуры и текущей температуры.

[{"id":"4f94a426.b0c74c","type":"join","z":"d25093e8.f49e6","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1335,"y":2260,"wires":[["b6856f00.088c"]],"l":false},{"id":"b6856f00.088c","type":"function","z":"d25093e8.f49e6","name":"Logik","func":"if (msg.payload.TargetTemperature > msg.payload.CurrentTemperature) {\n msg.payload = \"1\";\n}\nelse if (msg.payload.TargetTemperature < msg.payload.CurrentTemperature) {\n msg.payload = \"0\";\n}\nreturn msg;","outputs":1,"noerr":0,"x":1395,"y":2260,"wires":[[]],"l":false},{"id":"1198a1d2.0096ae","type":"inject","z":"d25093e8.f49e6","name":"","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"onceDelay":0.1,"x":995,"y":2240,"wires":[["96badb93.bb8e58"]],"l":false},{"id":"e2f7fe8b.f1cc5","type":"inject","z":"d25093e8.f49e6","name":"","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"onceDelay":0.1,"x":995,"y":2300,"wires":[["d2ad9fd.7ed376"]],"l":false},{"id":"d2ad9fd.7ed376","type":"wb-get","z":"d25093e8.f49e6","name":"температура уставки","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/Temperature Set","x":1140,"y":2300,"wires":[["b6b9e0a4.bc3c7"]]},{"id":"e9aa300d.0516f","type":"change","z":"d25093e8.f49e6","name":"var","rules":[{"t":"change","p":"topic","pt":"msg","from":"/devices/temp_100/controls/Current temperature","fromt":"str","to":"CurrentTemperature","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1275,"y":2240,"wires":[["4f94a426.b0c74c"]],"l":false},{"id":"b6b9e0a4.bc3c7","type":"change","z":"d25093e8.f49e6","name":"var","rules":[{"t":"change","p":"topic","pt":"msg","from":"/devices/temp_100/controls/Temperature Set","fromt":"str","to":"TargetTemperature","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1275,"y":2300,"wires":[["4f94a426.b0c74c"]],"l":false},{"id":"96badb93.bb8e58","type":"wb-get","z":"d25093e8.f49e6","name":"Текущая темература","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/Current temperature","x":1140,"y":2240,"wires":[["e9aa300d.0516f"]]},{"id":"9d631ffc.e111f","type":"wb-server","z":0,"name":"WB","url":"192.168.88.143","allowuntrusted":true}]

Более сложное правило в Node-red. Передаем данные с термостата в Apple Homekit, желаемую температуру можно задавать как на самом термостате, так и в приложении Дом на iOS устройстве. Все параметры синхронизируются между собой.  На реле выдается состояние Ноль или Единица, обработанная нодой node-red-contrib-homekit-bridged.

[{"id":"6f5a9630.00aa48","type":"homekit-service","z":"f4eb4999.3608c8","name":"Термостат","serviceName":"Thermostat","x":635,"y":380,"wires":[["547f25a0.48f0ac","65abb0c0.33338","73315bf9.1ae444","8aa31c7.9446de"]],"l":false},{"id":"547f25a0.48f0ac","type":"function","z":"f4eb4999.3608c8","name":"Save TEMP/HUM/TT","func":"var T1 = context.get(\"T1\")||{\n \"target_temperature\": 22,\n \"temperature\": 20,\n \"humidity\": 50,\n \"targetHeatCoolState\": 0\n};\n\nvar OutMsg = {};\n\nif (msg.payload.TargetHeatingCoolingState !== undefined){\n T1.targetHeatCoolState = msg.payload.TargetHeatingCoolingState;\n}\n\nif (msg.payload.CurrentTemperature !== undefined) {\n T1.temperature = msg.payload.CurrentTemperature;\n}\n\nif (msg.payload.CurrentRelativeHumidity !== undefined) {\n T1.humidity = msg.payload.CurrentRelativeHumidity;\n}\n\nif (msg.payload.TargetTemperature !== undefined) {\n T1.target_temperature = msg.payload.TargetTemperature;\n}\n\nif (T1.targetHeatCoolState == 1){\n if (T1.temperature >= T1.target_temperature) {\n OutMsg.payload = { \n CurrentHeatingCoolingState: 0\n };\n } else {\n OutMsg.payload = { \n CurrentHeatingCoolingState: 1\n };\n }\n} else if (T1.targetHeatCoolState === 0){\n OutMsg.payload = {\n CurrentHeatingCoolingState: 0\n };\n}\n\ncontext.set(\"T1\",T1);\n\nreturn OutMsg;\n","outputs":1,"noerr":0,"x":635,"y":440,"wires":[["6f5a9630.00aa48"]],"l":false},{"id":"518332d5.fbb68c","type":"inject","z":"f4eb4999.3608c8","name":"Check every 5 sec","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":true,"onceDelay":0.1,"x":635,"y":500,"wires":[["547f25a0.48f0ac"]],"l":false},{"id":"6be4f0dc.c5e6","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.TargetTemperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":515,"y":360,"wires":[["6f5a9630.00aa48"]],"l":false},{"id":"65abb0c0.33338","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"move","p":"payload.TargetTemperature","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":735,"y":460,"wires":[["598d0402.c2cb6c"]],"l":false},{"id":"76b0acf2.8926a4","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.CurrentTemperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":515,"y":420,"wires":[["6f5a9630.00aa48"]],"l":false},{"id":"e2ab33e3.7da14","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"TargetHeatingCoolingState\":0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":515,"y":500,"wires":[["6f5a9630.00aa48"]],"l":false},{"id":"ae5b73e.f1de79","type":"wb-input","z":"f4eb4999.3608c8","name":"Температура уставки","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/Temperature Set","x":320,"y":360,"wires":[["6be4f0dc.c5e6"]]},{"id":"9e0dbcec.e88a6","type":"wb-input","z":"f4eb4999.3608c8","name":"Текущая температура","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/Current temperature","x":320,"y":420,"wires":[["76b0acf2.8926a4"]]},{"id":"c68eb8a5.076388","type":"wb-input","z":"f4eb4999.3608c8","name":"Вкл/Откл","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/The thermostat works","x":280,"y":480,"wires":[["85be6c7a.3bbdb"]]},{"id":"598d0402.c2cb6c","type":"wb-output","z":"f4eb4999.3608c8","name":"Температура уставки","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/Temperature Set","command":"/on","commandType":"wb_cmd","payload":"payload","payloadType":"msg","x":920,"y":460,"wires":[]},{"id":"e0d38aff.c02008","type":"wb-output","z":"f4eb4999.3608c8","name":"Вкл/Откл","server":"9d631ffc.e111f","filter":"/devices/temp_103/controls/The thermostat works","command":"/on","commandType":"wb_cmd","payload":"payload","payloadType":"msg","x":960,"y":500,"wires":[]},{"id":"85be6c7a.3bbdb","type":"switch","z":"f4eb4999.3608c8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"},{"t":"eq","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":410,"y":480,"wires":[["78659a3a.9836b4"],["e2ab33e3.7da14"]]},{"id":"78659a3a.9836b4","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"str","to":"{\"TargetHeatingCoolingState\":1}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":515,"y":460,"wires":[["6f5a9630.00aa48"]],"l":false},{"id":"73315bf9.1ae444","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"move","p":"payload.CurrentHeatingCoolingState","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":735,"y":400,"wires":[["98d56767.ad4318"]],"l":false},{"id":"98d56767.ad4318","type":"switch","z":"f4eb4999.3608c8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"1","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":830,"y":400,"wires":[["b07d3991.f4f0a8"],["b07d3991.f4f0a8"]]},{"id":"8aa31c7.9446de","type":"change","z":"f4eb4999.3608c8","name":"Преобразование","rules":[{"t":"move","p":"payload.TargetHeatingCoolingState","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":735,"y":500,"wires":[["2997cb74.a81404"]],"l":false},{"id":"2997cb74.a81404","type":"switch","z":"f4eb4999.3608c8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"1","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":830,"y":500,"wires":[["e0d38aff.c02008"],["e0d38aff.c02008"]]},{"id":"b07d3991.f4f0a8","type":"debug","z":"f4eb4999.3608c8","name":"На реле","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","x":960,"y":400,"wires":[]},{"id":"9d631ffc.e111f","type":"wb-server","z":0,"name":"WB","url":"192.168.88.143","allowuntrusted":true}]

Вот так выглядит термостат в интерьере. В моем доме установлено семь таких термостатов, прошло уже три месяца с момента инсталляции, проблем пока не выявлено. Из приятных мелочей можно отметить, что данный термостат подстраивает яркость в зависимости от освещенности, что очень полезно ночью. 

Дальнейшее развитие этой темы будет после выхода релиза Sprut.Hub. Где можно будет, минуя Node-red, пробросить большинство возможностей термостата в Homekit.

Данной статьей я хотел показать новичкам, что важно, прежде всего, определиться с выбором базового оборудования, потому что от данного выбора зависит то, на сколько просто Вы сможете строить свой Умный Дом.

Если помидорами меня не закидают, то постараюсь озвучить темы:

  •  Управление климатом в комнатах с теплыми полами. 

  •  Управление котельной в Умном Доме

  • Управление вентиляцией в Умном Доме


Отличная статья. не хватает ценника на устройство 

3400р

Буду пробовать, как раз в изучении вопроса климата и управление котельной! Ждем продолжение!

Все уже работает, осталось только все это описать

Тоже хочу управлять с помощью термостатов полами+батареи в комнате (коллекторная система отопления). Хочу строить УД на SprutHub/WirenBoard. Очень жду продолжения подобных тем и появления Spruthub. 

я допишу на этой неделе  возможно.

Отличная практичная статья, спасибо!

Жду продолжения. 

Панели работают в том же сегменте rs-485 что и остальные устройства wirenboard?

Да

А какой информационный кабель использовали?

Витая пара DEXP F/UTP TP6cFUTP305G

Спасибо за статью. Управление климатом в комнатах с теплыми полами когда ждать статью?

Спасибо. Может как раз на этих днях доделаю.

Отличная статья


Вернуться назад

Устройства


Вернуться назад