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

Умный световой выключатель на 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
Автор
Редакция

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро