Hauptmenü

DOIF mit indirekten Zeitangaben

Begonnen von Damian, 25 Februar 2015, 19:19:38

Vorheriges Thema - Nächstes Thema

Spartacus

Bingo!
jetzt funzt es! Es gab bei mir noch ein Problem mit den Funktionsnamen. Es wurde immer Flurins zweite Funktion (die den kompletten Zeitstring liefert) vom DOIF angezogen. Deshalb bekam ich immer den Timespec Error. Ich hatte offenbar vergessen, die myUtils neu zu laden!

Jetzt kann ich mich mal an die komplette Bedingung machen....
Danke und Gruß,
Christian.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

flurin

#61
Zitat von: Damian am 02 März 2015, 18:20:33
ja, denn in der Commandref steht:

Es können beim Attribut state ebenfalls Berechnungen in geschweiften Klammern durchgeführt werden. Aus Kompatibilitätsgründen, muss die Berechnung mit einer runden Klammer beginnen.

und da ist Leerzeichen nicht erlaubt um möglichst kompatibel zum restlichen FHEM zu sein.

Gruß

Damian

OK, es ist ja so definiert und man kann immer Commandref konsultieren  :)

Wünschenswert wäre es jedoch, wenn FHEM ein wenig toleranter wäre.

Mit der Erweiterung der Funktionalität und der Anwendung von Definitionen wie ([[...]-[...]]) und ({(... )}) aber bitte ohne Sahne (Leerzeichen) , bin ich auf die Fragen hier im Forum gespannt.  :)

Gruss
flurin

Damian

Zitat von: flurin am 02 März 2015, 18:58:07
OK, es ist ja so definiert und man kann immer Commandref konsultieren  :)

Wünschenswert wäre es jedoch, wenn FHEM ein wenig toleranter wäre.

Mit der Erweiterung der Funktionalität und der Anwendung von Definitionen wie ([[...]-[...]]) und ({(... )}) aber bitte ohne Sahne (Leerzeichen) , bin ich auf die Fragen hier im Forum gespannt.  :)

Gruss
flurin

Die Toleranz ist da eingebaut, wo sie unkritisch ist. Du musst bedenken, dass die Sache an Perl übergeben wird und das kennt auch Klammern (z. B. [] bei arrays, die darf man nicht ersetzen). Im Ausführungsteil dagegen können insb. FHEM-Befehle stehen, welche auch mit eigenen Klammern arbeiten, z. B. {} bei at und da darf man auch nichts ersetzen.

Daher: Tolerant wie nötig, intolerant wie möglich, um jegliche Kompatibilität zu Perl bzw. zu FHEM zu gewährleisten ;)

Gruß

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

Damian

Zitat von: flurin am 02 März 2015, 18:58:07
Mit der Erweiterung der Funktionalität und der Anwendung von Definitionen wie ([[...]-[...]]) und ({(... )}) aber bitte ohne Sahne (Leerzeichen) , bin ich auf die Fragen hier im Forum gespannt.  :)

Wem das nicht reicht, der kann auch solche "Schweinereien" machen:

define begin_time dummy
set begin_time 10:00

define end_time dummy
set end_time 20:00


([[begin_time]-[end_time]]) (set flex_lamp on, set end_time {(OffTime("[begin_time]"))} ) DOELSE (set flex_lamp off)


Die OffTime-Funktion bekommt die Beginnzeit übergeben, die sie auswerten kann um daraus die Endzeit zu berechnet.

Gruß

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

flurin

Zitat von: Damian am 02 März 2015, 19:36:50
Wem das nicht reicht, der kann auch solche "Schweinereien" machen:

define begin_time dummy
set begin_time 10:00

define end_time dummy
set end_time 20:00


([[begin_time]-[end_time]]) (set flex_lamp on, set end_time {(OffTime("[begin_time]"))} ) DOELSE (set flex_lamp off)


Die OffTime-Funktion bekommt die Beginnzeit übergeben, die sie auswerten kann um daraus die Endzeit zu berechnet.

Gruß

Damian

Da musst Du Dich noch ein wenig anstrengen, das schockiert mich noch nicht  8)

Gruss
flurin

Damian

Zitat von: flurin am 02 März 2015, 19:52:39
Da musst Du Dich noch ein wenig anstrengen, das schockiert mich noch nicht  8)

Gruss
flurin

OK. Man kann es auch mit notifys und ats programmieren, abgesehen von den Dummys, wird man nicht mit einer Zeile auskommen ;)

Gruß

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

flurin

#66
Sowas habe ich noch getestet:


define begin_time dummy
set begin_time 16:00

define end_time dummy
set end_time 18:00

define di_time_ind DOIF ([[begin_time]-[end_time]|7]) (set flex_lamp on) DOELSE (set flex_lamp off)


das geht

wünschenswert:


define begin_time dummy
set begin_time 16:00

define end_time dummy
set end_time 18:00|7

define di_time_ind DOIF ([[begin_time]-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)


geht aber nicht

Edit: oder noch besser:


define begin_time dummy
set begin_time 16:00

define end_time dummy
set end_time 18:00

define wday dummy
set wday 7

define di_time_ind DOIF ([[begin_time]-[end_time]|[wday]]) (set flex_lamp on) DOELSE (set flex_lamp off)


Gruss
flurin

maxritti

Hallo,

jetzt wollte ich auch mal anfangen, die indirekten Zeitangaben zu nutzen.
Anfangen wollte ich mit diesem DOIF:

((([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]))
  ({if (ReadingsVal("EG_wz_RO_TerrasseRechts", "state", "---") ne "off") {fhem("set EG_wz_RO_TerrasseRechts off")}})
DOELSEIF (([{ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}|7]))
  ({if (ReadingsVal("EG_wz_RO_TerrasseRechts", "state", "---") ne "on") {fhem("set EG_wz_RO_TerrasseRechts on")}})
DOELSEIF ([du_Rollo_PV] eq "an" and [mySL:Pac_avg] >= 2100)
  (set EG_wz_RO_TerrasseRechts 0)
DOELSEIF ([du_Rollo_PV] eq "an" and [EG_wz_TK_Terrasse] eq "closed" and [mySL:Pac_avg] >= 1501)
  (set EG_wz_RO_TerrasseRechts 30)
DOELSEIF ([du_Rollo_PV] eq "aus")
  (set EG_wz_RO_TerrasseRechts on)


Da habe ich mal die ReadingsVal(..) ersetzt durch [dummy_name]:

  ((([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([[du_Rollo_Zeit_ru_start]-[du_Rollo_Zeit_ru_ende]])) or [[du_Rollo_Zeit_ru_ende]]))
    ({if (ReadingsVal("EG_wz_RO_TerrasseRechts", "state", "---") ne "off") {fhem("set EG_wz_RO_TerrasseRechts off")}})
  DOELSEIF (([[du_Rollo_Zeit_ho|8]] or [[du_Rollo_Zeit_ho_WE|7]]))
    ({if (ReadingsVal("EG_wz_RO_TerrasseRechts", "state", "---") ne "on") {fhem("set EG_wz_RO_TerrasseRechts on")}})
  DOELSEIF ([du_Rollo_PV] eq "an" and [mySL:Pac_avg] >= 2100)
    (set EG_wz_RO_TerrasseRechts 0)
  DOELSEIF ([du_Rollo_PV] eq "an" and [EG_wz_TK_Terrasse] eq "closed" and [mySL:Pac_avg] >= 1501)
    (set EG_wz_RO_TerrasseRechts 30)
  DOELSEIF ([du_Rollo_PV] eq "aus")
    (set EG_wz_RO_TerrasseRechts on)


Allerdings wird mir dies beim speichern so quitiert:

di_EG_wz_RO_TerrasseRechts DOIF: no trigger in condition: ([[du_Rollo_Zeit_ho|8]] or [[du_Rollo_Zeit_ho_WE|7]])

Ist das ggf noch nicht implementiert und könnte dies als Feature aufnehmen?
Oder habe ich da irgendwas falsche geschrieben bzw falsch verstanden?

Die Zeile

([[du_Rollo_Zeit_ho|8]] or [[du_Rollo_Zeit_ho_WE|7]])

hatte ich auch schon mal so versucht (also die |8 bzw |7 hinter die ])

([[du_Rollo_Zeit_ho]|8] or [[du_Rollo_Zeit_ho_WE]|7])

das wird aber mit der gleichlautenden Meldung beendet.

Damian

Zitat von: maxritti am 06 März 2015, 14:10:08
([[du_Rollo_Zeit_ho]|8] or [[du_Rollo_Zeit_ho_WE]|7])

das wird aber mit der gleichlautenden Meldung beendet.

Dann hast du wohl nicht die richtige Version aktiv (download erster Post hier). Bei mir funktioniert alles, wie erwartet.

Gruß

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

maxritti

Okay, recht hast Du.
Im Test hatte ich es aktualisiert, im produktiven System wohl noch nicht.

Schönes WE

Damian

Diese Version scheint stabil zu laufen. Dann werde ich sie mal langsam einchecken. Ich habe noch eingebaut, dass Zeit auf 00:00:00 belegt wird, falls ein Timer-Reading keine Zeit definiert hat, sonst gibt es Perl-Warnings im Log, wenn ein Event zuschlägt. Eine Fehlermeldung beim falschen Zeitformat ist bereits  jetzt schon im entsprechenden Timer-Reading im DOIF-Modul zu sehen.

Gruß

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

hatamoto

Tolle neue Funktion "daumenhoch"

Ist es auch möglich eine Schaltung mit Zeitangabe in der Form "später als/nicht vor" zu realisieren?
Anwendungsbeispiel ist eine Rollladensteuerung: Rollladen auf, wenn Helligkeit > x, jedoch nicht vor hh:mm.
Es wird ja jetzt wieder früher hell, ich möchte aber erst zur definierten Zeit geweckt werden.

Gruß Chris 

Damian

Zitat von: hatamoto am 08 März 2015, 21:03:57
Tolle neue Funktion "daumenhoch"

Ist es auch möglich eine Schaltung mit Zeitangabe in der Form "später als/nicht vor" zu realisieren?
Anwendungsbeispiel ist eine Rollladensteuerung: Rollladen auf, wenn Helligkeit > x, jedoch nicht vor hh:mm.
Es wird ja jetzt wieder früher hell, ich möchte aber erst zur definierten Zeit geweckt werden.

Gruß Chris

Commandref zu DOIF schon studiert?

http://fhem.de/commandref_DE.html#DOIF

Dort findest du Beispiele zu deiner Anforderung der Art:

DOIF ([Helligkeit]>50 and [[beginn_zeit]-[end_zeit]]) (set rollo hoch)

beginn_zeit und end_zeit können z. b. Dummys sein, die die Zeit beinhalten. Du kannst natürlich auch feste Zeiten vergeben.

Gruß

Damian


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

hatamoto

Ja, hatte ich natürlich gelesen.
Dachte nur, es gibt eine Variante ohne Ende-Zeit.
Werde es dann wie von Dir beschrieben einbauen.

Gruß Chris

Damian

Zitat von: hatamoto am 08 März 2015, 23:12:04
Ja, hatte ich natürlich gelesen.
Dachte nur, es gibt eine Variante ohne Ende-Zeit.
Werde es dann wie von Dir beschrieben einbauen.

Gruß Chris

Du kannst auch:

DOIF ([Helligkeit]>50 and $HMS>[beginn_zeit]) (set rollo hoch)

angeben.

Allerdings wird hier nicht um beginn_zeit getriggert und es ist eigentlich auch ein Intervall, welches um Mitternacht endet. Ich würde die erste Alternative wählen.

Gruß

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