DoIf zu mehreren Zeitpunkten, die dynamisch aus einem Device berechnet werden

Begonnen von aw, 13 Juli 2019, 15:40:00

Vorheriges Thema - Nächstes Thema

aw

Hallo,
erstmal möchte ich allen Beteiligten für die großartige Entwicklungen rundum Doif gratulieren!!!
Ich finde dieses Modul wie auch fhem generell einzigartig.
Ich verwendet fhem um mein Aquarium incl. Rolladen usw zu steuern. Dafür habe ich eine ganze Reihe Sensoren und Aktoren im Einsatz und alles funktioniert sehr gut.
Als Beleuchtung steuere ich 3 LED Balken (incl. Sonnenaufgang, -untergang). Momentan realisiere ich diese Steuerung über diverse Zeiträume pro LED, was auch prinzipiell gut funktioniert.
Um zukünftig aber "Schwachpunkte" (Stromausfälle, spontane Änderungen usw) zu eliminieren, würde ich gerne pro Device (LED Balken) mehrere Attribute definieren, die einzelne Zeitpunkte zum Ein - oder Ausschalten darstellen. Die Anzahl der Schaltpunkte ist bei jedem Device unterschiedlich.
Meine Frage ist nun, ob ich über eine Perl Funktion dynamisch einen String erzeugen kann, der mir pro Device aus dessen Attributen die einzelnen Schaltpunkte ermittelt?
Device: (E = Einschaltzeitpunkt, A=Ausschaltzeitpunkt)
LED 1
Attribut: E1 10:00
Attribut: A1 14:00
Attribut: E2 17:00
Attribut: A2 20:00

LED 2
Attribut: E1 08:00
Attribut: A1 12:00
Attribut: E2 13:00
Attribut: A2 17:00
Attribut: E3 18:00
Attribut: A3 21:00

Es würde natürlich funktionieren, wenn ich die einzelnen Zeitpunkte direkt in der Auslösebedingung abfrage, aber da die Anzahl der Schaltpunkte unterschiedlich sein können, wäre diese Lösung unelegant. Daher meine Idee der dynamischen Berechnung der Auslösungsbedingung in Perl wie z.b.

sub doifConditionCalc(){
   return '['.ReadingsVal("LED1", "E1", "").'] or '['.ReadingsVal("LED1, "E2", "").'];
}
Dies ist natürlich nicht wirklich dynamisch und soll nur das Grundprinzip darstellen.
Ist generell eine solche Möglichkeit denkbar oder ist mein Gedankenansatz völlig falsch.
Für kreative Ideen bin ich sehr dankbar.
VG
Achim

Otto123

Hallo Achim,

ich habe es noch nicht ganz verstanden, aber um Fehler in deinem Ansatz zu minimieren:
Attribute ist nicht Reading! Und es gibt für beides eine Funktion: AttrVal und ReadingsVal.
attr wird in die Config geschrieben und erzeugt ein rotes "?"
Readings werden im Statefile geschrieben.
Für "Dynamik" sind Readings im allgemeinen besser.

Zeitpunkte aus Readings gehen unter DOIF relativ simpel: [[Device:Reading]] - da steht im Device im Reading einfach 14:00 drin und DOIF triggert 14:00 Uhr.

Aber ob damit das geht, was Du eigentlich willst, weiß ich nicht.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

aw

Das war in meinem Beispielscript wirklich nicht stimmig. Oben spreche ich von Attributen und im Script von Readings.. Sorry :-)
Ich habe beides ausprobiert.
Im Endeffekt möchte ich über eine Perl Funktion, welche ich in der doif definition anstelle der Auslösebedingung aufrufe, einen String erzeugen, der eine funktionsfähige Auslösebedingung darstellt, d.h der Rückgabewert der Funktion wäre
'[08::00] or [11:00]'
Für einen einzelnen Zeitpunkt funktioniert das prima, nur eben nicht mit mehreren Zeitpunkten, die über or verknüpft sind.

Gesendet von meinem SM-G950F mit Tapatalk


Otto123

Und [[devicename:Reading1]] or [[devicename:Reading2]] wäre keine Lösung?

Ich verstehe den Umstand mit der Perlfunktion nicht, Du liest ja darin bloß Readings aus, das macht DOIF mit [[device:reading]] genauso.
https://commandref.fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

Zitat von: aw am 13 Juli 2019, 16:57:25
Das war in meinem Beispielscript wirklich nicht stimmig. Oben spreche ich von Attributen und im Script von Readings.. Sorry :-)
Ich habe beides ausprobiert.
Im Endeffekt möchte ich über eine Perl Funktion, welche ich in der doif definition anstelle der Auslösebedingung aufrufe, einen String erzeugen, der eine funktionsfähige Auslösebedingung darstellt, d.h der Rückgabewert der Funktion wäre
'[08::00] or [11:00]'
Für einen einzelnen Zeitpunkt funktioniert das prima, nur eben nicht mit mehreren Zeitpunkten, die über or verknüpft sind.

Gesendet von meinem SM-G950F mit Tapatalk

Wie Du richtig beobachtet hast, muss eine Funktion eine und nur eine gültige Zeitangabe liefern. Du kannst keine Verknüpfungen zur Laufzeit einfügen, sondern nur zum Definitionszeitpunkt. Wenn eine Funktion den Zeitpunkt Tx liefert, dann wir der nächste Zeitpunkt Tx+1 am Zeitpunkt Tx berechnet, wie bei sunset usw.

Damian

Für eine dynamische Zeitpunktdefinition hinsichtlich der Anzahl der Zeittrigger müsstest du die komplette DOIF-Definition zusammenbauen und per fhem-Befehl defmod das DOIF-Device definieren bzw. ein bestehendes ändern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

aw

Das hatte ich auch schon vermutet, ich hatte nur auf eine andere Idee gehofft. :-)
Vielen Dank noch mal!


Gesendet von iPad mit Tapatalk

Ellert

Zitat von: aw am 13 Juli 2019, 18:47:47
Das hatte ich auch schon vermutet, ich hatte nur auf eine andere Idee gehofft. :-)
Vielen Dank noch mal!


Gesendet von iPad mit Tapatalk
Letztlich prüft DOIF eine Bedingung immer nur zu einem Zeitpunkt, ganz gleich wie der verknüpft ist. Daher wird sich immer eine Perl-Funktion erstellen lassen, die den nächsten Zeitpunkt berechnet. Damit wäre es nicht notwendig mehrere Zeitpunkte zu verknüpfen, sie könnten auch nacheinander berechnet werden.

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

aw

Zitat von: Damian am 14 Juli 2019, 08:50:49
Er meint wahrscheinlich eher so etwas: https://forum.fhem.de/index.php/topic,99533.msg929301.html#msg929301

Hat leider noch nicht bis in die Entwicklungsabteilung geschafft ;)

1. Das könnte eine Option sein, die ich mal testen werde.
2. Für fhem stimmts  ;)

Nochmals danke für die Antworten