Moin moin alle miteinander!
ich bin derzeit etwas unschlüssig, wie ich mein Ziel verfolgen muss.
Aufgabenstellung ist, dass die Steckdosen 1,2,3 und 4 nacheinander geschaltet werden. Nacheinander bezeichnet eine Zeit die für jedes Intervall unterschiedlich sein soll.
S* = Steckdose, t* = Time
switch.on --> S1.on --> t1 --> S2.on --> t2 --> S3.on --> t3 --> S4.on;
switch.off --> S4.off --> t4 --> S3.off --> t4 --> S2.off --> t4 --> S1.off;
Bedient wird es über die TouchUI und dafür habe ich einen dummy angelegt, der über das WebInterface geschaltet (switch) wird.
Ich habe mich schon mit doif, watchdog und notify auseinandergesetzt, jedoch bin ich der Ansicht, dass keins dieser functions die richtige ist. Gibt es ggf auch eine Möglichkeit das als Script zu erstellen und das ganze so zu realisieren? Diesbezüglich habe ich schon die Erweiterung 'lambda-script' gefunden. Diesen Ansatz habe ich aber nicht wirklich verfolgt, da ich für mich noch keinen sinnigen Ansatz gefunden habe, auf dem aufgebaut werden kann.
Wenn ich weiß, wie der Weg aussehen kann, sollte die Umsetzung für mich einfacher sein. Ich möchte ungern von Anfang an eine falschen Ansatz verfolgen und später alles abändern.
Ich hoffe ich konnte mich verständliche ausdrücken. Falls ja, vielen Dank im Vorhinein!
Mfg
Julian
Hi,
da gibt es zig Möglichkeiten
Hier eine für on und off mit gleichen Zeiten, die Zeiten stehen da symbolisch, die sind in sekunden einzutragen. Einfach mit FHEM sleep die Kette aufbauen.
define n_switch notify switch:on|switch:off set S1 $EVENT;;sleep t1;;set S2 $EVENT;;sleep t2;;set S3 $EVENT;;sleep t3;;set S4 $EVENT
Gruß Otto
Warum soll das nicht mit einem einfachen notify gehen?
defmod nTouchOn notify TouchDummy:on set S1 on;; sleep t1;; set S2 on;; sleep t2;; set S3 on;; sleep t3;; set S4 on
Für off entsprechend...
...oder eben mit Perl und dann halt if(on) bzw. if(off)...
Oder DOIF mit wait (kann ich aber nicht helfen als nicht DOIF-Nutzer)...
EDIT: ja oder so... ;)
Gruß, Joachim
@Joachim nimm zwei ;) ; beim define
Kommt doch drauf an wo man das reinwirft, in der Kommandozeile ja, über den "Raw-Editor" braucht man sie doch nicht verdoppeln.
Widerspruch, wenn ich eine define Zeile schreibe müssen es zwei sein. Sonst entsteht gerade in dieser Konstellation etwas völlig anderes!
Probier es aus. ;D Die Kette mit den sleep Befehlen würde sofort ausgeführt und erscheint nicht im notify.
ZitatProbier es aus
::) Ok, nicht weiter gedacht 8), hatte ich zuvor, aber nicht angeschaut was erstellt wurde, sondern nur darauf "gehört" (Sprachausgabe) :P das ein Gerät angelegt wurde.
Das mit den Strichpunkten is mir zu viel... ;)
Aber im DEF des notify sind es auch nur einfache...
...und normalerweise lagere ich quasi alles in subs aus, da isses auch nur einer... :)
Mit defmod müsste es doch auch wieder passen!?
Gruß, Joachim
Zitat von: juba3006 am 29 April 2021, 22:33:16
Gibt es ggf auch eine Möglichkeit das als Script zu erstellen und das ganze so zu realisieren? Diesbezüglich habe ich schon die Erweiterung 'lambda-script' gefunden.
Vorneweg: Vermutlich ist das mit dem sleep von Otto123 die Lösung, die du haben willst.
Falls du wirklich in Richtung scripting gehen willst, würde ich empfehlen, das mit "Bordmitteln" zu erledigen, und das ist Perl! Um "lambda-script" ist es sehr ruhig geworden...
Perl wäre z.B. eine mögliche richtige Wahl, wenn du zwischendurch die weiteren Dauern berechnen wolltest/müsstest, also erst nach Ablauf des ersten Timers ermitteln willst, wie lange denn eigentlich der 2. sein soll (usw.).
Falls (!) du sowas brauchst, wäre "rekursiver Aufruf" (z.B. über ein "defmod ... at ...") dein Freund, Beispiele sollten unter dem Stichwort "Dimmer" oder "Sonnenaufgang" zu finden sein, und eine grundsätzliche Anleitung zum Aufruf von eigenen Perl-Funktionen im Wiki unter "99_myUtils anlegen" und den Perl-specials in der commandref.
Zitat von: MadMax-FHEM am 30 April 2021, 07:21:25
Mit defmod müsste es doch auch wieder passen!?
Nein, define und defmod sind vom weiteren syntax her 100% identisch. defmod meckert nicht wenn das Gerät schon existiert - ist mWn der einzige Unterschied :)
Und wenn man in dem notify von oben die DEF öffnet und dies in das Editorfenster reinwirft (nicht in die Raw Definition!), wäre es ev. das Perlscript an das Beta-User und der TE gedacht hat :)
Nicht getestet! Kann Spuren von Fehlern enthalten!
Edit: Und Einer fällt mir jetzt bei durchlesen auf: die sleep werden zur gleichen zeit erzeugt, die Zeiten bauen im Gegensatz zu dem Oben nicht aufeinander auf!
switch:on|switch:off {
my @dev=qw(S1 S2 S3 S4);
my @time;
if ($EVENT eq "on") {
$time[0]=12;
$time[1]=15/2;
$time[2]=$time[1]*2;
} else {
$time[0]=4;
$time[1]=5;
$time[2]=6;
}
fhem("set $dev[0] $EVENT")
for (@time){
fhem("sleep $time[$_]; set $dev[$_+1] $EVENT")
}
}
Oder man packt den Code zwischen den {} in die 99_myUtils.pm als sub switch {} und schreibt im DEF Editorfenster einfach switch:on|switch:off {switch}
Zitat von: Otto123 am 30 April 2021, 09:07:01
Nein, define und defmod sind vom weiteren syntax her 100% identisch. defmod meckert nicht wenn das Gerät schon existiert - ist mWn der einzige Unterschied :)
Überzeugt... ;)
...und geändert 8)
Drum packe ich bei mir (fast) alles in eine Sub.
- nur ein Platz wo ich das dann habe
- Mehrfachverwendung für mehrere notify etc.
- ändern ohne config-Fragezeichen etc.
- und Strichpunkte "ganz normal" :)
Gruß, Joachim
Moin
Das ist je unglaublich, wie schnell eine Antwort kam. Damit rechnete ich nicht. Vielen Dank!
Vorweg einmal, war mich nicht geläufig, dass ich die Aufgabe so einfach mit notify abwickeln kann. Ich habe da wohl einiges in den commandref missverstanden.
Um so mehr freut es mich, dass es diese Möglichkeit gibt!
Nun zur Umsetzung. Gestern erprobte ich nun den "Code-Schnipsel" von "Otto123". Das funktionierte auf Anhieb. Da On/Off bei mir unterschiedlich sind, habe ich zwei notifies angelegt.
Jetzt zum Problem. Es ist so, dass wenn ich den Befehl abbrechen will, weil ich ausversehen den Switch anklickte, so ist ein Abbruch des "On" nicht möglich.
Als Lösungsansatz versuche ich in den Off notify ein cancel XYZ einzubauen um so die Aktion des On ab zu brechen. Natürlich bekamen die sleep eine ID --> sleep 2 XYZ
Das funktionierte bei mir nicht. Nach der Änderung war ein Einschalten des On notify nicht mehr möglich.
@Otto123
Genau sowas habe ich mir vorgestellt. Ich bin kein freund von einzeilern und bin auch im Bereich von Perl unbewandert (kann ja noch werden).
ZitatAls Lösungsansatz versuche ich in den Off notify ein cancel XYZ einzubauen
Wenn Du deinen Versuch zeigen würdest?
Moin
Natürlich:
define AnlageOn notify HiFiAnlage:on set Shelly25_05 $EVENT;;sleep 30 AMPon;;set Shelly25_05_CH2 $EVENT;;sleep 6 AMPon;;set Shelly25_04_CH2 $EVENT;;sleep 2 AMPon;;set Shelly25_04 $EVENT
define AnlageOff notify HiFiAnlage:off cancel AMPon;;set Shelly25_04_CH2 $EVENT;;sleep 2;;set Shelly25_05_CH2 $EVENT;;sleep 2;;set Shelly25_05 $EVENT;;sleep 2;;set Shelly25_04 $EVENT
Ich denke Dein Code ist richtig. Ich habe das genauso bei mir getestet und das funktioniert wie gedacht.
???