NotAus Funktion für Bewässerungsprogramm

Begonnen von foxmulder, 17 Juni 2022, 10:26:32

Vorheriges Thema - Nächstes Thema

foxmulder

Hallo zusammen,

ich möchte meine Bewässerung etwas anpassen und für die einzelnen Stränge einen "Not-Aus" mit einbauen.
Aktuell habe ich es so das die Stränge einzeln nacheinander geschalten werden. Ab und an kommt es jeoch vor das ich das Programm unterbrechen will...dafür soll der "Dummy NotAus" dienen.

Ich hab mir das so in etwa hier vorgestellt:


Gartenwasser_Autoprogramm:auto {
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserRasenSeite on ; sleep 1200 ; set WasserRasenSeite off ; sleep 3 ; set WasserRasenSeite off ; sleep 3 ; set HauptschalterWassser off") } ; sleep 5 ;
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserCarportRasen on ; sleep 750 ; set WasserCarportRasen off ; sleep 3 ; set WasserCarportRasen off ; sleep 3 ; set HauptschalterWassser off") } ; sleep 5 ;
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserCarportEcke on ; sleep 90 ; set WasserCarportEcke off ; sleep 3 ; set WasserCarportEcke off ; sleep 3 ; set HauptschalterWassser off") } ; sleep 5 ;
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserRasenStall on ; sleep 1080 ; set WasserRasenStall off ; sleep 3 ; set WasserRasenStall off ; sleep 3 ; set HauptschalterWassser off") } ; sleep 5 ;
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserWallRasenUnten on ; sleep 900 ; set WasserWallRasenUnten off ; sleep 3 ; set WasserWallRasenUnten off ; sleep 3 ; set HauptschalterWassser off") } ; sleep 5 ;
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserWallWaldseite on ; sleep 720 ; set WasserWallWaldseite off ; sleep 3 ; set WasserWallWaldseite off ; sleep 3 ; set HauptschalterWassser off") } ; sleep 5 ;
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserTropfschlauch on ; sleep 1800 ; set WasserTropfschlauch off ; sleep 3 ; set WasserTropfschlauch off ; sleep 3 ; set HauptschalterWassser off") }
}



Ich denke das sollte so auch korrekt sein oder?

Das Problem jedoch ist...das damit mir mein FHEM immer abstürzt...bzw. ewig lange hängt. Irgendwie ist das wohl nicht optimal. ;-)

Hat da jemand eine Idee wie man das besser lösen könnte?


Aktuell habe ich es so...halt ohne Notaus...da läuft das Programm einfach durch und macht keine Probleme.


Gartenwasser_Autoprogramm:auto {fhem("
set HauptschalterWassser on ; sleep 20 ; set WasserRasenSeite on ; sleep 1200 ; set WasserRasenSeite off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserCarportRasen on ; sleep 750 ; set WasserCarportRasen off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserCarportEcke on ; sleep 90 ; set WasserCarportEcke off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserRasenStall on ; sleep 1080 ; set WasserRasenStall off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserWallRasenUnten on ; sleep 900 ; set WasserWallRasenUnten off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserWallBlumen on ; sleep 900 ; set WasserWallBlumen off ; sleep 3 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserWallWaldseite on ; sleep 720 ; set WasserWallWaldseite off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserTropfschlauch on ; sleep 1800 ; set WasserTropfschlauch off ; sleep 10 ; set HauptschalterWassser off ; set Gartenwasser_Autoprogramm aus")}



Lieben Dank und Lg
Fox

Beta-User

Deine "alte" Version (von einem notify?!?) bräuchte eigentlich den "fhem"-Aufruf gar nicht. Es handelt sich also faktisch nur um fhem-sleep-Anweisungen.

In der neuen sind dagegen Perl-sleep drin... Die führen dann zum "hängen" => unbedingt vermeiden!

Wenn du sowas in den Hintergrund schubsen willst, um dann vor jedem nächsten Schritt wieder eine Bedingung zu prüfen, mußt du das tendenziell mit einem Timer machen.
Ich würde das vermutlich mit einem rekursiven Aufruf einer Perl-Routine lösen, die als erstes checkt, ob die Bedingung noch gegeben ist, um überhaupt was zu machen...
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

foxmulder

vielen Dank für die schnelle Antwort. :-)

Leider ist mein PERL eher mäßig ... BASH und Python ist eher meine Welt...

Hast du da nen paar Code Schnipsel wie ich das wie von dir beschrieben umsetzen könnte?

frober

Ich würde das zwar auch wie Beta-User machen, aber ein Fhem IF sollte auch machbar sein.

Schau Mal in der Comref bei IF, denn der Syntax ist mWn hier anders.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Beta-User

Zitat von: foxmulder am 17 Juni 2022, 11:31:31
Hast du da nen paar Code Schnipsel wie ich das wie von dir beschrieben umsetzen könnte?
....nicht direkt...

Zum einen gibt es von Rudi eine "garden.pl" in contrib, die mehr oder weniger komplett außerhalb FHEM läuft, vielleicht ist da die eine oder andere Anregung dabei.

Ansonsten hätte ich hier noch ein Beispiel für einen "rekursiven Aufruf" mit Abbruchbedingung aus meinen "myUtils":
#own code, see https://forum.fhem.de/index.php/topic,115722.msg1100046.html#msg1100046
sub myDimUp_PctToMax {
  my $name   = shift // return;
  my $maxval = shift // 100;
  my $remote = shift;
  my $remotestop = shift // '1003';

  my $pct = ReadingsNum($name, 'pct', 0) +3;
  if ($pct < 103 && ReadingsVal($remote, "state", "") ne $remotestop) {
    CommandSet(undef,"$name pct $pct");
    InternalTimer(gettimeofday()+0.25, sub(){myDimUp_PctToMax($name, $maxval, $remote, $remotestop)},'');
  }
  return;
}

Das ggf. aufzubohren ist halt was größeres...
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

foxmulder

Hmm... Ok... Das sieht alles recht komplex aus... :-\

Mir fällt noch was ein... Ist zwar nicht hübsch... Könnte aber einfacher sein und funktionieren...

Wenn ich für jeden Strang einen Dummy Schalter mit notify der prüft ob der notaus aktiv ist oder nicht und dann den Strang schaltet... Dann nen sleep da mit drin und aus das der den Strang auch wieder aus macht. .... Also ähnlich wie jetzt... Nur jeweils einzeln.

Und dann einen extra notify zum aktivieren des Programms... Wie jetzt.. Nur das dann die Dummy Schalter statt die Magnetventile direkt geschaltet werden....

Wisst ihr wie ich meine?

Hmm... Könnte klappen...

Beta-User

Es ist nicht wirklich komplex, und früher oder später kommst du um Perl bei FHEM nicht wirklich drumrum. Ergo: Pack' den Stier bei den Hörnern und vergiss das mit den vielen dummy-Instanzen am besten gleich wieder.

(Meine Meinung zu dummy bzw. zum Gebrauch des Moduls durch Einsteiger willst du nicht wissen...)
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

Jamo

#7
Hallo Fox,
die letzten sleep " sleep 5 ; " oben in deinem code sind blockierend, da danach kein fhem-befehl mehr kommt. Wenn Du die rausmachst sollte es erstmal gehen. Das sollte aber auch eine Fehlermeldung im logfile gegeben haben.

Desweitern kannst Du die sleep alle "named" machen, also anstelle von "sleep 1200;" -> "sleep 1200 Temp_0/1/2/3".

Dann kannst du mit deinem Notaus die gaze ausführung wie folgt unterbrechen, indem Du die sleep cancel'st: my $maxNum         = 14; # hier die Anzahl der sleep
foreach my $num (0..$maxNum) {fhem ("cancel Temp_$num quiet")}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

Beta-User

Das mit den benannten (fhem-) sleep ist eine gute Idee. Es müßte sogar möglich sein, das ganze immer mit demselben Namen zu belabeln, so dass ein "einfaches" cancel für das Notaus-Event ausreichen sollte (oder eben cancel mit devspec, das könnte auch klappen).
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

foxmulder

Klingt gut...
Das würde man dann in die myutils mit einbauen.. Richtig?
Damit hab ich leider noch nix gemacht... Wie spreche ich das dann in dem Notify an?

Sorry... Da bin ich echt noob... :-\

Jamo

... die weiteren Temp_x muss Du noch einbauen. Das notify ist unten im code.
Gartenwasser_Autoprogramm:auto {
  if ( ReadingsVal("GartenwasserAutomatik_Notaus","state","nA") eq "inaktiv") {
    fhem("set HauptschalterWassser on");
    fhem("sleep 20 Temp_0; set WasserRasenSeite on ;      sleep 1200 Temp_1; set WasserRasenSeite off ; sleep 3 Temp_2; set WasserRasenSeite off ; sleep 3 Temp_3; set HauptschalterWassser off");
    fhem("sleep 20 Temp_4; set WasserCarportRasen on ;    sleep 750 Temp_5; set WasserCarportRasen off ; sleep 3 Temp_6; set WasserCarportRasen off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_8; set WasserCarportEcke on ;     sleep 90 Temp_9; set WasserCarportEcke off ; sleep 3 ; set WasserCarportEcke off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_12; set WasserRasenStall on ;     sleep 1080 ; set WasserRasenStall off ; sleep 3 ; set WasserRasenStall off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_14; set WasserWallRasenUnten on ; sleep 900 ; set WasserWallRasenUnten off ; sleep 3 ; set WasserWallRasenUnten off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_16; set WasserWallWaldseite on ;  sleep 720 ; set WasserWallWaldseite off ; sleep 3 ; set WasserWallWaldseite off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_20; set WasserTropfschlauch on ;  sleep 1800 ; set WasserTropfschlauch off ; sleep 3 ; set WasserTropfschlauch off ; sleep 3 ; set HauptschalterWassser off");
  }
}

define NotAus_n notify GartenwasserAutomatik_Notaus:inaktiv {
  my $maxNum  = 24; # hier die Anzahl der sleep
  foreach my $num (0..$maxNum) {fhem ("cancel Temp_$num quiet")}}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

foxmulder

Aaaahhhh... Ok... Jetzt verstehe auch ich das... 🙈👍😁

Super toll! Wusste nicht das sowas möglich ist... Das werde ich morgen direkt mal testen.

Habt vielen Dank! Ich werde berichten.

frober

#12
Zitat von: Jamo am 18 Juni 2022, 22:10:40
... die weiteren Temp_x muss Du noch einbauen. Das notify ist unten im code.
Gartenwasser_Autoprogramm:auto {
  if ( ReadingsVal("GartenwasserAutomatik_Notaus","state","nA") eq "inaktiv") {
    fhem("set HauptschalterWassser on");
    fhem("sleep 20 Temp_0; set WasserRasenSeite on ;      sleep 1200 Temp_1; set WasserRasenSeite off ; sleep 3 Temp_2; set WasserRasenSeite off ; sleep 3 Temp_3; set HauptschalterWassser off");
    fhem("sleep 20 Temp_4; set WasserCarportRasen on ;    sleep 750 Temp_5; set WasserCarportRasen off ; sleep 3 Temp_6; set WasserCarportRasen off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_8; set WasserCarportEcke on ;     sleep 90 Temp_9; set WasserCarportEcke off ; sleep 3 ; set WasserCarportEcke off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_12; set WasserRasenStall on ;     sleep 1080 ; set WasserRasenStall off ; sleep 3 ; set WasserRasenStall off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_14; set WasserWallRasenUnten on ; sleep 900 ; set WasserWallRasenUnten off ; sleep 3 ; set WasserWallRasenUnten off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_16; set WasserWallWaldseite on ;  sleep 720 ; set WasserWallWaldseite off ; sleep 3 ; set WasserWallWaldseite off ; sleep 3 ; set HauptschalterWassser off");
    fhem("sleep 20 Temp_20; set WasserTropfschlauch on ;  sleep 1800 ; set WasserTropfschlauch off ; sleep 3 ; set WasserTropfschlauch off ; sleep 3 ; set HauptschalterWassser off");
  }
}

define NotAus_n notify GartenwasserAutomatik_Notaus:inaktiv {
  my $maxNum  = 24; # hier die Anzahl der sleep
  foreach my $num (0..$maxNum) {fhem ("cancel Temp_$num quiet")}}


Wenn ich keinen Denkfehler habe, laufen so alle Kreise gleichzeitig.
Das müsste doch alles in ein fhem()...

...und ich würde den Hauptschalter nur ein und am Ende wieder ausschalten, bzw  mit dem Notaus.

P.S. deine Kreise werden bei einem Notaus auch nicht abgeschaltet. Dafür mute man wahrscheinlich prüfen, welches named sleep aktive ist.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Beta-User

#13
Zitat von: Beta-User am 18 Juni 2022, 13:17:59
Es müßte sogar möglich sein, das ganze immer mit demselben Namen zu belabeln, so dass ein "einfaches" cancel für das Notaus-Event ausreichen sollte
Scheint untergegangen zu sein...

Beispiel:
defmod n1_Jalousie_Mitte notify Jalousie_Mitte:scene_14:.0 set Jalousie_Mitte dim 70;;sleep 1 Jalousie_Mitte quiet;; set Jalousie_Links,Jalousie_Rechts dim 0;;sleep 1 Jalousie_Mitte quiet;;set Jalousie_Mitte positionSlat 50;;sleep 1 Jalousie_Mitte quiet;;set Jalousie_Links,Jalousie_Rechts positionSlat 50

Das geht auch ohne myUtils, aber es muss schon alles in eine fhem()-Anweisung.

Eine Anleitung zur Übergabe von notify usw. an myUtils ist im Wiki zu "99_myUtils" zu finden.
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

frober

#14
Zitat von: Beta-User am 19 Juni 2022, 09:10:33
Scheint untergegangen zu sein...

Beispiel:
defmod n1_Jalousie_Mitte notify Jalousie_Mitte:scene_14:.0 set Jalousie_Mitte dim 70;;sleep 1 Jalousie_Mitte quiet;; set Jalousie_Links,Jalousie_Rechts dim 0;;sleep 1 Jalousie_Mitte quiet;;set Jalousie_Mitte positionSlat 50;;sleep 1 Jalousie_Mitte quiet;;set Jalousie_Links,Jalousie_Rechts positionSlat 50

Das geht auch ohne myUtils, aber es muss schon alles in eine fhem()-Anweisung.

Eine Anleitung zur Übergabe von notify usw. an myUtils ist im Wiki zu "99_myUtils" zu finden.

Ist bei mir nicht untergegangen  ;), nur habe ich so keine Idee, wie man den Kreis beim Notaus abschaltet.
Aktuell wir ja nur die Befehlsfolge unterbrochen, das Wasser läuft weiter...

Mit unterschiedlichen wäre das so in etwa beim Notaus möglich
set WasserRasenSeite off if $sleepers{"Temp_1"}

#foxmulder willst du zu jeder Zeit abbrechen oder nur zw. den Kreisen? D.h. der aktuelle Kreis läuft fertig, dann wird abgebrochen...
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Jamo

ZitatScheint untergegangen zu sein...
Nein, das war mir auch nicht untergegangen. Aus der commandref: A sleep with an <id> will replace a sleep with the same <id> and can be canceled by cancel.
Weil der Kandidat hier mit 5 parallelen zweigen arbeitet, benötigt man für jeden zweig eigene named sleep.
Innerhalb der einzelnen Zweige, bei den aufeinanderfolgenden sleep, hast Du evtl recht, falls die sleep erst dann angelegt werden wenn das vorherige sleep abgelaufen ist.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

Damian

Du kannst ja nach dem Löschen der sleeps einfach alle Ventile zumachen "set Wasser.* off" und gut ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Beta-User

Zitat von: Jamo am 19 Juni 2022, 10:13:12
Weil der Kandidat hier mit 5 parallelen zweigen arbeitet, benötigt man für jeden zweig eigene named sleep.
Die Ausgangsfassung war
Zitat von: foxmulder am 17 Juni 2022, 10:26:32
Aktuell habe ich es so...halt ohne Notaus...da läuft das Programm einfach durch und macht keine Probleme.


Gartenwasser_Autoprogramm:auto {fhem("
set HauptschalterWassser on ; sleep 20 ; set WasserRasenSeite on ; sleep 1200 ; set WasserRasenSeite off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserCarportRasen on ; sleep 750 ; set WasserCarportRasen off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserCarportEcke on ; sleep 90 ; set WasserCarportEcke off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserRasenStall on ; sleep 1080 ; set WasserRasenStall off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserWallRasenUnten on ; sleep 900 ; set WasserWallRasenUnten off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserWallBlumen on ; sleep 900 ; set WasserWallBlumen off ; sleep 3 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserWallWaldseite on ; sleep 720 ; set WasserWallWaldseite off ; sleep 10 ; set HauptschalterWassser off ; sleep 10 ;
set HauptschalterWassser on ; sleep 20 ; set WasserTropfschlauch on ; sleep 1800 ; set WasserTropfschlauch off ; sleep 10 ; set HauptschalterWassser off ; set Gartenwasser_Autoprogramm aus")}

Ist nach meinem Verständnig "ein Strang", nur dass man eigentlich den Wechsel auf die Perl-Ebene gar nicht braucht...

Kann man anpassen mit einem named sleep und dann halt den "Aus"-Befehl beim "notaus-Notify" ergänzen, Fisch geputzt...
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

foxmulder

Hallo zusammen,

habt vielen lieben Dank für die rege Beteiligung! Total super!

Das mit dem "foreach" und Sleep Benamung hat leider nicht direkt geklappt. Der hat beim speichern gemeckert das er "foreach" als Befehl nicht kennt. Kann mich aber auch zu dämlich angestellt haben.

Wie dem auch sei...von der Cheffin kam noch eine weitere Anforderung...nämlich das jeder Strang auch einzeln manuell geschaltet werden soll der nach gewünschter Zeit automatisch wieder ausgeht...also quasi ein "on-for-timer".

Dies soll als Ergänzung zu dem automatischen Programm gehen. Das Auto-Programm läuft jeden Strang nach einander durch und wird über ein AT Timer morgens getriggert...man kann das auch manuell starten....und genau dafür soll dann der NotAus sein...heißt wenn man das Auto-Programm manuell startet...man aber nach 30 Min oder so feststellt das man das Programm unterbrechen will, weil man manuell Wasserdruck braucht oder oder oder...dann soll der NotAus das Programm unterbrechen und die nächsten Stränge sollen dann nicht weiter laufen. Den aktuell laufenden Strang kann man ja einfach manuell via Schalter ausschalten.

Ich hab es also nun doch erstmal mit einzelnen Dummy Schaltern für jeden Strang gelöst. Für den Dummy Schalter gibt es jeweils ein Notify der den Strang schaltet und vorher auf den NotAusSchalter Status prüft. Sollte der aktiv sein..wird keine Schaltung des Wasserstrangs vorgenommen.
Für das Autoprogramm steuere ich dann die Dummy Schalter einzeln an und setzte entsprechende Sleeps dazwischen.

Im Code sieht das dann so aus...

Dummy notify Beispiel für einen Strang:

Gartenwasser_Dummy_WasserRasenSeite:an {
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv")
       { fhem("set HauptschalterWassser on ; sleep 20 ; set WasserRasenSeite on ; sleep 1500 ; set WasserRasenSeite off ; sleep 3 ; set WasserRasenSeite off ; sleep 3 ; set HauptschalterWassser off") }}



Autoprogramm notify:

Gartenwasser_Autoprogramm:auto {fhem("set Gartenwasser_Dummy_WasserRasenSeite an ; sleep 1250 ; set Gartenwasser_Dummy_WasserCarportRasen an ; sleep 780 ; set Gartenwasser_Dummy_WasserCarportEcke an ; sleep 120 ; set Gartenwasser_Dummy_WasserRasenStall an ; sleep 1100 ; set Gartenwasser_Dummy_WasserWallRasenUnten an ; sleep 950 ; set Gartenwasser_Dummy_WasserWallBlumen an ; sleep 950 ; set Gartenwasser_Dummy_WasserWallWaldseite an ; sleep 760 ; set Gartenwasser_Dummy_WasserWallGarten an ; sleep 350 ; set Gartenwasser_Dummy_WasserTropfschlauch an ; sleep 1850 ; set Gartenwasser_Autoprogramm aus")}



Ist sicher nicht so geil und sauber...aber funktionial und maximal flexibel...muss ja auch einfach für die Dame sein ;-)

Was meint ihr? Schrecklich oder? :-D

Beta-User

Zitat von: foxmulder am 19 Juni 2022, 13:10:18
Was meint ihr? Schrecklich oder? :-D
Meine 2ct:
- Hinweise auf benannte sleep sind komplett ignoriert...
- "Eigentlich" ist das "ein Ding" und nicht viele => diese dummy-Origie ist mir zutiefst zuwider!

Ich würde das vermutlich mit einem einzigen (!) dummy "irrigation" lösen, der dann "state:active,inactive" und "mode:auto,RasenSeite,...." als Readings kennt.
Dann kannst du einen (!) Eventhandler darauf ansetzen, der dann die eine (!) richtige/passende Aktion in Gang setzt (oder eben alles beendet). Und es gibt nicht irgendwelche sich möglicherweise überkreuzenden Aktionen.

Aber da meine Hinweise anscheinend eh' nicht auf fruchtbaren Boden fallen, bin ich für's erste hier raus...
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

foxmulder

Das mit den benannten Sleeps hatte ich wie gesagt versucht...mich aber wohl zu doof angestellt. Keine Ahnung...tut mir leid!

Auf jeden Fall ist dein Tipp mit dem EINEN Dummy mit Readings und entsprechendem Notify darauf GENIAL! :-)
Das hab ich jetzt mal so umgesetzt und das sieht so echt gut aus...

