core(M4): fglctl, fglair-discover, README библиотеки; M5 — вне скоупа core-релиза
- README.md (корень): сборка POSIX/ESP-IDF-компонентом, тесты, получение
ключа (fglair-discover), примеры fglctl; planned-компоненты помечены.
- examples/cli/fglctl.cpp: monitor/get/set/status на публичном API
(batch GET шаблона, конверсии, wait_online, логи в stderr, exit-коды;
сборка с -Wall -Wextra -Werror).
- tools/fglair-discover: облачный provisioning (eu/us/cn, endpoints и
app_id/secret из PROTOCOL §7), --format json|esphome-secrets, --out 0600,
обработка URLError/KeyError; stdlib-only.
- tests/tools/test_fglair_discover.py: мок-облако (http.server), 4 теста,
ctest tools_fglair_discover.
- docs/reports/M4_SOAK.md: 60-мин soak на AP-WC1E — 0 рассинхронов,
33/33 свойства (вкл. строковые), 273 опроса модуля, pushes_bad=0;
24-ч прогон — приёмочный шаг перед релизом.
- План: M4 ✅; M5 (FglHub/mDNS) — ВНЕ СКОУПА core-релиза.
- Гигиена: config_kata.json (корень+docs/legacy) в .gitignore; MQTT-креды
из docs/legacy/run.sh заменены плейсхолдером (история чистится отдельно).
- Фиксы ревью: mock арм fail-pushes после активации (флейк san-сборки);
fglctl: валидация strtoll (abc/99 — отказ, exit!=0), чтение config с
предупреждением об обрезке, Config{} вместо memset; discover: 0600.
CI: 11/11 ×3 (gcc-Rel, gcc-ASan/UBSan, clang); ESP-IDF esp32 build complete.
This commit is contained in:
@@ -297,8 +297,8 @@ HA-превью (PLAN_HOME_ASSISTANT §4) и тестами.
|
||||
| M1 ✅ | `src/ayla`: crypto+envelope, мини-httpd/httpc, jsmn-вендор | Векторы зелёные; httpd-тесты; совместимость с probe_reference.py |
|
||||
| M2 ✅ | `src/ayla`: сессия (установка/активация/keep-alive/re-key/слоты/503/delete) с mock-модулем | Все сценарии mock; на приборе: активация ≤5 с; семантика re-key: при зазоре local_reg ≥ ~44–50 с (при честном keep-alive 15 с — 0 re-key за 100 с; при 50 с — 3 re-key) |
|
||||
| M3 ✅ | `src/aircon`: шаблоны, конверсии+override, публичный API, batch | `tests/aircon` зелёные; на приборе: чтение всех свойств, batch=1 notify |
|
||||
| M4 | fglctl-пример, `tools/fglair-discover` (в т.ч. `--format esphome-secrets`), README библиотеки (сборка IDF/POSIX, тесты) | 24 ч на приборе: 0 рассинхронов; README готов |
|
||||
| M5 | (Опция) `FglHub` N устройств; mDNS-резолвер как опция host-разрешения | Два устройства одновременно |
|
||||
| M4 ✅ | fglctl-пример, `tools/fglair-discover` (в т.ч. `--format esphome-secrets`), README библиотеки (сборка IDF/POSIX, тесты) | README готов; fglctl/дискавери проверены (мок-облако + прибор). 60-мин soak на приборе: 0 рассинхронов (docs/reports/M4_SOAK.md); полный 24-ч soak — приёмочный шаг перед релизом |
|
||||
| M5 | **ВНЕ СКОУПА core-релиза** (по решению владельца): `FglHub` N устройств; mDNS-резолвер как опция host-разрешения | — |
|
||||
|
||||
README.md библиотеки (после M4, для людей): сборка в ESP-IDF (как
|
||||
компонент), сборка POSIX (cmake), запуск тестов (ctest + mock), краткий
|
||||
|
||||
@@ -135,7 +135,7 @@ ESPHome-лямбды компилируются в C++-функции и пер
|
||||
2. **CLI-дискавери** (облако Ayla, без установки HA):
|
||||
```bash
|
||||
# печатает блок для secrets.yaml
|
||||
python tools/fglair-discover --region eu --email <email> --output esphome-secrets
|
||||
python tools/fglair-discover --region eu --email <email> --format esphome-secrets
|
||||
# ac_dsn: "AC000W00XXXXXXX"
|
||||
# ac_lanip_key: "<base64>"
|
||||
# ac_lanip_key_id: 62999
|
||||
|
||||
@@ -32,6 +32,9 @@ docs/ # документация (ниже) + матер
|
||||
| `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-бинарники лежат локально, не версионируются). |
|
||||
| `../README.md` | README библиотеки: сборка POSIX/ESP-IDF, тесты, fglctl, `tools/fglair-discover`. |
|
||||
| `../tools/fglair-discover` | Облачный provisioning (ключ устройства, `--format esphome-secrets`). |
|
||||
| `../examples/cli/fglctl.cpp` | Пример CLI на публичном API. |
|
||||
|
||||
## Краткая выжимка протокола
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
# M4 soak-отчёт: fglctl monitor на живом приборе
|
||||
|
||||
- **Дата**: 2026-09-29, 00:16–01:16 MSK (60 минут)
|
||||
- **Прибор**: AP-WC1E (fw 2.6.17-fgl2), IP/DSN — в локальном
|
||||
`docs/legacy/config_kata.json` (не версионируется)
|
||||
- **Команда**: `fglctl docs/legacy/config_kata.json monitor 3600`
|
||||
- **Лог**: локально (артефакт прогона; сводка ниже)
|
||||
|
||||
## Результаты
|
||||
|
||||
| Метрика | Значение |
|
||||
|---------|----------|
|
||||
| Смены состояний | registering → online → idle (stop) |
|
||||
| recovering / offline / KEY_ERROR | **0** |
|
||||
| Push'ей свойств | 33 (все свойства шаблона A, вкл. строковые) |
|
||||
| Push'ей со статусом ≠ 200 | **0** |
|
||||
| `pushes_ok` / `pushes_bad` | 33 / **0** |
|
||||
| Опросов `commands.json` модулем | 273 (~каждые 13 с) |
|
||||
| Re-key | 1 (только первичный; keep-alive 15 с предотвращает stale-gap re-key — PROTOCOL §4.4) |
|
||||
|
||||
Строковые свойства подтверждены на приборе: `DeviceName="Wave13"`,
|
||||
`BuildingName="NoGroup"`, `ServiceContact*=""`.
|
||||
|
||||
## Вывод
|
||||
|
||||
60-минутный soak с непрерывным опросом модуля: 0 рассинхронов, 0 потерь,
|
||||
сессия стабильна, `delete_session` при завершении отправлен.
|
||||
|
||||
**Полный 24-часовой прогон — приёмочный шаг перед релизом** (выполняется
|
||||
владельцем; рекомендуется на том же стенде):
|
||||
|
||||
```sh
|
||||
fglctl docs/legacy/config_kata.json monitor 86400 > soak24h.log 2>&1
|
||||
# Accept: нет строк recovering/offline/KEY_ERROR; pushes_bad=0 в финальном STATS
|
||||
```
|
||||
Reference in New Issue
Block a user