Rekuperator Thessla, problem z modbusem

Tam nie powinno być linii platform command_line - coś musiałeś źle skopiować.

Rekuperator Thessla, problem z modbusem - #15 przez dar3k tu w tym poście wkleiłem konfigurację na pastebin.

@PLyjo zmień sensor: na - sensor: zaraz po template:
Błąd mówi, że interpreter spodziewa się tablicy i jej nie dostaje, tutaj masz jeden element w tablicy którym jest owy sensor.

Druga rzecz, to co już poprzednicy mówili, błędnie dodane jest tam - command_line:
po - sensor: powinno być od razu - name:

Edit:

@Jabol dzięki za filmik, dzięki niemu, udało się bez większych problemów spiąć moją TG z HA :slight_smile:

Cześć.
Amatorskie pytanie do osób które korzystają z elfina EW11A.
Widzę elfina że rozgłasza wifi ale nie wiem jak się z nim połączyć w celu skonfigurowania. Jakiś adres czy coś??

A co na to instrukcja? Standardowy IP z sieci 10.x.x.x nie działa?

Hint: jak się łączysz do samodzielnego urządzenia pracującego w trybie AP, które rozgłasza własną sieć LAN z własnym serwerem DHCP, to w systemie operacyjnym, z którego się łączysz możesz podejrzeć własności tego połączenia, tam znajdziesz IP, jeśli natomiast nie ma DHCP to istnieją metody oparte na ARP lub konieczność przeczytania instrukcji również “między wierszami”.

Dla tych zaczynających od nowa i braci na wczesnym etapie implementacji tutaj znacznie uproszczone i poprawione sensory:

Zmiany głównie poprawiają odporność sensorów na zbieranie bzdurnych wartości granicznych, kiedy jeden z czujników jest w stanie 0 lub unknown, a inne nadal wypluwają przemnożenia przez zero, itp.

Dzięki temu wreszcie nie mam negatywnych sprawności, czy też 100 kW odzysku momentami:

Dodatkowo usunąłem z pomocą Discord HA wiele wariantów w publikowanych wyżej schematach, kiedy fizycznie sytuacja nie może mieć miejsca (np. chłodzenie kiedy zimno itp.), a schemat ją zakłada, toteż tworzą się czasem błędy logiczne kiedy HA startuje albo Reku lub adapter się wywalają.

Od zmiany generowane dane są bardzo czyste i dają możliwość rzeczywistych kalkulacji (średnich, median) bez konieczności ręcznego czyszczenia. Jak dla mnie zbieranie danych typu dzienny/miesięczny odzysk, czy średnia sprawność na powyższych czujnikach generowało bardzo zakłamane wartości.

Tutaj, żeby mnie ktoś źle nie zrozumiał- autor pierwotnej konfiguracji umożliwił mi wejście w temat i czerpałem garściami z jego wiedzy, za co wielkie ukłony. Natomiast po pewnym czasie zacząłem mieć przesyt powyższych problemów.

  - sensor:
      - name: Ventilation energy efficiency
        unique_id: recu_energy_efficiency
        icon: mdi:percent
        unit_of_measurement: "%"
        state: >
          {% set t1 = states('sensor.incoming_air_temperature') | float %}
          {% set t2 = states('sensor.room_supply_temperature') | float %}
          {% set t3 = states('sensor.room_exhaust_temperature') | float %}
          {% if is_state('binary_sensor.ventilation_bypass', 'off') and is_state('binary_sensor.fan_operational', 'on') and is_state('switch.open_windows', 'off') and t1 != t3 %}
            {% set output = (t2 - t1) / (t3 - t1) * 100 %}
            {{ ([ 0, output, 100] | sort)[1] | round(2) }}
          {% else %}
            0
          {% endif %}
        availability: >
          {{ [
                'sensor.incoming_air_temperature',
                'sensor.room_supply_temperature',
                'sensor.room_exhaust_temperature'
            ] | map('states') | select('is_number') | list | length == 3 }}


      - name: Ventilation supply flow rate
        unique_id: "recu_supply_flow_rate_percent"
        icon: "mdi:percent"
        unit_of_measurement: "%"
        state: >
          {% set flowN = states('sensor.air_supply_flow') | float %}
          {{ ((flowN * 100) / 420 |float) | round(2, default=0) }}
        availability: "{{ states('sensor.air_supply_flow') | is_number }}"

      - name: Ventilation exhaust flow rate
        unique_id: "recu_exhaust_flow_rate_percent"
        icon: "mdi:percent"
        unit_of_measurement: "%"
        state: >
          {% set flowW = states('sensor.air_exhaust_flow') | float %}
          {{ ((flowW * 100) / 420|float) | round(2, default=0) }}
        availability: "{{ states('sensor.air_exhaust_flow') | is_number }}"

      - name: Ventilation power recovery
        unique_id: "recu_power_recovery"
        icon: "mdi:counter"
        unit_of_measurement: "W"
        device_class: power
        state: >
            {% set flowIN = states('sensor.air_supply_flow') | float %}
            {% set tIN = states('sensor.incoming_air_temperature') | float %}
            {% set tROOM = states('sensor.room_supply_temperature') | float %}
            {% if is_state('binary_sensor.ventilation_bypass', 'off') and is_state('switch.open_windows', 'off') %}
                {{ (((tROOM - tIN) * flowIN * 1200) / 3600) | abs | round(2) }}
            {% else %}
              0
            {% endif %}
        availability: >
          {{ [
                'sensor.air_supply_flow',
                'sensor.incoming_air_temperature',
                'sensor.room_supply_temperature'
              ] | map('states') | select('is_number') | list | length == 3 }}

Tutaj do kompletu poprawione dla nowej składni HA czujniki/włączniki modbus:

modbus:
  - name: rs485
    type: rtuovertcp
    host: IP ADDRESS
    port: PORT
    delay: 2
    timeout: 10
    sensors:
      - name: Incoming air temperature
        address: 16
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_outside_temp
      - name: Room supply temperature
        address: 17
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_supply_temp
      - name: Room exhaust temperature
        address: 18
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_exhaust_temp
      - name: Post FPX temperature
        address: 19
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_fpx_temp
      - name: Server room temperature
        address: 22
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_ambient_temp
      - name: Air supply flow
        address: 256
        data_type: int16
        input_type: holding
        precision: 2
        scale: 1
        scan_interval: 10
        slave: 11
        unit_of_measurement: m³/h
        state_class: measurement
        unique_id: recu_supply_flow
      # - name: Current air supply flow
      #   address: 320
      #   count: 1
      #   data_type: int16
      #   input_type: holding
      #   precision: 2
      #   scale: 1
      #   scan_interval: 10
      #   slave: 11
      #   unit_of_measurement: m³/h
      #   state_class: measurement
      #   unique_id: recu_current_supply_flow
      - name: Air exhaust flow
        address: 257
        slave: 11
        precision: 2
        scale: 1
        scan_interval: 10
        data_type: int16
        input_type: holding
        unit_of_measurement: m³/h
        state_class: measurement
        unique_id: recu_exhaust_flow
      # - name: Current air exhaust flow
      #   address: 321
      #   count: 1
      #   data_type: int16
      #   input_type: holding
      #   precision: 2
      #   scale: 1
      #   scan_interval: 10
      #   slave: 11
      #   unit_of_measurement: m³/h
      #   state_class: measurement
      #   unique_id: recu_current_exhaust_flow
      - name: Rekuperator speedmanual
        address: 4210
        slave: 11
        scan_interval: 5
        data_type: int16
        input_type: holding 
        unit_of_measurement: '%'
      - name: FPX mode
        address: 4198
        slave: 11
        scan_interval: 10
        data_type: int16
        input_type: holding 
    binary_sensors:
      - name: Ventilation bypass
        address: 9
        slave: 11
        scan_interval: 10
        input_type: coil
        device_class: opening
        unique_id: recu_bypass
      - name: Fan Operational
        address: 11
        slave: 11
        scan_interval: 5
        input_type: coil
        device_class: moving
        unique_id: recu_fansON
      - name: FPX state
        address: 4192
        slave: 11
        scan_interval: 10
        input_type: holding
        device_class: running
        unique_id: recu_fpx
    switches:
      - name: Airing
        address: 4224
        slave: 11
        write_type: holding
        command_on: 7
        command_off: 0
        verify:
        unique_id: recu_airing
      - name: Open windows
        address: 4224
        slave: 11
        write_type: holding
        command_on: 10
        command_off: 0
        verify:
        unique_id: recu_open_windows
      - name: Away mode
        address: 4224
        slave: 11
        write_type: holding
        command_on: 11
        command_off: 0
        verify:
        unique_id: recu_away_mode
      - name: Fireplace mode
        slave: 11
        write_type: holding
        scan_interval: 5
        address: 4224
        command_on: 2
        command_off: 0
        verify:
        unique_id: recu_fireplace
      - name: Operating mode - Auto
        address: 4208
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 0
        command_off: 1  
        verify:
        unique_id: recu_mode_auto
      - name: Bypass
        address: 4320
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 0
        command_off: 1
        verify:
        unique_id: recu_bypass
      - name: Winter mode
        address: 4209
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 1
        command_off: 0  
        verify:
        unique_id: recu_winter
      - name: Recu ON/OFF
        address: 4387
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 1
        command_off: 0
        verify:
        unique_id: recu_onoff

