Sytuacja jest taka. Mamy tu dwa termostaty na channel #1 i #4. Jest przekaźnik z funkcją "heat or cold switch".
Bramka startuje, rejestrują się poprawnie termostaty w przekaźniku. Przekaźnik zostaje wyłączony:
Code: Select all
RelayHvacAggregator[2] hvac[1 @ 4087EC14] registered
RelayHvacAggregator[2] hvac[4 @ 4083357C] registered
RelayHvacAggregator[2] turn off
Relay[2] turn OFF (duration 0 ms)
Code: Select all
[ 6008][I][z2s_devices_table.cpp:3259] Z2S_onOnOffReceive(): A4:C1:38:CB:C9:C7:EE:96, endpoint 0x1, state 0x1
[ 6008][I][z2s_devices_table.cpp:161] Z2S_findChannelNumberSlot(): A4:C1:38:CB:C9:C7:EE:96, endpoint 0x1, channel type 0xb54
[ 6009][I][Z2S_virtual_relay.cpp:497] Z2S_setOnOff(): durationMs = 0, storedTurnOnDurationMs = 0, durationTimestamp = 0, keepTurnOnDurationMs = 0
Channel(2) value changed to 1
No i ten RelayHvacAggregator (który zarządza tym całym interesem) czyta "isOn()" i cału czas dostaje, że jest "off", więc wg niego jest wszystko ok
Bramka tutaj dobiera się do kanałów i przestawia stan na kanale, zamiast użyć metody turnOn/turnOff.
Ogólnie interfejsy klas w Supli nie są najlepiej zrobione i jest tam trochę błędnych decyzji z przeszłości. Pewnie najlepiej by było gdyby Channel jako taki był schowany, aby się do niego nie dobierać bezpośrednio (chyba, że pisze się implementację klasy zarządzającej tym kanałem
Ten sam problem by wyszedł, jeśli np. podłączycie sobie lokalnie czujnik binarny (albo przycisk?) i na zmianę stanu wywołacie lokalną akcję TOGGLE. Wtedy pierwsza reakcja nie zadziała poprawnie (sprawdz isOn, wyjdzie, że jest off, więc zrobi turnOn i spróbuje włączyć włączone gniazdko
Także moja propozycja jest taka, aby obsługa przekaźnika na bramce nie grzebała samodzielnie w Channel, tylko użyła metody "turnOn/Off" na instancji VirtualRelay.
A ja się zastanowię jak tą lukę w bibliotece załatać
