neues Modul: VZLOGGER

Begonnen von optimizer, 05 September 2015, 23:53:59

Vorheriges Thema - Nächstes Thema

optimizer

In Version 0.5 stehen zwei zusätzliche Hilfsfunktionen für Solaranlagen-Besitzer im userReadings zur Verfügung.

- Berechnung des (Solar)Eigenverbrauchs als virtueller Zählerstand: SolarEigenverbrauch (Zählerstand Einspeisung,Zählerstand Erzeugung,Zählerstand Eigenverbrauch)
- Berechnung des Gesamtverbrauchs als virtueller Zählerstand: StromGesamtverbrauch (Zählerstand Einspeisung,Zählerstand Erzeugung,Zählerstand Bezug,Zählerstand Gesamtverbrauch)

Beispiel zum Erzeugen des Readings "EnergyGesamtverbrauch:
userReadings EnergyGesamtverbrauch {StromGesamtverbrauch(ReadingsVal("vz280","energy",0),ReadingsVal("Solaranlage","Total.Energy",0),ReadingsVal("vz180","energy",0),ReadingsVal("vz180","EnergyGesamtverbrauch",0))}

Ich benutze diese Funktionen um virtuelle Zählerstände zu erzeugen und mit dem statistics Modul Stunden-/Tages-/Monats-genau Statistiken zu erzeugen/mitzuloggen und schliesslich in einem Diagramm zu visualisiern.

Romoker

Hallo,

ich habe heute vzlogger auf meinem Log-Device konfiguriert und in Fhem VZLOGGER installiert. Ich bekomme leider keine Verbindung zum Logger:

http://192.168.178.37:8080/

liefert "Unable to connect" bzw. Fhem sagt: "ERROR while requesting: 192.168.178.37: Connection refused".

Hier meine vzlogger.conf:
// vzlogger.conf with minimal settings without middleware
{
// General settings
"daemon": true,
"verbosity": 15,
"log": "/var/log/vzlogger.log",
"retry": 30,

// Build-in HTTP server
"local": {
"enabled": true,
"port": 8080,
"index": true,
"timeout": 30,
"buffer": 240
},

// Meter configuration
"meters": [
{
// D0 meter EMH ITZ
"enabled": true,
"protocol": "d0",
"device": "/dev/ttyUSB0", // meter device
"parity": "7E1", // Serial parity, 7E1 or 8N1
"baudrate": 300, // Serial baud rate, typically 9600 or 300
"dump_file": "/var/log/d0.txt", // detailed log file for all received/transmitted data (optional)

"channel":
{
"uuid": "180",
"identifier": "1-0:1.8.1", // OBIS identifier
"api": "NULL" // without middleware
}
}
  ]
}


Der vzlogger läuft:
root@OpenWrt:/etc# vzlogger -c vzlogger4fhem.conf
[Dec 14 00:04:52][main] vzlogger v0.4.6 based on heads/master-0-g11364f0d0d from Sat, 22 Aug 2015 09:23:50 -0700 started.
[Dec 14 00:04:52][mtr0] Creating new meter with protocol d0.
[Dec 14 00:04:52][mtr0] Meter configured, enabled.
[Dec 14 00:04:52]       New meter initialized (protocol=d0)
[Dec 14 00:04:52]       Configure channel.
[Dec 14 00:04:52][chn0] New channel initialized (uuid=... api=NULL id=1-0:1.8.1)
[Dec 14 00:04:52]       Have 1 meters.
[Dec 14 00:04:52][main] log level is 15
[Dec 14 00:04:52][main] daemon=1, local=1
[Dec 14 00:04:52]       Daemonize process...


Ich würde mich freuen, wenn mir jemand auf die Sprünge helfen kann.
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

Romoker

Hallo,

zur Info: mein Verbindungsproblem konnte ich jetzt lösen. vzlogger muss mit der Option -l gestartet werden. Dann klappt das auch mit der Verbindung. Das wurde auch vorne im Thread mal erwähnt. Ich war aber erst auf einer falschen Fährte...  :'(

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

Romoker

Hallo,

ich möchte S0-Daten von vzlogger für die Auswertung über VZLOGGER aufbereiten. Nach diversen Versuchen und Tests komme ich jetzt aber nicht mehr weiter.

