Hallo zusammen,
Ich versuche ein bestehendes "at" um "Wiederholungen" zu erweitern .. welche dynamisch einstellbar sein sollen.
Funktionieren tut bereits:
defmod tmp_at_gartenwasser at {Value("dummy_gartenwasser")} set Sonoff_basic_11 3600
Für 3 Wiederholungen muss ein *{3} vor die Zeit.
Das funktioniert s0 auch:
defmod tmp_at_gartenwasser at *{3}{Value("dummy_gartenwasser")} set Sonoff_basic_11 3600
Nun sollen aber die Zahl der Wiederholungen aus einem dummy gelesen werden....
defmod tmp_at_gartenwasser at *{Value("dummy_gartenwasser_wiederholungen")}{Value("dummy_gartenwasser")} set Sonoff_basic_11 3600
der dummy existiert und hat den Wert "04", aber es gibt keine Wiederholungen...
Ich glaube mir fehlen die geschweiften klammern ... aber wie bekomme ich die rein?
aber auch das funktioniert nicht (wird als Befehl aber akzeptiert)
defmod tmp_at_gartenwasser at *{{Value("dummy_gartenwasser_wiederholungen")}}{Value("dummy_gartenwasser")} set Sonoff_basic_11 3600
Internals:
CFGFN
COMMAND set Sonoff_basic_11 3600
DEF *{Value("dummy_gartenwasser_wiederholungen")}{Value("dummy_gartenwasser")} set Sonoff_basic_11 3600
FUUID 629b8db8-f33f-cdbc-5dd4-e2c776c86fb59889
NAME tmp_at_gartenwasser
NR 239470
NTM 05:30:00
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 05:30:00
TIMESPEC {Value("dummy_gartenwasser_wiederholungen")}{Value("dummy_gartenwasser")}
TRIGGERTIME 1654399800
TRIGGERTIME_FMT 2022-06-05 05:30:00
TYPE at
.attraggr:
.attrminint:
READINGS:
2022-06-04 19:12:29 state Next: 05:30:00
Attributes:
Hat jemand eine Idee, wie das zu lösen ist?
ReadingsNum verwenden statt Value ?
ReadingsNum('dummy_gartenwasser_wiederholungen','state',0,0)
Ich würde behaupten, dass es beim AT-Befehl nicht geht.
Vielleicht sagt du was du erreichen willst?
Ich denke egal wie du es machst: es ist nicht dynamisch.
Das at wird einmal angelegt, ja mit Werten aus 2 dummy? Warum nicht (wenn schon dummy) einen? Dort 2 Readings oder User-Attribute?
Dann ist das at definiert, läuft und fertig...
Ist es tatsächlich das was du willst?
EDIT: vors. nat es geht überhaupt so.
Gruß, Joachim
Wenn das auf mich bezogen war, ich habs nicht ausprobiert ...
edit:
Mir gings nur um das korrekte auslesen des Wert
Danke für eure Tips.
Leider verhält sich Readingsnum in dieser Situation genauso wie valve.
Der resultierende Befehl wäre ja folgender:
define sample at +*{3}05:30:00 <befehl>
Das Übergeben der Zeit funktioniert hier seit Jahren schon zuverlässig, nur die Wiederholungen in der geschweiften Klammer bekomme ich nicht hin.
Evtl. muss man die Klammern maskieren ...?
Noch kurz zu warum:
seit mehreren Jahren schalten wir bei Bedarf die Bewässerung am nächsten Morgen sehr früh an - über FTUI.
Und jetzt kam die Bitte das doch bei Abwesenheit auch 3mal nacheinander, ohne weiteren Eingriff zu haben (ist also wichtig für den WAF)
Dann noch mal:
wer/was führt denn das "define sample at +*{3}05:30:00 <befehl>" aus bzw. wer/was soll das ausführen?
Und wann wird das ausgeführt?
Weil dynamisch klingt so: du änderst den Zeitwert und/oder den Wiederholungswert und dann soll das at angepasst/definiert werden...
Dann muss es ja noch mehr geben als nur den "dynamischen" define, oder?
Evtl. kann man dann ansetzen, wenn man weiß was die Bedngungen sind.
Gruß, Joachim
Zitat von: dirk.k am 05 Juni 2022, 10:25:30
Danke für eure Tips.
Leider verhält sich Readingsnum in dieser Situation genauso wie valve.
Der resultierende Befehl wäre ja folgender:
define sample at +*{3}05:30:00 <befehl>
Das Übergeben der Zeit funktioniert hier seit Jahren schon zuverlässig, nur die Wiederholungen in der geschweiften Klammer bekomme ich nicht hin.
Evtl. muss man die Klammern maskieren ...?
Noch kurz zu warum:
seit mehreren Jahren schalten wir bei Bedarf die Bewässerung am nächsten Morgen sehr früh an - über FTUI.
Und jetzt kam die Bitte das doch bei Abwesenheit auch 3mal nacheinander, ohne weiteren Eingriff zu haben (ist also wichtig für den WAF)
Wie schon geschrieben, Anzahl der Wiederholungen lässt sich beim AT nicht variabel gestalten, da muss du mit defmod automatisiert die Definition ändern oder ein anderes Modul nehmen, was eine variable Wiederholung unterstützt.
Nur Vermutung -> evtl. muss man den [<timespec>|<datespec>]-Teil komplett in Perl (in {}-Klammern umsetzen ?
Vlt. ist es aber auch genau das was Damian angesprochen hat und man kann den Teil nich in Perl angeben, glaub ich aber irgendwie nicht, ich probiers später aus ?
Zitat von: TomLee am 05 Juni 2022, 10:37:36
Vlt. ist es aber auch genau das was Damian angesprochen hat und man kann den Teil nich in Perl angeben, glaub ich aber irgendwie nicht, ich probiers später aus ?
Dann schau einfach im Programmcode nach, wenn du mir nicht glaubst ;)
Ich wuerde Damian glauben :)
OK, mit dem "dynamisch" habe ich offensichtlich etwas Verwirrung gestiftet.
Ziel ist es per FTUI Werte zu setzen (Ausführungszeit, Wiederholungen) und dann mittel FTUI-Button ein defmod auszulösen, welches diese Werte verwendet.
Es soll nicht so dynamisch sein, dass späteres ändern des Dummy (ohne erneutes defmod des AT) etwas bewirkt.
also aus den Werten eine Zeichenkette zusammenzubauen und beim Defmod zu verwenden wäre absolut OK.
{my $timespec='{' . ReadingsNum("dmTest", "test2",1) . '}' . ReadingsVal("dmTest", "test4","00:00:00");; fhem("defmod atTestDyn at +*$timespec set dmTest off")}
Erzeugt bei mir ein at (wenn eingegeben in FhemWeb) wo aus dem dummy dmTest im Reading test2 eine Zahl (Wiederholungen) drin steht und im Reading test4 eine Timespec:
defmod atTestDyn at +*{11}00:01:01 set dmTest off
RawDef
defmod dmTest dummy
attr dmTest room Test
setstate dmTest off
setstate dmTest 2022-02-04 19:35:00 test2 11
setstate dmTest 2022-06-05 14:25:18 test4 00:01:01
Ausgelagert in eine Sub dann weniger Strichpunkte...
EDIT: der "komische" dummy mit den Readings test2 und test4, weil ich den noch für andere Tests nutze/genutzt habe... ;)
Gruß, Joachim
Folgenden Vorschlag hätte ich, es alternativ zu einem DOIF anzugehen, die bisherigen dummys bleiben erhalten (kann man auch auf einen umbauen) und im FTUI bleibt auch alles beim Alten, nur über das wieder active schalten hab ich mir keine Gedanken gemacht, denke mal beim setzen der Zeiten im FTUI dann:
defmod sample at {ReadingsVal("dummy_gartenwasser")} { my $cmd1 = 'set Sonoff_basic_11 3600';;\
my $cmd2 = "$cmd1;;set sample inactive";;\
my $rn = ReadingsNum('dummy_gartenwasser_wiederholungen','state',0,0);;\
my @w=(1..$rn);;\
my $s=join(",",@w);;\
Each('dummy_gartenwasser_wiederholungen',$s);;\
return fhem($cmd1) if (InternalVal('dummy_gartenwasser_wiederholungen','EACH_INDEX',3) <= 2);;\
return fhem($cmd2);;\
}
attr sample room Test
Der Code ist zusammenkopiert am Tablet, wer Fehler findet darf sie behalten..
Mein funktionierender, getesteter Code ist dieser falls oben was nicht passt:
defmod sample at *13:04:00 { my $cmd1 = 'set OG_Echo_Wohnzimmer speak hallihallo';;\
my $cmd2 = "$cmd1;;set sample inactive";;\
my $rn = ReadingsNum('Demo','Wiederholungen',0,0);;\
my @w=(1..$rn);;\
my $s=join(",",@w);;\
Each('Demo',$s);;\
return fhem($cmd1) if (InternalVal('Demo','EACH_INDEX',3) <= 2);;\
return fhem($cmd2);;\
}
attr sample room Test
setstate sample inactive
setstate sample 2022-06-05 14:54:52 state inactive
Also ich habe verstanden, dass früh morgens um HH:MM die Bewässerung eingeschalten werden soll. Und das an X Tagen hintereinander immer um die gleiche Zeit.
Mein Vorschlag.
Die timespec des at bleibt wie sie ist.
{Value("dummy_gartenwasser")}
Das hat ja wohl funktioniert. Dann wird einfach ein Zähler überprüft.(ungetestet)
Zitat
my dd="dummy_gartenwasser";
my rdd="wiederholung";
my $wdhg=ReadingsNum($dd,$rdd,0);
if ($wdhg>0){
fhem("set Sonoff_basic_11 3600");
$wdhg-=1;
}else{
$wdhg=0;
}
fhem("setreading $dd $rdd $wdhg");
return undef;
}
Damit braucht man den at auch nicht zu deaktivieren. Wenn "wiederholung" 0 ist passiert einfach nichts.
Und hier ein Zweizeiler als Alternative:
defmod di_gartenwasser DOIF ([[$SELF:Zeitpunkt]]) (set Sonoff_basic_11 3600)
attr di_gartenwasser repeatsame [$SELF:Anzahl]
mit
setreading di_gartenwasser Zeitpunkt <Time>
wird der Zeitpunkt gesetzt und mit
setreading di_gartenwasser Anzahl <Anzahl>
wird die Anzahl der Wiederholungen gesetzt. Dabei wird automatisch intern der Counter zurückgesetzt, da muss man nichts mehr programmieren.
Danke für die vielen Vorschläge.
Ich probiere gerade verschiedenes durch.
Klarer Vavorit wäre der Einfachheit wegen die DoIf Variante.
Nur ein paar Fragen:
Setze ich repeatsame auf 0, wird nichts ausgeführt ... ok, war so erwartet.
Ich habe repeatsame auf 1 gesetzt und nach dem Auslösen wird trotzdem ein Timer für den nächsten Tag erstellt ... würde dieser dann einfach nicht "auslösen"? (siehe device-listing unten)
Gibt es eine Möglichkeit, die Zahl der offenen Ausführungen herauszubekommen (oder könnte für diese Information evtl. ein weiteres reading erstellt werden?)
Ich kann sonst leider nicht anzeigen, wenn die Bewässerung nicht mehr aktiv ist.
Internals:
CFGFN
DEF ([[$SELF:Zeitpunkt]]) (set Sonoff_basic_11 off)
FUUID 629dc8ee-f33f-cdbc-8eff-73deebb68fa61806
MODEL FHEM
NAME di_gartenwasser
NOTIFYDEV di_gartenwasser,global
NR 271218
NTFY_ORDER 50-di_gartenwasser
STATE cmd_1
TYPE DOIF
VERSION 26020 2022-05-03 16:28:02
.attraggr:
.attrminint:
READINGS:
2022-06-06 13:24:33 Anzahl 1
2022-06-06 13:43:51 Zeitpunkt 13:44
2022-06-06 13:44:01 cmd 1
2022-06-06 13:44:01 cmd_count 1
2022-06-06 13:44:01 cmd_event timer_1
2022-06-06 13:44:01 cmd_nr 1
2022-06-06 13:37:30 mode enabled
2022-06-06 13:44:01 state cmd_1
2022-06-06 13:44:01 timer_01_c01 07.06.2022 13:44:00
Regex:
accu:
collect:
itimer:
di_gartenwasser:
itimer:
Zeitpunkt ^di_gartenwasser$:^Zeitpunkt:
attr:
cmdState:
repeatsame:
1
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 set Sonoff_basic_11 off
1:
helper:
NOTIFYDEV di_gartenwasser,global
event timer_1
globalinit 1
last_timer 1
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
timer_1
triggerEvents:
timer_1
triggerEventsState:
timer_1
interval:
intervalfunc:
intervaltimer:
localtime:
0 1654602240
realtime:
0 13:44:00
time:
0 [di_gartenwasser:Zeitpunkt]
timeCond:
0 0
timer:
0 0
timers:
0 0
triggertime:
1654602240:
localtime 1654602240
hash:
uiState:
uiTable:
Attributes:
comment attr di_gartenwasser repeatsame [$SELF:Anzahl]
repeatsame 1
room 2.1_Garten
@MadMax-FHEM
Das würde ja nahe an meine bestehende Konfiguration drankommen.
Das Ganze aus FhemWeb funktioniert super ... incl. Counter für die offenen Vorgänge.
In FTUI bekomme ich Probleme wegen der ganzen Anführungszeichen und Hochkomma.
Wie bekomme ich den Zusammenbau der Zeichenkette ausgelagert?
Damit habe ich mich noch nie beschäftigt?
PS: ich habe die benötigte Zeichenkette *{06}05:15 jetzt als userreading. Allerdings akzeptiert das AT jetzt das ReadingsVal nicht mehr als Zeitangabe...
the function "ReadingsVal("dummy_gartenwasser","timespec","*{1}05:50:00")" must return a timespec and not *{06}05:30:00
Zitat von: dirk.k am 06 Juni 2022, 13:45:21
Danke für die vielen Vorschläge.
Ich probiere gerade verschiedenes durch.
Klarer Vavorit wäre der Einfachheit wegen die DoIf Variante.
Nur ein paar Fragen:
Setze ich repeatsame auf 0, wird nichts ausgeführt ... ok, war so erwartet.
Ich habe repeatsame auf 1 gesetzt und nach dem Auslösen wird trotzdem ein Timer für den nächsten Tag erstellt ... würde dieser dann einfach nicht "auslösen"? (siehe device-listing unten)
Gibt es eine Möglichkeit, die Zahl der offenen Ausführungen herauszubekommen (oder könnte für diese Information evtl. ein weiteres reading erstellt werden?)
Ich kann sonst leider nicht anzeigen, wenn die Bewässerung nicht mehr aktiv ist.
Der Timer ist immer aktiv, wenn die Anzahl erreicht ist, wird nichts mehr ausgeführt.
Im Reading cmd_count kannst du sehen, wie oft es bereits ausgeführt wurde, folglich kann man als Differenz von Anzahl-count, die noch ausstehenden darstellen.