Home assistant i falownik sofarsolar

Ma na 90% inną mapę rejestrów - start od adr 0
Ustawienia EW11

A możesz podesłać przykład swojej konfiguracji.yaml?
Już zmieniłem ustawienia EW11

Nie mam tego czego oczekujesz. W zamian adresacja rejestrów

Dla próby ustaw tylko jeden sensor i ustaw adres z rozpiski, jeśli odczyta poprawnie tzn. ,że można jej użyć.

Dziękuję bardzo dziś już niestety nie sprawdzę (słońce zaszło :slight_smile: ale jeśli dobrze rozumiem na adresie 6 będę miał PV1 Voltage ?

Tak, jeśli rejestry pasują do Twojego falownika to powinieneś otrzymać na tym adresie napięcie z pierwszego stringa.

Mam jeszcze 3 pytanie jeśli mogę :slight_smile:

moj config.yaml teraz wygląda tak :slight_smile:

    
modbus:
  - type: tcp
    host: xxx.xxx.xxx.xxx
    port: 9999
    name: Sofar
    timeout: 10
    delay: 2
    message_wait_milliseconds: 30
    sensors:
      - name: PV1 Voltage
        unit_of_measurement: V
        slave: 1
        address: 6
        input_type: holding
 #       count: 1
        data_type: uint16
        precision: 1
        scale: 0.1
        scan_interval: 5
        device_class: voltage
 #       structure: ">1H"
 
      - name: PV1 input current
        unit_of_measurement: A
        slave: 1
        address: 7
        input_type: holding
        data_type: int16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: current
        
      - name: PV1 power
        unit_of_measurement: kW
        slave: 1
        address: 10
        input_type: holding
        data_type: uint16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: power
        
      - name: Output active power
        unit_of_measurement: kW
        slave: 1
        address: 12
        input_type: holding
        data_type: uint16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: power
 
      - name: A-phase voltage
        unit_of_measurement: V
        slave: 1
        address: 15
        input_type: holding
        data_type: uint16
        precision: 1
        scale: 0.1
        scan_interval: 5
        device_class: voltage
        
      - name: B-phase voltage
        unit_of_measurement: V
        slave: 1
        address: 17
        input_type: holding
        data_type: uint16
        precision: 1
        scale: 0.1
        scan_interval: 5
        device_class: voltage
        
      - name: C-phase voltage
        unit_of_measurement: V
        slave: 1
        address: 19
        input_type: holding
        data_type: uint16
        precision: 1
        scale: 0.1
        scan_interval: 5
        device_class: voltage
        
      - name: A-phase current
        unit_of_measurement: A
        slave: 1
        address: 16
        input_type: holding
        data_type: uint16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: current
        
      - name: B-phase current
        unit_of_measurement: A
        slave: 1
        address: 18
        input_type: holding
        data_type: uint16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: current
        
      - name: C-phase current
        unit_of_measurement: A
        slave: 1
        address: 20
        input_type: holding
        data_type: uint16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: current
 
 
      - name: Total production high-byte
        unit_of_measurement: kWh
        slave: 1
        address: 21
        input_type: holding
        data_type: uint16
  #      precision: 2
  #      scale: 0.01
        scan_interval: 5
        device_class: energy
 
      - name: Total production low-byte
        unit_of_measurement: kWh
        slave: 1
        address: 22
        input_type: holding
        data_type: uint16
  #      precision: 2
  #      scale: 0.01
        scan_interval: 5
        device_class: energy 
        
      - name: Today production
        unit_of_measurement: kWh
        slave: 1
        address: 25
        input_type: holding
        data_type: uint16
        precision: 2
        scale: 0.01
        scan_interval: 5
        device_class: energy 
        state_class: total
 

Wartosci są wyswietlane prawidłowe w HA natomiast mam 3 problemy:

  1. jak zrobic i na jakim adresie takie cos wyciągniete z esphome w config yaml?
text_sensor:
  - platform: modbus_controller
    modbus_controller_id: sofarsolar
    name: ${friendly_name} Status
    id: inverter_status
    register_type: holding
    address: 0x0404
    response_size: 2
    lambda: |-
      auto z = "Unknown";
      char d = data[item->offset+1];
      if (d == 0) z = "Wait";
      else if (d == 1) z = "Check";
      else if (d == 2) z = "Normal";
      else if (d == 3) z = "Fault";
      else if (d == 4) z = "Permanent";
      return {z};

2 jakie powinny być ustawienia state_class: w config.yaml i template dla Today production żeby dodać to do panelu Energia?

3 mam taki błąd w logach i nie wiem co to oznacza

“Modbus Sofar timeout(10) is adjusted(4) due to scan_interval”

  1. Status jest w rejestrze pierwszym (adr,0x0000) - dokumentację Waść czytał ? :wink:
      - name: Total production high-byte
        unit_of_measurement: kWh
        slave: 1
        address: 21
        input_type: holding
        data_type: uint16
  #      precision: 2
  #      scale: 0.01
        scan_interval: 5
        device_class: energy
 
      - name: Total production low-byte
        unit_of_measurement: kWh
        slave: 1
        address: 22
        input_type: holding
        data_type: uint16
  #      precision: 2
  #      scale: 0.01
        scan_interval: 5
        device_class: energy 

Total jest 32bitowy = składa się z dwóch rejestrów więc powinien być odczytowany jako

     - name: Total production 
        unit_of_measurement: kWh
        slave: 1
        address: 21
        input_type: holding
        data_type: uint32
  #      precision: 2
  #      scale: 0.01
        scan_interval: 5
        device_class: energy

Odsyłam do poprzedniego linku - tam jest opisane jak z odczytów zrobić utility_meter, które można dodać do panelu energia.

Limit czasu Modbus Sofar(10) został dostosowany(4) ze względu na scan_interval - tyle i aż mówi tłumacz.

timeout ma ustawiony na 10 a modbus bombardujesz odczytami co 5 - nie dająć czasu na odpowiedź. Modbus się broni aby w kolejce nie było tych samych zapytan.
timeout powinien być krótszy od scan_interval

Dziękuję za pomoc ale jeszcze o cos dopytam :slight_smile:
Odnośnie pytania 1
Czytam już status w formie cyferek ale chciałem zrobić Template z podziałem na słowne wyświetlanie więc w pomocnikach Template i dodalem takie cos w State template*

{% if is_state('sensor.status', '0') %}
  Wait
{% if is_state('sensor.status', '1') %}
  Check
{% if is_state('sensor.status', '2') %}
  Normal
{% if is_state('sensor.status', '3') %}
  Fault
{% if is_state('sensor.status', '4') %}
  Permanent
{% else %}
  Niedostepny
{% endif %}

I pojawia mi się błąd
invalid template (TemplateSyntaxError: Unexpected end of template. Jinja was looking for the following tags: ‘elif’ or ‘else’ or ‘endif’. The innermost block that needs to be closed is ‘if’.)
Coś chyba robię nie tak?

Odnośnie pytania 2
Zrobiłem jak radziłeś utility_meter i mam pytanie co się stanie po roku jak wartość się wyzeruje?

… za dużo "if-ów ", spróbuj tak …

{% if is_state('sensor.status', '0') %}
  Wait
{% elif is_state('sensor.status', '1') %}
  Check
{% elif is_state('sensor.status', '2') %}
  Normal
{% elif is_state('sensor.status', '3') %}
  Fault
{% elif is_state('sensor.status', '4') %}
  Permanent
{% else %}
  Niedostepny
{% endif %}

zacznie liczyć od nowa …

To może podpowiesz jak te wszystkie zależności zmieścić w jednym ifie? :slight_smile:
A co do drugiego to jak mi się dzienna produkcja zeruje to w karcie energia mam minus wartość wygenerowaną wczorajszego dnia

Tak jak podałem wyżej (if a potem elif itd).

Dzięki nie zauważyłem tego :slight_smile:

To wszystko jest w podlinkowanym temacie. Jeszcze raz nie będę przepisywał.
To jest problem kiedy zerują ci się encje produkcji - muszą po północy a nie z chwilą utraty połączenia.

Czyli bez NR się nie obejdzie :frowning:

A czy mógł byś podesłać jakiś flow z jednym pomiarem pod moją instalacje czyli sofar po modbus ew11?

To może chociaż ktoś wie czy w configuration.yaml można zrobić ifa włączającego modbus po wschodzie słońca ?

Co pokazują encje produkcji energii gdy falownik nie odpowiada? np. teraz…

Tutaj raczej nic nie zrobisz… jeśli już to prosta automatyzacja (dwie): wschód słońca to usługa modbus.restart a po zachodzie modbus.stop. Ewentualnie jakieś przesunięcie +/- względem wschodu i zachodu.

1 polubienie

Encjencje pokazują niedostępny ale pojawiają się błędy w logach

Logger: pymodbus.logging
Source: components/modbus/modbus.py:452
First occurred: 00:12:47 (10980 occurrences)
Last logged: 19:59:46

Connection to (xxx.xxx.xxx.xxx 9999) failed: [Errno 113] Host is unreachable
Connection to (xxx.xxx.xxx.xxx , 9999) failed: timed out
Connection to (xxx.xxx.xxx.xxx , 9999) failed: [Errno 111] Connection refused

Logger: aiohttp.server
Source: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:421
First occurred: 08:00:44 (3 occurrences)
Last logged: 19:11:02

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 350, in data_received
    messages, upgraded, tail = self._request_parser.feed_data(data)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "aiohttp/_http_parser.pyx", line 557, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: 400, message:
  Invalid method encountered:

    b'\x16\x03\x01'
      ^


Logger: homeassistant.helpers.event
Source: helpers/event.py:296
First occurred: 17:54:59 (2 occurrences)
Last logged: 17:55:02

Error while dispatching event for sensor.total_production to <Job track state_changed event {'sensor.total_production'} HassJobType.Callback <bound method TrackTemplateResultInfo._refresh of <TrackTemplateResultInfo {Template<template=({{ states('sensor.total_production') }}) renders=12>: <RenderInfo Template<template=({{ states('sensor.total_production') }}) renders=12> all_states=False all_states_lifecycle=False domains=frozenset() domains_lifecycle=frozenset() entities=frozenset({'sensor.total_production'}) rate_limit=None has_time=False exception=None is_static=False>}>>>
Error while dispatching event for sensor.today_production to <Job track state_changed event {'sensor.today_production'} HassJobType.Callback <bound method TrackTemplateResultInfo._refresh of <TrackTemplateResultInfo {Template<template=({{ states('sensor.today_production') }}) renders=362>: <RenderInfo Template<template=({{ states('sensor.today_production') }}) renders=362> all_states=False all_states_lifecycle=False domains=frozenset() domains_lifecycle=frozenset() entities=frozenset({'sensor.today_production'}) rate_limit=None has_time=False exception=None is_static=False>}>>>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/sensor/__init__.py", line 669, in state
    numerical_value = float(value)  # type:ignore[arg-type]
                      ^^^^^^^^^^^^
ValueError: could not convert string to float: 'unavailable'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/event.py", line 296, in _async_dispatch_entity_id_event
    hass.async_run_hass_job(job, event)
  File "/usr/src/homeassistant/homeassistant/core.py", line 700, in async_run_hass_job
    hassjob.target(*args)
  File "/usr/src/homeassistant/homeassistant/helpers/event.py", line 1215, in _refresh
    self.hass.async_run_hass_job(self._job, event, updates)
  File "/usr/src/homeassistant/homeassistant/core.py", line 700, in async_run_hass_job
    hassjob.target(*args)
  File "/usr/src/homeassistant/homeassistant/components/template/template_entity.py", line 434, in _handle_results
    self.async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 989, in async_write_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1110, in _async_write_ha_state
    state, attr, capabilities, shadowed_attr = self.__async_calculate_state()
                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1047, in __async_calculate_state
    state = self._stringify_state(available)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 995, in _stringify_state
    if (state := self.state) is None:
                 ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/sensor/__init__.py", line 671, in state
    raise ValueError(
ValueError: Sensor sensor.produkcja has device class 'energy', state class 'total' unit 'kWh' and suggested precision 'None' thus indicating it has a numeric value; however, it has the non-numeric value: 'unavailable' (<class 'str'>)

i jeszcze kilka innych dziwnych i 10 min uruchamia się HA
Pomysł Mariusza wydaje być się dobrym spróbuje tego jak się uda to wstawie tu poradnik gotowca do tego falownika :slight_smile:
Chyba ze już mnie żona zabije za 3 tygodnie siedzenia i szukania w necie :slight_smile:

tak… po tym jak zapytałem @MariuszAK podsunął dobry pomysł - pytania nie było.

“kto pierwszy ten lepszy” :stuck_out_tongue_winking_eye: