FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kud am 29 Mai 2014, 18:06:36

Titel: Mehrere Befehle Etappenweise ausführen
Beitrag von: kud am 29 Mai 2014, 18:06:36
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
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: herrmannj am 29 Mai 2014, 19:28:35
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
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Zrrronggg! am 29 Mai 2014, 20:10:09
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




Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: P.A.Trick am 29 Mai 2014, 20:20:28
Naja wenn ich mir die 4fach Semikolons angucke dann lieber fhem(..);!
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Puschel74 am 29 Mai 2014, 20:24:10
Hallo,

aber auch im Teil mit fhem(" hat es ;;;;
;)

Grüße
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: P.A.Trick am 29 Mai 2014, 20:24:47
:-) Nun, dass muss aber nicht :-)
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Zrrronggg! am 29 Mai 2014, 20:25:27
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.
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: topfi am 29 Mai 2014, 20:28:07
Sonst schalten die wieder alle gleichzeitig. trotz {fhem("

Hat mich letzte Woche 2 Stunden gekostet....  :o
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: kud am 30 Mai 2014, 06:35:01
Danke für die Tips.
Die "Vierfach-Semikolons" hatte ich lange nicht mehr.  ;)
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Zrrronggg! am 30 Mai 2014, 19:24:17
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).
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag 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


Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Puschel74 am 30 Mai 2014, 22:13:29
Hallo,

da lob ich mir doch die Möglichkeit sowas über Macros zu realisieren  ;)

Grüße
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Damian am 30 Mai 2014, 22:23:53
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
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Puschel74 am 30 Mai 2014, 22:30:36
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
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Zrrronggg! am 30 Mai 2014, 23:46:39
wenn tippen im Moment nicht so mühsam wäre...
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Puschel74 am 30 Mai 2014, 23:51:25
Schon du dich und schau das du wieder fit wirst  ;)
Titel: Antw:Mehrere Befehle Etappenweise ausführen
Beitrag von: Zrrronggg! am 31 Mai 2014, 01:04:00
wird wohl mindestens 4 wochen dauern leider.