6.4 KiB
esp32-ir
ИК приёмник/передатчик на ESP32-C6, управляемый локально через REPL или удалённо по HTTP API.
- Приёмник — GPIO20
- Передатчик — GPIO19
Файлы
| Файл | Назначение |
|---|---|
capture.py |
захват ИК-сигнала с приёмника |
transmit.py |
воспроизведение сохранённого сигнала через ИК-светодиод (PWM 38кГц) |
wifi_server.py |
HTTP-сервер для удалённого управления |
.env |
секреты (WiFi, API-ключ) — см. ниже |
main.py |
автозапуск сервера при включении платы |
dotenv.py |
самописный экземпляр для получения переменных окружения |
Локальное использование (через REPL)
Воспроизвести сигнал по имени
from transmit import send_code
send_code("power")
Сделать новую запись
from capture import capture_raw, save_code
data = capture_raw()
save_code("name", data)
Посмотреть записи
from capture import list_codes
list_codes()
Удалить старые файлы/коды
import os
os.remove("test.py") # удалить конкретный файл
import json
with open("codes.json", "w") as f:
json.dump({}, f) # очистить все коды
HTTP API
Запуск сервера вручную
import wifi_server
wifi_server.main()
При старте сервер подключается к WiFi (данные из .env) и выводит в консоль свой IP:
WiFi подключен. IP адрес: 192.168.1.123
Сервер запущен: http://192.168.1.123/
Автозапуск
Сервер поднимается автоматически при каждом включении/перезагрузке платы через main.py:
import wifi_server
wifi_server.main()
Конфигурация (.env)
WIFI_SSID=ИмяСети
WIFI_PASSWORD=Пароль
API_KEY=длинный_секретный_ключ
Если API_KEY не задан — сервер работает без авторизации (только для локальных тестов).
Авторизация
Все эндпоинты, кроме /, требуют ключ из API_KEY. Передавайте его любым из двух способов:
Query-параметр:
?key=длинный_секретный_ключ
Заголовок:
X-API-Key: длинный_секретный_ключ
Без ключа или с неверным — ответ 401 Unauthorized.
Эндпоинты
| Метод | Путь | Описание |
|---|---|---|
GET |
/ |
статус сервера, список эндпоинтов (без авторизации) |
GET |
/list |
список сохранённых кодов с количеством импульсов |
GET |
/send?code=ИМЯ |
воспроизвести сохранённый код |
GET |
/record?code=ИМЯ&timeout_ms=5000 |
записать новый код (наведите пульт и нажмите кнопку в течение timeout_ms) |
GET |
/delete?code=ИМЯ |
удалить сохранённый код |
Примеры использования
Проверить, что сервер жив:
curl http://192.168.1.123/
Посмотреть список записанных команд:
curl "http://192.168.1.123/list?key=длинный_секретный_ключ"
{"codes": {"power": 67, "tv_power": 23, "light_toggle": 67}}
Воспроизвести команду:
curl "http://192.168.1.123/send?code=power&key=длинный_секретный_ключ"
{"status": "ok", "sent": "power"}
Записать новую команду (после запроса наведите пульт на приёмник и нажмите кнопку):
curl "http://192.168.1.123/record?code=fan_speed1&key=длинный_секретный_ключ"
{"status": "ok", "saved": "fan_speed1", "pulses": 67}
Если сигнал не поймали за отведённое время — 408 Request Timeout.
Удалить команду:
curl "http://192.168.1.123/delete?code=fan_speed1&key=длинный_секретный_ключ"
{"status": "ok", "deleted": "fan_speed1"}
С заголовком вместо query-параметра:
curl -H "X-API-Key: длинный_секретный_ключ" "http://192.168.1.123/send?code=power"
Заметки
- Сервер однопоточный: во время
/record(ожидание сигнала с пульта) остальные запросы не обрабатываются. - Трафик идёт по обычному HTTP без шифрования — ключ защищает от случайных запросов в локальной сети, но не является криптостойкой защитой.
- IP адрес платы может меняться при переподключении к роутеру — для стабильности рекомендуется закрепить IP за MAC-адресом в настройках роутера (DHCP reservation).