(Gelöst) Einmaliges Schalten bei Unterschreiten einer Temperatur

Begonnen von Hackstall, 21 August 2020, 13:08:17

Vorheriges Thema - Nächstes Thema

Hackstall

Hallo,

ich suche nach einer Lösung und bin mir nicht sicher ob ich hier die Module Threshold oder ein DOIF
geschickt einsetzen kann.

Mein Problem ist folgendermassen:
Ziel: Ich möchte einen Autor genau EINMAL schalten wenn eine Temperatur unterschritten ist.
Der Autor bewirkt einen Anstieg der Temperatur aber nicht sofort sonder erst nach ca 5min.
Sofern ich nun einen notify auf die Temperatur setze, so wird dieser bei jeder Temperaturänderung unterhalb der Schwelle
getriggert und würde ein erneutes Schalten des Aktors bewirken welches ich vermeiden muss.

Hättet Ihr hier Ideen wie ich das implementieren (am besten in der 99_UTIL implementieren kann.

Danke Andeas

dihe85

Hallo Andreas,
ich hab gestern noch die Anfänger pdf hier aus dem forum in der hand gehabt.
Nen notify kann man mit ner Zeitangabe enttriggern. Ist ziemich weit hinten beschrieben.
Vielleicht hilft dir das.
Gruß
Dirk

Der_Tom

Zitat von: Hackstall am 21 August 2020, 13:08:17
Hallo,

ich suche nach einer Lösung und bin mir nicht sicher ob ich hier die Module Threshold oder ein DOIF
geschickt einsetzen kann.

Mein Problem ist folgendermassen:
Ziel: Ich möchte einen Autor genau EINMAL schalten wenn eine Temperatur unterschritten ist.
Der Autor bewirkt einen Anstieg der Temperatur aber nicht sofort sonder erst nach ca 5min.
Sofern ich nun einen notify auf die Temperatur setze, so wird dieser bei jeder Temperaturänderung unterhalb der Schwelle
getriggert und würde ein erneutes Schalten des Aktors bewirken welches ich vermeiden muss.

Hättet Ihr hier Ideen wie ich das implementieren (am besten in der 99_UTIL implementieren kann.

Danke Andeas

wann soll denn ein erneutes schalten des aktors wieder freigegeben werden ? bei überschreiten einer gewissen
Temperatur  ?

Wäre dann letztendlich ein Schwellwertschalter mit einer Hysterese X !?

Gruss Thomas

betateilchen

Zitat von: Hackstall am 21 August 2020, 13:08:17
Hättet Ihr hier Ideen wie ich das implementieren (am besten in der 99_UTIL implementieren kann.

Bitte NICHT in der 99_Utils.pm sondern in der 99_myUtils.pm.

Es gibt mehrere Lösungsansätze für Deine Aufgabe.


  • Ein notify kann sich nach der Ausführung selbst für eine gewisse Zeit sperren, dafür gibt es das Attribut disabledAfterTrigger
  • Du kannst in der 99_myUtils prüfen, ob der Aktor schon geschaltet wurde und wenn das der Fall ist, einfach nichts tun
  • Du kannst in der 99_myUtils prüfen, ob der Aktor schon geschaltet wurde und das Schalten länger als xx Sekunden her ist (mit ReadingsAge() auf den Status des Aktors)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Hackstall

Hallo und danke für die Antworten:

Mir gefällt das zeitliche sperren eines notify:
Zitat: Ein notify kann sich nach der Ausführung selbst für eine gewisse Zeit sperren, dafür gibt es das Attribut disabledAfterTrigger

Mir ist aber dann nicht klar wie ich dann mein Notify mit einer Bedingung verheiraten kann:
Geht dann zBsp so etwas oder wie müsste das aussehen:


define ntfySchalter notify Device:Reading_Temp < 20 Grad && Device:Reading_Flag==enabled
attr ntfy Schalter disabledAfterTrigger 1000



Danke Andreas

Damian

Zitat von: Hackstall am 21 August 2020, 13:08:17
ich suche nach einer Lösung und bin mir nicht sicher ob ich hier die Module Threshold oder ein DOIF
geschickt einsetzen kann.

Kann man, siehe https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Hackstall

Hallo Bedingungen mit DoIf sollten nicht das Problem sein.

Hier war aber die Lösung mittels Notifikation und zeitlicher Sperrung (via Attr) gesucht, wobei das Notify selbst nur über eine Bedingung oder mehrerer Bedingungen ausgelöst werden sollte.

Siehe Beispiel meines vorherigen posts

Ich denke da wird es schwierig.

betateilchen

Du willst das doch ohnehin in der 99_myUtils.pm lösen, da ist das doch alles sehr einfach umzusetzen.
Die notwendigen Funktionen stellt Dir FHEM alle out-of-the-box zur Verfügung.

Einfachster Lösungsweg:
Du triggerst die Funktion in Deiner 99_myUtils.pm bei jeder Temperaturmeldung des Sensors und prüfst alle Bedingungen und Sperrfristen innerhalb dieser Funktion.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ellert

Zitat von: Hackstall am 21 August 2020, 15:55:57
Hallo und danke für die Antworten:

Mir gefällt das zeitliche sperren eines notify:
Zitat: Ein notify kann sich nach der Ausführung selbst für eine gewisse Zeit sperren, dafür gibt es das Attribut disabledAfterTrigger

Mir ist aber dann nicht klar wie ich dann mein Notify mit einer Bedingung verheiraten kann:
Geht dann zBsp so etwas oder wie müsste das aussehen:


define ntfySchalter notify Device:Reading_Temp < 20 Grad && Device:Reading_Flag==enabled
attr ntfy Schalter disabledAfterTrigger 1000



Danke Andreas
Die Bedingung könntest Du auch mit dem IF-Befehl direkt im Notify lösen, falls Du z.B. auf der FHEM-Ebene bleiben möchtest, mit Beispielen https://commandref.fhem.de/commandref_DE.html#IF

Hackstall

Dann greift aber die zeitliche Sperrung nicht mehr.
Wie gesagt ich möchte den Event nur für eine Bedingung auslösen und dann das Notify zeitlich sperren.
Wenn das im Notify block passiert ist der Event bereits ausgelöst und er soll nicht gesperrt werden wenn die Bedingung nicht zutrifft.

Oder habe ich hier einen Denkfehler?

Gruß Andreas

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ellert

Zitat von: Hackstall am 21 August 2020, 18:08:16
Dann greift aber die zeitliche Sperrung nicht mehr.
Wie gesagt ich möchte den Event nur für eine Bedingung auslösen und dann das Notify zeitlich sperren.
Wenn das im Notify block passiert ist der Event bereits ausgelöst und er soll nicht gesperrt werden wenn die Bedingung nicht zutrifft.

Oder habe ich hier einen Denkfehler?

Gruß Andreas
Du kannst das Notify im IF inactive setzen und über ein at oder sleep wieder auf active, wenn die Bedingung zutrifft.

Hackstall

Bei aller Ehre Betateilchen aber so eine Antwort habe ich in diesem Forum gerade in der Anfängersection noch nicht bekommen.

"Mehrere": was soll das denn heißen. Ich denke ich liege nicht so verkehrt.

Wie auch immer Wo und welche Denfehler habe ich denn.

Lass mich doch nicht so im Regen stehen. Ich bin Kern und ausbaufaehig.

Danke Andreas

TomLee

Komme aller Voraussicht nach vermutlich auch mit einem Denkfehler daher, werfe aber mal disabledForIntervals ins Spiel.

Zum Test klappt das so:

disabledForIntervals {ReadingsVal("du_Testy2","temperature","") >= 20  ? "00-24" :  FmtTime(time())."-".FmtTime(InternalVal("n_Briefkasten","TRIGGERTIME","0")+300)}}

Gruß

Thomas

Damian

Ich glaube nicht, dass du nur EINMAL etwas schalten willst, das macht in einer Automatisierung nicht viel Sinn.

Ich denke, du willst nur EINMAL innerhalb einer gewissen Zeitspanne schalten. Aber welcher?

Vielleicht aber möchtest du EINMAL schalten, bis eine andere Bedingung wahr wird ...

Vielleicht möchtest du nicht EINMAL, sondern doch öfters, aber nur einmal am Tag ...

Vielleicht möchtest du ....

Solange dein Anliegen nicht konkret formuliert ist, wirst du noch zig Vorschläge bekommen, bis irgendwann klar definiert ist, was du möchtest.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF