[gelöst] Notify kurzzeitig aussetzen

Begonnen von zife, 22 Oktober 2020, 13:51:07

Vorheriges Thema - Nächstes Thema

zife

Nach langer Recherche sehe ich vermutlich den Wald vor lauter Bäumen nicht - kann mich bitte jemand auf den richtigen Weg bringen?

Hier mein Plan:
Ich möchte, dass ein Gerät, sobald es angeschaltet ist, einen Aktor anschaltet. Umgekehrt soll der Aktor, wenn er angeschaltet wird, das Gerät anschalten.
Und das Ganze natürlich auch in der selben Logik für's Ausschalten.

Dafür wollte ich zwei Notifys basteln:
...eins, das auf das Geräte-Reading reagiert und den Aktor schaltet
...eins, das auf den Aktor reagiert und das Gerät schaltet.

Wie kann ich jetzt eine Dauerschleife verhindern, in der die Notifies sich jeweils gegenseitig auslösen? Kann ich das zweite Notify vom ersten für einen kurzen Moment aussetzen lassen? Mit den Puzzlestücken disabledAfterTrigger, disable/enable, etc. hab ich nicht wirklich eine Lösung zusammenbauen können.


PS: Für diejenigen, die auch den Hintergrund verstehen wollen:
Aus WAF-Gründen habe ich eine zweite Smarthome-Lösung, die mit perfekter simpler Visualisierung/Bedienung auch den Nicht-Nerd glücklich macht. Leider kann ich dort aber das o.g. Gerät nicht einlernen, nur Aktoren. Deshalb habe ich die "Stellvertreter"-Lösung erdacht, in der der Aktor so tut, als sei er das Gerät selbst. Würde man das Gerät nur über den Aktor bedienen, also quasi als Frontend, wäre es einfach - nur leider kann man auch das Gerät selbst ein- und ausschalten, und das muss der Aktor ja wiederum mitbekommen und seinen eigenen Schaltzustand anpassen.

fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Nimm nur ein notify, das auf beide Geräte reagiert, verwende FILTER und setze alle Geräte auf den "$EVENT-Zustand", die das NICHT schon sind.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

MadMax-FHEM

Hm, Mist:

1. zu langsam und 2tens naja... ;)

Trotzdem:


defmod nGeraet notify dmGeraet:(on|off) set nAktor inactive;;set dmAktor $EVENT;;sleep 1;;set nAktor active



defmod nAktor notify dmAktor:(on|off) set nGeraet inactive;;set dmGeraet $EVENT;;sleep 1;;set nGeraet active


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

@MadMax-FHEM:
Definiere mal einen dummy mit dem passenden Namen und checke dann
{ notifyRegexpCheck('dmGeraet:(on|off)') }gegen
{ notifyRegexpCheck('dmGeraet:o[nf]+') }oder
{ notifyRegexpCheck('dmGeraet:on|dmGeraet:off') }
(Will sagen: "klassische kurze regex" ist nicht unbedingt schneller oder besser...)

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

#4
Danke - wow, schnelle Vorschläge!

@MadMax-FHEM: Das ist nah dran an meinen bescheidenen Versuchen... ich war mir nur nicht sicher, ob die vom Notify getriggerten Befehle in genau der Reihenfolge abgearbeitet werden. Das ist dann wohl so  8)  Und ich hab mal gelernt, so weit es geht auf "sleeps" zu verzichten - ich müsste es auch etwas höher setzen, da ich manchmal ein paar Sekunden Verzögerung drin habe. Wäre das aus Deiner Sicht in diesem Fall vernachlässigbar?

@Beta-User: Ok, FILTER hatte ich noch nie auf dem Schirm, werde mich da mal einlesen. Erschwerend kommt hinzu, dass ich vom Aktor aus das Gerät nur aus- aber nicht einschalten lassen will - es handelt sich um einen Ofen, das halte ich für zu gefährlich. Wenn also der Aktor selbst auf "an" geschaltet wird, möchte ich ihn gleich wieder "aus" setzen. Sorry, das war oben nicht ganz präsize beschrieben.

fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

MadMax-FHEM

Zitat von: zife am 22 Oktober 2020, 14:22:49
@MadMax-FHEM: Das ist nah dran an meinen bescheidenen Versuchen... ich war mir nur nicht sicher, ob die vom Notify getriggerten Befehle in genau der Reihenfolge abgearbeitet werden. Das ist dann wohl so  8)  Und ich hab mal gelernt, so weit es geht auf "sleeps" zu verzichten - ich müsste es auch etwas höher setzen, da ich manchmal ein paar Sekunden Verzögerung drin habe. Wäre das aus Deiner Sicht in diesem Fall vernachlässigbar?

Solange du danach noch einen fhem-Befehl hast (und der ist ja da) ist das kein Problem bzgl. Verzögerung/Blockierung.

ABER: natürlich ist das ganze "Konstrukt" dann solange "tot"...

Also wenn dann die "Gegenseite" unterhalb der sleep-Zeit geschalten wird, geht das "verloren"...

(Daher) ist (wohl) die FILTER-Lösung wohl (deutlich) besser...

Gruß, Joachim

P.S.: ich hatte auch überlegt vorne also vor set Gegenseite $EVENT noch einen kurzen sleep einzubauen. Ist aber wohl nicht nötig. Liegt (wohl) daran, dass fhem eben innerhalb eines Threads läuft... Also "sequenziell"...
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

Zitat von: zife am 22 Oktober 2020, 14:22:49
@Beta-User: Ok, FILTER hatte ich noch nie auf dem Schirm, werde mich da mal einlesen. Erschwerend kommt hinzu, dass ich vom Aktor aus das Gerät nur aus- aber nicht einschalten lassen will - es handelt sich um einen Ofen, das halte ich für zu gefährlich. Wenn also der Aktor selbst auf "an" geschaltet wird, möchte ich ihn gleich wieder "aus" setzen. Sorry, das war oben nicht ganz präsize beschrieben.
Zum einen ist es unschön, wenn die Spielregeln während des Spiels "präzisiert" werden, und zum anderen geht das natürlich trotzdem, du musst dann eben im Ausführungsteil nach auslösendem Gerät und Event unterscheiden. Einen Einstieg in Perl-if findest du hier: https://wiki.fhem.de/wiki/If-condition.

Beachte den Hinweis auf "Perl-if". Das ist was anderes als "IF" und auch bei "sleep" gibt es einen signifikanten Unterschied zwischen Perl-sleep (unbedingt zu vermeiden) und FHEM-sleep (das setzt einfach einen Timer, der im Hintergrund überwacht wird).

Vielleicht noch ein (auf ein "? ... : ..." verkürztes) notify mit einer if+FILTER-Struktur. Sowas kann man auch ohne weiteres verschachteln (ist RAW-Code, und Teile würde ich heute anders notieren):
define n_Heizung_Heizperiode notify Heizperiode { $EVENT eq "on" ? \
fhem "set Thermostat.*Clima:FILTER=model=HM-CC-RT-DN:FILTER=controlMode!=auto controlMode auto;;\
set Thermostat.*Climate:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=controlMode!=auto controlMode auto"\
: \
fhem "set Thermostat.*Clima:FILTER=model=HM-CC-RT-DN:FILTER=controlMode!=manual controlMode manual;;\
set Thermostat.*Clima:FILTER=model=HM-CC-RT-DN:FILTER=desired-temp!=off desired-temp off;;\
set Thermostat.*Climate:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=controlMode!=manual controlMode manual;;\
set Thermostat.*Climate:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=desired-temp!=off desired-temp off" }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

ZitatZum einen ist es unschön, wenn die Spielregeln während des Spiels "präzisiert" werden, und zum anderen geht das natürlich trotzdem, du musst dann eben im Ausführungsteil nach auslösendem Gerät und Event unterscheiden. Einen Einstieg in Perl-if findest du hier: https://wiki.fhem.de/wiki/If-condition.

Ja, Asche auf mein Haupt. Ich hab mich bei der Fragestellung schwergetan, es überhaupt verständlich rüberzubringen - das diese Vereinfachung der Idee die Vorschläge so stark beeinflusst, war mir nicht klar. Sorry.

Danke für die Perl-Warnungen... muss mal mein Hirn gut lüften und mich reinstürzen.



fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

zife

Bevor ich in die if-Tiefen abtauche... Ansatz richtig? Also für die simple Variante, Gerät und Aktor immer gleichzuschalten ohne Ofen-Sonderlocke:


define NY_Ofen notify (DE_Ofen|DE_AktorOfen) set DE_Ofen:FILTER=STATE!=$EVENT $EVENT;;set DE_AktorOfen:FILTER=STATE!=$EVENT $EVENT)
fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Kürzer sollte auch gehen:

define NY_Ofen notify DE_Ofen|DE_AktorOfen set (DE_Ofen|DE_AktorOfen):FILTER=state!=$EVENT $EVENT

Anmerkungen:
"Vorne" sind die runden devspec-Klammern "von Übel", weil sie die eindeutige Event-Erkennung für fhem.pl "zerschießen", hinten im Ausführungsteil macht es den Code einfacher. Du kannst mit
list (DE_Ofen|DE_AktorOfen):FILTER=state!=on
(bzw. off) testen, auf welche Geräte das entsprechende $EVENT Auswirkungen hätte.

Und dann vergiß direkt die Option, irgendwas mit STATE (=> Internal) anzufangen, das ist mMn. viel zu uneindeutig => gehe immer auf das relevante Reading (hier also: "state"). (ad-on: streich aus demselben Grund direkt auch die Funktion Value() von deiner Liste und nimm stattdessen immer ReadingsVal() bzw. ReadingsNum()).
Falls du wissen willst, was "Sache" ist, hier noch ein passendes list:
list (DE_Ofen|DE_AktorOfen) state

Hoffe, der Nebel lichtet sich grade eher, als er dichter wird...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

Wird schon, durch ein Auge dringt bereits Sonne in den Schädel. Nicht zuletzt dank Deiner Hilfe.

Für einen Anfänger mit hochreichenden Ambitionen allerdings in der Tat ne ganze Menge Neues. Zum Beispiel wär ich nie drauf gekommen, dass die Klammern stören könnten... und es ist immer wieder spannend, wie sehr man den Code weiter verkürzen kann.

Bastle gerade an der if-Verschachtelung - sobald ich was Herzeigbares hab, teile ich's gern (und stelle mich der "Qualitätssicherung")  ;D.

fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

zife

So, hier das Ergebnis. Licht im Hirn? Oder hab ich ne Fata Morgana gesehen?
Hab mal Kommentare eingefügt, damit mein Gedankengang klar wird:


# Sobald Ofen oder Aktor ein Schalt-Event liefern...
define NY_Ofen notify DE_Ofen|DE_AktorOfen {\

# wenn Auslöser der Ofen war, dann passe Aktor entsprechend an (sofern es nicht schon übereinstimmt)
  if ( $NAME eq "DE_Ofen" )\
    { fhem("set DE_AktorOfen:FILTER=state!=$EVENT $EVENT") } \

# wenn Auslöser der Aktor war, dann...
  else \

# wenn es ein Ausschaltbefehl war, dann schalte auch den Ofen aus (sofern er nicht schon aus ist)
    if ( $EVENT eq "off" )\
      { fhem("set DE_Ofen:FILTER=state!=off off") }\

# wenn es ein Einschaltbefehl war, dann schalte den Aktor gleich wieder aus, weil dumme Idee
    else \
      { fhem("set DE_AktorOfen off") }\
}


Geht vermutlich noch schöner und kürzer, aber mühsam, Eichhörnchen und so...
fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Sieht doch schon gar nicht übel aus :) .
Falls du das über FHEMWEB in die DEF eingibst, müßte aber noch eine qualifizierte Fehlermeldung kommen, es fehlt ein geschweiftes Klammerpaar um den "höherrangigen else-Zweig".
Alternativ kannst du in diesem Fall auch die "hintere Logik" eine Ebene nach oben ziehen und mit einem "elsif" (ja, ohne "e") loslegen, dann geht es ohne die genannten Klammern.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

Ach sch..., die Klammern... also nu aber:


define NY_Ofen notify DE_Ofen|DE_AktorOfen {\
  if ( $NAME eq "DE_Ofen" )\
    { fhem("set DE_AktorOfen:FILTER=state!=$EVENT $EVENT") }\
  else {\
    if ( $EVENT eq "off" )\
      { fhem("set DE_Ofen:FILTER=state!=off off") }\
    else \
      { fhem("set DE_AktorOfen off") }\
  }\
}


Aber wenn ich nun schon dabei bin, will ich's richtig verstehen: kann ich an ein 'elsif' noch ein 'else' anhängen? Also...


define NY_Ofen notify DE_Ofen|DE_AktorOfen {\
  if ( $NAME eq "DE_Ofen" )\
    { fhem("set DE_AktorOfen:FILTER=state!=$EVENT $EVENT") }\
  elsif ( $EVENT eq "off" )\
      { fhem("set DE_Ofen:FILTER=state!=off off") }\
  else \
      { fhem("set DE_AktorOfen off") }\
}

fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

...klar, warum sollte das denn nicht gehen nach elsif...?

Vielleicht noch eine Anmerkung: Du solltest den Code dann immer über das DEF-Feld in FHEMWEB eingeben (ohne die Zeilenumbrüche und mit "nicht escapten" ";"), dann bekommst du auch eine bessere Rückmeldung, wenn was nicht FHEM/Perl-kompatibel ist.

Ansonsten: Einfach mal machen und dann die Events der Reihe nach durchspielen, dazu ins Log schauen. Da sind dann ggf. Fehler in der Syntax zu finden ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors