Licznik energii dwukierunkowy VCX DTS-1946 + ESPHome + Home Asistant

:thinking: a to USB z konwertera z CP2102 do czego?

Do tego by z pierwszego konwertera (tego co fizycznie z modbus robi uart) przejść na USB. W ten sposób chciałem sprawdzić czy licznik działa z tym fabrycznym programem producenta. Zabieg tylko w celach testowych bo nie mam drugiego modbus na usb. W każdym razie na testowej konfiguracji też nie było sukcesów. Zaczynam podejrzewać sam licznik bo innych pomysłów już nie mam. W tej chwili najchętniej chciał bym sprawdzić czy na wyjściu modbus jest cokolwiek nawet jakieś śmieciowe sygnały krzaczki itd.

Gonisz za własnym ogonem. Dlaczego parzystość ustawiłeś akurat na Even, a próbujesz łączyć się na None?

uart:
  id: mod_bus
  tx_pin: 19
  rx_pin: 23
  baud_rate: 9600
  stop_bits: 1

Same konwertery najpierw sprawdź, masz tyle klocków, że możeś je połączyć i sprawdzić USB<>USB.
Stawiam jednak na źle ustawioną kontrolę parzystości.

Odpowiada nawet całkiem konkretnie.

2 polubienia

Even ustawiłem nieświadomie. Nie wiedziałem że ustawienie E.8.1 oznacza konfiguracje dla transmisji. Myślałem że to jakieś ustawienie dla formatowania danych. Nauczyłem się przy okazji czegoś nowego :). Niestety po podpięciu pod program i korekcie ustawień portu szeregowego nadal bez zmian. Jaka powinna być konfiguracja dla licznika? Tak jak w instrukcji E.8.1 czy może lepiej jakaś inna? Same konwertery działają. Sprawdziłem spinając konwerter usb-modbus z Modbus-uart podpiętym do Uart-USB. Dwa niezależne komputery gadały ze sobą w obu kierunkach. Teraz pytanie gdzie robię błąd. Przy używaniu kowertera Modbus na USB raczej w podpięciu nie ma opcji na błąd A jest podpięte pod A na liczniku B pod B (według instrukcji).

Nie wiem co Ci odpowiedzieć, po prostu z obu stron musi być zgodnie co do adresu i parametrów transmisji.
Zmien w liczniku na none i podłącz do esp z tym szablonem co miałeś wcześniej. Masz moduł z atomatyczną zmianą kierunku więc pin sterujący w esp nie ma zastosowania i wszystko opiera się na doborze odpowiednim timingu. Nie znam esphome i więcej nie pomogę.

update_interval: 1s

… to może być zbyt często.

Zmieniłem ustawienia na liczniku i obecnie w logerze mam coś takiego

