Wie prüfen, ob in einem bestimmten Zeitraum ein Mindestmessdelta vorliegt

Begonnen von Chk1971, 06 Dezember 2018, 21:17:08

Vorheriges Thema - Nächstes Thema

Chk1971

Liebe Forumsteilnehmer,

ich habe ein Brauchwasserspeicher, der oben und unten Temperaturmesswerte an FHEM liefert. Der Gasbrenner ist über FHEM steuerbar. Ich würde nun gerne folgendes erreichen: Es soll erkannt werden, wenn jemand duscht und dann der Brenner Warmwasser bereitstellen. Erkannt werden kann das Duschen, indem innerhalb eines Zeitraums von z.B. 2 Minuten die Temperatur des Speichers oben um X Grad sinkt.
Ich habe mich durch Suchfunktionen und Commandref gearbeitet, aber keinen Befehl gefunden, der das könnte. Ich dachte, ein notify mit einer event-on-change oder einem event-aggregator sollte funktionieren, komme aber schon bei der Beschreibung in der commandref nicht zur Einsicht, wie das funktionieren soll.

Letztlich geht es um die folgende Regelung: Wenn TemperaturzuBeginn - Temperaturnach2Minuten >6, dann Warmwasser an.

Hat jemand eine Idee, wie man das umsetzen kann?

Vielen Dank,
Christoph

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Chk1971

Vielen Dank, auf diesen Beitrag war ich nicht gestoßen. Ich versuche mal, das bei mir zum Laufen zu bringen!
Noch einen schönen Abend,
Christoph


crusader


Falls die Temperaturmesswerte in konstanten Zeitabständen vorliegen, könntest Du ein digitales Filter verwenden (missbrauchen).

siehe dazu: https://forum.fhem.de/index.php/topic,49261.msg409317.html#msg409317

Benötigt wird ein FIR-Filter , das so viele Stützpunkte besitzt, wie Messwerte innerhalb des Betrachtungszeitraums anfallen und mit dem Koeffizienten 1 beginnt und -1 endet.

Zur Veranschaulichung an Beispiel, mit einem steigenden Temperatur-Messwert alle 15s:

define test DOIF ([+0:00:15]) \
\
  ((setreading $SELF temperature {( [$SELF:temperature,0]+0.1)} ))
attr test userattr temperature.filter temperature.numerator
attr test do always
attr test event-on-update-reading temperature
attr test temperature.filter FIRn
attr test temperature.numerator 1 0 0 0 0 0 0 0 -1
attr test userReadings Delta:temperature.*  { DigitalFilter($name,"temperature") }


Das Filter berechnet den Differenzwert des aktuellen und des 2 Minuten zurücklegenden Wertes.
Bitte dazu den Code aus dem Anhang verwenden, da nur hier der Filtertyp FIRn (Filter ohne Normierung) zur Verfügung steht.

Damian

Oder hier ein Beispiel wie ich Ansagen zum Fenster öffnen aufgrund steigender Feuchtigkeit, bzw. zum Fenster schließen aufgrund fallender Temperatur bei mir zuletzt umgesetzt habe:

defmod di_fenster_bad DOIF {if ([$SELF:increase]) {fhem_set("Echo_Bad speak Bitte Fenster öffnen");;set_State("Ansage Öffnen")}}\
{if ([BadFenster:state] eq "open") {set_Reading ("temp",ReadingsVal("TH_Bad_HM","measured-temp",0));;set_State("Fenster geöffnet")}}\
{if ([$SELF:cold]) {fhem_set("Echo_Bad speak Bitte Fenster schließen");;set_State("Ansage Schließen")}}

attr di_fenster_bad DOIF_Readings increase: [?BadFenster] eq "closed" and ([TH_Bad_HM:humidity]/OldReadingsVal("TH_Bad_HM","humidity",50)-1)*100 > 10,\
cold:[?BadFenster] eq "open" and ([$SELF:temp]-[TH_Bad_HM:measured-temp])>0.5


siehe auch hier: https://forum.fhem.de/index.php/topic,84969.msg857063.html#msg857063
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Chk1971

Crusader und Damian,

vielen Dank für Eure Beiträge! Ich bin immer wieder begeistert, was man mit den Erweiterungen von FHEM alles erreichen kann. Ich muss mir beide Vorschläge mal näher ansehen, was für mich am besten passt.

Noch einen schönen Abend,
Christoph