Hauptmenü

Mein DOIF und das wait attrib

Begonnen von Jasimo, 23 April 2018, 08:01:29

Vorheriges Thema - Nächstes Thema

Jasimo

Hallo,

ich habe ein DOIF definiert welches wie folgt aussieht und soweit funktioniert. Das DOIF soll später einmal meinen Mähroboter (steh noch in der Garage) zum Mähen schicken.
Wenn es 09:00 ist und der Regensensor "dry" ist wird Mower auf "on" gesetzt.
([09:00] and [Regensensor] eq "dry") (set Mower on)

Hier ein list vom DOIF
Internals:
   DEF        ([09:00] and [Regensensor] eq "dry") (set Mower on)
   MODEL      FHEM
   NAME       doif_Mowerzeitplan
   NR         74
   NTFY_ORDER 50-doif_Mowerzeitplan
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-04-23 07:38:40   Device          Regensensor
     2018-04-22 21:08:46   cmd             0
     2018-04-23 07:38:40   e_Regensensor_STATE dry
     2018-04-22 21:08:46   mode            enabled
     2018-04-22 21:08:46   state           initialized
     2018-04-22 21:10:00   timer_01_c01    23.04.2018 09:00:00
   Regex:
   condition:
     0          DOIF_time_once($hash,0,$wday) and InternalDoIf($hash,'Regensensor','STATE') eq "dry"
   days:
   devices:
     0           Regensensor
     all         Regensensor
   do:
     0:
       0          set Mower on
     1:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      dry
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev Regensensor
     triggerEvents:
       dry
     triggerEventsState:
       state: dry
   internals:
     0           Regensensor:STATE
     all         Regensensor:STATE
   interval:
   itimer:
   localtime:
     0          1524510600
   readings:
   realtime:
     0          09:00:00
   time:
     0          09:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   trigger:
   triggertime:
     1524510600:
       localtime  1524510600
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   room       System
   wait       7200


Nun wollte ich die Aktion "Mower on" eingentlich mit dem wait attribut um 120 Minuten verzögern, nur leider scheint das DOIF mich nicht zu verstehen. Zumindest ist es immer so, dass wenn es 09:00 ist und der Regensensor "dry", der Mower gleich auf "on" geht ohne die 2 Stunden zu verzögern.
Mein Ziel ist, dass der Mäher nur rausfährt wenn es zwei Stunden vorher nicht geregnet hat.

Vielleicht habt ihr Profis eine Idee was ich falsch gemacht habe. Bitte nicht gleich steinigen bin noch Anfänger in Sachen FHEM ;-)

Gruß
Jan

Damian

Zitat von: Jasimo am 23 April 2018, 08:01:29

Mein Ziel ist, dass der Mäher nur rausfährt wenn es zwei Stunden vorher nicht geregnet hat.


Ganz einfach, zwei Stunden später abfragen:

   DEF        ([11:00] and [Regensensor] eq "dry") (set Mower on)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Jasimo

Hallo Damian, erstmal danke für Dein Feedback.
Wenn ich den DOIF auf 11:00 setze und es von 10:00 bis 10:45 geregnet hat, würde er doch trotzdem um 11:00 herausfahren und das klatschnasse Gras mähen, oder?

Damian

Zitat von: Jasimo am 23 April 2018, 09:01:24
Hallo Damian, erstmal danke für Dein Feedback.
Wenn ich den DOIF auf 11:00 setze und es von 10:00 bis 10:45 geregnet hat, würde er doch trotzdem um 11:00 herausfahren und das klatschnasse Gras mähen, oder?

ja, da hätte wait auch nicht geholfen, denn es hätte nur die Ausführung um 2 Stunden verzögert.

Da wirst du dir zwei Stunden vorher, den Zustand des Rasens "merken" müssen und diesen dann abfragen:

z. B.

([07:00-09:00] and [Regensensor] ne "dry")(setreading $SELF regen on)
DOELSEIF ([09:00] and [?$SELF:regen,"off"] ne "on")( set Mower on, setreading $SELF regen off)

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

Otto123

Moin,

aber wenn es um neun nicht geregnet hat und Du die Befehlsausführung einfach zwei Stunden verzögert fährt doch dann einfach ins Unwetter?

Also ich würde ein Zeitspannne definieren in der er fahren könnte und würde do always rausnehmen. Dann wird das eventuell so funktionieren wie Du es Dir vorstellst. Ich habe zumindest so was ähnliches ...

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

Jasimo

#5
Oha, man merkt das ihr mir meilenweit vorraus seid. ;-) Trotzdem vielen Dank an Euch das ihr euch mein Problemchen anseht.

Ich "dachte", dass das wait attribut die Ausführung also das "Mower on" verzögert, das macht er (in meinem DOIF) aber nicht.
Und ich "dachte" wohl fälschlicherweise, dass wenn wieder Regen einsetzt das wait und auch die Ausführung abgebrochen wird. Dann fährt er halt den Tag nicht mehr raus zum Mähen

Wie man sieht ich muss noch viel aufarbeiten.
Ich probiere mal den Tip von Damian aus und versuche das alles zu verstehen, gebe dann nochmal Feedback.



Damian

#6
Zitat von: Jasimo am 23 April 2018, 10:10:06
Oha, man merkt das ihr mir meilenweit vorraus seid. ;-) Trotzdem vielen Dank an Euch das ihr euch mein Problemchen anseht.

Ich "dachte", dass das wait attribut die Ausführung also das "Mower on" verzögert, das macht er (in meinem DOIF) aber nicht.
Und ich "dachte" wohl fälschlicherweise, dass wenn wieder Regen einsetzt das wait und auch die Ausführung abgebrochen wird. Dann fährt er halt den Tag nicht mehr raus zum Mähen

Da hast du eigentlich gar nicht so falsch gedacht, sondern ich :)

DEF        ([09:00] and [Regensensor] eq "dry") (set Mower on)

damit wait in Kombination mit Timer funktioniert, musst du nur noch das Attribut https://fhem.de/commandref_DE.html#DOIF_timerWithWait setzen, dann sollte es so funktionieren, wie du dir es überlegt hast, allerdings darf innerhalb der 2 Stunden nicht [Regensensor] eq "dry" noch mal kommen, sonst ist die Bedingung ebenfalls false und der Timer wird ebenfalls abgebrochen.



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

Jasimo

Mist, das mit dem attribut timerWithWait hab ich in der Commandref überlesen.

Da muss ich gleich noch ne kleine Frage hinterher werfen zu Deinem Beispiel, dass
([07:00-09:00] and [Regensensor] ne "dry")(setreading $SELF regen on)
bewirkt doch, dass in der Zeit von 7-9 und auf einen Zustand ungleich "dry" des Regensensors ein reading regen "on" erzeugt wird.
Wenn es nun kurz um 8 regnet, behält dann das reading den Zustand "on" auch wenn es um 08:30 wieder trocken ist (laut Regensensor).

Das wäre ja dann schon nahezu perfekt!


Frank_Huber

Zitat von: Damian am 23 April 2018, 10:28:56
Da hast du eigentlich gar nicht so falsch gedacht, sondern ich :)

DEF        ([09:00] and [Regensensor] eq "dry") (set Mower on)

damit wait in Kombination mit Timer funktioniert, musst du nur noch das Attribut https://fhem.de/commandref_DE.html#DOIF_timerWithWait setzen, dann sollte es so funktionieren, wie du dir es überlegt hast, allerdings darf innerhalb der 2 Stunden nicht [Regensensor] eq "dry" noch mal kommen, sonst ist die Bedingung ebenfalls false und der Timer wird ebenfalls abgebrochen.

wäre es nicht ausreichend dem Regensensor ein "event-on-change" zu spendieren und ein DOELSEIF mit Regen-JA -> set mower off einzufügen?

Damian

Zitat von: Jasimo am 23 April 2018, 10:44:00
Mist, das mit dem attribut timerWithWait hab ich in der Commandref überlesen.

Da muss ich gleich noch ne kleine Frage hinterher werfen zu Deinem Beispiel, dass
([07:00-09:00] and [Regensensor] ne "dry")(setreading $SELF regen on)
bewirkt doch, dass in der Zeit von 7-9 und auf einen Zustand ungleich "dry" des Regensensors ein reading regen "on" erzeugt wird.
Wenn es nun kurz um 8 regnet, behält dann das reading den Zustand "on" auch wenn es um 08:30 wieder trocken ist (laut Regensensor).

Das wäre ja dann schon nahezu perfekt!

ja, der Befehl wird nicht wiederholt, das Modul kann aber auch nicht in einen anderen Zustand. Allerdings habe ich noch einen Denkfehler gehabt. regen off sollte man nicht beim Mähen zurücksetzen, denn da war er ja schon off, sondern zum späteren Zeitpunkt, damit am nächsten Tag alles wieder sauber funktioniert.

([07:00-09:00] and [Regensensor] ne "dry")(setreading $SELF regen on)
DOELSEIF ([09:00] and [?$SELF:regen,"off"] ne "on")( set Mower on)
DOELSEIF ([00:00]) (setreading $SELF regen off)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Frank_Huber am 23 April 2018, 10:50:12
wäre es nicht ausreichend dem Regensensor ein "event-on-change" zu spendieren und ein DOELSEIF mit Regen-JA -> set mower off einzufügen?

ja, "event-on-change" würde ein wiederholtes Ereignis verhindern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Jasimo

#11
okay, habe die optimierte Version mal aktiviert und werde testen. DANKE!!!

Für den Regensensor habe ich schon längere Zeit ein event-on-change-reading "state" gesetzt, da ich mich per prowl informieren lasse wenn es zu regnen beginnt und ich manchmal Doppelmeldungen bekommen habe. Der Sensor schickt manchmal ein dry obwohl er vorher schon dry war.

Das sollte für den Code von Damian aber nicht relevant sein, sofern ich mich nicht irre.


Per

Kann ich nicht einfach abfragen, ob der Status "dry" vom Regensensor älter als 2 Stunden ([xxx:sec] > 7200) ist? Zumindest i.V. mit event-on-change.

Jasimo

#13
Hallo,

wollte mich ja nochmal zurückmelden, was ich hiermit tue. Toll das Ihr mir so unkompliziert geholfen habt.
Soweit funktioniert nun alles, hat ja ein paarmal geregnet morgens und der Mower ist nicht auf "on" gegangen.
Hier nochmal der Code
([07:00-09:00] and [Regensensor] ne "dry")(setreading $SELF regen on)
DOELSEIF ([09:00] and [?$SELF:regen,"off"] ne "on")(set Mower on)
DOELSEIF ([00:00]) (setreading $SELF regen off)


Eine Frage habe ich jedoch noch, ist es irgendwie noch hinzubekommen, dass nur das Reading "regen on" gesetzt wird wenn der Regensensor x Minuten in dem Zeitraum 07:00-09:00 nass war?