[gelöst] Readings aus Calender für DOIF

Begonnen von australien, 01 Mai 2019, 18:30:28

Vorheriges Thema - Nächstes Thema

australien

Hallo zusammen,

wie kann ich aus einem Readings vom calender
today_<num>_timeshort     06:10 - 07:35
<num> vortlaufende Nummer - nicht bekannt

die Uhrzeit 06:10 auslesen? Anschließend soll diese in einem DOIF als Trigger verwendet werden.

Danke!!
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Otto123

Moin,

die witzigste Angabe in deiner Frage: <num> vortlaufende Nummer - nicht bekannt
Ja und nun? Höhere Intelligenz? Was hat die Zeit in dem Reading dann für eine Bedeutung, wenn das Reading an sich nicht gar nicht bekannt ist?  ;D

Generell folgendes: Ich würde Zeiten aus einem Kalender niemals über den komplizierten Umweg eines DOIF nutzen. Der Kalender kann so wie er ist direkt die Zeiten in Aktionen in FHEM umsetzen. Ich würde immer diesen einfachen Weg gehen. In der Doku sind genügend Beispiele:
https://commandref.fhem.de/#Calendar

Als Ansatzpunkte / Ideen zu Deiner eigentlichen Frage:

Im DOIF gibt es einige Möglichkeiten der indirekten Zeitangabe:
https://commandref.fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben

Wenn Du es unbedingt darüber machen willst, bekommst Du so als Ansatz die Anfangszeit aus dem Kalender Event, das Beispiel fragt jetzt alle ab, da musst Du noch mehr filtern.
get TestKalender2 events format:custom="$T1" timeFormat:"%H:%M"

Wenn das alles nicht zutrifft müsstes Du einfach noch mehr sagen :)

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

betateilchen

reden wir hier überhaupt von readings aus einem device vom TYPE=Calendar?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

australien

sorry, du hasst Recht, es handelt sich um ein reading aus CALVIEW.

Hier gibt es pro Tag mehrere Einträge, darum ist die <NUM> nicht bekannt, kann ja immer eine Andere sein.

zB
today_001_timeshort  04:20 - 04:50
today_002_timeshort  06:10 - 07:10
today_003_timeshort  16:00 - 17:10


nun soll am aktuellen Tag mit dem Eintrag 06:10 ein Schaltereignis ausgelöst werden.
Darum war meine Intention ein DOIF mit Trigger des readings today_<NUM>_timeshort und Wert 06:10 zu verwenden.

etwa so
DOIF [cal:today_<NUM>_timeshort] eq "06:10" set pumpe an

Den Calender direkt abzufragen wie es Otto vorschlägt verstehe ich nicht, leider!

es gibt dafür sicher eine Profilösung, leider bin ich nur ein Anfänger.
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Otto123

#4
Zitat von: australien am 02 Mai 2019, 11:34:12
sorry, du hasst Recht, es handelt sich um ein reading aus CALVIEW.
Na und CALVIEW zeigt doch nur Termine aus einem Device vom Type CALENDAR.

Warum willst Du mit einem Modul ein Modul abfragen welches wieder ein Modul abfragt? Wenn CALENDAR diesen trigger um 6:10 schon setzt?
Nimm den trigger und ein notify und deine Pumpe ist an.  ;D

Außerdem ist quasi in deinem Reading jetzt ein einfacher Schaltvorgang so kompliziert abgelegt, dass ich keinen einfachen Ansatz hätte dieses Reading gescheit auszuwerten.

Die "Profilösung" für jedermann steht in der oben verlinkten Doku etwas weiter unten.
Die dahinterlegende Idee ist ein oder mehrere (täglich wiederkehrende) Termine die im Betreff den Namen des Aktors in FHEM (z.B. Pumpe) haben und der Termin Anfang die Einschaltzeit und das Termin Ende die Ausschaltzeit repräsentiert:
ZitatSwitch actors on and off

Think about a calendar with calendar events whose summaries (subjects, titles) are the names of devices in your fhem installation. You want the respective devices to switch on when the calendar event starts and to switch off when the calendar event ends.

define SwitchActorOn notify MyCalendar:start:.* { \
my $reading="$EVTPART0";; \
my $uid= "$EVTPART1";; \
my $actor= fhem('get MyCalendar filter:uid=="'.$uid.'" format:custom="$S"');; \
if(defined $actor) { fhem("set $actor on") } \
}

define SwitchActorOff notify MyCalendar:end:.* { \
my $reading="$EVTPART0";; \
my $uid= "$EVTPART1";; \
my $actor= fhem('get MyCalendar filter:uid=="'.$uid.'" format:custom="$S"');; \
if(defined $actor) { fhem("set $actor off") } \
}

You can also do some logging:

define LogActors notify MyCalendar:(start|end):.* { my $reading= "$EVTPART0";; my $uid= "$EVTPART1";; \
my $actor= fhem('get MyCalendar filter:uid=="'.$uid.'" format:custom="$S"');; \
Log3 $NAME, 1, "Actor: $actor, Reading $reading" }
Wenn Du noch Beispiele mit etwas mehr Text brauchst:  ;)
https://forum.fhem.de/index.php/topic,87895.msg803439.html#msg803439
https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html
https://heinz-otto.blogspot.com/2018/07/kalender-in-fhem-einbinden.html

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

