DOIF mit indirekten Zeitangaben

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

Vorheriges Thema - Nächstes Thema

flurin

#15
Zitat von: Damian am 27 Februar 2015, 21:34:36
ja, aber statt ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  ) würde ich immer

(set end_time {(OffTimeLicht())}) nehmen.

Ich reagiere allergisch, wenn ich vier Semikolons hintereinander sehe :)

Gruß

Damian

Ok, ich werde es mir merken! ;;;; gefällt mir auch nicht  :)

Damian

Zitat von: flurin am 27 Februar 2015, 21:37:36
Ok, ich werde es mir merken! das gefällt mir auch nicht  :)

ja, ist aber nur bei DOIF möglich, sonst nicht. Nicht, dass jemand woanders auf dumme Gedanken kommt :)

Gruß

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

flurin

#17
Zitat von: Damian am 27 Februar 2015, 21:46:16
ja, ist aber nur bei DOIF möglich, sonst nicht. Nicht, dass jemand woanders auf dumme Gedanken kommt :)

Gruß

Damian

Eine kleine Bemerkung: bei Deinem Einzeiler muss der Dummy immer noch definiert werden:


define end_time dummy

define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)


Edit: so geht's auch  ;)


define end_time dummy

define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {OffTimeLicht()}) DOELSE (set flex_lamp off)


Gruss
flurin

Spartacus

flurin, Damian,
ihr seit echt klasse! Ich bin leider unterwegs und kann es heute nicht mehr einbauen, aber ich bedanke mich recht herzlich für die Erläuterungen!

Danke und schönen Abend,
Christian.

P.S.
if ($timer =~ /^(\+)?((\{.*\})|(\[.*\])|([0-9][0-9](:[0-5][0-9]){1,2}))(\|[0-8]+$|-(\+)?(([0-9][0-9](:[0-5][0-9]){1,2})|({.*})|(\[.*\]))|$)(\|[0-8]+$|$)/) {
Bin echt platt! Wer um alles in der Welt, versteht so etwas! 
Hab mir schon nen Buch gekauft, aber es will ums Verrecken nicht in meine Birne! Von so einem ausgefeilten Code, bin ich Lichtjahre entfernt! Absolut cool! 8)
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

Damian

Zitat von: Spartacus am 27 Februar 2015, 22:23:57
flurin, Damian,
ihr seit echt klasse! Ich bin leider unterwegs und kann es heute nicht mehr einbauen, aber ich bedanke mich recht herzlich für die Erläuterungen!

Danke und schönen Abend,
Christian.

P.S.
if ($timer =~ /^(\+)?((\{.*\})|(\[.*\])|([0-9][0-9](:[0-5][0-9]){1,2}))(\|[0-8]+$|-(\+)?(([0-9][0-9](:[0-5][0-9]){1,2})|({.*})|(\[.*\]))|$)(\|[0-8]+$|$)/) {
Bin echt platt! Wer um alles in der Welt, versteht so etwas! 
Hab mir schon nen Buch gekauft, aber es will ums Verrecken nicht in meine Birne! Von so einem ausgefeilten Code, bin ich Lichtjahre entfernt! Absolut cool! 8)

Das ist doch nur der Check in Form eines regulären Ausdrucks, ob es sich um timer-Angaben  handelt. Den ganzen Parser-Mechanismus erkläre ich mal ein anderes mal ;)

Gruß

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

moonsorrox

#20
Zitat von: Damian am 27 Februar 2015, 21:25:13
ja, bei mir funktionieren alle 20 Module wir bisher. Dann musst du das Verhalten analysieren.

mmh, ist irgendwie nicht erkennbar, im Log steht nichts von einschalten oder auch umschalten. Ein eigenes Log habe ich nicht für die Beleuchtung.. mal schauen was heute passiert mit dem Aus schalten.
Wohnzimmer TV Licht hat auch nicht funktioniert... keine Ahnung was hier los war..!  :-\

