MQTT Langzeit - Statistiken erstellen

Begonnen von MikeA, 06 März 2023, 10:00:37

Vorheriges Thema - Nächstes Thema

MikeA

Hallo,
ich bin mal wieder an einem Thema dran bei dem ich mich versuche. Folgendes würde ich gerne erreichen, bin aber schon seit Tagen auf dem Holzweg und komme nicht zum Ziel. Aber zur Aufgabe:

Ich habe einen Hoymiles HM-1500 Inverter an meiner PV-Anlage. Von diesem bekomme ich per MQTT die Werte übermittelt die ich auch aktuell dazu nutze die Leistung der einzelnen Strings per SVG-Plot anzuzeigen. Diese werden im Tagesrhytmus erstellt was auch ok ist.
Woran ich mir die Zähne ausbeisse ist.
Ich hätte gerne noch eine Statistik über die Tagesleistung für einen Zeitraum von mehreren Wochen / Monaten und evtl auch Jahren.
Dazu hätte ich gedacht eine Wertübernahme so gegen 23:30 zu machen und die Tages-Gesamtwerte der einzelnen Strings und des kompletten Inverter abzugreifen und in ein Log zu schreiben aus dem dann der Plot generiert wird. Ob das der richtige Ansatz ist sei mal dahin gestellt.

Meine Frage ist:
Kann man obiges mit Hausmitteln von FHEM erreichen, oder ist das eher etwas komplexeres notwendig?
Wenn es nicht so komplex ist wäre ich für einen Hinweis dankbar der mich in die richtige Richtung schubst.
Vielleicht kennt jemand auch einen ähnlichen Fall bei dem ich mir etwas abschauen kann.

Die Reading List sieht so aus:

