FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Gisbert am 04 Mai 2020, 18:16:27

Titel: [Teil gelöst] Kann man dieses DOIF kürzer definieren?
Beitrag von: Gisbert am 04 Mai 2020, 18:16:27
Hallo zusammen,

dieses DOIF funktioniert, allerdings wiederholen sich alle Funktionen mehr oder weniger.
defmod Rollladengruppe_OG DOIF ((time - [?myUniFi:Mobile_last_seen] > 86400/2) and [RollladenSchlafzimmer:Event] eq "Up") (set RollladenWohnzimmer DriveUp) \
DOELSEIF ((time - [?myUniFi:Mobile_last_seen] > 86400/2) and [RollladenSchlafzimmer:Event] eq "Down") (set RollladenWohnzimmer DriveDown) \
DOELSEIF ((time - [?myUniFi:Mobile_last_seen] > 86400/2) and [RollladenSchlafzimmer:Event] eq "Stop") (set RollladenWohnzimmer Stop) \
DOELSEIF ((time - [?myUniFi:Mobile_last_seen] > 86400/2) and [RollladenSchlafzimmer:Event] eq "Slit") (set RollladenWohnzimmer DriveSlit)

Es wird viermal berechnet, ob mein Handy im letzten halben Tag (aktuelle Zeit minus last_seen, im Unix-Format) eingebucht war, und dann wird in leichter Abwandlung veirmal ein Fahrbefehl abgesetzt.
Das Positive ist, dass die Defintion sehr übersichtlich, aber irgendwie auch redundant ist.

Kann man das kürzer definieren, also nur einmalige Berechnung der Zeitdifferenz und ggf. nur ein Fahrbefehl, wobei die Richtung/Fahrbefehl des 2. Rollladens wie des 1. sein soll?
Vielleicht mag mich ja jemand unterstützen?

Viele Grüße Gisbert
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Ellert am 04 Mai 2020, 18:54:49
(time - [?myUniFi:Mobile_last_seen] > 86400/2) könntest Du in DOIF_Readings berechnen und das Reading abfragen.
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Icinger am 04 Mai 2020, 19:04:48
Zitatkönntest Du in DOIF_Readings berechnen und das Reading abfragen.
Oder als Userreading direkt im Device.
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Damian am 04 Mai 2020, 19:30:18
Zitat von: Icinger am 04 Mai 2020, 19:04:48
Oder als Userreading direkt im Device.

DOIF_Readings haben den Vorteil, dass sie keine Events nach außen produzieren und dennoch das eigene Modul triggern.

(time - [?myUniFi:Mobile_last_seen] > 86400/2)

macht aber wenig Sinn, bitte Rangfolge beachten.
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Gisbert am 04 Mai 2020, 20:07:44
Hallo zusammen,

vielen Dank für eure Vorschläge, so ganz erschließt sich mir die Richtung noch nicht.

Ich wiederhole, was ich verstanden habe:
1) ein userReading im Device myUniFi - erscheint mir einleuchtend, dann wird jedesmal die Zeit berechnet, wenn das Reading Mobile_last_seen erneuert wird.
2) ein userReading im DOIF: auch hier wird die Zeit berechnet, soweit so gut, wird dann dieses userReadings auch nur dann erneuert, wenn das Reading Mobile_last_seen erneuert wird?
3) (time - [?myUniFi:Mobile_last_seen] > 86400/2) - macht aber wenig Sinn, bitte Rangfolge beachten: das verstehe ich nicht. Prinzipiell weiß ich, wie man userReadings erstellt, das Fragezeichen muss dann weg.

Viele Grüße Gisbert
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Damian am 04 Mai 2020, 21:09:48
Zitat von: Gisbert am 04 Mai 2020, 20:07:44
Hallo zusammen,

vielen Dank für eure Vorschläge, so ganz erschließt sich mir die Richtung noch nicht.

Ich wiederhole, was ich verstanden habe:
1) ein userReading im Device myUniFi - erscheint mir einleuchtend, dann wird jedesmal die Zeit berechnet, wenn das Reading Mobile_last_seen erneuert wird.
2) ein userReading im DOIF: auch hier wird die Zeit berechnet, soweit so gut, wird dann dieses userReadings auch nur dann erneuert, wenn das Reading Mobile_last_seen erneuert wird?
3) (time - [?myUniFi:Mobile_last_seen] > 86400/2) - macht aber wenig Sinn, bitte Rangfolge beachten: das verstehe ich nicht. Prinzipiell weiß ich, wie man userReadings erstellt, das Fragezeichen muss dann weg.

Viele Grüße Gisbert


mit

attr Rollladengruppe_OG DOIF_Readings diff:time - [myUniFi:Mobile_last_seen] > 43200

und dann mit DOIF ( [$SELF:diff,0] and ...

ersparst du dir unnötige Events. Zusätzlich triggert diff nur dann das eigene DOIF, wenn sich sein Inhalt ändert.
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Gisbert am 04 Mai 2020, 22:19:17
Hallo Damian,

vielen Dank für deine Erklärung.
Die Kunstruktion DOIF_Readings habe ich verstanden, nicht aber die Null in [$SELF:diff,0].

Gefunden habe ich in der commandref:
Syntax:
["regex for trigger",<default value>]
Aber warum wird ein default-Wert benötigt, falls meine Annahme zutrifft?

Müsste es nicht so lauten?
DOIF ( [$SELF:diff,0] > 0 and ...

Viele Grüße Gisbert
Titel: Antw:Kann man dieses DOIF kürzer definieren?
Beitrag von: Damian am 04 Mai 2020, 22:20:38
Falls es aus irgendwelchen Gründen diff nicht gibt, dann liefert der Ausdruck 0  und 0 > 0 ist nicht wahr.
Titel: Antw:[Teil gelöst] Kann man dieses DOIF kürzer definieren?
Beitrag von: Gisbert am 05 Mai 2020, 09:35:28
Hallo Damian,

das DOIF_Readings tut jetzt triggerend seinen Dienst. Wenn ich es nicht triggerend nur als Bedingung haben möchte, dann müsste es wohl so lauten:
DOIF ( [?$SELF:diff,0] > 0 and ...
Ist das richtig?

Mich verwirren die Aneinanderreihung von Sonderzeichen und erinnern mich an meine Kindheit bei Elektrospielsachen (z.B. Bagger), wo es hieß, nie die beiden Knöpfchen zum Heben und Senken gleichzeitig drücken. Was der Corona lock down alles mit einem anrichtet ...

Viele​ Grüße​ Gisbert​
Titel: Antw:[Teil gelöst] Kann man dieses DOIF kürzer definieren?
Beitrag von: Gisbert am 06 Mai 2020, 08:37:26
Zitat von: Gisbert am 05 Mai 2020, 09:35:28
... das DOIF_Readings tut jetzt triggerend seinen Dienst. Wenn ich es nicht triggerend nur als Bedingung haben möchte, dann müsste es wohl so lauten:
DOIF ( [?$SELF:diff,0] > 0 and ...
Ist das richtig?

Guten Morgen,
ich antworte mir mal selbst, damit der obige Ausdruck nicht unkommentiert stehen bleibt.
Das nicht triggerende Fragezeichen ist wahrscheinlich in Ordnung, nicht aber die Bedingung > 0, das muss auf jeden Fall weg, da ansonsten ein Fehlermeldung kommt und das DOIF nicht arbeitet. Beispiele in der commandref sind auch so aufgebaut.
DOIF ( [?$SELF:diff,0] and ...
Falls das jetzt doch alles Mist ist, was ich verzapfe, dann bitte um Korrektur, ich möchte andere, die das lesen, nicht in die Irre führen.

Viele​ Grüße​ Gisbert​