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...