Гид по технологиям

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

10 min read Raspberry Pi Обновлено 04 Jan 2026
Умный световой выключатель на Raspberry Pi
Умный световой выключатель на Raspberry Pi

Введение

light-sensing-switch

Из схем «включать от заката до рассвета» и таймеров можно сделать гибкую систему: запрограммированное расписание + измерение освещённости + удалённая команда. Такая комбинация даёт точное и энергоэффективное поведение светильников и при этом остаётся дешёвой и расширяемой.

В этой статье мы разберём аппаратную часть, подключение, установку ПО, сценарии автоматизации, проверку работоспособности и практические расширения — от интеграции с голосовыми помощниками до рекомендаций по безопасности.

Важно: работа с сетевым напряжением опасна. Если вы не уверены в навыках электрика, поручите подключение квалифицированному электрику.

Что вам понадобится

  • Любая модель Raspberry Pi с Raspbian / Raspberry Pi OS.
  • Реле (релейная плата) с нормально разомкнутым контактом (NO).
  • Датчик освещённости Adafruit TSL2561 (I2C‑интерфейс).
  • Набор перемычек (Jumper wires) и провода для подключения реле к цепи освещения.
  • Источники света, которые вы собираетесь автоматизировать (лампы, светодиодные драйверы и т. п.).

Рекомендация по запасным вариантам: вместо TSL2561 можно использовать другой I2C‑датчик освещённости (например, BH1750) с соответствующими библиотеками.

Как работает умный выключатель

Система принимает решение об управлении освещением на основе трёх входов:

  1. Программное расписание (cron).
  2. Текущий уровень освещённости (датчик lux).
  3. Переопределение по сети (HTTP‑сервер для override).

Raspberry Pi управляет реле, которое размыкает/замыкает цепь так же, как обычный выключатель. Благодаря сети можно добавлять управление через смартфон, голосовые ассистенты или IFTTT.

Схема подключения Raspberry Pi и реле

Перед началом убедитесь, что питание выключено.

Если на вашей релейной плате установлен джампер, соединяющий JD‑VCC и VCC, снимите его.

JD-VCC to VCC relay board jumper

Подключите так (контакты Pi в номерах выводов):

  • Pi Pin 2 (5V) → JD‑VCC на релейной плате.
  • Pi Pin 6 (GND) → GND на релейной плате.
  • Pi Pin 15 (GPIO 22) → IN1 на релейной плате.
  • Pi Pin 17 (3.3V) → VCC на релейной плате.

Raspberry Pi Zero W connected to a relay board

Примечание по питанию реле: многие релейные платы требуют 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 на датчике.

Raspberry Pi Zero W connected to TSL2561 lux sensor

Совет по установке: не направляйте датчик прямо на солнце — он может «пересветиться» (saturated). Лучше разместить под навесом или в тени.

Настройка и установка зависимостей

  1. Включите I2C через raspi‑config:
sudo raspi-config

Выберите Interfacing Options → P5 I2C → Yes. Затем Finish и перезагрузите:

sudo reboot
  1. Установите необходимые пакеты:
sudo apt-get update
sudo apt-get install -y python-smbus i2c-tools git wget nano
  1. Проверьте, виден ли I2C‑датчик:
sudo i2cdetect -y 1

Вы должны увидеть адрес устройства, например 0x39, в сетке вывода.

IC-Detect utility reporting lux sensor address

  1. Подготовьте рабочую папку и скачайте дополнительные библиотеки и веб‑фреймворк:
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
  1. Создайте и протестируйте минимальный скрипт для чтения 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) и проверки статуса.

Smart lighting script schedule

Скрипты запускаются 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) на плате реле вместо механического выключателя.

Inserting the relay into the lighting circuit

Проверяйте индикаторы и сопротивление мультиметром. После первого подключения прогоните тесты override на короткое время.

