Neues Feature: Durchschnitt, Median, Differenz, prozentualer Anstieg

Begonnen von Damian, 12 Januar 2019, 23:18:58

Vorheriges Thema - Nächstes Thema

kotaro

Hey,

ich hab ja gelesen, das die avg funktionen oder so nur auf spezielle Werte gesetzt werden.
Wäre es dann für allgemeinere Dinge ein DOIF_Readings so einzusetzen, das die Werte für die Readings erstellt werden?

attr bla DOIF_Readings Duenger_DEVICE:[$DEVICE:Fertility:med3]

und eine Verständnissfrage, was müsste ich verwenden, damit ich herausfinde, ob wie bei wait z.B. 3x der gleiche Wert eintrifft? unabhängig von der Pull-Intervallszeit? also mein einen Sensor frag ich 5-Minütlich ab, den anderen nur alle 20 Minuten?

Vielen dank für die Ganzen Funkionen im DOIF..

Damian

Zitat von: kotaro am 23 April 2019, 12:11:03
Hey,

ich hab ja gelesen, das die avg funktionen oder so nur auf spezielle Werte gesetzt werden.
Wäre es dann für allgemeinere Dinge ein DOIF_Readings so einzusetzen, das die Werte für die Readings erstellt werden?

attr bla DOIF_Readings Duenger_DEVICE:[$DEVICE:Fertility:med3]

und eine Verständnissfrage, was müsste ich verwenden, damit ich herausfinde, ob wie bei wait z.B. 3x der gleiche Wert eintrifft? unabhängig von der Pull-Intervallszeit? also mein einen Sensor frag ich 5-Minütlich ab, den anderen nur alle 20 Minuten?

Vielen dank für die Ganzen Funkionen im DOIF..

1) Das Triggern auf verschiedene Devices über $DEVICE dürfte nicht funktionieren. Die neuen Funktionen arbeiten mit konkreten Readings und damit auch mit konkreten Devices.

2) Man könnte mit Hilfe von Instanzvariablen im Perl-Mode definieren:

DOIF
init {$_last=[?<mydevice>:<myreading>];$_count=0;}
{if ([<mydevice>:<myreading>] == $_last) {
    $_count++;
    if ($_count == 3) {
      set_fhem"....";
      $_count =0;
    }
  } else {
       $_count=0;
  }
  $_last=[<mydevice>:<myreading>]
}

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

yersinia

Ich kram diesen Thread heraus - wegen einer Frage bezüglich der :diff Funktion mit Zeiten. Ich habe die suche bemüht, aber nichts finden können. -.- (wenn es schon einen Thread dazu gibt bitte einen Link zur Verfügung stellen)

Folgendes habe ich vor: Abends wird ein Badfenster zum Lüften geöffnet und gern vergessen. Um dies gerade im Winter zu verhindern sende ich eine Nachricht an eine Enigma2 Box. Das funktioniert. Nun würde ich das gern smarter machen, da es gerade im Herbst und Frühling durchaus noch schöne Tage gibt bei denen das Fenster länger aufbleiben kann. Dann drückt man die Nachricht weg - und aus den Augen, aus dem Sinn. ::)
Ich möchte nun, dass die Nachricht gesendet wird wenn entweder eine Differenz oder die maximale Zeit erreicht wird, nachdem das Fenster geöffnet worden ist. Mein DOIF sieht derzeit so aus:
(([fenster:state] eq "open")
and ([enigma2:state] eq "on"))
(set enigma2 msg info 5 "Fenster ist noch auf!")

Mit wait 720 und do resetwait.

Mit :diff hab ich mir das so vorgestellt:
(([fenster:state] eq "open")
and ([sensor:temperature:diff3] > 5)
and ([enigma2:state] eq "on"))
(set enigma2 msg info 5 "Fenster ist noch auf!")


Meines Verständnisses nach wirkt sich wait "nur" auf die Wartezeit, bis der Befehl (cmd_1) ausgeführt wird, aus - verzögerte Ausführung also.
Hätte demnach also eine verzögernde Wirkung auf die Ausführung nachdem die Differenz überschritten ist. Allerdings möchte ich die vergangene Zeit mit als weitere Bedingung einbeziehen - mit pseudo code ungefähr so:
(([fenster:state] eq "open")
and (([sensor:temperature:diff3] > 5) or (time_difference > 10))
and ([enigma2:state] eq "on"))
(set enigma2 msg info 5 "Fenster ist noch auf!")


Über einen Denkanstoß wäre ich dankbar.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Damian

Ich hatte da mal etwas Ähnliches gebastelt, vielleicht kannst du es für deinen Anwendungsfall gebrauchen:

defmod di_Fenster_Bad_Ansage DOIF subs {\
  sub send_alexa {\
    my ($dev,$text,$volume)=@_;;\
$volume=20 if (!defined ($volume));;\
    fhem("attr $dev speak_volume $volume");;\
    fhem("set $dev speak $text");;\
  }\
}\
\
{if ([$SELF:increase]) {send_alexa("echo_Bad","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]) {send_alexa("echo_Bad","Bitte Fenster schließen");;set_State("Ansage Schließen")}}
attr di_Fenster_Bad_Ansage DOIF_Readings increase: [?BadFenster] eq "closed" and [TH_Bad_HM:humidity:diff] > 5,\
cold:[?BadFenster] eq "open" and ([$SELF:temp] - [TH_Bad_HM:measured-temp]) > 0.5
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kotaro

Hi,

soweit ich das wait verstanden habe, und es auch im Commandref steht, wird nach einem Wait der Timer abgebrochen, wenn ein anderer Fall wahr wird.  --> Hier wäre eine Kontrolle, ob ein DOELSE ausgeführt wird (ohne Befehle - Sichtbar an cmd_2) und dadurch nicht ausgeführt wird.

Zitat von: yersinia am 21 Mai 2020, 14:32:07

Mit :diff hab ich mir das so vorgestellt:
(([fenster:state] eq "open")
and ([sensor:temperature:diff3] > 5)
and ([enigma2:state] eq "on"))
(set enigma2 msg info 5 "Fenster ist noch auf!")


Meines Verständnisses nach wirkt sich wait "nur" auf die Wartezeit, bis der Befehl (cmd_1) ausgeführt wird, aus - verzögerte Ausführung also.
Hätte demnach also eine verzögernde Wirkung auf die Ausführung nachdem die Differenz überschritten ist. Allerdings möchte ich die vergangene Zeit mit als weitere Bedingung einbeziehen - mit pseudo code ungefähr so:
(([fenster:state] eq "open")
and (([sensor:temperature:diff3] > 5) or (time_difference > 10))
and ([enigma2:state] eq "on"))
Letzte Änderung: Heute um 10:17:28
+ Erweiterte Optionen...
Shortcuts: mit Alt+S Beitrag schreiben oder Alt+P für Vorschau




(set enigma2 msg info 5 "Fenster ist noch auf!")


Über einen Denkanstoß wäre ich dankbar.


Ich würde einfach ein anderen DOELSEIF fall einfügen

([?fenster:state] eq "open"
and [?enigma2:state] eq "on"
        and ([sensor:temperature:diff3] > 5 )
(set enigma2 msg info 5 "Fenster ist noch auf und ein Temperaturabfall >5°C")
(DOELSEIF[fenster:state] eq "open"
        and [?enigma2:state] eq "on")
        (set enigma2 msg info 5 "Fenster ist noch auf!")

attr xxx wait 10:720




Achso, ich weiß nicht, warum du so viele Klammern eingefügt hast, das ist eher notwendig um eigene Prioritäten mit or festzulegen.
Hier nochmal ein Hinweis, um es zu lesen https://wiki.fhem.de/wiki/DOIF/Operatorenrangfolge

Hoffe es klappt so, und ich es richtig verstanden habe

Edit: hatte nochmal die Reihenfolge geändert und ? vor einigen Werten gesetzt, da diese doch kein Trigger darstellen sollen, das DOIF zu triggern.

yersinia

#110
Danke kotaro, das hat geholfen. Ich habe das DOIF umgebaut und werde Testen. :)

Zitat von: kotaro am 22 Mai 2020, 10:14:10Achso, ich weiß nicht, warum du so viele Klammern eingefügt hast, das ist eher notwendig um eigene Prioritäten mit or festzulegen.
Hier nochmal ein Hinweis, um es zu lesen https://wiki.fhem.de/wiki/DOIF/Operatorenrangfolge
Das nutze ich bezüglich der Übersichtlichkeit - insbesondere das Synthax-Highlighting. Bei der UND-Verknüpfung benötige ich das eigtl nicht, stimmt.

Danke auch für den Hinweis mit dem ?, das wusste ich noch nicht. :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Damian

Zitat von: Christoph Morrison am 16 Januar 2019, 18:08:54
Hallo Damian,

ohne diesen Thread vorher gelesen zu haben, hatte ich mir just heute DOIF um den Median erweitert, einen Patch findest hier.

Gruß
Christoph

Der Median bei Aggregationsfunktionen ist jetzt in der aktuellen DOIF-Version drin: siehe https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF


neyzen

Hallo,

ich bekomme mit folgender Def einen Fehler im event_Readings

avg_Cpu_Prozent:[sysmon:Cpu_Prozent:avg2],\
avg_Cpu_Temperatur:[sysmon:Cpu_Temperatur:avg2]


Fehler error in event_Readings \ avg_Cpu_Temperatur:[sysmon:Cpu_Temperatur:avg2], wrong reading specification for: \ avg_Cpu_Temperatur

Vermutlich passt die ,/ nicht.
Mit einem , schluckt er es aber der zweite Wert wird nicht gemittelt. Hier wird er ohne zu mitteln nur der letzte Wert übernommen. Der erste Wert wird aber gemittelt. Was mach ich den falsch?

Damian

Zitat von: neyzen am 08 Februar 2021, 00:45:28
Hallo,

ich bekomme mit folgender Def einen Fehler im event_Readings

avg_Cpu_Prozent:[sysmon:Cpu_Prozent:avg2],\
avg_Cpu_Temperatur:[sysmon:Cpu_Temperatur:avg2]


Fehler error in event_Readings \ avg_Cpu_Temperatur:[sysmon:Cpu_Temperatur:avg2], wrong reading specification for: \ avg_Cpu_Temperatur

Vermutlich passt die ,/ nicht.
Mit einem , schluckt er es aber der zweite Wert wird nicht gemittelt. Hier wird er ohne zu mitteln nur der letzte Wert übernommen. Der erste Wert wird aber gemittelt. Was mach ich den falsch?

Im Editor des Attributes werden keine \ eingegeben, dass wir ja gerade bemängelt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

neyzen

Dann werde ich wohl zwei DOIF`s erstellen für jeden einzelnen Mittelwert :-\

Damian

Zitat von: neyzen am 08 Februar 2021, 16:00:16
Dann werde ich wohl zwei DOIF`s erstellen für jeden einzelnen Mittelwert :-\

Wozu?

avg_Cpu_Prozent:[sysmon:Cpu_Prozent:avg2],
avg_Cpu_Temperatur:[sysmon:Cpu_Temperatur:avg2]

Sollte im Attribut-Feld funktionieren (ohne \)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

neyzen

Ja das aktzeptiert er ja,nur wird der zweite wert
avg_Cpu_Prozent:[sysmon:Cpu_Prozent:avg2],
avg_Cpu_Temperatur:[sysmon:Cpu_Temperatur:avg2]

nicht gemittelt. Hier wird er einfach von dem reading so übernommen wie er ausgegeben wird.
Der erste wird aber gemittelt.


Damian

Bei mir funktioniert es:

Internals:
   CFGFN     
   DEF        ##
   FUUID      60217791-f33f-c0d4-cc07-18d3dcd4a49987dc
   MODEL      FHEM
   NAME       di_avg
   NOTIFYDEV  test,global
   NR         5120
   NTFY_ORDER 50-di_avg
   STATE      initialized
   TYPE       DOIF
   VERSION    22913 2020-10-04 21:46:02
   READINGS:
     2021-02-08 18:42:52   av1             2
     2021-02-08 18:43:32   av2             3.5
     2021-02-08 18:40:33   cmd             0
     2021-02-08 18:40:33   mode            enabled
     2021-02-08 18:40:33   state           initialized


getestet mit:

setreading test r1 2
setreading test r3 3
setreading test r3 4
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

neyzen

Jetzt habe ich mal ein dummy mit 2 verschiedenen readings gesetzt so wie in deinem Beispiel. Hier wird genau für beide auch der Mittelwert gebildet. Aber beim tatsächlichen reading geht das beim zweiten nicht. Er übernimmt weiter einfach den letzten reading. Auch wenn ich avg3 mache,selbes Problem. Ich kanns nicht erklären.
Ich hab ein zweites DOIF erstellt mit dem gleichen event_readings. Da wird dann der erste nicht gemittelt aber dafür der zweite :)
?