Auslesen eines Ferraris-Stromzählers mit RS232-Interface

Anschluss an ioBroker

mit PIC12F675 & PIC16F628


zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage


Allgemeines
Aufbau
Der optische Sensor / Sensor-Modul
Betrachtungen zur Messgenauigkeit
Leistungs-Messung / Berechnung
Funktionstest
Halterung
Einlesen der Werte mit dem Raspi
ioBroker-Integration
Download

Messbereich:  1 W ... 91910W
Auflösung des Messwertes:  10 W
interner Messfehler  < 2%
Stromzählertyp: Drehscheibe mit 75 U/kWh

Viele Haushalte haben noch herkömmliche Stromzähler mit einer Drehscheibe. Aus Sicht des Datenschutzes sind diese herkömmlichen Ferraris-Stromzähler den modernen "Smartmetern" haushoch überlegen. Aber manchmal interessiert einen doch der momentane Stromverbrauch des eigenen Haushaltes.

Da gibt es z.B. Lösungen bei denen der Zähler mit einer Kamera überwacht wird, und mit einem Neuronalen Netz der Zählerstand ausgewertet wird, aber es geht auch deutlich einfacher.

Mein einfacher Sensor misst die Drehgeschwindigkeit der Zählerscheibe, und errechnet daraus den momentanen Verbrauch. Das Ergebnis wird via RS232 ausgegeben. Für eine komfortable Protokollierung und Anzeige, habe ich den Sensor in ioBroker (Hausautomatisation) eingebunden.

(Wer bereits ein Smartmeter hat mag sich hierfür interessieren.)
Montage des
                Aufbaus



Aufbau Sensor-Modul

Integration in ioBrokeree


Montage des AufbausDer optische Sensor / Sensor-Modul

Das Problem
Da jegliche Eingriffe in den geeichten Stromzähler unzulässig sind, bleibt nur ein Weg an den momentanen Stromverbrauchsmesswert zu kommen: die optische Ablesung.
Die einfachste Umsetzung ist ein einfacher Reflexkoppler, mit der auf die silberfarbene Drehscheibe des Stromzählers ausgerichtet ist, und darauf die rote Markierung erkennt, wenn sie im Laufe der Scheibendrehung das Sichtfenster passiert. Was erst mal einfach klingt, erweist sich im Detail als kompliziert. Die Drehscheibe liegt ca 10..15 mm hinter der Oberfläche des Sichtglases, und ist nur ca. 2 mm dick. Sie sitzt in einem wenige Millimeter breiten Schlitz der metallenen Frontblende des Stromzählers. Sowohl das Sichtglas (transparentes Plastik) wie auch die Frontblende (dunkelgrau lackiertes Blech) erweisen sich als Störfaktoren, da sie permanent Licht reflektieren.

Irrwege
Handelsübliche Reflexkoppler bestehend aus einer IR-LED und einem IR-Fototransistor in einem gemeinsamen Gehäuse (zB. ADPS-9102). Diese sind im Plastikgehäuse so angeordnet, dass sich ihre optischen Achsen etwa 3 mm vor dem Kopplergehäuse kreuzen. Man kommt mit dem Koppler also nicht dicht genug an das Drehrad heran, um ein optimales Ergebnis zu erhalten. Durch die Schrägstellung von IR-Diode und IR-Transistor kommt es obendrein zu einer direkten Übertragung des IR-Lichtes durch das Deckglas des Stromzählers. Der IR-Transistor wird also schon durch das Streulicht im Deckglas geblendet. Dieser Effekt lässt sich vermindern, wenn man dafür sorgt, dass zwischen Reflexkoppleroberfläche und Deckglasoberfläche kein Luftspalt bleibt. Trotzdem habe ich am Ausgang des IR-Transistors beim Vorbeilauf der roten Markierung der Drehscheibe maximal eine Spannungsänderung von 10% beobachten können. Das erfordert eine Signalverarbeitung mit OPV und erscheint auch nicht sehr zuverlässig.Aus diesem Grunde setze ich keinen fertigen Reflexkoppler ein.

Anstelle fertiger Reflexkoppler sollte man also seine separate "Lichtquelle" und einen separaten Lichtsensor verwenden, und dabei für den Zweck optimale Teile auswählen.
Eine rote Markierung ließe sich eigentlich mit grünem Licht am besten (und mit rotem Licht am schlechtesten) erkennen. Es gibt aber kaum Bauteile, die intensives grünes Licht gebündelt abstrahlen und empfangen können.
(Eine mögliche Alternative ist Laserlicht. Die Lasereinheit eines billigen Laserpointers fokussiert ihr Licht so gut, dass es nur die Drehscheibe trifft. Das rote Licht hat zwar die falsche Farbe, kompensiert das aber mit seiner Intensität.)


Die Lösung
In der Praxis hat sich infrarotes Licht bewährt. Aber nur bestimmte Einzelbauteile versprechen einen Erfolg.

Typische IR-Leuchtdioden haben eine Plastiklinse, die das abgestrahlte Licht in einen Lichtkegel konzentrieren. Auf Grund der großen Entfernung zwischen Lichtquelle und Drehscheibe, füllt die Drehscheibe nur einen Teil ihres Lichtkegels. Der Rest des Lichtes verfehlt die Drehscheibe und geht ihm verloren. Da der Querschnitt des Lichtkegels mit dem Abstand zur Lichtquelle quadratisch ansteigt, kann man davon ausgehen, dass bei einer Verdopplung des Abstandes zwischen IR-LED und Drehscheibe die Menge des nutzbaren Lichtes auf 1/4 sinkt. Dem lässt sich entgegenwirken, wenn man eine IR-LED mit möglichst gut gebündeltem Lichtkegel verwendet.Dadurch bleibt die Leuchtdichte auf dem Drehrad hoch. Außerdem vermindert sich der Lichtanteil , der von der Frontblende des Stromzählers permanent zum IR-Transistor reflektiert wird und diesen blendet. Eine gutes Nutzsignal entsteht also dann, wenn der IR-Lichtkegel möglichst so schmal ist, dass er in den Schlitz der Frontblende passt. (SFH484; ± 8 Grad)
Die gewählte IR-Diode SFH484 verträgt 100 mA Dauerstrom. Im Pulsbetrieb sind aber auch höhere Ströme und damit eine höhere Helligkeit möglich. Allerdings bewirkt ein zu großer Strom auch eine Blendung des Fototransistors durch Reflektionen im Deckglas und an der Frontblende. Deshalb verwende ich einen 100 Ohm Vorwiderstand, der den Strom auf etwa 35 mA begrenzt. Der 16 Grad breite Lichtkegel hat bei 15 mm Abstand zum Drehrad etwa 4 mm Durchmesser. Bei exakter Ausrichtung trifft nur wenig Licht auf die Frontblende des Stromzählers. Die Leuchtdiode wird nur für die Zeit der Messung ca. 200 µs lang eingeschaltet. Messungen erfolgen alle 20..50 ms. C1 sorgt dafür, dass durch den LED-Strom, die Betriebsspannung des PIC um nicht mehr als 10 mV zusammenbricht. Wenn man R1 verkleinert, sollte man C1 vergrößern.

Stromlaufplan

Das gilt entsprechend auch für den Fototransistor. Die Drehscheibe füllt nur einen Teil seines Sichtfeldes. Andere Teile des Stromzählers, insbesondere die Frontblende, werfen permanent Licht zum IR-Transistor zurück und versuchen ihn zu blenden. Auch IR-Transistoren haben Plastiklinsen, die die Größe ihres Sichtfeldes bestimmen. Ein Typ mit möglichst schmalem Sichtfeld ist hier zu bevorzugen. (BPW17; ± 12 Grad)
Das 24 Grad breite Sichtfeld des gewählten Transistors BPW-17 hat auf 15 mm Abstand etwa einen Durchmesser von 6mm.

