[gelöst]Ablaufsteuerung mit Perl, wie?

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

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

mal eine Frage an die Experten, wie realisiert man am Besten eine Ablaufsteuerung.

Beispiel:

Ein Ventil soll abhängig von einer Vorgabe 1 - 5 mal für 2 Min öffnen und dann für eine  übergebene Zeit offen bleiben, danach noch einmal 2 - 6 mal für 2 min öffnen.

Hintergrund, ich habe einen Gardena Verteiler, wenn ich dort einzelne Stränge ansprechen möchte, muss ich die vorhergehenden für min. 2 Min öffnen, damit per Wasserdruck weiter geschaltet wird, am Ende muss ich dann wieder in die Ausgangsposition "fahren".

Ich möchte das gern automatisieren per Zeitsteuerung, aber auch die manuelle Auswahl eines Stranges und der benötigten Bewässserungszeit realisieren.

Meine ersten Gedanken waren, die Weiterschaltung mit "Blink" zu realisieren, danach dann das Ventil für die übergebene Zeit öffnen, und danach per Blink in die Ausgangspos. zurück fahren. Mein Problem ist das"danach" in FHEM zu realisieren.

Leider weiss ich nicht so recht, wie ich das in fhem mache.

matze1999

Beta-User

Vorschlag:
defmod Beregnung dummy
attr Beregnung readingList 1 2 3 4 5 6
attr Beregnung 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 webCmd :

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

Hinweise:
- der dummy hat gleich entsprechende Minuten-setter, damit muss dann aber der Doppelpunkt aus dem $EVTPART0 (=>chop)
- die sleep-Anweisung ist benannt, dann kann man die notfalls auch abbrechen (siehe https://forum.fhem.de/index.php/topic,128070.0.html), muss sich dann aber "irgendwo" merken, auf welcher Stufe man war.

(Irgendwie scheinen grade die Bewässerungscodes aus dem Boden zu schießen, siehe auch https://forum.fhem.de/index.php/topic,128087.msg1225451.html#msg1225451).

Das mit den arrays musst du dir nochmal ansehen, und Doppelposts sind nicht gerne gesehen (https://forum.fhem.de/index.php/topic,128110.0.html), ganz davon abgesehen, dass das andere keinen "aussagekräftigen Titel" hat und insgesamt eher in der "Perl für FHEM-User"-Ecke aufgehoben wäre (da gibt es auch bereits einige Infos zum Umgang mit arrays!)...

Ups, der andere Beitrag war doch vorhin noch Teil von diesem Post :o ...
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

Zitatund Doppelposts sind nicht gerne gesehen

Ups, der andere Beitrag war doch vorhin noch Teil von diesem Post :o ...

ich hatte zwischendurch einen neuen Thread mit eindeutigem Namen gestartet und den mod per PN gebeten diesen Beitrag zu löschen, weil ich nur meine Antworten löschen konnte.

Vielen Dank!

Folgende Fragen hätte ich dazu:

was bedeutet ;;\
und chop $read;;\
und vor allem
my $slp = q{sleep 300 HUEDevice8 quiet};;\

matze1999

matze1999

... folgende Fehlermeldung beim anlegen des notify:

Experimental aliasing via reference not enabled at (eval 11107) line 1.

matze1999

Beta-User

Die Formatierung ist für RAW-Import gedacht, da kommst dann sowas her:;;\

"chop" ist ein Befehl, um das letzte Zeichen zu entfernen (Event-Monitor beim Setzen über meine dummy-Version anschauen).
das mit dem "q" ist eine spezielle Form eines einfachen Anführungszeichens, siehe https://www.perlmonks.org/?node_id=401006.
Wollte mir Schreibarbeit sparen :) .

Was "hinten rauskommt", kannst du auch bequem mit einem Log-Befehl (statt fhem()) rausfinden ;) .

Zitat von: matze1999 am 20 Juni 2022, 13:01:56
... folgende Fehlermeldung beim anlegen des notify:

Experimental aliasing via reference not enabled at (eval 11107) line 1.
a) wie legst du den an? RAW-Import?
b) welche Perl-Version ist das bei dir? (ich hatte das unter aktuellem FHEM+Perl 5.32 getestet).
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

#5
Hallo,

ich hab das defmod komplett kopiert und in der Kommandozeile von fhem ausgeführt?

meine Perl Version: v.5.32.1
fhem version: 26155

ich hab jetzt mal über den eventmonitor ein notify angelegt udn das ganze o.g. komplett dort in der def eingetragen, sicher muss ich da so was wie ;;\ "übersetzemn"

/edit on

damit gehts jetzt

/edit off
matze1999

Beta-User

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

#7
noch nicht, sleep soll ja immer um 120 sec länger sein als der on-for-timer Wert, weil es sich sonst "überholt":
also das nächste on-for-timer soll 120 sec nach dem letzten on-for-timer aufgerufen werden.

