Hauptmenü

Stromverbrauch per DOIF?

Begonnen von gestein, 14 Februar 2022, 16:47:37

Vorheriges Thema - Nächstes Thema

Damian

Ich habe den Wikibeitrag aktuallisiert: 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

Jetzt wird bei jedem Countertrigger auch Monats- und Jahresverbrauch aktualisiert, man muss nicht bis zum Ende des Tages bzw. Monats warten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tobias

Hi Damian,

gibt es irgendein Kniff wie man fehlerhafte Werte in den Charts manuell bereinigen kann?
Ich habe schon versucht den fehlerhaften Wert im passenden Reading durch einen korrekten zu ersetzen, aber das Chart hat sich dadurch nicht verändert. :(

Reading: .col_7_DOIF_counter_SEN_EM_Elektro.000_EM_All.day_168_values
aktueller (falscher) Wert: ,,,,,0.652,2.233

setreading DOIF_DashBoard  .col_7_DOIF_counter_SEN_EM_Elektro.000_EM_All.day_168_values ,,,,,2.652,2.233
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Damian

Zitat von: Tobias am 19 Mai 2022, 06:58:26
Hi Damian,

gibt es irgendein Kniff wie man fehlerhafte Werte in den Charts manuell bereinigen kann?
Ich habe schon versucht den fehlerhaften Wert im passenden Reading durch einen korrekten zu ersetzen, aber das Chart hat sich dadurch nicht verändert. :(

Reading: .col_7_DOIF_counter_SEN_EM_Elektro.000_EM_All.day_168_values
aktueller (falscher) Wert: ,,,,,0.652,2.233

setreading DOIF_DashBoard  .col_7_DOIF_counter_SEN_EM_Elektro.000_EM_All.day_168_values ,,,,,2.652,2.233

Die Werte werden intern im Array gehalten und überschreiben deine Änderung beim speichern bzw. beim Beenden von FHEM.

Am besten du stoppst FHEM und änderst die Werte in der save-Datei.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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

flummy1978

#34
Hallöchen,

ich hab bisher ehrlicherweise nie viel mit DOIF gemacht (ich verstehs einfach nicht so wirklich, komme mit "einfachen" Perl Aufgaben besser klar) ... Aber in diesem Fall habe ich es versucht. Hab das DOIF kopiert, mein Device und Reading angepasst und einen Tag gewartet. Leider passiert dort bisher nicht viel außer dass ein paar Readings mit ein paar Werten entstanden sind und im Device "di_counter_new initialized" steht..... Hat jemand eine Idee woran es liegen könnte? Den "Copy for forum.fhem.de" Auszug habe ich unten angehangen.

## EDIT: Code entfernt, Text wird zu lang und unten abgeschnitten.

Vielen Dank im Voraus &
Viele Grüße

Andreas

Tobias

Leg mal bitte den Code in einen codeblock, kann man garnicht lesen
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Damian

#36
Zitat von: flummy1978 am 02 Dezember 2022, 01:20:02
Hallöchen,

ich hab bisher ehrlicherweise nie viel mit DOIF gemacht (ich verstehs einfach nicht so wirklich, komme mit "einfachen" Perl Aufgaben besser klar) ... Aber in diesem Fall habe ich es versucht. Hab das DOIF kopiert, mein Device und Reading angepasst und einen Tag gewartet.

Dann ist es keine gute Idee, mit dieser komplexen Definition anzufangen. Für die Darstellung muss das uiTable-Attribut entsprechend angepasst werden. Dazu muss man ebenfalls verstehen, wie die card-Funktion (es ist übrigens eine reine Perlfunktion) aufgebaut ist.

siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flummy1978

Holla,

Zitat von: Tobias am 02 Dezember 2022, 06:39:49
Leg mal bitte den Code in einen codeblock, kann man garnicht lesen
Das hatte ich ursprünglich auch getan. In der Vorschau wird es auch korrekt angezeigt, beim Abschicken danach wird es leider einfach abgeschnitten. Ist aber korrigiert ;) Muss das mal als Forums Bug melden.....

@Damian:
Zitat von: Damian am 02 Dezember 2022, 08:12:43
Dann ist es keine gute Idee, mit dieser komplexen Definition anzufangen. Für die Darstellung muss das uiTable-Attribut entsprechend angepasst werden. Dazu muss man ebenfalls verstehen, wie die card-Funktion (es ist übrigens eine reine Perlfunktion) aufgebaut ist.

siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card
Schade, das konnte ich in der Wiki so nicht lesen, denn
Zitat"Die folgenden Beispieldefinitionen arbeiten mit konkreten Geräten und Readings, sie können als RAW-Definition ins eigene System übernommen werden, dazu müssen die Gerätenamen, Readings, ggf. auch Icons den existierenden Namen des eigenen Systems angepasst werden. Zum Ausprobieren der Beispiele können statt echter Geräte auch Dummys benutzt werden."
suggerierte für mich nicht, dass ich dazu, tiefer in der Materie, vieles mehr verstehen muss .... Schade  :-[

Vielleicht hat jemand ne einfache Methode, wie ich meinen Stromverbrauch einfach direkt anzeigen lassen kann ohne ein überlagerters Modul zu nutzen, wie den "ElectricityCalculator". Ich habe mir einen Zähler gebaut, der alle X Sek den aktuellen Verbrauch schreibt und nicht bei jedem "Tick" (wie groß auch immer es ist) einen Impuls erstellt, wie dieses Modul es braucht.

VG
Andreas

Damian

Zitat von: flummy1978 am 02 Dezember 2022, 11:04:49
@Damian: Schade, das konnte ich in der Wiki so nicht lesen, denn suggerierte für mich nicht, dass ich dazu, tiefer in der Materie, vieles mehr verstehen muss .... Schade  :-[

Deswegen hättest du für die Zeilen, die du rausgenommen hast die entsprechenden card-Aufrufe löschen müssen und die geänderten Readings in der push-Zeile in der entsprechenden card ebenfalls ändern müssen.

Ich will aber den Wiki-Code so anpassen, dass die Visualisierung automatisch erzeugt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flummy1978

Vielen Dank für die schnelle Antwort

Zitat von: Damian am 02 Dezember 2022, 11:19:08
Deswegen hättest du für die Zeilen, die du rausgenommen hast die entsprechenden card-Aufrufe löschen müssen und die geänderten Readings in der push-Zeile in der entsprechenden card ebenfalls ändern müssen.

Ich will aber den Wiki-Code so anpassen, dass die Visualisierung automatisch erzeugt wird.

Ich werde mir nochmal anschauen, vielleicht verstehe ich es ja doch irgendwie   ???

Das zweite wäre natürlich ein absolutes Träumchen  ::)

VG
Andreas

flummy1978

#40
Hallo nochmal

@Damian
Zitat von: Damian am 02 Dezember 2022, 11:19:08
Deswegen hättest du für die Zeilen, die du rausgenommen hast die entsprechenden card-Aufrufe löschen müssen und die geänderten Readings in der push-Zeile in der entsprechenden card ebenfalls ändern müssen.

Ich habe jetzt versucht das Ganze zu verstehen bzw zumindest auf meine Bedürfnisse umzustellen. Soweit bin ich jetzt derzeit nicht unzufrieden (zumindest sieht es schonmal nach etwas aus ;) ), ob es die korrekten Daten sind, kann ich erst nach Mitternacht sehen oder?

Ich habe allerdings 2 Fragen dazu:

1.
event_Readings
power_ALL:sprintf("%0.3f",[zaehler:COUNTER_C1:diff]*1440),
power_KG:sprintf("%0.3f",[zaehler:COUNTER_C2:diff]*1440),
power_EG:sprintf("%0.3f",[zaehler:COUNTER_C3:diff]*1440),
power_OG:sprintf("%0.3f",[zaehler:COUNTER_C4:diff]*1440)

Ist das in meinem Falle korrekt? In den reading Counter_C1..C4 ist lediglich immer der aktuelle zählwert der letzten Minute. (Daher eben *1440)

2. Gäbe es eine Möglichkeit mit den vorhandenen Mitteln, nicht nur als Tagesverlauf sondern eben aktuell für den heutigen Tag anzuzeigen? also quasi den aktuellen Verbrauch?


VG
Andreas

p.s. Das list aus dem Device verursacht übrigens das Problem, dass der Beitrag zu lang wird. Es werden insg. 1400 zeilen "undef" erstellt - diese hab ich in meinem List gelöscht. Außerdem alles ab....
#   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
#   CFGFN     

Wenn Du davon also was brauchst, muss ich es einzeln rausschneiden

define doif_zaehler_stats DOIF subs {\
##                     Device        Reading   \
  push (@{$_counter},["zaehler","standALL"]);; ## Wasserzähler\
  push (@{$_counter},["zaehler","standKG"]);;         ## Solarenergie\
  push (@{$_counter},["zaehler","standEG"]);; ## Bezugszähler\
  push (@{$_counter},["zaehler","standOG"]);; ## Einspeisezähler \
  \
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 == 1) {\
    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_(day|month|year)|(day|month)_counter):.*");;\
    fhem ("attr log.counter.$device.$reading room Filelogs");;\
## Tasmota-Zähler setzen: set MQTT2_FHEM_Server publish cmnd/tasmota_C58DCB/Counter1 <Zählerstand>\
}\
\
}\
} ## Ende subs-Block\
\
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;;\
    ##if ($diff < 0 and get_Reading("$1.$2.last_counter",0) > 0  or $diff > 0 and get_Reading("$1.$2.last_counter",0) < 0) {  ## Wenn der Zähler zurückgesetzt wurde, dann Zählerstände zurückrechnen\
    ##  set_Reading("$1.$2.day_counter",-(get_Reading("$1.$2.day",0)));;\
    ##  set_Reading("$1.$2.month_counter",-(get_Reading("$1.$2.month",0)));;\
    ##  set_Reading("$1.$2.year_counter",-(get_Reading("$1.$2.year",0)));;\
   ## } else {\
      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 doif_zaehler_stats DbLogExclude .*
attr doif_zaehler_stats event-on-change-reading .*
attr doif_zaehler_stats event_Readings power_ALL:sprintf("%0.3f",[zaehler:COUNTER_C1:diff]*1440),\
power_KG:sprintf("%0.3f",[zaehler:COUNTER_C2:diff]*1440),\
power_EG:sprintf("%0.3f",[zaehler:COUNTER_C3:diff]*1440),\
power_OG:sprintf("%0.3f",[zaehler:COUNTER_C4:diff]*1440)\

attr doif_zaehler_stats room Verbrauch
attr doif_zaehler_stats uiTable {package ui_Table;;$ANIMATE=0} ## Optionale Visualisierung der Energie-Verbräuche/-Produktion im DOIF-Device\
card([doif_zaehler_stats:zaehler.standALL.day:col1w],"Gesamtverbrauch Tagesverlauf",undef,0,50,90,0,"kWh",undef,"0","150,1,1,0,1,,220","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standALL.last_day:col4w],"Gesamtverbrauch letzten Tag",undef,0,50,90,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standALL.last_month:col365d],"Gesamtverbrauch letzten Monat",undef,0,1000,90,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")\
\
card([doif_zaehler_stats:zaehler.standKG.day:col1w],"KG-Zähler Tagesverlauf in kWh",undef,0,30,30,0,"kWh",undef,"0","150,1,1,0,1,,220","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standKG.last_day:col4w],"KG-Zähler letzten Tag",undef,0,30,30,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standKG.last_month:col365d],"KG-Zähler letzten Monat",undef,0,100,90,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")\
\
card([doif_zaehler_stats:zaehler.standEG.day:col1w],"EG-Zähler Tagesverlauf in kWh",undef,0,30,30,0,"kWh",undef,"0","150,1,1,0,1,,220","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standEG.last_day:col4w],"EG-Zähler letzten Tag",undef,0,30,30,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standEG.last_month:col365d],"EG-Zähler letzten Monat",undef,0,100,90,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")\
\
card([doif_zaehler_stats:zaehler.standOG.day:col1w],"OG-Zähler Tagesverlauf in kWh",undef,0,30,30,0,"kWh",undef,"0","150,1,1,0,1,,220","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standOG.last_day:col4w],"OG-Zähler letzten Tag",undef,0,30,30,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")|\
card([doif_zaehler_stats:zaehler.standOG.last_month:col365d],"OG-Zähler letzten Monat",undef,0,100,90,0,"kWh",undef,"0","150,1,1,0,1,0,200","0,0,0,0")\


Damian

#41
Naja, es geht ja hier nur um Energie und nicht um Leistung, daher wird nur der Counter benötigt. Was du über event_Readings berechnest, ist wohl die Leistung und diese wird hier nicht benutzt.

Das steht im Wiki-Beitrag:

ZitatDas obige Beispiel funktioniert nur mit Zählern, die mit aufsteigenden Werten (positiv/negativ) arbeiten, wie z. B. Stromverbrauch in kWh, Wasserverbrauch in Litern usw.. Es funktioniert nicht mit momentanen Werten, wie z. B. aktuelle Leistungsaufnahme eines Verbrauchers in Watt, diese müssten zunächst kumuliert werden.

Was du haben willst, ist eher so etwas:

https://forum.fhem.de/index.php/topic,97959.msg1225965.html#msg1225965

und ein Visualisierungsbeispiel, welches den aktuellen Leistungsverlauf darstellt und die gesamte Energie des Tages, ist das letzte Beispiel Beispieldefinition mit zusätzlichen Informationen zu der card-Funktion:

https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flummy1978

Vielen Dank für die Beispiele und deine Antwort.

Ich werde es mir in Ruhe mal anschauen und mich dann mit entsprechenden Fragen melden 😉

Zu dem Power reading....dass Leistung nicht Energie ist, ist mir bewusst - bringt mein Beruf allein schon mit sich. Ich hab die Sachen jetzt nur nicht umbenannt  und wollte nur wissen ob sie in meinem Fall relevant sind bzw dann korrekt ..... Scheinbar nein  ;)

Kurz weil mobil

VG
Andreas

Damian

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

Damian

Ich habe die Definition jetzt besser dokumentiert, für die Visualisierung muss man jeweils nur noch einen Template-Aufruf im uiTable-Attribut für seine Bedürfnisse anpassen:

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF