AT mit anzahl der Wiederholungen aus einer Variable (Dumy)

Begonnen von dirk.k, 04 Juni 2022, 19:18:42

Vorheriges Thema - Nächstes Thema

dirk.k

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?

TomLee

ReadingsNum verwenden statt Value ?

ReadingsNum('dummy_gartenwasser_wiederholungen','state',0,0)

Damian

Ich würde behaupten, dass es beim AT-Befehl nicht geht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

#3
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomLee

#4
Wenn das auf mich bezogen war, ich habs nicht ausprobiert ...

edit:

Mir gings nur um das korrekte auslesen des Wert

dirk.k

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)


MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

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 ?

Damian

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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig


dirk.k

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.

MadMax-FHEM

#12

{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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomLee

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



DetlefR

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.