Da am Ausgang des Fototransistors kein digitales Signal zu erwarten ist, messe ich die dortige Signalspannung mit dem ADC des PIC12F675. Das erlaubt es, auch vergleichsweise kleine Pegeländerungen sicher zu erkennen.

Mechanischer Aufbau: Prototyp
IR-Diode und Fototransistor habe ich direkt über der Mitte des Drehrades auf dem Deckglas nebeneinander so angebracht, dass sie senkrecht auf das Drehrad "schauen" und beide auf dem Glas aufliegen. Aufgrund der kleineren PrototypGehäusebauform hat der Fototransistor dabei deutlich mehr von der Länge seiner Anschlusspins behalten dürfen. Über beide Bauteile habe ich einzeln schwarzen Isolierschlauch gesteckt, der erst auf dem Deckglas endet. Das dient der optischen Isolation der Bauteile voneinander. Befindet sich bei eingeschalteter LED der reflektierende Teil der Drehscheibe unter dem Sensor, so liegt die Spannung an GP0 bei etwa 0V. Befindet sich aber der rote Teil der Drehscheibe unter dem Sensor, so steigt die Spannung an GP0 auf etwa 1..2 V. (Jeweils während der 200 us langen Leuchtzeit der LED gemessen.
Ich möchte noch einmal betonen, dass die optischen Bauteile mit dem offenen Ende des schwarzen Isolierschlauchs auf dem Deckglas aufliegen müssen. Ich drücke deshalb die Trägerplatine mit einem Gummiband gegen das Deckglas. Ein Luftspalt zwischen dem Ende des Isolierschlauchs und dem Glas führt zu einem "optischen Kurzschluss" der den Fototransistor blendet. Eine Prüfung der optischen Funktion kann mit einem Oszilloskop erfolgen, das an Pin 7 des PIC angeschlossen wird. Dort liegt ein 5V-Pegel an, der alle 20..50 ms durch einen ca. 200 us langen Low-Puls (etwa 0 V) unterbrochen wird. Befindet sich die rote Markierung unter dem Sensor, dann darf der low-Puls nur noch bis etwa 3..4V herabgehen.

Mechanischer Aufbau: Fertiggerät
Die Justage des Prototypen erforderte Geduld. Hier kam es wirklich auf den Millimeter an. Schon bei 2mm Abweichung von der Idealposition ist am Oszilloskop die rote Marke praktisch nicht mehr zu erkennen. Außerdem behinderte der Prototyp das Ablesen des Zählers. Eine zuverlässige mechanische Lösung musste her, die eine Justage überflüssig macht, das Ablesen nicht behindert, und einfach auf den Zähler aufgesteckt werden kann. Das erreichte ich durch einen 3D-gedruckten Rahmen, der weiter unten beschrieben ist.


Berechnung im Sensor-Modul:

Erkennung der roten Marke
In regelmäßigen Abständen von 20..50 ms wird mit GP1 die IR-LED eingeschaltet. Nach einer Wartezeit von >100 us (acquisition time für den ADC) wird die Spannung an GP0 mit dem ADC in einen 10-Bit Wert gewandelt und die IR-LED wieder abgeschaltet. Das Ergebnis heißt P. Es wird dann der bisherige Durchschnitt der Messergebnisse DP aus dem Speicher gelesen, und ein neuer DP-Wert nach folgender Formel errechnet:
DP = DP*63/64 + P/64

Dadurch folgt der DP Wert nur langsam den Änderungen des P-Wertes. Springt z.B. P um 2 V nach oben, dann beginnt auch DP zu steigen. allerdings nur mit anfangs etwa 1 V/s.

Liegt P um mehr als 250 mV über DP, dann gilt die rote Marke als erkannt, und an GP2 wird High ausgegeben. Sinkt dann P auf einen Wert, der weniger als 125 mV über DP liegt, dann wird GP2 wieder auf  low geschaltet. Die 125 mV Differenz zwischen der Einschaltschwelle und der Ausschaltschwelle dienen der Rauschunterdrückung (Schmitttrigger). Das GP2-Signal wird an das Anzeigemodul weitergegeben.


Wattmeter
Mit Hilfe des Timer1 und einer Interruptroutine ist im Sensor ein 32-Bit-Zähler aufgebaut, dessen Zählerstand alle 8 us um 1 erhöht wird. Dieser Zähler dient als Stoppuhr, um die Dauer einer Scheibendrehung zu messen. Bei Beginn der roten Marke wird der Zählerstand gespeichert und der Zähler auf Null zurückgesetzt.
Die oberen 24 Bit des Zählwertes werden benutzt, um die momentane Leistungsaufnahme zu errechnen. Da im Sensor der Arbeitsspeicher sehr begrenzt ist, und aufgrund der zeitintensiven RS232-Emulation auch kaum Rechenzeit zur Verfügung steht, benutze ich eine vereinfachte Routine, die die Leistung nur auf 10W genau bestimmt.

Leistung [Watt] = (2 343 750/ Zählwert) x 10

Der Hintergrund dieser Berechnung ist weiter unten (Anzeigemodul) erläutert. Das Ergebnis wird in eine 5-stellige Dezimalzahl gewandelt, und zyklisch via RS232 ausgegeben ("W=00820W")


Energiezähler
Jedes mal wenn der Beginn der roten Marke erkannt wird, wird ein 6-stelliger Dezimalzähler um 1 erhöht. Die Gesamtanzahl der Drehungen wird zyklisch via RS232 ausgegeben ("Ro:000075"). Jeweils nach 100 Scheibendrehungen werden die oberen 4 Stellen des Zählers im EEPROM gesichert. Sollte der Strom ausfallen, oder der Sensor vorübergehend abgeschaltet werden, dann wird beim Neustart dieser gespeicherte Wert als Startwert genommen. Es gehen also maximal 99 Umdrehungen verloren.
Eine Drehung entspricht 13,33Wh. Wird der Sensor z.B. stündlich via RS232 ausgelesen, dann kann man anhand des veränderten Zählerstandes die während dieser Stunde verbrauchte Energie ausrechnen.


RS232-Emulation / USB-Wandler
Der Sensor besitzt einen RS-232-Ausgang am Port GP4 (Pin 3). Letzterer ist eine Softwareemulation, da der PIC12F675 keine RS-232-Hardware besitzt. Die Polarität des RS-232-Ausgangs kann mit dem Jumper JP1 am Port GP3 (Pin 4) eingestellt werden. Wird hier GP3 mit GND verbunden (JP1: 2-3), dann kann der RS232-Ausgang direkt mit dem RX-Pin eines normalen RS232-Einganges verbunden werden. Der Höhe des erzeugten Signalpegels entspricht zwar nicht der RS232-Spezifikation, aber moderne Computer kommen damit erfahrungsgemäß problemlos zurecht (9600 Baud, 8 Bit, 1 Startbit, 1 Stopbit, keine Flusskontrolle).

Oft werden heute aber RS232-USB-Wandlerplatinen günstig angeboten, die keinen RS232-Treiberchips haben und stattdessen mit TTL-Pegel arbeiten. Dafür ist dann eine inverse Polarität nötig. Die gibt der Sensor aus, wenn man GP3 mit 5V verbindet (JP1: 1-2). Im Stromlaufplan ist so eine TTL_Pegel-Wandlerplatine angedeutet, wie ich sie auch einsetze. Ein Foto sieht man rechts. Auf der Platine ist ein Jumper, den man auf "5V" setzen muss, damit der Sensor über das "VCC"-Pin mit 5V versorgt wird.

Der Sensor gibt zyklisch (etwa alle 20ms ... 50ms) einen Textstring mit der momentanen Leistung und mit der Zahl der Scheibendrehungen aus: "W=00820W Ro:000075"
TTL-RS232-USB-Adapter



Betrachtungen zur Messgenauigkeit

Wert am Anzeigemodul
Ich verwende den internen PIC-Takt von 4 MHz, dieser kann beim 16F628 einen Fehler von bis zu 8,75% aufweisen. Dieser Frequenzfehler geht voll in das Messergebnis ein. Wem das zu viel ist, der sollte im Anzeigemodul einen 4-MHz-Resonator oder einen 4-MHz-Quarz einsetzen. (Das brachte bei meinem PIC16F628A eine Messwertkorrektur um 3%, aber jeder PIC ist anders.)

Die Messung der Drehzeit erfolgt mit einer Auflösung von 20,48 ms. Das entspricht bei 800 W einer Auflösung von 0,3 W bzw. 0,03 % (also einem Fehler von <0,015%). Diese Auflösungsungenauigkeit steigt mit der Leistung linear an.
Bei 5 kW beträgt sie 1,8 W (0,19 %). (Das entspricht einem Fehler von <0,1%.)
Der Fehler ist völlig zu vernachlässigen, da der Ferraris-Stromzähler selber auch schon einen Fehler von 2% haben kann.


RS232-Werte des Sensor-Moduls
Ich verwende den internen PIC-Takt von 4 MHz, dieser kann beim 12F675 einen Fehler von bis zu 2% aufweisen. Dieser Frequenzfehler geht voll in das Messergebnis ein, er ist aber nicht größer als der Fehler des Ferraris-Stromzähler.

Die Messung der Drehzeit erfolgt mit einer Auflösung von 2,048 ms. Das entspricht bei 800 W einer Auflösung von 0,03 W bzw. 0,003 % (also einem Fehler von <0,0015%). Diese Auflösungsungenauigkeit steigt mit der Leistung linear an. Bei 5 kW beträgt sie 0,18 W (0,019 %). (Das entspricht einem Fehler von <0,01%.)
Allerdings erfolgt dann die Berechnung mit einer Auflösung von nur 10W! Das entspricht bei 800W einem Fehler von 0,625%. Dieser Auflösefehler wiederum sinkt mit steigender Leistung und beträgt bei 5kW nur noch 0,1%
Wie auch immer, der Fehler ist völlig zu vernachlässigen, da der Ferraris-Stromzähler selber auch schon einen Fehler von 2% haben kann.



Leistungs-Messung
/ Berechnung
Die Drehscheibe macht pro verbrauchter Kilowattstunde genau 75 Umdrehungen, eine Umdrehung entspricht also 13,3 Wh. Benötigt die Scheibe genau 1 Minute für eine Umdrehung, dann beträgt der Verbrauch gerade 800W. Benötigt die Scheibe genau 1 Sekunde für eine Umdrehung, dann beträgt der Verbrauch gerade 48 kW.

Es genügt, die Zeit für eine Scheibenumdrehung zu messen, dann kann man daraus die Momentanleistung wie folgt berechnen

Leistung [Watt] = 48 000 / Drehzeit [Sekunde]


Der PIC des Sensormoduls verwendet einen 24-Bit-Softwarezähler, der alle 2,048 Millisekunden inkrementiert wird. Am Ende einer Scheibendrehung wird dessen Zählwert ausgelesen und der Zähler auf Null zurückgesetzt. Der Zählwert entspricht also der Zeit für eine Scheibendrehung in 2,048-ms-Schritten. Daraus ergibt sich folgende Formel für die Leistungsberechnung: (48000 x 1s/2,048ms = 23 437 500)

Leistung [Watt] = 23 437 500/ Zählwert

Da komme ich mit 24-Bit-Berechnungen nicht mehr aus. Aus Speicherplatz- und Rechenzeitgründen berechne ich deshalb die Leistung in nicht in 1W sondern in 10W-Auflösung

Leistung [10Watt] = 2 343 750/ Zählwert

An das Ergebnis hänge ich dann noch eine Null an, und bekomme ein Ergebnis in Watt.

Beispiel:
Die Dauer einer Rotation der Drehscheibe sei 60 Sekunden. Der Zähler zählt in dieser Zeit bis 29296 (29296 x 2,048ms = 59,998 s).
Die Berechnung ergibt 2343750/ 29296 = 80.
Dieser Zahlenwert wird in eine vierstellige Dezimalzahl (0080) gewandelt und mit einer angehangenen Null über RS232 ausgegeben:  W=00800W.




Funktionstest
Eine Kalibrierung ist eigentlich nicht nötig, aber einen Funktionstest sollte man schon durchführen. Die LED am GP2 (Pin 5) des Mikrocontrollers hilft beim Finden der korrekten Position. Die LED leuchtet dann immer solange auf, die der rote Sektor der Drehscheibe vom Sensor erkannt wird.

Bei der Inbetriebnahme sollte man die Stromaufnahme des Moduls prüfen. Das Sensormodul nimmt durchschnittlich nur etwa 1 mA Strom auf.  Bei deutlich höheren Stromwerten ist die Betriebsspannung sofort zu trennen, und der Fehler zu suchen.

Am RS232-Anschluss kann man mit einem Terminalprogramm (9600 Baud) die vom Sensormodul ausgegebenen Werte anschauen. Etwa alle 50 ms wird eine Zeile ausgegeben, die erst die Leistung in Watt und danach die Gesamtzahl der Scheibendrehungen anzeigt. Nach jeder Sensorbedeckung wird die Leistung neu berechnet und Umdrehungsanzahl erhöht. Beträgt die errechnete Leistung mehr als 91 kW , dann wird als Leistung "W=****0W" ausgegeben.



Halterung

Die ursprüngliche Befestigung mit Klebeband und Gummi ist nicht nur unschön, sie ist unpräzise und verdeckt die Anzeige bei der Ablesung. Es ist wohl auch keine so gute Idee, etwas am Stromzähler festzukleben, wenn es auch nur mit Klebeband. Schließlich gehört mir der Zähler ja nicht.

Deshalb habe ich inzwischen eine auf den Zähler aufsteckbare 3d-gedruckte Halterung im Einsatz.
Mein Zähler ist 140mm breit und die Drehscheibe befindet sich genau 60mm von der oberen Kante entfernt. Für diese Maße ist meine Halterung ausgelegt. Wer eine andere Zählerform hat, muss meine CAD-Datei (OpenSCAD) entsprechend anpassen.

Unten mittig sieht man die Halterungen für die Fotodiode und den Fototransistor. Beide werden hier einfach bis zum Anschlag hineingesteckt. Falls sie locker sitzen hilft ein Tropfen Kleber. Die vier (roten) Hülsen links daneben sind zum Festschrauben einer Platine gedacht, die die Elektronik trägt. Ich habe eine Lochrasterplatine benutzt.

Die ovalen Ausschnitte dienen der Materialeinsparung (und der Verkürzung der Druckzeit). Der große viereckige Ausschnitt oben, gibt den ungehinderten Blick auf die Anzeige des Zählers frei.

Die Halterung besteht aus drei Baugruppen, die einzeln gedruckt und danach verklebt werden:
  • Rahmen
  • Halteblock für Fotodiode und Fototransistor (schwarzes PLA!)
  • Platinenhaltebuchsen
Halterung
Hinweis:
Die optischen Achsen von Fototransistor und Fotodiode sind parallel. Das muss so sein! Der Versuch, die beiden Achsen auf einen gemeinsamen Fokuspunkt auszurichten (die Drehscheibe) hat nicht funktioniert. Die Reflektion der Glasscheibe ist dann zu groß.



Einlesen der Werte mit dem Raspi

Folgendes Perl-Script verwende ich, um die Daten am virtuellen USB-Port abzufragen und in ein File zu schreiben:

#! /usr/bin/perl
# script zum Auslesen des Wattmeter-Sensors via RS232-USB
# aufrufen mit "read_wattmeter.sh > /run/shm/PowerMeter_Power.txt 2>&1


#W=00840W Ro:545092

open ($fd, "< /dev/ttyUSB0") or die "cannot open serial port";

# warten auf =
# das ist das 2. Zeichen im String und es ist eindeutig
while (getc($fd) ne "=") {} # auf Zeilenanfang

$c="";
$output="W=";

while($c ne "\n"){
    $c = getc($fd);
    $output = $output.$c;
}
close ($fd);

#davor die Zeit schreiben
my $CTIME_String = localtime(time);
print "$CTIME_String   ";

#Wed Jan  1 01:16:01 2014   W=00840W Ro:545092
print "$output";

Bei mir registriert sich der RS232-USB-Adapter als /dev/ttyUSB0. Bei Abweichungen, ist das Script anzupassen.
Das Script habe ich in ioBroker einfach nach /opt/iobroker/iobroker-data/files/0_userdata.0/read_wattmeter.sh hochgeladen, da das einfach mit der Weboberfläche des ioBrokers geht.

Wenn man das Script aufruft, muss als Kommandozeilenparameter der Name des Files übergeben werden, in dem die per RS232/USB empfangenen Daten abgelegt werden sollen. Ich verwende /dev/shm/PowerMeter_Power.txt, da /dev/shm/ in der RAM-Disk liegt. Dadurch wird eine unnütze Abnutzung des Flash-Speichers vermieden.

Das Perl-Script wird jede Minute durch cron aufgerufen. Dafür ist ein Eintrag in das File /var/spool/cron/crontabs nötig:


* * * * *     /opt/iobroker/iobroker-data/files/0_userdata.0/read_wattmeter.sh > /run/shm/PowerMeter_Power.txt 2>&1




Logging

Nun wird jede Minute das File /dev/shm/PowerMeter_Power.txt neu erstellt.
Leider wird man auch sehen, dass nun  cron das syslog vollmüllt. Ich halte es für besser, die Logs von Cron deshalb in ein separates Logfile schreiben zu lassen.

Dazu ändert man das File /etc/rsyslog.d
Im Abschnitt RULES entfernt man das führende # in der Zeile
#cron.*        -/var/log/cron.log

In der folgenden Zeile:
*.*;auth .....    -/var/log/syslog 
ergänzt man "cron.none"

Die geänderte Datei wird gespeichert, und der Log-Dienst neu gestartet:
sudo systemctl restart rsyslog

Ab sofort landen die Logeinträge von Cron nicht mehr in /var/log/syslog sondern in /var/log/cron.log.



ioBroker-Integration

Nun muss man in ioBroker die Daten aus dem File extrahieren  und in Datenpunkte eintragen. Der folgende Screenshot zeigt die Datenpunkte, die ich von Hand eingetragen habe:

ioBroker Datenpunkte

Befüllt werden sie minütlich durch folgendes Script:


var fs = require('fs');
var fn = '/run/shm/PowerMeter_Power.txt';

var idPowermeterMeldung        = 'Wattmeter.Meldung';
var idPowermeterPower          = 'Wattmeter.Leistung_W';
var idPowermeterRotations      = 'Wattmeter.Drehungen';
var idPowermeterRotationsNight = 'Wattmeter.DrehungenMitternacht';
var idPowermeterTime           = 'Wattmeter.ZeitPunkt';
var idPowermeterEnergie        = 'Wattmeter.EnergieGestern_Wh';
var idPowermeterKosten         = 'Wattmeter.KostenGestern_Ct';
var idPowermeterTarif          = 'Wattmeter.Cent_kWh';

function getPowerMeter() {
    // Leistung in Watt
    fs.readFile(fn, 'utf8',  function(error, data) {
        if(error) log('Fehler beim Lesen von ' + fn, 'error');

        //Sun Apr 10 13:20:01 2022   W=00520W Ro:002115
        else {
            setState(idPowermeterMeldung, data);           
            const words = data.split(' ');
            var S1, S2, S3, S4;
            var P = 0;
            S1 = words[3]; // Zeit
            S4 = words[4]; // Jahr

            P = data.indexOf('W=');
            S2 = data.substr(P+2, 5);

            P = data.indexOf('Ro:');
            S3 = data.substr(P+3, 6);
                                                    //Wed Apr 13 07:57:01 2022   W=00600W Ro:005105
            setState('Wattmeter.Str_Zeit', S1);     //07:57:01
            setState('Wattmeter.Str_Power', S2);    //00600  
            setState('Wattmeter.Str_Drehungen', S3);//005105

            // Zeit
            setState(idPowermeterTime, S1);                   
            // Power          
            setState(idPowermeterPower, parseFloat(S2));
            // Drehungen   
            setState(idPowermeterRotations, parseFloat(S3)); 
        }
    });
}

function getDaylyEnergy() {
    var DrehAlt=0, DrehNeu=0, Energie=0, Tarif=0, Kosten=0, PowerAvg=0;
    // alten und aktuellen Drehungswert lesen, ist ein 6-stelliger Dezimalzähler
    DrehAlt = getState(idPowermeterRotationsNight).val;
    DrehNeu = getState(idPowermeterRotations).val;
    // Tarif  in Cent pro kWh lesen
    Tarif   = getState(idPowermeterTarif).val;

    // neuen Drehungswert speichern
    setState(idPowermeterRotationsNight, DrehNeu);

    // TagesEnergie berechnen und speichern, 75 U/kWh, außer bei Zählerüberlauf
    if (DrehNeu > DrehAlt) {
        Energie = (DrehNeu - DrehAlt)* 1000 / 75;
        Kosten  = Math.round(Energie * Tarif / 1000); // cent
        Energie = Math.round(Energie);
        setState(idPowermeterEnergie, Energie);
        setState(idPowermeterKosten, Kosten);
        Kosten = Kosten/100; // Euro
        setState('Wattmeter.str_KostenGestern_E', Kosten.toFixed(2));
        PowerAvg = Energie/24;
        PowerAvg = Math.round(PowerAvg);
        Energie = Energie/1000; // kWh
        setState('Wattmeter.str_EnerieGestern_kWh', Energie.toFixed(3));      
        setState('Wattmeter.PowerGesternAvg_W', PowerAvg);        
    }
}

schedule('*/1 * * * *', getPowerMeter);  // Jede Minute
schedule('11 0 * * *', getDaylyEnergy);  // um 0:11


getPowerMeter() erledigt das eigentliche minütliche Befüllen der Datenpunkte.


getDaylyEnergy() wird immer um 00:11 Uhr aufgerufen, und berechnet Gesamtenergieverbrauch und -Kosten des abgelaufenen Tages. Dafür liegt in Wattmeter.KostenGestern_Ct der Preis der Kilowattstunde in Cent (von Hand eingetragen).)

Nun können die Daten in ioBroker wie üblich in Datenbanken abgelegt und z.B. zu übersichtlichen Grafiken verarbeitet werden.




Download
Hier liegen


Entwicklung / Updates

19.05.2011
- Urversion ist online

22.05.2011
- Bugfix: Speicherung des Energiezählers im EEPROM des Sensormoduls

04.12.2011
- im Sensormodul R1 auf 100 Ohm vergrößert

09.08.2020
- 3-D gedruckter Halterahmen

24.04.2022
- Anzeigemodul entfernt
- ioBroker-Integration


zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 05.05.2011
letzte Änderung:: 09.08.2020