OpenDTU_5276052:solar/dtu/status:.* status
OpenDTU_5276052:solar/116175466247/name:.* solar_116175466247_name
OpenDTU_5276052:solar/116175466247/device/bootloaderversion:.* bootloaderversion
OpenDTU_5276052:solar/116175466247/device/fwbuildversion:.* fwbuildversion
OpenDTU_5276052:solar/116175466247/device/fwbuilddatetime:.* fwbuilddatetime
OpenDTU_5276052:solar/116175466247/device/hwpartnumber:.* hwpartnumber
OpenDTU_5276052:solar/116175466247/device/hwversion:.* hwversion
OpenDTU_5276052:solar/116175466247/status/limit_relative:.* limit_relative
OpenDTU_5276052:solar/116175466247/status/limit_absolute:.* limit_absolute
OpenDTU_5276052:solar/116175466247/status/reachable:.* reachable
OpenDTU_5276052:solar/116175466247/status/producing:.* producing
OpenDTU_5276052:solar/116175466247/status/last_update:.* last_update
OpenDTU_5276052:solar/116175466247/0/powerdc:.* 116175466247_0_powerdc
OpenDTU_5276052:solar/116175466247/0/yieldday:.* 116175466247_0_yieldday
OpenDTU_5276052:solar/116175466247/0/yieldtotal:.* 116175466247_0_yieldtotal
OpenDTU_5276052:solar/116175466247/0/voltage:.* 116175466247_0_voltage
OpenDTU_5276052:solar/116175466247/0/current:.* 116175466247_0_current
OpenDTU_5276052:solar/116175466247/0/power:.* 116175466247_0_power
OpenDTU_5276052:solar/116175466247/0/frequency:.* 116175466247_0_frequency
OpenDTU_5276052:solar/116175466247/0/powerfactor:.* 116175466247_0_powerfactor
OpenDTU_5276052:solar/116175466247/0/efficiency:.* 116175466247_0_efficiency
OpenDTU_5276052:solar/116175466247/0/reactivepower:.* 116175466247_0_reactivepower
OpenDTU_5276052:solar/116175466247/1/name:.* 116175466247_1_name
OpenDTU_5276052:solar/116175466247/1/voltage:.* 116175466247_1_voltage
OpenDTU_5276052:solar/116175466247/1/current:.* 116175466247_1_current
OpenDTU_5276052:solar/116175466247/1/power:.* 116175466247_1_power
OpenDTU_5276052:solar/116175466247/1/yieldday:.* 116175466247_1_yieldday
OpenDTU_5276052:solar/116175466247/1/yieldtotal:.* 116175466247_1_yieldtotal
OpenDTU_5276052:solar/116175466247/1/irradiation:.* 116175466247_1_irradiation
OpenDTU_5276052:solar/116175466247/2/name:.* 116175466247_2_name
OpenDTU_5276052:solar/116175466247/2/voltage:.* 116175466247_2_voltage
OpenDTU_5276052:solar/116175466247/2/current:.* 116175466247_2_current
OpenDTU_5276052:solar/116175466247/2/power:.* 116175466247_2_power
OpenDTU_5276052:solar/116175466247/2/yieldday:.* 116175466247_2_yieldday
OpenDTU_5276052:solar/116175466247/2/yieldtotal:.* 116175466247_2_yieldtotal
OpenDTU_5276052:solar/116175466247/2/irradiation:.* 116175466247_2_irradiation
OpenDTU_5276052:solar/116175466247/3/name:.* 116175466247_3_name
OpenDTU_5276052:solar/116175466247/3/voltage:.* 116175466247_3_voltage
OpenDTU_5276052:solar/116175466247/3/current:.* 116175466247_3_current
OpenDTU_5276052:solar/116175466247/3/power:.* 116175466247_3_power
OpenDTU_5276052:solar/116175466247/3/yieldday:.* 116175466247_3_yieldday
OpenDTU_5276052:solar/116175466247/3/yieldtotal:.* 116175466247_3_yieldtotal
OpenDTU_5276052:solar/116175466247/3/irradiation:.* 116175466247_3_irradiation
OpenDTU_5276052:solar/116175466247/4/name:.* 116175466247_4_name
OpenDTU_5276052:solar/116175466247/4/voltage:.* 116175466247_4_voltage
OpenDTU_5276052:solar/116175466247/4/current:.* 116175466247_4_current
OpenDTU_5276052:solar/116175466247/4/power:.* 116175466247_4_power
OpenDTU_5276052:solar/116175466247/4/yieldday:.* 116175466247_4_yieldday
OpenDTU_5276052:solar/116175466247/4/yieldtotal:.* 116175466247_4_yieldtotal
OpenDTU_5276052:solar/116175466247/4/irradiation:.* 116175466247_4_irradiation
OpenDTU_5276052:solar/116175466247/0/temperature:.* 116175466247_0_temperature
OpenDTU_5276052:solar/dtu/uptime:.* uptime
OpenDTU_5276052:solar/dtu/ip:.* ip
OpenDTU_5276052:solar/dtu/hostname:.* hostname
OpenDTU_5276052:solar/dtu/rssi:.* rssi


Daraus sind die Werte interessant für die Statistik:

OpenDTU_5276052:solar/116175466247/0/yieldday:.* 116175466247_0_yieldday
OpenDTU_5276052:solar/116175466247/1/yieldday:.* 116175466247_1_yieldday
OpenDTU_5276052:solar/116175466247/1/yieldday:.* 116175466247_2_yieldday
OpenDTU_5276052:solar/116175466247/1/yieldday:.* 116175466247_3_yieldday
OpenDTU_5276052:solar/116175466247/1/yieldday:.* 116175466247_4_yieldday


Es wäre schön wenn ihr mir wieder einmal unter die Arme greifen könntet.

Danke und LG

Mike
Raspi 4 Mod. B auf Buster-lite vom 13.02.2020

rippi46

FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

Beta-User

Anmerkung: MaN sollte man zwischen dem ESP (OpenDTU) und den einzelnen Hoymiles unterscheiden und beides je in einer eigenen M2D-Instanz abbilden.
Das erlaubt es insbesondere, auch die Readings standardisiert zu benennen (Austausch mit anderen ;) ).
Es sollte dazu sogar ein erster attrTemplate-Satz existieren, siehe die Grundlage hier: https://forum.fhem.de/index.php/topic,121282.msg1251268.html#msg1251268
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

