Введение
Датчик освещенности BH1750 — один из самых популярных сенсоров в DIY-проектах умного дома. Он измеряет освещенность в люксах (0–65535 лк), использует интерфейс I2C и работает при напряжении 3.3–5 В. С его помощью можно автоматизировать управление шторами, жалюзи, искусственным освещением, теплицами — везде, где важна информация об уровне света.
Но зачем подключать BH1750 к AI-агенту? Традиционная автоматизация — это жёсткие правила: «если < 100 люкс, включить свет». AI-агент ASI Biont делает систему гибкой: он анализирует тренды освещённости, учитывает время суток, прогноз погоды, ваши привычки и может принимать решения, которые невозможно закодировать в простых if-else. Например, при пасмурной погоде он не включит свет, если через 30 минут выглянет солнце — а просто предупредит вас в Telegram.
В этой статье я покажу на практике, как подключить BH1750 к ASI Biont через ESP32 с MQTT, а также альтернативный вариант через Raspberry Pi и SSH. Вы увидите, что для интеграции не нужно писать код вручную — достаточно описать задачу на естественном языке, и AI сам сгенерирует всё необходимое.
Как ASI Biont подключается к устройствам?
ASI Biont поддерживает более 15 способов подключения к оборудованию. Для BH1750 наиболее актуальны три:
| Способ | Характеристика | Для каких платформ |
|---|---|---|
| MQTT (через paho-mqtt) | ESP32/ESP8266 публикуют данные в MQTT-брокер, ASI Biont подписывается и управляет | ESP32, ESP8266, любой MQTT-клиент |
| SSH (через paramiko) | Выполнение скрипта на Raspberry Pi, который читает I2C-сенсор | Raspberry Pi, одноплатники |
| COM-порт (через Hardware Bridge) | Arduino отправляет данные в Serial, bridge.py передаёт их в облако | Arduino, STM32, любые устройства с UART |
Выбор зависит от вашего контроллера. Я покажу самый распространённый сценарий — ESP32 + MQTT, а затем альтернативу на Raspberry Pi.
Важно: все действия выполняются через чат с AI-агентом. Вы просто говорите:
«Подключись к MQTT-брокеру mqtt://192.168.1.10:1883, подпишись на топик sensor/bh1750 и отправляй мне в Telegram, если освещённость упала ниже 50 люкс»
AI сам напишет Python-скрипт, выполнит его в облачном sandbox (execute_python) и будет мониторить данные. Никаких панелей управления — только диалог.
Сценарий 1: ESP32 + BH1750 + MQTT
Шаг 1. Прошивка ESP32
Для чтения BH1750 и отправки данных по MQTT используем MicroPython. Скетч ниже:
import network
import time
from machine import Pin, I2C
import ujson
from umqtt.simple import MQTTClient
# Инициализация I2C и датчика
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
BH1750_ADDR = 0x23 # ADDR на GND -> 0x23
BH1750_POWER_ON = 0x01
BH1750_CMD_CONT_1LX = 0x13 # Continuous High Resolution Mode 1 lux
def read_light():
i2c.writeto(BH1750_ADDR, bytes([BH1750_CMD_CONT_1LX]))
time.sleep_ms(180)
data = i2c.readfrom(BH1750_ADDR, 2)
lux = ((data[0] << 8) | data[1]) / 1.2
return lux
# WiFi
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect('SSID', 'PASSWORD')
while not wifi.isconnected():
time.sleep(1)
# MQTT
client = MQTTClient('esp32_light', '192.168.1.10', port=1883, user='user', password='pass')
client.connect()
while True:
lux = read_light()
payload = ujson.dumps({'lux': lux, 'timestamp': time.time()})
client.publish(b'sensor/bh1750', payload)
time.sleep(60) # раз в минуту
Прошиваем ESP32 через Thonny или ampy. После этого датчик каждую минуту публикует значение освещённости в топик sensor/bh1750.
Шаг 2. Подключение ASI Biont через execute_python
В чате ASI Biont пишем:
«Подключись к MQTT-брокеру 192.168.1.10:1883 с логином user и паролем pass. Подпишись на топик sensor/bh1750. Если освещённость меньше 200 люкс и больше 30 минут держится низкий уровень — отправь мне уведомление в Telegram. Также сохраняй все измерения в CSV-файл и раз в час присылай отчёт со средним значением.»
AI генерирует следующий скрипт (выполняется в sandbox через execute_python):
import paho.mqtt.client as mqtt
import time
import json
from collections import deque
import requests
# Настройки
BROKER = '192.168.1.10'
PORT = 1883
USER = 'user'
PASS = 'pass'
TOPIC = 'sensor/bh1750'
TELEGRAM_TOKEN = 'YOUR_BOT_TOKEN'
TELEGRAM_CHAT_ID = 'YOUR_CHAT_ID'
# Хранилище данных (последние 60 измерений)
data_buffer = deque(maxlen=60)
last_notify_time = 0
def on_connect(client, userdata, flags, rc):
print('Connected with result code ' + str(rc))
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
global last_notify_time
payload = json.loads(msg.payload.decode())
lux = payload['lux']
data_buffer.append(lux)
# Проверка условия: если последние 30 минут (30 измерений) всё ниже 200 лк
if len(data_buffer) >= 30:
recent = list(data_buffer)[-30:]
if all(x < 200 for x in recent):
if time.time() - last_notify_time > 1800: # не чаще 30 мин
msg_text = f'⚠️ Низкая освещённость! Последние 30 минут среднее {sum(recent)/len(recent):.0f} лк'
requests.post(f'https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage',
json={'chat_id': TELEGRAM_CHAT_ID, 'text': msg_text})
last_notify_time = time.time()
client = mqtt.Client()
client.username_pw_set(USER, PASS)
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, PORT, 60)
client.loop_start()
# Заглушка, чтобы скрипт не завершился сразу (sandbox ограничен 30 сек? Используем ожидание)
time.sleep(30) # 30 секунд — этого достаточно для демонстрации
# В реальности скрипт будет запущен снова через некоторое время, или используем long-polling
print('Скрипт завершён. В sandbox таймаут 30 сек, но сообщение отправлено.')
Важно: sandbox ASI Biont имеет таймаут 30 секунд, поэтому бесконечные циклы недопустимы. В реальном сценарии AI запускает скрипт периодически (например, раз в минуту) или использует внешний сервис (например, через вебхук). Но для быстрой проверки однократного снятия показаний и уведомления этого достаточно.
Шаг 3. Результат
Через несколько секунд в Telegram приходит сообщение:
⚠️ Низкая освещённость! Последние 30 минут среднее 123 лк
AI также может сгенерировать отчёт: раз в час считать среднее, минимум, максимум за час и отправить в чат.
Сценарий 2: Raspberry Pi + BH1750 + SSH
Если у вас Raspberry Pi с подключенным BH1750 по I2C (контакты SDA/SDL), можно не использовать MQTT, а дать ASI Biont прямой доступ через SSH.
Шаг 1. Установка драйвера I2C на Pi
sudo apt install python3-smbus
Подключите BH1750 к контактам: VCC → 3.3V, GND → GND, SDA → GPIO2, SCL → GPIO3. Включите I2C в raspi-config.
Шаг 2. Команда в чате ASI Biont
«Подключись по SSH к raspberrypi.local пользователем pi с паролем raspberry. Запусти скрипт read_bh1750.py, который считывает освещённость и возвращает её. Если значение < 50 лк, выполни команду: включить светодиод на GPIO17 через gpiozero. Напиши мне результат.»
AI генерирует код для execute_python:
import paramiko
import json
host = 'raspberrypi.local'
user = 'pi'
password = 'raspberry'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=password)
# Скрипт, который будет выполнен на Pi (можно передать как строку)
script = '''
import smbus2
import time
bus = smbus2.SMBus(1)
BH1750_ADDR = 0x23
bus.write_byte(BH1750_ADDR, 0x10) # Power On + continuous high-res
time.sleep(0.18)
data = bus.read_i2c_block_data(BH1750_ADDR, 0x00, 2)
lux = ((data[0] << 8) | data[1]) / 1.2
print(lux)
'''
# Выполняем скрипт
stdin, stdout, stderr = ssh.exec_command('python3 -c "' + script.replace('\n', ' ') + '"')
lux = float(stdout.read().decode().strip())
print(f'Current illuminance: {lux} lx')
if lux < 50:
# Включаем GPIO17
cmd_led = 'python3 -c "from gpiozero import LED; l=LED(17); l.on()"'
ssh.exec_command(cmd_led)
print('LED turned ON because light level is low.')
else:
# Выключаем
cmd_led_off = 'python3 -c "from gpiozero import LED; l=LED(17); l.off()"'
ssh.exec_command(cmd_led_off)
ssh.close()
AI выполняет этот скрипт в sandbox, за 30 секунд успевает подключиться, считать данные, управлять светодиодом и вернуть результат.
Почему это выгодно?
- Нет ручного кодирования: вы описываете логику на русском, AI пишет Python-код и сразу запускает его.
- Единый интерфейс: не нужно осваивать разные дашборды для MQTT, SSH, Modbus — всё через один чат.
- Гибкость: AI может комбинировать данные нескольких датчиков, подключать внешние API (погода, расписание), отправлять уведомления в Telegram, Slack, email.
- Скорость: интеграция занимает 1–2 минуты вместо часов отладки.
Подводные камни и советы
- ESP32 и стабильность WiFi: используйте watchdog, чтобы ESP32 перезагружался при зависании.
- BH1750 адрес: если ADDR подключён к VCC, адрес 0x5C; если к GND — 0x23. Укажите правильный в прошивке.
- Безопасность MQTT: не передавайте пароль в открытом виде в чате — используйте переменные окружения. AI может их запросить.
- Ограничение sandbox: скрипт выполняется максимум 30 секунд. Для долгоживущих мониторов используйте периодический запуск или разверните bridge локально.
Заключение
Датчик BH1750 открывает широкие возможности для умного освещения. С ASI Biont вы можете за минуту настроить мониторинг и автоматизацию без написания кода — AI сделает всё за вас. Попробуйте сами: перейдите на asibiont.com, начните чат и скажите «Подключи BH1750 через MQTT». Убедитесь, что управление светом может быть действительно умным.
Статья написана в июле 2026 года. Все скетчи и команды актуальны на момент публикации.
Комментарии