[gelöst]Ablaufsteuerung mit Perl, wie?

Begonnen von matze1999, 17 Juni 2022, 10:22:37

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

eine letzte Frage noch:

ich hab jetzt diese definition:

defmod Beregnung.manuell dummy
attr Beregnung.manuell group Schalter-Schalter
attr Beregnung.manuell icon sani_irrigation
attr Beregnung.manuell readingList 1 2 3 4 5 6
attr Beregnung.manuell room Bewässerung,Garten,Schalter
attr Beregnung.manuell setList 1:selectnumbers,10,10,60,0,lin 2:selectnumbers,10,10,60,0,lin 3:selectnumbers,10,10,60,0,lin 4:selectnumbers,10,10,60,0,lin 5:selectnumbers,10,10,60,0,lin 6:selectnumbers,10,10,60,0,lin
attr Beregnung.manuell webCmd 1:2:3:4:5:6


leider kann ich mit diesem webcmd die "10" nicht auswählen, weil da nicht "ausgelöst" wird, alle anderen Werte funktionieren.

Weiterhin steht ganz vorn im webif eine "1", und ich weiss nicht wo diese herkommt, und ich hätte vor den DropDown Menüs gerne eien Bezeichnung stehen.

matze1999

Beta-User

#16
Zitat von: matze1999 am 21 Juni 2022, 11:16:36
leider kann ich mit diesem webcmd die "10" nicht auswählen, weil da nicht "ausgelöst" wird, alle anderen Werte funktionieren.
Sobald für das betreffende Reading was anderes ausgewählt war, geht auch die "10".

ZitatWeiterhin steht ganz vorn im webif eine "1", und ich weiss nicht wo diese herkommt,
Schätze, das ist "state"?

Zitat
und ich hätte vor den DropDown Menüs gerne eien Bezeichnung stehen.

Beispiel (auch mit der Option, IsDisabled() abzufragen, siehe meine Anmerkung in https://forum.fhem.de/index.php/topic,128070.msg1225588.html#msg1225588):
defmod Beregnung.manuell dummy
attr Beregnung.manuell group Schalter-Schalter
attr Beregnung.manuell icon sani_irrigation
attr Beregnung.manuell readingList 1 2 3 4 5 6
attr Beregnung.manuell room Bewässerung,Garten,Schalter
attr Beregnung.manuell setList active inactive 1:selectnumbers,10,10,60,0,lin 2:selectnumbers,10,10,60,0,lin 3:selectnumbers,10,10,60,0,lin 4:selectnumbers,10,10,60,0,lin 5:selectnumbers,10,10,60,0,lin 6:selectnumbers,10,10,60,0,lin
attr Beregnung.manuell webCmd 1:2:3:4:5:6
attr Beregnung.manuell webCmdLabel 1:2:3:4:5:6

setstate Beregnung.manuell inactive
setstate Beregnung.manuell 2022-06-21 10:35:52 1 20
setstate Beregnung.manuell 2022-06-21 10:38:05 2 10
setstate Beregnung.manuell 2022-06-21 10:38:14 3 30
setstate Beregnung.manuell 2022-06-21 10:36:47 state inactive


EDIT: Jetzt habe ich das mit dem "nicht auswählen können" auch verstanden, es geht darum, nicht zweimal nacheinander denselben Wert auswählen zu können, um den Prozess zu starten...

So sollte es gehen:
defmod Beregnung.manuell dummy
attr Beregnung.manuell group Schalter-Schalter
attr Beregnung.manuell icon sani_irrigation
attr Beregnung.manuell readingList 1 2 3 4 5 6
attr Beregnung.manuell room Bewässerung,Garten,Schalter
attr Beregnung.manuell setList active inactive 1:slider,10,10,60 2:slider,10,10,60 3:slider,10,10,60 4:slider,10,10,60 5:slider,10,10,60 6:slider,10,10,60
attr Beregnung.manuell webCmd 1:2:3:4:5:6
attr Beregnung.manuell webCmdLabel 1\
:2\
:3\
:4\
:5\
:6

setstate Beregnung.manuell inactive
setstate Beregnung.manuell 2022-06-21 10:56:51 1 10
setstate Beregnung.manuell 2022-06-21 10:57:46 2 10
setstate Beregnung.manuell 2022-06-21 10:38:14 3 30
setstate Beregnung.manuell 2022-06-21 10:36:47 state inactive
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

matze1999

ZitatEDIT: Jetzt habe ich das mit dem "nicht auswählen können" auch verstanden, es geht darum, nicht zweimal nacheinander denselben Wert auswählen zu können, um den Prozess zu starten...

Nein, eher

Sobald für das betreffende Reading was anderes ausgewählt war, geht auch die "10".

genau, ist die "10" im Dropdown Menü, kann diese nicht ausgewählt werden, erst eine ander Minutenzahl löst aus, aber man kann somit nicht zweimal die gleiche Minutenzahl hintereinander (im Abstand von Tagen) auslösen, sondern muss erst mal eine andere nehmen. Schöner wäre es, wenn standardmäßig, nach einer ausführung z.B. "0" drin stehen würde. Geht so etwas?

matze1999

Beta-User

Zitat von: matze1999 am 21 Juni 2022, 15:52:18
Schöner wäre es, wenn standardmäßig, nach einer ausführung z.B. "0" drin stehen würde. Geht so etwas?
"Prinzipiell" kennst du die Antwort: Ja, geht.
Die dropdown-Liste (oder den slider) zu ergänzen, bekommst du ohne Hilfe hin.

ABER: Wenn du nach dem Ablauf dann wieder ein "setreading" ausführst, hast du wieder einen Event => andere Anweisung (komplizierter), oder du must das "0-Event" gesondert vorab rausfiltern...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

matze1999

so habe ich die "0" drin

defmod Beregnung.manuell dummy
attr Beregnung.manuell group Schalter-Schalter
attr Beregnung.manuell icon sani_irrigation
attr Beregnung.manuell readingList 1 2 3 4 5 6
attr Beregnung.manuell room Bewässerung,Garten,Schalter
attr Beregnung.manuell setList active inactive 1:selectnumbers,0,10,60,0,lin 2:selectnumbers,0,10,60,0,lin 3:selectnumbers,0,10,60,0,lin 4:selectnumbers,0,10,60,0,lin 5:selectnumbers,0,10,60,0,lin 6:selectnumbers,0,10,60,0,lin
attr Beregnung.manuell webCmd 1:2:3:4:5:6


damit rauscht das notify (hoffentlich) einmal mit min. Werten durch, wenn 0 gewählt wurde.durch

defmod Beregnung_notify_1 notify Beregnung.manuell:.* {\
my @times;;\
my $wait;;\
my @slp;;\
\
my $read = $EVTPART0;;\
chop $read;;\
for my $nr (1..6){\
    if ( $nr ne $read ) {\
           $times[$nr] = 30;;\
    } elsif ( ($nr eq $read) && ($EVTPART1 != 0) ) {\
           $times[$nr] = $EVTPART1*60;;\
    } else { \
           $times[$nr] = 30;;\
    }        \
    $wait = $times[$nr]+300;;\
    $slp[$nr]   = qq{sleep $wait HUEDevice8 quiet};;\
    $times[$nr] = qq{set HUEDevice8 on-for-timer $times[$nr]};;\
}\
fhem("$times[1];;$slp[1];;$times[2];;$slp[2];;$times[3];;$slp[3];;$times[4];;$slp[4];;$times[5];;$slp[5];;$times[6]");;\
}


Leider bekomme ich es irgendwie nicht hin, dass wenn "0" gewählt wurde, das notify einfach beendet wird, um dann neu auszuwählen.

matze1999

matze1999

#20
dann doch lieber so:

defmod Beregnung_notify_1 notify Beregnung.manuell:.* { if ($EVTPART1 != 0) {\
my @times;;\
my $wait;;\
my @slp;;\
\
my $read = $EVTPART0;;\
chop $read;;\
for my $nr (1..6){\
    if ( $nr ne $read ) {\
           $times[$nr] = 30;;\
    } else  {\
           $times[$nr] = $EVTPART1*60;;\
    }        \
    $wait = $times[$nr]+300;;\
    $slp[$nr]   = qq{sleep $wait HUEDevice8 quiet};;\
    $times[$nr] = qq{set HUEDevice8 on-for-timer $times[$nr]};;\
}\
fhem("$times[1];;$slp[1];;$times[2];;$slp[2];;$times[3];;$slp[3];;$times[4];;$slp[4];;$times[5];;$slp[5];;$times[6]");;\
}}\


Damit nach der ausführung wieder die "0" im Dropdown Menü steht, müsste ich jetzt noch irgendwo ein

chop $read;;\
for my $nr (1..6){\
{\
fhem (setreading $nr 0)\
}\


einfügen

matze1999

Beta-User

Zitat von: matze1999 am 21 Juni 2022, 16:22:07
Leider bekomme ich es irgendwie nicht hin, dass wenn "0" gewählt wurde, das notify einfach beendet wird, um dann neu auszuwählen.

Wenn du es in Worten beschreiben kannst, sollte es auch zu vercoden gehen, nämlich genau so - "wenn 0 ausgewählt => mache nichts". Das ist (in der kürzest möglichen Fassung):
return if !$EVTPART1;;\

Komplett mit "reset" am Ende:
defmod Beregnung_notify_1 notify Beregnung.manuell:.* {\
return if !$EVTPART1;;\
my @times;;\
my $wait;;\
my @slp;;\
\
my $read = $EVTPART0;;\
chop $read;;\
for my $nr (1..6){\
    if ( $nr ne $read ) {\
           $times[$nr] = 30;;\
    } elsif ( $nr eq $read ) {\
           $times[$nr] = $EVTPART1*60;;\
    } else { \
           $times[$nr] = 30;;\
    }        \
    $wait = $times[$nr]+300;;\
    $slp[$nr]   = qq{sleep $wait HUEDevice8 quiet};;\
    $times[$nr] = qq{set HUEDevice8 on-for-timer $times[$nr]};;\
}\
fhem("$times[1];;$slp[1];;$times[2];;$slp[2];;$times[3];;$slp[3];;$times[4];;$slp[4];;$times[5];;$slp[5];;$times[6];;setreading $NAME $read 0");;\
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

matze1999

#22
da fehlen mir einfach die Vokabeln in Perl, um meine Ausführungen einfach zu übersetzen:

return if !$EVTPART1;;\

$NAME $read

$NAME ist das Dummy Device? und müsste $read nicht innerhalb der for Schleife stehen und eigentlich hätte nach meinem Verständnis $read nur einen Wert?

Danke!

matze1999

Beta-User

Zitat von: matze1999 am 21 Juni 2022, 16:51:09
da fehlen mir einfach die Vokabeln in Perl, um meine Ausführungen einfach zu übersetzen:
Jo. Deswegen machen wir ja die Vokabelübung hier ;) .

Zitat
$NAME ist das Dummy Device?
Wie $NAME im Kontext von notify interpretiert wird, steht in der ziemlich übersichtlichen commandref zu dem Modul.
Bitte die Vokabel da selbst nachschlagen :P .

Zitat
und müsste $read nicht innerhalb der for Schleife stehen und eigentlich hätte nach meinem Verständnis $read nur einen Wert?
$read wird nur einmal verändert, und ja, es hat genau einen Wert. Die letzte Anweisung heißt übersetzt:
"Setze den Wert des auslösenden Readings nach dem Durchlauf der kompletten 'sleep'-Schleife wieder auf 0".

Du musst das aber nicht dynamisch machen und könntest auch wahllos "alle readings" auf "0" setzen, oder die Zeile ziemlich zu Anfang reinfrickeln, oder...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

matze1999

noch eine Frage,

könnte ich für ein Ventil über ein elseif die  $wait = $times[$nr]+300;;\ auf  $wait = $times[$nr]+600;;\ erhöhen, wo müsste ich das einfügen sicher nach der Zeile $slp[$nr]   = qq{sleep $wait HUEDevice8 quiet};;\

matze1999

Beta-User

Zitat von: matze1999 am 21 Juni 2022, 21:49:11
sicher nach der Zeile $slp[$nr]   = qq{sleep $wait HUEDevice8 quiet};;\
Wieso denn "nach" dieser Zeile?!? Da ist "der Fisch doch geputzt" (also der _extrapolierte_ Text in das Array geschrieben)...
Das muss selbstverständlich vorher passieren, damit $wait zum Zeitpunkt der Extrapolation den erwünschten Wert hat ;) .

Selbst austesten (statt fhem eine Log-Anweisung?) wäre hilfreich, um in diese Zusammenhänge erst mal reinzufinden. Wenn man das an eher mittel-schwierigen Beispielen wie hier versucht zu lernen, ist das eher suboptimal...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

matze1999

Hallo,

war nicht mehr nötig, deshalb habe ich es nicht weiter verfolgt, einzelne $wait Zeiten zuzuordnen.

Vielen Dank nochmal

matze1999


matze1999

ich habe mir überlegt, mit der Dokumentation der aktuellen Ventilstellung noch weiter "vorn" anzufangen, nämlich im Ventil Device selbst, dazu habe ich mir folgendes überlegt:

im Ventil Device ein userreading anzulegen, das bei jeder Ventilöffnung eins hoch zählt bis 6 und dann wieder von vorn. Damit hätte ich auch das manuelle Öffnen am Ventil abgefangen.

dieses userreading kann ich dann überall nutzen, um den Zustand abzufragen.

Das muss ich nur noch irgendwie umsetzen.

matze1999


Beta-User

In die Richtung userReadings hatte ich auch erst überlegt, glaube aber zum einen nicht, dass das vorbehaltslos zielführend ist (welche Bedingungen könnten wann geprüft werden?), und zum anderen, dass es nicht hin und wieder nötig sein wird, das manuell auf einen korrigierten Wert zu setzen (was aber ein userReadings nicht ausschließen würde).

Meine Idee wäre gewesen, das vor/bei jeder Anweisung "nimm das nächste Ventil" (= die kurzen "Zwischensleeps"?) per setreading zu setzen, der Ablauf der Frist wäre dann der "trigger" für die nächste Prüfung, ob gleich (überhaupt) weitergeschaltet werden muss, bzw. wie lange dann dieser Kreis bewässert werden soll. So kannst du dann "im Prinzip" endlos weitermachen, bis halt dann wieder alle "solange soll bewässert werden"-Angaben auf allen Kreisen dann "0" sind.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

matze1999

das ist relativ simple, der Trigger ist der state vom Bewässerungs Device:

nternals:
   DEF        8  IODev=CONBEE
   FUUID      62af1ee1-f33f-214e-00c7-f981d442d0bde8d0
   FVERSION   31_HUEDevice.pm:0.260120/2022-05-01
   ID         8
   INTERVAL   
   IODev      CONBEE
   NAME       HUEDevice8
   NR         472
   STATE      off
   TYPE       HUEDevice
   desired    0
   eventCount 2245
   has_events 1
   lastannounced 2022-06-19T13:11:06Z
   manufacturername _TZ3210_eymunffl
   modelid    TS0101
   name       Bewässerung
   type       Smart plug
   uniqueid   84:ba:20:ff:fe:40:36:40-01
   READINGS:
     2022-06-29 19:24:44   IODev           CONBEE
     2022-06-29 19:24:49   alert           none
     2022-07-01 08:38:05   lastseen        2022-06-29T03:47Z
     2022-07-01 05:27:30   onoff           0
     2022-07-01 05:27:30   pct             0
     2022-07-01 05:22:01   reachable       1
     2022-07-01 05:27:30   state           off
   helper:
     alert      none
     battery    -1
     bri        -1
     colormode 
     ct         -1
     devtype   
     dynamics_status
     effect     
     hue        -1
     lastseen   
     mode       
     on         0
     pct        0
     reachable  1
     rgb       
     sat        -1
     update_timeout -1
     v2effect   
     xy         
     helper:
     json:
       etag       4523f3239def3bf329a852772cb97135
       lastannounced 2022-06-19T13:11:06Z
       lastseen   2022-06-29T03:47Z
       manufacturername _TZ3210_eymunffl
       modelid    TS0101
       name       Bewässerung
       swversion 
       type       Smart plug
       uniqueid   84:ba:20:ff:fe:40:36:40-01
       state:
         alert      none
Attributes:
   IODev      CONBEE
   alexaName  Bewässerung
   alias      Bewässerung
   color-icons 2
   devStateIcon {(HUEDevice_devStateIcon($name),"toggle")} :sani_water_tap
   group      HUEDevice
   icon       sani_sprinkling
   model      TS0101
   room       Bewässerung,Garten,HUEDevice


kann mann perl code in userreadings einbinden (es geht um das "hochzählen bis 6"?

matze1999