Для работы проектов iXBT.com нужны файлы cookie и сервисы аналитики.
Продолжая посещать сайты проектов вы соглашаетесь с нашей
Политикой в отношении файлов cookie
Здравствуйте друзья
В своих обзорах устройств умного дома экосистемы Xiaomi — я уже неоднократно упоминал название Domoticz. Наконец у меня дошли руки поделится своими наработками на эту тему, и рассказать что же это такое и каким образом можно дополнить стандартные возможности умного дома от Xiaomi при помощи этой системы. В рамках одного обзора это рассказать невозможно, но нужно с чего-то начинать — поехали…
Ссылка на комплект 6 в 1 базовый набор для умного дома Xiaomi —
GearBest Aliexpress
Таблица (обновляется) по экосистеме Xiaomi
Для тех кто любит больше смотреть и слушать, видеоверсия этого обзора в конце текста.
Вопросы и ответы
1. Что такое Domoticz ?
Это мультиплатформенное ПО с открытым кодом ориентированное на создание системы управления умным домом. Поддерживает большое количество различных устройств разных вендоров, в том числе работает с устройствами Xiaomi.
2. Какие устройства Xiaomi могут управлятся Domoticz?
Буду говорить только о тех устройствах, которые я проверил лично. На данный момент можно управлять шлюзом Xiaomi Gateway — и всеми устройствами которыми он управляет — кнопки, датчики открытия и движения, розетки ZigBee, выключатели Aqara. Так же поддерживаются осветительные гаджеты Yeelight — RGBW и White лампы, потолочный светильник Celling Light.
Читал про работу с bluetooth сенсорами miflora.
3. Для чего мне Domoticz ?
Система имеет более гибкие возможности по настройке сценариев — например проверку активности устройства, то чего нет в MiHome, или создание переменных — которые позволяют по одному условию — например нажатие клавиши — выполнять различные действия, в зависимости от значения переменной.
Сценарии, созданные в Domoticz не зависят от китайских серверов и наличия интернет.
Domoticz расширяет функциональность устройств — например новые действия «free fall» или «alert» для кубика, или «Long Click Release» для кнопки.
4. Если я буду использовать Domoticz то не смогу работать с MiHome?
Обе системы прекрасно живут паралелльно — функциональность MiHome — полностью сохраняется, просто часть сценариев будет жить в одной системе — часть в другой. В принципе все сценарии могут жить в Domoticz.
5. Зачем мне нужен MiHome если я буду использовать Domoticz?
По крайней мере для добавления новых устройств. Выбор стоит за вами — но мое мнение — на данный момент Domoticz лучше всего использовать как дополнение к MiHome
6. Что нужно для подключения устройств Xiaomi к Domoticz?
Сразу хочу успокоить — паяльников, программаторов и танцев с бубнами не надо. Так же вам не понадобится Linux или виртуальные машины — попробовать все можно прямо на вашей рабочей винде. В дальнейшем — если будет такое желание, то систему можно будет установить на одноплатном компьютере типа Raspberry или Orange — об этом я тоже расскажу, но на начальном этапе установка системы не сложнее установки календаря огородника на 2017 год. Подключение очень легко и просто и совершенно не влияет на базовую функциональность устройств. При желании вернуть все назад — элементарно.
Подготовительные работы
Итак, что нужно для того что бы начать работать с Domoticz?
1. Резервирование IP адресов
Первым делом необходимо, тем устройствам которыми вы планируете управлять — пока это шлюз и лампы — установить статические IP адреса. Это делается на вашем домашнем роутере, при помощи таблицы клиентов DHCP которая выглядит примерно так —
и информации из вкладок Network info плагинов управления шлюзом и лампами, где указаны MAC адреса устройств
Используя эту информацию нужно прописать выдачу постоянных IP адресов этим устройствам — так как они будут управлятся именно по IP, и если адрес будет сменен — Domoticz потеряет связь с ним. Таблица резервирования адресов выглядит примерно так —
2. Режим разработчика
Необходимо активировать режим разработчика. Для шлюза Xiaomi Gateway необходимо зайти в меню, выбрать опцию about, внизу экрана где написана версия (2.23 у меня) — нажимать на нее до тех пор пока в меню не появится две новые опции, они могут быть на китайском, в моем примере — на английском. Нажимаем на первую из двух — local area network communication protocol, в меню активируем верхний переключатель и записываем пароль шлюза.
Для ламп все проще — нужно установить приложение Yeelight, если вы его еще не поставили, и для каждого светильника — заходим в меню, режим разработчика — включить
Установка Domoticz
Приложение берем здесь выбираем Beta — так как именно в ней имеется поддержка устройств Xiaomi. Так как на данный момент я работаю с Domoticz под управлением Windows — то и писать про про нее. Когда ко мне доедет RaspBerry — тогда расскажу и про нее.
Установочный файл занимает чуть более 14 Мб, просто качаем запускаем — установка стандартная, со всем соглашаемся
И через минуту имеем установленный на локальной машине Domoticz, доступный по адресу 127.0.0.1:8080 либо вместо 127.0.0.1 — адрес компьютера в локальной сети. Интерфейс изначально на английском (у меня уже переключено на русский)
Язык системы, пароль для входа, координаты — меняем в меню настройки — настройки
127.0.0.1:8080/#/Setup
Добавление устройств
Для добавления устройств переходим во вкладку Настройки — Оборудование
127.0.0.1:8080/#/Hardware
Выбираем тип устройства Xiaomi Gateway, называем его как нибудь, указываем его IP адрес, который мы зарезирвировали на роутере, прописываем пароль полученный в окне режима разработчика. Порт — у меня работает на порту 54321. В вики домотикз описано подключение с указанием порта 9898
Для добавления ламп — просто добавляем устройство YeeLight LED — адреса указывать не надо, лампы подтянутся сами.
Датчики подключенные к шлюзу подтянутся не сразу все, это процесс может занять час и более — нужно подождать. Это связано с тем, что устройства ZigBee активируются только в момент передачи данных. Немного подтолкнуть процесс можно — открывая и закрывая окна с датчиками, дышать на датчики температуры, включать выключать розетки — словом вынуждать устройства передавать данные.
Устройства
Устройств добавится НАМНОГО больше чем вы ожидаете 
127.0.0.1:8080/#/Devices
Например каждый датчик температуры и влажности — добавится как три устройства, отдельно температура, отдельно влажность, и все вместе. Розетки — отдельно розетка (управляемое устройство) отдельно — как датчик энергопотребления. А вот шлюз — отдельно подстветка, отдельно сирена сигнализации, отдельно будильник, дверной звонок и регулятор звука. Для того чтобы добавить устройство в список используемых — в конце строки нужно нажать зеленую стрелочку. Убрать из используемых — синюю стрелочку. То что нам не нужно — не добавляем.
Добавленные к использованию устройства располагаются по нескольким вкладкам —
Переключатели
На этой вкладке собраны все управляемые устройства
127.0.0.1:8080/#/LightSwitches
Выключатели, кнопки, лампы, и прочее. Здесь мы можем включать, выключать, и делать любые действия с устройствами в ручном режиме.
Например выбрать звук который будет звучать на шлюзе, или цвет свечения на RGB лампе или яркость на белой лампе.
Температура
На этой вкладке группируются климатические датчики — влажности и температуры
127.0.0.1:8080/#/Temperature
Поначалу они все называются одинаково, определить где какой — можно по их показаниям и сверке с приложением Mi Home, после чего их можно соответственно переназвать.
Вспомогательное
Здесь сгрупирован датчик освещенности шлюза — хотя его показания весьма странные, и счетчики потребления энергии розеток.
127.0.0.1:8080/#/Utility
Сценарии
Для создания сценариев — необходимо перейти во вкладку — Настройка — Дополнительно — События. Написание сценариев доступно в двух вариантах — блочный и скриптовый на языке lua.
Примеры сценариев
Учится работать с Domoticz лучше начинать с блоков. Тут все разбито на группы и составлять сценарии довольно просто. Пример простого сценария на блоках — включение света по обнаружению движения, и выключения через минуту после того как датчик движения перейдет в статус выключено. После составления сценария нужно назвать его, поставить галочку на опции Event active: — для включения и сохранить его.
Точно такой же сценарий на lua
Примеры использования
Больше внимания конкретным сценарям я буду уделять в других обзорах, тут в качестве примера приведу сценарий, который НЕВОЗМОЖНО реализовать в Mi Home, а именно — двухкнопочный выключатель Aqara c размыканием проводов — левая кнопка будет работать по назначению — разрывать и соединять фазу, а правая — не подключенная к линии (для питания выключателя достаточно подключения только одной из кнопок) — будет включать и выключать Yeelight лампу, которая физического соединения с выключателем не имеет.
В данном сценарии будет проверятся состояние лампы Yeelight, значение самого выключателя On или Off — значения иметь не будет. Если состояние лампа отлично от Off — значит она работает, и будет выключена, а если выключена — то будет включена.
На этом, вводную часть по Domoticz буду завершать, если тема будет интересна — то продолжу, интересного еще очень много.
Видеоверсия обзора:
Все мои видео обзоры — YouTube
Спасибо за внимание.
Безумный дом
Время на прочтение
10 мин
Количество просмотров 56K
Мы часто думаем о том, как автоматизировать свое жилище, но часто этот вопрос упирается в то, что готовые системы слишком негибки и дороги, а разбираться, как сделать что-нибудь самому совершенно нет времени.
Под катом — подробный гайд по настройке системы умного дома: сделаем возможным работу устройств ZWave и кастомных MQTT-устройств на базе ESP8266, настроим управление домом при помощи HomeKit и Яндекс Алисы.
Первоначальная настройка Raspberry PI
Установка системы
На распберри ставим raspberry pi os https://www.raspberrypi.org/downloads/raspberry-pi-os/ Записываем ее на MicroSD от 16 ГБ. Обязательно класса 10 и выше, иначе не хватает скорости доступа для работы операционной системы.
$ sudo dd bs=4M if=raspbian.img of=/dev/sdf status=progress
Headless
Если не хотим подключать монитор
SSH
В boot разделе создаем файл с именем ssh(это одноразовый способ: при наличии файла с именем ssh в разделе при старте raspberry sshd запускается и удаляется этот файл, поэтому не забываем в sudo raspi-config включить ssh насовсем)
# mkdir /mnt/boot_partition
# mount /dev/sdf1 /mnt/boot_partition
# touch /mnt/boot_partition/ssh
# umount /dev/sdf1
Теперь при первом запуске у нас будет возможность подключиться к системе по ssh.
Wi-Fi
Если необходимо подключение к локальной сети посредством wifi, создаем в boot разделе файл wpa_supplicant.conf
# mkdir /mnt/boot_partition
# mount /dev/sdf1 /mnt/boot_partition
# vim /mnt/boot_partition/wpa_supplicant.conf
# umount /dev/sdf1
Содержимое файла wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=RU
network={
ssid="your_ssid"
psk="your_wifi_password"
}
Подробнее об этом конфиге
Первый запуск
Вставляем флешку в малину, подключаем ее по ethernet к сети, если не настроили wifi, подаем питание по microUSB, используя блок питания с предельным током как минимум 2 ампера.
Raspberry PI должна загрузить систему, а также подключиться к сети.
Попробуем получить к ней доступ по ssh.
Для этого нам необходимо узнать, какой ip-адрес получила raspberry pi в нашей локальной сети. Вы можете зайти в веб интерфейс маршрутизатора и посмотреть список активных хостов, но я предпочитаю использовать nmap. Выполняю сканирование сети посредством пингования всех ip адресов подсети.
# nmap -sn 192.168.0.1/24
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-23 23:49 MSK
Nmap scan report for 192.168.0.1
Host is up (0.00033s latency).
Nmap scan report for 192.168.0.105
Host is up (0.00016s latency).
Nmap scan report for 192.168.0.120
Host is up (0.00050s latency).
Nmap done: 256 IP addresses (3 hosts up) scanned in 2.57 seconds
Здесь можно заметить, что кроме самого роутера(192.168.0.1) и моего ПК(192.168.0.105) появился еще один хост 192.168.0.120 — многовероятно, что это и есть наша малина.
Попробуем подключиться. Стандартная пара логин/пароль: pi/raspberry.
# ssh pi@192.168.0.120
Linux raspberrypi 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 23 21:54:16 2020 from 192.168.0.105
pi@raspberrypi:~ $
Мы успешно вошли по ssh на raspberry pi и теперь можем приступать к дальнейшей настройке системы.
Установка Domoticz
Domoticz — программная система для управления умным домом с открытым исходным кодом. Написана на C++. На хабре я видел статьи про аналоги этой системы, такие как openhub и home assistant, но мой выбор пал на domoticz вследствие того, что эта платформа максимально проста для конфигурирования, а кроме того, написана на C++, что делает ее гораздо менее требовательной к вычислительным мощностям для работы, чем аналоги, использующие java и python. Кроме того, подкупила простая система написания сценариев на Lua или python.
Итак, установим domoticz на наш одноплатник. Установка максимально простая, за что личный респект разработчикам.
pi@raspberrypi:~ $ curl -L install.domoticz.com | sudo bash
На экране, спустя некоторое время, появится псевдографический диалог установки, в котором будет возможно выбрать порты и протоколы для веб интерфейса, директорию для установки. Лично я оставил исключительно HTTP на 80 порту, но вы вольны в своих решениях.
После окончания установки и, на всякий случай, ребута, проверяем, что демон domoticz поднялся:
pi@raspberrypi:~ $ sudo service domoticz status
Также проверим, что web интерфейс доступен: http://192.168.0.120/
Watchdog
В процессе эксплуатации я заметил, что Domoticz иногда падает с ошибкой. Чтобы поднимать его автоматически, напишу watchdog с помощью cron.
#!/bin/sh
# /etc/scripts/check_domoticz_online.sh
# check domoticz
status=`curl -s -i -H "Accept: application/json" "http://localhost:8080/json.htm?type=devices&rid=1" | grep "status"| awk -F: '{print $2}'|sed 's/,//'| sed 's/\"//g'`
if [ $status ]
then
echo "Domoticz has already been started"
else
/home/pi/domoticz/domoticz.sh restart
fi
pi@raspberrypi:~ $ sudo crontab -e -u root
*/5 * * * * /etc/scripts/check_domoticz_online.sh > /dev/null 2>&1
Теперь каждые 5 минут будет запускаться скрипт, который проверит, работает ли Domoticz и перезапустит его, если это необходимо
Настройка domoticz для работы с устройствами
Теперь, когда система работает и готова к продолжению конфигурирования, можно настроить какие нибудь устройства.
IP-камера
Самое простое, что можно настроить в Domoticz — это камера. Для этого зайдем в web-интерфейсе в Setup -> More options -> Cameras -> Add camera.
Вводим данные о своей камере. У меня возникли сложности с определением picture url, но они решились вот этим сервисом.
После того, как мы сохранили новую камеру, у нас появилась строка в таблице с кнопками, чтобы посмотреть изображение или видео.
Z-Wave USB Stick
Посредством Domoticz, мы можем управлять домашней сетью Z-Wave IoT устройств. Это удобный протокол, позволяющий устройствам взаимодействовать друг с другом так, чтобы некоторые из них являлись, помимо своего основного назначения, Z-Wave ретрансляторами, своей работой расширяя радиус покрытия Z-Wave. Протокол закрытый, проприеритарный, поэтому просто создать свое Z-Wave устройство не выйдет, поэтому обычно, по этому протоколу работают покупные устройства/компоненты умного дома.
По моему опыту, настройка Z-Wave сети в Domoticz оказалась сильно проще и, в отличие от систем Home Assistant и openHub, здесь USB Stick заработал сразу и без проблем.
Для того, чтобы настроить свою сеть Z-Wave, я приобрел Z-Wave USB Stick. Подключив его к Raspberry pi, я добавил его как еще одну Hardware, с Type OpenZWave USB. Путь к Serial Port у меня выглядел примерно так: /dev/serial/by-id/usb-0658_0200-if00
После добавления стика, появится запись в таблице с ним, в которой будет кнопка Setup, открывающая возможность настраивать ZWave сеть. В меню настройки можно включать режим обнаружения новых ZWave устройств, а также изменять параметры сети и устройств в ней.
ВАЖНО: следите, чтобы рабочая частота Z-Stick соответствовала рабочей частоте Z-Wave устройств
MQTT-брокер
Для создания кастомных IoT устройств я собираюсь использовать Arduino с подключением к локальной сети. В рамках данной сети общепринятым стандартом общения между устройствами является MQTT — протокол, ориентированный для обмена сообщениями по принципу издатель-подписчик. Для передачи сообщений посредством данного протокола нам необходим MQTT-брокер — своеобразный хаб для сообщений. Domoticz и IoT устройства выступят в качестве клиентов сети, подключившись к брокеру.
Установим свободный MQTT-брокер Mosquitto.
pi@raspberrypi:~ $ sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
pi@raspberrypi:~ $ sudo apt-key add mosquitto-repo.gpg.key
pi@raspberrypi:~ $ cd /etc/apt/sources.list.d/
pi@raspberrypi:/etc/apt/sources.list.d/ $ sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
pi@raspberrypi:/etc/apt/sources.list.d/ $ cd
pi@raspberrypi:~ $ sudo apt-get install mosquitto mosquitto-clients
pi@raspberrypi:~ $ rm mosquitto-repo.gpg.key
Теперь Mosquitto установлен и работает. Мы можем подключиться к нему без аутентификации по адресу 0.0.0.0:1883. Таких настроек нам хватит на первое время.
Domoticz — MQTT клиент
Подключим domoticz к MQTT-брокеру. В web-интерфейсе Domoticz — Setup -> Hardware.
-
Type — MQTT Client Gateway with LAN interface.
-
Remote address — localhost
-
Port — 1883
-
Data Timeout — disabled
-
Username и password — оставляем пустыми до лучших времен
-
Prevent loop — в большинстве случаев эту настройку следует оставить включенной, но в нашем случае мы собираемся подключать собственные устройства по MQTT и управлять ими внешними методами, поэтому мы выключим prevent loop и domoticz будет пересылать все обновления статусов устройств из domoticz/in в domoticz/out. Это нужно, тк внешнее управление осуществляется посредством публикаций в domoticz/in, а наши устройства слушают domoticz/out, и если domoticz не будет пересылать сообщения из in в out, то устройства не смогут узнать об обновлениях их статусов.
-
Publish topic — топик, куда domoticz будет публиковать все обновления статусов. Для себя я оставил стандартно — out, и domoticz публикует в топик domoticz/out.
После нажатия на Add у нас добавился новый hardware. Если все хорошо, то в таблице, в колонке Enabled мы увидим Yes.
Dummy switch
Хотелось бы быстро проверить работу нашей системы. Для этого есть виртуальные устройства — не имеющие физических воплощений(по крайней мере, пока мы их не сделаем), но имеющие статус в системе domoticz и управляемые из нее.
Добавим Dummy hardware. В web-интерфейсе Domoticz — Setup -> Hardware
-
Type — Dummy (Does nothing, use for virtual switches only)
Добавляем. В таблице появилась еще одна запись. Можно увидеть, что в таблице рядом с Type есть кнопка Create virtual sensors. Нажимаем ее, вводим параметры
-
Name — lamp
-
Sensor type — Switch
Сохраняем и переходим в меню Switches. Теперь здесь можно увидеть новый переключатель:
Теперь мы можем посмотреть, как изменение переключателя отражается в топике MQTT.
pi@raspberrypi:~ $ mosquitto_sub -h localhost -v -t "domoticz/out"
Мы использовали клиент MQTT, который установили вместе с брокером, и подписались на топик, куда domoticz публикует свои обновления. Нажмем на лампочку в веб-интерфейсе
Смотрим в терминал и видим сообщение из топика:
domoticz/out {
"Battery" : 255,
"RSSI" : 12,
"description" : "",
"dtype" : "Light/Switch",
"hwid" : "4",
"id" : "00014052",
"idx" : 2,
"name" : "lamp",
"nvalue" : 1,
"stype" : "Switch",
"svalue1" : "0",
"switchType" : "On/Off",
"unit" : 1
}
В подобных сообщениях Domoticz сообщает нам об изменении своего состояния. Формат тела сообщения — JSON. В поле name видим название, которое мы ранее установили для switch’а в domoticz. Новое состояние свитча мы можем увидеть в поле nvalue.
Программируем собственные IoT устройства на базе Arduino-like контроллеров.
Теперь, когда MQTT-брокер доступен из сети и Domoticz публикует туда сообщение каждый раз, когда мы переключаем switch, можно заняться программированием микроконтроллера. Задача: подключиться к сети, подключиться к брокеру MQTT, подписаться на нужный топик и парсить сообщения от Domoticz, выделяя те, поле name которых совпадает с названием, захардкоженым в программу, и выполняя переключения встроенного светодиода в зависимости от нового состояния из сообщения. Впоследствии переключаться будет не встроенный светодиод, а реле, управляя каким-либо процессом.
Для реализации данного функционала я использую клон Arduino Uno, Ethernet Shield, а также Arduino-like плату на основе контроллера ESP8266, который способен подключаться к сети по WiFi. Таким образом, у меня будут две версии устройства — с подключением по Ethernet и по WiFi.
Для работы с MQTT я использовал библиотеку MQTT.h. Для парсинга JSON — ArduinoJSON.h.
Изначально, написав скетч для Arduino, я, выставив значение для буферов MQTTClient и ArduinoJSON в 500 байт и использовав преобразование входных данных в класс String, превысил мизерное количество оперативной памяти в 2 килобайта. Уменьшив размер буферов до 300 байт и использовав «сишные» строки, мне удалось уложиться в данный лимит, и даже оставить 300-400 свободных байт, но стало понятно, что модифицировать и усложнять программу, добавлять дополнительную логику в случае этой платы будет затруднительно.
Исходный код скетча Arduino + Ethernet.
Программировать ESP8266 оказалось сильно проще, так как оперативной памяти здесь на порядок больше.
Исходный код скетча для ESP8266(WiFi).
Отлично! Оба устройства отслеживают изменения значения переключателя в интерфейсе Domoticz, и переключают светодиод соответственно значению переключателя!
Для себя в данный момент я сделал вывод, что гораздо разумнее использовать платы на основе ESP8266, потому что:
-
нет давящего ограничения по оперативной памяти
-
цена за комплект Arduino UNO + Ethernet Shield — 1100 руб, а на плату с работающим из коробки WiFi — 400
Таким образом, мы научились управлять собственным WiFi устройством прямо из интерфейса Domoticz, что открывает перед нами гигантские перспективы для автоматизации
Управляем всем через Яндекс Алису
Domoticz как таковой не поддерживает интеграцию с Алисой, потому что для этого необходим работающий навык Алисы и какой-то облачный интерфейс. Поэтому, для работы с Алисой предлагается следующий костыль: к mqtt брокеру, куда domoticz публикует изменения своих статусов, подключить homebridge — средство для подключения умного дома Apple, и передавать команды от Алисе к domoticz через него.
Поставим все необходимое ПО:
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt install -y nodejs npm libavahi-compat-libdnssd-dev
pi@raspberrypi:~ $ sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x
pi@raspberrypi:~ $ sudo npm install -g -g --unsafe-perm homebridge-edomoticz
Запускаем
sudo hb-service install --user homebridge
Теперь заходим на веб-интерфейс homebridge по порту 8581, логинимся admin:admin и видим qr-код устройства, который сканируем приложением Дом на iphone. Homebridge своим плагином для domoticz должен видеть все устройства, зарегистрированные в domoticz, и когда мы добавим homebridge в приложение Дом на iphone, то мы сможем ими управлять. Происходит это посредством отправки сообщений в domoticz/in. Чтобы мое самодельное устройство начало получать эти изменения своего статуса, я отключил в настройках mqtt domoticz prevent loop. Таким образом, теперь, когда domoticz получает обновления статусов устройств через domoticz/in, он дублирует их в domoticz/out и устройства, слушающие domoticz/out, могут их получить. Позаботьтесь о том, чтобы ваши устройства не отвечали в domoticz/in на изменения своего статуса, чтобы не образовывались петли.
Для подключения Homebridge к Алисе я использовал g-on плагин. По ссылке — исчерпывающее описание настройки.
После окончания настройки мы имеем возможность управлять устройствами Domoticz, используя приложение Дом или Алису
Итог
Результатом моей работы стала система, обладающая приемлемой стабильностью, способная управлять IoT устройствами без необходимости подключения к интернету, позволяющая интегрировать собственные IoT устройства, работающие в сети WiFi, а также управлять этими устройствами голосовыми командами через Алису, или же с помощью облачного сервиса Apple
P.S.
Демонстрация работы системы. Торшер подключен к самодельной «умной розетке», состоящей из реле, которым управляет ESP8266. Розетка по MQTT общается с Domoticz
P.P.S
В комментариях к статье развернулось интересное обсуждение, из которого я вынес несколько ценных рекомендаций и решил дополнить статью ссылками на них.
Исправление костыля с watchdog’ом
Большое спасибо автору этой статьи, который показал на примере из моей статьи, что в данном случае более подходящим инструментом для контроля работы domoticz будет systemd. И действительно, systemd снимает с нас необходимость следить за работой демонов, предоставляя гибкий интерфейс для настройки управления ими
Tasmota
Использование готовой прошивки для ESP8266 позволит не писать свой код для нее. Я проверил работоспособность этой прошивки на плате Wemos D1 R32.
Прошивку скачиваем отсюда
Прошиваем:
# esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 erase_flash
# esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 tasmota32.bin
Можем посмотреть логи tasmota через монитор последовательного порта
# screen /dev/ttyUSB0 115200
Подключаемся к wifi сети tasmota, открываем web морду устройства: http://192.168.4.1
Вводим данные wifi сети и ждем, пока esp8266 не подключится к ней.
Теперь смотрим в логах, какой ip адрес получила esp8266, и снова открываем веб интерфейс, уже используя новый адрес.
Сначала настраиваем MQTT: все оставляем стандартно, кроме логопассов и IP адреса MQTT брокера. После этого настраиваем модуль: выбираем порты, которыми хотим управлять, указываем, что за устройство на них висит: реле, кнопка или что-то еще. После этого настраиваем Domoticz — смотрим, какое idx у dummy device, и записываем его в соответствующее поле. Теперь мы можем управлять этим устройством при помощи domoticz
В предыдущих сериях…
- «Бомж» Умный дом, подбор комплектующих. Часть 1
- «Бомж» Умный дом, подбор и установка ПО для центрального хаба. Часть 2
- «Бомж» Умный дом, конфигурирование конечных устройств. Часть 3
Когда-то в юности с заворожением смотрел Star Trek и Babylon 5, где автоматизированные системы корабля следили за уровнем кислорода, двери кают открывались для членов экипажа автоматически, включая освещение и мягкую музыку. С тех пор прошло уже достаточно времени, и теперь все эти технологии автоматизации стали доступны и до безобразия просты в интеграции. Самое важное в умном доме — это логика его работы, то, как все системы взаимодействуют друг с другом с одной лишь целью — сделать нашу жизнь проще, комфортней и безопасней. Для этого не нужны космические технологии. Все, что для этого нужно — это лишь желание, умный дом для себя сделать не сложно и это может каждый. Статья получилась немного длинной, но я решил не дробить ее на две части, приятного прочтения!
Domoticz, первоначальная настройка
В качестве системы управления умным домом я выбрал Domoticz, главным образом из-за простоты настройки и гибкого языка скриптов DzVents, специально заточенного для написания логики умного дома. Приступим к настройке. Для начала установим современную тему Machinon и службу автоматического обнаружения и добавления новых устройств для Domoticz.
cd /home/smarthomeless/domoticz/www/styles git clone https://github.com/EdddieN/machinon-domoticz_theme.git machinon cd /home/smarthomeless/domoticz/plugins git clone https://github.com/emontnemery/domoticz_mqtt_discovery.git sudo systemctl restart domoticz
Применяем тему в настройках. Если до этого Domoticz запускался в браузере, необходимо предварительно очистить кэш. Дальше нам необходимо создать план дома. Это можно сделать в любом дизайнере помещений (я нарисовал тестовую квартиру в Home Design 3D), графическом редакторе, отсканировать план квартиры, который передал застройщик либо просто дать своему ребенку лист бумаги, карандаш и попросить нарисовать вашу квартиру — как видит это он =). Далее идем в настройки -> план комнаты -> план помещения, добавляем новый план, загрузив нашу картинку. Пришло время добавить оборудование. Для этого открываем Настройки -> оборудование и добавляем следующие элементы:
Dummy — виртуальные элементы, MQTT — необходим для подслушивания всего того, что о нас думают наши датчики, Weather — служба прогноза погоды (она может понадобится в системе поддержания микроклимата), можно также подключить внутренние датчики апельсинки для того, чтобы следить за динамикой использования ресурсов и температурой. Для включения MQTT Discovery Service на нашей ESP необходимо зайти в веб интерфейс ESP8266 в браузере и ввести в консоле команду publish sonoffs/cmnd/SetOption19 1. После этого наша ESP перезагрузится, в меню Domoticz Настройка -> Устройства автоматически подтянутся все наши подключенные датчики и реле. Easiest!
В поле Имя отображается «дружественное имя», которое для удобства можно поменять в настройках прошивки Sonoff-Tasmota в меню Конфигурация -> Конфигурация прочее. Все, что теперь нам нужно — это уточнить спецификацию устройств. Мы помним, что первый переключатель — это датчик дыма, заходим в редактирование датчика и выбираем тип переключателя Smoke Detector, сохраняем. Второй переключатель у нас датчик движения, аналогичным образом выбираем тип переключателя Motion Sensor. Третий переключатель связан с реле, он будет в системе управления умным домом подключен к вентилятору. Здесь нам нужно только поменять для него значок на Fan. К четвертому выключателю будет подключен увлажнитель — меняем значок на Water. Пятый — это датчик протечки, для него так же выберем значок Water. Что у нас вышло?
Все на месте, при срабатывании датчика проходит индикация в Domoticz, при нажатии на элементы управления — переключение физических реле. Красота! Теперь нам нужно красиво разместить все наши элементы на плане помещения. Для этого заходим в настройки -> план комнаты, нажимаем добавить план и выбираем его. Снизу появится список устройств, которые можно добавить. Добавляем поочередно все, что нам понадобится. Далее идем в меню план помещения, выбираем наш ранее созданный план. Все добавленные в комнату устройства отображаются слева, все что нам нужно — это перетащить их в нужное место в комнате.
Здесь я добавил несколько дополнительных устройств, а также создал виртуальный селекторный переключатель Radio, уточнив его спецификацию как Media Player и элемент «Уровень громкости» для управления уровнем звука в нашем доме. Пора двигаться дальше.
Где логика?
Пришло время поработать немного над интеллектом нашего дома. Какие системы у нас будут работать на данной сборке?
- Система поддержания микроклимата
- Система управления освещением
- Система безопасности
- Мультимедиа система
Сценарии:
- Я пришел / Я ушел
- Ночь / Утро / Вечер
- Пожар / Авария
- Проникновение
Итак, приступим. Для создания автоматизации заходим в настройки -> события, там создаем событие iCame, выбираем триггер Device — Domoticz, который сразу подгрузит нужный нам шаблон. В данном сценарии у нас будет участвовать устройство Entrance door, при ее открытии загорается свет в прихожей и включается мягкая музыка с уровнем громкости 60%.
return { on = { devices = { ‘Entrance door’ } }, execute = function(domoticz, door) if (door.state == ‘Open’) then domoticz.devices(‘Hallway Light’).switchOn() domoticz.devices(‘Volume Control’).dimTo(60) domoticz.devices(‘Radio’).switchSelector(10) end end }
Сценарий iLeft. В данном сценарии будут участвовать датчики движения и вызываться оно будет по таймеру каждые полчаса.
return { on = { timer = { ‘every 30 minutes’ } }, execute = function(domoticz) if (domoticz.devices(‘Motion Sensor’).lastUpdate.minutesAgo > 60) then domoticz.groups(‘Light’).switchOff() domoticz.groups(‘Appliances’).switchOff() end end }
Если датчик не обнаруживает движения в комнате более, чем 60 минут, наш дом понимает, что никого нет и выключает группу освещения и бытовых приборов. Скрипт прекрасно работает и в случае, если вы просто задремали. Добавить устройства в группы можно в меню сцены, выбрав тип «группа». Для точности срабатывания сценария можно добавить в качестве условия другие датчики движения/касания, ограничить выполнение скрипта определенным временем. Самое точное срабатывание происходит по геозонам, т.е. когда вы действительно ушли из заданных координат. Задать геозоны можно в приложении Pilot Home Control.
Сценарий Ночь / Утро. Хотите засыпать под звуки океана, а просыпаться под пение птиц? С умным домом это возможно! В качестве триггера у нас будет выступать виртуальный переключатель Night (создается как Dummy устройство).
return { on = { devices = { ‘Night’ } }, execute = function(domoticz, switch) if (switch.state == ‘On’) then domoticz.groups(‘Light’).switchOff() domoticz.groups(‘Appliances’).switchOff() domoticz.devices(‘Volume Control’).dimTo(10) domoticz.devices(‘Radio’).switchSelector(30) domoticz.devices(‘Volume Control’).switchOn().forMin(15) end end }
При включении переключателя Night отключается свет и бытовые приборы (как в сценарии «я ушел»), включается потоковое вещание шума океана. Уровень громкости устанавливается на 10%, функция forMin() задает таймер отключения. При активном переключателе Night, свет дома не будет включаться, даже если датчик движения будет активен. После выключения ночного режима, свет в доме будет работать в обычном режиме. Сценарий GoodMorning активируется по таймеру в рабочие дни: сначала включается потоковое вещание утреннего пения птиц, затем, через 15 минут, включается свет в доме. Как вам такой умный будильник? Если к изголовью кровати подключена светодиодная лента, можно настроить «умное пробуждение», моделируя восход солнца, когда тон цвета плавно меняется с красных оттенков на теплые, планомерно наращивая яркость. Получится «умная кровать»!
return { on = { timer = { ‘at 06:45 mon,tue,wed,thu,fri’ } }, execute = function(domoticz) domoticz.groups(‘Light’).switchOn().afterMin(15) domoticz.devices(‘Volume Control’).dimTo(10) domoticz.devices(‘Radio’).switchSelector(30) domoticz.devices(‘Night’).switchOff() end }
Сценарии Пожар / Авария. Сценарий Пожар активируется датчиками дыма, протечки и является частью системы безопасности. К сожалению все, что мы можем в данной сборке — это информирование о произошедшем событии. Однако, если добавить вот такой кран на электрическом управлении — получится система защиты от протечки! Я себе сделал такую. Итак, вернемся к нашему дому. Информировать нас о важных событиях Domoticz может через e-mail, push уведомления либо с помощью Telegram. Подключить службу оповещения можно в настройках системы Domoticz. Пример скрипта:
return { on = { devices = { ‘Smoke Detector’, ‘Water Leak’ } }, execute = function(domoticz, device) if (device.name == ‘Smoke Detector’) then domoticz.notify(‘Система безопаности’, ‘Аааа… дом в огне! Копируюсь в облако!’, domoticz.PRIORITY_EMERGENCY) end if (device.name == ‘Water Leak’) then domoticz.notify(‘Система безопаности’, ‘Обнаружена протечка в санузле.’, domoticz.PRIORITY_EMERGENCY) end end }
В данном случае в сценарии участвуют сразу два триггера и скрипт вызывается каждый раз, когда срабатывает хотя бы один из них. Для того, чтобы система распознавала сработавшее устройство и реагировала на них по-разному, введена проверка по имени инициатора. Для сценария Проникновение также предусмотрено информирование.
return { on = { devices = { ‘Entrance door’, ‘Loggia door’, ‘Window’ } }, execute = function(domoticz, device) if (domoticz.time.matchesRule(‘at 8:00-18:00 on mon,tue,wed,thu,fri’)) then domoticz.notify(‘Система безопаности’, ‘Обнаружено проникновение в дом!’, domoticz.PRIORITY_EMERGENCY) end end }
В этом сценарии триггерами являются источники возможного проникновения — входная дверь, дверь лоджии, окно. Обычно, при срабатывании такого сценария, включается веб камера и снимок с камеры отправляется на e-mail. Выполнение информирования ограничено временем предположительного отсутствия хозяев. Как и в примере сценария «Я пришел», скрипт будет более корректно срабатывать при отслеживании нашего местоположения по геотегам.
Система поддержания микроклимата. В данной автоматизации в качестве триггеров будут использоваться датчики температуры и влажности, также дверь на балкон. Скрипт выглядит так:
return { on = { devices = { ‘Room TempHyum’, ‘BathRoom TempHyum’, ‘Loggia Door’ } }, execute = function(domoticz, TH) if (domoticz.devices(‘Motion Sensor’).lastUpdate.minutesAgo < 60) then if (domoticz.devices(‘Room TempHyum’).temperature > 24) then domoticz.devices(‘Fan’).switchOn() else domoticz.devices(‘Fan’).switchOff() end if (domoticz.devices(‘Room TempHyum’).humidityStatusValue == domoticz.HUM_DRY) then domoticz.devices(‘Humidifier’).switchOn() else domoticz.devices(‘Humidifier’).switchOff() end if (domoticz.devices(‘Loggia Door’).state == ‘Open’) then domoticz.devices(‘Humidifier’).switchOff() end if (domoticz.devices(‘BathRoom TempHyum’).humidityStatusValue == domoticz.HUM_WET) then domoticz.devices(‘BathroomFan’).switchOn() else domoticz.devices(‘BathroomFan’).switchOff() end end end }
Если дома жарко, то включается вентилятор, и выключается, когда температура понизится естественным способом. Если дома сухо, включается увлажнитель, выключается он автоматически, когда дома станет комфортно. Если открывается дверь в лоджию, система автоматически отключает увлажнитель. Если в ванной комнате становится влажно, включается принудительная вытяжка. Все эти действия выполняются только в присутствии дома людей, для этого отслеживается активность датчиков движения.
Система управления освещением. Система будет состоять из двух модулей: первый модуль будет включать свет, второй модуль будет отключать свет. В качестве триггеров будут использоваться датчики движения.
return { on = { devices = { ‘Motion Sensor’, ‘Motion Sensor Hallway’ } }, execute = function(domoticz, MotionSensor) if (domoticz.devices(‘Night’).state == ‘Off’) then if (MotionSensor.name == ‘Motion Sensor’ and domoticz.devices(‘Room Lux Sensor’).lux < 25) then domoticz.devices(‘Room Light’).switchOn() end if (MotionSensor.name == ‘Motion Sensor Hallway’ and domoticz.devices(‘HallWay Lux Sensor’).lux < 35) then domoticz.devices(‘Hallway Light’).switchOn() end end end }
return { on = { timer = { ‘every 30 minutes’ } }, execute = function(domoticz) if (domoticz.devices(‘Motion Sensor’).lastUpdate.minutesAgo > 30) then domoticz.devices(‘Room Light’).switchOff() end if (domoticz.devices(‘Motion Sensor Hallway’).lastUpdate.minutesAgo > 30) then domoticz.devices(‘Hallway Light’).switchOff() end end }
Первый скрипт включает свет в зоне работы датчика движения, но только в том случае, если дома темно. Второй скрипт запускается по таймеру каждые полчаса и опрашивает датчик движения, если движение не фиксируется в зоне покрытия датчика в течение 30 минут, тогда свет выключается. Тайминги и уровни освещенности настраиваются индивидуально.
Мультимедиа система. Для воспроизведения музыки будем использовать mpd сервер, настроенный в части 2 данного цикла статей. Для начала нужно создать несколько скриптов для управления потоковым воспроизведением из Domoticz. Создаем файл mpcstop.sh с содержимым:
#!/bin/bash -x mpc stop
Данный скрипт останавливает воспроизведение музыки. Нам понадобится еще несколько скриптов для запуска потокового вещания.
#!/bin/bash -x mpc stop mpc clear mpc load nature mpc play
Скрипт останавливает воспроизведение, очищает плейлист и загружает новый. Сами плейлисты хранятся в ранее сконфигурированной папке. Скачать нужный плейлист можно из огромной базы потокового вещания SHOUTcast, а можно просто загрузить свои любимые альбомы на апельсинку и создать для них плейлисты. Добавляем наши скрипты в ранее созданный элемент Radio.
Теперь осталось прописать логику работы плеера в Domoticz.
return { on = { devices = { ‘Volume Control’, ‘Radio’ } }, execute = function(domoticz, volume) if (volume.name == ‘Volume Control’ and (volume.state == ‘Off’ or volume.level == 0)) then domoticz.devices(‘Radio’).switchSelector(0) else if (volume.name == ‘Volume Control’) then domoticz.utils.osExecute(«mpc volume «.. volume.level) end end if (volume.name == ‘Volume Control’ and (volume.state == ‘On’ or volume.level ~= 0)) then domoticz.utils.osExecute(«mpc play «) end — корректировка состояния уровня громкости при внешнем управлении if (volume.name == ‘Radio’ and volume.level ~= 0) then domoticz.devices(‘Volume Control’).switchOn().silent() end if (volume.name == ‘Radio’ and volume.level == 0) then domoticz.devices(‘Volume Control’).switchOff().silent() end end }
Ну вот и все… или нет?
Привет, Siri!
Ну какой же умный дом без голосового ассистента. Некоторые до сих пор считают, что умный дом — это когда хлопаешь в ладоши и свет включается. Нет! Это далеко не так, умный дом не должен заставлять вас прихлопывать и причмокивать, умный дом должен работать полностью в автоматическом режиме, как космический корабль! Пришло время познакомить наш «Бомж» Умный дом с Siri. Для добавления нашей сборки в HomeKit устанавливаем Homebridge.
sudo curl -sL https://deb.nodesource.com/setup_12.x | bash — sudo apt install -y nodejs sudo npm install -g —unsafe-perm homebridge sudo npm install -g homebridge-edomoticz homebridge
Если все прошло успешно, то в консоли терминала мы увидим QR код, приглашающий подключить homebridge к Homekit. Но пока рано, необходимо сконфигурировать HomeBridge для работы с Domoticz. Нажимаем Ctrl-C, вводим следующую команду:
sudo nano ~/.homebridge/config.json
И заменяем содержимое файла на:
{ «bridge»: { «name»: «Homebridge», «username»: «42:22:15:18:EA:B6», «port»: 51826, «pin»: «123-44-321» }, «description»: «Configuration file for (e)xtended Domoticz platform.», «platforms»: [ { «platform»: «eDomoticz», «name»: «eDomoticz», «server»: «<Domoticz username>:<password>@127.0.0.1», «port»: «8080», «ssl»: 0, «roomid»: 2, «mqtt»: 1 } ], «accessories»: [] }
В качестве username вставляем mac адрес нашей апельсинки. Pin — это пароль для Homebridge, позволяющий добавить устройства в ручном режиме. Для запуска homebridge при старте системы нужно выполнить еще пару действий.
sudo nano /etc/systemd/system/homebridge.service
Вставляем следующее содержимое:
[Unit] Description=Node.js HomeKit Server After=syslog.target network-online.target [Service] Type=simple User=smarthomeless EnvironmentFile=/etc/default/homebridge ExecStart=/usr/bin/homebridge /home/smarthomeless/.homebridge Restart=on-failure RestartSec=1m KillMode=process [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable homebridge sudo systemctl start homebridge
Все! Теперь наш Homebridge действительно готов для добавления в HomeKit! Все сконфигурированные устройства Domoticz добавятся автоматически, вам нужно лишь дать им более понятное для вас имя и выбрать отображаемый устройством значок (при необходимости). Теперь нам доступно не только голосовое управление, мы можем создать сценарий «доброе утро» и «спокойной ночи», указав в качестве действия выключение или включение ранее созданного переключателя Night. После этого стоит только сказать «Привет, Siri! Спокойной ночи!» как свет тут же погаснет, а Siri пожелает нам доброй ночи, а после пробуждения — удачного дня. В HomeKit можно настроить отслеживание геолокации — так наш умный дом поймет, что мы покинули его и отключит свет и бытовые приборы.
Как видите, создать свой умный дом совсем не сложно, для этого не требуется много времени и денег. Можно собрать умный дом из того, что нашли в шкафу, и это работает! С добавлением новых устройств ваш дом будет развиваться, а скрипты будут становиться все сложнее, тонко подстраиваясь под наши привычки и образ жизни. Основная концепция умного дома — управление жизненным пространством, без кнопочек и безумных планшетов, замурованных в стену, а на полностью автоматическом и интуитивном уровне, к этому быстро привыкаешь.
Спасибо всем, кто поддерживал лайками и оставлял комментарии на протяжении всего цикла статей, я делал это для вас.
Страница 1 из 27
-
=======
Полезное здесь и не здесь. Оглавим:
Вот здесь азы Domoticz.
И здесь полно информации.NodeRed.
Температура и безопасность.
Аларм в Телеграм.
Отправка данных с ESP-8266.
InfluxDb — запариваем.
MQTT — Общий способ передачи информации. И формат отдельный.
Как воткнуть камеру. http://www.ispyconnect.com/sources.aspx — база данных по камерам, как их соединять.
JSON таки.
Присутствие в сети и управление выключателями по присутствию.
DHT-22 и Domoticz.
Немного про Node Red и Domoticz.
Передача команд на MQTT устройства что сделаны по протоколу OpenHab.
Bash и Domoticz.
Про Сяоми. И здесь.
Включение 3-ёх режимного «Light/Switch/Selector» по датчику движения.
Забираем данные погодной станции по MQTT.
Скрипты много.
Голосовое оповещение. И здесь про него и радио. И здесь. Securbond радует нас!
Функция map.
Перезагрузка роутера.
Выгоняем температуру из Домотикз.
Устанавливаем целевую температуру по MQTT.
Простые скрипты отопления балкона и протечки.
Нет -127 и 85 градусам! Node Red.
Скрипт датчика движения.
Извлечение части топика в NodeRed
cancelQueuedCommands() — датчик движения от @om1212
influxDB Debian Buster=======
Начнем с… удаления:service domoticz stop
#remove the domoticz folder with binary and all subdirs
sudo rm -Rfv domoticz
sudo rm -Rfv /etc/domoticz
sudo rm -Rfv /etc/init.d/domoticz.shЛюбимый мной OpenHab, все таки, не до конца отвечает запросам и чаяниям. Была надежда, что ОН2 станет лучше.
Поддавшись модным веяниям, вместо оттачивания инструментов, разработчики стали втыкать попугаю цветные перья в задницу. Более того — потеряли и что-то хорошее, что было в первой версии — исчез доступ по паролю и в ближайшее время не ожидается.
Смотрю Domoticz.
Домотикз работает с MQTT путем выгона на брокер отчетов о переключении выключателей (вообще всех событий) следующим фейерверком json в теле сообщения(проще говоря — щелчок выключателя на экране и такой комплект на брокер):{
«Battery» : 255,
«RSSI» : 12,
«description» : «»,
«dtype» : «Light/Switch»,
«id» : «00014055»,
«idx» : 5,
«name» : «Участок»,
«nvalue» : 0,
«stype» : «Switch»,
«svalue1» : «99»,
«switchType» : «On/Off»,
«unit» : 1
}
Как ESP-8266 будет забирать это добро себе? Конечно — в таблицу! При помощи модуля sjson.
Только прямой обработкой сообщение -> функция sjson не получается.
Посему dofile(«analize.lua») в помощь:— gdata — сообщение от брокера в глобальной переменной
local msg = gdata
local nms = «»
for i = 1, #msg do
— выбираем каждый символ сообщения по одному
local z = string.sub(msg,i,i)
— очищаем от всего лишнего
local zz = string.match(z, «([%w:{}.,\»\’])») or «»
nms = nms..zz
end
if msg then
— t — выброс в глобальную таблицу сообщения от domoticz
t = sjson.decode(nms)
for k,v in pairs(t) do print(k,v) end
end
А чтобы слать сообщения на domoticz надо формировать такой стринг
‘{«idx»:1,»nvalue»:0,»svalue»:»25.0″}’и гнать его в топик «domoticz/in»
Об этом впереди.UPD 01/10/2017
Если мы работаем с json (отправляем его на Domoticz и там парсим), то в теле сообщения от Domoticz этот json повторяется в лоб, как и был получен.
Это явление не ухватывается модулем sjson от nodeMcu и валит устройство на бок.
Посему код надо подправить так:local msg = gdata
local nms = «»
local keys = {
‘idx’,
‘nvalue’,
‘svalue1’
}
for i = 1, #msg do
nms = nms..(string.match(string.sub(msg,i,i), «([%w:{}.,\»\’])») or «»)
end
print(msg)
—print(nms)
local function parce()
local t = sjson.decode(nms)
for i=1, #keys do
print(keys[i], t[keys[i]])
end
—[[
— Здесь ваш код, если надо что-то сделать
— с пришедшим сообщением
if t.idx == … then
…
…
end
—]]
end
if nms ~= «» then
pcall(parce)
endХотя можно поднапрячься и ликвидировать такую проблему, но пока не вижу причины для этого.
Последнее редактирование: 27 окт 2020
-
Снова интересная тема ))). Ещё пока просматривал инфу по данному вопросу наткнулся на: node-red https://nodered.org (для объединения всего) и
ImperiHome http://www.evertygo.com/imperihome (для создания панелей управления). -
1. Температура и безопасность.
Да, ds18b20 в количестве три штуки и вот такая гадость:Эта гадость, хотя и заявлено что работает от трех вольт — не работает!
Что делает, подлюка: включается, поднимает единицу на выходе, через 15 секунд роняет его в ноль навсегда. Никаких признаков жизни.То есть АрдуиноПятьВотльтФорева, к радости отдельностоящих товарищей.
Ну, в общем, через питалово 5 вольт и делитель из резисторов — работает. (Если что, я не рекламирую, а даже наоборот — посмотрел бы что другое)Ну, поехали…
Общий старт:
— Запуск MQTT
dofile(«setmqtt.lua»)
— Запуск Микроволонового Датчика
dofile(«scurity02.lua»)
— Запуск измерения температуры
dofile(«ds18b20todomoticz.lua»)Запуск MQTT
— setmqtt.lua
local myClient = «security»
local pass = «superpassword»
local mybroker = «iot.eclipse.org»
— mod — глобальная таблица состояния связи
if not mod then mod = {} end
mod.broker = false — есть брокер
mod.internet = false — есть Интернетlocal begin = function()
m = mqtt.Client(myClient, 180, myClient, pass)
m:lwt(myClient, «OFF», 0, 0)
connecting = function ()
— соединение с брокером — через модуль
connect = require(‘_getmqtt’)
connect.connecting(m, mybroker, 1883, myClient, mod, function() connect = nil end)
— самоустраняемся
begin, setmqtt = nil, nil
end
— Потеряли связь? Не беда:
m:on(«offline», function(con)
mod.broker = false
mod.interenet = false
m:close()
dofile(«setmqtt.lua»)
end)
— Получили сообщение?
m:on(«message», function(conn, topic, dt)
local top = string.gsub(topic, myClient..«/»,«»)
— print(top..»:»..dt)
— Выталкиваем сообщение в глобальные переменные
— _G.gtopic = top
_G.gdata = dt
— Вызываем анализатор
dofile(«analize.lua»)
end)
connecting()
end
begin()Модули.
— getmqtt.lua
local ml = …
local M={}
function M.connecting(m, Broker, port, myCl, mod, unload)
local getConnect
local count = 0
getConnect = function()
if mod.internet == true then
m:connect(Broker, port, 0, 0,
function(con)
tmr.stop(getmq)
tmr.unregister(getmq)
getmq = nil
print(«Got «..Broker)
m:subscribe(«domoticz/out»,0, function(conn)
print(«Subscribed.»)
end)
m:publish(myCl,«ON»,0,0)
_G.mod.broker = true
if unload then
getConnect, count = nil, nil
package.loaded[ml]=nil
unload()
end
end)
else
print(«Wating for WiFi «..count..» times»)
count = count + 1
if count > 20 then node.restart() end
end
end
getmq = tmr.create()
getmq:alarm(10000, 1, function()
getConnect()
end)
local call = function()
print(«Got WiFi!»)
wf = nil
end
wf = require(«_getwifi»)
wf.check(call)
getConnect()
end
return Mlocal modn = …
local M = {}
M.check = function(call)
local isconnect = function()
tmr.create():alarm(15000, tmr.ALARM_SINGLE,
function(t)
t = nil
M.check(call)
end)
endlocal ip = wifi.sta.getip()
if ip ~= nil then
net.dns.resolve(«www.google.com», function(sk, ip)
if (ip == nil) then
print(«DNS fail: Ask Connect!»)
isconnect()
else
print(‘Got google: ‘..ip)
if not mod then mod = {} end
mod.internet = true
if call then call() end
package.loaded[modn] = nil
end
end)
else
isconnect()
end
end
return Mlocal M={}
M.adrtbl = {}
M.pin = 4
M.del = 750function M.getaddrs(ttable, call)
ow.setup(M.pin)
ow.reset_search(M.pin)
repeat
local adr = ow.search(M.pin)
if(adr ~= nil) then
table.insert(M.adrtbl, adr)
end
until (adr == nil)
ow.reset_search(M.pin)
M.askTemp(ttable, call)
endfunction M.askTemp(ttable, call)
ow.setup(M.pin)
for _, v in pairs(M.adrtbl) do
ow.reset(M.pin)
ow.select(M.pin, v)
ow.write(M.pin, 0x44, 1)
end
v = niltmr.create():alarm(M.del, tmr.ALARM_SINGLE, function (t)
M.readResult(ttable, call)
t = nil
end)
endfunction M.readResult(ttable, call)
local data, crc, t
for _, v in pairs(M.adrtbl) do
ow.reset(M.pin)
ow.select(M.pin, v)
ow.write(M.pin,0xBE,1)
data = string.char(ow.read(M.pin))
for i = 1, 8 do
data = data .. string.char(ow.read(M.pin))
end
crc = ow.crc8(string.sub(data,1,8))
if (crc == data:byte(9)) then
t = (data:byte(1) + data:byte(2) * 256)
if (t > 32767) then t = t — 65536 end
t = t * 625 /10000
local ts = string.format(«%.02f», t)
table.insert(ttable, ts)
end
end
if call then call(ttable) end
endfunction M.getTemp(ttable, call, pin, del)
if #M.adrtbl == 0 then
M.pin = pin or M.pin
M.del = del or M.del
M.getaddrs(ttable, call)
else
M.askTemp(ttable, call)
end
endИзмерение и отправка температуры:
do
temp = {}
local pin = 4
local del = 750— Важная тебличка! Перечисляем idx приемных элементов
— в порядке следования датчиков
idx = {
19,
2,
3
}function myWork()
print(«Got DS18b20: «..#temp)
table.foreach(temp, print)
ds = nil
package.loaded[«ds18b20m»]=nil
local itog = {}
for i = 1, #temp do
table.insert(itog, {idx[i], temp[i]})
end
local function publNow()
local p = table.remove(itog)
if p and _G.mod.broker then
m:publish(«domoticz/in»,‘{«idx»:’..p[1]..‘,»nvalue»:0,»svalue»:»‘..p[2]..‘»}’,0,0,publNow)
end
end
if mod and mod.broker then
publNow()
end
endlocal function send()
temp = {}
ds = require(‘ds18b20m’)
ds.getTemp(temp, myWork, pin, del )
end
send()
tmr.create():alarm(30000, 1, send)
endОтправляем данные с датчика движения :
do
print(«Start Security»)
local pin = 1
gpio.mode(pin,gpio.INT)
gpio.trig(pin)
local function pin1cb(level)
print(«Level now «..level)
if mod and mod.broker then
local switchcmd = (level == 1 and «On» or «Off»)
— «idx»:14 — это idx принимающего выключателя в Domoticz
m:publish(«domoticz/in»,‘{«command»:»switchlight»,»idx»:14,»switchcmd»:»‘..switchcmd..‘»}’,0,0)
end
gpio.trig(pin, level == gpio.HIGH and «down» or «up»)
end
gpio.trig(pin, «down», pin1cb)
endАнализируем полученные от Domoticz json(ы):
local msg = gdata
local nms = «»
local keys = {
‘idx’,
‘nvalue’,
‘svalue1’
}
for i = 1, #msg do
nms = nms..(string.match(string.sub(msg,i,i), «([%w:{}.,\»\’])») or «»)
end
if nms then
local function annmg()
local t = sjson.decode(nms)
for i=1, #keys do
print(keys[i], t[keys[i]])
end
—[[
Здесь ваш код, если надо что-то сделать
с пришедшим сообщением
if t.idx == … then…
…
end
—]]
end
pcall(annmg)
endПоследнее редактирование: 20 сен 2017
-
Как нет?
Все есть, просто надо это реализовать через nginx.
Если интересно, могу выложить как это сделать. -
Конечно выкладывайте!
Но, замечу, раньше это было само собой.Последнее редактирование: 20 сен 2017
-
Установка и настройка авторизации в openHAB2 через nginx.
Устанавливаем nginx
sudo apt—get update && sudo apt—get install nginx
Переносим и переименовываем файл дефолтных настроекsudo mv /etc/nginx/sites—enabled/default /etc/nginx/sites—enabled/openhab2
Редактируем файл конфигурацииsudo nano /etc/nginx/sites—enabled/openhab2
Приводим его к виду:server {
listen 80;
server_name Main;
}server {
listen 8081;
server_name openHAB;location / {
proxy_pass http://localhost:8080/;
proxy_set_header Host $http_host;
proxy_set_header X—Real—IP $remote_addr;
proxy_set_header X—Forwarded—For $proxy_add_x_forwarded_for;
proxy_set_header X—Forwarded—Proto $scheme;
satisfy any;
allow 192.168.1.0/24; #Пул адресов с которых разрешен вход без указания логина и пароля
allow 192.168.2.0/24; #Пул адресов с которых разрешен вход без указания логина и пароля
auth_basic «Username and Password Required»;
auth_basic_user_file /etc/nginx/.htpasswd;
}
}Nginx довольно гибкий и поддерживает много тонких настроек, я только указал основные настройки.
Устанавливаем утилиту от Apache для создания файла паролей
sudo apt—get install apache2—utilsСоздаем файл паролей
sudo htpasswd —c /etc/nginx/.htpasswd username!!!ВНИМАНИЕ!!!
Если вы хотите добавить пользователя в существующий файл паролей, то используйте команду без ключа «-c»sudo htpasswd /etc/nginx/.htpasswd usernameДля удаления пользователя выполнить команду:
sudo htpasswd —D /etc/nginx/.htpasswd usernameПосле изменения обязательно выполнять команду перезагрузки nginx
sudo service nginx restartОбращаю ваше внимание, что обращение теперь должно быть на порт указанный в настройках файла конфигурации nginx (8081).
Вот вроде и все, если будут вопросы, пишите, будем разбираться вместе.
sys, petr0vsk и ИгорьК нравится это.
-
Класс! Но зря в этой теме. Уже дал ссылку из темы про ОпенХаб.
Последнее редактирование: 21 сен 2017
-
А вот чем мне нравится Domoticz. Вошел под паролем наблюдателя, нажал на лампочку включения освещения на участке и получил это:
Последнее редактирование: 21 сен 2017
-
Согласен, с правами доступа очень удобно, но для управления по протоколу MQTT, без костылей не получится.
Domoticz может отслеживать состояние по MQTT, но вот управлять не может.
Json как вариант, но больно много информации он отправляет в эфир, в некоторых ситуациях это критично. -
Не понял — что значит не может управлять по MQTT? Он выдает на брокер необходимую информацию, а исполнительное устройство, подписчик, ее ловит, парсит и что-то делает.
Пример кода я уже написал в предыдущем посте.Я пока не готов что-то комментировать по Domoticz — не вижу общей картины.
Но то что уже понял — мне очень очень нравится.
Скрипты — на Lua (в т.ч.), песня!
Писать скрипты можно прямо из окна браузера, там же сразу логи и ошибки.
Три типа пользователей: администратор, участник и наблюдатель.
Отличные графики и система логов событий — тоже из окна.Не увидел пока систему вложений окон как в OH, но за Lua вместо Xtend в скриптах готов простить сразу, авансом.
Вообще, ESP-8266 и скрипты Domoticz на одном языке — то что надо.
-
Второй вариант, тоже очень даже — bash скрипты. На них вообще все что хочешь можно сделать.
То есть, по умолчанию уже просто силища заложена.
-
Последний раз когда я сталкивался с MQTT на Domoticz, то поддержка там была на уровне
«Currently only receiving sensor data is supported on Domoticz MQTT. Switching actuators is not supported» -
Ну что вы… Все не так. Каждый девайс отправляет на брокер инфо — бери и действуй.
Хорошо это или плохо — вопрос. Можно и запретить такую отправку, и работать скриптами. -
Обязательно посмотрю, как будет время. Если все устроит, то заменить OH2 на Domoticz труда не составит, т.к. использую в качестве управляющего звена NodeRed.
-
С любимыми не расстаются,
…но если нет взаимности -
Не туда он пошел, не туда!
Главные претензии к первому:
— малораспространенный язык скриптов, нет нормальной документации К API
— «разрозненное» программирование итемы-сайтмэп-правила-персистенсы — все надо ловить по файлам и компоновать.
— нет разделения прав пользователей.
Второй
— добавил путаницу в способы управления
— и даже парольный вход — по костылю.
Какая тут взаимность?
ОН2 начали раскрашивать как задницу попугая, а не упрощать и улучшать взаимодействие с пользрователями.Я сейчас сижу на ОН 1.8 и изучаю Domoticz — усиленно копать OH2 желания абсолютно нет.
Может быть после погружения в эту систему и вернусь к ОН, но пока говорить об этом рано. -
Если здесь еще кто-то пытается разобраться с Домотикз, привожу пример, ИМХО, полезного скрипта.
Скрипт зажигает красную лампочку, если температура на датчике больше 27 и шлет сообщение в телеграм.
Меньше — гасит лампочку.
… и как же все просто! Это вам нe OpenHab.commandArray = {}
if devicechanged thentoken = «ЗДЕСЬ ВАШ ТОКЕН»
chatid = 11111111 — чат ID
message = ‘Караул! ‘— «Зал» — название детчика температуры, его idx = 3
if devicechanged[‘Зал_Temperature’] ~= nil then
if devicechanged[‘Зал_Temperature’] > 25 then
— ‘Красная Лампочка’ — название выключателя лампочки. Красной лампочки
commandArray[‘Красная Лампочка’]=‘On’
print(«\n\nТемпература Повысилась!\n\n«)
ttt = string.format(«%.02f», devicechanged[‘Зал_Temperature’])
message = message..ttt..» в Зале! Все пропало!»
os.execute(‘curl —data chat_id=’..chatid..‘ —data-urlencode «text=’..message..‘» «https://api.telegram.org/bot’..token..‘/sendMessage» ‘)
else
commandArray[‘Красная Лампочка’]=‘Off’
print(«\n\nТемпература Понизилась!\n\n«)
endfor deviceName,deviceValue in pairs(otherdevices) do
print («otherdevices ‘»..deviceName..«‘, value ‘»..tostring(deviceValue)..«‘»);
endfor deviceName,deviceValue in pairs(otherdevices_svalues) do
print («otherdevices_svalues ‘»..deviceName..«‘, value ‘»..tostring(deviceValue)..«‘»);
endfor deviceName,deviceValue in pairs(otherdevices_idx) do
print («otherdevices_idx ‘»..deviceName..«‘, value ‘»..tostring(deviceValue)..«‘»);
endfor deviceName,deviceValue in pairs(otherdevices_lastupdate) do
print («otherdevices_lastupdate ‘»..deviceName..«‘, value ‘»..tostring(deviceValue)..«‘»);
endend
end
return commandArrayТакже в консоли скрипт показывает состояние всех доступных ему таблиц.
Естественно, скрипт в этой части только для обучения и тестирования.Еще вариант отправки информации на телеграм:
В поле «Действие при включении» забивается строка типа:
https://api.telegram.org/bot0000000:KEYKEYKEYKEYKEYKEY/sendMessage?chat_id=12345678&text=»ВАШ ТЕКСТ»Последнее редактирование: 25 сен 2017
sys и Securbond нравится это.
-
Пока не понравилось то, что одна ветка в mqtt сервере. При разборе на плате придется читать все что с нее валится и выбирать свое. Это может быть проблемой.
В ОН для каждого датчика была своя ветка и это на мой взгляд несколько удобней.
-
Я уже привел код выше — никаких проблем.
Не нравится одна ветка — отключите. Отправляйте данные через скрипты bash. -
Дело привычки. Надо дольше поковыряться.
Мне уже кажется Домотикз и проще и логичнее. Хотя не без напряжения мозга в некоторых местах.
У меня, думаю и у всех, основа работы с устройствами — MQTT. Осталось чуть — до конца разобраться с парсингом json из скриптов и я уже готов переходить на Домотикз.
Страница 1 из 27
Добавляем камеру в Domoticz
Во-первых, почему Domoticz? Мне он показался намного более простым по сравнению с Majordomo и другими системами. Во-вторых, этот пакет присутствует в репозитории на роутере (с установленным OpenWrt). С одной стороны ставить такую программу я предпочел бы на сервер, с другой — именно роутер является точкой, соединяющей все сетевые устройства в квартире. Поэтому пусть пока будет так.
Так как камера у меня — «чистый» китаец, то просто так добавить ее в систему не получится. По крайней мере, мне это не удалось. Пришлось идти обходным путем.
Строка подключения к камере выглядит примерно так:
rtsp://192.168.1.12:554/user=admin&password=&channel=1&stream=0.sdp?real_stream
Открыв этот адрес, например, через плеер VLC, можно увидеть основной поток камеры. В принципе, строку можно чуть-чуть сократить, убрав всё после sdp. В любом случае, Domoticz такое не понимает. Поэтому нам понадобится пакет под названием motion. У меня он уже установлен и отправляет мне в Telegram фото событий. Камера у меня пока что одна, но в будущем планируется еще несколько, поэтому все настройки, отличающиеся от настроек по умолчанию, я вынес в отдельный файл, который подключил в motion.conf. Там нам понадобятся несколько параметров, перечисленных ниже.
netcam_url rtsp://192.168.1.12:554/user=admin&password=&channel=1&stream=1.sdp?real_stream
netcam_keepalive on
width 704
height 576
stream_port 8091
on_event_start /root/motion/actions/on_event_start
on_event_end /root/motion/actions/on_event_end
Первая строка — подключение к самой камере на вторичный поток. Вторая — поддержка подключения, можно пропустить. Третья и четвертая — размеры кадра вторичного потока, у меня они такие. Можно выбрать, конечно, и основной, но это повлечет за собой увеличение трафика в сети и времени подключения. Самая «интересная» строка — следующая. Она указывает motion через какой порт выводить картинку. И последние две строки — пути к скриптам, которые будут выполняться при возникновении и завершении события. У скриптов должны быть установлены права на выполнение.
Запускаем motion и первым делом проверяем наличие потока, просто открыв ссылку в браузере. Например, motion у нас будет установлен на компьютер с адресом 192.168.1.10. Тогда в браузере набираем:
http://192.168.1.10:8091/
Вы должны увидеть видеопоток с камеры. Если его нет — придется разбираться что не так. Чаще всего просто не открыт указанный порт на компьютере. Если картинка есть — идем дальше.
Открываем Domoticz и пробуем добавить камеру.

Добавляем камеру в Domoticz
Протокол оставляем HTTP, в качестве IP-адреса указываем адрес компьютера, куда установили motion. Порт указываем тот же самый, что и в файле настроек motion. Имя пользователя и пароль заполняем в том случае, если для просмотра камеры нужна авторизация. Ну и в ImageURL забиваем полный путь к потоку, тот же самый, который вбивали в браузере при проверке потока камеры. Нажимаем «Тест соединения» и надеемся, что картинка появится. Обычно на это нужно до 10 секунд. Если картинки нет, значит что-то пошло не так и придется всё проверять. В моем случае картинка нормально появляется когда я работаю в домашней сети. Если я запускаю Domoticz с рабочего компьютера, то она не показывается.
Нажимаем кнопку «Add», чтобы добавить камеру в список. И тут тоже есть нюанс. В строке с камерой тоже есть предварительный просмотр, но в моем случае он не работает. Также не работают кнопки «Сделать снимок» и «Stream video». Но это не важно, камера работает.
Не зря же мы это все делали? Пусть теперь камера работает датчиком движения — нечего ей просто так висеть на потолке. Например, включает освещение в коридоре, когда обнаружит движение.
В качестве выключателя с удаленным доступом у меня стоит простой Sonoff Basic, подключенный к моей сети через WiFi. Идем в настройки Domoticz, выбираем «Оборудование». В выпадающем списке ищем пункт «Dummy (Does nothing, use for virtual switches only)», называем его как-нибудь и нажимаем кнопку добавить. Теперь в списке чуть выше нажимаем кнопку «Создать виртуальные датчики», вводим название выключателя (придумываем сами) и указываем тип «Переключатель». Жмем «ОК». Всё, мы создали виртуальное устройство, которое будет управлять освещением в коридоре. Остается теперь соединить между собой камеру и выключатель.
Вспоминаем, что у нас есть два скрипта от motion, которые выполняются при возникновении и завершении события, в данном случае — в коридоре. Добавляем в каждый из скриптов по одной строке. В /root/motion/actions/on_event_start добавляем
/usr/bin/curl -s "http://api_username:api_password@domoticz_server:domoticz_port/json.htm?
type=command¶m=switchlight&idx=your_ID&switchcmd=On"
а в /root/motion/actions/on_event_end такую строку:
/usr/bin/curl -s "http://api_username:api_password@domoticz_server:domoticz_port/json.htm?
type=command¶m=switchlight&idx=your_ID&switchcmd=Off"
Теперь разберем, что это за бред.
curl — программа, позволяющая выполнить те или иные действия по указанному адресу, используя только командную строку.
api_username и api_password — имя пользователя и пароль, которые вы установили для доступа к Domoticz. Если не устанавливали, то эту часть «api_username:api_password@» можно не вводить.
domoticz_server и domoticz_port — IP-адрес и порт компьютера, где у вас установлен Domoticz. В качестве порта нужно указать стандартный 8080, если, конечно, вы не делали перенаправления портов.
idx=your_ID — в качестве your_ID нужно указать значение выключателя из колонки Idx таблицы устройств. У меня это значение равно «1».

Таблица устройств
Ну и последний параметр switchcmd может принимать значения On или Off, в зависимости от того, хотите ли вы включить освещение или выключить соответственно. Подозреваю, что можно также указать «1» и «0» соответственно, но, если честно, лень проверять 
Должен также отметить, что в Sonoff установлена не стандартная прошивка с привязкой к китайскому облаку (и возможностью потерять доступ к своему выключателю из-за рвения Роскомнадзора заблокировать всех и вся), а Tasmota. Возможностей у нее немного, но лично мне хватит с избытком. Не будет же выключатель вещать радио, когда мне скучно? 
Теперь почему мы используем такой сложный способ включения/выключения? Просто при таком способе состояние выключателя будет корректно отображаться в Domoticz в случае возникновения или завершения движения в коридоре.

























