Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Damian

#1080
Zitat von: Damian am 09 Januar 2015, 16:13:42
Bei sleep in Kombination mit DOIF wird das System für die Zeit stillgelegt. Wait zwischen den Kommandos ist noch nicht realisiert. Z. Zt. ist at die einzige sinnvolle Lösung.

Damian

Ich revidiere meine Aussage.

Man kann tatsächlich sleep in Verbindung mit DOIF ohne Blockade des System nutzen.

Dazu müssen Kommandos, die durch sleep verzögert werden sollen mit einem Semikolon (nicht mit Komma) hinter sleep angegeben werden.

Beispiele:

DOIF (...) (set lamp on, sleep 5; set lamp off)

mehre Kommandos hinter sleep:

DOIF (...) (set lamp on, sleep 5; set lamp1 off; set lamp2 on...)

mehre sleeps:

DOIF (...) (set lamp on, sleep 5; set lamp1 off; sleep 3; set lamp2 on...)

Gruß

Damian

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

maxritti

Zitat von: Brockmann am 09 Januar 2015, 17:41:17
Naja, es gibt ja einen kleinen, aber feinen Unterschied zwischen den Defintionen, die Du hier aufgelistet hast. Den kannst Du ja auch selbst leicht herausfinden. Höchstwahrscheinlich macht genau dieser Unterschied den ... hm ... Unterschied aus. Tipp: Er liegt nicht im DOIF, sondern im DOELSEIF-Zweig.

Vielleicht kann der DOELSEIF-Fall dadurch nie eintreten, dann bleibt das DOIF dauerhaft im cmd_1-Status. Ein erneutes Eintreten der DOIF-Bedingungen führt dann nicht zu einer Statusänderung des DOIFs, also passiert auch nichts. Das ist aber nur eine Vermutung, die zum geschilderten Verhalten passen würde. Zumindest aber ist das erste DOIF ja schon seit zwei Tagen im Status cmd_1, seitdem ist also anscheinend der DOELSEIF-Fall nie eingetreten. Folglich konnte es heute auch nicht auf den DOIF-Fall reagieren.

Dann wird das wohl das [OG_elt_RO_Strasse] ne "on" and in dem DOELSEIF sein.
Das hatte ich mal eingebaut um mögliche Schaltungen nach "on" obwohl der Rollo schon auf "on" steht zu vermeiden.
Hatte damals schon nicht funktioniert und ich meinte es bei allen 8 DOIFs wieder ausgebaut zu haben.
Den Fall da oben habe ich dann ganz offensichtlich vergessen.

Danke Dir für's suchen. :)

Wobei ich mir dann doch wieder die Frage stellt, wie ich doppelte Schaltungen vermeiden kann.
Mal angenommen der Rollo geht morgens wie geplant hoch. Dann macht nachmittags jemand den Rollo am Schalter direkt nach unten. Dann wird es abends dunkel und dann würde das DOIF ja triggern und einen "off" Befehl senden. Was ja eigentlich gar nicht notwendig ist.
Daher hatte ich mal ein zusätzliches [OG_elt_RO_Strasse] ne "off" and eingebaut.
Aber da blieben dann wie vorhin der ein und andere Rollo einfach oben und gingen nicht zu.

Mag aber sein, dass ich da etwas durcheinander geworfen hatte.
Ich fange den Test noch mal an.

Jens_B

Dafür gibt's im Modul das Fragezeichen. Schau mal in die commandref.

Du solltest das dann mit
[?OG_elt_RO_Strasse] ne "on

Arbeiten.

Gruß Jens


Gesendet von meinem iPhone mit Tapatalk
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

maxritti

Danke Dir für den Tip mit dem ?
Ich würde das dann einfach mal so definieren.
Also zu Beginn bei DOIF und bei DOELSEIF die Abfrage des aktuellen Status des Aktors.

