Домашняя автоматизация на Raspberry Pi 2 с Windows 10 IoT Core: Полное руководство по компонентам
Компоненты и расходные материалы
| Raspberry Pi 2 Model B | × | 1 |
| HSRel5 — релейная плата 5 реле, 3 GPIO, I²C (PCF8574) | × | 1 |
| HSRel8(+8) — релейная плата 8 реле, 8 GPIO, I²C (MAX7311) | × | 1 |
| I2C-Port 16 HS — расширитель портов 16 GPIO, I²C (MAX7311) | × | 1 |
| Блок питания DR-60-12 (12В / 54Вт, DIN-рейка) | × | 1 |
| Блок питания DR-30-5 (5В / 3А, DIN-рейка) | × | 1 |
| Prototyping Shield для Raspberry Pi (LED статуса, защищённый вход прерывания, клеммники) | × | 1 |
| I2C-Buffer HS (уровневый преобразователь I²C на P82B96 с подтяжками) | × | 1 |
| Arduino Nano R3 (мост между датчиками DHT22 и I²C) | × | 1 |
| Передатчик/приёмник 433 МГц (для беспроводных реле) | × | 1 |
Программное обеспечение и сервисы
О проекте
Обновление 2: Проект развивается, добавлены Twitter-клиент, интеграция Telegram-ботов. Подробности в GitHub.
Обновление 1: Спасибо за отзывы! Проект презентован на Maker Faire Rome 2015 и Microsoft Technical Summit 2015.

Разрабатываю систему домашней автоматизации 3 года: монтаж железа и разработка ПО.
Входы (сенсоры)
- Кнопка (BUSCH-JAEGER 2020US)
- Датчик движения (Abus 360° BW8085)
- Температура комнаты (свой девайс на DHT22)
- Влажность комнаты (DHT22)
- Состояние окна (реконтакт Honeywell Slimline)
- Восход/закат, внешняя температура и влажность (OpenWeatherMap)
Выходы (исполнительные механизмы)
- Люстра (реле, без димминга)
- Розетка (реле)
- Роллет (два реле: вверх/вниз)
- Вентилятор потолка (3 реле для скоростей)
- Вентилятор ванной (2 реле)
Другие возможности
- Веб-приложение для iOS, Android, Windows, macOS — управление виртуальными актуаторами, конфигурация загружается с контроллера.
- События публикуются в Azure Event Hub и/или логируются в CSV.
- UDP-тресинг контроллера для отладки.
- Поддержка кастомных актуаторов.
- Логические выходы — объединение физических.
- Анимации логических выходов.
- Отказоустойчивость: при отказе части железа остальное работает.
- Поддержка 433 МГц пультов.
Концепция
При ремонте дома решил управлять всем из щитка через реле. Каждая кнопка, лампа, розетка, роллет — свой кабель к щитку. Шина типа KNX/EIB не нужна.
Примечание: Компоненты рассчитаны на 230В (Германия). Монтаж силовых кабелей делал электрик.
Аппаратная часть
Новый щиток



Шина I²C
I²C не рассчитана на длинные линии, но можно увеличить длину:
- Питание шины 5В (Pi даёт 3.3В) — нужен преобразователь уровней P82B96 (первое устройство на Pi). Кабель максимально короткий.
- Витая пара CAT7: одна пара для SDA+GND, вторая для SCL+GND. Не использовать одну пару для SDA+SCL. Экраны на PE.
- Лужёный провод (stranded) — сложнее монтировать, но больше длина.
- Подтяжки 10 кОм в конце шины на SDA и SCL.
- Скорость 100 кбит/с (Standard Mode).
- Буфер I²C (P82B96) в середине шины — разделяет физические сегменты.
Оптимизированная шина соединяет все платы в щитке.
Релейные платы (выходы)
Платы CCTools (Германия) с реле на I²C. Можно покупать как сборки, так и отдельные платы/PCB. Держатели для реле и ИС — удобная замена. PCA9555D дешевле и доступнее MAX7311.

HSRel5: 5 реле + 3 GPIO на PCF8574 (8 GPIO). Первые 5 — реле, последние 3 — свободные выходы. Реле требуют 12В — нужен драйвер (ULN2803) и инвертор, так как при включении PCF8574 все порты HIGH (реле бы сработали случайно). Логика инвертированная: для включения 1-го реле шлём 00011110 (MSB).
HSRel8(+8): 8 реле + 8 GPIO на MAX7311. Инвертора не нужно. HIGH = ON. Разница в логике обрабатывается в драйвере.
PCF8574 — 8 адресов, PCF8574A — ещё 8. Итого до 16 плат HSRel5 на шине.
Расширители портов (входы)
Кнопки, датчики движения, реконтакты — на плате I2C-Port16 HS (MAX7311, подтяжки 5В/10к, керамические конденсаторы 100 нФ для фильтра дребезга). Питание 12В или 5В.

