petr.polezhaev
3e0b6b3653
ha(H3): превью шаблона с конверсиями; climate и сущности
...
- config flow: шаг preview (шаблон A/B/F, диапазон/шаг уставки, линейные
коэффициенты num/den/offset, текст-превью по данным trial: hvac/fan/
swing/capabilities/текущая температура)
- coordinator: push-driven DataUpdateCoordinator (снимок кэша, доступность
online/recovering, первичный GET-батч, один batch_commit на действие)
- overrides.py: ConversionSet (ручные линейные конверсии и диапазон поверх
таблиц ядра, применяются в HA)
- entity.py: DeviceInfo/unique_id/доступность, capabilities-фильтры
- climate: hvac/fan/swing/vertical+horizontal swing/preset ECO-BOOST,
уставка 16-30 °C (шаг по шаблону), current_temperature
- sensor: room_temperature, error_code, connection_state (диагностика)
- binary_sensor: connectivity + флаги op_status (PROTOCOL §8.4)
- switch: 8 флагов-свойств; select: положения заслонок 0..N-1
- тесты: превью/конверсии/ошибки диапазона, сущности против mock_ac
(снимок, команды, capabilities-фильтр, ручная конверсия), ConversionSet
- mock_ac: --set NAME=VALUE (0b/0x) для сценариев
- план: demand_control отложен (семантика не зафиксирована)
2026-09-29 12:44:34 +03:00
petr.polezhaev
29f62b639c
ha(H2): ниты повторного ревью — pump без параллельных читателей, pending-рефкаунт, точная ошибка свойств
...
- session.py: новый лог-памп не поднимается, пока предыдущий не завершился
(stopping/is_alive), параллельное чтение кольца исключено
- __init__: счётчик pending закрывает окно гонки setup/unload последней
записи; warning при не-словарном fglair: в YAML
- trial: properties_missing — отдельная ошибка формы/abort (en/ru/strings)
- ConfigEntryNotReady: «порт 0» больше не показывается
- тесты: контраст одинакового явного порта, неблокирующий unload (тикер loop)
- план H5: публикация pyfglair именно на PyPI (manylinux x86_64/aarch64)
2026-09-29 12:29:35 +03:00
petr.polezhaev
da01c607a6
ha(H2): исправления по ревью — несколько устройств, suggested values, YAML-import, типы ошибок
...
- critical: listen_port по умолчанию 0 (эфемерный) — несколько ConfigEntry
не конфликтуют; тест двух записей на дефолтном порту
- manifest: добавлен обязательный ключ codeowners
- unload: set_log_handler(None) вынесен в executor (не блокирует loop);
рефкаунт лог-пампа без гонки (старт после успешного setup)
- config flow: возврат введённого в форму при ошибке
(add_suggested_values_to_schema; секреты исключены), YAML-import подключён
через async_setup + SOURCE_IMPORT, ProvisionError.kind вместо разбора
русского текста, валидация device_port/key_id из JSON
- trial: требует получения всех базовых свойств шаблона (не пустой ok),
безопасное создание Session
- py-ci.sh: отсутствие .venv-ha — ошибка (PY_CI_SKIP_HA=1 для пропуска);
pytest.ini testpaths
2026-09-29 12:20:37 +03:00
petr.polezhaev
26d1d6d64f
ha(H2): компонент fglair — manifest, config flow (облако/ручной/импорт), пробная сессия
...
- custom_components/fglair: manifest (config_flow, local_push, requirements),
const, trial (start -> ONLINE <=10 c -> GET базовых свойств), FglairClient
(сессия pyfglair в executor, колбэки в loop, --runtime_data),
__init__ (setup/unload, рефкаунт глобального лог-пампа)
- config flow: меню cloud/manual/import_json + import-source; discover через
pyfglair.provision; пробное подключение с диагностикой (cannot_connect,
no_slots, key_mismatch, timeout, invalid_auth, invalid_import); unique_id=dsn
- strings.json + translations/{en,ru}.json
- тесты HA (pytest-homeassistant-custom-component): меню/шаги/ошибки/импорт/
облако (discover замокан), setup/unload, занятый порт; trial против
mock_ac.py (online/key_mismatch/unreachable/no_slots)
- pytest.ini (общий), tests/conftest перенесён на уровень tests/,
scripts/py-ci.sh: --setup-ha и прогон tests/components
2026-09-29 12:03:44 +03:00
petr.polezhaev
b84bd8d555
ha(H1): исправления по ревью — жизненный цикл сессии, самодостаточный wheel
...
- C1: единственный владелец stop+destroy — reader-поток; close() только
выставляет флаг и ждёт; повторный close и close из колбэка безопасны
(регресс-тесты; TSan на close с мёртвым модулем — 0 гонок)
- M1: wheel собирается с bundled mbedtls (нет внешней soname mbedcrypto);
попутно исправлена bundled-ветка CMake (-lSTATIC)
- C-API: счётчики потерянных событий/логов, лог-кольцо без union-балласта,
атомарные fn/ctx лог-синка
- provision: валидация формата облачных ответов; CLI: человеческие ошибки
(exit 2), --out с правами 0600, console_script pyfglair
- упаковка: MANIFEST.in (sdist с C++-исходниками), очистка stale .so,
readme в метаданных; find_library без ложных .bak
- тесты: close-сценарии, доставка логов, ошибки CLI/provision, C-API очередь
2026-09-29 11:48:32 +03:00
petr.polezhaev
0292404756
ha(H1): pyfglair — cffi-ядро (очередь событий), wheel, CLI discover/monitor
...
- CMake: shared-таргет fgl-aircon-shared (FGL_BUILD_SHARED, PIC, SOVERSION)
- C-API: fgl_prop_raw_range + кольцевые очереди событий/логов
(fgl_session_poll/wait_events, fgl_log_poll/wait_events): прямые колбэки
из потоков ядра со стеком 8 КБ небезопасны для интерпретатора Python
- pyfglair: _corebuild (cmake->wheel), _cffi (ABI), Session (reader-поток ->
loop.call_soon_threadsafe), templates (интроспекция C-таблиц), provision
(aiohttp), CLI discover/monitor + esphome-secrets
- setup.py/pyproject: платформенный wheel py3-none-linux_x86_64 с .so
- tests/pyfglair: templates, provision (мок-облако), session + CLI против
mock_ac.py; scripts/py-ci.sh; ci.sh запускает python-часть
2026-09-29 11:31:57 +03:00
petr.polezhaev
301cf5cf70
docs: корректировки планов — монорепо, слои ayla/aircon, конверсии, приёмка
...
- PLAN_CORE: монорепозиторий (CMakeLists в корне; components/fglair,
custom_components/fglair, include/fgl-aircon, src/{ayla,aircon},
src/ayla/platform); логическое разделение ayla (протокол+цикл) /
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
petr.polezhaev
9469f0104c
refactor: legacy и apk перенесены в docs/, дедупликация исходников legacy
...
- docs/legacy/: рабочая раскладка изменённого форка (main.py + пакет
aircon/); плоские дубликаты .py удалены, вложенный .git клона удалён
(это изменённая копия, а не чистый клон), __pycache__ и .gitignore
апстрима убраны. Локальный config_kata.json не версионируется
(содержит lanip_key устройства).
- docs/apk/: манифест APK; бинарники *.apk и icon.png не версионируются.
- Обновлены пути в документации и tools/.
2026-09-17 19:48:55 +03:00
petr.polezhaev
359203abfe
docs: реконструкция LAN-протокола FGLair, анализ legacy, планы fglair-core/HA/ESPHome
...
- PROTOCOL.md: полная спецификация (KDF, envelope/CBC-цепочка, local_reg,
key exchange, commands.json 206/200, datapoint push, тайминги, таблицы
свойств шаблонов A/B/F, облачный provisioning). Факты из APK помечены
[APK], проверенные живыми экспериментами на AP-WC1E — [ПРОВЕРЕНО НА
ПРИБОРЕ]: mDNS только :10276; лимит 2 LAN-сессии (3-я -> 503);
принудительный re-key при возрасте сессии >= ~44с (единственный механизм
самолечения десинхрона — 400/401 модуль игнорирует); записи не
эхируются; delete_session освобождает слот.
- LEGACY_ANALYSIS.md: причины рассинхрона (keep-alive 1200с вместо 10-15с
+ seq_no-фильтр) и перегрузки модуля; требования к новой реализации.
- PLAN_CORE_LIBRARY.md: план C++20-библиотеки fglair-core (Linux + ESP-IDF),
ключ lanip_key считается статичным, ротация — только ошибка + ручной
перепровижининг.
- PLAN_HOME_ASSISTANT.md: pyfglair (cffi wheel) + custom component,
облачный provisioning только в config flow, ключ виден в диагностике
для копирования в ESPHome.
- PLAN_ESPHOME.md: external component, только ESP-IDF framework.
- tools/probe_reference.py: эталонный клиент протокола (проверен на
приборе end-to-end); tools/probe_mdns.py — mDNS-проба.
- legacy/: снимок скрипта (апстрим gyro-labs/AirCon, вложенный клон не
версионируется); apk/*.apk исключены из версионирования.
2026-09-17 19:44:49 +03:00