Jeżeli ktoś ma jakieś propozycje dalszej optymalizacji, chętnie wysłucham.

Czołem!

2 polubienia

Super bo właśnie o to chodziło w dzieleniu się konfiguracja aby ktoś kto ma więcej wolnego czasu bądź samozaparcia ja skończył i wyszlifował :wink:
Jeszcze możesz spróbować powalczyć z tymi błędami w logach od rejestrów zwracających stan pracy - to jest do zrobienia na template ale jest na mojej todo list i albo brak czasu albo chęci (skoro działa a w logu tylko wpis to wyłączyłem logi i problemu nie ma;) )

1 polubienie

Dzięki ,udało się, Nie mogłem znaleźć adresu ip.

Hej
Czy udało ci się poprawić te odczyty?

Podpowie ktoś w czym tkwi problem z poniższym wyliczeniem odzysku itp (pierwsza częśc wklejonego kodu) od pewnego czasu mam komunikat encji: “Ta encja nie jest już dostarczana przez template. Jeśli encja nie jest już używana, usuń ją w ustawieniach.” programistą nie jestem, totalnie brakuje mi juz pomysłów żeby to przywrócić w pełni do życia.

template:
 - sensor:
    - name: "Rekuperator Sprawność"
      unique_id: sensor.rekuperator_sprawnosc
      icon: "mdi:percent"
      unit_of_measurement: "%"
      state: >
        {% if is_state('binary_sensor.rekuperator_silownik_bypassu', 'off') %}
          {% set t1 = states('sensor.rekuperator_temperatura_czerpnia') | float %}
          {% set t2 = states('sensor.rekuperator_temperatura_nawiew') | float %}
          {% set t3 = states('sensor.rekuperator_temperatura_wywiew') | float %}
          {{ (((t2 - t1) / (t3 - t1)) * 100 | float) | round(2, default=0) }}
        {% else %}
          0
        {% endif %}
    - name: "Rekuperator Wysterowanie Nawiew"
      unique_id: sensor.rekuperator_wysterowanie_nawiew
      icon: "mdi:percent"
      unit_of_measurement: "%"
      state: >
        {% set flowN = states('sensor.rekuperator_strumien_nawiew') | float %}
        {{ ((flowN * 100) / 360 | float) | round(2, default=0) }}
    - name: "Rekuperator Wysterowanie Wywiew"
      unique_id: sensor.rekuperator_wysterowanie_wywiew
      icon: "mdi:percent"
      unit_of_measurement: "%"
      state: >
        {% set flowW = states('sensor.rekuperator_strumien_wywiew') | float %}
        {{ ((flowW * 100) / 360 | float) | round(2, default=0) }}
    - name: "Rekuperator Odzyskana Moc"
      unique_id: sensor.rekuperator_odzyskana_moc  
      icon: "mdi:counter"
      unit_of_measurement: "W"
      state: >
        {% if is_state('binary_sensor.rekuperator_silownik_bypassu', 'off') %}
          {% set strumienN = states('sensor.rekuperator_strumien_nawiew') | float %}
          {% set tcz = states('sensor.rekuperator_temperatura_czerpnia') | float %}
          {% set tn = states('sensor.rekuperator_temperatura_nawiew') | float %}
          {{ (((tn - tcz) * strumienN * 1200) / 3600 | float) | round(2, default=0) if tcz < strumienN else ((((tn - tcz) * strumienN * 1200) / 3600) * -1) | round(2, default=0) }}
        {% else %}
          0
        {% endif %}

Tu są 4 różne encje. Której konkretnie Ci brakuje?

Wszystko co niedostępne i tam gdzie wykrzynik - usunięta encja.

image

Nie było tematu, ogarnięte :wink:

To podziel się rozwiązaniem, może ktoś skorzysta?

2 polubienia

Cześć, nie mogę sobie poradzić z podłączeniem TG do HA. Może ktoś mi coś podpowie

  1. Moduł - mam moduł Waveshark RS232RS485 to ETH

  2. Rekuperator - Airpack 300h Enthalpy ze stycznia 2023

  3. Przewód - od strony modułu RS485 ma 3 wejścia (A+), (B-), (GND). Od strony reku jest to wejście 8pin jak do ethernet. Wziąłem zwykłą skrętkę, uciąłem z jednej strony i podłączyłem według schematu - pomarańczowy (pin 2) do (A+), biało-pomarańczowy (pin 1) do (B-), brązowy pin (8) do uziemienia. Przewód wpięty do gniazda Airmobile/Modbus RTU, ale próbowałem też do Air++


  4. Konfiguracja modułu pod RS485

  5. Konfiguracja HA
    Skorzystałem z tego configa https://pastebin.com/raw/beQs7YcL. Zmieniłem tylko IP i port. Config poszedł do:

packages/rekuperator/rekuperator.yaml

w configuraton.yaml mam taki wpis

homeassistant:
  packages: !include_dir_merge_named packages/

Na razie do głowy przychodzi mi tylko inny przewód i ewentualnie zobaczenie czy na pinach 3 i 4 idzie transmisja. Jakieś pomysły co robię źle? Rozumiem, że przy takiej konfiguracji w HA encje rekuperatora powinny się już samoistnie pojawić?

Pobierz sobie jakiś program do komunikacji po Modbus np qmodmaster i zobacz czy możesz się komunikować.

Sprawdź czy na pewno plik rekuperator.yaml jest ładowany do HA, czasami z nieznanych powodów niektóre pliki z sekcji packages nie są ładowane. Najlepiej to sprawdzić dodając jakieś błędne wpisy do rekuperator.yaml i sprawdzić czy SPRAWDŹ KONFIGURACJĘ przejdzie weryfikację, jeżeli pokaże błąd to znaczy że plik jest ładowany.

1 polubienie

HA nie wywala błędu.
Natomiast podłączyłem na próbę na odwrót przewody przy konwerterze i zaczęła się świecić dioda od odbierania (RS485 RX), a po odpaleniu pod Linuxem mbpoll -p 5001 192.168.1.160 zaczęła mrygać dioda od dawania (RS485 TX). Program robi zwyczajny poll danych, ale dostaje błąd

Protocol configuration: Modbus TCP
Slave configuration...: address = [1]
                        start reference = 1, count = 1
Communication.........: 192.168.1.160, port 5001, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, output (holding) register table

-- Polling slave 1... Ctrl-C to stop)
Read output (holding) register failed: Invalid data
-- Polling slave 1... Ctrl-C to stop)
Read output (holding) register failed: Invalid data
-- Polling slave 1... Ctrl-C to stop)
Read output (holding) register failed: Invalid data
-- Polling slave 1... Ctrl-C to stop)
Read output (holding) register failed: Invalid data
-- Polling slave 1... Ctrl-C to stop)
Read output (holding) register failed: Invalid data
^C--- 192.168.1.160 poll statistics ---
5 frames transmitted, 0 received, 5 errors, 100.0% frame loss

W zależności jak skonfigurowany konwerter ale najcześiej powinno się używać modbus rtu over tcp, zamiast modbus tcp.

Cześć wszystkim, walczę z integracją już od kilku dni. Używam Elfina 11

Nie działają mi przyciski z ustawieniem prędkości % wentylatorów.

Kod:

