2026-08-18 17:56:40 +05:00
2026-08-17 09:21:17 +00:00
1
2026-08-17 22:09:15 +05:00
2026-08-17 09:21:01 +00:00
1
2026-08-17 22:09:15 +05:00
1
2026-08-17 22:09:15 +05:00
2026-08-17 09:18:33 +00:00
2
2026-08-18 17:56:40 +05:00
2
2026-08-18 17:56:40 +05:00
2
2026-08-18 17:56:40 +05:00
2
2026-08-18 17:56:40 +05:00

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).
S
Description
No description provided
Readme AGPL-3.0
58 KiB
Languages
Python 100%