пятница, 15 декабря 2017 г.

Управление освещением в квартире и другая электрика: техническое устройство

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


Светодиоды

Весь свет сделан на мощных светодиодных лентах теплого белого света с типоразмером светодиодов 5050, мощностью не менее 12 Вт/м, напряжением 12 и 24 В. В спальне (в гостиной планируется так же) кроме белой установлена мощная RGB лента на 24 В.
В ванной и туалете ленты в профилях, светят под 45 градусов к полу.

Фотоаппарат снизил общую яркость, чтобы было видно профиль

Реальная освещенность

В остальных местах ленты спрятаны на полочках и свет не прямой, а отражение от белого потолка. Свет не такой яркий, как от мощных люстр, но по моему опыту - сначала непривычно, а потом хватает, нет желания ставить ленты еще (техническая возможность есть). Более того, я часто включаю свет не на полную яркость.

Фотоаппарат снизил общую яркость


Блоки питания

Несколько безвентиляторных блоков питания мощностью 200-250 Вт на 24 В. Соответственно, ленты на 12 В включены последовательно по два одинаковых куска.


Диммеры

Несколько четырехканальных DALI-диммеров с током до 5 А на канал (при 24 В дает 120 Вт на канал)


Настенные выключатели

Все без фиксации, часть - переделанные из обычных с фиксацией, часть - заводские "для жалюзи". Все выключатели подключены к шине DALI через четырехканальные адаптеры "контакт->DALI".

Подробнее про DALI, ленты, питание, диммеры, выключатели см. Освещение на протоколе DALI и его компоненты


Сервер


Назначение сервера

Для управления освещением с помощью выключателей достаточно сконфигурировать DALI-диммеры (может понадобиться спец. устройство). Для расширенного функционала нужен сервер, который умеет слушать шину DALI, отправлять по ней команды и общаться с внешним миром. Устройство системы таково, что в случае сбоя сервера выключатели и свет будут продолжать работать.
Сервер должен обладать следующим функционалом:
  • конфигурирование устройств DALI вручную
  • управление освещением DALI вручную и автоматизированно (например, по движению в кадре камеры)
  • удаленное управление освещением с помощью программ типа "умный дом"
  • удаленное управление освещением со смартфона
  • просмотр состояния устройств и датчиков как локально, так и удаленно
  • расширение функционала добавлением камер, датчиков, управляемых устройств


Устройство сервера

Готового сервера с указанным функционалом я не нашел. Существуют различные шлюзы DALI-USB, DALI-Ethernet, но они обладают целым рядом недостатков: они не умеют слушать шину, т.е. не могут реагировать на нажатия, например, выключателя. Программы для управления могут не позволять организовать дистанционное управление светом (т.е. могут работать только мышкой). При этом, все они имеют неадекватно высокую цену (я покупал самый дешевый вариант DALI-USB, который делает финский умелец, для опытов и чтобы с чего-то начать, и стоил он как три Raspberri Pi 3).

Поэтому было решено написать программу самостоятельно, и спаять самодельный адаптер DALI<->GPIO (некоторые подробности его работы см. в Raspberry Pi 3, работа с GPIO в Linux и DALI). Подробнее см. Программа DALI Controller.

Оборудование сервера состоит из Raspberry Pi 3 и самодельного DALI<->GPIO-адаптера. Питание 5 В сервер получает от эффективного DC-DC преобразователя, который подключен к блоку питания светодиодных лент на 24 В.
Шина DALI требует блока питания, он также самодельный (см. Простой блок питания шины DALI), питается от 24 В.
Raspberry подключен к домашней сети по Wi-Fi (возможно подключение по Ethernet), и имеет доступ в Internet.
К Raspberry по GPIO подключены 2 датчика типа DHT-22 (температура и влажность, улица и дом).


Программное обеспечение

На Raspberry под управлением Raspbian (это такой Linux для Raspberry) работают:
  • самописный сервер DALI Controller
  • MQTT-брокер (прием и отправка MQTT-сообщений)
  • программа MajorDoMo ("Умный Дом") с WEB-интерфейсом, доступным с других компьютеров
Кроме этого, программа, которая раз в 10 минут снимает кадр с камеры (отслеживание сосулек ;) и публикует его в MQTT.


Как это работает

Вот схема, на которой показаны программные и аппаратные средства системы:


Пользователь может управлять системой через браузер (WEB UI), программу MQTT-клиент (например, на смартфоне) и настенные выключатели (Wall switch).
Выключатели подключены к шине DALI (DALI line) и напрямую адресуют диммеры, поэтому свет будет работать даже при сбое сервера.

