"Inercja" wskazań czujników w HA

Stawiam pierwsze kroki w HA, więc proszę o wyrozumiałość.

HA plus podpięte urządzenie “X” na tasmocie, komunikujące się poprzez mqtt (add-on: Mosquitto broker). Wszystko działa, mogę sterować, odczytywać parametry itp. “X” to Wemos Mini - stan urządzenia to on/of, dodatkowo urządzenie analizuje sygnał na pinie analogowym i pokazuje wartość ADC. Klasyka :slight_smile:

Automatyzacja typu “jak zmieni się status X na 1sek, to włącz urządzenie Y” - działa bezproblemowo i bez żadnych opóźnień. Również “jak zmieni się stan Y to włącz/wyłącz/przełącz stan X”. Mogę więc sterować i odczytywać stany urządzeń bez opóźnień.

Ale nie udaje mi się odczytywać z czujnika zmian ADC. Zmiany pojawiają się zgodnie z “telemetry period”, a zależy mi aby były “na bieżąco” - analogicznie jak zmiany statusu.

Czy jest to możliwe?

Jes możliwe w samym oprogramowaniu Tasmota dzięki regułom. Zapoznaj się z działem dokumentacji. Jest sporo przykładów, które pozwalają zrozumieć jak działa składnia reguł. Są to automatyzacje zapisane w ESP.
Dla Ciebie przykład:

Przesyłaj wartość czujnika tylko po osiągnięciu delty

1 Like

Ha, podchodziłem do tych “Rules”, ale dziubanie w poleceniach tekstowych mnie przerosło :slight_smile:

Prawie mi się udało, tasmota wysyła takie tele:

tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:36:43","ANALOG":{"A0":6}}

więc zrobiłem taką zasadę:

Rule1 ON ANALOG#A0 DO Publish tele/tasmota_1F536B/SENSOR {"Time":"%timestamp%","ANALOG":{"A0":%value%}} ENDON

Wysyła jednak nie wtedy, kiedy jest zmiana wartości ANALOG:A0, ale co 4 sekundy, nawet jak wartość się nie zmienia:

00:51:06.657 RUL: ANALOG#A0 performs "Publish tele/tasmota_1F536B/SENSOR {"Time":"2022-01-30T00:51:06","ANALOG":{"A0":6}}"
00:51:06.663 MQT: tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:51:06","ANALOG":{"A0":6}}
00:51:10.935 RUL: ANALOG#A0 performs "Publish tele/tasmota_1F536B/SENSOR {"Time":"2022-01-30T00:51:10","ANALOG":{"A0":6}}"
00:51:10.941 MQT: tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:51:10","ANALOG":{"A0":6}}
00:51:15.219 RUL: ANALOG#A0 performs "Publish tele/tasmota_1F536B/SENSOR {"Time":"2022-01-30T00:51:15","ANALOG":{"A0":6}}"
00:51:15.224 MQT: tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:51:15","ANALOG":{"A0":6}}
00:51:19.647 RUL: ANALOG#A0 performs "Publish tele/tasmota_1F536B/SENSOR {"Time":"2022-01-30T00:51:19","ANALOG":{"A0":6}}"
00:51:19.652 MQT: tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:51:19","ANALOG":{"A0":6}}
00:51:23.931 RUL: ANALOG#A0 performs "Publish tele/tasmota_1F536B/SENSOR {"Time":"2022-01-30T00:51:23","ANALOG":{"A0":6}}"
00:51:23.937 MQT: tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:51:23","ANALOG":{"A0":6}}
00:51:28.350 RUL: ANALOG#A0 performs "Publish tele/tasmota_1F536B/SENSOR {"Time":"2022-01-30T00:51:28","ANALOG":{"A0":6}}"
00:51:28.356 MQT: tele/tasmota_1F536B/SENSOR = {"Time":"2022-01-30T00:51:28","ANALOG":{"A0":6}}

Domyślam się że można robić jakieś obejścia z div10 (jak przykładach), ale … dlaczego moja konstrukcja nie działa tak jak powinna?
TX!

Ponieważ nie wprowadziłeś zmiennej. Zobacz przykład z dokumentacji

Przesyłaj wartość czujnika tylko po osiągnięciu delty ~

Masz gotowca z książki kucharskiej.

1 Like

No właśnie - ale chciałem uniknąć tej “delty”. Bo to dodatkowa linia kodu, dodatkowe zmienne, dodatkowe parametry - i zwiększa to komplikację i szanse na popełnienie błędu. Według dokumentacji sam zapis “ANALOG#A0” powinien wystarczyć

Jeśli chcesz mieć każdą zmianę jako wyzwalacz to użyj A0#state Nie podając atrybutu czy wartości dla state każda zmiana stanu czujnika A0 będzie publikowała jego stan %value% poprzez regułę.

Rule1 ON A0#State DO Publish tele/tasmota_1F536B/SENSOR {"Time":"%timestamp%","ANALOG":{"A0":%value%}} ENDON
1 Like

No właśnie, takie coś mi nie działa, zarówno trigger na “A0#State” jak i “ANALOG#State” - nie wysyła zmian na bieżąco, tylko co telemetry. Chyba za późno na kodowanie :slight_smile:

    1. Sprawdzająco - włączyłeś regułę?

    1. Sprawdź działanie reguły w konsoli Tasmota, czy wyzwalacz działa i reguła się uruchamia?
      Jeśli działa wyzwalacz, to podejrzewam niewłaściwy temat.
    1. Sprawdź temat MQTT - zazwyczaj tu jest problem, użyj programu MQTT Explorer
      http://mqtt-explorer.com/
    1. Spróbuj z wyzwalaczem Analog#A0div10

Informacyjnie:
W konsoli Tasmota, wielkość liter nie mają znaczenia. Zamiennie działa 1 zamiast ON czy 0 zamiast off.
Reguły często wykorzystują funkcję komend BACKLOG:

the Power of Backlog

1 Like

Tak, każdorazowo daję “Rule1 0” i “Rule1 1” po zmianach. Sprawdzam na razie tylko w konsoli, ale jak w konsoli coś się zmieni to w HA również, więc powinno być OK. Z “div10” próbowałem, ale tu coś w ogóle dziwnie, bo działa, ale nie “od razu” tylko z pewnym opóźnieniem, a co gorsza wygląda że wysyła nie wartość z sensora, ale “wartość div10”, czyli “2” zamiast “22”, “0” zamiast “30”. Generalnie div10 wolałbym uniknąć - bo jak sygnał zmieni się z “10” na 20" to div10 tego nie wykryje. Jakiś robię szkolny błąd :slight_smile:

Moja tasmota:

Tasmota działa przez pośrednika MQTT, więc nie jest to takie oczywiste.

Tematy tele są dla telemetrii z określonym interwałem.
Tematy state są dla publikowania stanów,natychmiast po ich zmianie.

1 Like

Tak, dlatego na razie próbuję walczyć z tasmotą, jak ruszy to wtedy przejdę do HA.
Próbowałem tez “state”, zrobiłem taką kombinację:

Rule1 ON ANALOG#A0 DO Publish stat/tasmota_1F536B/STATUS10 {"StatusSNS":{"Time":"%timestamp%","ANALOG":{"A0":%value%}}} ENDON

ale też wysyła co 4 sekundy, niezależnie od wartości sensora. Ewidentnie coś jest z triggerem, bo reszta działa poprawnie. Kurcze…

Te nawiasy nie potrzebne.
Spróbuj z taką składnią:

Rule1 ON ANALOG#A0 DO publish stat/%topic%/ANALOG %value% ENDON
1 Like

Wpisz w konsoli tasmoty STATUS 10
Powinien pojawić się w MQTT temat: stat/tasmota_1F536B/STATUS10
Wydaje mi się, że reguła powinna wyglądać:

Rule1 ON ANALOG#A0 DO BACKLOG STATUS 10  ENDON

Pod warunkiem, że trigger jest prawidłowy

EDIT… STATUS 10 a nie STATUS10

1 Like

trigger działa, ale cały czas wyzwala się równo co 4 sekundy, nawet jak A0 się nie zmieni:

13:33:05.072 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:05","ANALOG":{"A0":748}}}
13:33:09.346 RUL: ANALOG#A0 performs "STATUS 10"
13:33:09.391 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:09","ANALOG":{"A0":744}}}
13:33:13.727 RUL: ANALOG#A0 performs "STATUS 10"
13:33:13.772 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:13","ANALOG":{"A0":744}}}
13:33:17.004 RUL: ANALOG#A0 performs "STATUS 10"
13:33:18.041 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:17","ANALOG":{"A0":744}}}
13:33:22.233 RUL: ANALOG#A0 performs "STATUS 10"
13:33:22.278 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:22","ANALOG":{"A0":744}}}
13:33:26.600 RUL: ANALOG#A0 performs "STATUS 10"
13:33:26.646 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:26","ANALOG":{"A0":744}}}
13:33:31.262 RUL: ANALOG#A0 performs "STATUS 10"
13:33:31.307 MQT: stat/tasmota_1F536B/STATUS10 = {"StatusSNS":{"Time":"2022-01-30T13:33:31","ANALOG":{"A0":744}}}