Ich möchte meinen Gaszähler über ein Relais auslesen und in Fhem darstellen. Meine Vorgehensweise:

  • Die Sensorauswertung übernimmt das Volkszähler-vzlogger-Programm
  • vzlogger puffert die Zähler-Daten 240 Sekunden (local/buffer 240
  • Ein S0-Kanal (identifier Impuls) ist konfiguriert
  • vzlogger HTTPd stellt die Rohdaten zur Verfügung
  • Fhem-VZLOGGER (delay 60, VZLOGGER_modus Impuls) nimmt die Rohdaten in Readings entgegen
  • Die Readings werden in ein FileLog geschrieben, das als Basis für das Statistik- oder Plot-Modul dient.
Probleme habe ich mit den Punkten 5 und 6. Meineserachtens werden nicht alle Sensorimpulse von VZLOGGER erfasst, wenn innerhalb des Fhem-Lesezyklus "delay"von 60 Sekunden mehrere Impulse eingehen. Es wird immer nur der letzte Impulswert übernommen.

Das VZLOGGER-Modul sollte buffer < delay seit Version 0.2 unterstützen.  Hinzu kommt, dass ich im FileLog das Reading "state" nicht über das Regex "state:.*" erfassen kann.

Mein Testfall: Drei Impulse innerhalb der delay-Phase.
vzlogger HTTPd liefert dazu folgende Rohdaten:
{ "version": "0.4.6", "generator": "vzlogger", "data": [ { "uuid": "120", "last": 1451378978096, "interval": -1, "protocol": "s0", "tuples": [ [ 1451378970095, 2 ], [ 1451378974096, 2 ], [ 1451378978096, 2 ] ] } ] }

VZLOGGER.state zeigt nur den letzten Wert an: "state 1.0 ( 2015-12-29 09:49:38 )"

Das zugehörige FileLog ist so definiert, dass alls Readings erfasst werden. Hier der Auszug aus dem FileLog über die Bufferperiode von 240 Sekunden:
(Der vzlogger-Wert 2 wurde mit dem Attribut VZLOGGER_corrF 0.5 auf 1 korroigiert)
2015-12-29_09:49:49 Gaszaehler 1.0  ( 2015-12-29 09:49:38 )
2015-12-29_09:49:49 Gaszaehler energy: 3.01071
2015-12-29_09:49:49 Gaszaehler energy_current: 1.0
2015-12-29_09:50:49 Gaszaehler 1.0  ( 2015-12-29 09:49:38 )
2015-12-29_09:50:49 Gaszaehler energy: 3.01071
2015-12-29_09:50:49 Gaszaehler energy_current: 1.0
2015-12-29_09:51:49 Gaszaehler 1.0  ( 2015-12-29 09:49:38 )
2015-12-29_09:51:49 Gaszaehler energy: 3.01071
2015-12-29_09:51:49 Gaszaehler energy_current: 1.0
2015-12-29_09:52:50 Gaszaehler 1.0  ( 2015-12-29 09:49:38 )
2015-12-29_09:52:50 Gaszaehler energy: 3.01071
2015-12-29_09:52:50 Gaszaehler energy_current: 1.0
2015-12-29_09:53:50 Gaszaehler no data for 120


Mein erstes Problem: Wie man sieht, wird immer nur der letzte Wert geloggt. Die beiden ersten Werte sind nicht geloggt und damit verloren.

Mein zweites Problem: Im Gegensatz zu den readings "energy" und "energy_current" wird im FileLog das reading "state" nicht aufgeführt, sondern nur der zugehörige Wert. Das mag der Grund sein, warum das state-Reading nicht mit Regexp state:.* erfasst werden kann. Ich kann nicht beurteilen, ob das ein VZLOGGER- oder ein generelles FileLog-Problem ist.

Aber vielleicht interpretiere ich die Konfigurationsparameter auch falsch.

Ich hoffe, mir kann jemand einen entscheidenden Tipp geben, wie ich S0-Impulse verlustfrei in Fhem auswerten kann.

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

Romoker

#49
Hallo,

gut, dass zwischen den Tagen auch Freizeit für mein Hobby bleibt. Ich habe mich mit der Zähllogik des VZLOGGER-Moduls beschäftigt. Ausgangspunkt ist folgender Fall mit 5 Impulsen (3 + 2) innerhalb zwei delay-Phasen:

1: vzlogger-buffer-periode |------------------------240 s--------------|--------------
2: Fhem-VZLOGGER-delay     |---60 s---|
---60 s---|---60 s---|---60 s---|---60 s---|
3: Impuls i                |--i-i-i---|--i-i-----|----------|----------|----------|
4: Wert state alt                     1          1          1          1          no data
5: Wert state neu                     3          2          no new reading ...    no data

VZLOGGER liefert  über den dargestellten Zeitraum in jeder delay-Perionde, unabhängig von der Anzahl Impulse, immer nur einen Zählwert. Das ist falsch.
Im VZLOGGER-Code musste ich folgende Zeilen ändern, um das korrekte Ergebnis der Zeile 5 oben zu bekommen:

Zeile 357 alt: if ($time_offset <= $f->[0]) {
Zeile 357 neu: if ($time_offset < $f->[0]) {

Zeile 421 alt:  $value = ($value * $corrF);
Zeile 421 neu: $value = ($value_sum_imp * $corrF);


Desweiteren habe ich mir das reading "energy" etwas genauer angeschaut. Laut Beschreibung wird in "energy" ein virtueller Zählerstand aufsummiert. Code-Zeile 420 soll nach meinem Verständnis einen durchschnittlichen Zählerwert pro Stunde berechnen, der dann später aufsummiert wird.
Ich habe die Zeile so geändert, dass Zählerimpulse mit der Zählerauflösung zu einem Zählerwert berechnet werden, der dann später zum korrekten Zählerstand aufsummiert wird.

Zeile 420 alt:  $counter = ($value_sum_imp / $resolution /  $time_diff / 3600 * $corrF) # Durchschnittswert kWh
Zeile 420 neu: $counter = ($value_sum_imp / $resolution * $corrF) ; # Zaehler fuer kWh, m³ etc.


Hiermit bekomme ich einen korrekten Zählerstand im reading "energy" angezeigt. Ich finde allerdings die Bezeichnung "counter" für "energy" treffender, z.B. wenn ich Wasser oder Gas in der Einheit m³ messe.

Meine Änderungen habe ich für VZLOGGER_modus "Impuls" und "Zählerstand" gestestet. So kann ich S0-Zählimpulse sauber in Fhem verarbeiten.
Die Auswirkungen auf die anderen Funktionen bzw. Modi kann ich (noch) nicht beurteilen.

@optimizer: Bitte prüfe meine Änderungen bzw. Korrekturen und übernimm bei Bedarf die Änderungen im Code. Ansonsten ist VZLOGGER ein sehr nützliches Modul.

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

onkel-tobi

Hi Karlheinz,

frohes neues Jahr erst mal!
Sag mal, dein Balkendiagramm sieht ziemlich cool aus, dürfte man doch auch für den Zählerstand erstellen können, oder?

Muss ich da zwingend das Statistics Modul verwenden?
Prinzipiell stehen die Werte ja entsprechend in den Logs (als energy) und es würde reichen, wenn ich die Differenz zum vorherigen Monat berechne.
Oder gibt es da noch andere Vorteile, die ich gerade nicht sehe? Wenn ich das statistics Modul noch nicht laufen hatte, könnte ich trotzdem die vergangenen Werte eintragen?

Danke & Gruß,
Tobi

micomat

Hi,
ist geplant das Modul irgendwann einzuchecken, sodass es via "Update" verteilt wird?

Gruß
Markus
Synology DS218+ with fhem+iobroker in docker, 2x RasPi w. ser2net, CUL433+868, IT, EGPM2LAN, THZ/LWZ, FB_Callmonitor, HMS100TF, Homematic, 2x TX3-TH, Pushover, USB-IR-SML-Head, SONOS, GHoma, MBus, KLF200

optimizer

Ich wünsch euch einen guten Start ins neue Jahr.
Sorry für das späte Antworten, aber mich beschäftigen zur Zeit meine neuen ESP8266 Module und ein defekter Computer.

@Romoker
Zitat von: Romoker am 29 Dezember 2015, 23:51:04
VZLOGGER liefert über den dargestellten Zeitraum in jeder delay-Perionde, unabhängig von der Anzahl Impulse, immer nur einen Zählwert. Das ist falsch.
das wäre sicher ein Fehler.  Ist denn VZLOGGER_modus auf "Impuls" und VZLOGGER_resolution richtig gewählt?

Deine weiteren Programmvorschläge schaue ich mir noch an.

Ich würde dir empfehlen mit dem Volkszähler-vzlogger Leistung anstatt Impulse auszugeben. Dazu müsstest du unter "channel" > "identifier" : "Power" in die vzlogger.conf eintragen. Zusätzlich hab ich noch einen 10-Sekundendurchschnitt mit channel > aggmode: "AVG" u. aggtime: 10 eingestellt.

@Tobi
Zitat von: onkel-tobi am 02 Januar 2016, 14:32:32
Sag mal, dein Balkendiagramm sieht ziemlich cool aus, dürfte man doch auch für den Zählerstand erstellen können, oder?

Muss ich da zwingend das Statistics Modul verwenden?
Prinzipiell stehen die Werte ja entsprechend in den Logs (als energy) und es würde reichen, wenn ich die Differenz zum vorherigen Monat berechne.
Ja, die Differenz jeden Monat ist ausreichend, aber ich kenne keinen einfacheren Weg als über das statistics Modul und ein FileLog auf die statistik Werte (statEnergyMonthLast). In die erzeugte Textdatei habe ich auch ältere Werte manuell nachgetragen (eventuell FHEM herunterfahren). Hast Du einen einfacheren Weg?

@Markus
Zitat von: micomat am 05 Januar 2016, 23:01:02
ist geplant das Modul irgendwann einzuchecken, sodass es via "Update" verteilt wird?
SVN hat mich bisher etwas abgeschreckt. Da suche ich noch den richtigen Einstieg.

osid-timo

Hallo vzlogger Nutzer,
es kommt bei mir in unregelmässigen Abständen vor, dass ich keine Werte über httpd kommen. Im vzlogger Logfile sind alle Werte vorhanden.
Nach einem Neustart des vzlogger klappt alles normal.

Ab und zu werden aber auch keine Zählerstände (uuid 180 & 280) übertragen, die Leistung (uuid 170) geht.

aktuell läuft FHEM vzlogger 0.5 und vzlogger 0.4.6

Warum, was muss ich tun? Wer kann mir einen Tipp geben?

Gruß Osid-timo
FHEM Pi3: 1* CUL, 30* Homematic, 10* EnOcean
FHEM Pi3: IR-Lesekopf, BT->SMA
FHEM Pi3: ZHK, 1-wire, 1* VBus   Resol DeltaSol BS

Romoker

@osid-timo: Ich tippe als Ursache auf das vzlogger-Modul vom Volkszählerprojekt. vzlogger ist nicht ganz fehlerfrei. Ich empfehle auf die aktuellste Version (0.5.x) upzudaten.

@optimizer:
ZitatIst denn VZLOGGER_modus auf "Impuls" und VZLOGGER_resolution richtig gewählt?
Ja, alle Tests wurden im Modus Impulse durchgeführt. Die Auflösung war auch korrekt.

ZitatIch würde dir empfehlen mit dem Volkszähler-vzlogger Leistung anstatt Impulse auszugeben.
Mit Leistung bzw Power im vzlogger habe ich mich jetzt auseinandergesetzt. Im vzlogger bekomme ich aber noch keine plausiblen Wertre heraus, die ich mit meinen Tests nachvollziehen kann. Im VZLOGGER kommen die über die vzlogger-httpd-api übergebenen Werte korrekt an.
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

homeum

Danke für das Modul.

Dadurch kann ich nun den Zählerstand (mehr kann mein Zähler nicht ausgeben) problemlos von vzlogger in fhem übernehmen.


Kann mir jemand einen Tipp geben, wie ich im Label des Plots aus $data{min1} und $data{max1} die Differenz berechnen kann?
.... also die Berechnung direkt im Label
Im Moment steht da nur
attr SVG_Log_Elektro label "Zählerstand $data{min2} - $data{max2}"

Romoker

Seit ein paar Wochen liefert mir mein angepasstes VZLOGGER-Modul recht brauchbare Werte für meine Gas- und Wasser-Impuls-Werte. Inzwischen habe ich auch das statistic-Modul mit integriert und auch verstanden, dass in diesem Zusammenhang die Bezeichnungen "energy" und "energy_current" Sinn machen.

Mit dem VZLOGGER-Modus "Leistung" stehe ich noch auf dem Kriegsfuß. Die errechneten energy-Zählerstände sind zu ungenau und können eher als Anhaltswerte dienen. Deshalb habe ich auf eine exakte Impulszählung Wert gelegt. Mit entprellten Kontakt-Sensoren und Anpassung der Impulsberechnung im VZLOGGER-Modul gibt es keine Abweichungen mehr bei meinen Zählerständen zwischen Fhem und den Verbrauchszählern.

Ich habe allerdings noch ein Problem bei den Impulszählern festgestellt: Die Zählerstände erhöhen sich in Fhem, wenn Fhem neu gestartet oder ein rereadcfg durchgeführt wird. Grund ist, dass der Volkszähler-httpd-Puffer, der bei mir auf 15 Minuten eingestellt ist, nach einem Fhem-Neustart komplett neu gelesen wird, auch wenn vorher schon alte Zählerwerte vor dem Start verarbeitet wurden. VZLOGGER verliert die letzte Lesezeit nach einem Restart. Das ist natürlich unschön, da ein Fhem-Restart doch öfter durchgeführt wird.

Ich habe VZLOGGER jetzt so angepasst, dass die letzte Puffer-Lesezeit einen Fhem-Restart bzw. rereadcfg übersteht und nur neue Werte aus dem VZ-Puffer gelesen werden. Ich habe die angepasste VZLOGGER-Version (0.5.a) mit allen meinen Änderungen angehängt.

Meine Änderungen sind nicht relevant für diejenigen, die keinen Wert auf exakte Impuls-Zählerwerte legen oder nur den Modus Zählerstand nutzen.
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

optimizer

@homeum
Zitat von: homeum am 05 Februar 2016, 08:55:35
Kann mir jemand einen Tipp geben, wie ich im Label des Plots aus $data{min1} und $data{max1} die Differenz berechnen kann?
.... also die Berechnung direkt im Label
Im Moment steht da nur
attr SVG_Log_Elektro label "Zählerstand $data{min2} - $data{max2}"
z.B. so für zwei labels:
attr SVG_LOG_Elektro label sprintf("Verbrauch (aktuell %.1f kWh, diff %.1f kwh)",$data{currval1},$data{max1}-$data{min1})::sprintf("Ertrag (aktuell %.1f kWh, diff %.1f kwh)",$data{currval2},$data{max2}-$data{min2})

Im Plot-Editor, Diagramm label musst du noch "<L1>" anstatt dem Festwert "Zählerstand" eingeben. ( <L2> im zweiten label ...)

@Romoker
Je größer der Puffer, desto wichtiger ist die gespeicherte Lesezeit - stimmt. Noch Besser wärs, die Lesezeit als unsichtbares Reading zu speichern (In der nächsten Version).

Romoker

@optimizer
ZitatNoch Besser wärs, die Lesezeit als unsichtbares Reading zu speichern (In der nächsten Version).

Das habe ich in meiner Anpassung mit dem Reading ".last_time_offset" schon umgesetzt :)

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

winner_ix

Eine Frage zum FHEM PLOT.

Mein System:
vzlogger liest den Zählerstand 1.8.0 (Verbtauch) und 2.8.0 (Einspeisung) im 120 sec Intervall vom Smart-Meter und übermittelt die Daten an das FHEM Modul VZLOGGER.
Soweit funktioniert alles aber....

Habe im FHEM keine AVG Werte im LOG wenn AVG auf 0 geht. Dadurch keine schöne Darstellung im PLOT.
Das passiert natürlich bei der PV-Anlage immer wieder wenn Erzeugung=0 sowie beim Verbrauch=0 wenn genügend erzeugt wird.

Im Code (23_VZLOGGER.pm) habe ich folgendes gefunden (rot markiert).
Ich nehme an dass diese Zeile verhindert, dass der AVG Wert 0 werden kann.
Braucht man aber für einen schönen PLOT --> Nachteil, alle AVG=0 Einträge landen im LOG.
Liege ich da richtig oder hat der Code Teil auch andere Hintergründe?

if ($modus eq "Zählerstand") {
         # letzter Wert wird übernommen
         $value = $value * $corrF ;
         $counter = $value  if ( $value > 0 );
         $time_diff = (($time_last - $last_change) /1000)||1 ; # time_diff in Sekunden
         # Durchschnitt vom letzten geänderten Reading. gleiche Einheit wie $energy. sehr ungenau
         $value_avg =  ( $counter - ReadingsVal($name,"energy",0) );
         VZLOGGER_Log $hash, 4, "Zählerstand: energy $counter . avg $value_avg in time_diff: $time_diff s. corrF: $corrF" ;
        if ($value_avg != 0) {
            $value_avg = sprintf("%.3f", ( $value_avg / $time_diff * 3600 ) );  # Hochrechnung auf eine Stunde, kWh
            $hash->{helper}{last_change} = $time_last; # letzte Ã,,nderungszeit fürs nächste Mal merken
         }
         else {
            undef $value_avg;
         }
      }

LG
winner_ix