australien

Danke für die Tipps.
Dachte mir schon das, dass viel zu kompliziert ist.

Werde mich in deinen Vorschlag mal einarbeiten, bis jetzt ist ja noch nichts codiert, geschrieben.
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

australien

#7
@otto
ich habe das Ganze (.alarm) nun mit deinem Beispiel aus
https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html
gut hinbekommen, leider ist mir der DOIF lieber als ein notify.
Die Bedingung soll nur vor einer Bestimmten Uhrzeit ausführbar sein.
Beim DOIF kann ich auch mehrere set Befehle mit einem wait kombinieren.

Im Klartext, eine Zirkulationspumpe soll regelmäßig über den Tag verteilt laufen (funktioniert mit DOIF [06:15-12:00,+:15] ), nur wenn ich vor 6 Uhr schon raus muß, soll diese je nach Termin vorher auch schon mal anlaufen und auch nach 4 Minuten wieder stopen.


Wie kann ich nun das notify so umbauen, dass es bei der DOIF mit einer UND Zeitabrage funktoniert? Oder macht es Sinn das notify auf einen dummy umzuleiten und dieses mit dem DOIF zu verknüpfen, aber eher ist das nonsens.

Danke!!
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Damian

#8
Zitat von: australien am 03 Mai 2019, 19:45:58
@otto
ich habe das Ganze (.alarm) nun mit deinem Beispiel aus
https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html
gut hinbekommen, leider ist mir der DOIF lieber als ein notify.
Die Bedingung soll nur vor einer Bestimmten Uhrzeit ausführbar sein.
Beim DOIF kann ich auch mehrere set Befehle mit einem wait kombinieren.

Im Klartext, eine Zirkulationspumpe soll regelmäßig über den Tag verteilt laufen (funktioniert mit DOIF [06:15-12:00,+:15] ), nur wenn ich vor 6 Uhr schon raus muß, soll diese je nach Termin vorher auch schon mal anlaufen und auch nach 4 Minuten wieder stopen.


wie kann ich nun das notify so umbauen, dass es bei der DOIF mit einer UND Zeitabrage funktoniert?

Danke!!

Du kannst dein DOIF anpassen, indem du indirekte Zeitintervalle angibst, z. B.:

DOIF  ([[cal:today_001_timeshort:"^(\d\d:\d\d)"]-[cal:today_001_timeshort:"(\d\d:\d\d)$"],+:15]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

#9
Hallo Australian,

dann nimm doch mein Beispiel mit der Abfrage eines Termines einmal am Tag:
https://heinz-otto.blogspot.com/2018/07/kalender-in-fhem-einbinden.html
Und schreib die Anfangszeit in ein Reading von deinem DOIF. Das Reading nimmst Du dann als indirekte Zeitangabe.

Wenn Du at auch nicht magst, dann so (nur im Prinzip, nicht getestet):
define d_Abfrage DOIF ([02:00]) (setreading d_Pumpe Startzeit {(fhem('get DeinKalender events  format:custom="$T1" limit:from=0,count=1 timeFormat:"%H:%M"'))})
Das funktioniert jetzt so nur, wenn es der nächste Termin am aktuellen Tag ist.

Wenn Du mal noch beschreibst wie Dein Kalender aussieht, wie konkret der Termin für die Pumpe aussieht, kann ich dir beim Filtern des Termin helfen.

Spiel mal etwas mit den Calendar Abfragen, damit Du weißt was da passiert.

Den Rest machst Du entsprechend Damians Vorschlag (der so aber erstmal nicht funktioniert, weil Du ja nicht weißt welches Reading Du auswerten willst)

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

australien

#10
Hallo Otto123 und Damian

danke für eure Geduld.

Ich habe es nun mit einer Mischung der Dinge gelöst.
Mit dem notify (.alarm) wird ein reading im DOIF auf on beschrieben, wenn dieses zwischen der Zeit 0 und 6 Uhr passiert, wird die Pumpe gestartet und das reading wieder auf off gesetzt.

im DOIF sind auch noch andere DOELSEIF verschachtelt, fertig schaut es nun so aus

([06:15-12:00,+:15] and [jemand_da:state] eq "1") (set shelly_KG_Wasser on) (set shelly_KG_Wasser off)
DOELSEIF
([14:00-22:00,+:15] and [jemand_da:state] eq "1") (set shelly_KG_Wasser on) (set shelly_KG_Wasser off)
DOELSEIF
([00:00-06:00] and [do_KG_Wasser:Fruehstart] eq "on")
      (set shelly_KG_Wasser on) (set shelly_KG_Wasser off) (setreading do_KG_Wasser Fruehstart off)
DOELSEIF(set shelly_KG_Wasser off)

attr do_KG_Wasser wait 0,240:0,240:0,240,0



Danke nochmal für Eure Hilfe!!
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"