Files
fgl-aircon/docs/README.md
Petr Polezhaev b21817ab9f docs: корректировки планов — монорепо, слои ayla/aircon, конверсии, приёмка
- PLAN_CORE: монорепозиторий (CMakeLists в корне; components/fglair,
  custom_components/fglair, include/fgl-aircon, src/{ayla,aircon},
  src/ayla/platform); логическое разделение ay­la (протокол+цикл) /
  aircon (конверсии+шаблоны+API); тесты зеркалят слои (tests/{ayla,aircon});
  конверсии: шаблон / линейные коэффициенты / функция-указатель
  (лямбды ESPHome); оценка httpd/json (jsmn вендор, свой мини-httpd на
  BSD-сокетах, conan не нужен); README библиотеки в M4.
- PLAN_ESPHOME: host вместо ip_address (DNS + Ayla-mDNS :10276),
  секреты в примерах, кастомные конверсии через !lambda, advanced-пример
  (триггеры режимов + LVGL с пропусками), README-план, скрипт приёмки
  (aioesphomeapi + HA REST).
- PLAN_HOME_ASSISTANT: шаг config flow с превью рассчитанных значений
  шаблона (через cffi в C-ядро, без дублей), README с HACS-инструкцией
  и заглушками под скриншоты с описаниями, приёмка (long-lived token).
- Убраны реальные dsn/ip/lanip_key/key_id из примеров; probe_mdns.py
  принимает DSN аргументом.
2026-09-21 13:20:29 +03:00