Практические рекомендации и безопасность

  • Всегда выключайте питание при работе с сетью 230/120 В. Неправильное подключение может привести к поражению электрическим током или пожару.
  • Изолируйте места соединений термоусадкой и клеммами.
  • Если лампы обладают встроенной логикой (например, светильники с трансформаторами или драйверами), проверьте совместимость реле по токовому и пусковому току.
  • Для большого количества точек освещения используйте силовые реле или контакторы, рассчитанные на нагрузку.

Важно: настройка реле и проводки должна соответствовать местным правилам электробезопасности.

Расширения и альтернативы

  1. Альтернативные датчики: BH1750, VEML7700 — чаще проще в работе и доступны дешевле.
  2. Уровень автоматизации: добавить датчик движения, чтобы не включать свет, если никто не рядом.
  3. Интеграция с Home Assistant, OpenHAB или Node‑RED для визуального управления, логов и графиков.
  4. Использовать MQTT вместо HTTP для более гибкого взаимодействия и интеграции с умным домом.
  5. Переехать с файлового флага override на базу sqlite или Redis, чтобы избежать проблем при одновременных запросах.

Интеграция с голосовыми ассистентами и IFTTT

  • IFTTT: связать Alexa Trigger → Webhooks, отправляющий GET/POST на lightserver.py. Важно защитить эндпойнты (см. раздел безопасность).
  • Siri Shortcuts: создать запросы к HTTP‑эндпойнтам и добавить быстродействующие ярлыки.

IFTTT Applet to connect smart lights to Alexa

Быстрые варианты защиты и жёсткие рекомендации

  • Ограничьте доступ к lightserver.py с помощью firewall (ufw), разрешая доступ только из локальной сети.
  • Используйте токен аутентификации в URL или Basic Auth (лучше — HTTPS и прокси с TLS).
  • Для удалённого доступа используйте VPN или туннель с аутентификацией (например, WireGuard, Tailscale).

Не выставляйте открытый HTTP‑сервер в интернет без аутентификации и шифрования.

Отладка и распространённые ошибки

  1. i2cdetect не видит устройство — проверьте SDA/SCL и питание 3.3 В.
  2. Реле не щёлкает — проверьте JD‑VCC питание 5 В и соединение GND; проверьте IN1 управляющий сигнал на 3.3 В.
  3. Скрипты не запускаются в cron — убедитесь, что используете тот же Python и правильные абсолютные пути; перенаправляйте вывод в файл для отладки.
  4. Проблемы с правами — проверьте владельца файлов и права на исполнение (chmod +x).

Рекомендации по настройке порога lowlux

Правильное значение lowlux зависит от окружения. Примерная таблица:

  • Улица в ясную ночь, отсутствие уличного освещения: 0–5 lux.
  • Пригородное освещение средней яркости: 5–30 lux.
  • Сильно засвеченное место (фонари, витрины): 30–200 lux.

Подберите значение эмпирически, наблюдая за тем, как sensor.lux изменяется в разное время суток.

Мини‑методология тестирования перед подключением нагрузки

  1. Соберите и подключите только Raspberry Pi и реле, без подключения силовой линии.
  2. Запустите lightserver.py и вызывайте /overrideon/1, слушая щелчки реле и проверяя файл статуса.
  3. Проверьте onzone.py и offzone.py вручную, выполняя их в разные часы и контролируя поведение.
  4. Только после успешных тестов с реле подключайте сетевую нагрузку и проводите пробу под контролем.

Пример контролей и критериев приёмки

Критерии приёмки:

  • Система реагирует на /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 &

Тест‑кейсы и приёмка

  1. При lux = 0 и в зоне on — свет должен включиться в течение 5 секунд.
  2. При lux = 100 и в зоне on — свет не включается.
  3. При вызове /overrideon/10 — свет включается и остаётся включённым 10 минут, даже если lux повышается.
  4. При вызове /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 для масштабируемости и подписки/публикации статусов.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство