Afore BNT800KTL i Home Assistant z NodeRed

Dzień dobry. To mój pierwszy tekst na forum więc proszę o wybaczenie jeśli robię błędy.
Mam wspomniany falownik i chcę odłączyć się od Solarmana i importować dane do mojego HA w sieci domowej. Skorzystałem z projektu Robin30 - SofarLanMqtt.json. Komunikuję się przez zawarty w komplecie moduł LSW3.
Oczywiście ustawiłem swój adres sieciowy i numer urządzenia. No i zacinam się na komunikacji z falownikiem.


Poniżej daję messges z debug 4 i debug 5 czyli ramka wysyłana i odbierana.

W sumie to ramka odbierana nie zalezy od zakresu rejestrów, które wpiszę we właściwościach flow sofar inverter. Może być od 0 od 500, od 1000 i jest to samo. No i jest stanowczo za krótka.

Jak zerknąć na dane dekodowane w KTL parser, to są tam jakieś wartości, które zmieniają się w czasie.


Ale skoro nie zależą od zakresu rejestrów to nawet nie bardzo mogę próbować przyporządkować ich do mierzonych wartości, które oczywiście siedzą pod innymi adresami niż w Sofar. Z tym bym sobie poradził, ale jak go zmusić do uzyskania ramek zawierajacych wartości rejestrów z żądanych adresów? Pewnie ta ramka wysyłana (właściwa dla Sofar) jest błędna, ale jak ją dostosowac do Afore? Pewnie najistotniejsza jest ta wartość: var oFrame = “a5170010450000”; //start bytes. Reszta to numer modułu i CRC.
Oczywiście przeglądałem inne wpisy o Afore. Znalazłem rozwiazania z SolarmanCopy.json czyli z logowaniem sie na solarman.com albo korzystajace z Modbusa. Póbowałem też podglądać rejestry w falownikiu z pomocą ModbusView TCP i qModMaster i nie ma odpowiedzi. Zarówno przez LSW3 jak i EW11. STanowczo nie wydaje się, żeby tam był protokół Modbus, więc mam nadzieję na suckes na bazie SofarLanMqtt.json. Tylko jaka ramak nadawcza? Mogę gdzieś to znaleźć czy próbować nasłuchiwać przez wireshark? A może brnę ślepą uliczkę?
A jeszcze dodam, że podczas działania flow SofarLanMqtt.json EW11 w przeciwieństwie do LSW3 nie daje możliwości połączenia z falownikiem.

Ta odebrana ramka to znaczy tyle, że nie może się dogadać.
Pozostałe metody aby działały trzeba posiadać specyfikację rejestrów modbus.
Być może to będzie działać

Z tej integracji wiele można się dowiedzieć - na ile pasuje do Twojego falownika - nie wiem.

Ważna informacja, którą można wyczytać

requests:
  - start: 0x0000
    end: 0x001A
    mb_functioncode: 0x04

  - start: 0x0000
      end: 0x000F
      mb_functioncode: 0x03

gdy wpiszesz randomowe wartości nic nie otrzymasz (bez względu na metodę) - prawidłowy zakres to 0x0000<>0x001A

to use modbus function in Afore BNTxxxKTL inverters, You first need to change protocol from RS485 to MODBUS in inverter menu

Czyli pierwszy z brzegu i nie chciało Ci się czytać dalej :rofl:

Dzięki za szybką odpowiedź.

No właśnie próbowałem różne zakresy. Włącznie z tym od zera. Jakaś publikacja podawała też rejesty zaczynające się od 1F4 (500 dec) i od 3E8 (1000 dec). Ale to nie działa, bo ta ramka początkowa nie jest odpowiednia dla Afore.

“Skorzystałem z projektu Robin30 - SofarLanMqtt.json.”
Czyli pierwszy z brzegu i nie chciało Ci się czytać dalej

Wydawał mi się najprostszy do przetestowania czy w ogóle Afore pójdzie.
Przyznam, że nie do końca rozumiem, ale wydawało mi się, że opracowałeś rozwiązanie, które “udaje” współpracę falownika z chmurą Solarman.
Czyli ta ramka zawierająca “a5170010450000” plus skonwertowany serial_nr oraz ciąg “020000…” nie jest ramką modbusową. Może ma zaszyte funkcje modbusowe dalej w var businessfield=“0103”. W takiej sytuacji nie powinno się zmieniać ustawień w falowniku, bo po przestawieniu z RS485 na Modbus, falownik już nie jest czytany przez chmurę Solarman, ani przez wbudowaną stronkę modułu LSW3.
No ale przestawiłem też port w Afore na Modbus i badałem oba interfejsy.
LSW3 wydaje się nie przepuszczać wprost Modbusa. EW11 musiałem odpowiednio skonfigurować:



Istotne jest wyłączenie flowcontrol.
No i otrzymałem wartości z rejestrów.

Te w input registers to pomijajac pierwszą wartość, kolejno 3 napięcia wyjściowe, trzy prądy wyjściowe, VDC1, IDC1, VDC2, IDC2, częstotliwość. Wartości pomnożone przez 10. Dalej to już pewnie wartości dint takiejak moc całkowita i energia.
Czyli da się czytać Afore. Mogę oczywiście zaklepać te rejestry w yaml jako ModbusTcp. Może nawet przykład, który podałeś będzie właściwy. Jak skończę to sie pochwalę. Ale spodobało mi się to rozwiązanie z użyciem NodeRed i MQTT. I nurtuje mnie pytanie jak doszedłeś do skonstruowania tej ramki komunikującej się z modułem LSW nie przez Modbus tylko z użyciem tej wirtualnej chmurki Solarmana. O ile dobrze zrozumiałem twój zabieg.
Pozdrawiam

:+1:

Przeczytałem, format tej ramki gdzieś na forum zamieszczałem :slight_smile:

w dalszy ciągu to jest modbus tylko inaczej ubrany.

Nic straconego - jest paczka modbus dla NR.
Możesz czytać przez ModbusTCP i publikować w MQTT - tak mam licznik zrobiony.
Ten EW11 to twój czy był w zewstawie?
Chmurę olej :stuck_out_tongue_winking_eye:

Gdy się dobrze przyjrzysz to z węzła KTL wychodzą dane identyczne jak w przypadku modus. Więc gdybyś odczyt zrobił przez EW11 i te dane podał do

Zgodności rejestrów z sofarem nie porównywałem i może trzeba by lekko dostować subflow SofartoMqtt.

Wracam do tematu po krótkiej przerwie.
Na razie odpuściłem sobie NodeRed i MQTT.
Komunikuję się z Afore poprzez Modbus TCP skonfigurowanym w modbus.yaml

- name: Afore
  type: tcp
  host: 192.xxx.xxx.xxx
  port: 8899
    
  sensors:
    - name: PV_L1_Voltage
      unique_id: PV_L1_Voltage
      device_class: voltage
      unit_of_measurement: "V"
      data_type: int16
      scale: 0.1
      address: 01
      input_type: input
      slave: 1

    - name: PV_L2_Voltage
      unique_id: PV_L2_Voltage
      device_class: voltage
      unit_of_measurement: "V"
      data_type: int16
      scale: 0.1
      address: 02
      input_type: input
      slave: 1
        
    - name: PV_L3_Voltage
      unique_id: PV_L3_Voltage
      device_class: voltage
      unit_of_measurement: "V"
      data_type: int16
      scale: 0.1
      address: 03
      input_type: input
      slave: 1
      
    - name: PV_L1_Current
      unique_id: PV_L1_Current
      device_class: current
      unit_of_measurement: "A"
      data_type: int16
      scale: 0.1
      address: 04
      input_type: input
      slave: 1

    - name: PV_L2_Current
      unique_id: PV_L2_Current
      device_class: current
      unit_of_measurement: "A"
      data_type: int16
      scale: 0.1
      address: 05
      input_type: input
      slave: 1
      
    - name: PV_L3_Current
      unique_id: PV_L3_Current
      device_class: current
      unit_of_measurement: "A"
      data_type: int16
      scale: 0.1
      address: 06
      input_type: input
      slave: 1      
      
    - name: PV_DC1_Voltage
      unique_id: PV_DC1_Voltage
      device_class: voltage
      unit_of_measurement: "V"
      data_type: int16
      scale: 0.1
      address: 07
      input_type: input
      slave: 1
            
    - name: PV_DC1_Current
      unique_id: PV_DC1_Current
      device_class: current
      unit_of_measurement: "A"
      data_type: int16
      scale: 0.1
      address: 08
      input_type: input
      slave: 1

    - name: PV_DC2_Voltage
      unique_id: PV_DC2_Voltage
      device_class: voltage
      unit_of_measurement: "V"
      data_type: int16
      scale: 0.1
      address: 09
      input_type: input
      slave: 1

    - name: PV_DC2_Current
      unique_id: PV_DC2_Current
      device_class: current
      unit_of_measurement: "A"
      data_type: int16
      scale: 0.1
      address: 10
      input_type: input
      slave: 1
      
    - name: PV_Freq
      unique_id: PV_Freq
      device_class: frequency
      unit_of_measurement: "Hz"
      data_type: int16
      scale: 0.1
      address: 11
      input_type: input
      slave: 1
      
    - name: PV_Mod_Temp
      unique_id: PV_Mod_Temp
      device_class: temperature
      unit_of_measurement: "C"
      data_type: int16
      scale: 0.1
      address: 12
      input_type: input
      slave: 1
      
    - name: PV_Inn_Temp
      unique_id: PV_Inn_Temp
      device_class: temperature
      unit_of_measurement: "C"
      data_type: int16
      scale: 0.1
      address: 13
      input_type: input
      slave: 1      
      
    - name: PV_Day_Energy
      unique_id: PV_Day_Energy
      device_class: energy
      unit_of_measurement: "kWh"
      data_type: int32
      scale: 0.001
      precision: 1
      address: 14
      input_type: input
      slave: 1    
      
    - name: PV_Out_Power
      unique_id: PV_Out_Power
      device_class: power
      unit_of_measurement: "W"
      data_type: int16
      scale: 1
      address: 17
      input_type: input
      slave: 1    
      
    - name: PV_Day_Production_Time
      unique_id: PV_Day_Production_Time
      unit_of_measurement: "s"
      data_type: uint16
      scale: 1
      address: 19
      input_type: input
      slave: 1    
      
    - name: PV_Total_Energy
      unique_id: PV_Total_Energy
      device_class: energy
      unit_of_measurement: "kWh"
      data_type: int32
      scale: 0.001
      precision: 1
      address: 20
      input_type: input
      slave: 1  

To są wartości, które udaje mi się zaciągać z falownika. Adres 0 to jest słowo statusowe, adresy dalsze niż 21 to błędy. Rejestry hold zawierają parametry serwisowe: datę, godzinę, adresy COM, jezyk, wartości maks i min napięć i częstotliwości do połączenia z grid.
Struktura rejestrów jest zbliżona do znalezionego na srcibd

Tylko ten linkowany ma 3 wejścia DC, więc rejestry są troszkę poprzesuwane
Do połączenia z inwerterem konieczny jest konwerter wifi/RS485 EW11, bo tak jak pisałem moduł LSW3 nie przepuszcza ramek modbusowych do falownika. EW11 kupiłem na Ali.
Może komuś się przyda to co wrzuciłem.
Z kolei przyznam, że nie mam doświadczenia z HA i mam przy okazji tego tematu pytanie:
Czy realizacja takiej komunikacji z inwerterem poprzez NodeRed i MQTT ma jakieś wyraźne zalety w porównaniu do skonfigurowania komunikacji w pliku yaml?

Ja widzę raczej to jako wady w postaci dokładania dwóch pośredników w formie NR i MQTT.