97 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# aircon / FGLair local control
Реконструкция LAN-протокола FGLair (Fujitsu General, платформа Ayla) и планы
монорепозитория стека локального управления кондиционером: базовая C++
библиотека + интеграции ESPHome и Home Assistant.
## Состав репозитория (целевая структура)
```
CMakeLists.txt # базовая библиотека (корень)
include/fgl-aircon/ # публичный API (уровень aircon: конверсии, шаблоны)
src/ayla/ # протокол Ayla LAN + главный цикл сообщений
platform/{posix,esp-idf}/ # платформенный слой
src/aircon/ # конверсии, шаблоны A/B/F, реализация API
third_party/jsmn/ # вендоренный JSON-парсер (MIT)
components/fglair/ # ESPHome external component
custom_components/fglair/ # Home Assistant custom component
tests/{ayla,aircon}/ # тесты протокола / конверсий и шаблонов
tests/acceptance/ # полуавтоматическая приёмка ESPHome<->HA
tools/ # probe_reference.py, probe_mdns.py, fglair-discover
docs/ # документация (ниже) + материалы анализа
```
## Документация
| Файл | Назначение |
|------|-----------|
| `PROTOCOL.md` | Спецификация LAN-протокола: шифрование, эндпоинты, машина состояний, тайминги, свойства FGLair. Для людей и агентов. Факты помечены `[APK]` / `[LEGACY]` / `[ПРОВЕРЕНО НА ПРИБОРЕ]` / `[HYP]`. |
| `LEGACY_ANALYSIS.md` | Разбор legacy-скрипта: что верно, баги, причины «рассинхронизации ключей» и перегрузки модуля. |
| `PLAN_CORE_LIBRARY.md` | План C++20-библиотеки `fgl-aircon` (Linux + ESP-IDF): слои ayla/aircon, конверсии, оценка httpd/json-библиотек, монорепо-структура. |
| `PLAN_HOME_ASSISTANT.md` | План HA-интеграции: pyfglair (cffi wheel), config flow с превью шаблона, HACS-README со скриншотами. |
| `PLAN_ESPHOME.md` | План ESPHome-компонента: host+DNS, секреты, кастомные конверсии-лямбды, advanced-пример, приёмка. |
| `legacy/` | Изменённый legacy-скрипт (форк [gyro-labs/AirCon](https://github.com/gyro-labs/AirCon) / hisense_ac): `main.py` + пакет `aircon/`. Локальный `config_kata.json` не версионируется (содержит lanip_key). |
| `apk/` | Материалы анализа APK FGLair 3.4.3 (`manifest.json`; .apk-бинарники лежат локально, не версионируются). |
## Краткая выжимка протокола
* Модуль кондиционера (порт 80) сам подключается к серверу приложения (порт 10275):
`local_reg.json` (keep-alive/notify) → `key_exchange.json` → poll
`commands.json` + push `property/datapoint.json`.
* Шифрование: AES-256-CBC (no-padding, zero-pad) + HMAC-SHA256; ключи выводятся
из облачного `lanip_key` и двух пар (random, time). **CBC-цепочка непрерывна
в рамках сессии**.
* **Ключевая механика надёжности** (проверено на приборе): модуль игнорирует
400/401-ответы; единственное самолечение — принудительный re-key, который
модуль делает при получении `local_reg` для сессии старше ≈44 с. Поэтому
keep-alive должен быть 10–15 с — тогда любая рассинхронизация живет секунды,
а не 20 минут (как в legacy-скрипте с интервалом 1200 с).
* Максимум 2 LAN-сессии (телефон + сервер уживаются), третья — HTTP 503.
* Записи свойств не эхируются — состояние обновляется оптимистично,
подтверждение через GET.
* Свойства FGLair (шаблоны A/B/F по oem_model): `operation_mode` (0..6),
`fan_speed` (0..4), `adjust_temperature` (×0.1 °C), `display_temperature`
((v−5000)/100 °C), swing/заслонки, флаги economy/powerful/…, битмаски
`op_status`, `device_capabilities`. Полные таблицы — в PROTOCOL.md §8.
## Ключевые решения (по уточнениям владельца)
* Монорепозиторий: библиотека в корне, `components/fglair` (ESPHome),
`custom_components/fglair` (HA); тесты зеркалят слои (`tests/ayla`,
`tests/aircon`); библиотека логически разделена на `src/ayla` (протокол)
и `src/aircon` (конверсии/шаблоны/API), публичный интерфейс —
`include/fgl-aircon/`.
* Конверсии свойств задаются шаблоном по умолчанию, коэффициентами
(linear) или функцией-указателем (ESPHome — лямбды, HA — коэффициенты
+ превью рассчитанных значений при настройке).
* `lanip_key` **статичен** (зашит в модуль; за 5 лет ротаций не было).
Облако — только provisioning (HA config flow, CLI `fglair-discover`);
для ESPHome ключ копируется из диагностики HA или CLI. При несовпадении
`key_id` — устойчивая ошибка, лечение правкой конфига вручную.
* ESPHome: везде ESP-IDF framework, подключение по `host` (DNS/mDNS), все
чувствительные значения — через `!secret`.
* HTTP/JSON: собственный мини-httpd/httpc на BSD-сокетах (одна реализация
для lwip/posix) + вендоренный jsmn; esp_http_server/cJSON/ArduinoJson
отвергнуты (обоснование — PLAN_CORE §7). Conan не нужен.
* Приёмка: полуавтоматический скрипт `tests/acceptance/` (HA long-lived
token + REST, ESPHome через aioesphomeapi; quick/burst и 24-часовой
режимы).
## Порядок реализации
1. `fgl-aircon` (M0–M4) — ядро (ayla → aircon), mock-тесты; эталон
`tools/probe_reference.py` уже проверен на приборе.
2. `pyfglair` + HA-интеграция (H1–H5) — параллельно с E1–E2.
3. ESPHome-компонент (E1–E4).
4. Приёмочные прогоны (quick + 24 ч), README компонентов.
5. Уточнение оставшихся неизвестных (PROTOCOL.md §10) по мере эксплуатации.
## Источники
* APK FGLair 3.4.3 (`apk/com.fujitsu.fglair.apk`): классы
`com.aylanetworks.aylasdk.lan.*`, `com.fujitsugeneral.aylasdk.*`,
`com.cafbit.netlib.dns.NetThread`, JS-бандл `assets/www/dist/build.js`.
* Legacy-скрипт (`legacy/`) — изменённый форк gyro-labs/AirCon (hisense_ac).
* Живые эксперименты на AP-WC1E (сентябрь 2026): сессии, re-key, 401/400,
слоты/503, delete_session, записи, mDNS. Рабочие артефакты — `tools/`.