Der Dummy "NotAus" Schalter mit den Readings für die einzelnen Wasser Stränge

define GartenwasserAutomatik_Notaus dummy
attr GartenwasserAutomatik_Notaus readingList WasserCarportEcke WasserCarportRasen WasserRasenSeite WasserRasenStall WasserTropfschlauch WasserWallBlumen WasserWallGarten WasserWallRasenUnten WasserWallWaldseite
attr GartenwasserAutomatik_Notaus room Bewässerung
attr GartenwasserAutomatik_Notaus setList aktiv inaktiv
attr GartenwasserAutomatik_Notaus webCmd aktiv:inaktiv



Und hier der Notify für das Automatische Programm welches die Stränge der Reihenfolge nach schaltet und die Readings entsprechend beim Dummy setzt.

Gartenwasser_Autoprogramm:auto {
if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserRasenSeite", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserRasenSeite on ; sleep 1250 ; set WasserRasenSeite off ; sleep 3 ; set WasserRasenSeite off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserRasenSeite inaktiv ; setreading GartenwasserAutomatik_Notaus WasserCarportRasen aktiv ; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserCarportRasen", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserCarportRasen on; sleep 780 ; set WasserCarportRasen off ; sleep 3 ; set WasserCarportRasen off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserCarportRasen inaktiv ; setreading GartenwasserAutomatik_Notaus WasserCarportEcke aktiv ; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserCarportEcke ", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserCarportEcke on; sleep 120 ; set WasserCarportEcke off ; sleep 3 ; set WasserCarportEcke off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserCarportEcke inaktiv ; setreading GartenwasserAutomatik_Notaus WasserRasenStall aktiv ; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserRasenStall", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserRasenStall on; sleep 1100 ; set WasserRasenStall off ; sleep 3 ; set WasserRasenStall off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserRasenStall inaktiv ; setreading GartenwasserAutomatik_Notaus WasserWallRasenUnten aktiv ; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserWallRasenUnten", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserWallRasenUnten on; sleep 950 ; set WasserWallRasenUnten off ; sleep 3 ; set WasserWallRasenUnten off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserWallRasenUnten inaktiv ; setreading GartenwasserAutomatik_Notaus WasserWallBlumen aktiv ; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserWallBlumen", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserWallBlumen on; sleep 950 ; set WasserWallBlumen off ; sleep 3 ; set WasserWallBlumen off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserWallBlumen inaktiv ; setreading GartenwasserAutomatik_Notaus WasserWallWaldseite aktiv; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserWallWaldseite", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserWallWaldseite on; sleep 760 ; set WasserWallWaldseite off ; sleep 3 ; set WasserWallWaldseite off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserWallWaldseite inaktiv ; setreading GartenwasserAutomatik_Notaus WasserWallGarten aktiv; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserWallGarten", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserWallGarten on; sleep 350 ; set WasserWallGarten off ; sleep 3 ; set WasserWallGarten off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserWallGarten inaktiv ; setreading GartenwasserAutomatik_Notaus WasserTropfschlauch aktiv; set Gartenwasser_Autoprogramm auto") } ;

if ( Value("GartenwasserAutomatik_Notaus") eq "inaktiv" && ReadingsVal("GartenwasserAutomatik_Notaus", "WasserTropfschlauch", "inaktiv") eq "aktiv" )
{ fhem("set HauptschalterWassser on ; sleep 20 ; set WasserTropfschlauch on; sleep 1850 ; set WasserTropfschlauch off ; sleep 3 ; set WasserTropfschlauch off ; sleep 3 ; set HauptschalterWassser off ; setreading GartenwasserAutomatik_Notaus WasserTropfschlauch inaktiv ; setreading GartenwasserAutomatik_Notaus WasserRasenSeite aktiv; set Gartenwasser_Autoprogramm aus") }

}



Durch das jeweilige Umstellen der Readings (Stränge) auf aktiv/inaktiv und dem "Neustart" des Programms am Ende jeden Strangdurchlaufs erhält man so eine Reihenfolge die nacheinander abgearbeitet wird. Dazu wird immer der Stand des "NotAus" geprüft...wenn man nun zwischendrin unterbrechen will wird der Notaus aktiviert und somit sind die Bedingungen für den Start der weiteren Stränge nicht mehr erfüllt...das Programm somit zuende :-)

SUPER!

Und das nun ohne die vielen Dummys...sondern alles schon komprimiert. :-)

TOP!

VIELEN DANK für eure Hilfe!

Beta-User

 :) Das sieht doch schon mal besser aus...

Mit einem notify war noch gemeint gewesen: nicht nur auf "auto" hören, sondern auch auf "inactive" bzw. die einzelnen Kanäle - die sollte man ja auch separat schalten können, oder?

Du wirst dazu noch ein paar mehr Abfragen brauchen (u.a. auf $EVTPART0), und ggf. noch das eine oder andere Hilfsreading an dem dummy setzen (auf welcher Stufe sind wir grade, wenn per "auto" alles durchlaufen werden soll? Welche Aktoren sollte man ausschalten?).

Vielleicht schaust du mal in https://forum.fhem.de/index.php/topic,128069.0/topicseen.html rein, da ging's um was ähnliches, und da sollte ein einziges "cancel" ausreichen, um den Ablauf _gleich_ zu unterbrechen, und nicht erst, wenn der jeweilige Strang durchgelaufen ist...

