Hallöchen,
stehe mal wieder auf dem Schlauch.
Möchte mit einem Befehl starten und nach Ablauf einer gewissen Zeit den nächsten Befehl starten usw.
Konkret die Gartenbewässerung.
Jedes "Gerät" soll für eine bestimmte Zeit aktiv sein und sich danach auschalten .
Mein Konstrukt sieht zZeit so aus. Leider werden alle 3 Gräte zur gleichen Zeit aktiviert :-(( (Da reicht der Wasserdruck nicht aus)
Der Ablauf startet mit einem Notify wenn die Hauptbewässerung abgeschaltet wird.
define Restbewaesserung_an notify Gartenwasser:.*off* {
fhem("delete Gartenwasser_off");
fhem("set stellantrieb_garten_1 valve 50; define Uhr_Wasser1_aus at +00:02:00 {
set stellantrieb_garten_1 valve 0; set stellantrieb_garten_2 valve 100; define Uhr_Wasser2_aus at +00:02:00 { set stellantrieb_garten_2 valve 0; set stellantrieb_garten_3 valve 100; define Uhr_Wasser3_aus at +00:02:00 set Gartenwasseraus on}}");
}
Kann mir Jemand helfen?
Danke Kai-Uwe
Hi,
Du könntest das Konstrukt durch "sleep" ersetzen. (Sleep ist innerhalb fhem nonblocking).
set stellantrieb_garten_1 valve 50; sleep 120; set stellantrieb_garten_1 valve 0; set stellantrieb_garten_2 valve 100; sleep 120
....
vg
jörg
Ah, ein weiteres Opfer der hier beliebten Cargocult-Schreibweise, die wahllos Klammern und übeflüssige {fhem(" einfügt, "weil man das so macht".
Seufz.
So (Einzeiler)
define Restbewaesserung_an notify Gartenwasser:.*off* {fhem("delete Gartenwasser_off ;; set stellantrieb_garten_1 valve 50 ;; define Uhr_Wasser1_aus at +00:02:00 set stellantrieb_garten_1 valve 0 ;;;; set stellantrieb_garten_2 valve 100 ;; define Uhr_Wasser2_aus at +00:04:00 set stellantrieb_garten_2 valve 0 ;;;; set stellantrieb_garten_3 valve 100 ;; define Uhr_Wasser3_aus at +00:06:00 set Gartenwasseraus on")}
müsste es gehen.
Beachte die notwendigen Escapes.
Ich erspare mir längere Erklärungen, da ich im Moment eine Hand verbunden habe und nicht gut tippen kann. Wenns prinzipielle Fragen gibt, dann Frag, versuchs aber erstmql zu verstehen bitte.
Auch diese Ebene
{fhem("..." )}
ist übrigens streng genommen überflüssig.
folgendes müsste(TM) auch gehen:
define Restbewaesserung_an notify Gartenwasser:.*off* delete Gartenwasser_off ;; set stellantrieb_garten_1 valve 50 ;; define Uhr_Wasser1_aus at +00:02:00 set stellantrieb_garten_1 valve 0 ;;;; set stellantrieb_garten_2 valve 100 ;; define Uhr_Wasser2_aus at +00:04:00 set stellantrieb_garten_2 valve 0 ;;;; set stellantrieb_garten_3 valve 100 ;; define Uhr_Wasser3_aus at +00:06:00 set Gartenwasseraus on
Naja wenn ich mir die 4fach Semikolons angucke dann lieber fhem(..);!
Hallo,
aber auch im Teil mit fhem(" hat es ;;;;
;)
Grüße
:-) Nun, dass muss aber nicht :-)
Klar muss es. Bei defines in defines muss man doppelt escapen. Ob man da noch eine überflüssige FEHM->perl->FEHM Verschachtelung einbaut ist egal.
Sonst schalten die wieder alle gleichzeitig. trotz {fhem("
Hat mich letzte Woche 2 Stunden gekostet.... :o
Danke für die Tips.
Die "Vierfach-Semikolons" hatte ich lange nicht mehr. ;)
Wenn man im define ein define macht in dem ein define ist, muss man 8fach Escapen!
Wenns hier mal einen Wettbewerb gibt , der heisst: " der seltsamste Code der eine sinnvolle Funktion hat", dann bring ich das. ;D
Z.B. so, sollte das selbe machen wie oben, nur werden die nachfolgenden defines erst später definiert:
define Restbewaesserung_an notify Gartenwasser:.*off* delete Gartenwasser_off ;; set stellantrieb_garten_1 valve 50 ;; define Uhr_Wasser1_aus at +00:02:00 set stellantrieb_garten_1 valve 0 ;;;; set stellantrieb_garten_2 valve 100 ;;;; define Uhr_Wasser2_aus at +00:02:00 set stellantrieb_garten_2 valve 0 ;;;;;;;; set stellantrieb_garten_3 valve 100 ;;;;;;;; define Uhr_Wasser3_aus at +00:02:00 set Gartenwasseraus on
Ist natürlich... suboptimal, schon weil ich diese Version für inherent unsicherer halte, da in der Ersten das AUSCHALTEN gleich zu Anfang mit angelegt wird. Das finde ich besser (auch ein Grund, warum ich es der sleep-variante vorziehen würde).
sleep wird doch intern in ein at übersetzt. Ich persönlich halte die die Lesbarkeit (Wartbarkeit) bei den verschachtelten defines nicht so hoch - aber: timtowtdi 8)
vg
jörg
Hallo,
da lob ich mir doch die Möglichkeit sowas über Macros zu realisieren ;)
Grüße
Zitat von: herrmannj am 30 Mai 2014, 22:11:53
sleep wird doch intern in ein at übersetzt. Ich persönlich halte die die Lesbarkeit (Wartbarkeit) bei den verschachtelten defines nicht so hoch - aber: timtowtdi 8)
vg
jörg
Sehe ich auch so.
Man könnte auch ein Wettbewerb veranstalten - wer schafft die meisten Semikolons :) Oder anders herum: wer kommt ohne aus.
Ich würde es schaffen z. B.
ohne Perl und ohne Code auszulagern, nur mit FHEM-Befehlen den Konstrukt:
define Restbewaesserung_an notify Gartenwasser:.*off* delete Gartenwasser_off ;; set stellantrieb_garten_1 valve 50 ;; define Uhr_Wasser1_aus at +00:02:00 set stellantrieb_garten_1 valve 0 ;;;; set stellantrieb_garten_2 valve 100 ;;;; define Uhr_Wasser2_aus at +00:02:00 set stellantrieb_garten_2 valve 0 ;;;;;;;; set stellantrieb_garten_3 valve 100 ;;;;;;;; define Uhr_Wasser3_aus at +00:02:00 set Gartenwasseraus on
auch ohne ein einziges Semikolon zu schreiben ;)
Ob es allerdings schöner wäre, wage ich zu bezweifeln.
Gruß
Damian
Hallo,
ZitatIch würde es schaffen z. B. ohne Perl und ohne Code auszulagern, nur mit FHEM-Befehlen den Konstrukt:
Das wären ja dann Macros, oder hast du noch eine andere Möglichkeit?
Zitatauch ohne ein einziges Semikolon zu schreiben
Ok, das klappt bei mir nicht.
Die Zeilen in meinem define muss ich mit Semikolon abschliessen.
Grüße
wenn tippen im Moment nicht so mühsam wäre...
Schon du dich und schau das du wieder fit wirst ;)
wird wohl mindestens 4 wochen dauern leider.