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 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ę
moj config.yaml teraz wygląda tak
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:
- 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”
- Status jest w rejestrze pierwszym (adr,0x0000) - dokumentację Waść czytał ?
- 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
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?
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
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
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.
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
Chyba ze już mnie żona zabije za 3 tygodnie siedzenia i szukania w necie
tak… po tym jak zapytałem @MariuszAK podsunął dobry pomysł - pytania nie było.
“kto pierwszy ten lepszy”