Automatyzacje - w czasie rzeczywistym?

a czemu sobie w Tasmocie nie dasz Rule że jak tam spoadnie < 50 co tam mierzysz to sobie zrobisz publish mqtt? nie musisz wtedy te 300 sec czekać

{“Rule2”:“ON”,“Once”:“OFF”,“StopOnError”:“OFF”,“Length”:111,“Free”:400,“Rules”:“on Switch1#state do publish domoticz/in {"idx":59,"nvalue":%value%} endon on Switch1#state=0 do Power1 0 endon”}

to przykład ode mnie, gdzie mam sonofa mini i on raportuje osobno stan przełącznika, a osobno stan power. Power idzie przez menu, a stan przełącznika idzie na inny idx. Temat mqtt dla HASS ogarniesz.

Tak, dokładnie tak to teraz robię, rule załatwiają sprawę. Ma to kilka wad: są mało “koszerne” i nieprzenośnie na inne systemy, są trudne (łatwo o pomyłki trudne do zdiagnozowania) no i nie da się tam wszystkiego ogarnąć (typu zmiana o 15% w ciągu 10 sekund).

no to tu Ci podpowiem, że dla wszystkich takich bardziej skomplikowanych tematów -
np u mnie: pomiar prądu sterowania cewką elektrozaworu gazu pieca gazowego i wyliczanie z tego zużycia gazu, raportowanie charakterystyk - zdecydowałem się na pisanie własnego kodu w Arduino IDE, i też z takiego kodu karmie i mqtt, i web requesty i nawet chyba jeszcze to wysyłam gdzieś do chmury thingspeak i całość mieści się tam w 200 linijkach, jedyna upierdliwość to że jak coś potrzebujesz zmienić to trza lecieć z laptopem do garażu programować po USB, choć pewnie jak by mi się bardziej chciało to jakiś parametry mógłby sobie czytać z sieci - ale mi się nie chciało :slight_smile:

Mi to się marzy, aby całą tasmotę dało się skompilować na Arduino IDE :slight_smile: Pisanie własnego kodu jest super, ale jednak obawiałbym się, czy umiałbym uniknąć wszystkich pułapek programistycznych i przewidział w algorytmie to co jest nieprzewidziane :smiley:

Ale to akurat nie problem. I nawet nie w arduino tylko poczytaj o takiej przystawce github.dev gdzie od razu w przeglądarce z githuba Ci zaczytuje działający i kompilowalny kod tasmota. Zmieniasz co potrzebujesz i kompilujesz. Sam mam taką jedną wersję zrobiona bo orginal a tasmota ma zwalony debouncing jeśli chcesz żeby działał tylko w jedną stronę np force high, i max w tasmocie jest 900ms a ja potrzebowałem więcej. Na koniec z tej strony z katalogu pobierasz sobie bin i wgrywasz do sonofa na przykład. A swój zmieniony projekt możesz zapisać jako brunch w githubie.

Edit to chyba jest gitpod


klikasz i Ci sie otwiera projekt, zmieniasz, kompilujesz i po temacie

1 polubienie

Wystarczy przglądarka z dostępem do internetu i konto na GitHub:

Wszystko opisane w dokumentacji Tasmota:

Dla prostych zastosowań bez wiedzy programistycznej polecam TasmoCompiler.

3 polubienia

@angler Dzięki za info! Używałem Tasmota Compiler - zaskakująco szybko i sprawnie działa, ale jak dla mnie ma za mało opcji, bo to klik-klik “grube” opcje plus dodanie pojedynczych sensorów.

Dlatego właśnie szukam rozwiązania bardziej “offline”, żeby móc sobie podłubać w kodzie bez kont na githubie, odpalania dockerów itp. Taka tasmota na Arduino IDE byłaby idealna. Mam np. dwa czujniki które pokazują wartości z “offsetem” - pewnie dałoby się to jakoś wyklikać na gitpodzie, ale wolałbym ograniczyć się do prostego “x=x-5”…
obrazobraz

Edit:

Odpowiadam sam sobie, ale ku potomnym :slight_smile:

Pomiar energii w “inteligentnym” gniazdku - wysłanie telemetrii tylko wtedy, gdy zmierzona przez gniazdko moc zwiększy się +/-5W. Czyli “dynamiczna” telemetria - informacja nie jest wysyłana co określony czas ale tylko wtedy gdy informacja zmieni się w ściśle zdefiniowanym zakresie:

  Rule1 ON ENERGY#Power>%var1% DO Backlog var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","ENERGY":{"Power":%value%}} ; var2 %value%; add1 5; sub2 5 ENDON 
Rule1 + ON ENERGY#Power<%var2% DO Backlog var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","ENERGY":{"Power":%value%}} ; var1 %value%; add1 5; sub2 5 ENDON 

To samo, ale dla np. czujnika temperatury, z jednoczesną korekcją wskazań (u mnie czujnik zaniża o 4,1hPa):

  Rule1 ON BMP180#Pressure>%var1% DO Backlog var5=%value%+4.1; var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","BMP180":{"Pressure":%var5%}}; var2 %value%; add1 0.2; sub2 0.2 ENDON 
Rule1 + ON BMP180#Pressure<%var2% DO Backlog var5=%value%+4.1; var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","BMP180":{"Pressure":%var5%}}; var1 %value%; add1 0.2; sub2 0.2 ENDON

I voila!
obraz

Teraz wystarczy prosta automatyzacja w HA (jeżeli POWER<50 to włącz GNIAZDKO) i w zasadzie otrzymuje się sekundę, góra dwie opóźnienia akcji.

2 polubienia

Cześć, tutaj masz w kod tylko dla czunjnika bmp, mozesz udostępnić, albo dać info co zmienić dla czujnika temperatury?
Taka opcja znacznie odciązy mi bazę danych, gdzie monitoruję temp co 10s przy bojlerze i kotle
obraz

Kodu nie mam - w tasmocie wystarczy czujnik podpiąć pod I2C (używam Wemosa) i samo się wykrywa. A z czym masz konkretnie problem?

W kwestii monitorowania: spróbuj mojej metody z “rules” - wówczas informacje są wysyłane tylko gdy zmienią się o jakiś próg, a nie ciągle.

dla takiego zestawów czujników jest to prawidłowa konfiguracja?
image

  Rule1 ON DS18B20-1#Temperatura>%var1% DO Backlog var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-1":{"Temperatura":%var5%}}; var2 %value%; add1 0.2; sub2 0.2 ENDON 
Rule1 + ON DS18B20-1#Temperatura<%var2% DO Backlog var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-1":{"Temperatura":%var5%}}; var1 %value%; add1 0.2; sub2 0.2 ENDON

  Rule1 ON DS18B20-2#Temperatura>%var1% DO Backlog var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-2":{"Temperatura":%var5%}}; var2 %value%; add1 0.2; sub2 0.2 ENDON 
Rule1 + ON DS18B20-2#Temperatura<%var2% DO Backlog var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-2":{"Temperatura":%var5%}}; var1 %value%; add1 0.2; sub2 0.2 ENDON
itd...?

W pierwszej zasadzie zamiast %var5% wpisz %value% - bo chcesz wysłać wartość z czujnika, a nie jakaś zmienną - tym bardziej że tej zmiennej nie masz zdefiniowanej.

W kolejnych zasadach używaj kolejnych %var%, żeby nie wpadały do niepoprawnych reguł.

Spróbuj tak:

Rule1 ON DS18B20-1#Temperatura>%var1% DO Backlog var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-1":{"Temperatura":%value%}}; var2 %value%; add1 0.2; sub2 0.2 ENDON 
Rule1 + ON DS18B20-1#Temperatura<%var2% DO Backlog var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-1":{"Temperatura":%value%}}; var1 %value%; add1 0.2; sub2 0.2 ENDON

  Rule2 ON DS18B20-2#Temperatura>%var3% DO Backlog var3 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-2":{"Temperatura":%value%}}; var4 %value%; add3 0.2; sub4 0.2 ENDON 
Rule2 + ON DS18B20-2#Temperatura<%var4% DO Backlog var4 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-2":{"Temperatura":%value%}}; var3 %value%; add3 0.2; sub4 0.2 ENDON

Upewnij się czy sensor wysyła “po polsku”: “Temperatura” czy “Temperature”, raczej to drugie

ok, zastanawiam się czy DS18B20-2 dobrze wpisałem, sensor w HA wygląda jak poniżej
sensor.hydrofornia_bojlery_ds18b20_2_temperature

obraz

Najlepiej - sprawdź w konsoli tasmoty jaką paczkę danych wysyła podczas telemetrii. I jedyne co to trzeba taką samą paczkę spreparować używając reguł. Mi DS wysyła takie coś:

"DS18B20":{"Id":"000005F5B6D8","Temperature":25.291}

wiec zapewne będziesz musiał u siebie dodać “Id” oraz “Temperature” zamiast |Temperatury"

chyba nie będzie to takie proste, moja paczka jest ciut dłuższa

20:36:56 MQT: tele/Hydrofornia_Bojlery/SENSOR = {"Time":"2022-03-19T20:36:56","DS18B20-1":{"Id":"01144A470DAA","Temperature":39.6},"DS18B20-2":{"Id":"01144F1255AA","Temperature":51.7},"DS18B20-3":{"Id":"01144F18B5AA","Temperature":37.1},"DS18B20-4":{"Id":"3C01E0761CDA","Temperature":34.4},"DS18B20-5":{"Id":"3C01E07633A6","Temperature":15.9},"DS18B20-6":{"Id":"3C01E0767D2F","Temperature":48.2},"DS18B20-7":{"Id":"3C01F09579D6","Temperature":39.5},"DS18B20-8":{"Id":"3C01F095964C","Temperature":20.0},"TempUnit":"C"}

chyba odpuszczę

Chyba będzie proste, masz 90% gotowe. Spróbuj tego:

  Rule1 ON DS18B20-1#Temperature>%var1% DO Backlog var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-1":{"Id":"01144A470DAA","Temperature":%value%}}; var2 %value%; add1 0.2; sub2 0.2 ENDON 
Rule1 + ON DS18B20-1#Temperature<%var2% DO Backlog var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-1":{"Id":"01144A470DAA","Temperature":%value%}}; var1 %value%; add1 0.2; sub2 0.2 ENDON
Rule1 + ON DS18B20-2#Temperature>%var3% DO Backlog var3 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-2":{"Id":"01144F1255AA","Temperature":%value%}}; var4 %value%; add3 0.2; sub4 0.2 ENDON 
Rule1 + ON DS18B20-2#Temperature<%var4% DO Backlog var4 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20-2":{"Id":"01144F1255AA","Temperature":%value%}}; var3 %value%; add3 0.2; sub4 0.2 ENDON

I powinno działać - mam nadzieję że żadnej literówki nie walnąłem :slight_smile: Najlepiej sprawdź na jednym czujniku, a jak zadziała to dodawaj kolejne, zmieniając numer czujnika, Id czujnika oraz zwiększając kolejno %var%.

1 polubienie

a takie pytanie, można to w całości wkleić, czy trzeba linijka po linijce, i to pierwsze wcięcie mnie interesuje, czy też ma być?

@luki25 - poczytaj dokumentację będzie Ci łatwiej.

Wcięcia i wielkość liter nie ma znaczenia. Możesz wszystko wpisać w jednym ciągu.

Ja wklejam linijka po linijce. Czyli wklejam do konsoli, daję [Enter], wklejam następną itd. Pierwsze wcięcie jest nieistotne, zrobiłem żeby ładniej się czytało.
Nie wiem czy tasmota nie ma jakichś ograniczeń na długość reguły - ale pewnie wyskoczy błąd jakby coś. W razie problemów to zrób pierwsze trzy na Rule1, kolejne3 na Rule2 i ostatnie 2 na Rule3.

I oczywiście na koniec aktywuj regułę (rule1 1) i powinno zadziałać.

1 polubienie

nie działa to, zrobiłem to na innej tasmocie gdzie jest tylko jeden sensor
moja paczka:

{"Time":"2022-03-19T21:20:54","DS18B20":{"Id":"01144F5431AA","Temperature":24.8},"TempUnit":"C"}

a to wklejam i jak była paczka co 10s tak dalej się wysyła co 10s, a temp takie same

Rule1 ON DS18B20#Temperature>%var1% DO Backlog var1 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20":{"Id":"01144F5431AA","Temperature":%value%}}; var2 %value%; add1 0.2; sub2 0.2 ENDON 
Rule1 + ON DS18B20#Temperature<%var2% DO Backlog var2 %value%; Publish tele/%topic%/SENSOR {"Time":"%timestamp%","DS18B20":{"Id":"01144F5431AA","Temperature":%value%}}; var1 %value%; add1 0.2; sub2 0.2 ENDON
Rule1 1

co jest nie tak w tym?

w paczce jeszcze masz jednostki temperatury, tam gdzie masz

}}

zamień na

},"TempUnit":"C"}

I najlepiej wydłuż czas telemetrii (daj 300), żeby nie przeszkadzało.