Изменение состояния светильников отслеживает программа DALI Controller, прослушивая шину DALI и команды через MQTT, и публикует их состояние в MQTT.
В MQTT же публикуется температура и влажность с датчиков, кадры с камер, состояние противообледенительного нагревательного кабеля крыши балкона.
Эти состояния затем видны в браузере и любых MQTT-клиентах (в т.ч. на смартфоне).

Управление светом и другими устройствами осуществляется путем посылки MQTT-сообщения (из браузера через "Умный Дом" или любой MQTT-клиент, в т.ч. со смартфона).

Программа DALI Controller

Для расширения функционала управления освещением квартиры было решено сделать DALI<->GPIO-адаптер и написать собственный сервер.

Почему не использовать уже готовые решения, что должен уметь сервер, подробнее про адаптер и протокол MQTT описано в статье Управление освещением в квартире и другая электрика: техническое устройство (раздел "Устройство сервера").

Здесь описывается устройство и функционал программы (сервера) DALI Controller.

Окружение программы

Сервер должен работать на низкопроизводительном компьютере Raspberry, прослушивать шину DALI и посылать в нее команды через GPIO. В качестве операционной системы выступает Raspbian (один из вариантов Linux для Raspberry). Для удаленного управления сервером поддерживается сетевое подключение.

Выбор инструментов и технологий

Для работы с GPIO в Raspbian существует несколько различных third-party библиотек. В качестве надежной (работа с GPIO по DMA, что резко снижает зависимость от загрузки процессора и прерываний) и продуманной, будет использоваться C-библиотека pigpio (подробнее про нее см. Raspberry Pi 3, pigpio, шина DALI и программа для работы с ней). Причем, в режиме работы - демон (вместо линковки).
Сервер должен поддерживать управление из консоли, командной строки и через MQTT, а также публиковать статус устройств по MQTT.

Сначала ядро программы было написано C, но в какой-то момент я понял, что развитие программы тормозится неудобной организацией межпоточного взаимодействия. Вместо концентрации на функционале программы приходится прилагать много сил, чтобы реализовать это на C. Я решил посмотреть другие варианты и, наконец, попробовать Golang. Это был мой первый подход к языку, и после небольшого исследования возможностей я понял:
  • Go имеет встроенные решения для эффективной многопоточности 
  • на Go можно писать под Raspbian
  • из Go можно вызывать C-код и линковать C-библиотеки
  • Go компилируется в эффективный код
  • для Go существует множество сторонних библиотек

Устройство программы

Сервер состоит из нескольких модулей, которые работают параллельно:
  • прослушивание шины DALI для перехвата команд, отправляемых другими устройствами (выключателями) и ответов на команды. Используется для логирования, отслеживания изменения статусов устройств, запуска настраиваемых на событие JavaScript-скриптов
  • JavaScript-интерпретатор для настраиваемых скриптов
  • MQTT-клиент для получения команд управления и публикации статусов
  • псевдографическая цветная консоль, показывающая лог, список и статусы устройств, прогресс выполнения долгих команд. Имеет поле для ручного ввода команды
  • встроенная помощь по всем командам DALI и другим командам сервера
  • отправка команд в шину DALI (полученных как параметры запуска приложения, через MQTT, ручным вводом в консоли или из JavaScript)
  • дополнительно: модуль опроса устройств DHT-22 (датчик температуры и влажности) с публикацией в MQTT

На снимке экрана видно:
  • лог команд (в скобках указан источник команды: шина DALI, MQTT или JavaScript)
  • иногда возникающие ошибки опроса уличного датчика DHT-22 (слишком длинные провода до него)
  • список устройств с DALI-адресом и статусом. Видно, что часть устройств на шине не имеют имени (они пока не используются)

Это снимок самодельного мобильного приложения, работающего по MQTT. Оно общается с сервером DALI Controller для показа статуса устройств и управления ими.

Работа программы

При запуске программа опрашивает устройства, чтобы выяснить их начальный статус. Затем статус отслеживается путем анализа команд, которые посылаются этому устройству (в том числе путем нажатия настенных выключателей). Любое изменение статуса публикуется по MQTT и все заинтересованные MQTT-клиенты (в т.ч. мобильные приложения) сразу же отражают это изменение у себя.
При управлении (светом) из мобильного приложения (или другого MQTT-клиента), сервер получает команду по MQTT и отправляет ее в шину DALI, отражая, если нужно, изменение статуса.
Консоль программы позволяет, при необходимости, вводить команды вручную. Обычно это требуется при подключении новых устройств для их конфигурирования.


