Hauptmenü

Stromverbrauch per DOIF?

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

Vorheriges Thema - Nächstes Thema

jkriegl

Beim Schnipsel kommt "di_counter_new DOIF: Perlblck: no right bracket: {\"
Ist deutlich komplizierter zu verstehen. Auf die (readings-)blöcke  kommt es nicht darauf an.
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

Damian

Zitat von: jkriegl am 22 Februar 2022, 19:06:19
Beim Schnipsel kommt "di_counter_new DOIF: Perlblck: no right bracket: {\"
Bei mir nicht.
Zitat
Ist deutlich komplizierter zu verstehen.
Klar, ist nichts für Anfänger.  :)
Zitat
Auf die (readings-)blöcke  kommt es nicht darauf an.
ZitatKann man aus Gründen der Übersichtlichkeit die Readings "block_.* executed" evtl. unterdrücken. loglevel ist wohl obsolet
Auf diese aber schon ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

#17
[gelöst, Siehe https://forum.fhem.de/index.php/topic,126199.msg1211057.html#msg1211057 ]



Natürlich bin ich auf diesen Vorschlag auch sofort "aufgesprungen", weil es mir Stringzerlegungen beim Statistik-Modul erspart und ermöglicht, mich genau auf die Readings zu konzentrieren, die für mich wichtig sind.
Aktuell habe ich noch genau ein Problemchen: Anders als meine Tachos, die ich bisher zur Darstellung der Momentan-Verbräuche benutzt haben, aktualisieren in der Programmversion aus dem Wiki in der Card die Werte nicht beim Ändern des Readings durch das Programm.
In meinem Dashboard muss ich daher immer eigens ein Aktualisieren der Seite auslösen.
Mit diesem Attribut habe ich immerhin schon einmal Events ausgelöst, die das Wegschreiben der Tageswerte in ein Filelog auslösen:
attr DI_CN_Strom DOIF_Readings Solar_Zaehlerstand_counter:[$SELF:Solar_Zaehlerstand_counter],Strom_Zaehlerstand_counter:[$SELF:Strom_Zaehlerstand_counter]

Auch würde ich gerne nur dann ein Event auslösen, wenn sich mindestens die erste Nachkommastelle geändert hat. Also etwa in der Schreibweise, wie wir es von event-on-change-reading etc. kenne: Reading:0.001
In welche Richtung muss ich meine Hirnzellen bewegen?

Sonnige Grüße
Christian
PI 2B+/3B+ 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 verstehe ich nicht, wenn ein Reading mit Event geändert wird, dann muss card sich automatisch anpassen.

DOIF_Readings produzieren keine Events nach außen.

Du musst mir den konkreten Fall als List posten, damit ich mir ein Bild davon machen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Danke, Damian, dass Du Dir das anschauen willst. Das Erzeugen bzw. Nicht-Erzeugen von Events habe ich mit Eventviewer kontrolliert. Da die Momentanwerte meines Stromverbrauchs, der Überschusseinspeisung im Sekundentakt erzeugt werden, habe ich da ausreichend Gelgenheit zur Kontrolle. Ich hätte z.B. erwartet, dass beim Sprung von 2,45 nach 2,51 kwh die Anzeige im Tacho der Card auch von 2,4 auf 2,5 springt. Tut es seit vielen Monaten toll in verschiedenen ring2 Ausprägungen:

defmod DI_CN_Strom DOIF DEF TPL_stat (midnight_$1_$2 { [23:59:59];; ## Definition des Templates TPL_stat für einen Zähler\
  set_Reading("$1_$2_counter",[?$1:$2]);;                       ## $1 Devicename, $2 Devicereading\
  set_Reading("$1_$2_last_day",get_Reading("$1_$2_day",0),1);;\
  set_Reading("$1_$2_day",0,1);;\
  set_Reading("$1_$2_month",get_Reading("$1_$2_month",0)+get_Reading("$1_$2_last_day",0),1);;\
  if ($mday == 1) {\
    set_Reading("$1_$2_last_month",get_Reading("$1_$2_month",0),1);;\
    set_Reading("$1_$2_month",0,1);;\
    set_Reading("$1_$2_year",get_Reading("$1_$2_year",0)+get_Reading("$1_$2_last_month",0),1);;\
  }\
  if ($yday == 1) {\
    set_Reading("$1_$2_last_year",get_Reading("$1_$2_year",0),1);;\
    set_Reading("$1_$2_year",0,1);;\
  }\
}\
\
day_count_$1_$2 {set_Reading ("$1_$2_day",int(([$1:$2,0]-get_Reading("$1_$2_counter",0))*1000)/1000,1);;}\
\
init_$1_$2 {                                ## $1 Devicename, $2 Devicereading\
  if (!get_Reading("$1_$2_counter","")) {   ## Initialisierung der Readings\
    set_Reading("$1_$2_counter",[?$1:$2]);; ## aktueller Zählerstand\
    set_Reading ("$1_$2_day",0);;           ## aktueller Tagesverbrauch\
    set_Reading ("$1_$2_month",0);;         ## aktueller Monatsverbrauch\
    set_Reading ("$1_$2_year",0);;          ## aktueller Jahresverbrauch\
    set_Reading ("$1_$2_last_day",0);;      ## Verbrauch des letzten Tages\
    set_Reading ("$1_$2_last_month",0);;    ## Verbrauch des letzten Monats\
    set_Reading ("$1_$2_last_year",0);;     ## Verbrauch des letzten Jahres\
  } \
}\
)\
## mehrere Zähler können durch Hinzufügen eines Template-Aufrufs jeweils angegeben werden mit: TPL_stat(<Zähler-Device>,<Reading>)\
TPL_stat (Strom,Zaehlerstand)  ## Zählerangaben für den Stromverbrauch\
TPL_stat (Solar,Zaehlerstand)  ## Zählerangaben für Stromeinspeisung
attr DI_CN_Strom DOIF_Readings Solar_Zaehlerstand_counter:[$SELF:Solar_Zaehlerstand_counter],Strom_Zaehlerstand_counter:[$SELF:Strom_Zaehlerstand_counter]
attr DI_CN_Strom room Test
attr DI_CN_Strom uiTable {package ui_Table} ## Optionale Visualisierung der Tageswerte im DOIF-Device\
card([[$SELF:Strom_Zaehlerstand_day:col1w],[$SELF:Solar_Zaehlerstand_day:col1w]],"Energie in kWh pro Tag","fa_bolt\@silver",0,15,0,90,["Bezug","Abgabe"],undef,"1","130,,1,0,1","0,0,0,0,2")


Zum Testen hier noch zwei Dummys, die meine Zähler abbilden:
defmod Solar dummy
attr Solar DbLogExclude .*
attr Solar stateFormat power

setstate Solar 0.00
setstate Solar 2022-02-23 17:08:09 Zaehlerstand 3061.8553
setstate Solar 2022-02-23 16:24:53 kWh_lfd 7.9219
setstate Solar 2022-02-23 18:00:47 power 0.00
setstate Solar 2022-02-23 12:45:57 power_max 1656.66


defmod Strom dummy
attr Strom DbLogExclude .*
attr Strom stateFormat power

setstate Strom 119.95
setstate Strom 2022-02-23 18:01:36 Zaehlerstand 11844.4477749
setstate Strom 2022-02-23 17:39:12 kWh_lfd 5.5121649
setstate Strom 2022-02-23 18:01:37 power 119.95
setstate Strom 2022-02-23 13:49:00 power_L1 3.31
setstate Strom 2022-02-23 18:01:37 power_L2 81.3
setstate Strom 2022-02-23 17:53:41 power_L3 35.49
setstate Strom 2022-02-23 07:32:55 power_max 2962.18



hg
Christian
PI 2B+/3B+ 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

Die Nachkommastellen werden mit sprintf formatiert, das Verhalten ist in card wie auch in ring/ring2 gleich, da card ring/ring2 aufruft.

2.45 ist auf eine Nachkommastelle gerundet 2,5 (kaufmännisches Runden), genauso wie 2.51 es wird in card als auch in ring2 mit 2.5 dargestellt.

2.54 ist kaufmännisch gerundet 2.5, also ändert sich nicht.

Habe beides gerade noch mal bei mir getestet

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

cwagner

Hallo Damian, danke für Deine neuerliche Rückmeldung und ja, mein Zahlenbeispiel war falsch gewählt. Da hast Du recht. Allerdings funktioniert es bei mir nicht, wie gewünscht. Ich habe jetzt extra über 2 Stunden das Bild auf dem Schirm gelassen und kann nun mein Thema mit einem Bild zeigen. Oben rechts zeigt der Status den stets aktualisiert laufenden Tageszähler. Im Ring allerdings hat sich der obere Wert (Bezug) nicht angepasst. Drunter montiert habe ich die Ansicht nach Aktualisierung im Browser (F5).
Wie gesagt, in meinen verschiedenen ring2 werden die sich ändernden Readings fortlaufend gezeigt.

Herzliche Grüße

Christian
PI 2B+/3B+ 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 23 Februar 2022, 23:17:23
Hallo Damian, danke für Deine neuerliche Rückmeldung und ja, mein Zahlenbeispiel war falsch gewählt. Da hast Du recht. Allerdings funktioniert es bei mir nicht, wie gewünscht. Ich habe jetzt extra über 2 Stunden das Bild auf dem Schirm gelassen und kann nun mein Thema mit einem Bild zeigen. Oben rechts zeigt der Status den stets aktualisiert laufenden Tageszähler. Im Ring allerdings hat sich der obere Wert (Bezug) nicht angepasst. Drunter montiert habe ich die Ansicht nach Aktualisierung im Browser (F5).
Wie gesagt, in meinen verschiedenen ring2 werden die sich ändernden Readings fortlaufend gezeigt.

Herzliche Grüße

Christian

Dann scheint bei dir irgendwas mit den Events verkorkst zu sein.

Alleine diese Definition ist nicht sinnvoll:

attr DI_CN_Strom DOIF_Readings Solar_Zaehlerstand_counter:[$SELF:Solar_Zaehlerstand_counter],Strom_Zaehlerstand_counter:[$SELF:Strom_Zaehlerstand_counter]

Ich denke, du hast dir irgendwo einen Loop eingebaut.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Da Deine Tipps & Analysen bisher immer zielführend waren, bin ich Deiner Vermutung ernsthaft nachgegangen, bin aber weiterhin am Rätsel. Im angehängten Foto siehst Du, dass sowohl Status wie auch ein *zusätzlich* eingebauter ring2 mit denselben Readings aktualisiert werden, hingegen der Ring in der Card nicht. Diese Beobachtung hatte ich in der Vergangenheit auch schon mal gemacht, ohne ihr nachzugehen. Das von Dir kritisierte DOIF-readings attribut war eine Verzweiflungstat. Mit event-on-change-reading funktioniert es an vielen Stellen sehr gut.
attr DI_CN_Strom event-on-change-reading Solar_Zaehlerstand_counter,Strom_Zaehlerstand_counter,Strom_Zaehlerstand_day,Solar_Zaehlerstand_day
attr DI_CN_Strom stateFormat Strom_Zaehlerstand_day | Solar_Zaehlerstand_day kWh
attr DI_CN_Strom uiTable {package ui_Table} ## Optionale Visualisierung der Tageswerte im DOIF-Device\
card([[$SELF:Strom_Zaehlerstand_day:col1w],[$SELF:Solar_Zaehlerstand_day:col1w]],"Energie in kWh pro Tag","fa_bolt\@silver",0,15,0,90,["Bezug","Abgabe"],undef,"1","130,,1,0,1","0,0,0,0,2")\
ring2([$SELF:Strom_Zaehlerstand_day],0,15,undef,undef,"Bezug",120,undef,1,[$SELF:Solar_Zaehlerstand_day],0,10,undef,undef," PV kWh",undef,1)


Kann es sein, dass eine von DOIF gebrauchte Bibliothek nicht aktuell ist, sodass es zu diesem Effekt kommt? Für mich spricht dagegen, dass auf einem zweiten, vor zwei Monaten from scratch aufgesetzten System das Verhalten sich reproduzieren lässt.

Herzliche Grüße

Christian
PI 2B+/3B+ 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 25 Februar 2022, 13:36:23
Da Deine Tipps & Analysen bisher immer zielführend waren, bin ich Deiner Vermutung ernsthaft nachgegangen, bin aber weiterhin am Rätsel. Im angehängten Foto siehst Du, dass sowohl Status wie auch ein *zusätzlich* eingebauter ring2 mit denselben Readings aktualisiert werden, hingegen der Ring in der Card nicht. Diese Beobachtung hatte ich in der Vergangenheit auch schon mal gemacht, ohne ihr nachzugehen. Das von Dir kritisierte DOIF-readings attribut war eine Verzweiflungstat. Mit event-on-change-reading funktioniert es an vielen Stellen sehr gut.
attr DI_CN_Strom event-on-change-reading Solar_Zaehlerstand_counter,Strom_Zaehlerstand_counter,Strom_Zaehlerstand_day,Solar_Zaehlerstand_day
attr DI_CN_Strom stateFormat Strom_Zaehlerstand_day | Solar_Zaehlerstand_day kWh
attr DI_CN_Strom uiTable {package ui_Table} ## Optionale Visualisierung der Tageswerte im DOIF-Device\
card([[$SELF:Strom_Zaehlerstand_day:col1w],[$SELF:Solar_Zaehlerstand_day:col1w]],"Energie in kWh pro Tag","fa_bolt\@silver",0,15,0,90,["Bezug","Abgabe"],undef,"1","130,,1,0,1","0,0,0,0,2")\
ring2([$SELF:Strom_Zaehlerstand_day],0,15,undef,undef,"Bezug",120,undef,1,[$SELF:Solar_Zaehlerstand_day],0,10,undef,undef," PV kWh",undef,1)


Kann es sein, dass eine von DOIF gebrauchte Bibliothek nicht aktuell ist, sodass es zu diesem Effekt kommt? Für mich spricht dagegen, dass auf einem zweiten, vor zwei Monaten from scratch aufgesetzten System das Verhalten sich reproduzieren lässt.

Herzliche Grüße

Christian

Dann musst du dich herantasten. Nimm die ersten beiden Attribute stateFormat und event-on-change-readings raus, dann beobachtest du, ob sich die Uhrzeit von card  im Minutentakt (beim Event ändert) bzw. was mit ring2 passiert.


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

cwagner

Tja, ich komme nicht vorwärts: Habe das Device neu generiert und kein Attribut stateformat oder event.* gesetzt. Es werden events gesetzt, das sieht man ja auch an der Aktualisierung von ring2. Ich habe jetzt mal mehrere Stunden nicht aktualisiert und das Ergebnis ist eindeutig. Die card wird gar nicht (von selbst) aktualisiert. ring2 wird fortlaufend aktualisiert. Im Event-Monitor tauchen die geänderten Werte auch auf.
Nun, ich kann auch mit einem Tacho lesen und die elegante Erzeugung der wichtigsten statistischen Werte ist es wert, dass ich mich mit Deinem Vorschlag auseinandergesetzt habe.

Christian
PI 2B+/3B+ 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 26 Februar 2022, 14:05:54
Tja, ich komme nicht vorwärts: Habe das Device neu generiert und kein Attribut stateformat oder event.* gesetzt. Es werden events gesetzt, das sieht man ja auch an der Aktualisierung von ring2. Ich habe jetzt mal mehrere Stunden nicht aktualisiert und das Ergebnis ist eindeutig. Die card wird gar nicht (von selbst) aktualisiert. ring2 wird fortlaufend aktualisiert. Im Event-Monitor tauchen die geänderten Werte auch auf.
Nun, ich kann auch mit einem Tacho lesen und die elegante Erzeugung der wichtigsten statistischen Werte ist es wert, dass ich mich mit Deinem Vorschlag auseinandergesetzt habe.

Christian

OK. Dann ändere bitte die Readings zur Darstellung von ring2 und card auf Readings eines neuen Dummys. Die kannst du mit setreading setzen und schauen, ob die Anzeigen mit einem Dummy bei beiden klappt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Du brauchst nicht weiter suchen, ich konnte das Problem bei mir jetzt in der Konstellation nachvollziehen.

Ich versuche es morgen zu beheben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Durch dein hartnäckiges Dranbleiben am Problem, konnte ich Fehler nun beheben  :)

siehe: https://forum.fhem.de/index.php/topic,120088.msg1211014.html#msg1211014
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Vielen Dank, Damian. Dein unglaublicher Einsatz für FHEM z.B. mit DOIF und Deine Präsenz in diesem Projekt macht es ja auch so lohnenswert, sich bei einem Thema dann auch einzubringen und wenigstens durch simples Ausprobieren ein Sandkorn zurückzugeben.

Neue Version eingebunden, Neustart, funktioniert! Vielen Dank

Christian

PI 2B+/3B+ 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