Smartmeter mit Pollin-Board, Ethersex und RasperryPi
1. Einleitung
An den Anfang der Seite
Die Stromimpulse werden von einem Drei-Phasen-S0-Stromzähler geliefert. Der S0-Zähler erzeugt 1000 Impulse pro kWh.
Die Gasimpulse liefert ein IN-Z61, das ist ein nachrüstbarer Niederfrequenz-Impulsgeber von Elster
Die Strom- und Gasimpulse werden mit Hilfe des Net-IO-Pollinboard und der Ethersex-Software mittels eines control6-Skripts erfasst und gezählt. Über ein Shellskript, das auf einem mit Debian modfizierten Seagate Goflex Net mit USB Festplatte(Stromverbrauch 8W) 24 Stunden läuft werden die Werte des Strom- und Gasimpulse alle 5 min in eine Mysql Datenbank geschrieben.
Die Darstellung der Verbrauchswerte Gas und Strom erfolgt mit Hilfe eines Xampp Apache Server auf einem Windows PC. Per PHP-Skript werden die Strom-und Gasverbrauchswerte tabellarisch und graphisch mit Hilfe von jpgraph dargestellt.
Tabellarische Darstellung der Gas und Strom-Verbrauchswerte
Stromverbrauch Tage 5 min
Graphische Darstellung Stromverbrauch Tage Stunden
2. Zählen der Stromimpulse des 3-Phasen-S0-Strom-Zählers mit dem Net-I0-Board von Pollin und Ethersex
An den Anfang der Seite
Das Net-IO-Pollin Board wird mit einem Atmega 644 bestückt. (fuses atmega 644: ef: FF ,hf 99 oder D9, lf:FF). Der Atmega 32 ist zu klein für das Ethersex mit Control6 Skript. Damit das Net-IO-Board von Pollin mit der Ethersex Software geflasht werden kann ist ein ISP Programmer erforderlich (z.Bsp der mySmart USB light. Die Ethersexsoftware kann auf einem Linux-Rechner gemäß der folgenden Anleitung Installation der Ethersexsoftware installiert werden. Bei mir hat es mit der unter dem Link angegegenen Live CD nicht geklappt. Deshalb habe ich mir ein Ubuntu 10.4 als virtuelle Maschine unter VMWare auf einem Windows PC eingerichtet.
3. Ethersex konfigurieren
An den Anfang der Seite
Nach Installation der Ethersexsoftware in das Ethersexverzeichnis wechseln umd make menuconfig aufrufen:
Load a Default Configuration → Pollin AVR Net IO
General Setup: Prompt for Experimental Code markieren, Target Architecture: AVR, TARGET MCU: Atmega 644, MCU Frequency:16000000, Hardware/periphery Class: NetIO VFS(Virtual File System Support): markieren, Control6 Skripts: markieren
Network: [*] Ethernet (ENC28J60) support → Etherrape IP address: „xxx.xxx.xxx“, Netmask: „255.255.255.0“
Network: [*]Default gateway: Das eigene Gateway, d.h. die IP Adresse des Routers eintragen.
Network: [*] TCP support
Network: [*] UDP support
IO: [*] Named and logic state I/O │ │ │ │ (default) Named pin configuration
IO: [*] TTY Layer (EXPERIMENTAL) → (X) Simple
IO: [*] ADC input → (ARef) ADC Reference
IO: [*] Onewire support → [*] Onewire device detection support
Protocols:[*] ECMD (Ethersex Command) support → [*] TCP/Telnet, [*] UDP
Protocols: [*] System clock support → [*] Date and Time support , [*] Use 32 kHz crystal to tick the clock, [*] Synchronize using NTP protocol, [*] Uptime (whm in unix format like: d days, hh:mm)
Protocols: [*] http Server
Wenn unter Protocols [*] Use 32 kHz crystal to tick the clock aktiviert wird, muss an den PINs TOSC1(PC6) resp. TOSC2(PC7) ein 32 kHz Uhrenquarz angeschlossen werden.
Jetzt fehlt nur noch das control6 Skript für Ethersex.
4. Control6-Skript zum Zählen der Strom- und Gasimpulse
An den Anfang der Seite
Ins Ethersexverzeichnis/control6 wechseln. Von dem Muster für das control6-skript: control6.src eine Kopie erzeugen und dann die Datei control6.src mit dem Inhalt meiner pdf-Datei „control6-Skript-Ethersex-Strom-Gaszähler.pdf“ befüllen. Mein control6-Skript sorgt dafür, daß alle 5min, 15 min, Volle Stunden und am Ende des Tages die Strom und Gasimpulse gezählt werden:
control6-Skript-Ethersex-Strom-Gaszähler.pdf
Hier der Link zum Download der Datei control6.src: control6.src
5. Erläuterung des Control6-Skriptes
5.1 Definition der Variablen (CLOCK_USED() ist für die Benutzung der Uhr)
An den Anfang der Seite
CLOCK_USED() uint32_t tag; static int gasflag=0; static int stromflag=0; CONTROL_START ECMD_GLOBAL(gas_h, 1000,uint16_t); ECMD_GLOBAL(gas_l, 100,uint16_t); ECMD_GLOBAL(strom_h, 1000,uint16_t); ECMD_GLOBAL(strom_l, 900,uint16_t); ECMD_GLOBAL(wert, 0, uint16_t); ECMD_GLOBAL(stromwert, 0, uint16_t); ECMD_GLOBAL(stromz, 0,uint16_t); ECMD_GLOBAL(zaehler_5,0, uint16_t); ECMD_GLOBAL(zaehler_15, 0,uint16_t); ECMD_GLOBAL(zaehler_15_l, 0,uint16_t); ECMD_GLOBAL(zaehler_h, 0,uint16_t); ECMD_GLOBAL(zaehler_h_log, 0,uint16_t); GLOBAL(temp,int16_t,0); GLOBAL(temp_str[5],char); ECMD_GLOBAL(flag, 0,uint8_t); GLOBAL(strom_str[5],char); ECMD_GLOBAL(stromzw, 0,uint16_t); ECMD_GLOBAL(zaehler_tag, 0,uint16_t); ECMD_GLOBAL(zaehler_tagl, 0,uint16_t); //GASvar ECMD_GLOBAL(gasz, 0,uint16_t); ECMD_GLOBAL(gas_zaehler_5,0, uint16_t); ECMD_GLOBAL(gas_zaehler_15, 0,uint16_t); ECMD_GLOBAL(gas_zaehler_15_l, 0,uint16_t); ECMD_GLOBAL(gas_zaehler_h, 0,uint16_t); ECMD_GLOBAL(gas_zaehler_h_log, 0,uint16_t); ECMD_GLOBAL(gas_zaehler_tag, 0,uint16_t); ECMD_GLOBAL(gas_zaehler_tagl, 0,uint16_t); ECMD_GLOBAL(zaehler_uptime, 0,uint32_t); ECMD_GLOBAL(gas_zaehler_uptime, 0,uint32_t); ECMD_GLOBAL(z_stand_strom, 0,uint32_t); ECMD_GLOBAL(z_stand_strom_analog, 0,uint32_t); ECMD_GLOBAL(z_stand_gas, 0,uint32_t); ECMD_GLOBAL(n, 0,uint32_t); ECMD_GLOBAL(m, 50000,uint32_t); ECMD_GLOBAL(zstand1008,0,uint16_t); //ende gasvar
Hierbei ist zu beachten, daß z.B. die Variable „ECMD_GLOBAL(z_stand_strom, 0,uint32_t)“ nicht standardmäßig definiert ist. Eine ECMD-Variable uint32_t ist standardmäßig nicht vorgesehen. Dazu später mehr.
Die Variablen strom_h und strom_l stammen noch aus einem Versuch die S0-Impulse auch über einen Analog-Eingang zu erfassen. Das hat mit dem s0-Zähler nicht geklappt.
5.2 Tabellarische Auflistung der Variablen im Control6-Skript
An den Anfang der Seite
Variable | Erläuterung Variable |
ECMD_GLOBAL(gas_h, 610,uint16_t); | Schwellwert hoch gas |
ECMD_GLOBAL(gas_l, 500,uint16_t); | Schwellwert niedrig gas |
ECMD_GLOBAL(strom_h, 560,uint16_t); | Schwellwert hoch strom |
ECMD_GLOBAL(strom_l, 520,uint16_t); | Schwellwert niedrig strom |
ECMD_GLOBAL(wert, 0, uint16_t); | gemessener Digitalwert Gas am Net IO |
ECMD_GLOBAL(stromz, 0,uint16_t); | stromimpuls |
ECMD_GLOBAL(zaehler_5,0, uint16_t); | stromimpuls 5 min |
ECMD_GLOBAL(zaehler_15, 0, uint16_t); | stromimpuls 15 min |
ECMD_GLOBAL(zaehler_15_l, 0, uint16_t); | stromimpuls 15 min log |
ECMD_GLOBAL(zaehler_h, 0,uint16_t); | stromimpuls stunde |
ECMD_GLOBAL(zaehler_h_log, 0,uint16_t); | stromimpuls stunde log |
ECMD_GLOBAL(z_stand_strom, 0,uint32_t);); | S0-Zählerstand Strom |
ECMD_GLOBAL(z_stand_strom_analog, 0,uint32_t); | Zählerstand Stromzähler analog |
ECMD_GLOBAL(strom_zaehler_uptime, 0,uint32_t); | Stromimpulse seit Start des Pollin-NetI0 |
GLOBAL(temp,int16_t,0); | |
GLOBAL(temp_str[5],char); | |
ECMD_GLOBAL(flag, 0,uint8_t); | |
GLOBAL(strom_str[5],char); | |
ECMD_GLOBAL(stromzw, 0,uint16_t); | |
ECMD_GLOBAL(zaehler_tag, 0,uint16_t); | stromimpuls tag |
ECMD_GLOBAL(zaehler_tagl, 0,uint16_t); | stromimpuls tag log |
//GASvar | |
ECMD_GLOBAL(gasz, 0,uint16_t); | gasimpuls |
ECMD_GLOBAL(gas_zaehler_5, 0, uint16_t); | gasimpuls 5 min |
ECMD_GLOBAL(gas_zaehler_15, 0, uint16_t); | gasimpuls 15 min |
ECMD_GLOBAL(gas_zaehler_15_l, 0, uint16_t); | gasimpuls 15 min log |
ECMD_GLOBAL(gas_zaehler_h, 0,uint16_t); | gasimpuls stunde |
ECMD_GLOBAL(gas_zaehler_h_log, 0,uint16_t); | gasimpuls stunde log |
ECMD_GLOBAL(gas_zaehler_tag, 0,uint16_t); | gasimpuls tag |
ECMD_GLOBAL(gas_zaehler_tagl, 0,uint16_t); | gasimpuls tag log |
ECMD_GLOBAL(z_stand_gas, 0,uint32_t); | Zählerstand Gaszähler |
ECMD_GLOBAL(gas_zaehler_uptime, 0,uint32_t); | Stromimpulse seit Start des Pollin-NetI0 |
5.3 Definition der Ports,Aktivieren des externen Interrupts an Int0 zum Zählen der Stromimpulse
An den Anfang der Seite
Die o.g. Definitionen wurden in einen sog. Thread gepackt, der Thread Strom wird weiter unten im Skript einmal gestartet.
THREAD(strom)
// Pullup-Widerstaende aktivieren
PORTD |= _BV(PORTD2); // activate pullup on D2
DDRD &= ~_BV(DDD2); // set D2 to input
DDRD &= ~_BV(DDD3); // set D3 to input (PIN16 des Atmega 644 bzw. PIN 1 Ext, hier wird S0+ ausgang des 3-Phasen-S0-Stromzählers angeschlossen)
PORTD |= (1<<PORTD3); dnl Pull-UpWiderstand PD 3 zuschalten _EIMSK |= _BV(INT0); // external interrupt request 0 enable
_EICRA |= (1 << ISC01) | (0<< ISC00);// interrupt request the falling edge of INT0 generates an interrupt request.
THREAD_END(strom)
Blockschaltbild Pollinboard S0-Zähler
Thread Strom beim Start einmal, Thread adc0 endlos ausführen
ON STARTUP DO
dnl THREAD_START(temploop)
THREAD_START(strom)
THREAD_RESTART(adc0)
END
5.4 Thread adc0, Erfassung des Gasimpulses
An den Anfang der Seite
Blockschaltbild Pollinboard-Gaszähler
THREAD(adc0)
wert = ADC_GET(0);
if ((wert > gas_h) && (gasflag==0)) {gasz++;gas_zaehler_15 ++;gas_zaehler_h ++;
gas_zaehler_tag ++;z_stand_gas++;gas_zaehler_uptime++;gasflag=1;}
else
if ((wert < gas_l“) && (gasflag==1)) {gasflag=0;}
THREAD_END(adc0)
In der Variablen „wert“ wird der aktuelle Wert am Analog/digital-Eingang adc0=PA0=PIN 40 erfasst. Sobald der Schalter im Gasimpulszähler geschlossen wird, das ist der Fall wenn ein Gasimpuls gegeben wird, liegt an ADC0 5V an. Theoretisch hat die Variable „wert“ dann den Wert 1023. Wird kein Gasimpuls gegeben ist der Schalter offen, die Variable „wert“hat dann den Wert 0.Die beiden Zustände werden mit den Variablen gas_h=1000 und gas_l=100 verglichen.
Ist die Variable „wert“ größer als gas_h und die Variable gas_flag=0, dann werden die Variablen gasz;gas_zaehler_15;gas_zaehler_h gas_zaehler_tag;z_stand_gas;gas_zaehler_uptime um 1 hochgezählt, darüber hinaus wird die Variable gasflag auf 1 gesetzt. Sobald die Variable „wert“ den Wert der Variablen gas_l unterschreitet und die Variable gasflag=1 ist, wird die Variable gasflag auf 0 gesetzt. Beim ersten Start des Skripts wird die Variable gasflag mit static int gasflag=0 auf 0 gesetzt.
5.5 Erfassung der Gas- und Stromimpulse alle 5 min, 15 min, Volle Stunde, Mitternacht
An den Anfang der Seite
ON ONCE (CLOCK_MIN == 0) DO
if (CLOCK_HOUR == 0) {
zaehler_tagl=zaehler_tag;
zaehler_tag = 0;
gas_zaehler_tagl=gas_zaehler_tag;
gas_zaehler_tag = 0;
}
zaehler_5 = stromz;
stromz = 0;
zaehler_15_l=zaehler_15;
zaehler_15=0;
zaehler_h_log=zaehler_h;
zaehler_h=0;
gas_zaehler_5 = gasz;
gasz = 0;
gas_zaehler_15_l=gas_zaehler_15;
gas_zaehler_15=0;
gas_zaehler_h_log=gas_zaehler_h;
gas_zaehler_h = 0;
END
Hier als Beispiel das Wegschreiben der Werte zur vollen Stunde und um Mitternacht. Hat die interne Uhr z.B. den Wert 14.00, dann wird:
Strom:
die Variable stromz auf 0 gesetzt und in der Variablen zaehler_5 gespeichert // 5min wert stromzähler
die Variable zaehler_15 auf 0 gesetzt und in der Variablen zaehler_15_l gespeichert//15min wert stromzähler
die Variable zaehler_h auf 0 gesetzt und in der Variablen zaehler_h_log gespeichert//Stundenwert wert stromzähler
Gas:
die Variable gasz auf 0 gesetzt und in der Variablen gas_zaehler_5 gespeichert // 5min wert gaszähler
die Variable gas_zaehler_15 auf 0 gesetzt und in der Variablen gas_zaehler_15_l gespeichert//15min wert gaszähler
die Variable gas_zaehler_h auf 0 gesetzt und in der Variablen gas_zaehler_h_log gespeichert//Stundenwert wert gaszähler
um Mitternacht wird zusätzlich diese Schleife aktiv:
if (CLOCK_HOUR == 0) {
zaehler_tagl=zaehler_tag;
zaehler_tag = 0;
gas_zaehler_tagl=gas_zaehler_tag;
gas_zaehler_tag = 0;
}
Jetzt wird:
die Variable zaehler_tag auf 0 gesetzt und in der Variablen zaehler_tagl gespeichert // wert gaszähler Mitternacht
Gas die Variable gas_zaehler_tag auf 0 gesetzt und in der Variablen gas_zaehler_tagl gespeichert // wert gaszähler Mitternacht
Analoges passiert alle 5 min bzw. 15 min mit den Zeilen ON ONCE CLOCK_MIN(== 05),ON ONCE CLOCK_MIN(== 10), ON ONCE CLOCK_MIN(== 15) DO usw…..
5.6 Interrupt für Stromzähler
An den Anfang der Seite
ISR(INT0_vect)
{
stromz++;
zaehler_15++;
zaehler_h++;
zaehler_uptime++;
zaehler_tag++;
z_stand_strom++;
z_stand_strom_analog++;
zstand1008++;
if (zstand1008 == 252) {
z_stand_strom=z_stand_strom-2;
z_stand_strom_analog=z_stand_strom_analog-2;
zstand1008 = 0;
}
while (n <= m)
{
n++;
}
n=0;
Sobald der s0-Zähler einen Impuls (Impulslänge= 90 ms) liefert, genauer gesagt die fallende Flanke des Impulses erreicht wird (siehe _EICRA |= (1 << ISC01) | (0<< ISC00)), springt das Programm in die Interruptroutine ISR(INT0_vect) und zählt die Variablen dort um jeweils 1 hoch.
5.7 Ausgleich der Diskrepanz zwischen gezählten Impulsen und Zählerständen AnalogStromzähler und S0-Stromzähler
An den Anfang der Seite
zstand1008++;
if (zstand1008 == 252) {
z_stand_strom=z_stand_strom-2;
z_stand_strom_analog=z_stand_strom_analog-2;
Da es eine Diskrepanz zwischen den gezählten Impulsen und den Zählerständen auf dem analogen Stromzähler und dem s0-Zähler gibt, die Genauigkeitsklass ist 1, das heißt es kann eine Ungenauigkeit von 1% entstehen,wurde das obige Codeschnipsel eingefügt.Immer dann wenn die Anzahl der Stromimpulse 252 erreicht, werden von den Zählerständen 2 Impulse abgezogen. Anders herum gesagt eine Anzahl von 1008 Stromimpulsen entspricht einem Verbrauch von 1kWh auf dem anaolgen Stromzäöhler und dem S0-Stromzähler.
5.8 „Bremsen“ der Geschwindigkeit des Interrupts
An den Anfang der Seite
while (n <= m)
{
n++;
}
Das obige Codeschnipsel wurde eingefügt, weil der Interrupt zu schnell ist. Der Interrupt bleibt solange in der Schleife bis der Wert von n den Wert von m erreicht hat, das heißt 50.000.
5.9 Codeschnipsel für die Anzeige von Strom- und Gasimpulsen auf einem vierzeiligen mit Ethersex kompatiblen 20-Zeichen-Display
An den Anfang der Seite
THREAD(disp) TTY_CLEAR() TTY_GOTO(0,0) TTY_WRITE_TIME() TTY_GOTO(0,10) dnl TTY_WRITE(`“%5sC“‚, temp_str) TTY_GOTO(1,0) TTY_WRITE(„Stromzaehler:%3d“,stromz) TTY_GOTO(2,0) TTY_WRITE(„Strom 5min=%d“,zaehler_5) stromzw=zaehler_5*100/15; itoa_fixedpoint(stromzw, 0, strom_str); TTY_GOTO(3,0) TTY_WRITE(„Watth 5min=%s“,strom_str) THREAD_END(disp) THREAD(dispr) TTY_CLEAR() TTY_GOTO(0,0) TTY_WRITE(„%04d-%02d-%02d“, CLOCK_YEAR(), CLOCK_MONTH(), CLOCK_DAY()) TTY_GOTO(1,0) TTY_WRITE_TIME() TTY_GOTO(1,10) TTY_GOTO(2,0) TTY_WRITE(„Strom 5min=%d“,zaehler_5) TTY_GOTO(3,0) TTY_WRITE(„Strom Stunde=%d“,zaehler_h) THREAD_END(dispr) THREAD(disptag) TTY_CLEAR() TTY_GOTO(0,0) TTY_WRITE(„%04d-%02d-%02d“, CLOCK_YEAR(), CLOCK_MONTH(), CLOCK_DAY()) TTY_GOTO(0,11) TTY_WRITE_TIME() TTY_GOTO(1,0) TTY_WRITE(„Strom Tag=%5d“,zaehler_tag) TTY_GOTO(2,0) TTY_WRITE(„Strom Stunde=%d“,zaehler_h) THREAD_END(disptag) ON (PIN_RISING(KEY)) DO flag=flag+1; END
Wenn an PIN PD5=named PIN „Key“ ein Taster angeschlossen wird kann das Display umgeschaltet werden. Hier wird der als Ausgang definierte PIN PA3=named PIN p4 als Hilfspin benutzt(siehe auch Datei: „/ethersexverzeichnis/pinning/named_pin/default“).Auf die Displayvariante möchte ich momentan nicht weiter eingehen.
ON (PIN_RISING(KEY) && flag==1) DO PIN_SET(p4); END ON ((PIN_RISING(KEY)) && flag==2) DO PIN_CLEAR(p4); END ON ((PIN_RISING(KEY)) && flag==3) DO PIN_CLEAR(p4); flag=0; END ON ((PIN_HIGH(p4)) && flag==1) DO THREAD_STOP(disptag) THREAD_STOP(disp) THREAD_START(dispr) END ON ((PIN_LOW(p4)) && flag==2) DO THREAD_STOP(disptag) THREAD_STOP(dispr) THREAD_START(disp) END ON ((PIN_LOW(p4)) && (flag==3) || flag==0) DO THREAD_START(disptag) THREAD_STOP(dispr) THREAD_STOP(disp) END
6. Weitere in Ethersex notwendig anzupassende Dateien
An den Anfang der Seite
/ethersexverzeichnis/pinning/named_pin/default
/ethersexverzeichnis/pinning/hardware/netio.m4
/ethersexverzeichnis/control6/control6-header.m4
/ethersexverzeichnis/control6/ecmd.c
Die Dateien „control6-header.m4“ und „ecmd.c“ sind so modifiziert, daß auch u_int32-Variablen im control6-Skript akzeptiert werden.
7. Anzeige der gezählten Impulse über die Ethersex-Web-Oberfläche
An den Anfang der Seite
Mit Hilfe der Datei /ethersexverzeichnis/embed/xy.ht.m4 können die gezählten Impulse auf der Weboberflache angezeigt werden. Damit die ständige automatische Aktualiserung der Websetie funktioniert
Mit dem Austausch der Startseite von Ethersex „“ ethersexverzeichnis/embed/idx.ht.m4 kann die Webseite mit „IP-Adresse Pollin Board/xy.ht“ direkt aufgerufen werden.
Webseite Werte Energiezähler
8. Kompilieren der so angepassten Ethersex Software und flashen des Net-IO-PollinBoard
An den Anfang der Seite
Nachdem nun alle Vorbereitungen abgeschlossen sind, kann kompiliert werden. Dazu ins Ethersex-Verzeichnis wechseln und „make“ eingeben. Am Ende entsteht eine Hex-Datei „ethersex.hex“ die nur noch in das Pollin Board geflasht werden muß.
Den ISP-Programmer mySmart USB light oder USBasp mit dem ISP-Wannenstecker am Pollinboard verbinden (Achtung für den mySmart USB musß noch ein Adapter 6polig auf 10 Polig gebaut werden).
Mit dem Befehl
für den USBasp: sudo avrdude -p m644 -P lpt1 -c usbasp -U flash:w:ethersex.hex
für den mySmart USB light: sudo avrdude -p m644P -P /dev/ttyUSB0 -c stk500v2 -U flash:w:ethersex.hex
das Pollin Board flashen.
Wenn nun die Signale angeschlossen sind, werden die Impulse bereits gezählt. Wer mit nur mit Tageswerten zufrieden ist, ist hier bereits fertig. Für die Aufzeichnung der Daten in einer Datenbank wird weitere Hardware benötigt.
9. Das NAS-System Goflex-Net von Seagate modifiziert mit Debian als Datenlogger
An den Anfang der Seite
Das NAS-System Goflex-Net von Seagate modifiziert mit Debian als Datenlogger
Das NAS System Goflex Net (Preis < 40 €) lässt sich hervorragend als vollwertiges Debian-System modifizien.Der Prozessor ist im Vergleich zu zB. dem NSLU2 ungefähr 10 x schneller getaktet. Der Stromverbrauch liegt in der gleichen Größenordnung wie beim NSLU2 (ca (5-10 W).Es muß lediglich ein USB-Stick oder eine kleine USB-Festplatte an das Goflex Net angeschlossen werden. Eine Anleitung wie das Seagate Goflex Net mit Debian modifiziert werden kann findet man unter folgendem link Goflex Net mit Debian modifizieren
Ist das Debian aufgespielt, so sollte man ein Update machen,das MySql-Serverpaket, das bc-Paket und das netcat Paket installieren.
Sind die oben gennanten Pakete installiert, so muß eine Datenbank auf dem Debian-MySql-Server angelegt werden. Ich habe die Datenbank „test“ genannt und die Tabelle „energie_nslu“.Der link enthält die Struktur der MySql-Tabelle MySQL-Tabelle energie_nslu-Struktur
09a. Raspberry Pi mit Raspbian Wheezy bzw. Raspian Jessi als Datenlogger
An den Anfang der Seite
Der Raspberry Pi kann genauso als Datenlogger verwendet werden. Nach Vorbereitung des Raspi mit Raspian sollten nach
apt-get update und
apt-get upgrade
noch folgende Pakete installiert werden:
apt-get install bc
apt-get install netcat
aptitude install ntpdate ntp tzdata
apt-get install exim4
apt-get install gawk
apt-get install samba
apt-get install msttcorefonts
apt-get install apache2 apache2.2-common mysql-server phpmyadmin php5 php5-mysql php5-common libapache2-mod-php5 php-pear
An den Anfang der Seite
10. Erfassen der Daten in der MySql-Datenbank mit Hilfe eines Shellskriptes
Das in einer Endlosschleife laufende Shellskript sorgt dafür, daß alle 5min, 15min, Volle Stunden und Mitternacht die vom Net-IO-Pollin Board gezählten Impulse Gas und Strom mit Datum und Uhrzeit in die MySql-Datenbank geschrieben werden.
Zusätzlich werden in dem Shellskript alle 5min, 15min, Volle Stunden und Mitternacht die Temperaturwerte eines Dallas 1820 Temperatursensors abgefragt und in der MySql-Datenbank abgespeichert.
11. Temperaturerfassung mit dem Temperatursensor Dallas DS 1820
An den Anfang der Seite
Pinbelegung Anschlussvarianten des Temperatursensors Dallas DS18B20
Blockschaltbild Temperatursensor an Pollinboard
Pin 2 des Temperatursensors wird an Pin 5 des Ext-Wannensteckers (=PD6 Atmega 644), an Pin2 und Pin 3 des Tempsensors kommt ein 4,7kOhm Widerstand,Pin 1 geht an Masse, Pin 3 an +5V.
Im Shellskript wird über diese Zeilen:
`echo 1w convert $TEMP_ID | nc -v -u -n -w 6 $AVRNETIO_IP $AVRNETIO_PORT -q 1 | grep -v OK || exit 1`
temp_buero=`echo „1w get $TEMP_ID“ | nc -v -u -v -n -w 6 $AVRNETIO_IP $AVRNETIO_PORT -q 1`
der temperaturwert abgeholt. Wichtig ist, daß nachdem der Temperatursensor entsprechend dem Blockschaltbild angeschlossen wurde, die ID des Temperatursensors abgefragt wird. Dazu in einen Linux-Terminal „netcat IP-Adresse des Pollinboards 2701“ oder „telnet IP-Adresse des Pollinboards 2701“ eingeben. Dann das Kommando „1w list“ eingeben. Die angezeigte Temperatursensor-ID notieren und im Shellskript ändern.Selbstverständlich müssen im Shellskript die IP-Adressen, die Datenbankdaten usw. angepasst werden. Weiterhin muß, damit die Temperatur auf der Webseite xy.ht angezeigt wird, in der Datei xy.ht.m4 in der Zeile
ArrAjax.ecmd(‚1w get 283e5dde03000069‘, ecmd_temp_req_handler);
die ID des Temperatursensors, die mit 1w list ausgelesen wurde, angepaßt werden.
12. Shellskript Datenlogger MySql
An den Anfang der Seite
Hier der Link zum Shellskript Shellskript Datenlogger MySql.
Das Skript kann unter Debian folgendermassen dauerhaft im Hintergrund gestartet werden (Voraussetzung man steht im Verzeichnis des Skriptes): nohup ./zaehler_sql_37.sh &
13. Eingabe der Zählerstände Gas und Strom
An den Anfang der Seite
Alle ecmd-Variablen des control6-Skripts können über die Weboberfläche von Ethersex abgefragt und gesetzt werden. Im Browser gibt man dazu
für die Abfrage: „ecmd?c6+get+variablenname“ ein.
für das Setzen der Variabelen: „ecmd?c6+set+variablenname“ ein.
Damit die Zählerstände Gas und Strom auf der Webseite „xy.ht“ richtig angezeigt werden, müssen natürlich die Zählerstände zunächst eingegeben werden. Beim Start des Pollin Boards sind diese Variablen natürlich Null.
Den Gaszählerstand muss man mit 2 Kommastellen, allerdings ohne Komma, eingeben (Bsp.: Zählerstand = 75435,5 –> Eingabe:7543550).
Also mit der Variablen z_stand_gas: „ecmd?c6+set+z_stand_gas 7543550“.
Den Stromzählerstand muss man mit 3 Kommastellen, allerdings ohne Komma, eingeben (Bsp.: Zählerstand = 87350,2 –> Eingabe:87350200).
Also mit der Variablen z_stand_strom: „ecmd?c6+set+z_stand_strom 7543550“ (s0-Stromzähler) bzw. mit der Variablen „z_stand_strom_analog“ „ecmd?c6+set+z_stand_strom_analog 754350200“ (Stromzähler der E-Werke).
14. php-Dateien zur tabellarischen und graphischen Darstellung der erfassten Werte
An den Anfang der Seite
Unter htdocs im xampp Apache-Server muß ein Unterverzeichnis energie erzeugt werden und die php-Dateien dort abgelegt werden. Die index-Datei ist die Datei „startenergie_pc1.php“. Die php-Dateien für die tabellarische und graphische Darstellung in der Datei „energie.zip“ können
hier
heruntergeladen werden. Zumindest die beiden ersten Menüpunkte Startformular und Stromverbrauch Tage sind bisher in der Datei Energie-Net-IO-Website-Erlaeuterung.pdf
erläutert. Außerdem wird dort beschrieben, welche Dateien im Hinblick auf die MySQL-Datenbanken bzw. IP-Adressen geändert werden müssen.
Einen Überblick über die Verzeichnisstruktur der Dateien bekommt man hier.
Was bisher noch fehlt sind die Sourcen von jpgraph. Die zip-Datei jpgraph.zip enthält die notwendigen Dateien. Die zip Datei entpacken und ein Verzeichnis htdocs/energie/jpgraph erzeugen. Die Dateien dorthin entpacken.
So sieht die Startseite aus:
15. Kosten
An den Anfang der Seite
Im folgenden die Auflistung der wichtigsten Bauteile:
Stand 9.12
Bauteil |
Lieferant |
Preis |
Seagate FreeAgent GoFlex Net Media-Sharing-Lösung |
Amazon |
37,90 € |
Pollin Board Net-IO-Fertigmodul |
Pollin |
27,95 € |
3-Phasen S0-Zähler für Hutschiene |
B+G Etech. |
44,00 € |
Atmega 644 |
Pollin |
6,24 € |
Temperatursensor Ds1820 |
Pollin |
2,40 € |
Bausatz SUB-D Anschlussplatine für Pollin Board |
Pollin |
3,95 € |
Summe |
|
122,44 € |
16. Kostenreduzierung
An den Anfang der Seite
Wem das alles zu teuer ist, der kann als Alternative zum S0-Stromzähler und zum Niederfrequenz-Impulszähler Gas, selbstgebaute Optokoppler verwenden.
Hier der Schaltplan für den Optokoppler Stromzähler:
Schaltplan Optokoppler Stromzähler
Der Aufbau des Optokopplers Stromzähler sieht so aus:
Die Holzleiste wird so vor dem Stromzähler positioniert, daß der rote Strich der Ferrarischeibe erkannt wird. Läuft der rote Strich der Ferrarischeibe an dem InfrarotStrahl der Infrarotdiode vorbei, so wird weniger Infrarotlicht reflektiert, was eine Verringerung der Ausgangsspannung des Fototransistors bewirkt. Diese Spannung an einen Analog/Digitaleingang des Pollin Boardes gegeben, ermöglicht das Zählen der Impulse über das control6 Skript:
THREAD(adc1)
stromwert = ADC_GET(1);
if ((stromwert < strom_l) && (stromflag==0)) {stromz++;stromflag=1;}
else
if ((stromwert > strom_h) && (stromflag==1)) {stromflag=0;}
THREAD_END(adc1)
Die Schwellwerte strom_h und strom_l müssen entsprechend den Ausgangsspannungen am Fototransistor angepasst werden. Der Schwellwert beim Durchgang des roten Striches ist strom_l, sonst ist der Schwellwert strom_h.
Bei meinem Stromzähler entsprechen 150 Umdrehungen der Ferrarischeibe 1 kWh, d.h. ein Durchgang des roten Striches= 1 Impuls entspricht 1/150 kWh.
Bei mir war der Wert für strom_h=511 (entspricht 511/1023x5V=2,5 V), für strom_l=409 (entspricht 409/1023x5V=2 V)
Der Vorteil dieser Lösung ist natürlich, daß man sich den teueren S0-Stromzähler spart, der Nachteil ist, daß die Messung erheblich ungenauer sein könnte (1000 Impulse/kWh vs. 150 Impulse/kWh). Außerdem kostet das Justieren des Optokoppler vor der Ferrarischeibe einige Mühe.
Der selbstgebaute Optokoppler lässt sich genauso für die Zählung der Gasimpulse verwenden, die meisten Gaszähler haben in der 6 der letzen Stelle des Zählwerkes eines silbernen Punkt. Den Optokoppler auf diesen Punkt ausgerichtet, ergibt hervorragende Impulse. Das Ausgangssignal des Fototransistors kann genauso wie das Signal des Niederfrequenz-Gasimpulszählers auf den Analog/Digitaleingang des Pollin Boardes gegeben werden.
THREAD(adc0)
wert = ADC_GET(0);
if ((wert > gas_h) && (gasflag==0)) {gasz++;gas_zaehler_15 ++;gas_zaehler_h ++;
gas_zaehler_tag ++;z_stand_gas++;gas_zaehler_uptime++;gasflag=1;}
else
if ((wert < gas_l“) && (gasflag==1)) {gasflag=0;}
THREAD_END(adc0)
17. Alle benötigten Dateien zum Download
An den Anfang der Seite
/ethersexverzeichnis/ethersex.hex
diese Datei mit folgendermassen verwenden: Kopieren in das Verzeichnis /ethersexverzeichnis/ dann „sudo avrdude -p m644 -P lpt1 -c usbasp -U flash:w:ethersex.hex“ ausführen
Voraussetzung ist , daß über einen usbasp-programmer programmiert wird
control6.src und ethersex.hex sind aktualisiert am 10.5.15
/ethersexverzeichnis/control6/control6.src
/ethersexverzeichnis/pinning/named_pin/default (download mit: rechte Maustaste → Ziel speichern unter:abspeichern mit Dateiname „default“ ohne suffix)
/ethersexverzeichnis/pinning/hardware/netio.m4 (Definition der Anschlüsse für Temperatursensor, download mit: rechte Maustaste → Ziel speichern unter)
/ethersexverzeichnis/control6/control6-header.m4download mit: rechte Maustaste → Ziel speichern unter
/ethersexverzeichnis/control6/ecmd.c
Die Dateien „control6-header.m4“ und „ecmd.c“ sind so modifiziert, daß auch u_int32-Variablen im control6-Skript akzeptiert werden.
/ethersexverzeichnis/embed/xy.ht.m4 (Anzeige der gezählten Impulse über die Ethersex Weboberfläche, Aufruf im Browser mit „IP-Adresse Pollinboard/xy.ht“)
Shellskript Datenlogger MySql
MySQL-Tabelle energie_nslu-Struktur
energie.zip (energie.zip:Unter htdocs im xampp Apache-Server muß ein Unterverzeichnis energie erzeugt werden und dort die php-Dateien abgelegt werden. Die index-Datei ist die Datei „startenergie_pc1.php“)
jpgraph.zip (Die zip Datei in das Verzeichnis htdocs/energie/jpgraph entpacken. Vorischt bei Verwendung von php7, dann die entsprechenden jpgraph-Dateien für php 7 herunterladen.)