Автоматический умный выключатель света на Raspberry Pi
Важно: работа с сетевым электричеством (230 В) опасна. Если вы не уверенны в навыках, привлечите квалифицированного электрика для подключения нагрузки к реле.
Зачем это полезно
- Экономия электроэнергии: лампы включаются только когда действительно темно или по расписанию.
- Удобство: удалённое управление и интеграция с голосовыми ассистентами через простой веб‑сервер.
- Обучающий проект: знакомство с GPIO, I2C, cron и базовой автоматизацией на Raspberry Pi.
Короткая дорожная карта
- Подключите реле к GPIO целевого Raspberry Pi.
- Подключите датчик освещённости TSL2561 по I2C.
- Включите I2C, установите зависимости и библиотеки.
- Скачайте и проверьте скрипты onzone.py, offzone.py и lightserver.py.
- Настройте cron для расписаний и автозапуск override‑сервера.
- Протестируйте реле и только затем подключайте нагрузку.
Что вам потребуется
- Любая модель Raspberry Pi с Raspbian (Raspberry Pi OS).
- Плата реле (relay board) с нормально разомкнутыми контактами (NO).
- Датчик освещённости Adafruit TSL2561.
- Джампер‑провода (male–female/мама–папа в зависимости от плат).
- Лампы/осветительная нагрузка для автоматизации.
- Доступ в локальную сеть (для веб‑оверайда).
Краткий факт-бокс
- Диапазон TSL2561: примерно 0.1 — 40 000 люкс (сколько выдаёт сенсор).
- Уровень lowlux по умолчанию в скрипте: 50 люкс (настраивается под ваше место).
- Напряжение питания Pi: 3.3 В на линиях SDA/SCL; питание реле отдельным 5 В на JD‑VCC.
- Сеть питания (в РФ): типично 230 В переменного тока — соблюдайте правила.
Как работает система (упрощённая модель)
Система принимает три основных входа, чтобы решать, включать свет или выключать:
- Программное расписание (cron).
- Датчик освещённости (TSL2561) — текущий уровень в люксах.
- Удалённый оверрайд через веб‑сервер (override).
Логика: если сейчас «on‑зона» по расписанию и уровень люкс ниже порога lowlux — включаем; если «off‑зона» — выключаем; оверрайд временно переопределяет поведение.
Шаг 1: Подключение Raspberry Pi к плате реле
Если вы не знакомы с GPIO, сначала прочитайте вводный материал по контактам Raspberry Pi GPIO. Перед подключением убедитесь, что питание Pi отключено.
Проверьте плату реле: часто на модулях есть джампер, соединяющий VCC и JD‑VCC. Если он установлен, снимите его — это позволит раздельно питать управляющую электронику реле (VCC 3.3 В/5 В) и саму часть реле (JD‑VCC 5 В). Это снижает риск повреждения Pi.
Подключение (с выключенным питанием):
- Pi Pin 2 (5V) -> JD‑VCC на плате реле
- Pi Pin 6 (GND) -> GND на плате реле
- Pi Pin 15 (GPIO22) -> IN1 на плате реле
- Pi Pin 17 (3.3V) -> VCC на плате реле
Заметка: схемы других плат реле могут отличаться по нумерации контактов: сверяйтесь с маркировкой на плате.
Шаг 2: Подключение датчика освещённости (TSL2561)
TSL2561 — цифровой светочувствительный датчик, который измеряет инфракрасный, видимый и суммарный свет. Он общается с Raspberry Pi по протоколу I2C и выдаёт числовое значение в люксах.
Соедините четыре контакта:
- Pi Pin 1 (3.3V) -> Vin (или VCC) на датчике TSL2561
- Pi Pin 3 (SDA) -> SDA на датчике
- Pi Pin 5 (SCL) -> SCL на датчике
- Pi Pin 9 (GND) -> GND на датчике
Совет: размещайте датчик так, чтобы он измерял окружающий уровень света, а не попадал под прямые солнечные лучи — это может «зафиксировать насыщение» показаний.
Шаг 3: Включение I2C и установка зависимостей
По умолчанию I2C отключён. Включите его через raspi‑config:
sudo raspi-configВыберите Interfacing Options → I2C → Yes. Затем Finish и выполните перезагрузку:
sudo rebootУстановите зависимости и утилиты i2c:
sudo apt-get update
sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-toolsПроверьте видимость устройства на шине I2C:
sudo i2cdetect -y 1Вы увидите сетку адресов. Если датчик подключён корректно, он появится как адрес, например 0x39.
Далее создайте рабочую папку проекта:
mkdir ~/lighting
cd ~/lightingСкачайте lightweight web‑framework Bottle:
wget https://bottlepy.org/bottle.pyУстановите git, если он отсутствует, и клонируйте библиотеки Adafruit, используемые скриптами:
sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_Python_GPIO.git
git clone https://github.com/adafruit/Adafruit_Python_PureIO.gitСоздайте тестовый скрипт для проверки датчика:
nano test.pyВставьте в файл (пример от Adafruit):
#!/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())Сохраните (Ctrl+X) и запустите:
python test.pyВы должны получить число — текущий люкс. Попробуйте заслонить датчик рукой и снова запустить скрипт: число должно упасть.
Шаг 4: Создание и понимание автоматизационных скриптов
Система использует три основных скрипта:
- onzone.py — запускается каждую минуту в «on‑зонах», включает свет при низком уровне люкс.
- offzone.py — запускается каждую минуту в «off‑зонах», выключает свет независимо от уровня люкс.
- lightserver.py — простой веб‑сервер (на Bottle), дающий команды переопределения (override) и статус.
Скачайте готовые скрипты (оригинальные авторские gist):
wget https://gist.githubusercontent.com/hamishdownell/ea151d2ff7c888ac09f8a850afaab4ee/raw/10b0e9d8ec42f8577750941da46a93d16b597c05/onzone.py
wget https://gist.githubusercontent.com/hamishdownell/fb8970909145bbfefbbef8dba5f5a00f/raw/eae5a6057a51ca4727907c7d061f0a48b07da944/offzone.py
wget https://gist.githubusercontent.com/hamishdownell/2303bfd9fb30d42e79923bdb7e69ed4e/raw/7dcb456b81b8ae58ae48efa225adb41ba7d7f69c/lightserver.pyКлючевые настройки и понятия:
- lowlux — порог люкс (по умолчанию 50). Если измерение ниже — считается «темно».
- Файлы состояния (контрольные файлы), которые используют скрипты для учёта текущего статуса и оверрайда.
- Cron‑расписание решает, в какие часы работает onzone.py, а в какие — offzone.py.
Создайте начальные контрольные файлы, запустив offzone.py один раз: это создаст необходимые файлы состояния.
python offzone.pyШаг 5: Планирование задач cron и автозапуск сервера
Откройте crontab для root, чтобы скрипты выполнялись с нужным окружением:
sudo crontab -eВставьте две строки (пример — часы, где разрешено включение света через onzone.py):
* 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”, поправьте пути в командах.
Чтобы автозапускать lightserver.py при старте системы, можно добавить запуск в /etc/rc.local или предпочтительнее — создать systemd unit. Пример с rc.local:
sudo nano /etc/rc.localДобавьте перед строкой exit 0:
nohup python /home/pi/lighting/lightserver.py &Перезагрузите систему:
sudo rebootСовет: systemd юнит даёт больше контроля (логи, автоперезапуск). Рассмотрите создание простого сервиса для lightserver.py.
Шаг 6: Тестирование реле через веб‑интерфейс override
Пока нагрузка не подключена, протестируйте реле через браузер в локальной сети (замените IP и порт на свои):
- Включить реле на 3 минуты:
http://11.22.33.44:1234/overrideon/3Вы должны услышать щелчок реле.
Проверить оставшееся время оверрайда:
http://11.22.33.44:1234/getoverrideremainingПроверить статус света:
http://11.22.33.44:1234/lightstatusВыключить с помощью оверрайда:
http://11.22.33.44:1234/overrideoffЕсли ответы приходят корректно и реле щёлкает — можно подключать нагрузку.
Шаг 7: Подключение нагрузки к реле
Отключите питание Raspberry Pi и саму нагрузку от сети. Подключите лампу через нормально разомкнутые контакты (NO) реле, как будто это обычный выключатель: разорвите одну фазную линию (Live), соедините с COM реле, и от NO к нагрузке.
Важно: не подключайте ноль через реле; коммутируйте фазу. Всегда используйте предохранители и соблюдайте ПУЭ/локальные правила безопасности.
Дополнительные улучшения и интеграции
- Голосовое управление: используйте IFTTT + Alexa или Webhooks для прокидывания команд в lightserver.py.
- Siri Shortcuts: можно отправлять HTTP‑запросы для управления оверрайдом.
- HTTPS и аутентификация: по умолчанию lightserver прост и незащищён. Для удалённого доступа обязательно настройте VPN, SSL/TLS и токены/пароли.
Отладка и распространённые проблемы
- i2cdetect не видит устройство: проверьте проводку SDA/SCL, питание и включён ли I2C в raspi-config.
- Скрипты не выполняются в cron: убедитесь, что пути абсолютные, окружение (PYTHONPATH) корректно, перенаправляйте вывод в лог для диагностики.
- Реле не щёлкает: проверьте питание JD‑VCC (5 V) и земля. Иногда модули требуют отдельного 5 В для питания катушек реле.
Критерии приёмки
- Скрипт test.py возвращает корректное число люкс и оно изменяется при заслонении датчика.
- При запросе /overrideon/3 реле срабатывает и отрабатывает 3 минуты.
- Cron‑задачи onzone.py и offzone.py запускаются каждую минуту в настроенные часы.
- После подключения нагрузки лампа физически включается/выключается при срабатывании реле.
Режимы зрелости проекта
- Уровень 1 — Proof of concept: всё работает локально, без защиты, тесты вручную.
- Уровень 2 — Базовая надёжность: системd‑сервис для lightserver, логирование, бэкапы скриптов.
- Уровень 3 — Производство: защита HTTPS/VPN, ограничения доступа, мониторинг, резервный шлюз.
Когда такой подход не подходит (контрпример)
- Для критических приложений (аварийное освещение, безопасность) DIY‑реле на базе потребительского модуля не подходит — используйте сертифицированные контроллеры и схемы с избыточностью.
- Если в помещении прямые солнечные лучи часто попадают на датчик — показания будут нерелевантны, используйте дуал‑сенсорную логику или размещайте датчик в теневой зоне.
Быстрый SOP — пошаговая инструкция для установки (короткая версия)
- Отключить питание Pi и лампы.
- Подключить реле к GPIO (см. раздел Шаг 1).
- Подключить TSL2561 к I2C (см. Шаг 2).
- Включить Pi, активировать I2C и установить зависимости (Шаг 3).
- Скачайте скрипты и запустите python offzone.py 1 раз.
- Настройте cron и автозапуск сервера.
- Протестируйте override без нагрузки; затем подключите нагрузку и повторите тесты.
План тестирования и критерии приёмки (короткие тесты)
- Тест 1: test.py — показание люкс > 0.
- Тест 2: /overrideon/1 — реле щёлкает, свет включается на ~1 минуту.
- Тест 3: Запуск onzone.py при lowlux ниже порога — свет включается.
- Тест 4: offzone.py — принудительное выключение в off‑час.
Мероприятия при инциденте (runbook)
- Если реле заело (свет не выключается): немедленно отключите питание нагрузки и Pi.
- Проверьте, не застрял ли контакт механически — замените реле.
- Проанализируйте логи lightserver и cron; проверьте файлы состояния проекта.
- Если подозрение на сетевую атаку (неавторизованные команды), отключите доступ извне и смените конфигурацию сети.
Безопасность и конфиденциальность
- Не выставляйте lightserver.py в Интернет без VPN/HTTPS и авторизации.
- Отдалённый контроль через IFTTT/Alexa — удобен, но добавляет третьих сторон: внимательно читайте политику платформ по безопасности.
- Датчик освещённости не хранит персональных данных — риски приватности минимальны, но сервер управления может логировать IP и команды.
Советы по локализации и российским реалиям
- В РФ стандарт сети — 230 В, 50 Гц. При подключении нагрузки учитывайте соответствие предохранителей и автоматов.
- Магазины: платы реле, датчики и джамперы доступны на локальных и международных маркетплейсах; обращайте внимание на продавца и отзывы.
Альтернативные подходы
- Использовать готовый Zigbee/Z‑Wave реле и шлюз (более защищённо, но дороже).
- Home Assistant: перевести логику в HA — удобный UI, интеграции и автоматизации.
- Использовать ESP32/ESP8266 вместо Raspberry Pi для экономии энергии и меньшей стоимости, но с ограниченным набором библиотек и возможностями.
Дерево решений (Mermaid)
flowchart TD
A[Запланировано по расписанию?] -->|Да| B[Проверить lux]
A -->|Нет| C[Off‑зона → Выключить]
B -->|lux < lowlux| D[Включить свет]
B -->|lux >= lowlux| E[Выключить свет]
D --> F{Есть оверрайд?}
F -->|Да| D
F -->|Нет| D
C --> G[Конец]
E --> GКороткий глоссарий (1‑строчно)
- I2C: последовательный шинный интерфейс для обмена данными между платами.
- Lux: единица освещённости.
- JD‑VCC/VCC: раздельные питания на модуле реле.
- Override: временное ручное переопределение автоматической логики.
Роль‑ориентированные чек‑листы
- Хоббист: собрать и протестировать систему в безопасном макете, не подключая сеть.
- Домашний установщик: проверить крепления датчика, маршруты кабелей, защиту от влаги/пыли.
- Электрик: выполнить подключение нагрузки к сети, установить автомат и проконтролировать заземление.
Краткое резюме
- Проект даёт гибкую, дешёвую автоматизацию освещения с тремя входами управления: расписание, уровень света и удалённый оверрайд.
- Обязательно соблюдайте технику безопасности при работе с сетевым питанием и защищайте веб‑сервер от доступа извне.
- Возможны расширения: голосовые ассистенты, Home Assistant, systemd‑unit и шифрование.
Если хотите, могу подготовить systemd unit‑файл для lightserver.py, пример конфигурации Nginx прокси с SSL или адаптировать cron‑расписание под ваш часовой пояс и потребности.
Похожие материалы
Как перезагрузить iPhone — все способы и решение проблем
Меню Power User (Win+X) в Windows — как открыть и использовать
Выйти из Mail на Mac — отключить или удалить
Продлить срок службы жёсткого диска
11 команд для управления файлами в терминале Linux