HA + Modbus TCP

Odpovědět
luky
Příspěvky: 326
Registrován: stř zář 08, 2021 10:40 am
Bydliště: za Berounem
Výkon panelů v FVE [Wp]: 5000
Kapacita baterie [kWh]: 12

HA + Modbus TCP

Příspěvek od luky »

Poslední dny jsem se trochu trápil se spojením mezi HA a PLC přes Modbus TCP.
PLC funguje jako Modbus server, HA z něj čte nějaká čísla. Toto je ta snadná část (doplněk modbus, konfigurace v yaml).

Kód: Vybrat vše

modbus:
 - type: tcp
   host: 10.0.0.10
   port: 502
   name: modbus_plc
   delay: 100
   sensors:
     - name: jimka_hladina
       address: 3
       slave: 1
       data_type: int16
       input_type: input   
       unit_of_measurement: mm
       
     - name: teplota_venku_float
       address: 21
       slave: 1
       data_type: float32
       input_type: input   
       device_class: temperature
       unit_of_measurement: °C  
       precision: 1
S opačným tokem informací (HA>PLC) jsem se potrápil, tak zde moje poznatky, třeba se to někomu hodí:
1) je potřeba použít automatizaci a spouštět funkci modbus.write_register (nebo nějakou další - write_registers, write_coils...)
Snímek obrazovky 2025-05-04 200553.png
2) spouštím automatizaci každou sekundu. Pro jiné účely bude stačit třeba i delší doba.

3) pokud chcete posílat reálné číslo (int16 = real = float...), tak v Modbusu je to ve dvou registrech. HA tohle neumí, takže je potřeba to číslo rozložit na dvě 8bitová čísla a ty teprve poslat. Řešení není z mé hlavy, vylovil jsem ho z internetu po pár hodinách googlení. Viz ty řádky na konci kódu:

Kód: Vybrat vše

- id: '1746280324718'
  alias: automatizace_modbus_zapsat
  description: 
  triggers:
  - trigger: time_pattern
    seconds: /1
  conditions: []
  actions:
  - action: modbus.write_register
    metadata: {}
    data:
      hub: modbus_plc
      address: 106
      slave: 1
      value: '{{ states(''sensor.axpert01_inverter0_ac_output_active_power'') | int
        }}'
    alias: mosbus axpert power out
  - action: modbus.write_register
    metadata: {}
    data:
      hub: modbus_plc
      address: 102
      slave: 1
      value:
      - '{{ (states(''sensor.esphome_calb_current'') | float | pack(">f") | unpack(">I")) // 2**16 }}'
      - '{{ (states(''sensor.esphome_calb_current'') | float | pack(">f") | unpack(">I")) % 2**16 }}'
    alias: modbus aku1 proud
   mode: single
mobilní elektrárna (VW California): 290Wp mono, Winston 12V/130Ah, Victron MPPT 75/15, Victron inverter 250VA, Victron charger 20A. Orion 30A
domácí elektrárna "ETERNIT": FV 5kWp, LiFePO4 48V/120Ah+120Ah, Axpert King 48/5000
Odpovědět

Zpět na „Home Assistant“