Каждое устройство — свой кабель CAT7 (экран на PE) к щитку. Несколько кнопок в одной точке — один кабель.
На щитке: вход устройства → порт расширителя + GND. Подтяжка держит HIGH, замыкание на GND даёт LOW.
Общий провод interrupt (подтянут к HIGH) соединяет все платы ввода. При изменении состояния расширитель тянет interrupt в LOW. Программа на Pi опрашивает только изменившиеся платы — нет постоянного опроса всей шины.
Raspberry Pi 2
Запускает Windows 10 IoT, в кастомном корпусе на щитке. Prototyping Shield: статусный LED, вход interrupt с подтяжкой 10к, защитным резистором 1к и конденсатором 100 нФ. Все кабели — на клеммниках.



Датчики температуры и влажности
10 датчиков DHT22 (AOSONG). Протокол без адресации — каждый датчик нужен свой МК. Использую Arduino Nano V3.0 как I²C-slave. Nano опрашивает все датчики каждые 2.5 с, кэширует значения. Pi читает по ID порта (0–10) — как чтение регистров I²C.



В веб-приложении: два вида отображения. Иконка влажности: зелёный (<60%), жёлтый (<70%), красный (>70%) — риск плесени.

Схема щитка


433 МГц пультовые реле
Передатчик 433 МГц (FS1000A) спрятан в корпусе с датчиками DHT22 в центральной комнате. Тот же Nano шлёт коды. Питание передатчика 12В для дальности (на 3.3В — близко).


Проблема: пультовые реле не сообщают состояние. Пользователь может переключить оригинальным пультом — рассинхрон. Решение: ПО принудительно синхронизирует состояние каждые 5 с.
Коды пультов настраиваются вручную через схему на макетке (см. Fritzing и скетч в CK.HomeAutomation.SensorsBridge\RemoteCodeFinder).
Цифровой туалет для кота
Лоток в кладовке без окна. Вентилятор на реле в неиспользуемой дымоходе. Датчик движения в кладовке включает вентилятор на несколько минут.




В веб-приложении своя иконка лотка с ручным управлением вентилятором.


Анализ логов (Azure SQL или CSV) позволяет отслеживать частоту использования и оптимизировать уборку.
Программное обеспечение
Раньше работало на GHI G120 (.NET Micro Framework 4.3) — мало производительности. Перенёс на Windows 10 IoT Background Task, добавил Azure.
Репозиторий: CK.HomeAutomation — Visual Studio 2015 Solution, все проекты. Готово к расширению кастомными драйверами.
Структура проектов
- App — веб-приложение
- Controllers — стартовые проекты для Pi (IoT Background Task) и конфигурация дома
- SDK — общие библиотеки


CK.HomeAutomation.TraceViewer
Консольное приложение для просмотра UDP-тресов от контроллера (порт 19227). Классы уведомлений в CK.HomeAutomation.Notifications.

CK.HomeAutomation.Networking
HTTP-сервер для веб-приложения: JSON-статус, команды управления. Хостит веб-приложение (файлы вручную через SMB: \\[IP]\c$\Users\DefaultAccount\AppData\Local\Packages\CK.HomeAutomation.Controller-uwp_p2wxv0ry6mv8g\LocalState\app).
CK.HomeAutomation.Controller.*
Каждый проект в Controllers — IoT Background Task. Примеры конфигурации (используются у меня). Есть пустой шаблон CK.HomeAutomation.Controller.Empty.
Необходимые навыки: настройка Pi2 с Windows 10 IoT, PowerShell Remote, деплой UWP. Скрипт SetupRaspberryPi.ps1 автоматизирует настройку (поправьте IP!).

CK.HomeAutomation.Actuators
Высокоуровневая абстракция: дом, комнаты, актуаторы (кнопки, лампы, розетки...). Fluent API для конфигурации комнат.

Актуаторы
MotionDetector: события MotionDetected и DetectionCompleted. В веб-UI — красная точка при движении, можно деактивировать программно.

Button: PressedShort (<1.5 с) и PressedLong (>1.5 с). Позволяет многозадачные кнопки. Есть VirtualButton — нажатие только из веб-UI.

Socket, Lamp, BinaryStateOutput: базовый класс для ON/OFF. Методы обновления и переключения. Кнопки взаимодействуют через IBinaryStateOutputActuator. Кастомные иконки через Configuration.js.

CombinedBinaryStateActuators: логическое объединение физических выходов. Один «мастер» определяет состояние при toggle. Внутреннее отслеживание изменений убирает задержки последовательного обновления по I²C.

StateMachine: сложные состояния (вент: выкл/1/2/3). Методы: выкл, следующее состояние. Циклично. Можно создавать «настроения» (moods) для группы актуаторов.


Метод WithTurnOffIfStateIsAppliedTwice: повторное нажатие выключает, если настроение активно.

TemperatureSensor / HumiditySensor: значения с I²C-моста каждые 10 с. Разделены на два актуатора.
Автоматизация ≠ Управление
Суть — автоматизация. Реализованные правила:
AutomaticTurnOnAndOffAutomation: включение на заданное время по триггеру (кнопка/движение). Опционально временной диапазон (день/ночь — нужен WeatherStation).

AutomaticRollerShutterAutomation: роллеты по восходу/закату (нужен WeatherStation), с коррекцией. «Не открывать раньше» заданного времени. Закрытие при перегреве улицы (для мансардных окон). Позиция отслеживается по времени.


AutomaticConditionalOnAutomation: включение пока выполняются условия. Садовые лампы только ночью. Диапазоны ON/OFF, можно использовать восход/закат.

Общая автоматизация и сложные условия: фреймворк кастомных действий при выполнении условий. Проверка при каждом триггере (кнопка, движение, интервал...).


WeatherStation: погода, восход/закат, температура, влажность — каждые 60 с через OpenWeatherMap API. Интерфейс IWeatherStation позволяет подменить на физическую станцию.
CK.HomeAutomation.Hardware
Драйверы плат CCTools, 433 МГц, код Arduino Nano (мост датчиков + 433 МГц передатчик). Абстракция через интерфейсы — легко добавлять новые платы.
CK.HomeAutomation.Telemetry
Два компонента:
- CSV-логгер в
LocalState\BinaryStateOutputActuatorChanges.csv(доступ через SMB). AzureEventHubPublisher— события в Azure Event Hub. SQL-скрипты и Stream Analytics в папке#Azure. Каждое изменение = 2 записи: START (новое состояние) и END (длительность в секундах).



WebApp
Проект CK.HomeAutomation.App на AngularJS, jQuery, Bootstrap. Конфигурация комнат считывается с контроллера, UI генерируется динамически. Файл Configuration.js — настройка и перевод, там же IP контроллера. Можно открыть локально index.html или хостить на веб-сервере (для добавления на домашний экран iOS нужен HTTPS). Я использую BananaPi + nginx.





Терминал
В гостиной на стене старое iPad 3 с веб-приложением.

Планы
- ИК-актуаторы (RGB-ленты)
- XML-конфигурация дополнительно к кодовой
- Планшетный UI с другой раскладкой
- Реконтакты окон в веб-UI
- Библиотеки драйверов других производителей
- Управление клапанами отопления (выходы и датчики уже есть)
- Сигнализация (движение/открытые окна)
- Железная метеостанция
- Автозакрытие роллетов при дожде и открытом окне (API уже даёт данные)
- Unit-тесты, документация на GitHub Wiki
- Анимации (были на NETMF, не успел перенести)
Заинтересованы в участии (железо, софт, доки) — пишите!
Код
Полный репозиторий: CK.HomeAutomation (SDK, WebApp, личная конфигурация).
Схемы
Схема для чтения кодов 433 МГц пульта:

Плата датчика DHT22 (в каждой комнате):

Shield для Pi: статусный LED, клеммники I²C и interrupt:

Корпус с DHT22 и 433 МГц передатчиком (один на дом):

Производственный процесс
- Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
- Удалённый мониторинг погоды на Raspberry Pi 3 с PubNub
- Интеграция TI SensorTag с Blynk через Node‑RED на Raspberry Pi Zero
- Управление светодиодом с PIR-датчиком движения на Raspberry Pi
- Мониторинг домашней температуры с панелью управления на Raspberry Pi
- Считывание пульса сердечного ритма на Windows 10 IoT Core на Raspberry Pi — пошаговое руководство
- Создайте систему домашней автоматизации на Raspberry Pi для удаленного управления
- Передача данных Adafruit 10DOF IMU с Raspberry Pi 2 в Azure Event Hubs на Windows 10 IoT Core
- Точный мониторинг температуры и влажности с SHT15 на Windows 10 IoT Core
- Установка Windows 10 IoT Core на Raspberry Pi 3 Model B+: Пошаговое руководство