matze

Beta-User

#8
Zitat von: matze1999 am 20 Juni 2022, 13:41:04
noch nicht, sleep soll ja immer um 120 sec länger sein als on-for-timer, weil es sich sonst "überholt":
also das nächste on-for-timer soll 120 sec nach dem letzten  on-for-timer aufgerufen werden.

matze
Anleitung: Bastel ein zweites Array für die sleep-Anweisungen (statt des festen Werts) und fülle auch das innerhalb der for-Schleife ;) .

Wenn du einen Versuch gemacht hast, schaue ich es mir gerne an, bitte als RAW posten (ganz unten in der Detailansicht).
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

#9
so mag ich das ;-)

so hab ich es jetzt, und es geht nicht:
defmod Beregnung_notify_1 notify Beregnung:.* {\
my @times;;\
my @wait;;\
my @slp;;\
\
\
my $read = $EVTPART0;;\
chop $read;;\
for my $nr (1..6){\
    if ( $nr ne $read ) {\
           $times[$nr] = 180;;\
           $wait[$nr] = $times[$nr]+120;;\
           $slp[$nr] = q{sleep $wait[$nr] MQTT2_DVES_6C3AB1_CH2 quiet};;\
    } else {\
           $times[$nr] = $EVTPART1*60;;\
           $wait[$nr] = $times[$nr]+120;;\
           $slp[$nr] = q{sleep $wait[$nr] MQTT2_DVES_6C3AB1_CH2 quiet};;\
    }\
}\
fhem("set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[1];;$slp[1];;set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[2];;$slp[2];;set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[3];;$slp[3];;set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[4];;$slp[4];;set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[5];;$slp[5];;set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[6]");;\
}


matze1999

Beta-User

Klar, dass es nicht geht :P , schau nach "Quotes in Perl" und dem Unterschied zwischen "q" und "qq"

Würde mal das hier ins Rennen werfen:
defmod Beregnung_notify_1 notify Beregnung:.* {\
my @times;;\
my $wait;;\
my @slp;;\
\
my $read = $EVTPART0;;\
chop $read;;\
for my $nr (1..6){\
    if ( $nr ne $read ) {\
           $times[$nr] = 180;;\
    } else {\
           $times[$nr] = $EVTPART1*60;;\
    }\
    $wait = $times[$nr]+120;;\
    $slp[$nr]   = qq{sleep $wait MQTT2_DVES_6C3AB1_CH2 quiet};;\
    $times[$nr] = qq{set MQTT2_DVES_6C3AB1_CH2 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]");;\
}
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,

habe das:

$times[$nr] = qq{set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[1]};;\

gegen das getauscht  8):

$times[$nr] = qq{set MQTT2_DVES_6C3AB1_CH2 on-for-timer $times[$nr]};;\

und teste jetzt.

matze1999

matze1999


Prof. Dr. Peter Henning

Die ideale Realisierung dieses System wäre mit einem Zustandsautomaten, der als digitaler Zwilling des Verteilers arbeitet. Wir hatten doch mal ein Modul in Arbeit, das beliebige Zustandsautomaten erzeugen können sollte - was ist daraus denn geworden?

Ansonsten würde ich das tatsächlich als Zustandsautomat in Perl realisieren.

LG

pah

Beta-User

Zitat von: Prof. Dr. Peter Henning am 20 Juni 2022, 16:09:34
Die ideale Realisierung dieses System wäre mit einem Zustandsautomaten, der als digitaler Zwilling des Verteilers arbeitet. Wir hatten doch mal ein Modul in Arbeit, das beliebige Zustandsautomaten erzeugen können sollte - was ist daraus denn geworden?
Soweit mir das in Erinnerung ist (war vor meiner Zeit), ist das im Sande verlaufen, am ehesten kommt dem wohl der Modulvorschlag von justme1968 namens "combine" am nächsten.

Zitat
Ansonsten würde ich das tatsächlich als Zustandsautomat in Perl realisieren.
Ich würde vermutlich $SELF bemühen und ein (paar?) Reading(s) an dem notify selbst setzen, damit man zumindest abgespeichert hat, wo das Ding zuletzt stand... Insgesamt ist das aber keine Hardware, die ich mir antun würde, es gibt mit Tobias "Modulfamilie" für die Bewässerung wohl nicht nur passende Software in FHEM, sondern auch Ventilsteuerungslösungen in Hardware (ich habe immer noch ein paar Pearl-Ventile rumliegen, die ich mal mit einem Stepper-Treiber verheiraten und an mein MySensors-Netz anbinden wollte...).

Zitat von: matze1999 am 20 Juni 2022, 14:34:50
gegen das getauscht...
Da warst du zu schnell mit dem Kopieren, das war mir dann auch aufgefallen...
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