Wie kann ich einige S0-Zähler mit fhem auf einer Fritz!Box 7390 auslesen?

Begonnen von Christian., 03 Juni 2013, 15:29:39

Vorheriges Thema - Nächstes Thema

Christian.

Ja, genau, ich habe Zähler mit 1000 Impulsen / kWh. Ich habe die Berechnung hier erläutert, etwa in der Mitte des Beitrags.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

fhainz


Bennemannc

Hallo,

also ich habe das mit dem Panstamp gemacht. Derzeit habe ich zwei Zähler mit S0, die ich überwache. Das Ganze läuft mit einer Batterie und sendet alle 15 Minuten Werte, nach dem senden werden die Werte auf dem Panstamp zurückgesetzt. Tages und Monatswerte werden über average gebildet.
Meine Variante arbeitet mit Pulldown-Menü Widerständen, wodurch ich Laufzeiten zwischen 1 und 2 Monaten für einen 2700 mAh Akku hinbekomme.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

andreas.maurer

Hallo Christian,

z.Z. habe ich 15 Zähler über einen Arduino mega laufen und die Daten kommen ohne Probleme.

14 davon erfassen einzelne Kreise und einer den gesamt Verbrauch. Jetzt kommt es: In der Addition habe ich Differenzen!
Da ich ausschließen kann, das irgendwo Strom abfließt, den ich nicht erfasse, muss irgendwas mit der Auf Addierung nicht passen.

Dazu versuche ich grade ohne irgendein Perl Wissen hinter deinen Ansatz zu kommen. Und eine Ungereimtheit ist mir schon aufgefallen.

define zaehler_haushalt_jetzt_erzeugung at +*00:01 { my $power = 12 * countLogEntries("300", "log_zaehler", "4:::");; fhem("set zaehler_haushalt_jetzt $power W") }

Das bedeutet, das jede Minute "+*00:01" die Logeinträge zusammen gezählt werden, der Zeitraum der gezählt wird ist aber 5 Minuten "300" ?

Bei der täglichen Addition stimmen die 86400 Sekunden mit dem Tagesintervall überein.

Und warum das "12 *" ??

Ich bin ziemlich verwirrt und würde mich über eine Erklärung freuen.

Andreas

Bennemannc

Hallo,

wie groß sind denn die Abweichungen ? Wie misst Du denn ? Nur S0 aus geeichten Zählern ? Und selbst die geeichten Zähler dürfen eine Abweichung haben.
ZitatFür (MID-) Elektrizitätszähler zur Messung des Wirkverbrauchs gibt es drei Genauigkeitsklassen (A, B und C). Die Eichfehlergrenzen dieser Zähler sind neben der Genauigkeitsklasse auch von den 4 zulässigen Betriebstemperaturbereichen und von der Stromstärke abhängig. Die Eichfehlergrenzen liegen zwischen 1% und 9 % bzw. die Verkehrsfehlergrenzen zwischen 2% und 18 % in Abhängigkeit von der Klasse und dem zulässigen Betriebstemperaturbereich des Zählers sowie der Stromstärke.

Für einen Zähler mit dem Betriebstemperaturbereich -10 °C bis + 40 °C liegen die Verkehrsfehlergrenzen in Abhängigkeit vom Strom

    für einen Zähler der Klasse A zwischen 9% und 10%.
    für einen Zähler der Klasse B zwischen 5% und 6%.
    für einen Zähler der Klasse C zwischen 2% und 2,6%.

Ein Zähler der Klasse C wird aber sicherlich nicht im Haushaltsbereich eingesetzt.
Quelle: http://www.energieverbraucher.de/de/Eich--und-Fehlergrenzen__746/

Insofern kann es zu Differenzen kommen wenn Du einfach nur addierst.

Nachtrag: Hier auch noch einmal von offizieller Stelle http://www.eichamt.sachsen.de/576.htm#article614

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

andreas.maurer