[22:38:21][C][uart.arduino_esp32:105]: UART Bus:
[22:38:21][C][uart.arduino_esp32:106]:   TX Pin: GPIO19
[22:38:21][C][uart.arduino_esp32:107]:   RX Pin: GPIO23
[22:38:21][C][uart.arduino_esp32:109]:   RX Buffer Size: 256
[22:38:21][C][uart.arduino_esp32:111]:   Baud Rate: 9600 baud
[22:38:21][C][uart.arduino_esp32:112]:   Data Bits: 8
[22:38:21][C][uart.arduino_esp32:113]:   Parity: NONE
[22:38:21][C][uart.arduino_esp32:114]:   Stop bits: 1
[22:38:21][C][modbus:129]: Modbus:
[22:38:21][C][modbus:131]:   Send Wait Time: 200 ms
[22:38:21][C][logger:233]: Logger:
[22:38:21][C][logger:234]:   Level: DEBUG
[22:38:21][C][logger:235]:   Log Baud Rate: 115200
[22:38:21][C][logger:236]:   Hardware UART: UART0
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L1 napięcie'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'V'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L2 napięcie'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'V'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L3 napięcie'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'V'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Częstotliwość'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:21][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'Hz'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L1 prąd'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'A'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 3
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L2 prąd'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'A'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 3
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L3 prąd'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'A'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 3
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L1 moc czynna'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'W'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L2 moc czynna'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'W'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L3 moc czynna'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'W'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Całkowita moc czynna'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'kW'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 3
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Moc czynna pobrana'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Device Class: 'energy'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'total_increasing'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'kWh'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 1
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Icon: 'mdi:circle-slice-3'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Moc czynna oddana'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Device Class: 'energy'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'total_increasing'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'kWh'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 1
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Icon: 'mdi:circle-slice-3'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L1 cosφ'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: ''
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L2 cosφ'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: ''
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Faza L3 cosφ'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: ''
[22:38:22][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 2
[22:38:22][C][captive_portal:150]: Captive Portal:
[22:38:22][C][ota:082]: Over-The-Air Updates:
[22:38:22][C][ota:083]:   Address: modbusbridge.local:3232
[22:38:22][C][ota:086]:   Using Password.
[22:38:22][W][ota:092]: Last Boot was an unhandled reset, will proceed to safe mode in 7 restarts
[22:38:22][C][api:134]: API Server:
[22:38:22][C][api:135]:   Address: modbusbridge.local:6053
[22:38:22][C][api:139]:   Using noise encryption: NO
[22:38:22][C][modbus_controller:244]: ModbusController:
[22:38:22][C][modbus_controller:245]:   Address: 0x02
[22:38:22][W][modbus_controller:105]: Duplicate modbus command found
[22:38:22][W][modbus_controller:105]: Duplicate modbus command found
[22:38:22][W][modbus_controller:105]: Duplicate modbus command found
[22:38:24][W][modbus_controller:105]: Duplicate modbus command found
[22:38:24][W][modbus_controller:105]: Duplicate modbus command found
[22:38:24][W][modbus_controller:105]: Duplicate modbus command found
[22:38:26][W][modbus_controller:105]: Duplicate modbus command found
[22:38:26][W][modbus_controller:105]: Duplicate modbus command found
[22:38:26][W][modbus_controller:105]: Duplicate modbus command found
[22:38:27][D][api:098]: Accepted xxx.xx.x.xxx
[22:38:27][D][api.connection:736]: Home Assistant 2022.10.3 (xxx.xx.x.xxx): Connected successfully
[22:38:28][W][modbus_controller:105]: Duplicate modbus command found
[22:38:28][W][modbus_controller:105]: Duplicate modbus command found
[22:38:28][W][modbus_controller:105]: Duplicate modbus command found

I tak w kółko. Nie ma błędów CRC ale krzyczy o Duplicate modbus command found. Jeszcze jedno czy ktoś może mi potwierdzićczy użyte piny D19 i D23 do komunikacji mogą być użyte? PS powyższy log jest z logera ale testowałem też układ z boudrate ustawionym na 0 by nie było konfliktów ( niestety beż rezultatów)

…ustaw np. 30s i stopniowo zmniejszaj.

ESP32 jeśli mnie pamięć nie myli ma 3 sprzętowe UARTy, które mogą być mapowane na dowolne “normalne” piny, defaultowy układ GPIO dla ESP32 to:

  • UART0 - TX: GPIO1, RX: GPIO3
  • UART1 - TX: GPIO9, RX: GPIO10
  • UART2 - TX: GPIO16, RX: GPIO17

przy czym UART0 jest przewidziany na debug (chyba, że wyłączysz)

więcej tu

PS numeracja pinów zależy of deklaracji płytki, aliasy takie jak D19 czy D23 dotyczą konkretnej płytki prototypowej

a dokopałem się w twoich postach do takiej deklaracji

  board: esp32dev

czyli nie wiadomo co masz…

Porównaj swoją płytkę np. z ESP32 DEVKIT V1 DOIT opisaną np. tutaj (to bodajże jest projekt referencyjny, niestety w artykuliku nie ma opisów pinów nadrukowanych na soldermasce, więc musisz porównać z tym co masz w ręce, bo ja niestety w delegacji i nie mogę pogrzebać w kanciapie ze sprzętem), a na samej górze masz “golasa” WROOM32 castellated

tu masz opis z aliasami dla devkit v1 (jak widać porty szeregowe mają kojarzące się aliasy, domyślnie masz wyprowadzony UART0 i UART2, na pinach RX0/TX0 i odpowiednio RX2/TX2)

Tu chyba powinno być 0x2 sprawdź składnię

Można matematycznie udowodnić, że przy takim timingu musi pojawić się komunikat o duplikacie żądania.
Odczytujesz 16 rejestrów, każdy w osobnej sesji żądanie /odpowiedź.
Dla każdej sesji ustawiony jest dodatkowy narzut czasu e postaci command_throttle: 100ms+send_wait_time: 200ms = 300ms. Przy 16 rejestrach daje 4.8s (nie liczac czasu na przesłanie właściwej wiadomości) - czyli przy update_interval: 1s kolejkę nadpiszesz 4x.
“…w tym stawie nie ma ryb” :wink:

p.s… zauważyłem takie dziwne “chciejstwo” aby minimalizować update time w zupełnym oderwaniu od tego co i jak się mierzy. Taki przykład: pomiar temperatury pomieszczenia co 10s. Gdzie odpowiedź odpowiedź samego czujnika jest dłuższa, nie mówiąc już o odpowiedzi obiektu… itd

2 polubienia

W programie jest tak. Log pokazuje 0x02

modbus_controller:
  - id: vcx
    ## the Modbus device addr
    address: 0x2
    modbus_id: mod_bus_vcx
    command_throttle: 100ms
    setup_priority: -10
    update_interval: 2s

Edit:

Ok w końcu jakieś sukcesy. Podpiąłem się za pomocą konvertera modbus na usb do komputera użyłem programu ModbusPoll. W ten sposób sprawdziłem że licznik działa. Co ciekawe na wyświetlaczu pojawiła się nowa ikona że jest komunikacja. Następnie za pomocą tego samego konwertera podpiąłem się do RPI na której działa HA. I udało mi się otrzymać Jakąś liczbę :smiley: Piszę jakąś bo to nie było to czego się spodziewałem. Teraz walczę z kodem by wyświetlić potrzebne mi dane w odpowiedniej formie.

Przeglądałem dostępne przez modbus adresy i chyba nie ma szans na wyciągnięcie pobranej energii w rozbiciu na fazy?

Ogarnięte
w HA zrobiłem obliczeniowo, jakby ktoś potrzebował to:

sensor:
  - platform: integration
    source: sensor.kotlownia1_faza_l1_moc_czynna
    name: kotlownia1_faza_l1_energia
    unit_prefix: k
    round: 2

Macie jakiś sposób na podanie dziennego poboru i oddania energii znalazłem tylko odczyt całkowity.

Utility meter albo energy screen

1 polubienie

Witam jakie powinny być ustawienia na liczniku odnośnie
Trybu sprawdzania : n.8.1 czy E.8.1 czy o.8.1
Protokół komunikacji czy:
image
Nie mogę się połączyć z licznikiem nawet za pomocą oryginalnego oprogramowania producenta.
Czy po zmianie ustawień trzeba licznik resetować?
Przestawiałem już porty A i B i nic nie pomogło, zmieniałem konwertery RS485.
Chce połączyć się przez ESP32 z home assistenetm i nie mogę.

Jakiekolwiek, ważne jest jedynie abyś po obu stronach miał takie same ustawienia (to jest ogólna reguła dla każdego połączenia szeregowego).
Najprościej bez kontroli parzystości, czyli n.8.1 w większości oprogramowania to odpowiada ustawieniom: 8, N, 1 (8 bitów, bez kontroli parzystości, 1 bit stopu)

uart:
  id: mod_bus
  tx_pin: 1  # ten pin jest konieczny dla ESP82xx, dla ESP32 możesz użyć inne w/g dokumentacji
  rx_pin: 3  # ten pin jest konieczny dla ESP82xx, dla ESP32 możesz użyć inne w/g dokumentacji
  baud_rate: 115200
  stop_bits: 1
  data_bits: 8 # nie musisz tego podawać bo 8 to default
  parity: NONE # nie musisz tego podawać, bo NONE to default, ale możesz też tu ustawić EVEN albo ODD
  stop_bits: 1 # nie musisz tego podawać, bo 1 to default, ale gdyby miało być 2 to wtedy musisz

logger:
  baud_rate: 0 # to ustawienie jest konieczne dla ESP82xx, dla ESP32 logger może być włączony

# oczywiście dalej musi być jakaś konfiguracja dla modbus

Sprawdź w dokumentacji czy prędkość portu się zgadza (baud_rate, w szczególności sprawdź to w dokumentacji konwertera, bo niektóre pracują tylko przy określonych prędkościach).

Protokół musi być w każdym urządzeniu taki sam, podejrzewam, że jeśli chcesz łączyć z ESPHome ma być RTU

A łączysz z A, B łączysz z B w każdym urządzeniu na linii.

Może czasem być konieczny terminator 120om (specyfikacja go wymaga), połączenie powinno być za pomocą jednej pary standardowej skrętki (A i B powinny być przewodami tej samej pary).

Konwerter UART-RS485 łączysz RX do RX i TX do TX (chyba, że producent wyraźnie zaznaczy inaczej, ale dla konwerterów mediów normalną sytuacja to: TX hosta z TX konwertera i RX hosta do RX konwertera, TYLKO jeśli bezpośrednio łączysz 2 porty UART to wtedy jest to zgodnie z logiką RX do TX).

Podłączając drugi licznik wykryłem jedną rzecz. Chipy do USB na płytkach, np w Wemosie gryzą się ze sprzętowym serialem. Wystarczy użyć programowego. Czyli nie:

tx_pin: 1
rx_pin: 3

bo to sprzętowy, tylko:

tx_pin: 3
rx_pin: 1

i nie ma problemu z działaniem, ani z bootowaniem.

Nie w tym problem, trzeba po prostu wyłączyć logger na sprzętowym UART (to dotyczy ESP8266/8285)

logger:
  baud_rate: 0

Edit: Płytki ESP8266 posiadające na stałe wlutowany mostek UART-USB (np. D1 mini i wszelkie jego klony, albo NodeMCU v2 i zbliżone) istotnie mają problem z działaniem z powodu mostka przeszkadzającego w normalnej pracy portu UART, więc część dalszej dyskusji można pominąć
rozwiązania są 2

  • albo definiujemy programowy UART (można na dowolnych pinach, nie muszą być akurat 1 i 3, wtedy port sprzętowy można wykorzystać do loggera po USB), ale to rozwiązanie nie nadaje się jeśli port ma pracować z dużymi prędkościami (to raczej nie jest ten przypadek)
  • albo sprzętowo modyfikujemy płytkę usuwając połączenie portu z mostkiem (zwykle wystarczy usunąć jeden rezystor, warto wlutować też piny dla zworki by móc w przyszłości skorzystać z flashowania za pomocą USB)

W Wemosie D1 mini samo wyłaczenie loggera nie pomaga.

A powinno, bo wszyscy tak robią i im to pomaga.

Może wyjątkowo masz konwerter opisany odwrotnie niż normalnie (przypomnę normalnie konwertery mediów łączy się z UARTem Tx do Tx oraz Rx do Rx, tylko UARTy między sobą łączy się na krzyż).