Ansonsten: Value() ist "bäh", und einfache Quotes sind schneller (wenn man nicht wirklich "extrapolieren" muss).
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

foxmulder

Hatte Frauchen falsch verstanden...die Stränge sollten einzeln schaltbar sein...aber dann doch auch manuell wieder aus gemacht werden können.

Letztlich stelle ich der Dame dann über Tablet UI eine View zur Verfügung wo sie die Bewässerung steuern kann. Das Automatik Programm mit der Abbruch Möglichkeit ist ein Teil davon.

So wie es jetzt ist ... ist es denk ich perfekt und Frauchen freut sich. :-)

Schau mal auf den Screenshot...so sieht der Teil der Bewässerung aus.

Über "Autoprogramm starten" gibt es ein DropDown mit den Optionen "5min, 10min, 20min, auto" => diese schalten die Stränge entweder jeweils für die angegeben Minuten oder halt das "auto" mit dem neuen Programm wo die Zeiten je Strang definiert sind.
Dazu gibt es nun den Schalter für den NotAus ... und der Schalter für die "Automatik" ist zum aktivieren der Zeitsteuerung...heißt das das Autoprogramm dann zu der oben genannten Startzeit via AT getriggert wird.

Mit den jeweiligen Schaltern kann sie nun auch die einzelnen Wasserstränge direkt manuell schalten...hier wird erst der WasserHauptschalter aktiviert und dann der jeweilige Strang. Das jedoch über TabletUI Logik..ohne extra Dummy Kram :-)

