Сказ о том, как я «умный дом» делал
Давным-давно был такой фильм «Один дома». А в фильме был эпизод с автоматически включающимся светом в домах — имитация присутствия.
И вот тогда-то и захотелось сделать что-то подобное.
Времена были дикие, никаких «умных домов» тогда в наших краях не знали, не ведали, и пришлось городить колхоз лютый, самолепный.
За основу был взят старый компьютер, из тех, у которых были аппаратные LPT-порты.
Там было как минимум 8 проводов, на которых можно было выставить 0 или 1 (+5в), просто записав в порт соответствующий байт.
(забегая вперед — это почти то же самое что сейчас использовать Ардуино)
Таким способом удалось получить 8 управляемых линий. Через оптопары они управляли симисторами, симисторы управляли лампами, лампы светили или гасли. Цель была достигнута, но в процессе стало понятно что этого мало.
Дом менялся, 8 линий катастрофически не хватало. К тому же, а как температуру узнать? А контроль входных дверей, или чего-нибудь еще?
Следующим вариантом стало использование линии 1-wire. Это такая интересная штука, когда буквально на одну пару проводов (но лучше — на три провода) можно навесить кучу разных устройств, не только всем известных термометров DS1820, но и таких штук как DS2405 — управляемых выключателей.
Красота — отправил команду на нужный выключатель — он включил реле, реле включило что-нибудь полезное.
А при немного другой схеме включения их можно использовать для проверки контактов «замкнуто-разомкнуто».
Вместо кучи проводов — всего одна линия с ответвлениями. Для управления 1-wire шиной — простейший адаптер для COM-порта, на двух транзисторах, и программка на сервере. Несколько скриптов, мини-вебсервер, рисующий графики температур и управляющий выключателями.
Интернет тогда был через сотовый телефон, с дозвоном до GPRS, мессенджеров кроме Аськи еще не было, поэтому в качестве оповещалки использовался еще один телефон на шнурке, оправлял и принимал СМС.
Кстати, вот тогда впервые произошел случай, когда всё это реально пригодилось:
в том доме отопление было газовое, и в один прекрасный день газовщики чего-то у себя накрутили, давление в магистрали выросло, древний АУГВ обрадовался и нажал жарить со всей дури.
Когда температура подачи зашла за 90 градусов — система отправила СМС об этом. Пришлось срываться с работы, лететь домой и прикручивать котел.
А ведь как раз эта проверка была настроена просто так, чтоб было, ведь сетевой газ это надёжно, не то что на коленке наляпано!
Но разумеется, назвать это «умным домом» можно было только условно: ну, могу свет включить удаленно, ну, температуру посмотреть, двери проконтролировать…
Никаких тебе «сценариев», никакой «фоновой музыки»…
Но был и минус: 1-wire — сеть неторопливая. Для опроса термометров это не критично, но когда между отправкой команды и включением реле проходит почти секунда — это долго.
К тому же выявилась уязвимость в виде котиков: если участок провода как следует пожевать — работать перестает вся сеть, а это неудобно, особенно если не знаешь где именно она пожевана.
Очередной вариант «умного дома» делался уже на Ардуино, точнее на Ардуино Мини Про
Во-первых, она маленькая, и ее легко спрятать в распаечной коробке. Во-вторых, она паяется, а это надежнее штырьков. При этом совмещает в себе несколько портов ввода-вывода, и контроллер 1-wire шины. И такую можно разместить в каждой комнате, связав между собой шиной RS485 через адаптеры, управляя через ModbusRTU
Однако и у этой схемы нашлись свои минусы: всё те же провода, и отсутствие гибкости. В прошивке можно задать срабатывание на выключатели, например -, но всё остальное должно управляться с внешнего управляющего компьютера, который сначала считывает состояние, потом оценивает, потом выдает команду.
Это не слишком хорошо если надо настроить реакцию, скажем, на открывание двери: чтобы получить это событие — компьютер должен сначала прочитать регистры.
Следующим этапом была ESP8266, точнее ее вариант ESP12F — модуль под пайку.
Всё так же прекрасно программируется, как и Ардуино, только теперь с WiFi на борту.
Выводов поменьше, но и стоит оно подешевле, можно буквально в каждый утюг воткнуть.
Вопрос управления и телеметрии был решен через использование MQTT: на сервере поднят брокер Mosquitto, каждый модуль может отправлять сообщения и принимать команды немедленно.
Значимая информация сводится в веб-интерфейс, из него же можно управлять работой отдельных модулей.
Кроме того, модули поддерживают обновление OTA, то есть при необходимости можно зашить в них нужную логику работы (например, управление нагревателем теплого пола), а потом если возникнет необходимость — обновить ее, без перепайки.
К слову, сейчас часто встречаются проекты на базе ESP32 — вот эта штука показалась избыточной. Для простых задач ее слишком много, для сложных — слишком мало. По факту пригодилась ровно для одной задачи, но об этом позже.
Конечно же, недостатки появились, и очень быстро.
Во-первых, роутер начал чудить, когда количество таких устройств перевалило за второй десяток (а в частном доме, оказывается, много где можно их применить с пользой).
Во-вторых, возникли проблемы с дальностью работы — слишком удаленные от роутера модули то и дело спонтанно отваливались, причем в самый неподходящий момент.
Поэтому следующий этап — организация mesh-сети, из этих же модулей.
Есть такая библиотека — PainlessMesh, с ее помощью можно создать сеть из подобных модулей, растянув ее на гораздо большую площадь, сделав один из модулей гейтом в обычную WiFi-сеть.
По сути мало что меняется — модули все так же получают и отправляют сообщения, с внешними устройствами обмен идет через тот же MQTT, и даже возможность обновления прошивок через OTA есть. Только теперь — практически пропали выпадения устройств из сети.
Но это всё самоделки, почему не использовать «промышленные решения», например, Zigbee?
В самом деле, архитектура сети Zigbee — практически то же самое что PainlessMesh, только заводское, коробочное решение.
Конечно, стоило попробовать и его.
Широко известная реализация — устройства Tuya, а также к ним примазавшиеся. По факту, главным элементом там является «роутер», а точнее в терминах Zigbee — «координатор» Tuya.
Именно он инициирует создание сети Zigbee, к которой затем подключаются другие устройства, и он транслирует данные из этой сети наружу через облако Tuya, с которым работают различные приложения.
А вот внутри самой сети — обмен по протоколу Zigbee, который сам по себе и к конкретно Tuya не привязан, если не считать отдельных специфических команд, которые не входят в официальные спецификации протокола -, но их можно вызвать и «вручную».
Но облако Tuya мне было не нужно, поэтому в качестве координатора была использована связка ESP32 и cc2530 под управлением Tasmota
В отличии от ESP8266 нет простого способа программировать эти модули.
Есть «родная» прошивка, для работы с которой требуется внешний управляющий контроллер, есть готовые прошивки PTVO, но и у них есть свои нюансы.
Tasmota выступает в роли координатора сети, и транслирует данные во внешнюю сеть в виде MQTT.
К сети прекрасно подключаются различные заводские Zigbee-устройства, вроде «умных реле» или настенных термометров, можно получать данные, можно управлять реле.
В процессе выяснилось, что дальность связи Zigbee еще меньше чем у WiFi, то есть пока расстояние между устройствами в пределах 5 метров — все работает, но чуть дальше — начинаются проблемы.
Теоретически, так как сеть имеет mesh-структуру, это не страшно: любое реле является в том числе роутером-ретранслятором, поэтому сеть можно растянуть.
Но на практике иногда случается, что какой-то из промежуточных узлов «залипает», перестает транслировать через себя пакеты данных, и тогда то, что было подключено в сети за ним, теряется. Достаточно сбросить питание, и всё восстановится -, но для этого надо чтобы кто-то пришел и дернул рубильник, а для этого сначала нужно понять что где-то что-то «залипло».
В общем, надежность не порадовала. Подобное иногда происходит и с PainlessMesh-модулями, но там это легко решается «пинг-контролем», в случае отсутствия активности в сети модуль перезагружает сам себя. Но как заставить перезагружаться заводское реле, или хотя бы вот такой модуль, если в прошивку не залезть?
Самоделка на PainlessMesh оказалась надежнее. Теперь устройства на ESP8266 используются везде, от управления освещением до электронных замков, контроля нагревателей и различных датчиков.
Более того, оказалось что умные розетки типа «Tuya WIFI» тоже можно переделать на PainlessMesh, завязав в единую систему.
А Zigbee остались для тех устройств, где сетевая связность не критична: свет можно и кнопкой выключить, если управление отказало.
Но где же «сценарии», «фоновая музыка», «раздвижные шторы», «управление телевизором», вот это всё?
Честно говоря, не нашел применения. Ну можно задать сценарий «ужин при свечах» -, но всегда найдется 100 причин чтобы вот именно сейчас что-то должно быть не так как в остальное время, придется корректировать.
Можно управлять телевизором -, но зачем, если выбор сериала всё равно вручную и как захотелось?
Музыка эта (имперский марш?), шторы… Баловство, некому показывать.
Вот автоматика — да. Привыкаешь, что можно всем управлять с экрана планшета на стене, или со смартфона. Это — удобно.