Hallo Christopher,

danke für die ausführliche Antwort. Allerdings liegen meine Abweichungen jenseits der 20%

Ich habe mal die Grafik von Mai angehängt. Mal angesehen von den immens hohen Werte / Tag, die aber leider Realität sind, liegt der Durchschnitt, der Einzellzähler bei 16KW und der des Gesamtzählers bei 19 KW. Das lässt sich nicht mehr mit Toleranzen erklären.

Deshalb bin ich ja auf ein "Auswertungsproblem" gekommen.

Andreas

Bennemannc

Hallo,

also für das 12 * habe ich eine Erklärung. 12 * 5 Minuten ergeben ... eine Stunde. Wenn man mit den Werten arbeitet und Watt bekommen möchte - aber Impulse pro kWh hat, muss man eben mit der Zeit arbeiten. Ich habe das auch bei meiner Auswertung. Ich bekomme alle 15 Minuten einen Wert. Diesen nehme ich mal 4 und bekomme die mittlere Leistung in Watt für die 15 Minuten (1000 imp/ kWh).

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

andreas.maurer

jau, das macht Sinn. Ich habe mal auf 60 * 60 Sekunden umgestellt. Dann gibt es auch kein Problem beim Übertrag in ein neues Logfile.

andreas.maurer

Wobei ich das alles nicht begreife. Hier sind die Funktionen:
sub countLogEntries($$$) {
my ($offset, $logfile, $cspec) = @_;
my $count = getLogEntries($offset, $logfile, $cspec);
return $count;
}
sub getLogEntries($$$) {
my ($offset, $logfile, $cspec) = @_;
my $start = strftime("%Y-%m-%d_%H:%M:%S", localtime(time()-$offset));
my $end   = strftime("%Y-%m-%d_%H:%M:%S", localtime());
my $loglevel = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $start $end $cspec"));
$attr{global}{verbose} = $loglevel;
return @logdata;
}


Und das nochmal der Aufruf im at
Zitatdefine zaehler_haushalt_jetzt_erzeugung at +*00:01 { my $power = 12 * countLogEntries("300", "log_zaehler", "4:::");; fhem("set zaehler_haushalt_jetzt $power W") }

was summiert denn da überhaupt? Das "4:::"?

Hier mal ein Auszug aus meinem Log, jetzt aber nur über den 60 Sek Zeitraum:
2014.05.20 15:23:19 5: exec at command overall_haushalt_jetzt_erzeugung
2014.05.20 15:23:19 0: countLogEntries - Offset : 60
2014.05.20 15:23:19 5: Cmd: >get log_overall - - 2014-05-20_15:22:19 2014-05-20_15:23:19 4:::<
2014.05.20 15:23:19 4: log_overall get: Input file ./log/arduino/overall_2014-05-20.log, from:2014-05-20_15:22:19  to:2014-05-20_15:23:19
2014.05.20 15:23:19 4: log_overall get: line 1, regexp:, col:3, output lines:9
2014.05.20 15:23:19 3: get log_overall - - 2014-05-20_15:22:19 2014-05-20_15:23:19 4::: : 2014-05-20_15:22:19 505.59
2014-05-20_15:22:26 503.95
2014-05-20_15:22:33 506.37
2014-05-20_15:22:40 505.47
2014-05-20_15:22:47 504.04
2014-05-20_15:22:55 474.33
2014-05-20_15:23:01 591.56
2014-05-20_15:23:07 568.36
2014-05-20_15:23:13 577.94
#4:::

2014.05.20 15:23:19 4: dummy set overall_haushalt_jetzt 600 W


Da frage ich mich, wie da wenn alle Werte unter 600 liegen ein 600W rauskommt.

Bitte erklärt mir das doch jemand!?!

Andreas

fhainz

Hallo!

Ich hatte seit längerer Zeit, die erste Version am laufen. Klappte bei niedrigen Leistung problemlos, bei hohen (über ca. 2500 W) hatte ich öfters Fehlmessungen (manchmal 100% größer) die zwar nicht ständig auftraten aber die Plots wurden dadurch "ruiniert". Anschließend hab ich das Script in die 99_myUtils ausgelagert und ein paar Prüfungen der Leistung vorgenommen. Beim aufruf der Funktion übergebe ich für die Prüfung Minimale Leistung, Maximale Leistung und Maximale Delta Leistung zwischen 2 Messungen. Erst nach dem 2. Messvorgang mit > deltaPower wird das Reading geschrieben um Peaks zu verhindern.
Das klappte eigentlich ganz gut aber mir kamen die Leistungen trotzdem manchmal zu hoch vor.

Am Wochenende hab ich dann das Script nochmals umgebaut und speichere nun in einem eigenen Reading die Zeit und greife nicht mehr via oldValue drauf zu.
Das klappt nun, erstaunlicher weise, wesentlich besser! Leistungs Peaks hab ich mittlerweile kaum mehr und bei höheren Leistungen kommt mir die Leistung eher richtige vor. Ich kann das ganz gut mit den PCA301 vergleichen und zusammenrechnen. Wenn ich zB 300W verbrauche dann den Geschirrspüler anschalte hat das alte Script teilweise doppelt soviel angezeigt wie 300W + PCA301 vom Geschirrspüler.
Ich hab auch beide Scripte parallel laufen lassen, einen kleinen unterschied gabs bei kleinen Leistungen (unterschied muss sein weil ja die notify nacheinander ausgeführt werden), mit Geschirrspüler gingen die Leistungen teilweise 1000W auseinander.

Meine 99_myStromUtils.pm häng ich an falls das jemand testen will.

Ich rufe das Script in einem notify auf das von dem Raspi GPIO getriggert wird.

DEF:
sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("triggerDevice","writingDevice",minPower,maxPower,deltaPower);
}


zB DEF:
sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("sys_s0EingangAllgemein","d_stromverbrauchAllgemein",0,7500,300);
}



Grüße

Bennemannc

Hallo Andreas,

schau Dir doch mal Average an.define Summe_Bezug average SWAP_F1:int_bez.*
attr Summe_Bezug computeMethod counter
attr Summe_Bezug nominmax 1
attr Summe_Bezug room Flur
Dann bekommst Du im Device
Zitat
int_bez
10
2014-05-20 20:03:44
int_bez_avg_day
12.3
2014-05-20 20:03:44
int_bez_avg_month
17.6
2014-05-20 20:03:44
int_bez_cnt_day
79
2014-05-20 20:03:44
int_bez_cnt_month
1366
2014-05-20 20:03:44
int_bez_cum_day
974
2014-05-20 20:03:44
int_bez_cum_month
24008
2014-05-20 20:03:44
Da hast Du doch alles was Du brauchst - musst dann nur noch den richtigen Wert ins Log schreiben.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Christian.

zaehler_haushalt_jetzt_erzeugung berechnet den Durchschnittsverbrauch (in Watt) der letzten 5 Minuten. Summiert wird dabei nichts, sondern gezählt. Ich mache mal ein Beispiel. Sagen wir, Du hast einen Verbrauch von 500 W. In einer Stunde wären das 500 Wh. In 5 Minuten kommen 500/12=41,66 Wh zusammen. Für jede Wattstunde steht eine Zeile im Log, für die Dauer von 5 Minuten also 41 Zeilen. zaehler_haushalt_jetzt_erzeugung zählt die Anzahl der Zeilen der letzten 300 Sekunden (5 Minuten) und rechnet die auf 1 Stunde hoch (*12). Damit kommt man auf 60*12=492. Das ist also der durchschnittliche Verbrauch der letzten 5 Minuten. Aktualisiert wird er jede Minute.

