"Statistics Modul" Welche Geräte werden unterstützt?

Begonnen von PowderK, 19 Mai 2014, 21:41:33

Vorheriges Thema - Nächstes Thema

Jamo

Hallo alle zusammen,
ich habe den Gassensor von Homematic, der wird auch nicht vom Statistic Modul unterstützt.

Nachdem ich aber 2 userreading mit "power" und "energy" mittels attribute erstellt habe,
wird auch der jetzt unterstützt, also das geht hervorragend.  :-)

Gruss, Ingolf.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

Alveole

Hallo,
ich versuche mich auch gerade an statistics mit einem KNX-Aktor.
Ich möchte gern die Aussentemperatur auswerten.

definiert habe ich:

define Garten_temp EIB 10c8
attr Garten_temp IODev EIB
attr Garten_temp alias Temperatur außen
attr Garten_temp dummy 1
attr Garten_temp model tempsensor
attr Garten_temp room Wetter

define Garten_temp_statistic statistics Garten_temp
attr Garten_temp_statistic room Wetter


Nun bekomme ich aber als Readings folgendes angezeigt:

ZitatstatStateDay
statStateDay   
7.7_°C: 00:19:59 7.7_°C_Count: 1 7.9_°C: 00:09:59 7.9_°C_Count: 1 8.1_°C: 00:29:56 8.1_°C_Count: 1 8.2_°C 00:00:00 8.2_°C: 00:05:02 8.2_°C_Count 00:00:01 (since: 2016-03-27_21:11:16)

statStateMonth   
7.7_°C: 00:19:59 7.7_°C_Count: 1 7.9_°C: 00:09:59 7.9_°C_Count: 1 8.1_°C: 00:29:56 8.1_°C_Count: 1 8.2_°C 00:00:00 8.2_°C: 00:05:02 8.2_°C_Count 00:00:01 (since: 2016-03-27_21:11:16)
   
statStateYear
7.7_°C: 00:19:59 7.7_°C_Count: 1 7.9_°C: 00:09:59 7.9_°C_Count: 1 8.1_°C: 00:29:56 8.1_°C_Count: 1 8.2_°C 00:00:00 8.2_°C: 00:05:02 8.2_°C_Count 00:00:01 (since: 2016-03-27_21:11:16)
   
state
7.7 °C

wie bekomme ich das in ein ordentliches Format was ich dann wieder mit einem notify einem dummy zuweisen kann?

Danke!

tupol

Ein min-max-Reading für den state definieren. State ist per default ein duration -Reading

Alveole

#153
Hallo tupol,
Du meinst folgendes?

attr Garten_temp_statistic minAvgMaxReadings state

DANKE!!!

Romoker

#154
Hallo,

ich möchte die Anzahl der state-Zustände "open" eines Sensors pro Stunde zählen. Standardmäßig werden für Duration-Readings nur Day|Month|Year unterstützt.
Definiere ich über Attribut "durationReadings state", werden auch nur statStateDay, statStateMonth und statStateYear im Gerät erstellt, obwohl zumindest in der deutschen Commandref http://fhem.de/commandref_DE.html#statistics auch "Stunde" funktionieren sollte.

Die Alternative eine expliziten "singularReadings" führt leider auch zu keinem Erfolg.

Internals:
   CFGFN
   DEF        AL_AZ4_Sensor_Btn_0[1-5]
   DEV_REGEXP AL_AZ4_Sensor_Btn_0[1-5]
   NAME       AL_statistics
   NR         10709
   NTFY_ORDER 10-AL_statistics
   PREFIX     stat
   STATE      Updated stats for: AL_AZ4_Sensor_Btn_03
   TYPE       statistics
   Readings:
     2016-04-24 13:34:37   monitoredDevicesCUL_HM AL_AZ4_Sensor_Btn_01,AL_AZ4_Sensor_Btn_02,AL_AZ4_Sensor_Btn_03,AL_AZ4_Sensor_Btn_04,AL_AZ4_Sensor_Btn_05
     2016-04-24 14:59:56   nextPeriodChangeCalc 2016-04-24 15:59:55
     2016-04-24 15:20:31   state           Updated stats for: AL_AZ4_Sensor_Btn_03
   Fhem:
     modulVersion $Date: 2016-04-03 12:58:45 +0200 (Sun, 03 Apr 2016) $
     nextPeriodChangeTime 1461506395
Attributes:
   ignoreDefaultAssignments 1
   room       Administration
   singularReadings AL_AZ4_Sensor_Btn_05:state:open:Hour


Für hilfreiche Hinweise bin ich dankbar.

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

tupol


Romoker

Bei dem Sensor handelt es sich um das 8-Kanal-Sendemodul HM-MOD-EM-8. An drei Kanaleingängen habe ich Bewegungssensoren angeschlossen. Die Sensoren wechseln bei Bewegung von "closed" auf "open". Ich möchte die Anzahl der Bewegungen über den Tag darstellen, um ein Bewegungsprofil darstellen zu können. Dazu reicht mir die Aggregation auf eine Stunde. Das könne ich auch mit dem Modul HourCounter realisieren, mit dem statistics-Modul wäre es aber eleganter.

Ich kann mir auch weitere Anwendungsfälle vorstellen, z.B. bei Verbrauchsmessungen auf Basis von Impulsen.

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

tupol

Es gibt im nächsten Update das Attribute durationPeriodHour

Für eine Verbrauchsmessung ist HourCounter besser geeignet.

Romoker

Ich bin begeistert, wie schnell hier aus einer Frage eine Featurezusage wird. Vielen Dank!!
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

Raven

Zitat von: tupol am 25 April 2016, 19:08:31
Für eine Verbrauchsmessung ist HourCounter besser geeignet.

Servus
Aus welchen Grund ist bitte HourCounter besser geeignet?

Ich würde gerne specialDeltaPeriods für ein Fensterkontakt definieren.
Was gebe ich bitte unter dem Gerätewert an? Duration? Open?


specialDeltaPeriods <Gerät:Gerätewert:Zeitraum:Anzahl1:Anzahl2:...>
Proxmox-Prod/Dev: Homematic i.V.m. VCCU (HMLan, HM-MOD-RPI-PCB), Philips Hue, Viessmann (optolink)
Fritzbox 7590

Florian_GT

Sehr merkwürdig.  :o

Obwohl ich so definiert habe:
## TEMP
define stats_temp1 statistics temp_.*
attr stats_temp1 minAvgMaxReadings temperature
attr stats_temp1 singularReadings temp_.*:temperature:(Min|Avg|Max):(Hour|Day|Month|Year)

legt er immer statHumidityDay an

Dabei hat der Temperatur Sensor nur "temperature" und "state" als Readings.
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Florian_GT

Zitat von: afloria am 24 August 2016, 00:08:06
Sehr merkwürdig.  :o

Obwohl ich so definiert habe:
## TEMP
define stats_temp1 statistics temp_.*
attr stats_temp1 minAvgMaxReadings temperature
attr stats_temp1 singularReadings temp_.*:temperature:(Min|Avg|Max):(Hour|Day|Month|Year)

legt er immer statHumidityDay an


und auch schon selber gelöst.

Wenige Zeit später wird dann auch "humidity" als Reading angelegt durch das dewpoint module wenn ich das richtig sehe.

### ALLGEMEIN - HUMIDITY
define dew_all dewpoint dewpoint .* temperature humidity dewpoint
attr dew_all absFeuchte 1


Ich habe jetzt dht_.* als Device Regex eingetragen, so wird nicht mehr jedes Device versucht zu berechnen.

Könnte man bei Gelegenheit mal prüfen, warum das nicht zunächst prüft ob temperature und humidity auch vorhanden sind...
Dabei hat der Temperatur Sensor nur "temperature" und "state" als Readings.
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Gruvol

Hallo allerseits,

ich habe vor meinen Stromverbrauch zu messen und will in einer Grafik monatlich angezeigt bekommen, welchen Verbrauch ich hatte.
Dabei habe ich mir mehrere Varianten der Umsetzung in fhem angeschaut. Diese hier scheint mir am vielversprechendsten zu sein.

Ich stelle mir aktuell die Frage, ob man das Statistics-Modul auch mit einer Datenbank kombinieren kann, da ich kein Fan von Textdateien bin und diese schnell unübersichtlich und statisch sind.
Zum anderen ist mir eines noch nicht ganz klar. Meine Aktoren, z.B. Fibaro WallPlugs liefern Werte in dessen Readings. Da ich diese Werte aber nach Möglichkeit nicht löschen möchte, ist die Frage, ob es Sinn macht, eigene Readings zu erstellen? Wenn ja, hat jemand Erfahrungen gemacht, wie man dies am elegantesten umsetzt?

Viele Grüße
Gruvol


Florian_GT

Zitat von: Gruvol am 07 Oktober 2016, 16:04:13
Hallo allerseits,

ich habe vor meinen Stromverbrauch zu messen und will in einer Grafik monatlich angezeigt bekommen, welchen Verbrauch ich hatte.
Dabei habe ich mir mehrere Varianten der Umsetzung in fhem angeschaut. Diese hier scheint mir am vielversprechendsten zu sein.

Ich stelle mir aktuell die Frage, ob man das Statistics-Modul auch mit einer Datenbank kombinieren kann, da ich kein Fan von Textdateien bin und diese schnell unübersichtlich und statisch sind.
Zum anderen ist mir eines noch nicht ganz klar. Meine Aktoren, z.B. Fibaro WallPlugs liefern Werte in dessen Readings. Da ich diese Werte aber nach Möglichkeit nicht löschen möchte, ist die Frage, ob es Sinn macht, eigene Readings zu erstellen? Wenn ja, hat jemand Erfahrungen gemacht, wie man dies am elegantesten umsetzt?

Viele Grüße
Gruvol

Sollte grundsätzlich möglich sein, steht bei mir jedoch auch nur auf der Todo Liste. Wenn ich es mal erarbeitet habe... schreibe ich dir... oder wenn ich mal Zeit habe, könnten wir uns da zusammen dransetzen...
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

optimizer

Hallo,

zur rollierenden Verbrauchsmessung finde ich das Attribut specialDeltaPeriods echt super. Damit man schnell die vorhergehende Periode vergleichen kan,n habe ich die Funktion statistics_doStatisticSpecialPeriod2 um eine Berechnung der Vorgängerperiode erweitert. Damit ist dann z.B. ein saisonbereinigter 12-Monats-Vergleich des Stromverbrauchs oder -erzeugung leicht möglich. In einem readingsgroup sieht das dann z.B. so aus wie im Anhang (12Monate u. vorher).

Wäre natürlich schön, wenn die Änderungen ins Modul einfliessen würden:

sub statistics_doStatisticSpecialPeriod2 ($$$$$$)
{

   my ($hash, $dev, $readingName, $periodText, $decPlaces, $value) = @_;
   my $name = $hash->{NAME};
   my $pattern;
   
   my $specialDeltaPeriods = AttrVal($name, "specialDeltaPeriods", "");
   return   unless $specialDeltaPeriods;

   # Check if reading occures in attribute specialDeltaPeriods, extract period numbers
   my $devName = $dev->{NAME};
   $pattern = $devName . ":" . $readingName . ":" . $periodText . ':([\d:]+)';
   #better userinput-error-handling needed. check for missing arguments
   statistics_Log $hash, 3, "pattern: $pattern";
   return   unless $specialDeltaPeriods =~ $pattern;
   
   #Determine number of periods and maximal number
   my @periods = split /:/, $1;
   my $maxNumber=0;
   @periods = sort { $a <=> $b } @periods;
   $maxNumber = $periods[$#periods];
   my $PeriodsCount = @periods;                 #count elements in array, because $#periods not worked

   #Determine reading names
   my $statReadingName = $hash->{PREFIX} . ucfirst($readingName) . ucfirst($periodText);
   my $hiddenReadingName = ".".$devName . ":" . $readingName . $periodText;

  # Update hidden stack
   my @hidden = ();
   if (exists ($hash->{READINGS}{$hiddenReadingName}{VAL}))
      { @hidden = split / /, $hash->{READINGS}{$hiddenReadingName}{VAL}; }

   unshift @hidden, $value;
   statistics_Log $hash, 3, "Add $value to $hiddenReadingName";
   
   while ( $#hidden >= ($maxNumber * 2 ) ) {
      #while ( $#hidden >= ($maxNumber * 2 ) ) {
      my $lastValue = pop @hidden;
      statistics_Log $hash, 4, "Remove last value '$lastValue' from '$hiddenReadingName'";
   }
   
   #Calculate and write specialPeriodValues
   my $result = 0;
   my $counterHidden = 0;
   my $counterPeriods = 0;
   my @result_sum;
   my @result_sumLast;
   my @rValue;
   my @rValueLast;
   
   foreach (@periods) {
   statistics_Log $hash, 3, "$statReadingName Loop period $_ counterPeriods '$counterPeriods+1' from $PeriodsCount";
   $counterHidden = 0;                  # necessary for multiple periods
      foreach (@hidden) {
         $counterHidden++;
         statistics_Log $hash, 3, "$statReadingName ItemLoop value $_ counterHidden: $counterHidden ";   

         if ( $counterHidden < $periods[$counterPeriods] ) {
            $result_sum[$counterPeriods] += $_;
            $rValue[$counterPeriods] = sprintf "%.".$decPlaces."f (%d %s)", $result_sum[$counterPeriods], $counterHidden, $periodText;
            statistics_Log $hash, 3, "$statReadingName period $periods[$counterPeriods] not reaches yet. rValue $rValue[$counterPeriods] ";         
         }
         elsif ( $counterHidden == $periods[$counterPeriods] ) {
            $result_sum[$counterPeriods] += $_;
            $rValue[$counterPeriods] = sprintf "%.".$decPlaces."f", $result_sum[$counterPeriods];
            statistics_Log $hash, 3, "$statReadingName complete periode $periods[$counterPeriods] rValue $rValue[$counterPeriods] ";
         }
         
         #Begin Calc for Last Readings
         if ( $counterHidden  > ($periods[$counterPeriods] ) ) {
            if ( $counterHidden < ($periods[$counterPeriods] * 2 ) ) {
               $result_sumLast[$counterPeriods] += $_;
               $rValueLast[$counterPeriods] = sprintf "%.".$decPlaces."f (%d %s)", $result_sumLast[$counterPeriods], ($counterHidden-$periods[$counterPeriods]), $periodText;
               statistics_Log $hash, 3, "$statReadingName Last period $periods[$counterPeriods] not reaches yet. rValueLast $rValueLast[$counterPeriods] ";
            }
            elsif ( $counterHidden == ( $periods[$counterPeriods] * 2 ) ) {
               #calc for complete Last reading.
               $result_sumLast[$counterPeriods] += $_;
               $rValueLast[$counterPeriods] = sprintf "%.".$decPlaces."f", $result_sumLast[$counterPeriods];
               statistics_Log $hash, 3, "$statReadingName complete Last periode $periods[$counterPeriods] rValueLast: $rValueLast[$counterPeriods] ";
               last;          #calc is done. break out to next hidden item
            } 
         }
      }
      #write readings
      my $rName = $statReadingName . $periods[$counterPeriods];
      statistics_Log $hash, 3, "Set '$rName = $rValue[$counterPeriods]'";
      readingsBulkUpdate($dev, $rName, $rValue[$counterPeriods], 1);
     
      #write last readings
      $rName = $statReadingName . $periods[$counterPeriods] . "Last";
      statistics_Log $hash, 3, "Set '$rName = $rValueLast[$counterPeriods]'";
      readingsBulkUpdate($dev, $rName, $rValueLast[$counterPeriods], 1);

      $counterPeriods++;
   }

   # Store hidden stack
   $result = join( " ", @hidden );
   readingsSingleUpdate($hash, $hiddenReadingName, $result, 0);
   statistics_Log $hash, 3, "Set hidden $hiddenReadingName = $result ";

}


Gruß
optimizer