Modulerweiterung: 98_average.pm

Begonnen von mumpitzstuff, 06 Mai 2017, 22:52:30

Vorheriges Thema - Nächstes Thema

mumpitzstuff

Ich war mal so frei und habe das in FHEM vorhandene Modul 98_average.pm um einige Punkte erweitert:


  • average und min/max Werte auf Stundenbasis
  • frei wählbares Intervall im Bereich von 1s - 1 Monat
  • das frei wählbare Intervall toggelt ein Reading (0/1) jeweils nach Ablauf des Intervalls
  • wenn das custom Intervall Attribut gelöscht wird oder das Intervall auf 0 steht, dann wird die Berechnung der average und min/max Werte ausgeschaltet
  • Attribut nohour schaltet die stündlichen average und min/max Werte aus
  • Attribut noday schaltet die täglichen average und min/max Werte aus
  • Attribut nomonth schaltet die monatlichen average und min/max Werte aus
  • Attribut hideraw versteckt die für die Berechnung notwendigen Zwischenwerte (Readings erhalten einen . im Namen)
  • Cleanup code erweitert, so dass überflüssige Readings beim Umschalten der Attribute automatisch gelöscht werden

Kann jemand das Modul ausprobieren und dazu ein Statement abgeben?

Können die Änderungen in das Modul offiziell übernommen werden, damit auch andere davon profitieren können (natürlich erst wenn bei anderen keine Probleme auftreten)?

mumpitzstuff

Hat wirklich niemand Interesse an der Erweiterung? Vielleicht findet sich ja trotzdem jemand, der sie mal kurz testen kann und seine Mainung dazu kundtun könnte...

Wenn muss ich anschreiben, um die Änderungen ins offizielle Modul zu übernehmen? Bei mir läuft das Ding seit mehreren Tagen und ich konnte keine Probleme feststellen.

CoolTux

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

rudolfkoenig

PM ist nicht notwendig, ich lese hier schon fleissig mit.

Ich wuerde aber gerne "Featuritis" vermeiden, und Code nur dann einbauen, falls es von mehr als einem Person benoetigt wird. Du hast ja selbst nach Feedback gefragt, bisher ohne Rueckmeldung.

Maui

Ich nutze es jetzt länger und finde die Erweiterungen super. Allerdings fehlt mir noch ein Last_x. Also am ehesten ein .*Last_avg_day.
Ich würde gerne direkt im jeweiligen Device sehen können wie der Durchschnitt gestern war. Also zb. Bei einem Temp Sensor, wie die Durchschnittstemperatur war. Aktuell nehme ich für jedes device ein einzelnes at, wo ich kurz vor Tagesende ein Reading setze.

mumpitzstuff

Dein Vorgehen ist so auch genau richtig. Die Berechnungen des Moduls werden aktuell lediglich durch Änderungen der Readings ausgelöst und nicht durch zeitliche Gegebenheiten.  Du könntest die Dinge auch in einem at für mehrere Geräte erledigen, dann wird es vielleicht übersichtlicher.  Aufnehmen würde ich es jedenfalls nicht, der Aufwand wäre nicht gerechtfertigt.

Maui

Hast du dann vielleicht eine Idee, wie ich in einem at (oder ähnlichem) zb per regex alle auf einmal auslesen und mit setreading in den einzelnen devices jeweils setzen kann? Vielleicht gehts auch mit DOIF? Hmm

mumpitzstuff

Hilft dir devspec2array weiter? Im Forum gibts dazu diverse Beispiel. Die Funktion liefert ein Array von gefilterten Devices zurück und mit z.B. foreach kannst du in diesen Devices dann den entsprechenden Wert in ein separates Reading kopieren.

Damian

Zitat von: Maui am 14 November 2018, 21:43:45
Hast du dann vielleicht eine Idee, wie ich in einem at (oder ähnlichem) zb per regex alle auf einmal auslesen und mit setreading in den einzelnen devices jeweils setzen kann? Vielleicht gehts auch mit DOIF? Hmm

Im DOIF kann man die Aggregationsfunktion dazu nutzen: https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Maui

#9
Hatte ich auch schon im Kopf, Damian. Passt auch besser, da ich DOIF mag und aktuell grad eh Stückweise ats,notifys,etc auf DOIF umstelle. Bin aber auch noch doof, was DOIF angeht.

Soweit bin ich schonmal. Ich weiß, dass der letzte Teil mit dem setreading falsch ist, aber ich glaub du verstehst, wo ich hin will. Ich will den Wert aus dem jeweiligen Reading ziehen und am Tagesende in ein neues Reading schreiben.
([23:59]) ( {foreach (AggrDoIf('@','^Switch_ts','BME280_Temperature_avg_day')) {fhem("setreading $_ AvgLastDay [$_:BME280_Temperature_avg_day]") }})

[/s]PS: Chapeau für DOIF, geile Arbeit   :)

EDIT:
So passt es. Geile Sache
([23:59]) ( {foreach (AggrDoIf('@','^Switch_ts','BME280_Temperature_avg_day')) {fhem("setreading $_ AvgLastDay ".(ReadingsVal($_,"BME280_Temperature_avg_day",0))) } })

EDIT2: Zur Vollständigkeit noch das DOIF für den Monat.
([23:59] and (strftime ("%d",localtime time+86400) == 01)) ( {foreach (AggrDoIf('@','^Switch_ts','BME280_Temperature_avg_month')) {fhem("setreading $_ AvgLastMonth ".(ReadingsVal($_,"BME280_Temperature_avg_month",0))) } })

Jamo

Hallo Mumpitzstuff,
super modul, genau das was ich gesucht hatte, funktioniert einwandfrei soweit.
Allerdings, wenn ich "Device specific help" help aufrufe, kommt folgende Fehlermeldung:

Module: 98_average.pm Maintainer: rudolfkoenig Forum: Automatisierung No help found for module: average

Wenn ich das alte/original Modul zurückkopiere und ein reload mache, bekomme ich die Hilfe angezeigt.
Ich habe mal ins Modul reingeschaut, ich kann aber nicht finden woran es liegt, sieht ähnlich aus wie beim originalen......

Danke u beste Grüsse!
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

Maui

Bei mir läuft die help. Neustart?

Jamo

Alles schon gemacht, Neustart, re-load, hin und herkopiert, Linux-rechte nachgeschaut, etc. Ich bekomme die Hilfe leider nicht in FHEM angezeigt (kann ich allerdings in vi / VIM / view unter linux lesen, ist nur nicht so toll).
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

mumpitzstuff

#13
Ewig nicht mehr reingeschaut. Muss ich mir ansehen.

PS: Habe noch ein & Zeichen in der Hilfe gefunden, das noch nicht escaped war. Vielleicht war dass das Problem? Habe die Änderung eingecheckt. 

Jamo

Danke Danke! Aber ich dachte das Modul ist [noch] nicht teil des offiziellen SYN, wo hast Du das eingecheckt? Im ersten Post ist soweit ich sehe, immer noch das alte, oder?
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

mumpitzstuff

ohh stimmt.

Ich hoffe das ist inhaltlich die selbe Version, das habe ich gar nicht noch mal explizit geprüft...

https://github.com/mumpitzstuff/fhem-average

R1F800

Nabend.
Ich habe ein Problem mit dem AVERAGE.

Ich habe einen DS18B20 an einem ESP und der liefert mir fleißig Temperaturwerte über Tag, die ich gerne mitteln will und dann in dem LOG persistieren möchte.

Ich bekomme es aber einfach nicht gebacken auf die Temperaturevents zu reagieren, dass ich mittelwerte erhalte:

defmod AVGTempAussen average Gartenhaus_Aussentemp:Temperature.*


Habt ihr eine Idee?

rudolfkoenig

ZitatHabt ihr eine Idee?
Noch nicht, dafuer braeuchte ich die Events.

R1F800

hoffe der Auszug zum ESP hilft weiter:

Romoker

BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

rudolfkoenig

Ich habe average zu dem "Event Monitor => Create/modify device" hinzugefuegt.

R1F800


R1F800

Zitat von: rudolfkoenig am 24 Januar 2019, 13:58:08
Ich habe average zu dem "Event Monitor => Create/modify device" hinzugefuegt.

Was meinst Du genau damit?
Dass Du den Quellcode des Moduls angepasst hast?

rudolfkoenig

Nach dem update (morgen ab acht) kann man auch eine average Instanz aus dem Event-Monitor definieren.
Bisher ging das nur fuer notify, DOIF, FileLog, sequence und watchdog.

Romoker

ZitatJa und was wäre der korrekte?

Der Devicename ist im Internal NAME definiert, hier "ESPEasy_Gartenhaus_Aussentemp". Du hast stattdessen das Internal IDENT = "Gartenhaus_Aussentemp" angegeben.
Probier mal
defmod AVGTempAussen average ESPEasy_Gartenhaus_Aussentemp:Temperature.*

Viele Grüße
BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

R1F800

#25
@ romoker
Habe nun den Internal Name genommen.

Jetzt sehe ich zumindest dass der AVERAGE mit der Temperatur verknüft ist.
Dennoch werden wohl die events nicht erkannt.

Wenn ich im Eventlog nachsehe kann ich diese auch nicht sehen ...  ???

So, im ESPEASY device sehe ich nun nach der Änderung meiner Definition des AVERAGE Werte. Läuft also, Besten Dank!

R1F800

Moin,
Ich habe nochmal eine Nachfrage:
Wie wird der average/day zurückgesetzt? Macht die Funktion dies selbstständig?
Wie triggere ich das Persistieren des Tagesdurchschnittswertes? Das average event wird doch mit jedem neuen Event upgedated.

rudolfkoenig

ZitatWie wird der average/day zurückgesetzt?
Ich verstehe die Frage nicht.
Average generiert  einmal am Tag und am Monat ein Event, sonst werden Hilfsvariablen in Readings des ueberwachten Geraetes gespeichert, die wiederum automatisch im statefile gespeichert werden, bei save oder vor shutdown.

R1F800

Mmh. ich denke ich habe einen Denkfehler; die readings (s. Anhang) werden doch kontinuierlich aktualisiert > Timestamp

Was für ein Event ist denn dann der Auslöser für genau die Werte AVG/MIN/MAX  per day?
Ich will ja auf das EVENT reagieren und die Daten in ein LOG schreiben.

rudolfkoenig

Der Name des generierten Events haengt vom ueberwachten Event ab.
Ist meiner Ansicht nach im commandref genau beschrieben: https://fhem.de/commandref_modular.html#average

R1F800

Stimmt, da steht folgendes:

    <eventname>_avg_day: $avg_day

    <eventname>_avg_month: $avg_month
    <eventname>_cum_day: $cum_day (only if cumtype is set to raw)
    <eventname>_cum_month: $cum_month (only if cumtype is set to raw)
    <eventname>_min_day: $min_day
    <eventname>_min_month: $min_month
    <eventname>_max_day: $max_day
    <eventname>_max_month: $max_month


Somit frage ch mich halt nach dem Ausdruck <eventname>
Ist auf dieses Event dann ein zusäztliches notify notwendig? > Ich versteh es einfach nicht.
Ich hätte jetzt unter dem AVG device z.B die Variablen / Envents zu finden erwartet  ...

R1F800

Zitat von: rudolfkoenig am 27 Januar 2019, 13:27:39
Der Name des generierten Events haengt vom ueberwachten Event ab.
Ist meiner Ansicht nach im commandref genau beschrieben: https://fhem.de/commandref_modular.html#average

Genau das war ja meine Ausgangsfrage.

Für mich matcht das zur Zeit nicht:

    <eventname>_avg_day: $avg_day
    <eventname>_min_day: $min_day
    <eventname>_max_day: $max_day


Hier steht bei mir Temperature_avg_day ;  und wenn man sich den TMSTP anschaut wird das Event dann gefeuert, wenn ein neuer Wert ermittelt wird und nicht erst um 23:59:59

In der Commandref steht:
    <device> <eventname>_avg_day: <computed_average>
    <device> <eventname>_min_day: <minimum day value>
    <device> <eventname>_max_day: <maximum day value>

Du sprichst von Hilfsvariablen in Form von Readings ... simit wäre Dein Hinweis auf die passenden events das eigentliche Reading .. aber das wird ja je nach Variablenupdate gepollt.

rudolfkoenig

Zitatund wenn man sich den TMSTP anschaut wird das Event dann gefeuert, wenn ein neuer Wert ermittelt wird und nicht erst um 23:59:59
Ich gehe davon aus, dass Dir der Unterschied zwischen Reading und Event nicht present ist: Normalerweise wird beim Setzen eines Readings (das was man in der Detailansicht mit Zeitstempel sieht) ein Event (das, was man im Event-Monitor sieht, und was an notify/FileLog/etc weitergeleitet wird) erzeugt, aber das ist nicht zwingend der Fall. average.pm erzeugt nur beim Tages oder Monatswechsel Events, um das System nicht ueberfluessig zu belasten

Damian

Falls jemand nur Werte glätten oder Ausreißer eliminieren will, kann es neuerdings im DOIF-Modul recht einfach realisieren: https://forum.fhem.de/index.php/topic,95759.75.html
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

R1F800

Zitat, aber das ist nicht zwingend der Fall. average.pm erzeugt nur beim Tages oder Monatswechsel Events, um das System nicht ueberfluessig zu belasten

Das ist genau der entscheidende Hinweis. Jetzt wird für mich ein Schuh draus.
Ich bin mal gespannt wie morgen das Log aussieht...

R1F800

Moin.
Leider hat das Ganze keinen Erfolg gebracht. Aber es liegt wahrscheinlich an meiner LOG Definition:

defmod TempAvgMinMaxOut FileLog ./log/TempAvgMinMaxOut.log AVGTempAussen:Temperature_avg_day.*

ist die REGEXP so korrekt ?

rudolfkoenig

Vermutlich nicht, die Events werden im Namen des Geraetes, der von average ueberwacht wird, erstellt, da, wo die _avg_ Readings sind.