Home Assistant + DTSU-666

Mam problem w takiej postaci że do esp8266 podłączyłem konwerter rs485-ttl oparty o MAX485 z automatyczną zmianą kierunku i do licznika, problem pojawia się w momencie gdy próbuję odczytać dane z licznika to pojawia mi się błąd:

[D][modbus_controller:039]: Modbus command to device=1 register=0x202A no response received - removed from send queue

i nie mam żadnych odczytów z licznika, szukałem na forach i innym działało połączenie wykonałem tak jak na obrazku poniżej:

kod na ESP:

esphome:
  name: rs485
  friendly_name: rs485

esp8266:
  board: esp01_1m

wifi:
  networks:
    - ssid: "xxx"
      password: "xxx"

api:

ota:
   platform: esphome

logger:
  level: DEBUG
  baud_rate: 0

output:
  - platform: gpio
    id: rs485_dir
    pin: 16      # GPIO16
    inverted: false  # HIGH = TX, LOW = RX

uart:
  tx_pin: 1
  rx_pin: 3
  rx_buffer_size: 512
  baud_rate: 9600
  parity: NONE
  data_bits: 8
  stop_bits: 1
  id: uart_to_modbus

modbus:
  send_wait_time: 1000ms
  id: modbus_component_hub
  uart_id: uart_to_modbus

modbus_controller:
  - id: dtsu666_modbus_controler
    address: 0x001
    modbus_id: modbus_component_hub
    update_interval: 30s

text_sensor:

  - platform: template
    name: "ESP-DTSU Uptime (human readable)"
    id: uptime_human
    icon: "mdi:clock-start"
    update_interval: 5s

sensor:
#------------------------------------------------------
# Energia 
# ------------------------------------------------------
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Power_Imp
    name: "Energia pobrana z sieci kwh"

    address: 0x101E
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "total_increasing"
    register_type: read
    value_type: FP32
    accuracy_decimals: 2
    skip_updates: 12
    filters:
      - multiply: 1

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Power_Exp
    name: "Energia oddana do sieci kwh"

    address: 0x1028
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "total_increasing"
    register_type: read
    value_type: FP32
    accuracy_decimals: 2
    skip_updates: 12
    filters:
      - multiply: 1 
#------------------------------------------------------
# Napięcia 
#------------------------------------------------------
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Ua
    name: "Napięcie L3"
    address: 0x200A
    unit_of_measurement: "V"
    register_type: read
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
      
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Ub
    name: "Napięcie L2"
    address: 0x2008
    unit_of_measurement: "V"
    register_type: read
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 0.1   

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Uc
    name: "Napięcie L1"
    address: 0x2006
    unit_of_measurement: "V"
    register_type: read
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 0.1  
#------------------------------------------------------
# Prądy 
#------------------------------------------------------      
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Ia
    name: "Prąd L3"
    address: 0x2010
    unit_of_measurement: "A"
    register_type: read
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 0.001 
      
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Ib
    name: "Prąd L2"
    address: 0x200E
    unit_of_measurement: "A"
    register_type: read
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 0.001  

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Ic
    name: "Prąd L1"
    address: 0x200C
    unit_of_measurement: "A"
    register_type: read
    value_type: FP32
    accuracy_decimals: 1
    filters:
      - multiply: 0.001 

  #------------------------------------------------------
  # moc chwilowa 
  #------------------------------------------------------
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pt
    name: "Moc chwilowa całkowita"
    address: 0x2012
    unit_of_measurement: "W"
    register_type: read
    value_type: FP32
    accuracy_decimals: 0
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pa
    name: "Moc chwilowa L3"
    address: 0x2018
    unit_of_measurement: "W"
    register_type: read
    value_type: FP32
    accuracy_decimals: 0
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pb
    name: "Moc chwilowa L2"
    address: 0x2016
    unit_of_measurement: "W"
    register_type: read
    value_type: FP32
    accuracy_decimals: 0
    filters:
      - multiply: 0.1 

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pc
    name: "Moc chwilowa L1"
    address: 0x2014
    unit_of_measurement: "W"
    register_type: read
    value_type: FP32
    accuracy_decimals: 0
    filters:
      - multiply: 0.1 
#------------------------------------------------------
# power factor
#------------------------------------------------------
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pf
    name: "Power Factor"
    address: 0x202A
    unit_of_measurement: "Pf"
    register_type: read
    value_type: FP32
    accuracy_decimals: 2
    filters:
      - multiply: 0.001

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pfa
    name: "Power Factor L1"
    address: 0x202c
    unit_of_measurement: "Pf"
    register_type: read
    value_type: FP32
    accuracy_decimals: 2
    filters:
      - multiply: 0.001
       
  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pfb
    name: "Power Factor L2"
    address: 0x202e
    unit_of_measurement: "Pf"
    register_type: read
    value_type: FP32
    accuracy_decimals: 2
    filters:
      - multiply: 0.001 

  - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Pfc
    name: "Power Factor L3"
    address: 0x2030
    unit_of_measurement: "Pf"
    register_type: read
    value_type: FP32
    accuracy_decimals: 2
    filters:
      - multiply: 0.001 
  #------------------------------------------------------
  # wifi signal
  #------------------------------------------------------     
  - platform: wifi_signal
    id: dtsu_wifi_signal
    name: "WiFi Signal DTSU-Logger"
    update_interval: 60s
    icon: "mdi:wifi"
 
  - platform: uptime
    id: inverter_uptime
    name: "ESP-DTSU Uptime"
    filters:
      - lambda: return x / 60.0;
    unit_of_measurement: minutes
    icon: "mdi:clock-start"

  - platform: uptime
    name: ${friendly_name} Uptime
    id: uptime_sensor
    update_interval: 5s
    icon: "mdi:clock-start"
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();

  - platform: template
    unit_of_measurement: "%"
    name: "ESP-DTSU WiFi Signal (human readable)"
    accuracy_decimals: 0
    update_interval: 30s
    device_class: "signal_strength"
    icon: "mdi:wifi"
    lambda: return (-0.0134 * (id(dtsu_wifi_signal).state * id(dtsu_wifi_signal).state ) ) + (-0.2228 * id(dtsu_wifi_signal).state) + 100.2;

# Basic switch to allow you to restart the device remotely
switch:
  - platform: restart
    name: DTSU-Loger Restart

binary_sensor:
  - platform: status
    name: DTSU-Loger Status

Ma ktoś może jakieś pomysły dla czego to nie działa?

Mam kilka pomysłów:

  • sprbuj zmienić piny: Używasz tx_pin: 1 i rx_pin: 3. Są to piny sprzętowego portu UART0, które w ESP8266 są połączone z wbudowanym konwerterem USB-Serial. Nawet jeśli jest ustawiony baud_rate: 0 to ESP nadal może wysyłać logi

    Rozwiązanie: Spróbuj przenieść UART na inne piny (np. TX: GPIO15/D8, RX: GPIO13/D7) i użyj software_serial. Jeśli musisz zostać przy GPIO1/3, upewnij się, że całkowicie wyłączyłeś logger:

logger:
  level: NONE 

Ale i tak polecam przepiąć na inne piny.

  • Zasilanie konwertera

    Na schemacie widać, że zasilasz konwerter XY-017 z pinu 3V3.
    Wiele tych niebieskich konwerterów z automatycznym kierunkiem opartych jest na układach, które wymagają 5V do poprawnej stabilizacji napięcia dla układu MAX485 i poprawnej pracy logiki po stronie RS485. Przy 3.3V sygnał różnicowy na wyjściu A/B może być zbyt słaby dla licznika.

Rozwiązanie: Przepnij zasilanie konwertera (VCC) do pinu 5V. Układ XY-017 jest zazwyczaj tolerancyjny dla logiki 3.3V (ma wbudowane konwertery poziomów), więc nie powinien uszkodzić ESP.

  • Rezystor terminujący i zamiana A/B

    • A/B: Spróbuj zamienić przewody A+ i B- miejscami. Producenci liczników i konwerterów czasem różnie oznaczają polaryzację.
    • Terminacja: Przy krótkich odcinkach kabla zwykle nie jest potrzebna, ale upewnij się, że nie masz zbyt dużych zakłóceń.
  • Logika sterowania kierunkiem

W kodzie masz sekcję:

  - platform: gpio
    id: rs485_dir
    pin: 16