Ich starte mal Fhem komplett neu...
So nach einigen Zeitänderungen zum probieren funktioniert das wieder :D frag mich aber nicht warum das nicht funktioniert hat  :-\ mal schauen was morgen so passiert
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 28 Februar 2015, 00:04:08
mmh, ist irgendwie nicht erkennbar, im Log steht nichts von einschalten oder auch umschalten. Ein eigenes Log habe ich nicht für die Beleuchtung.. mal schauen was heute passiert mit dem Aus schalten.
Wohnzimmer TV Licht hat auch nicht funktioniert... keine Ahnung was hier los war..!  :-\

Ich starte mal Fhem komplett neu...
So nach einigen Zeitänderungen zum probieren funktioniert das wieder :D frag mich aber nicht warum das nicht funktioniert hat  :-\ mal schauen was morgen so passiert

Wenn du vor dem shutdown kein save gemacht hast und deine DOIF-Module das Attribut initialize nicht haben, kann es schon paar Tage dauern, bis alles Zustände mit der Wirklichkeit übereinstimmen.

Gruß

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

flurin

Zitat von: Damian am 27 Februar 2015, 21:34:36
ja, aber statt ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  ) würde ich immer

(set end_time {(OffTimeLicht())}) nehmen.

Ich reagiere allergisch, wenn ich vier Semikolons hintereinander sehe :)

Gruß

Damian

Hi Damian

Zum ";;;;" Problem (Allergie) habe ich noch Folgendes zufällig in commandref unter "FHEM Befehlstypen" gefunden:

Für jede weitere Indirektion muss man die Strichpunkte verdoppeln. Um also die beiden Lampen um 7:00 für 10 Minuten einzuschalten schreibt man:
define onAt at 07:00 set Lamp1 on;;set Lamp2 on;; define offAt at +00:10 set Lamp1 off;;;;set Lamp2 off


Da das Simikolon in Perl als Trennzeichen verwendet wird, wäre es logisch dies auch in einem DOIF Perl Block verwenden zu können.
Eine Möglichkeit (getestet) wäre eine Erweiterung in ParseCommandsDoIf (line 318) einzubauen:


if ($currentBlock =~ m/(.+)\;+(.+)/) {
    $currentBlock = $1.";;;;".$2;
}


Nur ein Vorschlag ohne error handling.

Gruss
flurin


Damian

#23
Zitat von: flurin am 28 Februar 2015, 12:25:59
Hi Damian

Zum ";;;;" Problem (Allergie) habe ich noch Folgendes zufällig in commandref unter "FHEM Befehlstypen" gefunden:

Für jede weitere Indirektion muss man die Strichpunkte verdoppeln. Um also die beiden Lampen um 7:00 für 10 Minuten einzuschalten schreibt man:
define onAt at 07:00 set Lamp1 on;;set Lamp2 on;; define offAt at +00:10 set Lamp1 off;;;;set Lamp2 off


Da das Simikolon in Perl als Trennzeichen verwendet wird, wäre es logisch dies auch in einem DOIF Perl Block verwenden zu können.
Eine Möglichkeit (getestet) wäre eine Erweiterung in ParseCommandsDoIf (line 318) einzubauen:


if ($currentBlock =~ m/(.+)\;+(.+)/) {
    $currentBlock = $1.";;;;".$2;
}


Nur ein Vorschlag ohne error handling.

Gruss
flurin

Dann wäre man nicht mehr kompatibel zu IF, das man sonst irgendwo nutzen kann. In der Commandref zu IF steht:

ZitatIF in Kombination mit einem define at mit mehreren set-Befehlen (Eingabe muss wegen der Semikolons im DEF-Editor erfolgen, einfaches Semikolon ist nicht erlaubt - es würde vom FHEM-Parser "geschluckt" werden und beim IF nicht mehr ankommen):

define check at *10:00 IF ([indoor] eq "on") (define a_test at +00:10 set lampe1 on;;set lampe2 off;;set temp desired 20)

Das Editieren der cfg-Datei ist eh nicht angesagt. Im DEF-Editor kommt man immerhin mit zwei Semikolons aus.

Die Maskierungsgeschichte mit der Verdopplung der Semikolons war meiner Meinung nach keine gute Idee. Daher habe ich mich direkt vom Anfang an für Klammerhierarchie entschieden. Um kompatibel zu FHEM zu bleiben und der Verdoppelungsproblematik aus dem Wege zu gehen, habe ich das Komma als Trennzeichen gewählt.

Gruß

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

Damian

Zitat von: Damian am 28 Februar 2015, 13:31:39
Dann wäre man nicht mehr kompatibel zu IF, das man sonst irgendwo nutzen kann. In der Commandref zu IF steht:

Das Editieren der cfg-Datei ist eh nicht angesagt. Im DEF-Editor kommt man immerhin mit zwei Semikolons aus.

Die Maskierungsgeschichte mit der Verdopplung der Semikolons war meiner Meinung nach keine gute Idee. Daher habe ich mich direkt vom Anfang an für Klammerhierarchie entschieden. Um kompatibel zu FHEM zu bleiben und der Verdoppelungsproblematik aus dem Wege zu gehen, habe ich das Komma als Trennzeichen gewählt.

Gruß

Damian

Nachtrag: Ein einfaches Semikolon, eingegeben in der Kommandozeile, würde schon deswegen nicht funktionieren, weil es vom FHEM-Parser als Trennzeichen verarbeitet wird und der Rest der Zeile gar nicht mehr bei DOIF ankäme.

Gruß

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

flurin

#25
Zitat von: Damian am 28 Februar 2015, 13:31:39
Dann wäre man nicht mehr kompatibel zu IF, das man sonst irgendwo nutzen kann. In der Commandref zu IF steht:

Das Editieren der cfg-Datei ist eh nicht angesagt. Im DEF-Editor kommt man immerhin mit zwei Semikolons aus.

Die Maskierungsgeschichte mit der Verdopplung der Semikolons war meiner Meinung nach keine gute Idee. Daher habe ich mich direkt vom Anfang an für Klammerhierarchie entschieden. Um kompatibel zu FHEM zu bleiben und der Verdoppelungsproblematik aus dem Wege zu gehen, habe ich das Komma als Trennzeichen gewählt.

Gruß

Damian

Zur Präzisierung:

Meine Code-Beispiele stammen aus fhem.cfg. Ich verwende aber normalerweise den DEF-Editor.

Also der Code aus fhem.cfg

define di_end_time_set DOIF ([06:30]) ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  )

sieht in DEF-Editor so aus:

([06:30]) ( {my $OffTime = OffTimeLicht();; fhem("set end_time $OffTime") }  )

Demzufolge sieht Dein IF Beispiel:

define check at *10:00 IF ([indoor] eq "on") (define a_test at +00:10 set lampe1 on;;set lampe2 off;;set temp desired 20)

in fhem.cfg so aus:

define check at *10:00 IF ([indoor] eq "on") (define a_test at +00:10 set lampe1 on;;;;set lampe2 off;;;;set temp desired 20)

Eigentlich auch ein Grund allergisch zu werden  :) aber evtl. habe ich was übersehen oder nicht richtig verstanden.
Grundsätzlich kann ich das DOIF-Modul so verwendet wie es ist und akzeptiere alles, was Du immer entscheidest.

Gruss
flurin

moonsorrox

Zitat von: Damian am 28 Februar 2015, 08:24:41
Wenn du vor dem shutdown kein save gemacht hast und deine DOIF-Module das Attribut initialize nicht haben, kann es schon paar Tage dauern, bis alles Zustände mit der Wirklichkeit übereinstimmen.
naja, mittlerweile ist es ja schon so das man nur kurz in DEF gehen kann, nichts verändern und nur modify drückt und schon erscheint das Fragezeichen hinter save...... damit wäre es ja alles gesichert und das mache ich auch so.

Aber dein "initialize" hat mich auf die Idee gebracht mal in alle DOIF zu schauen und siehe da genau die Uhrschaltung die ich habe und heute morgen nicht funktioniert hat, war noch vom 26.02.  :-\
Also habe ich jetzt mal alle DOIF angeschaut und es sollte nun heute alle laufen.
Habe auch noch deine Version aus dem Thread hier in Benutzung ;)
Danke nochmals  :D
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 28 Februar 2015, 14:44:50
naja, mittlerweile ist es ja schon so das man nur kurz in DEF gehen kann, nichts verändern und nur modify drückt und schon erscheint das Fragezeichen hinter save...... damit wäre es ja alles gesichert und das mache ich auch so.

Aber dein "initialize" hat mich auf die Idee gebracht mal in alle DOIF zu schauen und siehe da genau die Uhrschaltung die ich habe und heute morgen nicht funktioniert hat, war noch vom 26.02.  :-\
Also habe ich jetzt mal alle DOIF angeschaut und es sollte nun heute alle laufen.
Habe auch noch deine Version aus dem Thread hier in Benutzung ;)
Danke nochmals  :D

ja, wenn irgendwas nicht so funktionieren sollte wie erhofft, dann muss man diesen konkreten Fall ganz genau analysieren und auf mögliches Fehlverhalten überprüfen und mit Belegen z. B. list ... hier posten. Alles andere wäre nur stochern im Heuhaufen und dafür haben wir alle keine Zeit.

Gruß

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

Damian

Zitat von: flurin am 28 Februar 2015, 14:39:59
Zur Präzisierung:

Meine Code-Beispiele stammen aus fhem.cfg. Ich verwende aber normalerweise den DEF-Editor.

Also der Code aus fhem.cfg

define di_end_time_set DOIF ([06:30]) ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  )

sieht in DEF-Editor so aus:

([06:30]) ( {my $OffTime = OffTimeLicht();; fhem("set end_time $OffTime") }  )

Demzufolge sieht Dein IF Beispiel:

define check at *10:00 IF ([indoor] eq "on") (define a_test at +00:10 set lampe1 on;;set lampe2 off;;set temp desired 20)

in fhem.cfg so aus:

define check at *10:00 IF ([indoor] eq "on") (define a_test at +00:10 set lampe1 on;;;;set lampe2 off;;;;set temp desired 20)

Eigentlich auch ein Grund allergisch zu werden  :) aber evtl. habe ich was übersehen oder nicht richtig verstanden.
Grundsätzlich kann ich das DOIF-Modul so verwendet wie es ist und akzeptiere alles, was Du immer entscheidest.

Gruss
flurin

Die Sache mit dem at ist einfach nicht anders machbar, weil die Semikolon-Mechanismen in FHEM stecken und nicht in meinen Modulen.

Dein Vorschlag würde also nie zum tragen kommen, da beim DOIF-Modul nie ein einzelnes Semikolon ankommen kann, weil es vorher schon vom FHEM-Parser "verschluckt" wird - da kann man im Modul programmieren, was man will - es würde nicht funktionieren.

Gruß

Damian

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

flurin

Zitat von: Damian am 28 Februar 2015, 14:58:22
Die Sache mit dem at ist einfach nicht anders machbar, weil die Semikolon-Mechanismen in FHEM stecken und nicht in meinen Modulen.

Dein Vorschlag würde also nie zum tragen kommen, da beim DOIF-Modul nie ein einzelnes Semikolon ankommen kann, weil es vorher schon vom FHEM-Parser "verschluckt" wird - da kann man im Modul programmieren, was man will - es würde nicht funktionieren.

Gruß

Damian

Nach der Erweiterung von 98_DOIF.pm - wie oben beschrieben - funktioniert dieses Beispiel (aus dem DEF-Editor) problemlos:

([15:15]) ( { myLog("A"); myLog("B") } )

also mit einem Semikolon.

Gruss
flurin