Умный световой выключатель на Raspberry Pi
Введение

Из схем «включать от заката до рассвета» и таймеров можно сделать гибкую систему: запрограммированное расписание + измерение освещённости + удалённая команда. Такая комбинация даёт точное и энергоэффективное поведение светильников и при этом остаётся дешёвой и расширяемой.
В этой статье мы разберём аппаратную часть, подключение, установку ПО, сценарии автоматизации, проверку работоспособности и практические расширения — от интеграции с голосовыми помощниками до рекомендаций по безопасности.
Важно: работа с сетевым напряжением опасна. Если вы не уверены в навыках электрика, поручите подключение квалифицированному электрику.
Что вам понадобится
- Любая модель Raspberry Pi с Raspbian / Raspberry Pi OS.
- Реле (релейная плата) с нормально разомкнутым контактом (NO).
- Датчик освещённости Adafruit TSL2561 (I2C‑интерфейс).
- Набор перемычек (Jumper wires) и провода для подключения реле к цепи освещения.
- Источники света, которые вы собираетесь автоматизировать (лампы, светодиодные драйверы и т. п.).
Рекомендация по запасным вариантам: вместо TSL2561 можно использовать другой I2C‑датчик освещённости (например, BH1750) с соответствующими библиотеками.
Как работает умный выключатель
Система принимает решение об управлении освещением на основе трёх входов:
- Программное расписание (cron).
- Текущий уровень освещённости (датчик lux).
- Переопределение по сети (HTTP‑сервер для override).
Raspberry Pi управляет реле, которое размыкает/замыкает цепь так же, как обычный выключатель. Благодаря сети можно добавлять управление через смартфон, голосовые ассистенты или IFTTT.
Схема подключения Raspberry Pi и реле
Перед началом убедитесь, что питание выключено.
Если на вашей релейной плате установлен джампер, соединяющий JD‑VCC и VCC, снимите его.
Подключите так (контакты Pi в номерах выводов):
- Pi Pin 2 (5V) → JD‑VCC на релейной плате.
- Pi Pin 6 (GND) → GND на релейной плате.
- Pi Pin 15 (GPIO 22) → IN1 на релейной плате.
- Pi Pin 17 (3.3V) → VCC на релейной плате.
Примечание по питанию реле: многие релейные платы требуют 5 В для JD‑VCC и 3.3 В для VCC сигналов логики. Отдельное питание JD‑VCC снижает вероятность повреждения GPIO.
Подключение датчика освещённости TSL2561
TSL2561 измеряет инфракрасный, видимый и суммарный спектр света и отдаёт точный цифровой показатель в lux. Диапазон показаний примерно от 0.1 до ~40 000.
Датчик использует интерфейс I2C, который требует две сигнальные линии (SDA, SCL) и питание. Подключите так:
- Pi Pin 1 (3.3V) → Vin (или VCC) на датчике.
- Pi Pin 3 (SDA) → SDA на датчике.
- Pi Pin 5 (SCL) → SCL на датчике.
- Pi Pin 9 (GND) → GND на датчике.
Совет по установке: не направляйте датчик прямо на солнце — он может «пересветиться» (saturated). Лучше разместить под навесом или в тени.
Настройка и установка зависимостей
- Включите I2C через raspi‑config:
sudo raspi-configВыберите Interfacing Options → P5 I2C → Yes. Затем Finish и перезагрузите:
sudo reboot- Установите необходимые пакеты:
sudo apt-get update
sudo apt-get install -y python-smbus i2c-tools git wget nano- Проверьте, виден ли I2C‑датчик:
sudo i2cdetect -y 1Вы должны увидеть адрес устройства, например 0x39, в сетке вывода.
- Подготовьте рабочую папку и скачайте дополнительные библиотеки и веб‑фреймворк:
mkdir ~/lighting
cd ~/lighting
wget https://bottlepy.org/bottle.py
git clone https://github.com/adafruit/Adafruit_Python_GPIO.git
git clone https://github.com/adafruit/Adafruit_Python_PureIO.git- Создайте и протестируйте минимальный скрипт для чтения lux:
Создайте файл test.py и вставьте код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
from tsl2561 import TSL2561
if __name__ == "__main__":
tsl = TSL2561(debug=True)
print(tsl.lux())Запустите:
python test.pyСкрипт должен вывести число — текущую освещённость в lux. Закройте датчик рукой, поднесите источник света — число изменится.
Автоматизационные скрипты и логика
Мы используем три основных скрипта:
- onzone.py — запускается по расписанию в «дневные» часы, но включает свет только если lux ниже порога lowlux.
- offzone.py — запускается в «ночные» часы, немедленно выключает свет независимо от lux.
- lightserver.py — простой HTTP‑сервер для временного переопределения (override) и проверки статуса.
Скрипты запускаются cron’ом по часам, которые вы зададите. Это позволяет гибко настроить «зоны включения» и «зоны выключения».
onzone.py — включение по низкой освещённости
Скачайте готовый onzone.py:
wget https://gist.githubusercontent.com/hamishdownell/ea151d2ff7c888ac09f8a850afaab4ee/raw/10b0e9d8ec42f8577750941da46a93d16b597c05/onzone.pyОписание логики:
- Считывается значение lux.
- Если lux <= lowlux и реле сейчас разомкнуто, произвести замыкание (включить свет).
- Если lux > lowlux и свет включён, выключить свет (если не активирован override).
Параметр lowlux регулирует чувствительность. Пример:
lowlux = 50 # уровень в люкс, ниже которого считаем, что темноПодберите значение эмпирически: для тёплого уличного освещения оно может быть 10–100 в зависимости от окружения.
offzone.py — жёсткое выключение в заданные часы
Скачайте offzone.py:
wget https://gist.githubusercontent.com/hamishdownell/fb8970909145bbfefbbef8dba5f5a00f/raw/eae5a6057a51ca4727907c7d061f0a48b07da944/offzone.pyЭтот скрипт просто выключает реле, если свет включён, игнорируя lux, но уважая флаги override.
lightserver.py — переопределение (override) по HTTP
Скачайте lightserver.py:
wget https://gist.githubusercontent.com/hamishdownell/2303bfd9fb30d42e79923bdb7e69ed4e/raw/7dcb456b81b8ae58ae48efa225adb41ba7d7f69c/lightserver.pyЭндпойнты:
- /overrideon/
— включить свет на minutes минут. - /overrideoff — немедленно выключить и снять override.
- /getoverrideremaining — сколько минут осталось до окончания override.
- /lightstatus — текущее состояние (on/off).
Перед запуском запустите offzone.py один раз, чтобы скрипты создали служебные файлы:
python offzone.pyПланирование с помощью cron
Откройте кронтаб:
sudo crontab -eДобавьте строки (подстановки часов — пример, поменяйте под свои нужды):
* 7,8,9,17,18,19,20,21,22,23 * * * python /home/pi/lighting/onzone.py > /dev/null 2>&1
* 0,1,2,3,4,5,6,10,11,12,13,14,15,16 * * * python /home/pi/lighting/offzone.py > /dev/null 2>&1Важно: если ваш пользователь не pi, исправьте путь /home/pi/lighting.
Чтобы запускать сервер при старте системы, отредактируйте /etc/rc.local и добавьте:
nohup python /home/pi/lighting/lightserver.py &Затем перезагрузите Pi:
sudo rebootТестирование и проверка реле
Проверьте override через браузер в локальной сети:
http://11.22.33.44:1234/overrideon/3Если всё настроено, вы услышите щелчок реле и получите ответ сервера о включении на 3 минуты.
Другие полезные команды:
http://11.22.33.44:1234/getoverrideremaining
http://11.22.33.44:1234/lightstatus
http://11.22.33.44:1234/overrideoffЭти же адреса можно вызывать из смартфона, Home Assistant, IFTTT или через webhooks для голосовых ассистентов.
Подключение света к реле
Перед физическим подключением выключите питание и разомкните цепь. Используйте нормально разомкнутые контакты (NO) на плате реле вместо механического выключателя.
Проверяйте индикаторы и сопротивление мультиметром. После первого подключения прогоните тесты override на короткое время.
Практические рекомендации и безопасность
- Всегда выключайте питание при работе с сетью 230/120 В. Неправильное подключение может привести к поражению электрическим током или пожару.
- Изолируйте места соединений термоусадкой и клеммами.
- Если лампы обладают встроенной логикой (например, светильники с трансформаторами или драйверами), проверьте совместимость реле по токовому и пусковому току.
- Для большого количества точек освещения используйте силовые реле или контакторы, рассчитанные на нагрузку.
Важно: настройка реле и проводки должна соответствовать местным правилам электробезопасности.
Расширения и альтернативы
- Альтернативные датчики: BH1750, VEML7700 — чаще проще в работе и доступны дешевле.
- Уровень автоматизации: добавить датчик движения, чтобы не включать свет, если никто не рядом.
- Интеграция с Home Assistant, OpenHAB или Node‑RED для визуального управления, логов и графиков.
- Использовать MQTT вместо HTTP для более гибкого взаимодействия и интеграции с умным домом.
- Переехать с файлового флага override на базу sqlite или Redis, чтобы избежать проблем при одновременных запросах.
Интеграция с голосовыми ассистентами и IFTTT
- IFTTT: связать Alexa Trigger → Webhooks, отправляющий GET/POST на lightserver.py. Важно защитить эндпойнты (см. раздел безопасность).
- Siri Shortcuts: создать запросы к HTTP‑эндпойнтам и добавить быстродействующие ярлыки.
Быстрые варианты защиты и жёсткие рекомендации
- Ограничьте доступ к lightserver.py с помощью firewall (ufw), разрешая доступ только из локальной сети.
- Используйте токен аутентификации в URL или Basic Auth (лучше — HTTPS и прокси с TLS).
- Для удалённого доступа используйте VPN или туннель с аутентификацией (например, WireGuard, Tailscale).
Не выставляйте открытый HTTP‑сервер в интернет без аутентификации и шифрования.
Отладка и распространённые ошибки
- i2cdetect не видит устройство — проверьте SDA/SCL и питание 3.3 В.
- Реле не щёлкает — проверьте JD‑VCC питание 5 В и соединение GND; проверьте IN1 управляющий сигнал на 3.3 В.
- Скрипты не запускаются в cron — убедитесь, что используете тот же Python и правильные абсолютные пути; перенаправляйте вывод в файл для отладки.
- Проблемы с правами — проверьте владельца файлов и права на исполнение (chmod +x).
Рекомендации по настройке порога lowlux
Правильное значение lowlux зависит от окружения. Примерная таблица:
- Улица в ясную ночь, отсутствие уличного освещения: 0–5 lux.
- Пригородное освещение средней яркости: 5–30 lux.
- Сильно засвеченное место (фонари, витрины): 30–200 lux.
Подберите значение эмпирически, наблюдая за тем, как sensor.lux изменяется в разное время суток.
Мини‑методология тестирования перед подключением нагрузки
- Соберите и подключите только Raspberry Pi и реле, без подключения силовой линии.
- Запустите lightserver.py и вызывайте /overrideon/1, слушая щелчки реле и проверяя файл статуса.
- Проверьте onzone.py и offzone.py вручную, выполняя их в разные часы и контролируя поведение.
- Только после успешных тестов с реле подключайте сетевую нагрузку и проводите пробу под контролем.
Пример контролей и критериев приёмки
Критерии приёмки:
- Система реагирует на /overrideon/ и включает реле в пределах 2 секунд.
- onzone.py включает свет при lux <= lowlux и держит его включённым, если не истёк override.
- offzone.py выключает свет в указанные часы.
- После перезагрузки lightserver.py автоматически запускается и отвечает на запросы.
Роль‑ориентированные чеклисты
Для энтузиаста‑сборщика:
- Проверить распиновку.
- Протестировать i2c‑датчик.
- Запустить скрипты вручную.
Для домоуправляющего:
- Настроить расписание часов включения/выключения.
- Проверить поведение при облачности/дожде.
Для администратора безопасности:
- Закрыть доступ внешнего Интернета.
- Настроить VPN/SSH‑туннель или включить Basic Auth + HTTPS.
Шаблон crontab и /etc/rc.local
Пример crontab (замените /home/pi на ваш путь):
# Зоны включения (проверка lux)
* 18,19,20,21,22,23 * * * python /home/pi/lighting/onzone.py >> /home/pi/lighting/logs/onzone.log 2>&1
# Зоны выключения (жёсткое выключение)
* 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 * * * python /home/pi/lighting/offzone.py >> /home/pi/lighting/logs/offzone.log 2>&1Строка для /etc/rc.local (перед exit 0):
nohup python /home/pi/lighting/lightserver.py >> /home/pi/lighting/logs/lightserver.log 2>&1 &Тест‑кейсы и приёмка
- При lux = 0 и в зоне on — свет должен включиться в течение 5 секунд.
- При lux = 100 и в зоне on — свет не включается.
- При вызове /overrideon/10 — свет включается и остаётся включённым 10 минут, даже если lux повышается.
- При вызове /overrideoff — свет выключается и файловый флаг override сбрасывается.
Модель зрелости и пути эволюции
- Уровень 1 — локальный Pi, HTTP override, ручной cron.
- Уровень 2 — интеграция с IFTTT и голосовыми ассистентами, basic auth.
- Уровень 3 — интеграция с Home Assistant, MQTT, TLS, мониторинг и логирование.
- Уровень 4 — корпоративный роуминг: централизованное управление несколькими Pi, отказоустойчивость.
Decision tree для включения света
flowchart TD
A[Текущее время] --> B{В зоне OFF?}
B -- Да --> C[Запустить offzone.py -> Выключить свет]
B -- Нет --> D{В зоне ON?}
D -- Нет --> E[Не менять состояние]
D -- Да --> F{Есть ли override?}
F -- Да --> G[Оставить состояние согласно override]
F -- Нет --> H[Считать lux]
H --> I{lux <= lowlux?}
I -- Да --> J[Включить свет]
I -- Нет --> K[Выключить свет]Сравнение подходов (кратко)
- Только расписание: просто, но не учитывает естественное освещение.
- Только датчик: чувствительно к локальным условиям и не учитывает предпочтения по времени.
- Комбинация (используемая здесь): даёт баланс между временем и реальной потребностью в освещении.
Примеры альтернативных архитектур
- Использовать ESP32/ESP8266 + MQTT вместо Pi для меньшего энергопотребления и компактности (код на Arduino/C или MicroPython).
- Использовать промышленный контроллер (PLC) для управления множеством зон в коммерческих системах.
Конфиденциальность и GDPR
Если вы логируете запросы с IP‑адресами или храните данные о присутствии людей, учитывайте правила конфиденциальности. Для домашней установки обычно достаточно локального хранения и отключения удалённого логирования.
Глоссарий (одна строка на термин)
- I2C — последовательный протокол обмена данными между платами.
- lux — единица измерения освещённости.
- JD‑VCC/VCC — входы питания на релейной плате (силовое и логическое).
- NO — нормально разомкнутый контакт реле.
Кнопки быстрого доступа и шаблоны
Шаблон для проверки состояния в командной строке (curl):
curl http://11.22.33.44:1234/lightstatusШаблон для включения на 5 минут:
curl http://11.22.33.44:1234/overrideon/5Частые ошибки при миграции и совместимость
- Несовместимость уровней логики: убедитесь, что управляющие сигналы соответствуют 3.3 В на GPIO.
- Неправильные версии библиотек Adafruit: используйте совместимые версии для вашей версии Python.
- При переходе на другой датчик проверяйте адрес I2C и формат данных.
Краткое резюме
- С помощью Raspberry Pi, реле и TSL2561 можно быстро сделать гибкий умный выключатель.
- Комбинация расписания, измерения lux и override обеспечивает удобство и экономию энергии.
- Безопасность и корректное подключение питания критичны.
Важно: тестируйте систему в безопасной среде и не подключайте силовую часть, пока не убедитесь в корректной работе логики.
Полезные ссылки и дальнейшие шаги
- Исследуйте интеграцию с Home Assistant для визуального контроля и автоматизаций.
- Попробуйте заменить HTTP на MQTT для масштабируемости и подписки/публикации статусов.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone