Neues Feature: Durchschnitt, Median, Differenz, prozentualer Anstieg

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

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: Neuhier am 27 Januar 2019, 20:42:29
Der Fehler, bei mir ,ist der Doppelpunkt hinter dem Device.
Setze ich dort nur einen Punkt, kommt keine Fehlermeldung mehr.
Poste mal list von dem DOIF-Device
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Neuhier

list HumAK
ZitatInternals:
   CFGFN     
   DEF        ##
   
   MODEL      FHEM
   NAME       HumAK
   NR         435
   NTFY_ORDER 50-HumAK
   STATE      initialized
   TYPE       DOIF
   CHANGED:
     humidity:
   CHANGEDWITHSTATE:
     humidity:
   DOIF_Readings:
     humidity   ::ReadingValDoIf($hash,'AK.humidity','avg5')
   READINGS:
     2019-01-27 20:54:18   cmd             0
     2019-01-27 20:54:51   humidity       
     2019-01-27 20:54:18   mode            enabled
     2019-01-27 20:54:18   state           initialized
   Regex:
     DOIF_Readings:
       AK.humidity:
         humidity:
           avg5       ^AK.humidity$:^avg5:
   condition:
   devices:
   do:
     0:
   helper:
     DOIF_Readings_events
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings humidity:[AK.humidity:avg5]

Damian

Zitat von: Neuhier am 27 Januar 2019, 21:03:48
list HumAK

So wie du es jetzt angegeben hast, ist avg5 ein Reading. Es muss schon die korrekte Syntax sein, sonst kann es nicht funktionieren.

[AK:humidity:avg5]

Warten wir ab, ob es bei den anderen Usern funktioniert.

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

Neuhier

[AK:humidity:avg5] ergibt den geposteten Fehler.
[AK.humidity:avg5] geht ohne Fehler.
Aber es ist nix Wichtiges, kann also abwarten, ob es woanderst fehlerfrei läuft.

sentinel1

Zitat von: Damian am 27 Januar 2019, 21:20:58

Warten wir ab, ob es bei den anderen Usern funktioniert.

ich habe zwar nur kurz getestet aber bei mir funktioniert die v0.4.

Gruß,
Claudiu

cwagner

Teste die neuen Aggregat-Funktionen und dabei fiel mir auf: es scheint weiterhin so zu sein, dass z.B. med nur über max 9 Werte läuft. Bei med20 z.B. bekomme ich als Fehlermeldung
error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

Befremdlich: benutze ich med20 direkt in der Bedingung eines DOIFs bekomme ich keine Fehlermeldung und im Listing wird auch korrekt Dim 20 für die Größe des Arrays angegeben.

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 01 Februar 2019, 14:00:14
Teste die neuen Aggregat-Funktionen und dabei fiel mir auf: es scheint weiterhin so zu sein, dass z.B. med nur über max 9 Werte läuft. Bei med20 z.B. bekomme ich als Fehlermeldung
error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

Befremdlich: benutze ich med20 direkt in der Bedingung eines DOIFs bekomme ich keine Fehlermeldung und im Listing wird auch korrekt Dim 20 für die Größe des Arrays angegeben.

Christian

Poste bitte das Listing vom dem DOIF-Device.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Hier das Listing mit dem Versuch, in einem DOIF-Reading einen Median über 20 Werte zu bilden:

nternals:
   CHANGED   
   DEF        ([Lueftung] eq "max") (set Steller_Zuluft gpio 255) (set Steller_Abluft gpio 255)
DOELSEIF ([abwesend] eq "an" or [Lueftung] eq "AUS") (set Steller_Zuluft gpio 0) (set Steller_Abluft gpio 0)
DOELSEIF ([Lueftung] eq "min" or [$SELF:sCO2]<700) (set Steller_Zuluft gpio 55) (set Steller_Abluft gpio 55) ##LWR 0,8/h
DOELSEIF ([?Lueftung] eq "auto" and [$SELF:sCO2]>([$SELF:CO2_alt]+10) and [Steller_Zuluft:gpio]<250) (setreading $SELF CO2_alt [$SELF:sCO2],setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]+5))},set Steller_Zuluft gpio [$SELF:Stell_neu]) (setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]))},set Steller_Abluft gpio [$SELF:Stell_neu]) ## Vereinfachung möglich mit dirkten Einstetzen von Stellwert-Zuluft als Steuerwert bei Abluft
DOELSEIF ([?Lueftung] eq "auto" and [$SELF:sCO2]<([$SELF:CO2_alt]+10) and [Steller_Zuluft:gpio]>59) (setreading $SELF CO2_alt [$SELF:sCO2],setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]-5))},set Steller_Zuluft gpio [$SELF:Stell_neu]) (setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]))},set Steller_Abluft gpio [$SELF:Stell_neu])
   FUUID      5c43298b-f33f-e1df-09ea-ab76a5ff2ccd3b93
   MODEL      FHEM
   NAME       DI_Lueftung
   NR         115
   NTFY_ORDER 50-DI_Lueftung
   STATE      Betrieb
   TYPE       DOIF
   DOIF_Readings:
     sCO2       ::ReadingValDoIf($hash,'CO2Sensor','CO2','','med20')
   OLDREADINGS:
   READINGS:
     2019-02-01 08:25:47   CO2_alt         1253
     2019-02-01 14:38:41   Device          DI_Lueftung
     2019-02-01 08:26:02   Stell_neu       55
     2019-02-01 09:24:02   cmd             3.2
     2019-02-01 09:23:47   cmd_count       1
     2019-02-01 09:24:02   cmd_event       DI_Lueftung
     2019-02-01 09:24:02   cmd_nr          3
     2019-02-01 09:24:02   cmd_seqnr       2
     2019-02-01 14:38:41   e_DI_Lueftung_sCO2 error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     2019-02-01 09:22:33   mode            enabled
     2019-02-01 14:38:41   sCO2            error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     2019-02-01 09:24:02   state           Betrieb
     2019-02-01 09:24:02   wait_timer      no timer
     2019-02-01 14:38:41   warning         condition c03: Argument "error in DOIF_Readings: Modification of non-creatable ar..." isn't numeric in numeric lt (<)

   Regex:
     DOIF_Readings:
       CO2Sensor:
         sCO2:
           CO2        ^CO2Sensor$:^CO2:
       DI_Lueftung:
     accu:
       CO2Sensor:
         accu:
           CO2        ^CO2Sensor$:^CO2:
   accu:
     CO2Sensor CO2:
       dim        9
       value:
         968
         951
         954
         968
         975
         970
         985
         967
         985
   akku:
     CO2Sensor CO2:
       945
       949
       949
       926
       926
       932
       932
       947
       947
   attr:
     cmdState:
     repeatsame:
       1
       1
       1
       0
       0
     wait:
       0:
         0
         15
       1:
         0
         15
       2:
         0
         15
       3:
         0
         15
       4:
         0
         15
       5:
         0
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'Lueftung','STATE') eq "max"
     1          ::InternalDoIf($hash,'abwesend','STATE') eq "an" or ::InternalDoIf($hash,'Lueftung','STATE') eq "AUS"
     2          ::InternalDoIf($hash,'Lueftung','STATE') eq "min" or ::ReadingValDoIf($hash,'DI_Lueftung','sCO2')<700
     3          ::InternalDoIf($hash,'Lueftung','STATE') eq "auto" and ::ReadingValDoIf($hash,'DI_Lueftung','sCO2')>(::ReadingValDoIf($hash,'DI_Lueftung','CO2_alt')+10) and ::ReadingValDoIf($hash,'Steller_Zuluft','gpio')<250
     4          ::InternalDoIf($hash,'Lueftung','STATE') eq "auto" and ::ReadingValDoIf($hash,'DI_Lueftung','sCO2')<(::ReadingValDoIf($hash,'DI_Lueftung','CO2_alt')+10) and ::ReadingValDoIf($hash,'Steller_Zuluft','gpio')>59
   devices:
     0           Lueftung
     1           abwesend Lueftung
     2           Lueftung DI_Lueftung
     3           DI_Lueftung Steller_Zuluft
     4           DI_Lueftung Steller_Zuluft
     all         Lueftung abwesend DI_Lueftung Steller_Zuluft
   do:
     0:
       0          set Steller_Zuluft gpio 255
       1          set Steller_Abluft gpio 255
     1:
       0          set Steller_Zuluft gpio 0
       1          set Steller_Abluft gpio 0
     2:
       0          set Steller_Zuluft gpio 55
       1          set Steller_Abluft gpio 55
     3:
       0          setreading DI_Lueftung CO2_alt [DI_Lueftung:sCO2],setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]+5))},set Steller_Zuluft gpio [DI_Lueftung:Stell_neu]
       1          setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]))},set Steller_Abluft gpio [DI_Lueftung:Stell_neu]
     4:
       0          setreading DI_Lueftung CO2_alt [DI_Lueftung:sCO2],setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]-5))},set Steller_Zuluft gpio [DI_Lueftung:Stell_neu]
       1          setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio]))},set Steller_Abluft gpio [DI_Lueftung:Stell_neu]
     5:
   helper:
     DOIF_Readings_events
     event      sCO2: error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     globalinit 1
     last_timer 0
     sleepdevice DI_Lueftung
     sleepsubtimer -1
     sleeptimer -1
     timerdev   DI_Lueftung
     timerevent sCO2: error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     triggerDev DI_Lueftung
     DOIF_eventas:
       cmd_nr: 3
       cmd_seqnr: 2
       cmd_event: DI_Lueftung
       state: Betrieb
     timerevents:
       sCO2: error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     timereventsState:
       sCO2: error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     triggerEvents:
       sCO2: error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

     triggerEventsState:
       sCO2: error in DOIF_Readings: Modification of non-creatable array value attempted, subscript -20 at ./FHEM/98_DOIF.pm line 1040.

   internals:
     0           Lueftung:STATE
     1           abwesend:STATE Lueftung:STATE
     2           Lueftung:STATE
     3           Lueftung:STATE
     4           Lueftung:STATE
     all         Lueftung:STATE abwesend:STATE
   itimer:
   readings:
     2           DI_Lueftung:sCO2
     3           DI_Lueftung:sCO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
     4           DI_Lueftung:sCO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
     all         DI_Lueftung:sCO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings sCO2:[CO2Sensor:CO2:med20]
   DbLogExclude .*
   do         always
   event-on-change-reading cmd
   repeatsame 1:1:1:0:0
   room       Lueftung
   startup    set $SELF checkall
   state      Betrieb
   verbose    2
   wait       0,15:0,15:0,15:0,15:0,15:0


Die Behauptung, es funktioniere in einer DOIF-Bedingung ist falsch (hätte ich doch ordentlich auf checkall geklickt)

Liebe Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Das Problem ist, dass du nachdem du DOIF_Readings definiert hast, die DOIF-Definition (DEF-Bereich) noch mal geändert hast. Wenn du die DOIF-Definition änderst, musst du danach noch mal DOIF-Readings anklicken und übernehmen.

Ich werde da noch einen Automatismus einbauen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Das kann ich so nicht bestätigen: Ohne die DEF angefasst zu haben, erhalte ich beim Speichern des attr DOIF-Readings sofort die Fehlermeldungen...

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: Damian am 01 Februar 2019, 14:56:09
Das Problem ist, dass du nachdem du DOIF_Readings definiert hast, die DOIF-Definition (DEF-Bereich) noch mal geändert hast. Wenn du die DOIF-Definition änderst, musst du danach noch mal DOIF-Readings anklicken und übernehmen.

Ich werde da noch einen Automatismus einbauen.

Version 0.6 im ersten Post.

Jetzt werden alle Attribut-Definitionen neu gesetzt, wenn man defmod aufruft. Dadurch wird sichergestellt, dass eine nachträgliche Änderung der Definition (DEF) des DOIF-Devices zur Laufzeit keine Probleme mehr bereitet.

PS. Ich denke, dass med3 ausreichen sollte, um Ausreißer zu eliminieren. Es müssten dann schon bei drei nacheinander folgenden Werten zwei Ausreißer dabei sein, damit einer durchkommt - das sollte recht unwahrscheinlich sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: cwagner am 01 Februar 2019, 21:03:08
Das kann ich so nicht bestätigen: Ohne die DEF angefasst zu haben, erhalte ich beim Speichern des attr DOIF-Readings sofort die Fehlermeldungen...

Christian

Korrigierte Version 0.7 im ersten Post.

Da muss man erst mal drauf kommen, dass {max(4,10)} 4 liefert  >:(

Es scheint hier die lexikografische Reihenfolge gemeint zu sein. Ich habe es jetzt selber programmiert.

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

cwagner

Funktioniert nun - getestet mit med20

Was ist die Bedeutung von accu und akku im Listing?

Und immer wieder: Danke für Deine Super-Arbeit!

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 01 Februar 2019, 23:40:18
Funktioniert nun - getestet mit med20

Was ist die Bedeutung von accu und akku im Listing?

Und immer wieder: Danke für Deine Super-Arbeit!

Christian

Unterhalb von accu werden die Daten der Sensoren gespeichert.

Ursprünglich hieß es intern akku. Mit der neuen Version und einem durchgestarteten System sollte akku nicht mehr sichtbar sein.

Mit med20 werden die Daten aus meiner Sicht unnötig stark verfälscht. Zusätzlich wird bei jedem Trigger mehr Rechenpower benötigt.

Du könntest, um herauszufinden, welcher Wert für dich am besten ist, folgendes DOIF bauen:

define CO2Med DOIF\
{set_Reading("ori",[CO2Sensor:CO2],1)}\
{set_Reading("med3",[CO2Sensor:CO2:med3],1)}\
{set_Reading("med5",[CO2Sensor:CO2:med5],1)}\
{set_Reading("med7",[CO2Sensor:CO2:med7],1)}\
{set_Reading("med20",[CO2Sensor:CO2:med20],1)}


Im Gegensatz zum Attribut DOIF_Readings werden hier bewusst Events nach außen produziert. Dadurch kann man die Werte als Graphen in einem Plot gegenüberstellen und die Abweichungen zum Originalwert erkennen.

Beim Median würde ich immer ungerade Zahlen nehmen, da bei geraden immer ein Mittelwert gebildet wird.

Und wenn med3 ausreicht, würde ich den nehmen, da bei jedem Trigger von CO2Sensor:CO2 weniger Rechenpower benötigt wird als bei med20.

Edit: Für angehende Informatiker: Der Sortieraufwand (der im Median drinsteckt) ist mit mindestens n*log(n) (oft n^2) immer überproportional hoch. Vergleich: 3*log(3)=1,49 bis 3*3=9 dagegen 20*log(20)=26,02 bis 20*20=400. Für den Laien heißt das, dass die Angabe med20 schlimmstenfalls 400/9=44,44 mal mehr Rechenleistung dem System abverlangt als med3. Bei med100 z. B. wäre es schon ein Faktor 100*100/(3*3)=1111,11 gegenüber med3 ;)

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

cwagner

Vielen Dank, Damian, da habe ich wieder eine Menge gelernt, was mich weiterbringt. Ich habe Deinen Ratschlag folgend dann mal das kleine Vergleichs-Doif genommen und auf die Messwerte gelegt, die aktuell in größeren Abständen extreme Spitzen haben, die meine Steuerung sehr stark hochschaukeln würden.

Da sind Deine Aussagen dann grafisch sehr plakativ belegt. Sehr auffällig ist auch die zeitliche Verschiebung der eingeebneten Spitzen.

Herzliche Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB