Licznik ABB B23 112-100

Witam,
chciałem podpiąć licznik ABB B23 112-100 pod HA przez Modbus RS485.
Testna laptopie odczytu danych wypadł pomyślnie - coś tam odczytuje, więc komunikacja jest.
Niestety HA wypluwa ostrzeżenie:

Setup failed for 'sensors': Integration not found.
Setup failed for 'modbus': Integration failed to initialize.
Modbus PC contain no entities, causing instability, entry not loaded

Mój configuration.yaml:

# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

modbus:
- name: PC
  type: serial
  baudrate: 9600
  port: /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_B002FAKO-if00-port0
  bytesize: 8
  method: rtu
  parity: N
  stopbits: 1
  timeout: 2

sensors:
- name: Licznik1_L1_Voltage
  unit_of_measurement: V
  device_class: voltage
  slave: 1
  address: 0x5B00
  data_type: int16
- name: Licznik1_L2_Voltage
  unit_of_measurement: V
  device_class: voltage
  slave: 1
  address: 0x5B02
  data_type: int16
- name: Licznik1_L3_Voltage
  unit_of_measurement: V
  device_class: voltage
  slave: 1
  address: 0x5B04
  data_type: int16
- name: Licznik1_L1_Active_Power
  unit_of_measurement: W
  device_class: power
  slave: 1
  address: 0x5B16
  data_type: int16
  scale: 1000
- name: Licznik1_L2_Active_Power
  unit_of_measurement: W
  device_class: power
  slave: 1
  address: 0x5B18
  data_type: int16
  scale: 1000
- name: Licznik1_L3_Active_Power
  unit_of_measurement: W
  device_class: power
  slave: 1
  address: 0x5B1A
  data_type: int16
  scale: 1000
- name: Licznik1_Total_Active_Power
  unit_of_measurement: W
  device_class: power
  slave: 1
  address: 0x5B14
  data_type: int16
  scale: 1000
- name: Licznik1_L1_Current
  unit_of_measurement: A
  device_class: power
  slave: 1
  address: 0x5B0C
  data_type: int16
  precision: 2
- name: Licznik1_L2_Current
  unit_of_measurement: A
  device_class: power
  slave: 1
  address: 0x5B0E
  data_type: int16
  precision: 2
- name: Licznik1_L3_Current
  unit_of_measurement: A
  device_class: power
  slave: 1
  address: 0x5B10
  data_type: int16
  precision: 2

Tabela modbus licznika:


Proszę o pomoc, jak rozwiązać ten problem.

Nie poprawne wcięcia (każda spacja ma znaczenie!) w pliku .yaml, sekcja sensors także niepoprawna, popatrz w dukumentację - Modbus Example: sensor configuration jak to powinno wyglądać:

# Example configuration.yaml entry
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    sensors:
      - name: Sensor1
        unit_of_measurement: °C
        slave: 1
        address: 100
      - name: Sensor2
        unit_of_measurement: mg
        address: 110
        count: 2
      - name: Sensor3
        unit_of_measurement: °C
        slave: 1
        address: 120
        input_type: input
        data_type: float
        scale: 0.01
        offset: -273.16
        precision: 2

Wcięcia są ok, bo konfiguracja była poprawna w File editor :wink:

Skoro tak twierdzisz to OK, jeżeli w File editor nie wygląda to tak jak pokazałem, to działać nie będzie :wink: jednoznacznie jest to wskazane w logach:

Setup failed for 'sensors': Integration not found.
Setup failed for 'modbus': Integration failed to initialize.
Modbus PC contain no entities

po automatycznym tłumaczeniu:

Instalacja nie powiodła się dla 'sensors': Integracja nie została znaleziona.
Instalacja nie powiodła się dla 'modbus': Integracja nie została zainicjowana.
Modbus PC nie zawiera żadnych encji

Totalnie nie rozumiem takiego podejścia: nie wiesz czegoś (ja też wielu rzeczy nie wiem), prosisz o pomoc (ja też proszę o pomoc w różnych tematach), dostajesz wskazówki gdzie masz źle ale upierasz się, że “wcięcia są ok”.

  type: serial

sensors:

Tam, pomiedzy, jest pusta linia i to jest między innymi źle, ale Edytor edytor pokazuje dobrze :wink: . Żadne narzędzie, żaden edytor nie pokaże Ci w tym miejscu - w składni yaml - błędu.

Wrzuciłem pytanie do ChatGPT:
“gdzie jest bład w ponizszym pliku yaml:
tu wkleiłem Twoj plik”
Uzyskana odpowiedz:
" W pliku YAML, który podałeś, zauważyłem kilka możliwych problemów, które mogą powodować błąd. Oto najczęstsze przyczyny:

  1. Błąd w identacji – YAML jest bardzo wrażliwy na białe znaki (spacje i tabulatory). Należy upewnić się, że identacja jest poprawna, tzn. wszystkie elementy muszą być odpowiednio wcięte względem swoich rodziców.
  2. Potencjalne niezgodności w użyciu !include – Jeśli używasz !include do załadowania plików (takich jak automations.yaml, scripts.yaml, scenes.yaml), musisz upewnić się, że te pliki istnieją w odpowiednich lokalizacjach i są poprawnie sformatowane.
  3. Modbus configuration – Sekcja konfiguracji modbus i sensorów wygląda w porządku, ale warto sprawdzić, czy wszystkie adresy i inne parametry są poprawne w odniesieniu do konkretnego urządzenia Modbus.
  4. Sprawdzanie literówek – Zwróć uwagę na nazwy kluczy i wartości. W YAML każda litera jest istotna, więc błędnie wpisany klucz może powodować błąd.

Na podstawie powyższych obserwacji i domniemanych problemów, oto kilka sugestii:

  • Sprawdź spacje: Upewnij się, że nie używasz tabulatorów, tylko spacji do wcięć. Spacje muszą być spójne (zwykle 2 lub 4 spacje na poziom wcięcia).
  • Struktura modbus: Jeśli niektóre urządzenia są opcjonalne w konfiguracji, może być wymagane dodanie odpowiednich atrybutów, np. dla niektórych sensorów, jeżeli są niepoprawnie zapisane (sprawdź dokładnie dokumentację).

Jeśli nadal masz problemy, możesz podać więcej szczegółów, co dokładnie generuje błąd."

I co Ty na to?

3 polubienia

Rozumiem, że tego nie rozumiesz, ale poprawna składnia YAML (którą sprawdza uproszczony linter YAML wbudowany w edytor) jest warunkiem koniecznym, ale równocześnie nie jest warunkiem wystarczającym dla działania jakiejś konfiguracji…
(bo sam prawidłowy format YAMLa nie oznacza, że to są poprawne zapisy konfiguracyjne)

Aby to mogło działać konfiguracja musi być zgodna z dokumentacją (a to co wkleiłeś nie jest).
Bardziej zaawansowany linter jest w narzędziach deweloperskich w sekcji YAML.

PS Puste linie nie są zakazane (nadają się do zwiększania czytelności kodu), ale brakujące wcięcia są niedopuszczalne, tu jeszcze dodam, że wcięcia mają się składać ze spacji, a nie z tabulatorów (to na wypadek korzystania z edytora który ma opcje automatycznej konwersji ciągu spacji w tabulatory - tu to jest niepożądane, a wręcz niedouszczalne!).

1 polubienie

Dzięki za szczegółowe i łopatologiczne wytłumaczenie, że poprawna konfiguracja w Edytor file nie jest warunkiem wystarczającym.

Na dobry początek popraw tak (celowo wywaliłem resztę sensorów, bo do sprawdzenia wystarczy jeden)

modbus:
  - name: PC
    type: serial
    baudrate: 9600
    port: /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_B002FAKO-if00-port0
    bytesize: 8
    method: rtu
    parity: N
    stopbits: 1
    timeout: 2 # jesteś pewnien, że chcesz zmniejszyć z domyślnego 5 sekund?

    sensors:
      - name: Licznik1_L1_Voltage
        unit_of_measurement: V
        device_class: voltage
        slave: 1
        address: 0x5B00
        data_type: uint32

potem sobie porównasz typy danych w/g dokumentacji, bo z tego urywka datasheeta do tego sensora chyba pasuje uint32, ale do mocy pewnie będzie już pasować int32, a do niektórych innych uint16 lub int16
Dodatkowo wartości będzie trzeba dzielić przez 10 lub 100 (czyli można mnożyć przez 0.1 lub 0.01 zamiast dzielić, jak kto woli skoro jest opcja scale, która mnoży)

Poprawiłem wcięcia, tzn zamieniłem tabulatory na spacje. Dzięki teraz wypluwa dane, pozostaje tylko kosmetyka i testowanie.
Mam tylko jeszcze pytanie czy to jest problem, że encje nie mają unikalnego identyfikatora i dlatego z poziomu interfejsu użytkownika nie można zarządzać jej ustawieniami.
A może da się jakoś to id “wymusić”?

Da się wymusić, ale powinieneś też zadbać o przeliczenie wartości.

    sensors:
      - name: Licznik1_L1_Voltage
        unit_of_measurement: V
        device_class: voltage
        slave: 1
        address: 0x5B00
        data_type: uint32
        unique_id: 1aa3c87423d14e0c983b555b5c710767
                          

możesz skorzystać z jakiegoś generatora online np. UUID v4 bez myślników

a tak generalnie to proponuję dogłębnie przeczytać dokumentację tej integracji, przecież akurat to tam jest
https://www.home-assistant.io/integrations/modbus/#configuring-sensor-entities

1 polubienie

@jaro444 można prościej, unique_id może być taki sam jak name, nazwa encji też musi być unikalna (jeżeli nie będzie unikalna HA doda na końcu kolejne numerki _1, _2 itd), u siebie wszędzie tak robię, np.

#   SDM_IMPORT_ACTIVE_ENERGY:
      - name: sdmf1_import_active_energy
        unique_id: sdmf1_import_active_energy
2 polubienia

Ogarnąłem to jakoś i to co potrzebne działa.
Dziękuję za pomoc i wrzucam config, może ktoś skorzysta :smiley:

modbus:
  - name: PC
    type: serial
    baudrate: 9600
    port: /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_B002FAKO-if00-port0
    bytesize: 8
    method: rtu
    parity: N
    stopbits: 1

    sensors:
      - name: Pompa_ciepła_Active_Power_L1
        unit_of_measurement: W
        device_class: power
        slave: 1
        address: 0x5B16
        data_type: int32
        scale: 0.01
        unique_id: Pompa_ciepła_Active_Power_L1

      - name: Pompa_ciepła_Active_Power_L2
        unit_of_measurement: W
        device_class: power
        slave: 1
        address: 0x5B18
        data_type: int32
        scale: 0.01
        unique_id: Pompa_ciepła_Active_Power_L2

      - name: Pompa_ciepła_Active_Power_L3
        unit_of_measurement: W
        device_class: power
        slave: 1
        address: 0x5B1A
        data_type: int32
        scale: 0.01
        unique_id: Pompa_ciepła_Active_Power_L3

      - name: Pompa_ciepła_Active_Power_Total
        unit_of_measurement: W
        device_class: power
        slave: 1
        address: 0x5B14
        data_type: int32
        scale: 0.01
        unique_id: Pompa_ciepła_Active_Power_Total

      - name: Pompa-ciepła_Voltage_L1
        unit_of_measurement: V
        device_class: voltage
        slave: 1
        address: 0x5B00
        data_type: uint32
        scale: 0.1
        unique_id: Pompa-ciepła_Voltage_L1

      - name: Pompa-ciepła_Voltage_L2
        unit_of_measurement: V
        device_class: voltage
        slave: 1
        address: 0x5B02
        data_type: uint32
        scale: 0.1
        unique_id: Pompa-ciepła_Voltage_L2

      - name: Pompa-ciepła_Voltage_L3
        unit_of_measurement: V
        device_class: voltage
        slave: 1
        address: 0x5B04
        data_type: uint32
        scale: 0.1
        unique_id: Pompa-ciepła_Voltage_L3

      - name: Pompa-ciepła_Current_L1
        unit_of_measurement: A
        device_class: current
        slave: 1
        address: 0x5B0C
        data_type: uint32
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Current_L1

      - name: Pompa-ciepła_Current_L2
        unit_of_measurement: A
        device_class: current
        slave: 1
        address: 0x5B0E
        data_type: uint32
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Current_L2

      - name: Pompa-ciepła_Current_L3
        unit_of_measurement: A
        device_class: current
        slave: 1
        address: 0x5B10
        data_type: uint32
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Current_L3

      - name: Pompa-ciepła_Active_Energy_L1
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        slave: 1
        address: 0x5460
        data_type: uint64
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Active_Energy_L1

      - name: Pompa-ciepła_Active_Energy_L2
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        slave: 1
        address: 0x5464
        data_type: uint64
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Active_Energy_L2

      - name: Pompa-ciepła_Active_Energy_L3
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        slave: 1
        address: 0x5468
        data_type: uint64
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Active_Energy_L3

      - name: Pompa-ciepła_Active_Energy_Total
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        slave: 1
        address: 0x5000
        data_type: uint64
        scale: 0.01
        precision: 2
        unique_id: Pompa-ciepła_Active_Energy_Total
        

2CMC485003M0201_en_B23_B24_User_Manual.pdf.zip (1,4 MB)

2 polubienia

moim zdaniem tu poprawka

      - name: Pompa_ciepła_Active_Power_L3
        unit_of_measurement: W
        device_class: power
        slave: 1
        address: 0x5B1A
        data_type: int32
        scale: 0.01
        unique_id: Pompa_ciepła_Active_Power_L3

nie załączyłeś też kawałka datasheeta (lub całego datasheeta jako załcznik .zip) by było wiadomo skąd się bierze to i dalsza część konfiguracji

Moim skromnym zdaniem jest ok. To co podałeś to active import energy (aktualny stan licznika), a nie active power (bieżący pobór)
Ps.
Dorzuciłem załącznik z datasheet dla tego licznika.
Pozdr.

To jest twój YAML, tylko typ danych się nie zgadzał (na podstawie tego kawałka dokumentacji, z którego jest obrazek wcześniej - niewłaściwy typ danych nie zawsze się ujawnia w postaci niepoprawnego wskazania w tej chwili, ale często się ujawnia w nieoczekiwanych okolicznościach), a w pozostałych kwestiach po prostu spakuj do zipa posiadaną dokumentację i wrzuć jako załącznik (albo dorób chociaż jej screenshoty jako referencję dla przyszłych użytkowników).
Widzę że już dołożyłeś

Mógłbyś mnie uświadomić co tam jest źle, bo nie potrafię nic znaleźć?


ahh, ok przeoczyłem to, bo wrzuciłeś poprawnie, a ja w tym co wkleiłeś szukałem błędu :smiley:

:rofl:
To wskazanie prawdopodobnie nigdy nie osiągnie wartości która by spowodowała problem, mimo to warto sprawdzać zawsze takie szczególiki z dokumentacją…

No raczej nie spodziewam się ujemnych wartości w poborze :smiley: