Automatyzacja dla encji light - czy da się pominąć atrybut?

Cześć.
Jestem nowy na forum, ale temat mam wcale nie taki początkujący (a może jednak?). Zacznę od początku - odkąd kupiłem kilka kolorowych żarówek (w tej roli Yeelight 1SE), zamarzyło mi się sterować nimi “fizycznie”.

Zobaczyłem system MiLight, a potem projekt ESP8266_Milight_Hub - i tak nabyłem pilota FUT089 … po czym okazało się, że nieco źle zrozumiałem istotę projektu - emulowany hub na ESP8266 emuluje tylko bramkę, a nadal wymagane są żarówki z system MiLight (hub dodawał po prostu ich widoczność i statusy w Home Assistant, jako, że całość jest ogólnie na systemie RF 2.4 GHz).
A przecież ja chciałem sterować pilotem urządzeniami, któe już posiadam. Ostatecznie udało mi się - ale z niemałymi trudnościami dla początkującego - automatyzacja działa bezpośrednio na podstawie MQTT:

alias: Pilot przycisk 1
trigger:
  - platform: mqtt
    topic: milight/updates/0x151E/fut089/1
condition: []
action:
  - variables:
      state: "{{ trigger.payload_json.state  }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ state == 'OFF' }}"
        sequence:
          - service: light.turn_off
            target:
              area_id:
                - salon
                - kuchnia
            data:
              transition: 1
      - conditions:
          - condition: template
            value_template: "{{ state == 'ON' }}"
        sequence:
          - service: light.turn_on
            target:
              area_id:
                - salon
                - kuchnia
            data:
              transition: 1
    default:
      - service: light.turn_on
        data_template:
          transition: 0.2
          brightness: >-
            {% if trigger.payload_json.brightness is defined %}
            {{trigger.payload_json.brightness}} {% else %} {{
            state_attr('light.yeelight_salon_1', 'brightness') }} {% endif %}
          hs_color:
            - >-
              {% if trigger.payload_json.hue is defined
              %}{{trigger.payload_json.hue}}{% else %}
              {{state_attr('light.yeelight_salon_1', 'hs_color')[0]}} {% endif
              %}
            - >-
              {% if trigger.payload_json.saturation is defined
              %}{{trigger.payload_json.saturation}}{% else %}
              {{state_attr('light.yeelight_salon_1', 'hs_color')[1]}} {% endif
              %}
        target:
          area_id:
            - salon
            - kuchnia
mode: single

Ogólnie działa - ale nie jest to do końca to, co chcę.

Pilot działa w ten sposób, że w akcji “updates” wysyła tylko jeden konkretny parametr (np. jeśli zmienię jasność, to nie jest wysłane nic innego, tylko jasność). To rodzi pewien problem, ponieważ dla encji Light - jeśli chcę tylko włączyć i wyłączyć, to sprawa prosta…

Ale zakładając, że chcę pełną obsługę - czyli móc ustawić jasność oraz kolor (w tym wypadku hs_color), idealnie byłoby pominąć brakujący parametr.

Na razie obszedłem to, biorąc brakujący atrybut na sztywno z encji light, a nie z pilota. Ale jeśli chciałbym sterować 2 urządzeniami w grupie i np. podczas zmiany jasności chciałbym zostawić oryginalny kolor - to w obecnym rozwiązaniu kolor będzie pobierany z urządzenia “salon”. Gdybym dynamicznie pominął atrybut hs_color, problem były z głowy - każde urządzenie miałoby swój kolor (dopóki bym go nie zmienił).
W kodzie, który nie działa - widziałbym to tak:

      - service: light.turn_on
        data_template:
          transition: 0.2
          {% if trigger.payload_json.brightness is defined %}
          brightness: - {{trigger.payload_json.brightness}} {% endif %}

Przy okazji drugie pytanie. Ponieważ zmiana koloru hs_color to dwa parametry (hue i saturation), a pilot jednocześnie wysyła tylko jeden z parametrów - co w przypadku sterowania grupą urządzeń? Rozumiem, że jedyna opcja to pobierać obecny kolor z pomocnika, który grupuje żarówki z obszarów, które chcę obsłuzyć?
Wiem, że problem trochę teoretyczny, bo chcąc sterować np. kolorem wszystkich świateł w salonie - to raczej oczekuję i tak tego samego koloru :slight_smile:

Mam nadzieję, że ktoś dobrnął do końca - no ale na swoją obronę powiem, że temat obsługi tego pilota w HA praktycznei nie istnieje w necie, więc może będzie to jakaś wartość dodana.

1 polubienie

Witamy na forum :wave:. Bardzo rzeczowo napisany pierwszy temat, dobrze się czyta i bez problemu dobrnąłem do końca. Piszę o tym, bo co raz trudniej o przykłady jak powinien wyglądać prawidłowy opis problemu (osobiście brakło mi jedynie linku i grafiki dla pilota).

Wracając do pytań i uprzedzając, że nie jestem programistą (nawet słabym), to chcę zwrócić uwagę na jedno co rzuciło mi się w oczy. Używasz usługi light.turn_on, a ja czuję, że może sprawdzić się lepiej MQTT: Publish. Serwis ten służy do wysyłania całych ciągów komunikatów MQTT, na danym temacie.

W tym komunikacie możesz zawrzeć nie tylko jedno polecenie ale ich ciąg. Pobieżne spojrzenie na przykład z dokumentacji Milight_Hub pozwala stwierdzić, że rozwiąże to również Twój problem z grupowaniem urządzeń, do których ma trafić dana komenda:


irb(main):004:0> client.publish('milight/0x118D/rgb_cct/1', '{"status":"ON","color":{"r":255,"g":200,"b":255},"brightness":100}')

Podsumowując uważam, że kluczem jest użycie usługi MQTT: Publish z odpowiednim ładunkiem, na odpowiednim temacie (topic):

Spróbuj mojego pomysłu w narzędziach deweloperskich i daj znać, czy jest trafny.

Dzięki za miłe słowa i odpowiedź.

MQTT nie używam do żarówek - bo te są na standardowej integracji Yeelight (WIFI). A z pilota tylko odczytuję MQTT przez bramkę (za pomocą tematu updates).

Oryginalnie bramka z projektu wysyła komunikaty tylko do żarówek z tego systemu (MiLight) - wtedy te żarówki po konfiguracji w bramce pojawiają się nawet w HA (i chyba o to chodzi w projekcie i to rozróżnia go od oryginalnej bramki producenta).

W moim przypadku takich żarówek nie mam i mogę korzystać tylko z komunikatów pilota - ale to było też moim celem, żeby obsługiwać każdy rodzaj sprzętu (w tym włączniki puszkowe).

Ostatecznie na razie rozbiłem to na wiele warunków, które odpowiadają na komendy wysyłane przez pilota i ewentuanie są zależne od stanu żarówki. I w sumie jakoś to działa - osobno ustawiam jasność, osobno kolory, osobno ciepło barwy białej.