В работе всей этой кухни есть интересная особенность. В арсенале DALI нет команды "переключить светильник". Есть различные варианты "включить" и "выключить", а "переключить" - нет. Это значит, что настенный выключатель должен помнить последнюю команду, которую он посылал, чтобы при следующем нажатии посылать обратную. Да, возможен вариант, когда выключатель отслеживает или опрашивает реальное состояние устройства перед решением, что же ему посылать. Но дешевые выключатели этого точно не делают (про дорогие я не осведомлен).
Представьте картину:
  • включаем свет выключателем (он отправляет команду "вкл" и запоминает факт, что свет включился)
  • выключаем из мобильного приложения
  • хотим снова включить его выключателем, но ничего не происходит. Поскольку выключатель помнит, что свет включен, он пошлет команду "выкл". И чтобы свет все-таки включить, нужно нажать выключатель еще раз (он снова пошлет обратную команду - теперь уже "вкл")
Для устранения этой неприятной ситуации в сервере используется возможность написать JavaScript на событие.
Что делает скрипт:
  • при получении команды по шине DALI запускается скрипт
  • если команда послана настенным выключателем (а в данный момент все команды, пришедшие по DALI, от выключателей) и она включает или выключает свет, то команда сверяется с текущим статусом светильника (его правильный статус помнит сервер)
  • если команда от выключателя пытается "повторить" уже существующее состояние света, но скрипт тут же самостоятельно посылает этому устройству обратную команду
Работа этого скрипта устраняет проблему с нажатие выключателя, при котором ничего не происходит. Эта ситуация реально видна на снимке экрана выше:
10:52:43 on спальня (dali)
10:52:43 off спальня (scr)
первая строка - по шине DALI получена команда "включить свет в спальне". Однако скрипт видит, что свет уже включен, а значит нажатием выключателя требовалось его выключить, и он сам посылает новую команду "выключить свет в спальне". Это вторая команда с источником "(scr)" (что означает JavaScript).

Выглядит как "костыль". Но на самом деле, это "костыль" не к серверу, а к недостатку протокола DALI: с одной стороны, он имеет множество команд управления светом, а с другой, сделать простейший выключатель без памяти состояния (или необходимости аппаратной и программной имплементации приемной части интерфейса) не позволяет.

Несколько месяцев использования освещения в такой конфигурации, с активным использованием как настенных выключателей, так и мобильного приложения, показывают 100% отсутствие ошибок типа "нажал - ничего не происходит".

четверг, 14 декабря 2017 г.

Управление освещением в квартире и другая электрика: что сделано

Здесь я хочу описать реально работающую на конец 2017 года систему, которую я сделал в своей квартире. Это не конец, планов много, это текущее состояние.


Квартира

3 комнаты, гостиная-кухня, длинный коридор, прихожая, ванная, туалет, балкон. План виден на снимке экрана мобильного приложения ниже.


Освещение

В одной из комнат, коридоре и на балконе освещения пока нет. В остальных местах - мощные светодиодные ленты, подключенные к диммерам, питание 24 В от нескольких безвентиляторных блоков питания.

Фотоаппарат снижает общую яркость из-за засветки потолка

Все диммеры подключены к шине DALI, на все белые ("теплый белый") ленты есть настенные выключатели (на прихожую - две штуки, из разных мест. На коридор, кухню тоже планируется по два). В спальне, кроме белого освещения, есть RGB (управления RGB с выключателей не планируется, сделаю "цвет рассвета" утром). Все светильники можно не только включать, но и управлять их яркостью с выключателей. Это, кстати, позволяет ограничиться одним источником света и одной кнопкой управления там, где ранее устанавливались люстры с несколькими лампами и несколькими выключателями, или люстра и торшеры.

Свет в мастерской и малиновый свет в спальне


Другая электрика

Балкон на последнем этаже, накрыт покатой крышей, на которой для предотвращения образования сосулек установлен нагревательный кабель. Кабель подключен через Wi-Fi выключатель.


На стене дома со стороны улицы установлен датчик температуры и влажности (типа DHT-22). Такой же датчик находится в квартире.


Управление

Управлять электронным хозяйством хочется не только с выключателей, но и удаленно (со смартфона, планшета, компьютера). Зачем управлять светом удаленно - опишу ниже. Кроме того, хочется видеть статус некоторых устройств (температуру на улице, по крайней мере) и, возможно, изображения с камер, если такие имеются.
Для централизации управления организован сервер на Raspberry Pi 3, все состояния устройств публикуются на внутренний MQTT-сервер, через него же устройствами можно управлять.

Что такое и зачем MQTT? Это небольшое хранилище сообщений, специально разработанное для общения и управления умными устройствами. По сути очень похоже на мессенджер. Для Android существует множество программ, которые позволяют настроить управление и отображение статуса через протокол MQTT. Для компьютеров существует несколько систем управления умным домом, большинство из них также понимают этот протокол.

