Karta światła w HA

Hej, jestem małym zwolennikiem protokołu modbus i interfejsu RS485, mam na tym kilka urządzeń w tym 3 kanałowy dimmer 24V.
Dimmer działa należycie ale problem natury modbus jest taki, że rejestr ściemniania danego kanału jest pod innym adresem a rejestr aktywacji tego kanału pod innym i tak dla przykładu adres 5 aktywuje mi dany kanał a adres 8 rozjaśnia/ściemnia dany kanał.


tak to wygląda w panelu HA.
Moje pytanie brzmi, czy istnieje jakiś template abym mógł połączyć to w całość tak jak jest to w karcie światła

a tam jakieś przykłady z życia wzięte

Nie ogarnę tego w ten sposób. U mnie element wykonawczy sterowania światłem działa na interfejsie modbus ale zintegrowany jest z HA poprzez MQTT (mam dodatek MQTT<->MODBUS i vice versa)
Potrzebuje połączyć encje ON/OFF i suwak ściemniania w jeden kafelek. Idzie to zrobić?
Może za pomocą jakiegoś pomocnika?

  1. tak
  2. nigdy nie próbowałem do tak skomplikowanego zadania użyć prostego pomocnika (nie wszystko się da wyklikać w GUI), ale z użyciem template da się to zrobić na jakieś 99.999%

:thinking:
O takie połączenie chodzi?

Nie, chodzi o wygląd ściemnianej lampy jak w pierwszym poście.
Chat GPT mówi coś takiego:
Aby połączyć encję jasności i włączania/wyłączania w Home Assistant w jedną, należy użyć pomocnika (helpera) typu “przełącznik z regulacją jasności”. Dzięki temu jedno urządzenie w interfejsie Home Assistant będzie kontrolować zarówno stan włączenia/wyłączenia, jak i poziom jasności światła.

Kroki postępowania:

  1. 1. Utwórz pomocnika:
  • Przejdź do sekcji “Ustawienia” (Settings) → “Urządzenia i usługi” (Devices & Services) → “Pomocnicy” (Helpers).
  • Kliknij przycisk “+ Dodaj pomocnika” (Add Helper).
  • Wybierz typ pomocnika: “Przełącznik z regulacją jasności” (Light Switch with Dimmer).
  • Nadaj nazwę pomocnikowi (np. “Lampa salonowa”).
  • Skonfiguruj powiązanie z encjami:
    • Wybierz encję przełącznika, która steruje włączaniem/wyłączaniem światła (np. switch.lampa_salonowa_switch).
    • Wybierz encję regulacji jasności (np. light.lampa_salonowa_level).
    • Opcjonalnie: ustaw domyślny poziom jasności dla włączenia.

Jednak nigdzie nie widać pomocnika typu przełącznik z regulacją jasności.

AI bredzi jak zwykle ostatnio.

Oczywiście chodzi mi o stworzenie encji o pożądanych właściwościach (więc będziesz mógł ją wykorzystywać w takich kartach jak dusza zapragnie, bo twór = uzyskana encja będzie światłem), ale pewnie w ramach samego lovelace też można uszyć jakiś erzac (tylko po co tak kombinować, skoro raz stworzona encja działająca zgodnie z oczekiwaniami będzie do użytku wszędzie, a tworzenie czegoś wyłącznie działającego we frontendzie = w GUI nie do końca pokrywa się z ideą działania HA).

A mój coś takiego :grinning:

Stwórz template light w configuration.yaml

To sposób zaawansowany, ale daje pełną kontrolę:

light:
  - platform: template
    lights:
      lampa_salonowa_zintegrowana:
        friendly_name: "Lampa salonowa"
        level_template: "{{ state_attr('light.lampa_salonowa_level', 'brightness') }}"
        value_template: "{{ is_state('switch.lampa_salonowa_switch', 'on') }}"
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.lampa_salonowa_switch
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.lampa_salonowa_switch
        set_level:
          service: light.turn_on
          target:
            entity_id: light.lampa_salonowa_level
          data:
            brightness: "{{ brightness }}"

To utworzy nową encję light.lampa_salonowa_zintegrowana, która wygląda i działa jak światło z jasnością — ale w tle używa osobno switch i light.

(To jest AI odpowiedz a nie moja)

/
AI

  • Zamień action: na service: w template light — to obowiązkowe.
  • Używaj encji light do jasności, nie number (input_number).
  • Jeśli jasność jest tylko w input_number, to musisz rozdzielić sterowanie i synchronizację automatyzacjami.
light:
  - platform: template
    lights:
      lampa_salonowa_zintegrowana:
        friendly_name: "Lampa salonowa"
        level_template: "{{ state_attr('light.ch1brightness', 'brightness') }}"
        value_template: "{{ is_state('switch.ch1activate', 'on') }}"
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.ch1activate
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.ch1activate
        set_level:
          service: light.turn_on
          target:
            entity_id: light.ch1brightness
          data:
            brightness: "{{ brightness }}"
2 polubienia

AI przewiduje 10 Lat do przodu, nie słyszałem o takim pomocniku.
Możesz jedynie zmienić domenę *.switch na light *.switch na fan ale wtedy tylko są podstawowe parametry on/off

light:
  - platform: template
    lights:
      lampa_salonowa_zintegrowana:
        friendly_name: "Lampa salonowa"
        level_template: "{{ state_attr('number.ch1brightness', 'brightness') }}"
        value_template: "{{ is_state('switch.ch1activate', 'on') }}"
        turn_on:
          action: switch.turn_on
          target:
            entity_id: switch.ch1activate
        turn_off:
          action: switch.turn_off
          target:
            entity_id: switch.ch1activate
        set_level:
          action: light.turn_on
          target:
            entity_id: number.ch1brightness
          data:
            brightness: "{{ brightness }}"

Po lekkiej modyfikacji kodu a konkretnie zamiany “service” na “action” - działa, ale tylko on/off, bez sterowania jasnością.

encja

musi odpowiadać za jasność w zakresie 0-255 (jako integer), a jeśli jest to inny zakres to odpowiednio przelicz
w tym konkretnie przykładzie

za jasność odpowiada de facto atrybut brightness tej encji, jak jest w przypadku twojej encji źródłowej nie mam pojęcia, ale to pod nią musisz dostosować kod

a w ogóle gdy zaczynałeś wątek to ta encja nazywała się dimmer modbus(i-cośtam-dalej, ale przepisywać z obrazka nie będę), a nie był to pomocnik typu numer

Zakres jest 0-100, już na etapie integracji przez MQTT jest to określone. Ogólnie encja w dodatku modbus<=>mqtt wygląda tak:


a w mqtt już tak:

i to tej nazwy encji muszę się trzymać, sterowanie jasnością poza template działa, więc problem leży w kodzie samego template ale nie mam z tym doświadczenia więc nie wiem gdzie konkretnie.

Tu AI -przetestuj (Restart, odśwież przeglądarkę (F5)))

  • level_template czyta aktualną jasność z number.ch1brightness, więc slider w UI będzie odzwierciedlał jej stan.
  • set_level zmienia number.ch1brightness, co w Twojej integracji MQTT/Modbus już steruje rzeczywistym ściemniaczem.
  • turn_on i turn_off obsługują fizyczne włączenie/wyłączenie przez switch.ch1activate.
light:
  - platform: template
    lights:
      lampa_salonowa_zintegrowana:
        friendly_name: "Lampa salonowa"
        level_template: "{{ states('number.ch1brightness') | int }}"
        value_template: "{{ is_state('switch.ch1activate', 'on') }}"
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.ch1activate
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.ch1activate
        set_level:
          service: number.set_value
          target:
            entity_id: number.ch1brightness
          data:
            value: "{{ brightness }}"


Więc zmieniłem zakres w dodatku na 0-255 i działa, jednak nie w pełnym zakresie


Suwakiem kafelka jestem w stanie do połowy sterować jasnością, wtedy na brightness jest 125 i powyżej 50% kafelka jasność rzeczywista już nie wzrasta, tak samo gdy próbuje ustawić na suwaku np. 255 - to na kafelku i tak zostaje przy tych 50% - czyli nie mogę ustawić zakresu większego niż 50% co odpowiada 125. Na pasku jest zakres 0-255 ale można go sterować tylko do 125.
Ale przy wyłączonej lampie i suwaku na 0%, przesuwając na 1 lub więcej lampa pozostaje w stanie off, pewnie trzeba dodać jakiś atrybut.

kod obecnie:

light:
  - platform: template
    lights:
      lampa_salonowa_zintegrowana:
        friendly_name: "Lampa salonowa"
        level_template: "{{ states('number.ch1brightness') | int }}"
        value_template: "{{ is_state('switch.ch1activate', 'on') }}"
        turn_on:
          action: switch.turn_on
          target:
            entity_id: switch.ch1activate
        turn_off:
          action: switch.turn_off
          target:
            entity_id: switch.ch1activate
        set_level:
          action: number.set_value
          target:
            entity_id: number.ch1brightness
          data:
            value: "{{ brightness }}"

Włącznik nie jest połączony z jasnością, więc może trzeba dodać do szablonu że jak zwiększasz wartość na suwaku na większą niż 0 to ma zadziałać najpierw switch.turn.on, a suwak przeskalować żeby 0-100 mqtt odpowiadało 0-255 w modbus?

light:
  - platform: template
    lights:
      lampa_salonowa_zintegrowana:
        friendly_name: "Lampa salonowa"

        # Światło jest "on" tylko gdy przekaźnik aktywny i jasność > 0
        value_template: >
          {{ is_state('switch.ch1activate', 'on') and (states('number.ch1brightness') | int > 0) }}

        # Przeskaluj Modbus (0–255) do MQTT/UI (0–100)
        level_template: >
          {{ (states('number.ch1brightness') | float / 2.55) | round(0) }}

        # Włącz światło (przekaźnik)
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.ch1activate

        # Wyłącz światło (przekaźnik)
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.ch1activate

        # Ustaw jasność – skalowanie z 0–100 (MQTT) → 0–255 (Modbus)
        set_level:
          - choose:
              - conditions: "{{ brightness | int > 0 }}"
                sequence:
                  - service: switch.turn_on
                    target:
                      entity_id: switch.ch1activate
                  - service: number.set_value
                    target:
                      entity_id: number.ch1brightness
                    data:
                      value: "{{ (brightness | float * 2.55) | round(0) }}"
              - conditions: "{{ brightness | int == 0 }}"
                sequence:
                  - service: switch.turn_off
                    target:
                      entity_id: switch.ch1activate
1 polubienie

Teraz działa wszystko jak należy, jednak musiałem użyć ciut innego skalowania.
Zapoznałem się jeszcze raz z tabelą rejestrów tego ściemniacza:


Zakres w którym się porusza to jednak 0-100 choć w HA działa zakres 0-125 (sprawdzę czy 100-125 istotnie coś zmienia).
Tak więc użyłem skalowania 0,49 zakresu 0-125 i wszystko działa jak należy.
Serdeczne dzięki Marcin.