GELÖST: notify nur bei reading änderung

Begonnen von fl_Indigo, 05 April 2017, 09:50:47

Vorheriges Thema - Nächstes Thema

fl_Indigo

ich möchte gerne eine telegram benachrichtigung schicken sobald sich unser ofen ein oder ausschaltet.

ich lege also folgendes notify an, welches auch funktioniert:

define n_Heizung_Anforderung_Pelletsofen_Telegram notify Temperaturen:AnforderungPelletsofen:.* { my $status = ReadingsVal("Temperaturen","AnforderungPelletsofen","");; if ($status eq "EIN") { fhem("set TelegramBot message Pelletsofen gestartet!")};; if ($status eq "AUS") { fhem("set TelegramBot message Pelletsofen gestoppt!")} }


nun noch einige hintergrundinfos:
die heizungssteuerung (eine UVR1611) lese ich mit HTTPMOD aus und generiere damit meine readings (u.a. auch AnforderungPelletsofen, entweder "EIN" oder "AUS"), das pollingintervall zum auslesen ist 60 sekunden.
um das log nicht unnötig mit gleichen werten aufzufüllen ist mit

attr Temperaturen event-min-interval *:300
attr Temperaturen event-on-change-reading .*

das aktualisieren der readings nur bei änderung, spätestens aber nach 5 minuten (um die readings auch noch vernünftig plotten zu können) eingedämmt.
nun ists logischerweise auch so das das notify für die telegram message ebenfalls alle 5 minuten getriggert wird (weil ja ein event erzeugt wird).

hab ich irgendeine elegante möglichkeit das notify so abzuändern das es wirklich nur auf eine ÄNDERUNG des readings (von AUS auf EIN oder von EIN auf AUS) zu reagieren?

Frank_Huber

nimm den "min interval" raus und regle das im Plot.
mit dem Style der Linien bekommst Du den Plot auch so hin und hältst das Log sauberer.

weiterhin würde ich dir hierfür DOIF empfehlen. wird übersichtlicher.

oder nimm die gleiche Telegram Nachricht und schick das Reading mit. Ich such mal raus wie ich das zum testen hatte. werd ich nachher hier editieren.

Beta-User

Hallo fl_Indigo,

vielleicht reicht auch ein zusätzlicher Vergleich mit OldValue beim Status des Pelletofens (muß sich geändert haben, sonst keine Benachrichtigung).

Gruß, Beta-User
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

fl_Indigo

Zitat von: Beta-User am 05 April 2017, 10:20:14
Hallo fl_Indigo,

vielleicht reicht auch ein zusätzlicher Vergleich mit OldValue beim Status des Pelletofens (muß sich geändert haben, sonst keine Benachrichtigung).

Gruß, Beta-User

die variante hab ich auch schon im kopf, nur an der umsetzung in der praxis scheiterts: wie komme ich an den vorhergehenden wert? muss ich selber was zimmern und den wert in ein seperates reading packen oder gibts da irgendein internal OldValue? ich kann darüber nix (sinnvolles) finden. die abfrage wär nicht das problem, aber die datenbasis ;)

Frank_Huber

Damit hab ich mal experimentiert:
define ETA_Status notify ETA_Kessel_1_Status:Kessel_1_Status:.*  set TelegramBot message Statusänderung Kessel. $EVENT
Damit bekam ich jede Statusänderung auf Telegram. $EVENT ist der Wert des Readings.

EventOnChange auf dieses Reading gesetzt OHNE min-interval

Beta-User

Zu OldValue kenne ich auch nur das, was in der commandref steht.
So wie ich das verstanden habe, handelt es sich um eine Abfragefunktion, der Aufruf sollte daher ähnlich wie bei ReadingsVal() funktionieren, nur dass eben nicht der aktuelle Wert des betreffenden Readings zurückkommt, sondern der alte. Damit sollte auch das Beibehalten des min-interval gehen.
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

fl_Indigo

OldValue bezieht sich, wie in der commandref beschrieben, auf ein device, nicht auf readings

wenn ich das oben in der kommandozeile eingebe bekomme ich den letzt state des devices zurück - also für diesen zweck kann man das nicht missbrauchen...

@Frank_Huber: min-interval möchte ich nicht ausschalten, die plots werden richtig unschön damit (die pumpendiagramme)

Frank_Huber

Zitat von: fl_Indigo am 05 April 2017, 10:58:31
@Frank_Huber: min-interval möchte ich nicht ausschalten, die plots werden richtig unschön damit (die pumpendiagramme)

probier mal die Linien-Typen durch. lines / steps / bars / ...
mit lines schauts bld aus, das ist richtig, mit steps und bars kriegst es aber hin. Hab ich in meinen Plots der Heizung auch drin.

Im Anhang ein Beispiel.

fl_Indigo

ich verwende tagesplots, keine 24h plots, das erschwert mir die thematik einfach...
aber bitte back to topic, hat noch irgendwer ideen wies sonst noch zu lösen wäre?

automatisierer

#9
das event-min-interval kannst du ja auch auf bestimmte Readings filtern.

Zitatevent-min-interval
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings:minInterval" Paare. readings kann ein regexp sein. Ein Event wird nur dann generiert, falls seit dem letzten Auftreten des gleichen Events mindestens minInterval Sekunden vergangen sind. Falls event-on-change-reading auch spezifiziert ist, dann werden sie mit ODER kombiniert, d.h. wenn einer der beiden Bedingungen wahr ist.

oder ein DOIF ohne do always


define n_Heizung_Anforderung_Pelletsofen_Telegram DOIF
([Temperaturen:"AnforderungPelletsofen: EIN"]) (set TelegramBot message Pelletsofen gestartet!)
DOELSEIF
([Temperaturen:"AnforderungPelletsofen: AUS"]) (set TelegramBot message Pelletsofen gestoppt!)


Beispiel für ein Event das so aussieht:

Temperaturen AnforderungPelletsofen: EIN

fl_Indigo

ja schon, aber genau für diese EIN/AUS readings möchte ich ja (für meine plots) in bestimmten intervallen ein event haben, sonst reisst der plot ab... :p
so beisst sich die katze in den schwanz...

Beta-User

komme nochmal zurück auf OldValue...

Es sollte m.E. mit OldValue("<Device>:<Reading>") gehen, also z.B. OldValue("Temperaturen:AnforderungPelletsofen"). Das OldValue lebt aber nur innerhalb des notify, bezieht sich auf das auslösende Event (hier also die Änderung eines Readings, nicht eines Geräte-Status) und verschwindet danach im digitalen Nirvana.

Wäre vielleicht einen Test wert...
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

Frank_Huber

Zitat von: fl_Indigo am 05 April 2017, 11:44:42
ich verwende tagesplots, keine 24h plots, das erschwert mir die thematik einfach...
aber bitte back to topic, hat noch irgendwer ideen wies sonst noch zu lösen wäre?

das sollte nichts ändern. um 00:00 ist der Tagesplot identisch mit dem 24h plot.
Aber mach wie Du denkst. :)

fl_Indigo

Zitat von: Beta-User am 05 April 2017, 12:12:52
komme nochmal zurück auf OldValue...

Es sollte m.E. mit OldValue("<Device>:<Reading>") gehen, also z.B. OldValue("Temperaturen:AnforderungPelletsofen"). Das OldValue lebt aber nur innerhalb des notify, bezieht sich auf das auslösende Event (hier also die Änderung eines Readings, nicht eines Geräte-Status) und verschwindet danach im digitalen Nirvana.

Wäre vielleicht einen Test wert...

das haut so nicht hin

Unknown command OldValue("Temperaturen:AnforderungPelletsofen"), try help.


das notify schaut so aus:

define n_Heizung_Anforderung_Pelletsofen_Telegram notify Temperaturen:AnforderungPelletsofen:.* { my $status = ReadingsVal("Temperaturen","AnforderungPelletsofen","");; my $oldstatus = OldValue("Temperaturen:AnforderungPelletsofen");; if ($status eq "EIN" && $oldstatus ne "EIN") { fhem("set TelegramBot message Pelletsofen gestartet!")};; if ($status eq "AUS" && $oldstatus ne "AUS") { fhem("set TelegramBot message Pelletsofen gestoppt!")} }


die variante mit DOIF hab ich auch probiert, das löst ebenfalls alle 5 minuten eine meldung aus...

CoolTux

#14
Die Funktion OldValue() gibt den Status der Definition $name zurück BEVOR der aktuelle Status aufgrund eines Events gesetzt wurde. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird "" (Leerstring) zurückgegeben.


define n_Heizung_Anforderung_Pelletsofen_Telegram notify Temperaturen:AnforderungPelletsofen:.* {
                                                                        if ($EVTPART1 eq "EIN" && OldValue($NAME) ne "EIN") {
                                                                           fhem("set TelegramBot message Pelletsofen gestartet!");
                                                                        }
                                                                        elsif ($EVTPART1 eq "AUS" && OldValue($NAME) ne "AUS") {
                                                                           fhem("set TelegramBot message Pelletsofen gestoppt!");
                                                                        }
}


Der Code ist für die DEF und NICHT für die fhem.cfg
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net