FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: All-Ex am 25 Dezember 2016, 19:40:46

Titel: Generalisierung mit Readings (statt Events) möglich?
Beitrag von: All-Ex am 25 Dezember 2016, 19:40:46
Ich habe mehrere Rollläden, die jeweils bei unterschiedlichen Sonnenständen herunterfahren sollen. Das habe ich bisher mit je einem DOIF pro Rollladen gelöst, z.B.:
([twilight:azimuth] > 10 and [twilight:azimuth] < 170)   
(set rol.wz.ost 100)


Mit einem generalisierten DOIF wäre die Aufgabe sehr viel übersichtlicher zu lösen. Ich würde die Azimuth-Winkel als Reading im jeweiligen Rollladen-Device speichern:
setreading rol.wz.ost azi_min 10, setreading rol.wz.ost azi_max 170
setreading rol.wz.sued azi_min 100, setreading rol.wz.sued azi_max 260


und dazu ein DOIF in etwa so bauen
([twilight:azimuth] > ["^rol:^azi_min$"] and [twilight:azimuth] < ["^rol:^azi_max$"])
(set $DEVICE 100)


Das funktioniert nicht, da azi_min und azi_max keine Events, sondern Readings sind.

Gibt es vielleicht andere Wege?

Grüße,
Alex
Titel: Antw:Generalisierung mit Readings (statt Events) möglich?
Beitrag von: Ellert am 25 Dezember 2016, 20:19:08
Es könnte funktionieren, wenn Du die Readin-Regex nicht mit $ abschliesst.
Titel: Antw:Generalisierung mit Readings (statt Events) möglich?
Beitrag von: Damian am 25 Dezember 2016, 23:10:25
Angaben in Anführungszeichen der Art ["^rol:^azi_min$"] sind Events und keine Readings. Die Frage ist, wann deine Bedingung ausgewertet soll. Vermutlich wenn twilight triggert, dann weiß man ja nicht welches Reading gemeint sein soll.

Titel: Antw:Generalisierung mit Readings (statt Events) möglich?
Beitrag von: All-Ex am 27 Dezember 2016, 12:56:29
Ja genau, bei twilight soll getriggert werden. Wäre dieser Ansatz sinnvoll?

Das erste DOIF triggert bei Bedarf die Rollladen-Devices:
([twilight:azimuth])
(trigger rol.wz.ost update,
trigger rol.wz.sued update)


Das zweite DOIF ist generalisiert. Es wartet auf den Trigger des 1. DOIFs, prüft jeweils beim getriggerten Rollladen weitere Bedingungen und löst dann die Aktion aus:
(["^rol:^update$"] and [?twilight:azimuth] > [?$DEVICE:azi_min] and [?twilight:azimuth] < [?$DEVICE:azi_max])
(set $DEVICE 100)


Das wären dann nur 2 DOIFs statt eins je Rollladen.
Titel: Antw:Generalisierung mit Readings (statt Events) möglich?
Beitrag von: Damian am 27 Dezember 2016, 15:12:10
Warum nicht.
Titel: Antw:Generalisierung mit Readings (statt Events) möglich?
Beitrag von: All-Ex am 10 Januar 2017, 22:32:01
Das funktioniert soweit schon mal, die Rollläden fahren herunter, wenn die Sonne auf das Fenster scheint :-)

Nun möchte ich das erweitern, damit in einem nächtlichen Zeitintervall die Rollläden ebenfalls herunterfahren. In den Rollladen-Devices stehen in den Readings time_down und time_up jeweils die individuellen Uhrzeiten, zu denen herunter- bzw. hochgefahren werden soll (z.B. 22:00 und 07:00).

Das DOIF sieht dann so aus (in Verbindung mit dem ersten DOIF aus dem Post oben zum Triggern)

(["^rol:^update$"] and                                                                       ## Trigger bei jedem twilight-Update
([?twilight:azimuth] > [?$DEVICE:azi_min] and [?twilight:azimuth] < [?$DEVICE:azi_max]) or   ## Sonne scheint auf Fenster
[?[$DEVICE:time_down]-[$DEVICE:time_up]])                                                    ## oder Zeitintervall (nachts)
(set $DEVICE 100)                                                                            ## Rollladen herunterfahren


Beim Speichern kommt die Meldung "DOIF: Wrong timespec : either HH:MM:SS or {perlcode}: [$DEVICE:time_down]"
Ich vermute, weil DOIF bei der Definition wissen muss, was in $DEVICE:time_down steht, aber diese Variable gibt es erst zur Laufzeit. Allerdings habe ich mit dem ? das Zeitintervall ohne Trigger definiert, so dass das das Zeitintervall erst zur Laufzeit geprüft werden muss.

Ist es möglich, dieses Szenario abzudecken?
Titel: Antw:Generalisierung mit Readings (statt Events) möglich?
Beitrag von: Damian am 10 Januar 2017, 23:04:25
In dem Fall darfst du keine Zeitintervalle benutzen, sondern einfachen Vergleich:

statt
[?[$DEVICE:time_down]-[$DEVICE:time_up]])

musst du angeben:

$hms gt [$DEVICE:time_down]  and $hms lt [$DEVICE:time_up]

$hms beinhaltet die aktuelle Zeit im Format HH:MM:SS.

alternativ kannst du auch $hm benutzen, wenn time_down bzw. time_up im Format HH:MM ist.