Какая информация доступна на сервере?
  • состояние всех источников света
  • температура и влажность на улице и в квартире (обновление каждые 10 минут, настраивается)
  • состояние нагревательного кабеля на крыше балкона. Если он включен, то доступна текущая потребляемая мощность и напряжение сети 220 В
  • фотография с камеры, показывающая состояние края крыши балкона (для отслеживания появления сосулек, позволяет также оценить погоду, обновление каждые 10 минут, настраивается)
Чем можно управлять через сервер?
  • посылать в DALI любые команды управления освещением. Наиболее актуально: вкл./выкл., включить неярко, выбрать цвет и яркость для RGB-лент
  • вкл./выкл. обогрева крыши балкона
Чем можно управлять с настенных выключателей (даже при неработающем сервере)?
  • включить, выключить свет (однократное нажатие); увеличить, уменьшить яркость (удерживание)
  • вкл./выкл. обогрева крыши балкона
Благодаря наличию сервера, подключенного к DALI, ничто не мешает настроить сценарии для отдельных выключателей (например, в прихожей сделать кнопку "выключить освещение везде")


Опыт использования системы с удаленным управлением

Каждый слышал слова "умный дом", но, по-моему, никто точно не знает, ни что это такое, ни зачем это надо, ни как этим заинтересовать других. Поэтому удел таких систем сейчас - энтузиасты, которые в меру своих потребностей и интереса собирают самостоятельно нечто, и потом оценивают, что получилось.
Если бы меня полгода назад спросили, зачем управлять светом со смартфона, я бы не смог ответить. Зачем современному человеку, который всю жизнь включает свет выключателями, управление со смартфона? Это просто неудобно - его надо носить все время с собой? Вместо одной клавиши на стене нужно разблокировать телефон, запустить программу?
Лучше обстоит дело с управлением с голоса: если дом будет понимать, что от него просят и делать это... Но такие системы только начинают появляться, и на сегодняшний день, работающей по всей квартире (микрофоны в каждом помещении?) при приемлемой цене, с русским языком - я не знаю такой.
Сейчас более реалистичный вариант - управление светом по присутствию человека - анализом движения с камер или датчиков движения. Такая система не работает или работает плохо, если человек не движется, и она может быть только дополнением к другим.

Возвращаемся к управлению с телефона.

Самодельное приложение для Android.
Свет включен в двух местах

В спальне глухие ролл-шторы, чтобы зимой не мешало уличное освещение, летом - белые ночи. То есть в спальне темно всегда. Спать я ложусь, когда на улице уже темно, да и позднее всех домашних. Как завершение дня выглядит в обычной квартире?
  • пошел включить свет в комнате (условно - кабинете), в которой сидел с компьютером или телевизором
  • пошел выключил компьютер (после света, потому что иначе выключатель искать в темноте)
  • пошел включить свет в коридоре (или сразу в ванной, но тогда по коридору шел в полутьме, свет от кабинета только)
  • умылся, выключил свет в ванной, пошел включить в спальне, пошел (в полутьме) выключить в коридоре и кабинете
  • разделся, выключил свет в спальне, в темноте ощупью нашел кровать (или сходил включил прикроватный светильник, потом вернулся выключить общий свет)
Как этот же процесс выглядит у меня?
  • с телефона или компьютера включил свет (можно неярко) в кабинете, коридоре, прихожей или ванной и в спальне - в общем сразу осветил весь путь
  • выключил компьютер/телевизор (в кабинете светло)
  • пошел в ванну, потом в спальню (еще светло)
  • разделся, лег в кровать (не ощупью, все еще светло)
  • выключил свет везде с телефона
Неоспоримое достоинство удаленного управления, о котором я узнал только начав пользоваться: не надо ходить туда-обратно из-за света, не надо ходить на ощупь и биться ногой о кровать! При выходе из квартиры не надо вспоминать, везде ли выключил свет - это можно посмотреть и исправить с телефона будучи уже на улице.
Если ночью приспичило попить воды, то с телефона же, прямо с постели, включаю неяркий (чтобы глаза не резало спросонья) свет по пути на кухню.

Актуальная именно для меня вещь - управление обогревом крыши от сосулек. Особенно, если я в дальних странах в отпуске. Всегда держать обогрев включенным накладно. Включать надо только если есть снег и температура на улице крутится около нуля (в других случаях сосульки не образуются). Я на телефоне вижу температуру воздуха (реальную, у моего дома), а также изображение края крыши и могу включить или выключить обогрев только когда необходимо.