Ich bin happy so...das passt prima.

VIELEN DANK!

Beta-User

 :) Dann lassen wir es halt gut sein, wenn alle zufrieden sind...

Ich wäre es nicht - zum einen sollte eine Bewässerung gar nicht erst angeschaltet werden müssen (sondern selbst ermitteln, was notwendig ist), und zum anderen sind die Abbruchmöglichkeiten zwischendurch (wenn man denn abbrechen muss!) m.E. nicht so, wie sie sein sollten. Über beide Probleme hilft eine hübsche Oberfläche auch nicht wirklich weg. Aber Rom wurde ja auch nicht an einem Tag erbaut ;D .
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

foxmulder

 ;D ;D ;D

Naja...bei zuuu viel Automation meckern die Frauen rum... :-D


Beta-User

Zitat von: foxmulder am 21 Juni 2022, 10:08:03
Naja...bei zuuu viel Automation meckern die Frauen rum... :-D
:) Schon. Und gerade im Garten ist "Eigenkontrolle" nach meiner Überzeugung auch nicht fehl am Platze.

Das betrifft aber eigentlich nur den ersten Punkt, nicht die Frage, was bei einem manuellen Abbruch zwischendurch passieren soll :P . Da glaube ich eher nicht, dass "Frauchen" mit deiner Lösung zufrieden ist ;D ;D ;D .
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

foxmulder

:-D

hmm..na mal sehen...den aktuell laufenden Strang dann im Falle des Falles von einem "NotAus" noch mit auszumachen...kann eigentlicht nicht so schwer sein den Knopf noch mit zu drücken.. :-D
Falls doch...dann könnte ein Notify der vom NotAus getriggert wird und damit den Hauptschalter vom Wasser bzw ein Aus an alles schickt reichen....

Aber schauen wir erstmal wie es sich jetzt so macht. :-)


Als nächstes kommt ein Lichtsensor der die Rolladen automatisch am Tag bei viel Sonne mit steuert... ^^

Beta-User

Zitat von: foxmulder am 21 Juni 2022, 10:42:33
hmm..na mal sehen...den aktuell laufenden Strang dann im Falle des Falles von einem "NotAus" noch mit auszumachen...kann eigentlicht nicht so schwer sein den Knopf noch mit zu drücken.. :-D
Ist es ziemlich sicher nicht :) .
ZitatFalls doch...dann könnte ein Notify der vom NotAus getriggert wird und damit den Hauptschalter vom Wasser bzw ein Aus an alles schickt reichen....
Hihi, wieder derselbe (m.E.) Fehlansatz, alles, was zusammengehört, über (unnötig) viele Devices zu verteilen...
Die Benennung von deinem dummy finde ich übrigens überdenkenswert, der macht ja jetzt nicht nur "NotAus"...
Und mit den deutschen Benennungen wirst du vermutlich irgendwann nochmal wehmütig darüber nachdenken, dass du vielleicht früher mal besser in der Schule aufgepaßt hättest. "inactive" ist nämlich uU. besonders ;) . Setze mal einen dummy auf "inactive" und checke, was IsDisabled('<dein dummy>') zurückgibt ;) ...

Zitat
Aber schauen wir erstmal wie es sich jetzt so macht. :-)
Wir sehen uns :P ...
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

frober

[OT]
Rolladen und Lichtsensor gibt der nächste Spaß...
Tipp: mache es über Temperaturdifferenz
[/OT]

... ansonsten hat Beta-User alles schon geschrieben...
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...