Stan availibilty dla Fan MQTT na podstawie włączenia innej encji

Może ktoś pomoże.
Potrzebuje zrobić Stan dostępności dla wentylatora MQTT zależny od załączenia do niego zasilania przez włącznik ścienny
encja: light.wentylator

Próbowałem następujące sposoby

availability:
  - topic: "byle/co"
    value_template: "{{ states('light.wentylator') }}"
    payload_available: "on"
    payload_not_available: "off"

nie ma błędu ale nie działa

availability_template: >
 {% if states('light.wentylator') == "on" %}
  True
  {% else %}
  False
  {% endif %}

sprawdzacz konfiguracji zgłasza:
Invalid config for [fan.mqtt]: [availability_template] is an invalid option for [fan.mqtt]. Check: fan.mqtt->availability_template. (See ?, line ?).
pomimo że docs mówi co innego:
https://www.home-assistant.io/integrations/fan.mqtt/#availability_template

Moim zdaniem wystarczy

    availability_topic: "topic/do/stanu/włącznika/ściennego"
    payload_available: "On"
    payload_not_available: "Off"   

…taki zapis działa i nie jest ważne skąd pobiera stan dostępności
W twoim zapisie też pewnie by działał, jakbyś odwoływał się do stanu przełącznika a nie do stanu tego samego wentylatora?

No właśnie nie wystarcza, bo nie ma zwyklego stanu tylko JSON, wiec musi wyciagnac jeden z parametrów JSON

Zwykły, niezwykły… chciałem zasugerować, że w Twoim zapisie dostępność wenylatora próbujesz ustawić na postawie stanu wentylatora (czyli samego siebie) - zamiast stanu wyłączka.
Tak rozumiem ten zapis.

No nie.
Prąd do samego modułu wentylatora (RF 433MHz) sufitowego jest załączany przez włącznik ścienny - jest prąd do wentylatora jest wyłączony to moduł nie jest zasilany więc teoretycznie jest offline, a że jest to tylko moduł RF odbiorczy to nie znamy jego stanu, więc chce stan jego dostępności ustawić za pomocą włącznika ściennego.

Ok… pogubiłem się co jest co.
light.wentylator to fizycznie które urządzenie?
Konstrukcja availability_template: >… którego dotycz?
Sposób osiągnięcia efektu jest dla mnie zrozumiał i poprawny.

light.wentylator - włącznik ścienny załączający zasilanie do modułu wentylatora FAN RF

availability_template - dotyczy urządzenia FAN RF przez MQTT
Chciałbym ustawić availibility urządzeniu FAN RF korzystając ze stanu urządzenia light.wentylator:
jeśli state jest ON to FAN RF jest offline
jeśli state jest OFF to FAN RF jest offline

Obstaje przy swoim, już tak robiłem tylko pobierałem avaliliblity z tematu mqtt stanu innego urządzenia.
Nigdy nie pobierałem bezpośrednio z HA i nie wiem czy taka metoda zadziała?
W twoim przypadku powinno działać coś takiego

availability:
  - topic: "nie byle co tylko temat stanu włacznika ściennego"
    payload_available: "on"
    payload_not_available: "off"

Wielkość liter ma znaczenie

niestety to za mało bo włącznik ścienny na danym temacie MQTT nie wyrzuca samego stanu tylko JSONa, dlatego potrzebny jest jeszcze template do wyciągnięcia w tym przypadku stanu POWER2

{"Time":"2022-01-10T00:41:52","Uptime":"80T13:07:39","UptimeSec":6959259,"Vcc":3.458,"Heap":27,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":38,"POWER1":"ON","POWER2":"ON","Wifi":{"AP":1,"SSId":"moja siec","BSSId":"72:D7:9A:xx:xx:xx","Channel":11,"Mode":"11n","RSSI":100,"Signal":-35,"LinkCount":14,"Downtime":"0T01:26:46"}}

Zacznijmy od początku.
Wpadłeś w pułapkę zasady działania MQTT i własnych wyobrażeń.
W MQTT, to nie czujnik odczytuje zawartość tematu tylko broker publikuje dane i to on jest inicjatorem.
Z tego powodu ta część kodu nigdy się nie wykona

availability:
  - topic: "byle/co"
    value_template: "{{ states('light.wentylator') }}"
    payload_available: "on"
    payload_not_available: "off"

ponieważ temat “byle/co” nie istnieje i nigdy nie będzie istniał.

Od początku sugeruje aby

jednak próba odczytu stanu
value_template: “{{ states(‘light.wentylator’) }}”
może być hazardowa, ponieważ na ten sam temat wyłącznik ścienny mógł jeszcze nie zareagować i otrzymasz stan poprzedni.
Więc bardziej poprawnym byłoby

  - topic: "poprawny temat"
    value_template: "{{ value_json.POWER2 }}"
    payload_available: "ON"
    payload_not_available: "OFF"

ponieważ otrzymasz dane z pierwszej ręki, a nie pośrednika.
Dokładnie tak samo jak zdefiniowałeś w odczycie stanu przełącznika ściennego.

Drugim sposobem jest zmiana dostępności wentylatora w kodzie samego wyłącznika np. przez automatyzację.
Nie cierpię składni HA i do końca jej nie czuję, więc ta co jest w wąsach { } może być nie do końca właściwe.

Ten twój pierwszy sposób też już wcześniej próbowałem i teraz ponownie - sprawdzacz nie zgłasza błędów, ale niestety stan się nie zmienia i wentylator FAN RF jest teraz ciągle offline :frowning:
(bez parametrów availibility wszystko działa w FAN RF)

parametry FAN RF:

    availability:
      - topic: "tele/Salon_2_D2DFCE/STATE"
        value_template: "{{ value_json.POWER2 }}"
        payload_available: "ON"
        payload_not_available: "OFF"

z MQTT Explorera
topic: “tele/Salon_2_D2DFCE/STATE”

{"Time":"2022-01-10T10:21:52","Uptime":"80T22:47:39","UptimeSec":6994059,"Vcc":3.441,"Heap":27,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":38,"POWER1":"ON","POWER2":"ON","Wifi":{"AP":1,"SSId":"moja siec","BSSId":"72:D7:9A:xx:xx:xx","Channel":11,"Mode":"11n","RSSI":100,"Signal":-28,"LinkCount":14,"Downtime":"0T01:26:46"}}

Sprawdziłem w szablonach że poprawnie jest wyciągana wartość “POWER2”.

Odnośnie sposobu drugiego, to wiem że mógłbym sobie dodać rolę publikującą nowy stan dla konkretnego gang’u, ale próbuje to rozwiązać w HA także dla kolejnych urządzeń RF, a nie ustawiać coś w poszczególnych urządzeniach załączających zasilanie do nich.

To jest jakaś pierdoła :slight_smile:
Muszę na chwilę o tym zapomnieć, bo inaczej będę kręcił się w kółko.
Odłóż to na chwilę - wrócimy do tematu.

…edit

Zrobiłem “Fake” swich w sposób:

  - platform: mqtt
    unique_id: oczko_gniazdo
    name: "Napowietrzacz"
    state_topic: "home/stat/Oczko/POWER4"
    #value_template:  "{{ value_json. }}"
    command_topic: "home/cmnd/Oczko/POWER4"
    payload_on: "ON"
    payload_off: "OFF"
    state_on: "ON"
    state_off: "OFF"
    availability_topic: "home/tele/Oczko/LWT"
    payload_available: "Online"
    payload_not_available: "Offline"    
    icon:  mdi:sprinkler-variant
    optimistic: false
    qos: 1
    retain: false   
    
  - platform: mqtt
    unique_id: fake
    name: "Fake"
    state_topic: "home/stat/Oczko/POWER5"
    #value_template:  "{{ value_json. }}"
    command_topic: "home/cmnd/Oczko/POWER5"
    payload_on: "ON"
    payload_off: "OFF"
    state_on: "ON"
    state_off: "OFF"
    availability:
     - topic: "home/tele/Oczko/STATE"
       value_template:  "{{ value_json.POWER4 }}"
       payload_available: "ON"
       payload_not_available: "OFF"
    icon:  mdi:sprinkler-variant
    optimistic: false
    qos: 1
    retain: false 

“home/tele/Oczko/STATE” daje

"{"Time":"2022-01-10T18:26:37","Uptime":"0T00:35:08","UptimeSec":2108,"Heap":27,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER1":"OFF","POWER2":"OFF","POWER3":"OFF","POWER4":"ON","Wifi":{"AP":1,"SSId":"Wireless","BSSId":"08:55:31:6F:69:C7","Channel":1,"RSSI":26,"Signal":-87,"LinkCount":1,"Downtime":"0T00:00:02"}}"

Wiodącym jest “Napowietrzacz” i jego stan aktualizuje stan dostępności “Fake”
Problem jest tak, że wybrałeś niewłaściwy topic: “tele/Salon_2_D2DFCE/STATE” publikowany jest okresowo z czasem Telemetry period (300)
Więc zmień topic albo czekaj 5min na aktualizację.
Do czasu jak nie pokażesz całej konfiguracji męcz się sam.

Wentylator RF:

- platform: mqtt
  name: "Wentylator sufitowy"
  #state_topic: 'tele/RF_Bridge/RESULT'
  command_topic: 'cmnd/RF_Bridge/RfCode'
  percentage_command_topic: 'cmnd/RF_Bridge/RfCode'
  percentage_command_template: >
    {% if value < 5 %}
      #EE254E#
    {% elif value < 34 %}
      #E8204B#
    {% elif value < 67 %}
      #EC274D#
    {% else %}
      #D11E7A#
    {% endif %}
  qos: 1
  payload_on: "#E8204B#"
  payload_off: "#EE254E#"
  preset_mode_command_topic: "cmnd/RF_Bridge/RfCode"
  preset_mode_command_template: >
    {% if value == "1h" %}
      #EE254E#
    {% elif value == "4h" %}
      #E8204B#
    {% elif value == "8h" %}
      #EC274D#
    {% endif %}
  preset_modes:
     -  "1h"
     -  "4h"
     -  "8h"
  availability:
    - topic: "tele/Salon_2_D2DFCE/STATE"
      value_template:  "{{ value_json.POWER2 }}"
      payload_available: "ON"
      payload_not_available: "OFF"

Włącznik ścienny “light.wentylator” - automatyczna konfiguracja z Tasmota - kod wyciągnięty z karty Urządzenie w konfiguracji:

name: Wentylator
state_topic: tele/Salon_2_D2DFCE/STATE
availability_topic: tele/Salon_2_D2DFCE/LWT
payload_available: Online
payload_not_available: Offline
command_topic: cmnd/Salon_2_D2DFCE/POWER2
payload_off: 'OFF'
payload_on: 'ON'
state_value_template: '{{value_json.POWER2}}'
unique_id: D2DFCE_LI_2
device:
  identifiers:
    - D2DFCE
platform: mqtt

Nawet po dłuższym czasie, stan availability się nie zmienia - ciągle jest offline.

Skoro masz tasmotę to na pewno masz takie tematy, jeśli nie ma - to wykonaj przełączenie i się pojawią
mqtttasm

Czyli tele, cmnd i stat
Operowanie na temacie tele to nie jest dobry pomysł. Pojawia się on jak pisałem wcześniej, okresowo zgodnie z

tasmota

Więc rzeczywisty stan przekaźnika otrzymujesz co telemery period.
Pracujesz w trybie optimistic więc wydaje ci się, że przekaźnik się przełączył - a wcale tak być nie musi i o faktyczny stanie się dowiesz dopiero np. po 3 min.

Nie chce mi się dużo rozpisywać więc sprawdź to co wrzucę i wtedy ewentualnie pytaj.
Wydaję mi się, że po poprawnym sformatowaniu teksu powinno zaskoczyć od razu.

- platform: mqtt
  name: Wentylator
  state_topic: stat/Salon_2_D2DFCE/POWER2
  command_topic: cmnd/Salon_2_D2DFCE/POWER2
  availability_topic: tele/Salon_2_D2DFCE/LWT
  payload_on: "ON"
  payload_off: "OFF"
  state_on: "ON"
  state_off: "OFF" 
  payload_available: Online
  payload_not_available: Offline
  optimistic: false       #stan swicha na panelu na podstawie info zwrotnego o rzeczywistm stanie przekaźnika
  qos: 1
  retain: false  




- platform: mqtt
  name: "Wentylator sufitowy"
  #state_topic: 'tele/RF_Bridge/RESULT'
  command_topic: 'cmnd/RF_Bridge/RfCode'
  availability_topic: "stat/Salon_2_D2DFCE/POWER2"
  payload_available: "ON"
  payload_not_available: "OFF"  
  optimistic: true       #stan optymistyczny, bez kanału zwrotnego
  percentage_command_topic: 'cmnd/RF_Bridge/RfCode'
  percentage_command_template: >
    {% if value < 5 %}
      #EE254E#
    {% elif value < 34 %}
      #E8204B#
    {% elif value < 67 %}
      #EC274D#
    {% else %}
      #D11E7A#
    {% endif %}
  qos: 1
  payload_on: "#E8204B#"
  payload_off: "#EE254E#"
  preset_mode_command_topic: "cmnd/RF_Bridge/RfCode"
  preset_mode_command_template: >
    {% if value == "1h" %}
      #EE254E#
    {% elif value == "4h" %}
      #E8204B#
    {% elif value == "8h" %}
      #EC274D#
    {% endif %}
  preset_modes:
     -  "1h"
     -  "4h"
     -  "8h"
1 Like

akurat stan Teleperiod jest do przesyłania statutu sensorów a nie stanów Relay i Light.
Rzeczywiście zapomniałem o tym drzewie “stat” - używając go oczywiście ruszyło ,bo dane wejściowe nie musiały być specjalnie wyciągane - DZIĘKI.

Pozostaje kwestia dlaczego parametr “value_template” dla urzadzeń MQTT nie obrabia/wyciąga danych wejściowych z topicu :frowning:

Daje… sprawdzałem, ale nie będę już do tego wracał.