Hauptmenü

Stromverbrauch per DOIF?

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

Vorheriges Thema - Nächstes Thema

Franz Tenbrock

Hallo Damian
2 Wochen lief dein doif super gut
heute morgen hatte ich aber Probleme mit meiner WP,
hatte gestern was an den Einstellungen geändert, zu, Dank heute morgen dann Störung
da ich eh mit der Zeit knapp war, schnell Sicherung raus dann wieder an  etc.

nun sind die Werte alle durcheinander.

Gibt es eine einfache Möglichkeit alle Werte auf 0 zu setzen?
zB
setreading di_counter_new  MQTT2_HeishaMo*.* 0

Sorry für den Code sicher falsch ;-)

   
aktueller_Wert:     723..Watt    passt
 
heute:    -109511.5..Wh   eher der letzte Wert

gestern:  12332..Wh         ok
 
Monat:       46364.00..Wh     ok

Vor_Monat: 27264..Wh         ok
 
Jahr:          7823.50..Wh       ev von heute


cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Damian

ja, du kannst einfach die Readings, die mit "counter" enden mit setreading überschreiben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Guten Morgen Damian,
sag mal ist es auch möglich auf vorhandene Werte in einem DB Log zurückzugreifen?

Damian

Zitat von: der-Lolo am 17 Dezember 2022, 10:21:12
Guten Morgen Damian,
sag mal ist es auch möglich auf vorhandene Werte in einem DB Log zurückzugreifen?

z. Zt. nicht. Das Modul sammelt selbst über die Zeit die Daten und legt sie intern in Readings ab.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

enno

Zitat von: der-Lolo am 17 Dezember 2022, 10:21:12
sag mal ist es auch möglich auf vorhandene Werte in einem DB Log zurückzugreifen?
das würde mich auch brennend interessieren ;D
Einfacher FHEM Anwender auf Intel®NUC

Damian

Zitat von: enno am 17 Dezember 2022, 11:08:37
das würde mich auch brennend interessieren ;D

Bereits Post vorher beantwortet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Ist das ein riesiger umbau?
Der kompakte Card-Style gefällt mir doch sehr sehr gut....

Damian

Zitat von: der-Lolo am 17 Dezember 2022, 12:42:27
Ist das ein riesiger umbau?
Der kompakte Card-Style gefällt mir doch sehr sehr gut....

z. Zt. ja. Ich bin noch dabei das hier zu realisieren: https://forum.fhem.de/index.php/topic,130437.msg1246847.html#msg1246847

Danach werde ich mir Gedanken machen, wie man Daten aus bestehenden Logs übernehmen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Auch das schaut sehr gut aus - also ich bin sehr interessiert an einer DB-Log anbindung.

Sany

Hallo Damian,

hier passt das wohl am besten:
Es war der Jahreswechsel und ich hatte mich schon gefreut, dem DOIF** (quasi) zuzuschauen, wie es die Daten verschiebt und das neue Jahr zu zählen beginnt.....

Hat aber nicht geklappt, folgendes hab ich dann rausgefunden:
es wird in der midnight-sub auf $mday und $yday geprüft. Das sind ja Perl-Variablen in fhem, die nicht "angepasst" sind, wie z.B. $year oder $month (->1...12). Ich habe dann in "perldoc -f localtime" nachgesehen und dort steht: $mday is the day of the month, also 1...Monatsende, das passt auch, aber $yday: is the day of the year, in the range 0..364 (or 0..365 in leap years.) Hat am 1.1. auch 0 ergeben. Damit wurde natürlich der Teil, der "midnight" am 1.1. ausführen soll, nicht abgearbeitet. Hier muss dann wohl auf $yday==0 geprüft werden.
Da ich 2 der DOIFs eingerichtet habe, habe ich nur bei einem das so geändert und die Werte händisch korrigiert, das 2te habe ich gelassen und gehofft, es läuft dann heute Nacht. Auch wieder nicht, Problem hier: die subs haben keine eindeutigen Namen, und es gilt ja immer die letzte geänderte Version, das war dann die mit dem $yday==0, also kanns am 2.1. ($yday=1) auch nicht gehen....
Hab ich mir dann auch korrigiert, sollte dann nächstes Jahr korrekt laufen.
Und ich hab noch die Jahresprüfung in die Klammer der Monatsprüfung geschoben, dann wird das nur jeden 1. des Monats und nicht täglich geprüft.

sub $SELF_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);
  }
  }


Vielleicht ist das ja hilreich.

Noch ne Frage zu der Art, wie Du das geschrieben hast: Beim Aufruf der sub wird $mday und $yday übergeben, das sind ja die fhem-perl Variablen. In der sub nimmst Du aber die selben Bezeichnungen, deklarierst diese aber neu (my(...$mday,$yday)=@_
Ist das üblich? Ich hätte hier vermutlich eigene Namen genutzt, allerdings gilt die Deklaration nur innerhalb der sub, von daher kann die Variable heissen wie sie will....

Gruß


Sany

** 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
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

#55
Danke für das Feedback - ist mir gestern noch gar nicht aufgefallen.

Ich habe die Änderung im Wiki nachgetragen.

Lokale Variablen, und das sind auch die Übergabeparameter, überlagern die globalen Variablen. Das ist in allen mir bekannten Programmiersprachen so.

Man kann ja auch Variablen in einem if-block definieren oder in einer for-Schleife, die leben noch kürzer und überlagern auch die vorherigen.

Ob man die jetzt gleich nennt oder nicht ist eher Geschmacksache.

Es gibt heute eine neue DOIF-Version. Mir ist gestern aufgefallen, dass bei großen Zeiträumen, wie im letzten Jahresdiagramm der Plot etwas verschoben war.

Allerdings ist ja die Darstellung der kumulierten Größen immer um einen Tag bzw. Monat verschoben - das ist zwar prinzipbedingt, aber suboptimal. Daher bastle ich schon fleißig an der card-bars-Darstellung, die für kumulierte Größen besser geeignet ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 02 Januar 2023, 13:37:48Man kann ja auch Variablen in einem if-block definieren oder in einer for-Schleife, die leben noch kürzer und überlagern auch die vorherigen.
Perl ist immer für eine Überraschung gut. Wieder was gelernt!

Damian

#57
Zitat von: Per am 02 Januar 2023, 16:05:53
Perl ist immer für eine Überraschung gut. Wieder was gelernt!

Du kannst in Perl an beliebiger Stelle sogar einen Block mit eigenen Variablen definieren:

...
{my $var="test";print ($var)}
...

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

gestein

Hallo,

ich habe einige Shellys, die den aktuellen Verbrauch messen.
Und ich habe es endlich geschafft, das DOIF von Damian anzupassen.
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

Soweit ich verstanden habe, wird hier die Energie und nicht die Leistung anzugeben.
Das wäre also das Reading "energy" aus dem Shelly.
Zusätzlich habe ich dort noch ein UserReading angelegt "relay_0_energy_total:relay_0_energy:.* monotonic {ReadingsNum("$name","relay_0_energy",0)}".

Im Shelly für den Kühlschrank steht z.B.
energy     17776
energy_total    251159


Wenn ich nun im DOIF di_counter_new das Reading energy verwende, dann bekomme ich eine Anzeige von "157 kWh".

Welches Reading der Shelly muss ich verwenden (oder eventuell ein UserReading anlegen)?

Danke im Voraus
lg, Gerhard

Damian

Zitat von: gestein am 24 Januar 2023, 15:08:18
Hallo,

ich habe einige Shellys, die den aktuellen Verbrauch messen.
Und ich habe es endlich geschafft, das DOIF von Damian anzupassen.
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

Soweit ich verstanden habe, wird hier die Energie und nicht die Leistung anzugeben.
Das wäre also das Reading "energy" aus dem Shelly.
Zusätzlich habe ich dort noch ein UserReading angelegt "relay_0_energy_total:relay_0_energy:.* monotonic {ReadingsNum("$name","relay_0_energy",0)}".

Im Shelly für den Kühlschrank steht z.B.
energy     17776
energy_total    251159


Wenn ich nun im DOIF di_counter_new das Reading energy verwende, dann bekomme ich eine Anzeige von "157 kWh".

Welches Reading der Shelly muss ich verwenden (oder eventuell ein UserReading anlegen)?

Danke im Voraus
lg, Gerhard

Wenn der Shelly die Energie (es ist ein Zählerwert der immer aufsteigend sein muss) liefert, dann kannst du doch direkt das Reading vom Shelly angeben und braucht nicht userReading anlegen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF