Liebe DOIF-Nutzer,
da offensichtlich Readings als Zeitangaben oft benutzt werden, bastle ich gerade an einer neuen Version von DOIF.
Bei dieser Version kann man Readings, Stati oder Internals als Zeitangaben direkt in der Bedingung angeben.
Beispiel:
define Zeit dummy
set Zeit 16:00
DOIF ([[Zeit]]) (set lampe on)
ebenso geht auch, wenn im Dummy beginnzeit und endzeit die entsprechende Zeit steht:
DOIF ([[beginnzeit]-[endezeit]]) (set lampe on)
Genauso lassen sich auch Readings oder Internals in der gewohnten Weise angeben.
Das Besondere an dieser Syntax im Gegensatz zu Angaben der Art [{ReadingsVal... ist, dass eine Änderung der Zeit im Status oder Reading sofort zu einer Anpassung der Zeit im Modul führt.
Die ersten Tests sind vielversprechend :)
Gruß
Damian
Nachtrag: aktuelle Version ist bereits über Update verfügbar
Juchu. Das spart ne Menge Code und macht es sauberer.
Daumen hoch dafür.
Ich hoffe, dass aus dem "vielversprechend" bald das "erfolgreich implementiert" kommt. :)
Schon mal schönen Dank für das neue Feature.
Angehängt ist eine Vorabversion zum Testen. Ich musste die interne Mimik zum Setzen der Timer ändern. Sie werden jetzt erst gesetzt, wenn das System hochgefahren ist. Damit wird sichergestellt, das alle Readings oder Stati gesetzt sind.
Auszug aus der Doku:
Schalten mit indirekten Zeitangaben
Statt fester Zeitangaben können auch Stati, Readings oder Internals angegeben werden. Diese müssen eine Zeitangabe im Format HH:MM oder HH:MM:SS beinhalten.
Anwendungsbeispiel
define time dummy
set time 08:00
define di_time DOIF ([[time]])(set lamp on)
oder Angaben mit Zeitintervallen
define begin dummy
set begin 08:00
define end dummy
set end 10:00
define di_time DOIF ([[begin]-[end]])(set radio on) DOELSE (set radio off)
Bei einer Änderung des angegebenen Status oder Readings wird die geänderte Zeit sofort im Modul aktualisiert.
Gruß
Damian
Hi Damian
Vielen Dank für das neue Feature!
Folgendes habe ich getestet:
define di_time_var DOIF ([[start_time]]) (set flex_lamp on)
define di_time_var DOIF ([[start_time]-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
define di_time_var DOIF ([[start_time]-11:12]) (set flex_lamp on) DOELSE (set flex_lamp off)
alles OK
jedoch
define di_time_var DOIF ([10:44-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
geht nicht.
Gruss
flurin
Zitat von: flurin am 27 Februar 2015, 10:50:15
define di_time_var DOIF ([10:44-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
geht nicht.
Gruss
flurin
habe es gefixt.
Wie konnte ich nur fehlende Klammern in diesem Ausdruck übersehen :)
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]+$|$)/) {
neuer Version im Anhang
Gruß
Damian
Zitat von: Damian am 27 Februar 2015, 14:15:22
habe es gefixt.
neuer Version im Anhang
Wow!, das ging aber schnell :)
Test bei mir: passed
Da wird sich Spartacus auch darüber freuen; damit sollte er sein Problem lösen können.
Gruss
flurin
Zitat von: Damian am 27 Februar 2015, 14:15:22
Wie konnte ich nur fehlende Klammern in diesem Ausdruck übersehen :)
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]+$|$)/) {
;) :D ;)
ich habe auch schon ein wenig mal getestet, funktioniert Super ;D
Hallo Damin, hallo flurin.
das ist wirklich eine tolle Sache! Ganz lieben Dank für die Anpassungen und Tests.
Aber die Anwendung habe ich noch nicht durchschaut! :(
Meine SUB "OffTimeLicht" bzw. "OffTimeLichtX" liefert mir die Ausschaltzeit als "22:00" bzw. "16:30-22:00" zurück!
Das hier gibg schon forher, mit dem berichteten Triggerproblem:
([19:55-{OffTimeLichtX}]) (set Lampe on)
DOELSE
(set Lampe off)
...und hier gibt es einen Fehler:
([19:55-[{OffTimeLichtX}]]) (set Lampe on)
DOELSE
(set Lampe off)
liefert mir einen Fehler!
Wie muss ich das korrekt anwenden?
Muss ich die OffTime vorher erst in ein Dummy kopieren?
Sorry, ich brauche immer etwas länger...
Gruß,
Christian
Hier noch mal der Code von flurin
sub OffTimeLichtX ()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if (ReadingsVal("hl.01.Feiertag","today","") =~ m/Silvester/)
{
return ("02:30:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && ($wday =~ m/[01234]/))
{
return ("22:00:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","") !~ m/none/) || ($wday =~ m/[56]/))
{
return ("23:00:00")
}
}
sub OffTimeLicht ($)
{
my ($start_time) = @_;
my $ret;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if (ReadingsVal("hl.01.Feiertag","today","") =~ m/Silvester/)
{
$ret = "02:30";
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && ($wday =~ m/[01234]/))
{
$ret = "22:00";
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","") !~ m/none/) || ($wday =~ m/[56]/))
{
$ret = "23:00";
}
if ($start_time ne "") {
$ret = $start_time." - ".$ret;
}
return $ret;
}
Zitat von: Spartacus am 27 Februar 2015, 20:07:02
Muss ich die OffTime vorher erst in ein Dummy kopieren?
Ja, ich würde es so lösen:
define end_time dummy
define di_end_time_set DOIF ([06:30]) ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") } )
attr di_end_time_set do always
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
attr di_time_var do always
Edit: Diese Variante nicht verwenden -> siehe weiter unten.
OffTimeLicht mit dem Returnwert "16:30-22:00" kannst Du arkivieren. Das wird evtl. später noch implementiert; wir waren unserer Zeit voraus :)
Gruss
flurin
ähm, ne Frage arbeiten die anderen DOIFs mit dem neuen Modul noch..?
Meine ganzen anderen Beleuchtungen sind aus und bei meiner Außenbeleuchtung hat die Umschaltung nicht gearbeitet um kurz vor 21uhr
Zitat von: flurin am 27 Februar 2015, 21:06:05
Ja, ich würde es so lösen:
define end_time dummy
define di_end_time_set DOIF ([06:30]) ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") } )
attr di_end_time_set do always
define di_time_var DOIF ([06:30]-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
attr di_time_var do always
OffTimeLichtX kannst Du arkivieren. Das wird evtl. später noch implementiert; wir waren unserer Zeit voraus :)
Gruss
flurin
oder als Einzeiler in einem DOIF-Modul: ;)
define di_time_var DOIF ([06:30]-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)
Gruß
Damian
Zitat von: moonsorrox am 27 Februar 2015, 21:15:16
ähm, ne Frage arbeiten die anderen DOIFs mit dem neuen Modul noch..?
Meine ganzen anderen Beleuchtungen sind aus und bei meiner Außenbeleuchtung hat die Umschaltung nicht gearbeitet um kurz vor 21uhr
ja, bei mir funktionieren alle 20 Module wir bisher. Dann musst du das Verhalten analysieren.
Gruß
Damian
Zitat von: Damian am 27 Februar 2015, 21:22:28
oder als Einzeiler in einem DOIF-Modul: ;)
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)
Gruß
Damian
Ja, ich habe bei mir auch eine ähnliche Version mit einem DOIF ausprobiert. Ich wollte nur die einzelnen Schritte mit Bezug auf Deine Doku darlegen.
Gruss
flurin
Zitat von: flurin am 27 Februar 2015, 21:30:34
Ja, ich habe bei mir auch eine ähnliche Version mit einem DOIF ausprobiert. Ich wollte nur die einzelnen Schritte mit Bezug auf Deine Doku darlegen.
Gruss
flurin
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
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 :)
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
Zitat von: flurin am 28 Februar 2015, 15:15:38
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
ja, aber nicht in der Kommandozeile. Und weil bis heute die wenigsten wissen wie viel Semikolons man wo setzen muss, belassen wir es einfach beim Komma - da muss man immer nur eins nehmen, egal ob in der Kommandozeile, cfg-Datei oder DEF-Editor ;)
Gruß
Damian
Zitat von: Damian am 28 Februar 2015, 16:49:04
ja, aber nicht in der Kommandozeile. Und weil bis heute die wenigsten wissen wie viel Semikolons man wo setzen muss, belassen wir es einfach beim Komma - da muss man immer nur eins nehmen, egal ob in der Kommandozeile, cfg-Datei oder DEF-Editor ;)
Gruß
Damian
OK, Danke für Deine Antwort. Wie gesagt, ich kann damit leben.
Grundsätzlich sobald mehr als ein statement in einem DOIF-Perl-Block vorkommt, werde ich es auslagern (-> 99_myUtils.pm), dann bin ich wieder happy. ;)
Gruss
flurin
Zitat von: flurin am 28 Februar 2015, 17:26:09
OK, Danke für Deine Antwort. Wie gesagt, ich kann damit leben.
Grundsätzlich sobald mehr als ein statement in einem DOIF-Perl-Block vorkommt, werde ich es auslagern (-> 99_myUtils.pm), dann bin ich wieder happy. ;)
Gruss
flurin
ja, wenn man in perl programmiert ist das die beste Methode.
Abgesehen davon würde deine Änderung jegliche Hierarchie zunichte machen. Ein DOIF()({fhem(" define test at 10:00 set bla1 on;set bla2 off")}) ob mit einem, zwei oder drei usw. Semikolon dürfe hier nicht mehr funktionieren (auch im DEF-Editor). Ist aber jetzt philosophisch, da Kommandozeile eh nicht funktioniert.
Die Sache ist wesentlich komplizierter als es den Anschein hat. Ich habe mir bereits bei der Programmierung des IF-Befehls die Zähne an den Semikolons ausgebissen :)
Gruß
Damian
Zitat von: Damian am 28 Februar 2015, 17:35:30
ja, wenn man in perl programmiert ist das die beste Methode.
Abgesehen davon würde deine Änderung jegliche Hierarchie zunichte machen. Ein DOIF()({fhem(" define test at 10:00 set bla1 on;set bla2 off")}) ob mit einem, zwei oder drei usw. Semikolon dürfe hier nicht mehr funktionieren (auch im DEF-Editor). Ist aber jetzt philosophisch, da Kommandozeile eh nicht funktioniert.
Die Sache ist wesentlich komplizierter als es den Anschein hat. Ich habe mir bereits bei der Programmierung des IF-Befehls die Zähne an den Semikolons ausgebissen :)
Gruß
Damian
Das kann ich nicht so stehen lassen :)
DOIF()({fhem(" define test at 10:00 set bla1 on;set bla2 off")})
Das ist doch kein perl-Code sondern ein fhem-Code und hier gehört auch ein Komma her.
Mein Vorschlag bezog sich nur auf ein perl-Code in einem perl-Block {statement; statement;..}
Gruss
flurin
Zitat von: flurin am 28 Februar 2015, 17:46:28
Das kann ich nicht so stehen lassen :)
DOIF()({fhem(" define test at 10:00 set bla1 on;set bla2 off")})
Das ist doch kein perl-Code sondern ein fhem-Code und hier gehört auch ein Komma her.
Mein Vorschlag bezog sich nur auf ein perl-Code in einem perl-Block {statement; statement;..}
Gruss
flurin
natürlich ist das perl-code.
{fhem ... ist immer perl-code, da fhem eine perl-Funktion ist und kein FHEM-Befehl. Alles was in Anführungszeichen steht ist ein Übergabeparameter der perl-Funktion fhem (hier zufällig FHEM-Code)
Gruß
Damian
Zitat von: Damian am 28 Februar 2015, 17:53:41
natürlich ist das perl-code.
{fhem ... ist immer perl-code, da fhem eine perl-Funktion ist und kein FHEM-Befehl. Alles was in Anführungszeichen steht ist ein Übergabeparameter der perl-Funktion fhem (hier zufällig FHEM-Code)
Gruß
Damian
Ja, ich meinte der Übergabeparameter ist kein perl-code. Hier hast Du auch das Komma mit einem Semikolon ersetzt, was ich nie vorgeschlagen habe.
Ich muss leider weg, wünsche Dir einen schönen Abend.
Gruss
flurin
Zitat von: Damian am 28 Februar 2015, 17:53:41
natürlich ist das perl-code.
{fhem ... ist immer perl-code, da fhem eine perl-Funktion ist und kein FHEM-Befehl. Alles was in Anführungszeichen steht ist ein Übergabeparameter der perl-Funktion fhem (hier zufällig FHEM-Code)
Gruß
Damian
Nachtrag: Deine Änderung würde genau in diesem Fall (aus Sicht von DOIF: Perl-Block) die Semikolons verändern. Komma würde hier gar nicht funktionieren, da DOIF das Perl-Kommando weitergibt und sich gar nicht mehr drum kümmert.
Gruß
Damian
ich möchte ja den Thread hier nicht zu müllen, aber bei mir gibt es echt Probleme...!
Habe heute Mittag extra darauf geachtet, das alle meine DOIFs "initialized" sind.
Jetzt komme ich nachhause und selbst an den Rollladen DOIF wo ich nichts geändert habe ging wohl nichts. Nun weiß ich erst mal gar nicht auf was ich achten muss und was ich zuerst schauen soll.
Es gingen die Rollläden nicht runter, das Licht am Weg nicht an und im WZ die TV Beleuchtung nicht an. Dann kommt etwas später noch die Schlafzimmer Decken Uhr wird wohl auch nicht gehen, mal schauen :-\
Hier mal das List von der Wegbeleuchtung, evtl. kann man was sehen:
Internals:
CFGFN ./FHEM/Automation.cfg
DEF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|0123456]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([ZeitsteuerungWeg] eq "Dämmerung" and ([00:15|12345] or [01:15|06]))
(set WegLampe_Sw_02 off)
DOELSEIF([ZeitsteuerungWeg] =~ "Aus|Dämmerung")(attr ZufallsTimerWeglicht disable 1)
DOELSEIF([ZeitsteuerungWeg] eq "Zufall")(attr ZufallsTimerWeglicht disable 0)
NAME di_WegBeleuchtung
NR 295
NTFY_ORDER 50-di_WegBeleuchtung
STATE initialized
TYPE DOIF
Readings:
2015-02-28 14:38:55 state initialized
2015-02-28 16:02:50 timer_1_c1 28.02.2015 18:51:29|12345
2015-02-28 16:02:50 timer_2_c1 28.02.2015 18:44:49|06
2015-02-28 16:02:50 timer_3_c2 28.02.2015 21:01:29|0123456
2015-02-28 16:02:50 timer_4_c3 01.03.2015 00:15:00|12345
2015-02-28 16:02:50 timer_5_c3 01.03.2015 01:15:00|06
Condition:
0 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06"))
1 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{2},$wday,"0123456"))
2 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{3},$wday,"12345") or DOIF_time_once($hash->{timer}{4},$wday,"06"))
3 InternalDoIf('ZeitsteuerungWeg','STATE','') =~ "Aus|Dämmerung"
4 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Zufall"
Days:
0 12345
1 06
2 0123456
3 12345
4 06
Devices:
0 ZeitsteuerungWeg
1 ZeitsteuerungWeg
2 ZeitsteuerungWeg
3 ZeitsteuerungWeg
4 ZeitsteuerungWeg
all ZeitsteuerungWeg
Do:
0 set WegLampe_Sw_01 on
1 set WegLampe_Sw_01 off,set WegLampe_Sw_02 on
2 set WegLampe_Sw_02 off
3 attr ZufallsTimerWeglicht disable 1
4 attr ZufallsTimerWeglicht disable 0
Helper:
last_timer 5
sleeptimer -1
Internals:
0 ZeitsteuerungWeg:STATE
1 ZeitsteuerungWeg:STATE
2 ZeitsteuerungWeg:STATE
3 ZeitsteuerungWeg:STATE
4 ZeitsteuerungWeg:STATE
all ZeitsteuerungWeg:STATE
Itimer:
State:
Time:
0 {sunset("CIVIL",1200,"17:00","22:20")}
1 {sunset("CIVIL",800,"17:00","22:20")}
2 {sunset("CIVIL",9000,"19:00","22:20")}
3 00:15:00
4 01:15:00
Timecond:
0 0
1 0
2 1
3 2
4 2
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1
1 2
2 3 4
Attributes:
und hier die Rollläden:
Internals:
CFGFN ./FHEM/Automation.cfg
DEF ([RolloWZmodus] eq "FHEM"
and ([{ReadingsVal("du_RolloZeit_hoch", "state", "08:15:00")}|12345]
or [{ReadingsVal("du_RolloZeit_hoch_WoE", "state", "08:45:00")}|06])) (set RollladenWZ on)
DOELSEIF ([RolloWZmodus] =~ "FHEM|Beschattung"
and [WZ_TerrasseTuer:state] eq "closed"
and ([{sunset("CIVIL",-600,"16:35","22:10")}|0123456])) (set RollladenWZ off)
NAME di_rollladenWZ_TK_LichtTerrasse
NR 155
NTFY_ORDER 50-di_rollladenWZ_TK_LichtTerrasse
STATE initialized
TYPE DOIF
Readings:
2015-02-28 16:07:06 e_RolloWZmodus_STATE FHEM
2015-02-28 17:03:31 state initialized
2015-02-28 16:02:50 timer_1_c1 01.03.2015 08:15:00|12345
2015-02-28 16:02:50 timer_2_c1 01.03.2015 08:40:00|06
2015-02-28 16:02:50 timer_3_c2 28.02.2015 18:21:29|0123456
Condition:
0 InternalDoIf('RolloWZmodus','STATE','') eq "FHEM" and (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06"))
1 InternalDoIf('RolloWZmodus','STATE','') =~ "FHEM|Beschattung" and ReadingValDoIf('WZ_TerrasseTuer','state','') eq "closed" and (DOIF_time_once($hash->{timer}{2},$wday,"0123456"))
Days:
0 12345
1 06
2 0123456
Devices:
0 RolloWZmodus
1 RolloWZmodus WZ_TerrasseTuer
all RolloWZmodus WZ_TerrasseTuer
Do:
0 set RollladenWZ on
1 set RollladenWZ off
Helper:
last_timer 3
sleeptimer -1
Internals:
0 RolloWZmodus:STATE
1 RolloWZmodus:STATE
all RolloWZmodus:STATE
Itimer:
Readings:
1 WZ_TerrasseTuer:state
all WZ_TerrasseTuer:state
State:
Time:
0 {ReadingsVal("du_RolloZeit_hoch", "state", "08:15:00")}
1 {ReadingsVal("du_RolloZeit_hoch_WoE", "state", "08:45:00")}
2 {sunset("CIVIL",-600,"16:35","22:10")}
Timecond:
0 0
1 0
2 1
Timer:
0 0
1 0
2 0
Timerfunc:
Timers:
0 0 1
1 2
Attributes:
disable 0
group Rollläden EG
room Automation
sortby 22
ich habe gerade nochmal ins Log geschaut und finde diese Fehler, sagt mir jetzt nichts... weil ich nutze diese "begin" und "end" aus dem Beispiel noch nicht des Threads nicht
Zitat2015.02.28 18:09:17 1: PERL WARNING: Use of uninitialized value $begin in string ge at ./FHEM/98_DOIF.pm line 454.
2015.02.28 18:09:17 1: PERL WARNING: Use of uninitialized value $begin in string gt at ./FHEM/98_DOIF.pm line 449.
2015.02.28 18:09:17 1: PERL WARNING: Use of uninitialized value $end in string gt at ./FHEM/98_DOIF.pm line 449.
Zitat von: Damian am 28 Februar 2015, 18:09:03
Nachtrag: Deine Änderung würde genau in diesem Fall (aus Sicht von DOIF: Perl-Block) die Semikolons verändern. Komma würde hier gar nicht funktionieren, da DOIF das Perl-Kommando weitergibt und sich gar nicht mehr drum kümmert.
Gruß
Damian
Hi Damian
Du hast Recht mit dem Semikolon. Ich habe es innerhalb von DOIF so noch nie angewendet, darum mit der Kommaregel verwechselt.
Eigentlich wäre folgende Erweiterung im Gegensatz zu meinem oberen Vorschlag noch besser:
$currentBlock =~ s/;/;;/g;
Das ist auch das, was der DEF-Editor beim Abspeichern macht. Aber vermutlich habe ich nicht alle Fälle berücksichtigt.
Schlussendlich lohnt es sich nicht, den Aufwand zu betreiben.
Gruss
flurin
Zitat von: moonsorrox am 28 Februar 2015, 22:18:25
ich möchte ja den Thread hier nicht zu müllen, aber bei mir gibt es echt Probleme...!
Habe heute Mittag extra darauf geachtet, das alle meine DOIFs "initialized" sind.
Jetzt komme ich nachhause und selbst an den Rollladen DOIF wo ich nichts geändert habe ging wohl nichts. Nun weiß ich erst mal gar nicht auf was ich achten muss und was ich zuerst schauen soll.
Es gingen die Rollläden nicht runter, das Licht am Weg nicht an und im WZ die TV Beleuchtung nicht an. Dann kommt etwas später noch die Schlafzimmer Decken Uhr wird wohl auch nicht gehen, mal schauen :-\
Hier mal das List von der Wegbeleuchtung, evtl. kann man was sehen:
Internals:
CFGFN ./FHEM/Automation.cfg
DEF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|0123456]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([ZeitsteuerungWeg] eq "Dämmerung" and ([00:15|12345] or [01:15|06]))
(set WegLampe_Sw_02 off)
DOELSEIF([ZeitsteuerungWeg] =~ "Aus|Dämmerung")(attr ZufallsTimerWeglicht disable 1)
DOELSEIF([ZeitsteuerungWeg] eq "Zufall")(attr ZufallsTimerWeglicht disable 0)
NAME di_WegBeleuchtung
NR 295
NTFY_ORDER 50-di_WegBeleuchtung
STATE initialized
TYPE DOIF
Readings:
2015-02-28 14:38:55 state initialized
2015-02-28 16:02:50 timer_1_c1 28.02.2015 18:51:29|12345
2015-02-28 16:02:50 timer_2_c1 28.02.2015 18:44:49|06
2015-02-28 16:02:50 timer_3_c2 28.02.2015 21:01:29|0123456
2015-02-28 16:02:50 timer_4_c3 01.03.2015 00:15:00|12345
2015-02-28 16:02:50 timer_5_c3 01.03.2015 01:15:00|06
Condition:
0 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06"))
1 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{2},$wday,"0123456"))
2 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{3},$wday,"12345") or DOIF_time_once($hash->{timer}{4},$wday,"06"))
3 InternalDoIf('ZeitsteuerungWeg','STATE','') =~ "Aus|Dämmerung"
4 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Zufall"
Days:
0 12345
1 06
2 0123456
3 12345
4 06
Devices:
0 ZeitsteuerungWeg
1 ZeitsteuerungWeg
2 ZeitsteuerungWeg
3 ZeitsteuerungWeg
4 ZeitsteuerungWeg
all ZeitsteuerungWeg
Do:
0 set WegLampe_Sw_01 on
1 set WegLampe_Sw_01 off,set WegLampe_Sw_02 on
2 set WegLampe_Sw_02 off
3 attr ZufallsTimerWeglicht disable 1
4 attr ZufallsTimerWeglicht disable 0
Helper:
last_timer 5
sleeptimer -1
Internals:
0 ZeitsteuerungWeg:STATE
1 ZeitsteuerungWeg:STATE
2 ZeitsteuerungWeg:STATE
3 ZeitsteuerungWeg:STATE
4 ZeitsteuerungWeg:STATE
all ZeitsteuerungWeg:STATE
Itimer:
State:
Time:
0 {sunset("CIVIL",1200,"17:00","22:20")}
1 {sunset("CIVIL",800,"17:00","22:20")}
2 {sunset("CIVIL",9000,"19:00","22:20")}
3 00:15:00
4 01:15:00
Timecond:
0 0
1 0
2 1
3 2
4 2
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1
1 2
2 3 4
Attributes:
und hier die Rollläden:
Internals:
CFGFN ./FHEM/Automation.cfg
DEF ([RolloWZmodus] eq "FHEM"
and ([{ReadingsVal("du_RolloZeit_hoch", "state", "08:15:00")}|12345]
or [{ReadingsVal("du_RolloZeit_hoch_WoE", "state", "08:45:00")}|06])) (set RollladenWZ on)
DOELSEIF ([RolloWZmodus] =~ "FHEM|Beschattung"
and [WZ_TerrasseTuer:state] eq "closed"
and ([{sunset("CIVIL",-600,"16:35","22:10")}|0123456])) (set RollladenWZ off)
NAME di_rollladenWZ_TK_LichtTerrasse
NR 155
NTFY_ORDER 50-di_rollladenWZ_TK_LichtTerrasse
STATE initialized
TYPE DOIF
Readings:
2015-02-28 16:07:06 e_RolloWZmodus_STATE FHEM
2015-02-28 17:03:31 state initialized
2015-02-28 16:02:50 timer_1_c1 01.03.2015 08:15:00|12345
2015-02-28 16:02:50 timer_2_c1 01.03.2015 08:40:00|06
2015-02-28 16:02:50 timer_3_c2 28.02.2015 18:21:29|0123456
Condition:
0 InternalDoIf('RolloWZmodus','STATE','') eq "FHEM" and (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06"))
1 InternalDoIf('RolloWZmodus','STATE','') =~ "FHEM|Beschattung" and ReadingValDoIf('WZ_TerrasseTuer','state','') eq "closed" and (DOIF_time_once($hash->{timer}{2},$wday,"0123456"))
Days:
0 12345
1 06
2 0123456
Devices:
0 RolloWZmodus
1 RolloWZmodus WZ_TerrasseTuer
all RolloWZmodus WZ_TerrasseTuer
Do:
0 set RollladenWZ on
1 set RollladenWZ off
Helper:
last_timer 3
sleeptimer -1
Internals:
0 RolloWZmodus:STATE
1 RolloWZmodus:STATE
all RolloWZmodus:STATE
Itimer:
Readings:
1 WZ_TerrasseTuer:state
all WZ_TerrasseTuer:state
State:
Time:
0 {ReadingsVal("du_RolloZeit_hoch", "state", "08:15:00")}
1 {ReadingsVal("du_RolloZeit_hoch_WoE", "state", "08:45:00")}
2 {sunset("CIVIL",-600,"16:35","22:10")}
Timecond:
0 0
1 0
2 1
Timer:
0 0
1 0
2 0
Timerfunc:
Timers:
0 0 1
1 2
Attributes:
disable 0
group Rollläden EG
room Automation
sortby 22
ich habe gerade nochmal ins Log geschaut und finde diese Fehler, sagt mir jetzt nichts... weil ich nutze diese "begin" und "end" aus dem Beispiel noch nicht des Threads nicht
Das sind leider keine Belege für ein Fehlverhalten, wenn du ein Modul um 16:02 definierst und alle Timer erst später zuschlagen sollen, dann kann man nichts dazu sagen. Du musst mir einen Fall zeigen, wo ein Timer zugeschlagen haben sollte und der Status nicht verändert wurde.
Die Warnings kommen von einem Modul, bei dem du indirekte Zeiten benutzt, bei denen der Status oder Reading nicht mit einer korrekten Zeit belegt sind, das werde ich noch abfangen.
Nachtrag: Von wann sind die Auszüge? Welchen Zustand hatte zu diesem Zeitpunkt [ZeitsteuerungWeg]?
Gruß
Damian
Zitat von: flurin am 01 März 2015, 06:06:12
Aber vermutlich habe ich nicht alle Fälle berücksichtigt.
Vermutlich, da man nicht weiß, was die Leute alles definiert haben. Abgesehen davon würden bei ca. 5000 definierten DOIF-Module unzählige nicht mehr funktionieren, da die Änderung nicht abwärtskompatibel ist.
Gruß
Damian
Zitat von: Damian am 01 März 2015, 10:50:07
Das sind leider keine Belege für ein Fehlverhalten, wenn du ein Modul um 16:02 definierst und alle Timer erst später zuschlagen sollen, dann kann man nichts dazu sagen. Du musst mir einen Fall zeigen, wo ein Timer zugeschlagen haben sollte und der Status nicht verändert wurde.
Nachtrag: Von wann sind die Auszüge? Welchen Zustand hatte zu diesem Zeitpunkt [ZeitsteuerungWeg]?
@Damian
die Auszüge sind von ca. 22.15 Uhr, also direkt als ich den Beitrag geschrieben habe, meine Decken Uhr die um 23 Uhr einschalten sollte hat dies auch nicht getan.
Die Zustände von z.B. ZeitsteuerungWeg war zu diesem Zeitpunkt auf Dämmerung und auch meine Decken Uhr Steuerung war auf ein.
Siehe Screenshots
Beide verändere ich momentan gar nicht, da ich zuhause bin, die Wegbeleuchtung arbeitet also nach Dämmerung und schaltet sich ein mit Sunset und geht zu einer festen Zeit aus.
Die Uhr z.B. ändere ich momentan auch nicht da ich keine Nachtschicht habe, die geht also Abends irgendwann an und morgens auch aus.
Die LED Innen Beleuchtung am TV hat gestern auch nicht ausgeschaltet, diese geht zu einer festen Zeit aus, oder wenn ich früher aus dem WZ gehe nach meinem Helligkeitssensor, wenn ich die zweite Lampe ausschalte.
Also im gesamten hat gestern nichts funktioniert...
Zur Information, ich habe das alte Modul wieder zurück kopiert und heute morgen funktionierten auch die Rollläden wieder und die Uhr hat sich ausgeschaltet.
Gegen Abend werde ich schauen was die Wegbeleuchtung macht, denke aber das sie wieder funktioniert...
Was brauchst du noch für Angaben, die ich evtl. auslesen könnte.?
Wie gesagt ich hatte am Nachmittag extra drauf geachtet das alle DOIFs initialisiert waren um sicher zu stellen das sie auch funktionieren... An den Dummys für den Modus stelle ich jetzt gerade extra nichts um, ist auch momentan nicht nötig.
Vielen Dank für dein Geduld, muss ich einfach mal so loswerden ;) :D
Zitat von: moonsorrox am 01 März 2015, 12:52:22
@Damian
die Auszüge sind von ca. 22.15 Uhr, also direkt als ich den Beitrag geschrieben habe, meine Decken Uhr die um 23 Uhr einschalten sollte hat dies auch nicht getan.
Die Zustände von z.B. ZeitsteuerungWeg war zu diesem Zeitpunkt auf Dämmerung und auch meine Decken Uhr Steuerung war auf ein.
Siehe Screenshots
Beide verändere ich momentan gar nicht, da ich zuhause bin, die Wegbeleuchtung arbeitet also nach Dämmerung und schaltet sich ein mit Sunset und geht zu einer festen Zeit aus.
Die Uhr z.B. ändere ich momentan auch nicht da ich keine Nachtschicht habe, die geht also Abends irgendwann an und morgens auch aus.
Die LED Innen Beleuchtung am TV hat gestern auch nicht ausgeschaltet, diese geht zu einer festen Zeit aus, oder wenn ich früher aus dem WZ gehe nach meinem Helligkeitssensor, wenn ich die zweite Lampe ausschalte.
Also im gesamten hat gestern nichts funktioniert...
Zur Information, ich habe das alte Modul wieder zurück kopiert und heute morgen funktionierten auch die Rollläden wieder und die Uhr hat sich ausgeschaltet.
Gegen Abend werde ich schauen was die Wegbeleuchtung macht, denke aber das sie wieder funktioniert...
Was brauchst du noch für Angaben, die ich evtl. auslesen könnte.?
Wie gesagt ich hatte am Nachmittag extra drauf geachtet das alle DOIFs initialisiert waren um sicher zu stellen das sie auch funktionieren... An den Dummys für den Modus stelle ich jetzt gerade extra nichts um, ist auch momentan nicht nötig.
Vielen Dank für dein Geduld, muss ich einfach mal so loswerden ;) :D
OK. Das sieht so aus als wenn die Timer hier gar nicht zugeschlagen hätten. Du brauchst nicht stundenlang auf etwas zu warten:
teste einfach mal:
define di_test DOIF ([13:15]) (set bla on)
Die Zeit würde ich paar Minuten in die Zukunft setzen, die Definition anschauen und nach der Zeit nochmal schauen was passiert.
Gruß
Damian
Zitat von: Damian am 01 März 2015, 13:10:43
OK. Das sieht so aus als wenn die Timer hier gar nicht zugeschlagen hätten. Du brauchst nicht stundenlang auf etwas zu warten:
teste einfach mal:
define di_test DOIF ([13:15]) (set bla on)
Die Zeit würde ich paar Minuten in die Zukunft setzen, die Definition anschauen und nach der Zeit nochmal schauen was passiert.
das funktionierte jetzt grad... aber ich habe ja auch noch das "alte" 98_DOIF drin, nicht das aus dem Beitrag
Habe drauf geachtet das er initialisiert hat und das sollte reichen, also:
Zitatstate initialized 2015-03-01 13:26:07
timer_1_c1 01.03.2015 13:30:00 2015-03-01 13:26:07
ja ich habe immer solche ein ähnliches Test DOIF zur Verfügung (nur um eine Zeit zu testen und auch speziell ein Gerät) und das funktioniert jetzt auch wieder, ich nutze dazu einen Zwischenstecker der hier direkt neben mir in der Steckdose steckt ;) nur das hilft jetzt ja nicht weiter und schon gar nicht für die die gestern nichts gemacht haben.
Das nur so gar nichts im Log steht, aber auch irgendwie klar wenn nichts ging steht auch nichts drin :-\
Zitat von: moonsorrox am 01 März 2015, 13:28:58
das funktionierte jetzt grad... aber ich habe ja auch noch das "alte" 98_DOIF drin, nicht das aus dem Beitrag
Habe drauf geachtet das er initialisiert hat und das sollte reichen, also:
ja ich habe immer solche ein ähnliches Test DOIF zur Verfügung (nur um eine Zeit zu testen und auch speziell ein Gerät) und das funktioniert jetzt auch wieder, ich nutze dazu einen Zwischenstecker der hier direkt neben mir in der Steckdose steckt ;) nur das hilft jetzt ja nicht weiter und schon gar nicht für die die gestern nichts gemacht haben.
Das nur so gar nichts im Log steht, aber auch irgendwie klar wenn nichts ging steht auch nichts drin :-\
Ich denke, dass wir über die neue Modul reden und nicht über das alte. Dass beim alten auf einmal etwas nicht funktioniert, dürfte recht unwahrscheinlich sein.
Was mir bei deinen list-Ausgaben auffiel war, dass keine Realtime-Einträge vorhanden waren. Zu jedem Time-Eintrag muss es einen Realtime-Eintrag existieren, wie hier:
Realtime:
0 06:25:00
1 08:00:00
2 15:00:00
3 22:00:00
4 06:25:00
5 08:30:00
6 08:30:00
7 23:30:00
State:
Time:
0 06:25:00
1 08:00:00
2 15:00:00
3 22:00:00
4 06:25:00
5 08:30:00
6 08:30:00
7 23:30:00
Timecond:
Um etwas reproduzieren zu können, darf man immer nur eine Sache gleichzeitig ändern und nicht mehrere.
Du kannst folgendes noch mal testen:
save config, shutdown, das letzte Modul aus Post 6 runterladen, ins FHEM-Verzeichnis kopieren, System hochfahren, beim test-DOIF Modul mit list schauen, ob Realtime gesetzt wurde, dann sollte alles funktionieren, wie bisher.
Gruß
Damian
Zitat von: Damian am 01 März 2015, 13:57:30
Ich denke, dass wir über die neue Modul reden und nicht über das alte. Dass beim alten auf einmal etwas nicht funktioniert, dürfte recht unwahrscheinlich sein.
schon klar, ich hatte nur etwas Muffe, da ja alles auf meinem Produktivsystem nicht funktionierte, deshalb also wieder das "alte" DOIF rein.
Werde es jetzt nochmals mit dem Modul aus dem Post hier machen.
Zitat von: Damian am 01 März 2015, 13:57:30
Was mir bei deinen list-Ausgaben auffiel war, dass keine Realtime-Einträge vorhanden waren. Zu jedem Time-Eintrag muss es einen Realtime-Eintrag existieren, wie hier:
Realtime:
0 06:25:00
1 08:00:00
2 15:00:00
3 22:00:00
4 06:25:00
5 08:30:00
6 08:30:00
7 23:30:00
State:
Time:
0 06:25:00
1 08:00:00
2 15:00:00
3 22:00:00
4 06:25:00
5 08:30:00
6 08:30:00
7 23:30:00
Timecond:
OK, werde ich jetzt mal testen...!
Zitat von: Damian am 01 März 2015, 13:57:30
Du kannst folgendes noch mal testen:
save config, shutdown, das letzte Modul aus Post 6 runterladen, ins FHEM-Verzeichnis kopieren, System hochfahren, beim test-DOIF Modul mit list schauen, ob Realtime gesetzt wurde, dann sollte alles funktionieren, wie bisher.
Ok, werde berichten
...dann sollten die Realtime Einträge in meinen andere DOIFs aber auch vorhanden sein..? Gerade mal geschaut und alle drin..! :D
@Damian
also der Befehl meines di_testDOIF wurde ausgeführt und es erscheinen auch die Realtime Einträge.
Hier das List:
Internals:
CFGFN
DEF ([14:15]) (set LichtOG on)
NAME di_testDOIF
NR 2776
NTFY_ORDER 50-di_testDOIF
STATE cmd_1
TYPE DOIF
Readings:
2015-03-01 14:15:00 cmd_event timer_1
2015-03-01 14:15:00 cmd_nr 1
2015-03-01 14:15:00 state cmd_1
2015-03-01 14:15:00 timer_1_c1 02.03.2015 14:15:00
Condition:
0 DOIF_time_once($hash->{timer}{0},$wday,"")
Days:
Devices:
Do:
0 set LichtOG on
Helper:
last_timer 1
sleeptimer -1
Internals:
Itimer:
Readings:
Realtime:
0 14:15:00
State:
Time:
0 14:15:00
Timecond:
0 0
Timer:
0 0
Timerfunc:
Timers:
0 0
Attributes:
room AutomationTest
ich lasse das "neue" Modul jetzt mal drin und werde sehen ob alles geht heute.
Die anderen DOIFs haben ich die Realtime Einträge drin, somit sollte alles funktionieren
@Damian
es könnte ein Fehler sein...!
EDITH:/ kleiner Zusatz von mir, ein Neustart bringt wieder die Realtime Einträge
was mir wichtiges aufgefallen ist, ein erneutes einlesen von Fhem überlebt das Modul nicht...!
Ich hänge mal ein list meiner Wegbeleuchtung dran.... da fehlen dies Realtime-Einträge total obwohl sie eben noch da waren
Internals:
CFGFN ./FHEM/Automation.cfg
DEF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|0123456]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([ZeitsteuerungWeg] eq "Dämmerung" and ([00:15|12345] or [01:15|06]))
(set WegLampe_Sw_02 off)
DOELSEIF([ZeitsteuerungWeg] =~ "Aus|Dämmerung")(attr ZufallsTimerWeglicht disable 1)
DOELSEIF([ZeitsteuerungWeg] eq "Zufall")(attr ZufallsTimerWeglicht disable 0)
NAME di_WegBeleuchtung
NR 293
NTFY_ORDER 50-di_WegBeleuchtung
STATE cmd_3
TYPE DOIF
Readings:
2015-03-01 01:15:00 cmd_event timer_5
2015-03-01 01:15:00 cmd_nr 3
2015-03-01 01:15:00 state cmd_3
2015-03-01 14:13:32 timer_1_c1 01.03.2015 18:53:17|12345
2015-03-01 14:13:32 timer_2_c1 01.03.2015 18:46:37|06
2015-03-01 14:13:32 timer_3_c2 01.03.2015 21:03:17|0123456
2015-03-01 14:13:32 timer_4_c3 02.03.2015 00:15:00|12345
2015-03-01 14:13:32 timer_5_c3 02.03.2015 01:15:00|06
Condition:
0 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06"))
1 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{2},$wday,"0123456"))
2 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{3},$wday,"12345") or DOIF_time_once($hash->{timer}{4},$wday,"06"))
3 InternalDoIf('ZeitsteuerungWeg','STATE','') =~ "Aus|Dämmerung"
4 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Zufall"
Days:
0 12345
1 06
2 0123456
3 12345
4 06
Devices:
0 ZeitsteuerungWeg
1 ZeitsteuerungWeg
2 ZeitsteuerungWeg
3 ZeitsteuerungWeg
4 ZeitsteuerungWeg
all ZeitsteuerungWeg
Do:
0 set WegLampe_Sw_01 on
1 set WegLampe_Sw_01 off,set WegLampe_Sw_02 on
2 set WegLampe_Sw_02 off
3 attr ZufallsTimerWeglicht disable 1
4 attr ZufallsTimerWeglicht disable 0
Helper:
last_timer 5
sleeptimer -1
Internals:
0 ZeitsteuerungWeg:STATE
1 ZeitsteuerungWeg:STATE
2 ZeitsteuerungWeg:STATE
3 ZeitsteuerungWeg:STATE
4 ZeitsteuerungWeg:STATE
all ZeitsteuerungWeg:STATE
Itimer:
State:
Time:
0 {sunset("CIVIL",1200,"17:00","22:20")}
1 {sunset("CIVIL",800,"17:00","22:20")}
2 {sunset("CIVIL",9000,"19:00","22:20")}
3 00:15:00
4 01:15:00
Timecond:
0 0
1 0
2 1
3 2
4 2
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1
1 2
2 3 4
Attributes:
Zitat von: moonsorrox am 01 März 2015, 14:27:54
@Damian
es könnte ein Fehler sein...!
was mir wichtiges aufgefallen ist, ein erneutes einlesen von Fhem überlebt das Modul nicht...!
Ich hänge mal ein list meiner Wegbeleuchtung dran.... da fehlen dies Realtime-Einträge total obwohl sie eben noch da waren
Internals:
CFGFN ./FHEM/Automation.cfg
DEF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [ZeitsteuerungWeg] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|0123456]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([ZeitsteuerungWeg] eq "Dämmerung" and ([00:15|12345] or [01:15|06]))
(set WegLampe_Sw_02 off)
DOELSEIF([ZeitsteuerungWeg] =~ "Aus|Dämmerung")(attr ZufallsTimerWeglicht disable 1)
DOELSEIF([ZeitsteuerungWeg] eq "Zufall")(attr ZufallsTimerWeglicht disable 0)
NAME di_WegBeleuchtung
NR 293
NTFY_ORDER 50-di_WegBeleuchtung
STATE cmd_3
TYPE DOIF
Readings:
2015-03-01 01:15:00 cmd_event timer_5
2015-03-01 01:15:00 cmd_nr 3
2015-03-01 01:15:00 state cmd_3
2015-03-01 14:13:32 timer_1_c1 01.03.2015 18:53:17|12345
2015-03-01 14:13:32 timer_2_c1 01.03.2015 18:46:37|06
2015-03-01 14:13:32 timer_3_c2 01.03.2015 21:03:17|0123456
2015-03-01 14:13:32 timer_4_c3 02.03.2015 00:15:00|12345
2015-03-01 14:13:32 timer_5_c3 02.03.2015 01:15:00|06
Condition:
0 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06"))
1 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{2},$wday,"0123456"))
2 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Dämmerung" and (DOIF_time_once($hash->{timer}{3},$wday,"12345") or DOIF_time_once($hash->{timer}{4},$wday,"06"))
3 InternalDoIf('ZeitsteuerungWeg','STATE','') =~ "Aus|Dämmerung"
4 InternalDoIf('ZeitsteuerungWeg','STATE','') eq "Zufall"
Days:
0 12345
1 06
2 0123456
3 12345
4 06
Devices:
0 ZeitsteuerungWeg
1 ZeitsteuerungWeg
2 ZeitsteuerungWeg
3 ZeitsteuerungWeg
4 ZeitsteuerungWeg
all ZeitsteuerungWeg
Do:
0 set WegLampe_Sw_01 on
1 set WegLampe_Sw_01 off,set WegLampe_Sw_02 on
2 set WegLampe_Sw_02 off
3 attr ZufallsTimerWeglicht disable 1
4 attr ZufallsTimerWeglicht disable 0
Helper:
last_timer 5
sleeptimer -1
Internals:
0 ZeitsteuerungWeg:STATE
1 ZeitsteuerungWeg:STATE
2 ZeitsteuerungWeg:STATE
3 ZeitsteuerungWeg:STATE
4 ZeitsteuerungWeg:STATE
all ZeitsteuerungWeg:STATE
Itimer:
State:
Time:
0 {sunset("CIVIL",1200,"17:00","22:20")}
1 {sunset("CIVIL",800,"17:00","22:20")}
2 {sunset("CIVIL",9000,"19:00","22:20")}
3 00:15:00
4 01:15:00
Timecond:
0 0
1 0
2 1
3 2
4 2
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1
1 2
2 3 4
Attributes:
Was verstehst du unter erneutes einlesen von Fhem? Änderung über DEF oder Neustart des Systems?
Gruß
Damian
ein "rereadcfg" ist bei mir einlesen
ein "shutdown restart" ist bei mir Neustart ich habe dafür Button auf der Weboberfläche erstellt
jetzt nach einem Neustart sind die Realtime Einträge wieder da, lese ich wiederum ein sind sie wieder weg...! verstanden..? ;)
Auch ein save davor bringt nichts...
schau mal den screenshot
Zitat von: moonsorrox am 01 März 2015, 14:41:44
ein "rereadcfg" ist bei mir einlesen
ein "shutdown restart" ist bei mir Neustart ich habe dafür Button auf der Weboberfläche erstellt
jetzt nach einem Neustart sind die Realtime Einträge wieder da, lese ich wiederum ein sind sie wieder weg...! verstanden..? ;)
Auch ein save davor bringt nichts...
schau mal den screenshot
gut, dass wir darüber gesprochen haben, ein rereadcfg habe ich bei mir noch nicht benutzt. Ich kann das Verhalten bei mir reproduzieren. Ich melde mich, wenn ich das Problem behoben habe. Solange musst du das alte Modul benutzen, oder kein rereadcfg ausführen :)
Gruß
Damian
@Damian...
Super.. ;) schön das ich auch mal helfen konnte :D
ja klar soweit ich das weiß tue ich dieses natürlich nicht... ich lass das "neue" Modul drin und habe es oben dick anmarkiert, damit es jeder weiß...
Danke
Zitat von: moonsorrox am 01 März 2015, 15:07:10
@Damian...
Super.. ;) schön das ich auch mal helfen konnte :D
ja klar soweit ich das weiß tue ich dieses natürlich nicht... ich lass das "neue" Modul drin und habe es oben dick anmarkiert, damit es jeder weiß...
Danke
habe es gefixt. Jetzt funktioniert auch rereadcfg - neue Version im ersten Post.
Gruß
Damian
Zitat von: Damian am 01 März 2015, 15:24:13
habe es gefixt. Jetzt funktioniert auch rereadcfg - neue Version im ersten Post.
bist du ein schneller "Hund" ;) :P
Danke... und immer wieder "tolles Modul" :D
So... jetzt erst mal nen Kaffee :D
EDITH://
mal ein kleiner Zwischeneinwurf:
ich arbeite immer noch an meiner Version mit dem Türkontakt hier in diesem Thread (http://forum.fhem.de/index.php/topic,34263.msg267471.html#msg267471), aber irgendwie habe ich da einen Knoten im Kopf und schaffe es nicht, kann mir jemand einen Denkanstoß geben.. :-\
Zitat von: flurin am 27 Februar 2015, 21:55:25
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
Hallo,
nachdem ich nun fast 2 Tage ohne Internetzugriff war, habe ich mir die Sache mit dem trigger auf die endtime angesehen. Aber so richtig habe ich das immer noch nicht gerafft.
Der Code von flurin funktioniert nicht. Irgendwo fehlt eine Klammer, aber ich habe keinen Plan wo!
vermutet habe ich diese Stelle:
DOIF ([06:30]-[end_time]])
aber weder
DOIF ([06:30]-[end_time])
noch
DOIF ([06:30]-[[end_time]])
führen hier zum Erfolg!
Das Dummy end_time hat nicht die Zeit, sondern wird auf " {OffTimeLicht()}" gesetzt.
Ich bin irgendwie noch nicht ganz bei Euch angekommen!
Spartacus
Hallo Spartacus
Eine Klammer ist zu viel! Ich werde es berichtigen.
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {OffTimeLicht()}) DOELSE (set flex_lamp off)
Gruss
flurin
Zitat von: flurin am 02 März 2015, 17:28:35
Hallo Spartacus
Eine Klammer ist zu viel! Ich werde es berichtigen.
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {OffTimeLicht()}) DOELSE (set flex_lamp off)
Gruss
flurin
und wenn du
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)
nimmst, so wie ich ursprünglich vorgeschlagen habe, wird im Dummy die Zeit gesetzt und nicht die Funktion. Beide Lösungen sollten allerdings funktionieren.
Gruß
Damian
Zitat von: Damian am 02 März 2015, 17:33:04
und wenn du
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)
nimmst, so wie ich ursprünglich vorgeschlagen habe, wird im Dummy die Zeit gesetzt und nicht die Funktion. Beide Lösungen sollten allerdings funktionieren.
Gruß
Damian
OK, gut zu wissen!, Danke
Gruss
flurin
Zitat von: Damian am 02 März 2015, 17:33:04
und wenn du
define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)
nimmst, so wie ich ursprünglich vorgeschlagen habe, wird im Dummy die Zeit gesetzt und nicht die Funktion. Beide Lösungen sollten allerdings funktionieren.
Gruß
Damian
Ich habe es gleich ausprobiert, jedoch auch mit Klammern erhalte ich nur die Funktion.
([17:48-[end_time]]) (set flex_lamp on, set end_time { (OffTimeLicht()) } ) DOELSE (set flex_lamp off)
Internals:
NAME end_time
NR 310
STATE { (OffTimeLicht()) }
TYPE dummy
Readings:
2015-03-02 17:48:00 state { (OffTimeLicht()) }
Attributes:
group Dummy
Edit: so ist es OK:
([17:48-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)
ohne Space nach { und vor }
Zitat von: flurin am 02 März 2015, 17:50:44
ohne Space nach { und vor }
ja, denn in der Commandref steht:
ZitatEs 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
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.
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
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
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
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
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
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
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.
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
Okay, recht hast Du.
Im Test hatte ich es aktualisiert, im produktiven System wohl noch nicht.
Schönes WE
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
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
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
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
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
Hier noch ein Beispiel:
define interval dummy
set interval 00:02
define di_time_var DOIF ([+[interval]]) ({myLog("Interval expired: do what you like")})
attr di_time_var do always
Ist es eigentlich möglich, doif mit einer Unix-Zeit-Angabe zu steuern? Dann hätte man eine absolute Zeit, die auch mal ein paar Tage in der Zukunft liegen kann. Ich benutze so etwas um meinen Sat-Reciever per Schaltsteckdose für Aufnahmen einzuschalten. Dabei wird über das ENIGMA2 Modul die Unix-Zeit der nächsten Aufnahme ausgelesen und der Reciever dann 10 Minuten vor der Aufnahme eingeschaltet.
Gruß
Ingo
Zitat von: automatisierer am 09 März 2015, 17:15:56
Ist es eigentlich möglich, doif mit einer Unix-Zeit-Angabe zu steuern? Dann hätte man eine absolute Zeit, die auch mal ein paar Tage in der Zukunft liegen kann. Ich benutze so etwas um meinen Sat-Reciever per Schaltsteckdose für Aufnahmen einzuschalten. Dabei wird über das ENIGMA2 Modul die Unix-Zeit der nächsten Aufnahme ausgelesen und der Reciever dann 10 Minuten vor der Aufnahme eingeschaltet.
Gruß
Ingo
Die Zeitangaben sind auf HH:MM beschränkt, weil es ja für den User nachvollziehbar ist. Unix-Time wird natürlich intern benutzt.
was geht ist z. B:
define u_time dummy
set u_time {mytime()}
DOIF ([[u_time]])(set receiver on)
mytime ist dann eine Perl-Funktion, die aus der Unix-Zeit HH:MM berechnet, allerdings nur 24 Stunden im voraus. Na ja nicht ganz, denn man kann (inoffiziell) 99:59 angeben, also vier Tage im voraus.
Daher nur bedingt sinnvoll.
Gruß
Damian
schade... jetzt prüfe ich per at befehl alle x minuten ob die programmierte unix-time minus fünf minuten kleiner ist als die aktuelle unix-time und schalte dann halt entsprechend... funktioniert zuverlässig, benötigt aber diverse dummy's, at's und notify's...
Ich glaube auch schon mal irgendwo gelesen zu haben, dass eine absolute Zeitangabe in FHEM nicht vorgesehen, bzw nicht FHEM konform ist. Ich hatte halt so nen bissl gehofft, dass DOIF, die Eier legende Wollmilchsau unter den FHEM Modulen das auch noch kann...
Hallo,
ich versuche ein Velux-Rollo mit einem RadioWecker zeitgleich aufgehen zu lassen.
Der Radiowecker wird über das squeezboxModul bereitgestellt.
Dort sehe ich in den Readings:
alarm1_time 09:40:00
alarmsEnabled on
Die Readings werden auch geändert, wenn ich den Alarm auf dem Radio ändere. Soweit zu gut.
Dann habe ich folgendes DOIF geschrieben:
([[Radio:alarm1_time]] and ([Radio:alarmsEnabled] eq "on")) (set Velux pct 100)
Nun zum Problem:
wenn ich das DOIF ändere und speichere, wird auch die alarm1_time im DOIF korrekt ausgelesen und dann geht auch das Velux hoch.
Aber wenn ich nur am Radio die Zeit ändere, bekommt das DOIF das nicht mit. Ich habe keine Attribute gesetzt... sollte ich irgendwelche setzen?
Danke für Eure Hilfe,
Markus.
Zitat von: msdv am 13 Mai 2021, 12:04:03
Hallo,
ich versuche ein Velux-Rollo mit einem RadioWecker zeitgleich aufgehen zu lassen.
Der Radiowecker wird über das squeezboxModul bereitgestellt.
Dort sehe ich in den Readings:
alarm1_time 09:40:00
alarmsEnabled on
Die Readings werden auch geändert, wenn ich den Alarm auf dem Radio ändere. Soweit zu gut.
Dann habe ich folgendes DOIF geschrieben:
([[Radio:alarm1_time]] and ([Radio:alarmsEnabled] eq "on")) (set Velux pct 100)
Nun zum Problem:
wenn ich das DOIF ändere und speichere, wird auch die alarm1_time im DOIF korrekt ausgelesen und dann geht auch das Velux hoch.
Aber wenn ich nur am Radio die Zeit ändere, bekommt das DOIF das nicht mit. Ich habe keine Attribute gesetzt... sollte ich irgendwelche setzen?
Danke für Eure Hilfe,
Markus.
Die Änderung der Uhrzeit muss ein Event auslösen, sonst bekommt DOIF es nicht mit.
Zitat von: Damian am 13 Mai 2021, 12:15:36
Die Änderung der Uhrzeit muss ein Event auslösen, sonst bekommt DOIF es nicht mit.
Ich habe das Problem gefunden - im Radio war das Attribute "donotnotify" gesetzt.
Nachdem ich das auf "false" gesetzt habe, funktioniert es nun wie es aussieht.