Habe ich Dich richtig verstanden, dass Du Diesen Wert addierst? Ich denke nicht, dass das eine gute Idee ist. Der Wert gibt nicht die Energie (Wh), sondern die Leistung (W) an; außerdem wird der Verbrauch über 5 Minuten berechnet, deshalb gibt es Überschneidungen. Wenn Du z.B. den 500 W-Verbraucher aus dem Beispiel nach 2 Minuten abschaltest, dann werden in der 1./2./3./4./5. Minute 41/41/33/25/17 Zeilen gezählt und die durschnittliche Leistung von 492/492/396/300/204 Watt berechnet. Die Summe (1884) sagt dabei nichts sinnvolles aus.

Wichtig ist, dass keine anderen Einträge im Log stehen, da jede Zeile gezählt wird. Das könnte ggf. über den Parameter 4::: gesteuert werden.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

andreas.maurer

#87
Moin Christian,

danke für die Erklärung. Z.z. bin ich nur auf der Suche nach einer Erklärung für deinen Code.
Jetzt erschliesst sich mir das auch. Und die Abweichungen auch.
Die Methode funktioniert ja nur über einen grösseren Zeitraum. Deswegen wahrscheinlich auch deine Wahl von fünf Minuten.
Ich hatte mal auf 60 x 60 sec. Intervall umgestellt. dann wurde es noch schlechter. Wäre irgendwie besser, wenn das Intervall eine komplette Stunde wäre. Aber was machen wir mit dem Tagesanfang wo noch nichts im Log ist.

Ok. So habe ich eine Erklärung für die Abweichungen. Obwohl ... Da muss ich jetzt mal probieren.

So. Noch als Nachtrag: Anzahl der Logzeilen im GesamtZählerLog 5672 Im Log der EinzelZähler sind dagegen nur 5222 aufgelaufen. Alles von Heute. Das kann nicht zu gleichen Ergebnissen führen.
Aber in der Theorie hörte sich das schlüssig an.

Und nach ein paar Minuten nachdenken: Die Methode kann nur funktionieren. Wenn garantiert ein Impuls eines Zählers im Abrechnungszeitraum kommt.

Danke

Jakl

Hallo zusammen,

ich habe den Thread interessiert gelesen (sorry überflogen), Danke Christian für all deinen Input.

Ein paar kleine Fragen habe ich noch, eventuell sind sie schon beantwortet worden, Entschuldigung dafür! Vielleicht Antwortet ihr mir trotzdem nochmal:
- Wie ist der Arduino an die FritzBox angeschlossen, per USB? Ich habe eine Raspberry PI, wird er da am einfachsten per USB angeschlossen?
- Wie sind die S0 Ausgänge genau angeschlossen? Welche Kabel verwendet ihr?

Was mich aber noch fast am meisten interessiert, blockieren die Abfragen der S0-Anschlüsse per FHEM nicht extrem andere Module? FHEM läuft ja nur in einem Thread und da blockiert doch eine Abfrage (ausser man benutzt blockingcalls) alle anderen. Wie ist da eure Erfahrung?

Viele Grüße,
Jakl

andreas.maurer

Hi Jakl,

den Arduino kannst du über USB anbinden oder über Ethernet. Ich lasse es über Ethernet laufen, da der Zählerschrank 15 Meter weg vom Server ist. Das wäre mir für USB zu weit.
Anschluss an die S0 Klemmen der Zähler ist einfach. Zwei Drähte. GND an S0- und PINx an S0+. Nicht vertauschen. S0 ist kein einfacher Kontakt sondern ein Optokoppler.

Bei mir läuft ein kleiner Linux Server mit Atom Prozessor. Der ist mit meinen 15 Zählern völlig gelangweilt. Wie das mit der Fritzbox ist? Keine Ahnung.
Ansonsten meldet aber der Arduino sich bei dem FHEM Prozess. Es tritt nur Last auf, wenn was an fällt. Da wird nicht ständig gepollt.

Andreas