@angler efekt ten sam, trigger odpala ale cyklicznie, zamiast przy zmianie

13:35:40.886 MQT: stat/tasmota_1F536B/ANALOG = 747
13:35:45.073 RUL: ANALOG#A0 performs "publish stat/tasmota_1F536B/ANALOG 744"
13:35:45.078 MQT: stat/tasmota_1F536B/ANALOG = 744
13:35:49.321 RUL: ANALOG#A0 performs "publish stat/tasmota_1F536B/ANALOG 744"
13:35:49.326 MQT: stat/tasmota_1F536B/ANALOG = 744
13:35:53.691 RUL: ANALOG#A0 performs "publish stat/tasmota_1F536B/ANALOG 744"
13:35:53.697 MQT: stat/tasmota_1F536B/ANALOG = 744
13:35:58.072 RUL: ANALOG#A0 performs "publish stat/tasmota_1F536B/ANALOG 744"
13:35:58.078 MQT: stat/tasmota_1F536B/ANALOG = 744

Coraz bardziej podejrzewam, że to jest coś z Wemosem. Może to co wysyła rzeczywiście jest stałą wartością (zaokrągloną?), ale urządzenie dokonuje pomiarów z jakimiś uśrednieniami (i wewnętrznie operuje na np 744.1, 774.8) i stąd wyzwolenia…

Tak szczegółowo nie znam działania tasmoty, ale wygląda, że trygger uruchamia z każdym odczytem wartości A0. Być może trzeba porównać wartość obecną z poprzednią?

Edit…
W dokumentacji znalazłem taki wpis

Analog#A0div10	when the A0 input changes by more than 1% it provides a value between 0 and 100

Ameryki nie odkryłem, ale można stworzyć regułę z regulowanym czasem raportowania sensorów

rule2 
on system#boot do
   ruletimer2 60
endon
on rules#timer=2 do
   backlog status 10; ruletimer2 60
endon
1 Like

W sumie sukces :slight_smile:
Zadziałała następująca konstrukcja:

Rule1 ON ANALOG#A0!=%var1% DO backlog var1 %value%; Publish tele/tasmota_1F536B/SENSOR {"Time":"%timestamp%","ANALOG":{"A0":%value%}} ENDON

Trochę pokręcone i nie jest KISS, ale działa. Automatyzacja na bazie odczytu wartości A0 działa z około sekundowym opóźnieniem, więc jest zupełnie zadowalająco.
Dzięki @RobinI30 i @angler za pomoc!

1 Like

Gratuluję samozaparcia i fajnie, że nie zrezygnowałeś z reguł w Tasmota. Myślę, że dają sporo satysfakcji gdy automatyzacja dzieje się na poziomie urządzenia, niezależnie od pośredników.
Dla zaspokojenia ciekawości…
Jakie pomiary(czego) wymagają takiej precyzji? Czy komunikat jest wysyłany co jedną sekundę niezależnie od zmiany napięcia?

P.S.
Dla zaciekawionych działaniem reguł Tasmota, przykłady wykorzystania:

1 Like

Generalnie to rozpoczynam zabawę z HA i staram się nad tym zapanować :slight_smile: Ze względu na scentralizowany system HA planuję co się da wrzucić do urządzeń/czujników a HA żeby tylko to ogarniał do kupy.

Najbardziej mi zależy na braku opóźnień. Chciałbym aby np. włączyło mi się światło jak tylko czujnik wykryje ruch. Czyli niech to będzie jakaś sekunda, góra dwie - a nie 10 sekund. Ten przykład z ADC to w ramach “zabawy” - jeżeli uda mi się to zrobić, to uda też inne. W planie mam realizację automatyki “jak włączę komputer to ma włączyć się lampka” i “jak czujnik oświetlenia wykryje na dole wyłączenie światła, to niech zapali na piętrze lampkę w trybie nocnym” - czyli zdarzenia, które powinny być zrealizowane “błyskawicznie”, żeby się po prostu zrealizowały, a nie musiał na to czekać.

A z drugiej strony niech to działa na “zdarzeniach”, bo oczywiście telemetrię można przyśpieszyć, ale wówczas wszystkie urządzenia non-stop by coś wysyłały, a to marnowanie mocy, zasobów i pasma.

Póki co bawię się Node Red (ale to jak strzelanie z armaty do wróbla) i trochę się wkurzam, że w XXI wieku ciągle trzeba edytować pliki konfiguracyjne i poznawać tajemnicze rzeczy typu “payload” “topic”, “class”, “yaml” zamiast działać na klik-klik :slight_smile:

1 Like