Konwerter XY-017 posiada automatyczne przełączanie kierunku. Oznacza to, że nie potrzebuje on pinu sterującego (DE/RE).

  • Rozwiązanie: Usuń sekcję output z pinu 16, jeśli nigdzie jej nie używasz w sekcji modbus. Upewnij się, że pin 16 nie wisi nigdzie w konfiguracji modbusowej, co mogłoby blokować transmisję.

I ostatnie.

Upewnij się czy masz odpowiednio skonfigurowany licznik:
Licznik musi mieć identyczne ustawienia jak Twój kod.

  • Baud Rate: Czy na pewno jest 9600 ? (często domyślnie jest 2400 lub 4800).
  • Address: Czy Addr w liczniku to na pewno 1? (W kodzie masz address: 0x001).
  • Protocol: Upewnij się, że licznik jest w trybie Modbus-RTU (n-1), a nie np. DL/T645.

Mam nadzieję że pomogłem. :wink:

1 polubienie

Tylko u ciebie będzie

esp8266:
  board:  d1_mini

Zwróć uwagę na porty Gpio w konfiguracji

  tx_pin: GPIO12
  rx_pin: GPIO13

połącz wg schematu sprawdzony działa

łączysz konwerter z licznikiem
A+ z A+
B- z B-

1 polubienie

Spróbowałem z innym ESP8266 jak i innym konwerterem i dalej występuje ten sam problem
w liczniku mam ustawienia:
-bAud 9600
-Addr 1
-Prot E.1
próbowałem zmieniać protokoły i dalej nie było komunikacji na konwerterze miga TXD ale RXD nie miga, próbowałem także zamieniać piny A i B (też nie przyniosło skutku) jak i zaminiłem piny na ESP D6 i D7 także nie pomogło
Dodałem jeszcze rezystor 120ohm przy liczniku i nic nie dało

Kod wziąłem od użytkownika Kalosh i jest taki sam jak miałem przed tem

No to teraz dałeś więcej danych i wiemwczymdokładnie jest problem:

1. Rozwiązanie problemu protokołu.

Napisałeś, że w liczniku masz ustawione Prot E.1.

  • E.1 oznacza: Even parity (Parzystość parzysta), 1 bit stopu.
  • Twoja konfiguracja w ESPHome ma: parity: NONE oraz stop_bits: 1.

To się ze sobą nie dogada. Masz dwie drogi:

  • Opcja A (Zalecana): Zmień w menu licznika Prot na n.1 (None parity, 1 stop bit). To jest standard dla Modbus RTU i najlepiej współgra z ESPHome.
  • Opcja B: Jeśli musisz zostać przy E.1, zmień kod w ESPHome na:
uart:
  ...
  parity: EVEN
  stop_bits: 1

To jest najbardziej prawdopodobna opcja a jeśli nie to:

2. Sprawdź Register Type (DTSU666)

W Twoim kodzie masz register_type: read. W standardzie Modbus i kontrolerze ESPHome dla liczników DTSU666 zazwyczaj używa się holding (dla rejestrów konfiguracyjnych) lub read dla wejściowych. Jednak kluczowe jest to, że DTSU666 używa rejestrów 16-bitowych, a dane typu FP32 (Float) zajmują dwa rejestry.

Spróbuj zmienić typ rejestru na holding w jednym sensorze testowym, aby sprawdzić, czy ruszy:

 - platform: modbus_controller
    modbus_controller_id: dtsu666_modbus_controler
    id: Ua
    name: "Napięcie L3"
    address: 0x200A
    register_type: holding # Spróbuj zmienić z 'read' na 'holding'
    value_type: FP32

Jeśli nadal nie będzie działać to sprawdź czy jest odpowiednie napięcie na konwerterze.

EDIT: Być może trzeba będzie przesunąć adres o 1 (tzw. offset).
Jeśli adres w dokumentacji to 0x200A, spróbuj w kodzie wpisać 0x2009 lub 0x200B

zmieniłem w liczniku protokół na n.1 jak i w kodzie register_type na holding i nie przyniosło to żadnego efektu

EDIT: zmiana napięcia zasilania przyniosła pożądany efekt i wszystko zaczęło działać

2 polubienia