FHEM Forum

FHEM => Automatisierung => Thema gestartet von: dirk.k am 04 Juni 2022, 19:18:42

Titel: AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: dirk.k am 04 Juni 2022, 19:18:42
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?
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: TomLee am 04 Juni 2022, 19:38:28
ReadingsNum verwenden statt Value ?

ReadingsNum('dummy_gartenwasser_wiederholungen','state',0,0)
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: Damian am 04 Juni 2022, 19:50:01
Ich würde behaupten, dass es beim AT-Befehl nicht geht.
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: MadMax-FHEM am 04 Juni 2022, 19:51:32
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
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: TomLee am 04 Juni 2022, 19:52:28
Wenn das auf mich bezogen war, ich habs nicht ausprobiert ...

edit:

Mir gings nur um das korrekte auslesen des Wert
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag 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)

Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: MadMax-FHEM am 05 Juni 2022, 10:31:05
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
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: Damian am 05 Juni 2022, 10:36:41
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.
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: TomLee am 05 Juni 2022, 10:37:36
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 ?
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: Damian am 05 Juni 2022, 11:30:11
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 ;)
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: rudolfkoenig am 05 Juni 2022, 11:47:46
Ich wuerde Damian glauben :)
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: dirk.k am 05 Juni 2022, 14:13:25
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.
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: MadMax-FHEM am 05 Juni 2022, 14:37:45

{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
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: TomLee am 05 Juni 2022, 15:11:41
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


Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: DetlefR am 05 Juni 2022, 19:25:06
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.
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: Damian am 05 Juni 2022, 20:21:20
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.

Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag 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.

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
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: dirk.k am 06 Juni 2022, 14:12:36
@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
Titel: Antw:AT mit anzahl der Wiederholungen aus einer Variable (Dumy)
Beitrag von: Damian am 06 Juni 2022, 15:15:36
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.