MikeA

Hi
Zitat von: rippi46 am 06 März 2023, 14:18:40
Hallo MikeA,

wäre das was für dich?
https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-.2C_Monats-_und_Jahresstatistik_f.C3.BCr_Strom-.2C_Gas-.2C_Wasserz.C3.A4hler_und_andere_Z.C3.A4hler

Gruß rippi

Das habe ich mir auch schon angeschaut, hat mich aber irgendwie erschlagen was da alles zu konfigurieren ist.

@Beta-User
das sieht interessant aus. Das schaue ich mir noch mal morgen genauer an. Bin heute leider unterwegs und habe keine Zeit für die wichtigen Dinge  :D

Danke vorab !
LG
Mike
Raspi 4 Mod. B auf Buster-lite vom 13.02.2020

Damian

Zitat von: MikeA am 07 März 2023, 17:38:24
Das habe ich mir auch schon angeschaut, hat mich aber irgendwie erschlagen was da alles zu konfigurieren ist.

Na ja, wenn du genau liest, dann wirst du feststellen, dass du nur ein Reading angeben musst.

Für die Visualisierung musst du eines der beiden Templates aufrufen, dem musst du sagen, wie dein Reading heißt, was für ein Minimum- und Maximumwert für einen Tag, Monat, Jahr vorkommen kann und die dazugehörigen Farben.

Die restliche Definition muss du nicht anpacken.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MikeA

Zitat von: Damian am 08 März 2023, 10:19:48
Na ja, wenn du genau liest, dann wirst du feststellen, dass du nur ein Reading angeben musst.

Für die Visualisierung musst du eines der beiden Templates aufrufen, dem musst du sagen, wie dein Reading heißt, was für ein Minimum- und Maximumwert für einen Tag, Monat, Jahr vorkommen kann und die dazugehörigen Farben.

Die restliche Definition muss du nicht anpacken.

Hi,
das habe ich auch gedacht und soweit angepasst wie beschrieben.
Jedoch werde ich beim Anlegen mit diversen Fehlermeldungen konfrontiert dass Variablen nicht deklariert oder dort nicht benutzt werden dürfen.
Das mich dann davon abgehalten tiefer in die Fehlersuche zu gehen da mein Brain da nicht mehr mitmacht.

di_counter_new DOIF: error in defs block: syntax error at (eval 1047) line 4, near "\
sub midnight "
Can't use global @_ in "my" at (eval 1047) line 4, near "=@_"
Global symbol "$device" requires explicit package name (did you forget to declare "my $device"?) at (eval 1047) line 5.
Global symbol "$reading" requires explicit package name (did you forget to declare "my $reading"?) at (eval 1047) line 5.
Global symbol "$device" requires explicit package name (did you forget to declare "my $device"?) at (eval 1047) line 5.
Global symbol "$reading" requires explicit package name (did you forget to declare "my $reading"?) at (eval 1047) line 5.
syntax error at (eval 1047) line 11, near "\
  if"
syntax error at (eval 1047) line 15, near "\
    if"
syntax error at (eval 1047) line 19, at EOF
Can't use global @_ in "my" at (eval 1047) line 24, near "=@_"
(eval 1047) has too many errors.

Wenn es dir etwas sagt, vielleicht kannst du helfen.
VG
Mike
Raspi 4 Mod. B auf Buster-lite vom 13.02.2020

Damian

#6
di_counter_new DOIF: error in defs block: syntax error at (eval 1047) line 4, near "\

Wenn so was kommt, dann hast du den Code an falscher Stelle kopiert. Es handelt sich um RAW-Definition. Diese wird über das Pluszeichen oben eingegeben bzw. hineinkopiert. Im Programmcode selbst kommt nachher kein \ Zeichen vor.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MikeA

Hallo Damian,
danke für den Tip. Hat mich schon mal weiter gebracht.
Ich habe soweit alles ohne Fehlermeldung einbringen können und bekomme bereits auch schon eine Anzeige. (Siehe Anhang )
Dort wird jedoch nur das aktuelle Tagesreading angezeigt. Wochen, Monat und Jahres Anzeige steht nur " wrong definition at collect parameter: " Ich vermute dass dies wegen den noch fehlenden Berechnungen erfolgt. Bin mir aber nicht sicher.

Mir ist bei den Readings noch eine Fehlermeldung aufgefallen:

block_init condition c03: syntax error, line 1, at EOF

Ich habe die Konfig mehrmals überprüft, konnte aber keine Fehler finden.
Vielleicht kannst du noch mal bitte mit deinen geschulten Augen drüberschauen ob da etwas falsch ist. Das wäre sehr nett.
Hier der Auszug aus dem fhem-config:

define di_counter_new DOIF subs {\
push (@{$_counter},["MQTT2_OpenDTU_5276052","116194406343_0_yieldtotal"]);;;;\
sub midnight { ## Diese Funktion wird um Mitternacht ausgeführt\
  my ($device,$reading,$mday,$yday)=@_;;;;\
  set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,1));;;;   \
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);;;;\
  set_Reading("$device.$reading.day",0,1);;;;\
  set_Reading ("$device.$reading.month",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);;;;\
  set_Reading ("$device.$reading.year",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);;;;\
\
  if ($mday == 1) {\
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;;;\
    set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);;;;\
    set_Reading("$device.$reading.month",0,1);;;;\
    if ($yday == 0) {\
      set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;;;\
      set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);;;;\
      set_Reading("$device.$reading.year",0,1);;;;\
    }\
  }\
}\
\
sub init_readings {\
  my ($device,$reading)=@_;;;;\
  if (get_Reading("$device.$reading.day_counter","") eq "") {   ## Initialisierung der Readings\
    ## aktuellen Zählerstand initialisieren\
    set_Reading("$device.$reading.last_counter",ReadingsVal($device, $reading,0));;;;\
    set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0));;;; \
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;;;\
    set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;;;\
  \
    set_Reading ("$device.$reading.day",0);;;;           ## aktueller Tagesverbrauch\
    set_Reading ("$device.$reading.month",0);;;;         ## aktueller Monatsverbrauch\
    set_Reading ("$device.$reading.year",0);;;;          ## aktueller Jahresverbrauch\
    set_Reading ("$device.$reading.last_day",0);;;;      ## Verbrauch des letzten Tages\
    set_Reading ("$device.$reading.last_month",0);;;;    ## Verbrauch des letzten Monats\
    set_Reading ("$device.$reading.last_year",0);;;;     ## Verbrauch des letzten Jahres\
## Log definieren\
    fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log $SELF:$device.$reading.last_.*");;;;\
    fhem ("attr log.counter.$device.$reading room Filelogs");;;;\
}\
\
}\
} ## Ende subs-Block\
\
get_data {                             ## Optionale Übernahme bestehender Daten aus dem Log\
  for (my $i=0;;;;$i<@{$_counter};;;;$i++) {\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_day","bar2month",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_day"));;;;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_month","bar2year",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_month"));;;;\
::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_year","bar2decade",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_year"));;;;\
}\
}\
\
\
mid {[00:01];;;;                          ## Sicherung der Daten um Mitternacht\
  for (my $i=0;;;;$i<@{$_counter};;;;$i++) { ## Für jeden Zähler wird die Funktion midnight aufgerufen\
    midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday);;;;\
  }\
}\
\
init {                                ## initialisierung aller Readings\
  for (my $i=0;;;;$i<@{$_counter};;;;$i++) {## Für jeden Zähler werden Readings über die Funktion init_readings initialisiert\
    init_readings($_counter[$i][0],$_counter[$i][1]);;;;\
  }\
}\
\
DEF TPL_stat (\
  day_count_$1_$2 { ## bei einem Event des Zählers, wird der tägliche, monatliche und jährliche Verbrauch im jeweiligen Reading festgehalten\
                    ##  $1 Zählerdevice, $2 Zählerreading\
\
  #  my $diff = int(([$1:$2,0]-(get_Reading("$1.$2.last_counter",0)))*1000)/1000;;;;\
      set_Reading ("$1.$2.last_counter",[$1:$2,0]);;;;\
      set_Reading ("$1.$2.day",int(([$1:$2,0]-(get_Reading("$1.$2.day_counter",0)))*1000)/1000,1);;;;\
      set_Reading ("$1.$2.month",int(([$1:$2,0]-(get_Reading("$1.$2.month_counter",0)))*1000)/1000,1);;;;\
      set_Reading ("$1.$2.year",int(([$1:$2,0]-(get_Reading("$1.$2.year_counter",0)))*1000)/1000,1);;;;\
}\
)\
\
## Pro Zähler wird über eine FOR-Schleife ein day_count_<Device>_<Reading>-Block generiert\
FOR(@{$_counter},TPL_stat($1$1,$1$2)) ## $1$1 entspricht dem Device, $1$2 entspricht dem Reading\

attr di_counter_new room PV - Anlage
attr di_counter_new uiTable {package ui_Table;;} ## Optionale Visualisierung der Energie-Verbräuche/-Produktion im DOIF-Device\
\
## Template für die Darstellung eines Wertes\
DEF TPL_single (\
card([$SELF:$2.$3.day:col1w],"$1 Tagesverlauf",undef,$4,$5,$10,$11,"$12",undef,"1","130,1,1,0,1,,200")|\
card([$SELF:$2.$3.last_day:bar2month-300],"$1 in $12 pro Tag",undef,$4,$5,$10,$11,"$12",undef,"1","130,1,1,0,1,0,200")|\
card([$SELF:$2.$3.last_month:bar2year-300],"$1 in $12 pro Monat",undef,$6,$7,$10,$11,"$12",undef,"0","130,1,1,0,1,0,200")|\
card([$SELF:$2.$3.last_year:bar2decade-300],"$1 in $12 pro Jahr",undef,$8,$9,$10,$11,"$12",undef,"0","130,1,1,0,1,0,200")\
)\
\
## Template für die Darstellung von zwei Werten\
DEF TPL_double (\
card([[$SELF:$3.$4.day:col1w],[$SELF:$6.$7.day:col1w]],"$1 Tagesverlauf in $16",undef,$8,$9,$14,$15,["$2","$5"],undef,"1","130,1,1,0,1,,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_day:bar2month-300],[$SELF:$6.$7.last_day:bar2month-300]],"$1 in $16 pro Tag",undef,$8,$9,$14,$15,["$2","$5"],undef,"1","130,1,1,0,1,0,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_month:bar2year-300],[$SELF:$6.$7.last_month:bar2year-300]],"$1 in $16 pro Monat",undef,$10,$11,$14,$15,["$2","$5"],undef,"0","130,1,1,0,1,0,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_year:bar2decade-300],[$SELF:$6.$7.last_year:bar2year-300]],"$1 in $16 pro Jahr",undef,$12,$13,$14,$15,["$2","$5"],undef,"0","130,1,1,0,1,0,200","0,0,0,0,2")\
)\
\
## Die Visualisierung einer Tabellenzeile wird über die obigen beiden Templates vorgenommen, hier zeilenweise anpassen/löschen:\
\
TPL_single (Gesamtleistung,MQTT2_OpenDTU_5276052,116194406343_0_yieldtotal,0,500,0,10000,0,80000,90,0,kWh)\

setuuid di_counter_new 640d9206-f33f-46b5-3b49-fec9caa4775b998c


Ich wünsche noch einen schönes Rest-Wochenende. Auch wenn das Wetter nicht so toll ist.

Lieben Gruß

Mike
Raspi 4 Mod. B auf Buster-lite vom 13.02.2020

Damian

Da hast du dir was verbastelt, alleine die vierfachen Semikolons sind schon ein Hinweis darauf, dass es nicht sauber über RAW-Definition kopiert wurde.

Diesen Code bitte hieraus kopieren, auf Plus-Zeichen klicken, dort ins Eingabefenster ohne Änderung einfügen und Execute-Knopf klicken.

defmod di_counter_new DOIF subs {\
##                     Device             Reading       hier die push-Zeilen löschen bzw. durch eigene Readings ersetzen\
  push (@{$_counter},["MQTT2_OpenDTU_5276052","116194406343_0_yieldtotal"]);;\
  \
## Die restliche Code-Definition muss nicht angepasst werden\
## Anpassung der Visualisierung wird im uiTable-Attribut weiter unten vorgenommen\
\
sub midnight { ## Diese Funktion wird um Mitternacht ausgeführt\
  my ($device,$reading,$mday,$yday)=@_;;\
  set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,1));;   \
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);;\
  set_Reading("$device.$reading.day",0,1);;\
  set_Reading ("$device.$reading.month",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);;\
  set_Reading ("$device.$reading.year",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);;\
\
  if ($mday == 1) {\
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);;\
    set_Reading("$device.$reading.month",0,1);;\
    if ($yday == 0) {\
      set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
      set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);;\
      set_Reading("$device.$reading.year",0,1);;\
    }\
  }\
}\
\
sub init_readings {\
  my ($device,$reading)=@_;;\
  if (get_Reading("$device.$reading.day_counter","") eq "") {   ## Initialisierung der Readings\
    ## aktuellen Zählerstand initialisieren\
    set_Reading("$device.$reading.last_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0));; \
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
  \
    set_Reading ("$device.$reading.day",0);;           ## aktueller Tagesverbrauch\
    set_Reading ("$device.$reading.month",0);;         ## aktueller Monatsverbrauch\
    set_Reading ("$device.$reading.year",0);;          ## aktueller Jahresverbrauch\
    set_Reading ("$device.$reading.last_day",0);;      ## Verbrauch des letzten Tages\
    set_Reading ("$device.$reading.last_month",0);;    ## Verbrauch des letzten Monats\
    set_Reading ("$device.$reading.last_year",0);;     ## Verbrauch des letzten Jahres\
## Log definieren\
    fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log $SELF:$device.$reading.last_.*");;\
    fhem ("attr log.counter.$device.$reading room Filelogs");;\
}\
\
}\
} ## Ende subs-Block\
\
get_data {                             ## Optionale Übernahme bestehender Daten aus dem Log\
  for (my $i=0;;$i<@{$_counter};;$i++) {\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_day","bar2month",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_day"));;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_month","bar2year",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_month"));;\
::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_year","bar2decade",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_year"));;\
}\
}\
\
\
mid {[00:01];;                          ## Sicherung der Daten um Mitternacht\
  for (my $i=0;;$i<@{$_counter};;$i++) { ## Für jeden Zähler wird die Funktion midnight aufgerufen\
    midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday);;\
  }\
}\
\
init {                                ## initialisierung aller Readings\
  for (my $i=0;;$i<@{$_counter};;$i++) {## Für jeden Zähler werden Readings über die Funktion init_readings initialisiert\
    init_readings($_counter[$i][0],$_counter[$i][1]);;\
  }\
}\
\
DEF TPL_stat (\
  day_count_$1_$2 { ## bei einem Event des Zählers, wird der tägliche, monatliche und jährliche Verbrauch im jeweiligen Reading festgehalten\
                    ##  $1 Zählerdevice, $2 Zählerreading\
\
  #  my $diff = int(([$1:$2,0]-(get_Reading("$1.$2.last_counter",0)))*1000)/1000;;\
      set_Reading ("$1.$2.last_counter",[$1:$2,0]);;\
      set_Reading ("$1.$2.day",int(([$1:$2,0]-(get_Reading("$1.$2.day_counter",0)))*1000)/1000,1);;\
      set_Reading ("$1.$2.month",int(([$1:$2,0]-(get_Reading("$1.$2.month_counter",0)))*1000)/1000,1);;\
      set_Reading ("$1.$2.year",int(([$1:$2,0]-(get_Reading("$1.$2.year_counter",0)))*1000)/1000,1);;\
}\
)\
\
## Pro Zähler wird über eine FOR-Schleife ein day_count_<Device>_<Reading>-Block generiert\
FOR(@{$_counter},TPL_stat($1$1,$1$2)) ## $1$1 entspricht dem Device, $1$2 entspricht dem Reading\

attr di_counter_new room Verbrauch
attr di_counter_new uiTable {package ui_Table;;} ## Optionale Visualisierung der Energie-Verbräuche/-Produktion im DOIF-Device\
\
## Template für die Darstellung eines Wertes\
DEF TPL_single (\
card([$SELF:$2.$3.day:col1w],"$1 Tagesverlauf",undef,$4,$5,$10,$11,"$12",undef,"1","130,1,1,0,1,,200")|\
card([$SELF:$2.$3.last_day:bar2month-300],"$1 in $12 pro Tag",undef,$4,$5,$10,$11,"$12",undef,"1","130,1,1,0,1,0,200")|\
card([$SELF:$2.$3.last_month:bar2year-300],"$1 in $12 pro Monat",undef,$6,$7,$10,$11,"$12",undef,"0","130,1,1,0,1,0,200")|\
card([$SELF:$2.$3.last_year:bar2decade-300],"$1 in $12 pro Jahr",undef,$8,$9,$10,$11,"$12",undef,"0","130,1,1,0,1,0,200")\
)\
\
## Template für die Darstellung von zwei Werten\
DEF TPL_double (\
card([[$SELF:$3.$4.day:col1w],[$SELF:$6.$7.day:col1w]],"$1 Tagesverlauf in $16",undef,$8,$9,$14,$15,["$2","$5"],undef,"1","130,1,1,0,1,,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_day:bar2month-300],[$SELF:$6.$7.last_day:bar2month-300]],"$1 in $16 pro Tag",undef,$8,$9,$14,$15,["$2","$5"],undef,"1","130,1,1,0,1,0,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_month:bar2year-300],[$SELF:$6.$7.last_month:bar2year-300]],"$1 in $16 pro Monat",undef,$10,$11,$14,$15,["$2","$5"],undef,"0","130,1,1,0,1,0,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_year:bar2decade-300],[$SELF:$6.$7.last_year:bar2year-300]],"$1 in $16 pro Jahr",undef,$12,$13,$14,$15,["$2","$5"],undef,"0","130,1,1,0,1,0,200","0,0,0,0,2")\
)\
\
\
## Die Visualisierung einer Tabellenzeile wird über die obigen beiden Templates vorgenommen, hier zeilenweise anpassen/löschen:\
\
## Über das Template TPL_single wird jeweils pro card ein Wert visualisiert\
##          Überschrift,Device,Reading,minTag,maxTag,minMonat,maxMonat,minJahr,maxJahr,minColor,maxColor,Einheit\
\
TPL_single (Gesamtleistung,MQTT2_OpenDTU_5276052,116194406343_0_yieldtotal,0,500,0,10000,0,80000,90,0,kWh)\
##


Wenn es einmal definiert ist, dann solltest du weitere Readings über DEF-Knopf bzw. im Attribut uiTable direkt einfügen (ohne \ und immer höchsten ein Semikolon) ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MikeA

Hi,

ja da hast du recht dass ich das nicht über raw importiert habe.
Ich habe schon an mir gezweifelt da ich wie ein Blöder nach dem sch.... "+" gesucht habe  :D
Weil ich es nicht finden konnte lag daran dass den dark-style nutze, und da ist das "+" nicht oben, sondern das FHEM Logo.
Habe nun auf das f18 Style gewechselt und siehe da. Ein Plus oben auf dem Bildschirm.
!!! Magie !!!
Ich habe dann noch mal alle Definitionen rausgeschmissen und über den raw-import eingefügt.
Nun sind auch alle vier Grafiken zu sehen. Aktuell zwar noch ohne Werte, aber das sollte sich ja demnächst ändern.
Ich denke dass ich das so jetzt erst mal laufen lasse.

Damian, vielen lieben Dank für deine super Hilfe. 

LG

Mike


Raspi 4 Mod. B auf Buster-lite vom 13.02.2020

Damian

ja, es ist immer schwierig zu wissen, was der andere sieht, kennt oder versteht :)

Wenn du jetzt nicht Wochen, Monate, Jahre oder Jahrzehnte warten willst, dann kannst du Langzeitdaten, falls bereits irgendwo vorhanden (Log, Excel-Datei oder sonst was), per Import in die Grafiken einlesen: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Import.2C_.C3.84nderung_und_L.C3.B6schung_von_Diagrammdaten

Per save oder einen shutdown überleben die Grafiken auch einen Neustart des Systems.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MikeA

Ich hätte da noch eine Frage bezüglich dieser DoIF Statistik wie unter:
https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-.2C_Monats-_und_Jahresstatistik_f.C3.BCr_Strom-.2C_Gas-.2C_Wasserz.C3.A4hler_und_andere_Z.C3.A4hler

Diese habe ich bei mir soweit eingerichtet und sie funktioniert auch ganz gut.
Was aber blöd ist, sobald ich mein Raspi auf dem das FHEM läuft neu starte, sind alles Statisktiken verloren und es wird nichts mehr angezeigt.
Ich kann mir nicht vorstellen dass dies so gewollt ist, sonst wären die langen Zeiträume ja unnütz.
Immer nur die Zeiträume seit dem der Raspi gebootet wurde. Davor sind keine Daten mehr zu sehen.

Gibt es da eine Erklärung warum das so ist ?
So wie ich mir denke werden die Daten doch aus den Logs generiert, und diese sollten ja nach dem Booten weiterhin vorhanden sein.
Muss/Kann man das Generieren der Grafiken anstoßen, so dass diese wieder angezeigt werden können ?

Wäre cool wenn jemand mit Durchblick mir helfen könnte.

Danke und lG
Raspi 4 Mod. B auf Buster-lite vom 13.02.2020

Damian

Die Daten werden in versteckten Readings gespeichert.

Wenn die Daten fehlen, dann wurden deine Readings nicht gespeichert - möglicherweise FHEM nicht ordnungsgemäß heruntergefahren.

Als erstes solltest du schauen, was im Device global unter autosave steht - 0 ist schlecht.

Mit der aktuellen Version kann man die Langzeitdaten mit set di_counter_new get_data wieder aus den logs wiederherstellen.

Damit dir das zukünftig nicht passiert, kannst du definieren:

defmod di_save DOIF {[:04];;\
fhem"save";;\
}

Damit werden deine FHEM-Readings stündlich gesichert - Voraussetzung ist: attr global autosave 1
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MikeA

Hallo Damian,

vielen Dank für deine Rückmeldung.
In der Tat war "autosave" nicht aktiv. Das habe ich korrigiert.

Das Device Statistik bei mir habe ich nun mit set STATISTIK get_data versucht wieder zu beleben.
Jetzt habe ich drei blanke Graphen. Die Werte von gestern sind nun auch nicht mehr sichtbar.
Vielleicht hängt das dann mit dem Autosave zusammen dass die Daten einfach nicht weggeschrieben werden.

Den regelmäßigen "save" habe ich angelegt.

Ich werde nun ein paar Tage Daten sammeln und dann den Raspi mal booten um zu schauen ob danach noch etwas angezeigt wird.

Ggf würde ich mich dann noch einmal zu diesem Thema melden.

Vielen Dank für deine Hilfe.

LG

Mike
Raspi 4 Mod. B auf Buster-lite vom 13.02.2020