type: vertical-stack
cards:
  - type: horizontal-stack
    cards:
      - type: button
        tap_action:
          action: toggle
        entity: switch.rekuperator_on_off
        name: Praca
        show_state: true
        icon: mdi:air-filter
        show_name: true
        show_icon: true
      - type: button
        tap_action:
          action: more-info
        entity: binary_sensor.rekuperator_silownik_bypassu
        name: Bypass
        show_state: true
        icon: mdi:arrow-decision
      - type: conditional
        conditions:
          - entity: switch.rekuperator_zima
            state: 'on'
        card:
          type: button
          tap_action:
            action: toggle
          entity: switch.rekuperator_zima
          name: Zima
          icon: mdi:snowflake
      - type: conditional
        conditions:
          - entity: switch.rekuperator_zima
            state: 'off'
        card:
          type: button
          tap_action:
            action: toggle
          entity: switch.rekuperator_zima
          name: Lato
          icon: mdi:sun-snowflake
      - type: button
        tap_action:
          action: toggle
        entity: switch.rekuperator_mode
        name: Auto
        show_state: true
        icon: mdi:home-floor-a
  - type: horizontal-stack
    cards:
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 60
            hub: modbus
        target: {}
        show_icon: false
        name: 60%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 70
            hub: reku
        target: {}
        show_icon: false
        name: 70%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 80
            hub: reku
        target: {}
        show_icon: false
        name: 80%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 90
            hub: reku
        target: {}
        show_icon: false
        name: 90%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 100
            hub: reku
        target: {}
        show_icon: false
        name: 100%
  - type: picture-elements
    elements:
      - type: state-label
        entity: sensor.rekuperator_temperatura_czerpnia
        style:
          top: 27%
          left: 7%
          color: black
      - type: state-label
        entity: sensor.rekuperator_temperatura_za_fpx
        style:
          top: 14%
          left: 19%
      - type: state-label
        entity: sensor.rekuperator_temperatura_nawiew
        style:
          top: 54%
          left: 94%
          color: black
      - type: state-label
        entity: sensor.rekuperator_strumien_nawiew
        style:
          top: 72%
          left: 93%
      - type: state-label
        entity: sensor.rekuperator_wysterowanie_nawiew
        style:
          top: 65%
          left: 94%
      - type: state-label
        entity: sensor.rekuperator_temperatura_wywiew
        style:
          top: 27%
          left: 94%
          color: black
      - type: state-label
        entity: sensor.rekuperator_strumien_wywiew
        style:
          top: 10%
          left: 92%
      - type: state-label
        entity: sensor.rekuperator_wysterowanie_wywiew
        style:
          top: 18%
          left: 94%
      - type: state-label
        entity: sensor.rekuperator_sprawnosc
        style:
          top: 80%
          left: 50%
      - type: state-label
        entity: sensor.rekuperator_temperatura_pcb
        style:
          top: 72%
          left: 35%
      - type: state-label
        entity: sensor.rekuperator_odzyskana_moc
        style:
          top: 90%
          left: 50%
      - type: state-label
        entity: sensor.rekuperator_speedmanual
        style:
          top: 85%
          left: 12%
          border: 1px solid white
          border-radius: 5%
      - type: image
        entity: binary_sensor.rekuperator_silownik_bypassu
        state_image:
          'on': /local/reku_bypass3.png
          'off': /local/reku_empty.png
        style:
          top: 41%
          left: 51%
          width: 25%
      - type: image
        entity: sensor.rekuperator_fpx_flaga
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_fpx.png
        style:
          top: 8%
          left: 52.5%
          width: 10%
      - type: image
        entity: sensor.rekuperator_fpx_tryb
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_1.png
          '2': /local/reku_2.png
        style:
          top: 8%
          left: 60%
          width: 3.5%
      - type: image
        entity: sensor.rekuperator_alarm
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_error
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_awaria_cf_nawiewu
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_awaria_cf_wywiewu
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_awaria_wentylatora_nawiewu
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_awaria_wentylatora_wywiewu
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_fpx_zabezpieczenie_termiczne
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
      - type: image
        entity: sensor.rekuperator_wymiana_filtrow
        state_image:
          '0': /local/reku_empty.png
          '1': /local/reku_alarm.png
        style:
          top: 8%
          left: 20%
          width: 15%
    image: /local/reku_nobypass3.png
  - type: horizontal-stack
    cards:
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 10
            hub: reku
        target: {}
        show_icon: false
        name: 10%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 20
            hub: reku
        target: {}
        show_icon: false
        name: 20%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 30
            hub: reku
        target: {}
        show_icon: false
        name: 30%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 40
            hub: reku
        target: {}
        show_icon: false
        name: 40%
      - type: button
        tap_action:
          action: call-service
          service: modbus.write_register
          service_data:
            address: 4210
            unit: 10
            value: 50
            hub: reku
        target: {}
        show_icon: false
        name: 50%
  - type: horizontal-stack
    cards:
      - type: button
        tap_action:
          action: toggle
        entity: switch.rekuperator_pusty_dom
        name: Pusty dom
        icon: mdi:home-account
        show_state: true
      - type: button
        tap_action:
          action: toggle
        entity: switch.rekuperator_wietrzenie
        name: Wietrzenie
        show_state: true
        icon: mdi:fan
      - type: button
        tap_action:
          action: toggle
        entity: switch.rekuperator_okna
        name: Otwarte okna
        show_state: true
        icon: mdi:window-open-variant
      - type: button
        tap_action:
          action: toggle
        entity: switch.rekuperator_kominek
        name: Kominek
        show_state: true
        icon: mdi:fireplace

To jest YAML z karty, ale problem dotyczy wywołania usługi

Gdy będziesz wklejał resztę kodu skorzystaj z tego