[Teil gelöst] Kann man dieses DOIF kürzer definieren?

Begonnen von Gisbert, 04 Mai 2020, 18:16:27

Vorheriges Thema - Nächstes Thema

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Ellert

(time - [?myUniFi:Mobile_last_seen] > 86400/2) könntest Du in DOIF_Readings berechnen und das Reading abfragen.

Icinger

Zitatkönntest Du in DOIF_Readings berechnen und das Reading abfragen.
Oder als Userreading direkt im Device.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Damian

Falls es aus irgendwelchen Gründen diff nicht gibt, dann liefert der Ausdruck 0  und 0 > 0 ist nicht wahr.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome