RS485: Energia + Growatt + Eastron SDM630 Modbus V2

Jeszcze trochę i będziesz pomagał innym w temacie integracji Modbus, Brawo TY!

1 polubienie

Na fali szczęścia popełniłem też wpis na moim nowym blogu. Starałem się dokładnie opisać co i jak. Szczegóły tutaj:
https://ogarniaminternety.pl/growatt-modbus-rtu-rs-485-home-assistant/

Mam nadzieję, że nie jest to wbrew regulaminowi.

2 polubienia

Po mimo, że wątek został oznaczony jako solved wymaga drobnego doprecyzowania.

Udało Ci się usunąć objawy lecz wnioski są błędne.
To było kluczowe i każdy z nas to przeoczył :slight_smile:
Rzeczywiście logicznym jest count=1, ponieważ dla modbusa najmniejszą porcją jest jeden rejestr czyli 2bajty.

Inverter zwraca 4bajty (beztypowo), bo tak było ustawione cont=2, czyli 2 rejestry od adresu np.51
To jakiego typy używasz do jego interpretacji to już twoja wola.
Zobacz jak to robił ten skaner
modbus
Prawidłowe wartości są dla dwóch typów: int16 i unit16.
Do momentu gdy nie przekroczymy 32767 bez względu na typ będą sobie równe.
W tym miejscu należy przyczepić się dokumentacji, że nie jest to dokładnie określone.
Dla tego akurat rejestru nie ma to znaczenia, ponieważ wartość nigdy nie przekroczy 32000
mod1

… no tak nie do końca to znaczy.

Czy mógłby dla mnie (ponieważ masz warsztat) dla jednego rejestru sprawdzić to samo co zrobiłeś na początku tylko z właściwym count

- name: G10KTL3X Vac RS
  unit_of_measurement: V
  slave: 1
  address: 51
  input_type: input
  count: 1
  data_type: uint16  #drugi raz dla int16
  precision: 1
  scale: 0.01
  scan_interval: 60
  device_class: voltage
# ewentualnie gdy otrzymasz niewłaściwe wartości właczyć
# swap: byte

Gratulacje za progres :+1:

edit. co do typu danych jeszcze taki przyład
modbus
Rejestr 54 dla int16 i uint16 =0, a dla 32bitów =4180, ponieważ brakujące bajty “dokupił” z rejestru 53

1 polubienie

@RobinI30 również mega dzięki za pomoc :pray:

Sprawdziłem kilka opcji.

Dla takiego zapisu:

  data_type: uint16  #drugi raz dla int16
  precision: 1
  scale: 1

Encja daje taki wynik:
G10KTL3X forum arturhome 4138,0 V

Dla scale: 0.1
G10KTL3X forum arturhome 413,1 V

Dla scale: 0.01
G10KTL3X forum arturhome 41,3 V

Natomiast zmieniając typ danych:

  data_type: int16
  precision: 1
  scale: 0.1

wynik jest poprawny:
G10KTL3X forum arturhome 413,5 V

Przy wszystkich sensorach zmieniłem typ danych na uint16 ze względu na zapis w instrukcji

It is 16bits (two bytes) unsigned integer for each holding and input register

Całą akcję mogę podsumować następująco:

  • przeoczona została wartość count. Zamiast 2 powinno być 1.
  • przeniosłem serwer w inne miejsce (zmniejszyła się ilość skrętki z ok 25 metrów do 5 m.)
  • zmieniłem konwerter z CH340 na FT232RL (wyeliminowało to część błędów z logów)
  • poprawiłem połączenie przewodów skrętki na rozgałęzieniu (jedna para poszła do licznika Eastron SDM630 druga do inwertera Growatt MOD)
  • @arnie280 dzięki za tipa z wykresem w Growacie. Szkoda że nie można mieć ciastka i zjeść ciastka (mieć licznika podłączonego zarówno do portów 3,4 do RS485 w HA oraz 7,8 do statystyk Growatta w serwisie online)
  • nieoceniony wkład w sukces mieli @macek @RobinI30 za co im mega dziekuję! :zap::muscle::+1:

Jak możesz, to wyjaśnij co dokładnie znaczy ten zapis >1h. Przyda się nie tylko mi ale innym którzy będą chcieli zrozumieć działanie tego customowego typu danych.

swap: byte wraz z uint16 dało wynik 2356,8 V Co robi ten zapis?

Jest jeszcze jedna zagadka do rozwiązania w tym falowniku. Czy ktoś wie co mogą oznaczać te rejestry?

customowa_nazwa_sensora_encji H
customowa_nazwa_sensora_encji L

Chodzi mi o H oraz L. Wszystkie wyniki z falownika pochodzą z sensorów z literką L. Te pod literką H są puste (zerowe). Nie będę drążył tego tematu ale jak ktoś wie to niech śmiało pisze. Dane odczytuję poprawnie więc te zerowe po prostu wyłączę.

Nie ma co się rozpisywać link wiele wyjaśnia

Zamienia kolejność bajtów w słowie ByteHi<>ByteLo - czasami tak trzeba, jeśli bajty wysyłane są w odwrotnej kolejności.

Można, tylko trzeba pomyśleć nieszablonowo :stuck_out_tongue_winking_eye:

1 polubienie

Witaj mam pytanie odnośnie licznika sdm630 czy kupowałeś licznik od growatta czy np. z hurtowni ?
pytam bo kupiłem z hurtowni i nie łączy się z moim mod6000tl3x tz. nie ma na tym liczniku żadnej słuchawki. pan z growatt polska poinformował mnie ze taki licznik nie od growat nie działa

Kupowałem na Allegro. Model dokładnie taki jak na zdjęciu.

Do których pinów w falowniku masz podłączone kabelki?

Falownik mam podpięty do pine 3 i 4 pan od growatt powiedział żeby podpiąć go pod 7,8 też nie działało.
brak komunikacji, mój licznik jest identyczny jak twój . Może programują te liczniki żeby tylko ich działy nie wiem, masz jakiś pomysł kolego?

Zastosowałeś skręconą parę przewodów?
Próbowałeś zamienić miejscami A i B?

SDM630 masz podłączony tylko do Growatta czy też do innego urządzenia?

Pytanie podstawowe - czy ustawiłeś adres licznika na 002 a inwertera na 001?

Adres licznika i falownika musi być ten sam. Np 001

Panowie działa trzeba było zadzwonić do nich powiedzieć żeby zmienili ustawienie inwertera na on Grid z licznikiem Mod6000tl3x, wcześniej było system wyspowy, podłącza się licznik pod porty 7 i 8 w inwerterze każdy inverter inne porty

Edit:

@RobinI30 tak właśnie jest ustawione

Support Growatta działa dość sprawnie. U mnie Modbus poszedł bez dzwonienia i zmian w ustawieniach. Mam podłączony pod HA gdyż integracja taka działa lokalnie a nie przez chmurę Growatta.

Witam, mam ciekawy temat z Growatt MOD 10KTL3-X, podłączony do HA po Mobdus ponad rok temu. W zeszłym tygodniu dołożyłem drugi obwód PV i z ok 6kW mam teraz ponad 10kW. Mam problem z odczytem sensor.g10ktl3x_output_power, do wartości 6kW pokazuje normalnie. Powyżej wartości z jakiegoś nieznanego powodu pokazuje wartość pomniejszana o 6kW. Widać to najlepiej na wykresie:
image
Chciałem zrobić dodatkową encję “template” która tymczasowo poprawiła by problem do czasu kontaktu z serwisem.

        state_class: total_increasing
        unit_of_measurement: 'W'
        state: > 
          {% if (states('sensor.g10ktl3x_output_power') | float(0) < 6000 ) }
          {% else % }
          {{ ((states('sensor.g10ktl3x_output_power') | float(0) > 6000 ) | 
               states('sensor.g10ktl3x_output_power') | float(0) + 6000 ) | round(2) }}
          {% endif %}

Ale mam błędy :frowning:

Opiszę to tak:
if warunek
spelniony-to-wartosc-taka
else
w przeciwnym-wypadku-to-wartosc-taka

Ale to i tak nie zadziała, bo jest błąd w rozumowaniu - skoro powyżej 6000 sensor już nie przyjmuje wartości i ponieważ nie sposób rozpoznać które wartości poniżej 6000 są OK, a które nie, to tych brakujących wartości nie “urodzimy”.

Tzn. może i dałoby się rozpoznać kiedy dodawać jakąś stałą wartość, ale nie na podstawie wartości wadliwej encji. (można pokombinować z porównywaniem z sumą pozostałych 2 encji)

Witam, chciałem dołączyć do tematu, jestem początkującą osobą w przygodzie z HA. Napotkałem pewien problem przy próbie połączenia falownika growatt TL3-S do HA za pomocą RS485. Generalnie sama “próba” połączenia udała się, korzystając z tego poradnika

Ale niestety podana przykładowa konfiguracja nie pasuję (chyba) do mojego falownika, dane albo się nie wyświetlają, albo nie mogę znaleźć konkretnego parametru. Głównie chodzi mi o odczytywanie produkcji AC. Metodą prób i błędów doszedłem do adresu który pokrywa się z aktualną produkcją, ale niestety po przekroczeniu wartości 6535 W, odczyt zaczyna być błędny tzn. spada do wartości ± 200 - 300 W. Moja gorąca prośba do znawców tematu o pomoc.

Typy danych : odczytywanych przez integracją a udostępnianych przez falownik są różne (16bit vs. 32)… tyle da się powiedzieć z tego co napisałeś.

Dziękuje za odpowiedź. Mam rozumieć że mój falownik udostępnia dane tylko 16bit? I większych wartości nie będę mógł odczytać? Czy udostępnia również 32 bit tylko konfiguracja połączenia musi być inna? Z góry dzięki za odpowiedzi

Właśnie nie wiem co i jak udostępnia… Ty masz dokumentację.
Nie podałeś, również jak to odczytujesz ale 65535 sugeruje, że wynik przewija się wokół 16 bit… szukałbym błędu w typach danych.