([?OG_elt_RO_Strasse] ne "off" and [du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
  (set OG_elt_RO_Strasse off)
DOELSEIF ([?OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
  (set OG_elt_RO_Strasse on)


Mal schauen, ob das funktioniert wie ich das wollte.

Damian

#1084
Zitat von: maxritti am 09 Januar 2015, 19:12:19
Danke Dir für den Tip mit dem ?
Ich würde das dann einfach mal so definieren.
Also zu Beginn bei DOIF und bei DOELSEIF die Abfrage des aktuellen Status des Aktors.

([?OG_elt_RO_Strasse] ne "off" and [du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
  (set OG_elt_RO_Strasse off)
DOELSEIF ([?OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
  (set OG_elt_RO_Strasse on)


Mal schauen, ob das funktioniert wie ich das wollte.

Zeitabfragen mit $we lassen sich eleganter statt [{timer}] and $we mit  [{timer}|7] angeben.

Gruß

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

maxritti

#1085
Zitat von: Damian am 09 Januar 2015, 19:25:12
Zeitabfragen mit $we lassen sich eleganter mit statt mit [{timer}] and $we mit  [{timer}|7] angeben.

Gruß

Damian

Aber damit decke ich doch keine Holiday Informationen ab?
Denn $we liefert ja auch 1 zurück, wenn ein Mittwoch ist, dieser aber in einer Holiday Datei hinterlegt ist.

Wobei, da biete Dein DOIF doch bestimmt auch eine coole Lösung oder?  :)


EDIT:

Okay. Commandref lesen und freuen. :)

Damian

#1086
Zitat von: maxritti am 09 Januar 2015, 19:32:20
Aber damit decke ich doch keine Holiday Informationen ab?


Natürlich. Es ist identisch das Gleiche, wie die and-Abfrage mit $we, denn es wird intern $we nachgebaut.

Ansonsten nach holiday2we suchen.

Gruß

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

bretterknaller

Hallo zusammen

Ich habe jetzt schon viel gelesen aber noch keine richtige Lösung für mein vorhaben gefunden.

Es soll wenn es dunkel ist ab 18 Uhr bis 04 Uhr meine Lichterkette angeschaltet werden ab nur wenn mein Kabel Box an ist.
Zurzeit habe ich es so.

define Lichterkette DOIF ([?18:00-04:00] and [QUAD] eq "on" ) (set Steckdose_B on) DOELSEIF ([QUAD] eq "off") (set Steckdose_B off)
attr Lichterkette do always


Was auch sehr gut funktioniert. :D
Da es aber bald Sommer wird ist es ja um 19 noch nicht dunkel.

{sunset(0,"17:00","21:00")}
Wenn ich es mit sunset mache habe ich ja auch eine feste Schaltzeit z.b 19:34

Gibt es da noch eine gute Lösung für mein Problem.


mfg. Bretterknaller

Damian

Zitat von: bretterknaller am 09 Januar 2015, 20:02:55

{sunset(0,"17:00","21:00")}
Wenn ich es mit sunset mache habe ich ja auch eine feste Schaltzeit z.b 19:34

Die Zeit ist nicht fest, sondern variiert jeden Tag. Das funktioniert bei DOIF auch mit Fragezeichen :) Probier mal aus. Bei dir dann:


define Lichterkette DOIF ([?{sunset(0,"17:00","21:00")}-04:00] and [QUAD] eq "on" ) (set Steckdose_B on) DOELSEIF ([QUAD] eq "off") (set Steckdose_B off)

Gruß

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

Sidey

Hallo,

habe mein Problemchen selbst gelöst:

Zitat von: Sidey am 07 Januar 2015, 09:47:10
..
Jetzt passiert folgendes. Wenn die Erste Bedingung wahr ist, wird mein dummy auf in gesetzt.
Danach scheint das Doif erneut getriggert zu werden und die 2. Bedingung ist wahr.


([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "off" && [wk.Waschmaschine_Betrieb] eq "off") (set wk.WaschmaschineWartemodus on,set wk.PwrSw_Switch off)   

DOELSEIF ([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.WaschmaschineWartemodus off,set wk.Waschmaschine_Betrieb on)   



Festellung:
Das Kommando "set wk.WaschmaschineWartemodus on" habe ich vor "set wk.PwrSw_Switch off" ausgeführt.
Das führt dazu und das finde ich komisch, wird die 2. Bedingung Wahr und auch ausgeführt.
Laut Logile kann ich das zwar nicht nachweisen, aber drehe ich die Befehle um, also 1. "set wk.PwrSw_Switch off", dann kann ich im logfile nachvollziehen, dass erst der Schalter auf OFF geht und danach mein Dummy auf on.

Resultat: Es wird keine weitere Bedingung getriggert, da nicht zutreffend.

Solltet ihr also, so wie ich in DOELSEIF Abfragen auf Readings oder Stati prüfen, welche ihr in der Bedingung zuvor verändert, achtet auf die Reihenfolge euer Befehle.


Grüße Sidey
Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Damian

#1090
Du hast in deinem ersten DOIF-Fall eine Rekursion drin: Schalten eines Devices, welches die Bedingung triggert ist ungünstig. Siehe Lösungsvorschlag mit Fragezeichen zur Rekursion  in der Commandref von DOIF.

Gruß

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

bretterknaller

Zitat von: Damian am 09 Januar 2015, 20:22:04
Die Zeit ist nicht fest, sondern variiert jeden Tag. Das funktioniert bei DOIF auch mit Fragezeichen :) Probier mal aus. Bei dir dann:


define Lichterkette DOIF ([?{sunset(0,"17:00","21:00")}-04:00] and [QUAD] eq "on" ) (set Steckdose_B on) DOELSEIF ([QUAD] eq "off") (set Steckdose_B off)

Gruß

Damian

Danke!

So hat es geklappt.  :)

blueberry63

Hallo,

ich möchte eine Funktion mit DOIF bauen, die mir einen Klingelton auf meinem Fritzfon abspielt, wenn das Badfenster in der kalten Jahreszeit zu lange auf ist. Hier ist meine Definition:


define di_BadU DOIF ([FensterBadU] eq "open") (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU do resetwait
attr di_BadU repeatsame 3
attr di_BadU room BadU
attr di_BadU wait 420


Nach meinem Verständnis sollte die Aktion nach 7 Min. und danach noch 2x ausgeführt werden, falls das Fenster zwischenzeitlich nicht geschlossen wurde. ES FUNKTIONIERT ABER NUR EINMAL :-(

Was mache ich falsch?

Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

Damian

Zitat von: blueberry63 am 10 Januar 2015, 15:55:00
Hallo,

ich möchte eine Funktion mit DOIF bauen, die mir einen Klingelton auf meinem Fritzfon abspielt, wenn das Badfenster in der kalten Jahreszeit zu lange auf ist. Hier ist meine Definition:


define di_BadU DOIF ([FensterBadU] eq "open") (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU do resetwait
attr di_BadU repeatsame 3
attr di_BadU room BadU
attr di_BadU wait 420


Nach meinem Verständnis sollte die Aktion nach 7 Min. und danach noch 2x ausgeführt werden, falls das Fenster zwischenzeitlich nicht geschlossen wurde. ES FUNKTIONIERT ABER NUR EINMAL :-(

Was mache ich falsch?

Gruß
Blueberry63

wozu das do resetwait?

Für eine Wiederholung müsste FensterBadU immer wieder "open" senden, das tut er wahrscheinlich nicht. repeatsame macht nur Sinn bei zyklich sendenden Sensoren.

Deine Lösung sieht dann eher so aus:

define di_BadU DOIF ([FensterBadU] eq "open")
  (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!",sleep 420;set WLANAP2 ring 610 20 Alert show:Fenster zumachen!";sleep 420;set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU wait 420


Allerdings werden die folgenden Klingeltöne immer ausgeführt, auch wenn das Fenster zwischendurch geschlossen wird.

Alternativ dazu kannst du jeweils ein DOIF mit einem Klingelton definieren.


define di_BadU1 DOIF ([FensterBadU] eq "open")
  (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU1 wait 420

define di_BadU2 DOIF ([FensterBadU] eq "open")
  (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU2 wait 840

define di_BadU3 DOIF ([FensterBadU] eq "open")
  (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU3 wait 1260


Bei dieser Lösung kommt kein Klingelton, sobald das Fenster wieder geschlossen wird.

Gruß

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

blueberry63

Hallo Damian,

die Lösung mit den 3 DOIFs werde ich ausprobieren. Ursprünglich hatte ich es mit einem Watchdog probiert, aber das funktionierte nicht.

Danke
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower