Skip to content

feat: multi-device support + HA discovery and energy fixes#1

Open
SobolevTim wants to merge 1 commit into
masterfrom
feature/multi-device-support-and-bugfixes
Open

feat: multi-device support + HA discovery and energy fixes#1
SobolevTim wants to merge 1 commit into
masterfrom
feature/multi-device-support-and-bugfixes

Conversation

@SobolevTim

Copy link
Copy Markdown
Owner

Summary

  • Мультиустройство: хаб теперь поддерживает до 4 метеодатчиков и 4 датчиков сети одновременно без изменений прошивки устройств (маршрутизация по deviceId из заголовка пакета)
  • 6 исправлений багов: влажность в HA, группировка устройств в HA, переполнение буфера, RSSI не публиковался, счётчик энергии застревал после сброса, обрыв фазы

Изменения

Мультиустройство

  • MeteoDeviceSlot[4] и PowerDeviceSlot[4] вместо глобальных переменных-синглтонов
  • findOrAllocMeteoSlot / findOrAllocPowerSlot — поиск слота по deviceId или выделение нового
  • Каждый слот: discoveryPublished, pendingPublication, lastEnergy[], allowEnergyBackstep
  • Аннотации потоковой принадлежности полей: [mutex], [core0], [core1]
  • NVS-персистентность с индексированными ключами (mt0_*, mt1_*, pw0_*) — все ≤12 символов
  • Веб-интерфейс и /api итерируют все активные слоты

Bug fixes

# Проблема Исправление
1 Влажность "Unavailable" в HA nullptr вместо -999.0 при FLAG_AHT_ERROR
2 Устройства не группируются в HA device["identifiers"] → JSON array через createNestedArray
3 Переполнение буфера в discovery char message[512][1024] + sizeof(message) guard
4 RSSI не публиковался в HA Добавлен serializeJson + publish перед секцией флагов
5 Счётчик энергии застревал после сброса PZEM backstepObserved флаг — allowEnergyBackstep очищается только при реальном уменьшении
6 Обрыв фазы: только voltage обнулялся Все 4 поля (voltage/current/power/pf) → 0 при недоступной фазе

Test plan

  • Прошить хаб, подключить 1 метеодатчик — убедиться что данные появляются в HA
  • Подключить второй метеодатчик с другим deviceId — оба должны появиться отдельными устройствами в HA
  • Проверить влажность в HA при рабочем AHT20
  • Отключить одну фазу PZEM — voltage/current/power/pf должны показать 0, энергия — сохранить последнее значение
  • Перезапустить хаб — данные должны восстановиться из NVS
  • Проверить /api — должен вернуть массивы meteo[] и power[]

🤖 Generated with Claude Code

Adds support for up to 4 simultaneous meteo sensors and 4 power meters
in the hub without requiring firmware changes on the sensor devices
(deviceId from PacketHeader is used for slot routing).

Bug fixes:
- Fix humidity showing "Unavailable" in HA: send JSON null when AHT20
  reports FLAG_AHT_ERROR, instead of -999.0 which HA 2024+ rejects
- Fix HA device grouping: device["identifiers"] was a JSON string,
  now correctly a JSON array via createNestedArray("identifiers")
- Fix buffer overflow in discovery messages: char message[512] → [1024]
  with sizeof(message) guard on serializeJson
- Fix RSSI sensor not published: serializeJson+publish was missing before
  the flags section in publishMeteoDiscovery and publishPowerDiscovery
- Fix energy counter stuck after PZEM reset: introduced backstepObserved
  flag so allowEnergyBackstep is only cleared when an actual decrease
  is observed, not on every packet
- Fix phase disconnect: all four fields (voltage/current/power/pf) set
  to 0 when phase is unavailable; energy omitted so HA retains last value

Multi-device architecture:
- MeteoDeviceSlot[4] and PowerDeviceSlot[4] arrays replace singletons
- findOrAllocMeteoSlot / findOrAllocPowerSlot with deviceId lookup
- Per-slot: discoveryPublished, pendingPublication, lastPublishAttempt,
  lastEnergy[], phaseEnergyInit[], allowEnergyBackstep
- Thread ownership annotations: [mutex], [core0], [core1]
- NVS persistence with indexed keys (mt0_*, mt1_*, pw0_*, pw1_*)
  all ≤12 chars, within ESP-IDF 15-char NVS key limit
- Web UI iterates all valid slots, shows 0x%04X deviceId per device
- handleCommand reads deviceId hex arg for per-device command routing
- handleApi returns JSON arrays for all meteo and power slots

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant