Verhindern das ein DOIF bei Statuswechsel ausgelöst wird ?

Begonnen von visionsurfer, 06 November 2016, 14:59:37

Vorheriges Thema - Nächstes Thema

visionsurfer

Hallo,

ich versuche gerade noch ein bisschen die Zusammenhänge zu verstehen.

Ich habe mir ein DOIF gebaut, mit dem ich angesagt bekomme, wie draußen das Wetter ist. Das DOIF soll meine Daten von meiner Wetterstation auf dem Dach prüfen. Also wie die aktuelle Temperatur ist und ob die Wetterstation Regen oder kein Regen meldet.

Das ganze sieht als Code so aus:


define wetteransage DOIF ([dummy_regen] eq "on" and [wetterstation_regen] eq "nein") (set Sonos_Esszimmer Speak 45 de Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht.) DOELSEIF ([dummy_regen] eq "on" and [wetterstation_regen] eq "ja") (set Sonos_Esszimmer Speak 45 de Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet.)


Zum Test hab ich einfach ein dummy_regen eingebaut. So das ich es an und ausschalten kann.

Wenn ich es anschalte, funktioniert es so wie ich will. Es sagt mir entsprechend das Wetter. Gestern hat es immer mal wieder bei uns geregnet. Immer dann wenn die Wetterstation den Status von Regen auf kein Regen gewechselt hat, wurde natürlich die Ansage abgespielt. Das ging den ganzen Tag so.

Grundsätzlich ist mir das auch klar. Weil das DOIF ja so aufgebaut ist. Er soll ja schließlich den Status abfragen.

Aber ich frage mich, ob man das irgendwie unterbinden kann ? Ich möchte das es nur einmal abgespielt wird. Fertig. Wahrscheinlich unlogisch, oder ? Also wahrscheinlich geht es nur, wenn man noch ein Ereignis davor setzt. Also wenn Bewegungsmelder XY bewegung meldet, oder Uhrzeit ist = 7 Uhr oder was auch immer.

Oder gibt es noch andere Möglichkeiten. Später will ich das in meine Morgenroutine einbauen. Also nach dem aufstehen im Bad abspielen oder was auch immer.

Grüße,
Visionsurfer

Ellert

#1
ZitatIch möchte das es nur einmal abgespielt wird.
Das meinst Du sicher nicht wirklich, falls doch, könntest Du am Ende des Befehle ein delete wetteransage einbauen  ;)

Du müsstest Dich entscheiden, ob Du die Ansage zu einem Zeitpunkt, einer Zeitspanne oder einem Ereignis, einmal oder mehrmals ansagen lassen möchtest, dann kannst Du diese Zusatzbedingung mit and <Zusatzbedingung> einbauen.  Zusätzlich kannst Du Readings im DOIF als Zähler nutzen und sie Nachts zurücksetzen.

Beispiel:
(<Bedingung1> and [$SELF:zhlr1] < 1)
   (set Dein Kram, setreading $SELF zhlr1 1) ## wird nur 1x am Tag ausgeführt
DOELSEIF (<Bedingung2> and [$SELF:zhlr2] < 1)
   (set Dein Kram, setreading $SELF zhlr2 1) ## wird nur 1x am Tag ausgeführt
DOELSEIF ([00:10])
   (setreading $SELF zhlr1 0,setreading $SELF zhlr2 0) ## Zähler zurück setzen

und das Attribut
notexist "0"

visionsurfer

Hi,

na ja, ich will es natürlich nicht danach wieder löschen. Da hab ich mich vielleicht falsch ausgedrückt :)
Sonder halt nur einmal.

Als Beispiel. Ich stehe morgens auf und gehe durch einen Raum, wo ein Bewegungsmelder reagiert. Dann möchte ich einmal die Ansage hören, damit ich informiert bin.
Nun kann es passieren das ich 5 Minuten später nach mal durch diesen Raum will oder muss. Dann möchte ich die Ansage natürlich nicht schon wieder hören. Sondern ich habe Sie ja für diesen morgen schon einmal gehört. Am nächsten Tag, möchte ich es dann wieder morgens hören, wenn ich das erste mal den Raum betrete.

So in der Art.

Grüße,
Visionsurfer

Ellert

ZitatAls Beispiel. Ich stehe morgens auf und gehe durch einen Raum, wo ein Bewegungsmelder reagiert. Dann möchte ich einmal die Ansage hören, damit ich informiert bin.
Nun kann es passieren das ich 5 Minuten später nach mal durch diesen Raum will oder muss. Dann möchte ich die Ansage natürlich nicht schon wieder hören. Sondern ich habe Sie ja für diesen morgen schon einmal gehört. Am nächsten Tag, möchte ich es dann wieder morgens hören, wenn ich das erste mal den Raum betrete.
Ja, deshalb habe ich auch das Beispiel  dazu geschrieben.

Damian

Zitat von: visionsurfer am 06 November 2016, 19:37:36
Hi,

na ja, ich will es natürlich nicht danach wieder löschen. Da hab ich mich vielleicht falsch ausgedrückt :)
Sonder halt nur einmal.

Als Beispiel. Ich stehe morgens auf und gehe durch einen Raum, wo ein Bewegungsmelder reagiert. Dann möchte ich einmal die Ansage hören, damit ich informiert bin.
Nun kann es passieren das ich 5 Minuten später nach mal durch diesen Raum will oder muss. Dann möchte ich die Ansage natürlich nicht schon wieder hören. Sondern ich habe Sie ja für diesen morgen schon einmal gehört. Am nächsten Tag, möchte ich es dann wieder morgens hören, wenn ich das erste mal den Raum betrete.

So in der Art.

Grüße,
Visionsurfer

Erst mal muss du sagen, wann "morgens" bei dir zu Ende geht. ;)

Du könntest das Attribut cmdpause benutzen oder

ohne do always

DOIF (Deine Bedingung) (Ansagen) DOELSEIF ([00:00])

Wiederholung kann erst wieder nach Mitternacht stattfinden, da dann der Zustand wechselt.

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