MichaluxPL / Sofar_LSW3

Get MODBUS data from Sofar (K-TLX) inverter through LSW-3 or LSE module
GNU General Public License v3.0
94 stars 45 forks source link

Add MQTT Auto discovery (device) support for HomeAssistant #29

Closed pablolite closed 2 years ago

pablolite commented 2 years ago

The functionality allows the device (logger) to be automatically detected in HomeAssistant in MQTT integration. Data from daily or total production can be used in the ENERGY tab ha_0 ha_1 ha_2 ha_3

pablolite commented 2 years ago

Funkcjonalność Home Assistant jest przetestowana - używam jej od kilku miesięcy. Jedyne co pozostaje jeszcze zrobić to obsługę wysyłania statusu "offline" inwertera. Aktualnie jak inwerter jest offline to komunikat MQTT nie jest w ogóle wysyłany.

Mechanizm Last will and testament w MQTT zadziała tylko w momencie, gdy nawiązana zostanie komunikacja i zostanie nieprawidłowo zakończona.

MichaluxPL commented 2 years ago

Wrzuciłem kod do rozwiązania, przy czym nie przez pull requesta'a bo trochę go zoptymalizowałem :) Jak możesz to przetestuj i daj znać czy wsio śmiga.

pablolite commented 2 years ago

Przetestowałem. Wygląda na to, że działa :)

Możesz jeszcze dodać to o czym pisałem wcześniej:

if mqtt==1 and invstatus==0:
    if HomeAssistantSupport=="1":
        result=client.publish("Sofar/Logger/"+str(inverter_sn)+"/state/connected","false")
            result.wait_for_publish()
        client.loop_stop()
            client.disconnect()

Dzięki temu, Home Assistant będzie wiedział, że inwerter i jego sensory są nieaktywne, ale sam skrypt działa i aktualizuje stan.

MichaluxPL commented 2 years ago

Dodane:) Przy czym przerobiłem cały wsparcie dla MQTT aby oddzielić wysyłanie komunikatów w podstawowym formacie od integracji z Domoticzem i HA. Do tego dodałem możliwość ustawienia topic'a dla wszystkich trzech opcji wsparcia MQTT. Jak możesz to przetestuj dla HA (nowy skrypt wymaga dodania nowych opcji w config.cfg i ustawienia ich stosownie do potrzeb).

pablolite commented 2 years ago

Jak na razie działa ok. Przetestuję jeszcze jak zajdzie słońce.

Nie do końca rozumiem w jakim celu można ustawiać temat do MQTT. Jeżeli chciałeś osiągnąć możliwość podpięcia dwóch różnych inwerterów to musisz dodać obsługę tematu jeszcze w szablonie urządzenia i sensorów homeassistant/sensor//

Aktualnie można zmienić temat dla odczytów sensora, ale samo urządzenie "SofarLogger" będzie jedno zawsze to samo. Dlatego sugeruję małą zmianę:

result=client.publish("homeassistant/sensor/SofarLogger/"+str(inverter_sn)+"_"+str(HAcount)+"/config","{\"(...)

zmienić na:

result=client.publish("homeassistant/sensor/SofarLogger_"+str(inverter_sn)+"/"+str(inverter_sn)+"_"+str(HAcount)+"/config","{\"(...)

Wtedy jeżeli skrypt będzie uruchamiany dla dwóch różnych urządzeń (inny SN) to Home Assistant pojawią się dwa urządzenia. sofar

pablolite commented 2 years ago

Skrypt nie wysyła danych gdy inwenter się wyłączył: pk@nas:~/Sofar_Logger2$ python InverterData.py *** Chunk no: 0 Sent data: bytearray(b'\xa5\x17\x00\x10E\x00\x00\xa0\x1fjf\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00(E\xd4\x00\x15') Could not open socket - inverter/logger turned off

Wygląda na to, że w zmiennej invstatus odczytujesz stan z inwentera, a tej jest wyłączony. Chyba musisz dodać zmianę zmiennej invstatus=0 w przypadku błędu połączenia.

MichaluxPL commented 2 years ago

Skrypt nie wysyła danych gdy inwenter się wyłączył: pk@nas:~/Sofar_Logger2$ python InverterData.py *** Chunk no: 0 Sent data: bytearray(b'\xa5\x17\x00\x10E\x00\x00\xa0\x1fjf\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00(E\xd4\x00\x15') Could not open socket - inverter/logger turned off

Wygląda na to, że w zmiennej invstatus odczytujesz stan z inwentera, a tej jest wyłączony. Chyba musisz dodać zmianę zmiennej invstatus=0 w przypadku błędu połączenia.

True. Niestety, aby to zadziałało tak na prawdę poprawnie, to będzie wymagało grubszej przeróbki skryptu. Powalczę z tym w wolnej chwili.

A co do topic'a MQTT, to niestety nie znam HA, ale dla większość narzędzi można w nich ustawić dowolnych topic, stąd założyłem możliwość swobodnego definiowania :)

MichaluxPL commented 2 years ago

Wysyłanie statusu offline powinno już działać poprawnie. Możesz testować :) (ver 1.82)

pablolite commented 2 years ago

Działa online i offline :) Zamykam w takim razie ten wątek.