conf/smileys.conf 0000660 0000041 0000041 00000001354 11711020222 014354 0 ustar www-data www-data # Smileys configured here will be replaced by the
# configured images in the smiley directory
8-) icon_cool.gif
8-O icon_eek.gif
8-o icon_eek.gif
:-( icon_sad.gif
:-) icon_smile.gif
=) icon_smile2.gif
:-/ icon_doubt.gif
:-\ icon_doubt2.gif
:-? icon_confused.gif
:-D icon_biggrin.gif
:-P icon_razz.gif
:-o icon_surprised.gif
:-O icon_surprised.gif
:-x icon_silenced.gif
:-X icon_silenced.gif
:-| icon_neutral.gif
;-) icon_wink.gif
m( facepalm.gif
^_^ icon_fun.gif
:?: icon_question.gif
:!: icon_exclaim.gif
LOL icon_lol.gif
FIXME fixme.gif
DELETEME delete.gif
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/youless.txt 0000644 0000041 0000041 00000000102 12445676002 027131 0 ustar www-data www-data === (verschobene seite) ===
#redirect hardware/controllers/youless var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/feuchtigkeitssensor.txt 0000644 0000041 0000041 00000020001 12405631563 031515 0 ustar www-data www-data ====== 1-Wire Feuchtigkeitssensor ======
Dr. Claus Kühnel beschreibt eine Möglichkeit, die Luftfeuchtigkeit per 1-Wire zu messen:
[[http://www.ckuehnel.ch/PDF/Messung%20von%20Temperatur%20und%20Feuchtigkeit.pdf]]
Tobias Müller hat unter [[http://www.tm3d.de/index.php/1wire-feuchtesensor]] beschrieben, wie man mit einer einfachen Schaltung die Temperatur und Luftfeuchtigkeit per 1-wire misst:
{{:hardware:feuchte_schaltung.png?200|}}
Bei Bedarf kann man die passenden Platinen, einen Bausatz oder gleich eine fertig gelötete Version bei Tobias käuflich erwerben:
[[http://www.tm3d.de/index.php/kontakt?view=contact]]
===== HIH-5030 =====
Der HIH-5030,
[[http://sensing.honeywell.com/honeywell-sensing-hih5030-5031%20series-product-sheet-009050-2-en.pdf?name=HIH-5030-001
]]
===== DS-2438 =====
Smart Battery Monitor:
[[http://datasheets.maximintegrated.com/en/ds/DS2438.pdf]]
===== Das Script =====
#!/usr/bin/perl
# Created 2014.09.13 Sebastian Vitt
# Version: 1.1 2014.09.14
# Based on Allan Dyers 1Wire Humidity script at http://rants.dyer.com.hk/rpi/humidity_1w.html
# If someone else also become annoyed becaus of the really looong running
# time of this script (like me) BUT knows how to build this
# in C (not like me) please tale although a look at
# http://www.tm3d.de/index.php/1wire-feuchtesensor
use warnings;
use strict;
use Digest::CRC;
use LWP::UserAgent;
use Log::Log4perl;
my @alldevs;
my $onewire = '/sys/bus/w1/devices/'; # including last slash
my $VZURL = 'http://192.168.0.91/middleware.php/'; # including last slash
my $opt_d = 0; # debug
my $name;
my $onewireaddress;
my $uuid;
my $temp;
my $humidity;
######
# $OFF $FATAL $ERROR $WARN $INFO $DEBUG $TRACE $ALL
#$log->error("No drink defined");
# Initialize logging
my $log_conf = q(
log4perl.appender.Screen=Log::Dispatch::Screen
log4perl.appender.Screen.stderr=0
log4perl.appender.Screen.Threshold=FATAL
log4perl.appender.Screen.layout=Log::Log4perl::Layout::SimpleLayout
log4perl.appender.Email=Log::Dispatch::Email::MailSender
log4perl.appender.Email.smtp=spamcheck.pop-siegen.de
log4perl.appender.Email.subject=1Wire Humidity Read Script
log4perl.appender.Email.to=1whumidity_script@oktasilan.de
log4perl.appender.Email.from=1wirehumidity@oktasilan.de
log4perl.appender.Email.Threshold=WARN
log4perl.appender.Email.layout=Log::Log4perl::Layout::SimpleLayout
log4perl.rootLogger=WARN, Email, LOGFILE
log4perl.appender.LOGFILE=Log::Log4perl::Appender::File
log4perl.appender.LOGFILE.filename=/var/log/1w_humidity.log
log4perl.appender.LOGFILE.mode=append
log4perl.appender.LOGFILE.layout=PatternLayout
log4perl.appender.LOGFILE.layout.ConversionPattern=[%d %r] %p %F Line: %L %M %c - %m%n
);
Log::Log4perl::init( \$log_conf );
my $log = Log::Log4perl->get_logger();
$log->info("********* 1-Wire Humidity Script started **********");
# welche werte sollen geholt werden?
my %Daten = ( # Name => [ Adresse onewire, uuid-Volkszaehler ]
"KWL-Oben" => ["26-0000019259f1", "dff9fce0-3aa0-11e4-85e7-91adc4f69e83" ] ,
"KWL-ELW" => ["26-000001925c6c", "d8f6a4a0-3aa0-11e4-ad4e-d5d9b759d00c" ]
);
my $start_run = time();
use Fcntl qw(:flock);
my $lockfile = '/tmp/1wire001.pid';
sub BailOut {
$log->info("$0 is already running, LockFile '$lockfile' is locked - exiting");
exit(1);
}
$log->debug("start of program");
open(my $fhpid, '>', $lockfile) or $log->error_die("error: open '$lockfile': $!");
flock($fhpid, LOCK_EX|LOCK_NB) or BailOut();
# Note: lock should be automatically released at end of program,
# no matter how the process is terminated. (the file persists, only the lock will be removed)
while (($name) = each(%Daten)){
$onewireaddress = $Daten{$name}[0] ;
$log->debug("$onewire$onewireaddress/rw");
($Daten{$name}[2],$Daten{$name}[3]) = DS2438reader("$onewire$onewireaddress/rw") ;
$uuid = $Daten{$name}[1] ;
$temp = $Daten{$name}[2] ;
$humidity = $Daten{$name}[3] ;
if ($humidity) {
$log->debug("$name $uuid $humidity");
my $server_endpoint = $VZURL . "data/${uuid}.json?value=" . $humidity;
$log->debug("serverget = $server_endpoint");
# set custom HTTP request header fields
my $req = HTTP::Request->new(POST => $server_endpoint);
$req->header('content-type' => 'application/json');
$req->header('x-auth-token' => 'kfksj48sdfj4jd9d');
# add POST data to HTTP request body
$req->content(" ");
my $ua = LWP::UserAgent->new;
my $resp = $ua->request($req);
if ($resp->is_success) {
my $message = $resp->decoded_content;
$log->debug("Received reply: $message");
} else {
$log->error("HTTP GET error code: $resp->code");
$log->error("HTTP GET error message: $resp->message");
}
}
}
my $end_run = time();
my $run_time = $end_run - $start_run;
$log->debug("Job took $run_time seconds");
sub DS2438reader {
my ($devf) = @_;
my $rtime= time;
$log->debug("Reading DS2438 / HIH-5030-001 $devf");
unless (open( DS2438, "+>$devf")) {
#$log->error("Unable to open $devf $!");
return;
}
my $oldfh = select DS2438; $|= 1; select $oldfh; # autoflush
my ($status, $vad, $vdd, $temp, $humid);
print DS2438 "\x4e\x00\x00";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\x48\x00";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\x44";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\xb4";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\xb8\x00";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\xbe\x00";
($status, $temp, $vad)= readTVC();
return unless defined($vad);
if ($status) {
print STDERR "DS2438 incorrect status reading VAD: " . sprintf( "%02d", $status);
return;
}
print DS2438 "\x4e\x00\x08";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\x48\x00";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\xb4";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\xb8\x00";
for (my $b="\x00"; $b eq "\x00"; ) { read DS2438, $b, 1; }
print DS2438 "\xbe\x00";
($status, $temp, $vdd)= readTVC();
return unless defined($vdd);
if ($status ^ 0x08) {
print STDERR "DS2438 incorrect status reading VDD: " . sprintf( "%02d", $status);
return;
}
if ($vad == $vdd) {
#$log->warn($tsh, $hostname, undef, 'D008', 1, "DS2438 voltage match $vad");
$log->warn("DS2438 voltage match $vad");
return;
}
#$log->debug("H read ", (($vad / $vdd) - 0.1515) / 0.00636, "\tComp ", 1.0546 - 0.00216 * $temp);
$humid= ($vad / $vdd - 0.1515) / 0.00636 / (1.0546 - 0.00216 * $temp);
$log->debug("localtime() Temperature $temp Humidity $humid");
# return { temp => $temp, humid => $humid, time => (time - $rtime) };
return $temp,$humid;
}
sub readTVC {
my $data;
read DS2438, $data, 9; # and CRC
my ($status, $t, $v, $c, $th, $crc) = unpack('CvvvCC', $data);
#$log->debug("TVC raw %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", unpack('C*', $data));
$log->debug("TVC $status, $t, $v, $c, $th, $crc");
unless (crcCheck(substr($data, 0, -1), substr($data, -1))) {
#$log->error("$tsh, $hostname, undef, 'D009', 1,"DS2438 CRC error $status $t $v $c $th $crc");
$log->error("DS2438 CRC error $status $t $v $c $th $crc");;
return;
}
my $temp = ($t >> 3) * 0.03125;
$log->debug("T $temp V $v");
return $status, $temp, $v;
}
sub crcCheck {
# Dallas/Maxim CRC8
my ($r, $c) = @_;
my $ctx = Digest::CRC->new(width => 8, poly => 0x31, init => 0x00, xorout => 0x00, refin => 1, refout => 1);
$ctx->add($r);
my $crc= $ctx->digest;
if ($opt_d) {
my @data = unpack('C*', $r);
$log->debug("crcCheck %d %d | %02x %02x %02x %02x %02x %02x %02x %02x |",ord($c), $crc, @data);
}
$log->debug("CRC ", (ord($c) == $crc), " ", ord($c), " ", $crc);
return (ord($c) == $crc);
}
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/links.txt 0000775 0000041 0000041 00000003106 12165347433 026564 0 ustar www-data www-data ===== Links =====
Wo finde ich Infos zum Thema SmartMeter? Einige Links wurde aus der Mailingliste zusammengetragen:
* http://www.smartnow.com.au/current_cost_bridge.html
* http://community.pachube.com/node/436
* http://www.netzpolitik.org/2010/verbraucher-studie-zu-intelligenten-stromzaehler
* http://umweltsuende.wordpress.com/
* http://www.heise.de/newsticker/meldung/Umfrage-Intelligenter-Stromzaehler-kein-Selbstlaeufer-1012092.html
==== Andere SmartMeter Projekte ====
* [[http://www.flukso.net|flukso]]
* [[https://www.mysmartgrid.de|mySmartGrid]]
* [[http://www.smartenergygroups.com|Smart Energy Groups]]
* [[http://openenergymonitor.org|OpenEnergyMonitor]]
* [[http://www.ladyada.net/make/tweetawatt/|Tweet-A-Watt von Lady ADA]] Sicherlich interessant, verfolgt aber wohl einen anderen Ansatz als volkszaehler.org
* [[http://www.diykyoto.com/uk/wattson/|Wattson - auch eine sehr spannende Idee]]
* [[http://umweltsuende.wordpress.com/2010/09/16/klein-aber-fein|Klein aber fein]]
* [[http://www.adlerweb.info/blog/2010/12/17/bitbastelei-5-stromverbrauch-am-pc-darstellen|BitBastelei #5: Stromverbrauch am PC darstellen]]
* [[http://www.hobbyelektronik.org/w/index.php/Energieerfassung|Energieerfassung]]
* [[http://www.chasingtrons.com/main/2011/3/24/energy-meter.html|Chasing 'trons]]
* [[http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2008/cj72_xg37/cj72_xg37/index.html|PowerBox]]
* [[http://arduino.cc/playground/Main/Ehz2s0|Energy consumption monitor]]
* [[http://sourceforge.net/p/ehzy/wiki/Home/|eHZy - Arduino-based readout collection]] var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/volkszaehler.txt 0000775 0000041 0000041 00000004743 12103462273 030155 0 ustar www-data www-data ===== Was ist der Volkszaehler? =====
volkszaehler.org ist ein freier intelligenter Stromzähler im Selbstbau, bei dem die anfallenden Stromprofile unter der Kontrolle des Nutzers verbleiben. Die Daten des Volkszaehlers sind nicht duch den Versorger auslesbar. Mit einem Materialeinsatz von ca. EUR 100, etwas Geschick und Zeit lässt sich ein solcher Volkszaehler auf Basis eines Standard-µC-Moduls aufbauen.
Der Volkszaehler kann nicht als fertiges Gerät gekauft werden. Es ist ein Selfmade-Projekt. Der Volkszaehler besteht nicht aus einem einzigen Element sondern aus insgesammt 4 Modulen (Messung, Verarbeitung, Speicherung & Auswertung). Das Modul zur Messung muss in der Regel von einem Elektriker im Schaltschrank der Hausinstallation eingebaut werden. Es gibt auch Varianten die keinen Eingriff in die Hausinstallation benötigen. Alle anderen Module lassen sich von interessierten Tüftlern selber nachbauen.
Die einzelnen Module und deren Zusammenspiel wird unter [[overview]] genauer erklärt.
===== Warum brauche ich einen Volkszaehler? =====
Wer seinen Energiebedarf analysieren möchte, braucht dazu genaue Messwerte. Bei heutigen Hausinstallationen mit konventionellen Drehstromzählern sind für den Stromverbrauch diese Messwerte nicht vorhanden. Es wird also ein intelligenter Zähler benötigt, der in der Lage ist den Energiebedarf über sehr kurze Zeiträume zu messen und zu speichern.
Diese Geräte werden heute schon von vielen Versorgern angeboten. Die einfachen Lösungen ermöglichen die Anzeige der aktuellen Leistung, der Verbrauchswerte des aktuellen Tages, der aktuellen Woche, des aktuellen Monats und der jeweils vorhergehenden Zeiträume. Bei den meisten Lösungen, bei denen darüber hinaus eine komfortable Auswertung möglich ist, werden die Verbrauchsdaten jedoch zum Versorger übertragen. Der Nutzer kann dann i.d.R. über eine Weboberfäche eine komfortable Analyse vornehmen.
Wie schon weiter oben geschildert besteht nun die Möglichkeit für den Versorger auf Grundlage der Daten Nutzerprofile anzulegen und diese auszuwerten.
So Lustig diese Gedankenspiele auch sind - mit einem intelligenten Zähler eines Versorgers gibt man seine Daten aus der Hand und weiß nicht was mit diesen Daten gemacht wird.
Wer dies nicht möchte, hat mit dem Volkszaehler die Möglichkeit sich einen intelligenten Zähler selbst zu bauen und die Verbrauchsdaten selbst auszuwerten. Die Daten bleiben beim Kunden und der Versorger hat keinen Zugriff auf diese Daten.
weiterlesen: [[overview]]
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto.txt 0000775 0000041 0000041 00000000216 12115621376 026577 0 ustar www-data www-data ====== HowTo ======
Hier gibt es Anleitungen und Erfahrungsberichte von Usern zum Einrichten des Volkszaehlers.
{{indexmenu>/howto|tsort}}
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/getstarted.txt 0000775 0000041 0000041 00000011344 12371417423 030751 0 ustar www-data www-data ====== Eigenen Volkszaehler Installieren ======
Auf dieser Seite wollen wir euch eine Schritt-für-Schritt Anleitung für die eigene Installation liefern.
volkszaehler ist keine Fertiglösung "von der Stange" (und kann und will das auch nicht sein)!\\
Etwas Bereitschaft zum Basteln ist Voraussetzung!\\
Kenntnisse im Umgang mit Linux, und ggf. auch Programmierung und Elektronik sind (gerade im aktuellen Stadium des Projekts) vorteilhaft.
Um einen eigenen Volkszaehler zu installieren,
musst du herausfinden, wie die einzelnen Bestandteile bei Deinem Volkszaehler umgesetzt werden sollen:
* [[#messen|Messen]]: was soll gemessen/erfasst werden, und womit
* [[#speichern]]: wo sollen die daten gespeichert werden
* [[#uebertragen]]: wie kommen die daten vom messgeraet zur speicherung
* [[#auswerten]]: (grafische, und anderweitige) auswertung der gesammelten daten
siehe auch: [[/overview]]
unter [[/howto]] finden sich Beispielkonfigurationen einiger Nutzer
===== Messen =====
Um den Verbrauch von Strom, Gas, Wasser oder Umgebungsdaten wie Temperatur, Luftfeuchte oder Füllstand zu erfassen, muss ein [[hardware/channels/meters|geeignetes Messgerät]] vorhanden sein.
Im Idealfall ist schon ein vom Netzbetreiber installierter [[//hardware/channels/meters/power/edl-ehz|Stromzähler mit Datenschnittstelle]] vorhanden, der zum Beispiel mit einem [[hardware/controllers/ir-schreib-lesekopf]] ausgelesen werden kann.
Viele [[hardware/channels/meters/gas|Gaszähler]] sind fuer die Nachruestung eines Digitalen Ausgangs vorbereitet.
Alternativ können zusätzliche Zähler, zB [[hardware/channels/meters/power/liste_s0_zaehlermodelle|mit Impulsausgang]] installiert werden oder die vorhandenen [[hardware/channels/meters/power/ferraris-zaehler|Ferraris-Zähler]] erfasst werden.
Die Messdaten liegen dann entweder in standardisierten Protokollen vor (z. B. [[software/sml]]) oder werden als Folge von Impulsen verarbeitet ([[misc/S0_schnittstelle]]).
Möchtest du z. B. den Stromverbrauch deines Hausanschlusses messen und sind dazu Änderungen in Deinem Zähler-, Verteiler- oder Sicherungskasten erforderlich, solltest du die Installation unbedingt einem Fachmann überlassen!
Ihr müsst also herausfinden, was Ihr messen wollt und dafür das richtige Messgerät auswählen und beschaffen.
weiterführende Dokumentation unter: [[hardware/channels]]
===== Speichern =====
Zentraler Bestandteil des Volkszaehlers ist die [[software/middleware]], dort werden die daten gespeichert und ausgewertet.
Fuer Deinen eigenen Volkszaehler, musst du entscheiden, wo diese laufen soll,
es gibt folgende Moeglichkeiten:
* unseren [[http://demo.volkszaehler.org/|Demo-Server]], fuer erste versuche
* einen eigenen server bei dir zuhause, entweder ein ohnehin schon vorhandener, oder ein neu dafuer aufgesteller (Dies kann (bzw. sollte!) dann ein kompaktes stromsparendes system sein, zB ein [[http://raspberrypi.org|Raspberry Pi]], IOmega iConnect, Seagate Dockstar, SheevaPlug, ...) (Beispiele unter [[/howto]])
* eine Installation auf einem gehosteten server im Internet: [[/howto/installation_auf_webhoster|howto]]
=== Installation ===
[[software/middleware/installation]]\\
[[/software/middleware/einrichtung]]
in der [[/howto|howto-sektion]] findest du anleitungen zur installation auf verschiedenen systemen
===== Übertragen =====
Die durch die Messgeräte erfassten Werte muessen mit geeigneter Hard- und Software ausgelesen, und zur [[#speichern|Speicherung]] weiter uebertragen werden.
In einfachen Faellen reicht hier eine Software auf dem gleichen Computer, auf dem dann auch die Middleware (siehe [[#speichern]]) laeuft.\\
(wenn dieser in der Naehe des Zaehlers aufgestellt ist.)
* [[/software/controller/vzlogger]]
* weitere unter [[/software/controller]]
Wenn die Speicherung nicht in unmittelbarer naehe zum Zaehler stattfindet, bietet es sich an, eine [[hardware/controllers|Microcontroller-basierte Hardware]] einzusetzen, die mit geringem Energiebedarf die Daten vom Messgerät annimmt und per LAN, WLan (und/oder Internet) weiter überträgt.
* das [[hardware:controllers:avr_net-io|AVR NET-IO Board von Pollin]]
* der [[hardware:controllers:yport|YPORT+]]
* weitere unter [[hardware/controllers]]
(Auf microcontroller-basierten Controllern wird die [[software:controller:ethersex]] oder [[https://openwrt.org/|OpenWrt]] Firmware eingesetzt)
===== Auswerten =====
Letztlich sollen die gemessenen Daten in einer für uns angenehmen Weise aufbereitet angezeigt werden. Dazu wird ein Frontend verwendet.
Der Volkszähler hat ein [[/software/frontends/frontend|Standard-Frontend]], das die Messdaten in einem hübschen Graphen anzeigen kann und erlaubt, Zeitraum und Auflösung der Darstellung frei zu wählen.
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/emh_pv-anlage.txt 0000775 0000041 0000041 00000054333 12470057477 031324 0 ustar www-data www-data ====== Volkszaehler auf einem PC mit Ubuntu installieren (PV-Anlage mit zwei EMH eHZ-Zählern) ======
Beispiel um eine PV-Anlage mit zwei EMH eHZ-Zählern auszulesen.
Die hier beschriebene PV-Anlage wurde 2011 mit Volleinspeisung errichtet und im Dezember 2012 auf Direktverbrauch umgestellt. Sie hat eine Leistung von 7,62 kWp, besteht aus 32 Sunpower SPR-238 Solarmodulen und einem Sunpower SPR-8001-F2 (baugleich Fronius IG Plus 100-V2) Wechselrichter.
Vor der Umstellung auf Direktverbrauch wurden der Bezug durch einen mechanischen [[http://de.wikipedia.org/wiki/Ferraris-Z%C3%A4hler|Ferraris-Drehstromzähler]] und die Lieferung durch einen [[hardware:channels:meters:power:edl-ehz:emh-ehz-h1|EMH eHZ]] gemessen.
Nach der Umstellung wurde der Ferraris-Drehstromzähler vom VNB (Verteilungs-Netz-Betreiber) gegen einen Zweirichtungszähler [[hardware:channels:meters:power:edl-ehz:edl21-ehz|EDL21 eHZ]] für Bezug und Einspeisung ausgetauscht. Der EMH eHZ verblieb als Erzeugungszähler. Der Zweirichtungszähler zeigt im Wechsel für jeweils 15 Sekunden den Wert für Bezug +A und Lieferung -A an.
{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:modulfeld.jpg?100x75|Generatorfeld}}{{:hardware:channels:meters:power:edl-ehz:wechselrichter.jpg?100x75|Wechselrichter}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:zaehlerschrank.jpg?100|Zählerschrank}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:zweirichtungszaehler1.jpg?100|Zweirichtungszähler Anzeige Bezug}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:zweirichtungszaehler2.jpg?100|Zweirichtungszähler Anzeige Lieferung}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:erzeugungszaehler.jpg?100x75|Erzeugungszähler}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:anlagenschema.jpg?100x75|Anlagenschema}}
====== Aufbau des Loggers ======
Das Loggen der Daten erfolgt auf einem Laptop Dell Latitude D800 (Pentium M). Auf dem Laptop wurde [[http://www.ubuntu.com/|Ubuntu 12.10]] mit [[http://www.mysql.de/|MySql]], [[http://php.net/|PHP]] und [[http://www.lighttpd.net/|Lighttpd]] installiert. Statt Lightpd kann man auch [[http://httpd.apache.org/|Apache]] nehmen. Ich habe Lighttpd gewählt, weil das Loggen später einmal meine [[http://dns323.kood.org|D-Link DNS-323 NAS]] übernehmen soll. Für die gibt es die Möglichkeit ein Linux auf ihr zu installieren und in dem zur Zeit installierten [[http://wolf-u.li/1426/fun_plug-05-auf-dem-conceptronic-ch3snas-bzw-d-link-dns-323-installieren/|fun_plug 0.5]] ist als Webserver eben der Lighttpd enthalten. Da wollte ich schon mal Erfahrungen sammeln.
Die beiden Zähler werden mit je einem [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang|USB-IR-Lesekopf]] am Laptop angeschlossen.
{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:zweirichtungszaehler_mit_lesekopf.jpg?100|Zweirichtungszähler mit Lesekopf}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:erzeugungszaehler_mit_lesekopf.jpg?100|Erzeugungszähler mit Lesekopf}} {{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:laptop.jpg?100|Laptop}}
====== Installation der Volkszähler Software ======
Installation wie im [[software:middleware/installation#software|Installationsleitfaden]] beschrieben.
====== Installation von libsml und vzlogger ======
Dieser Teil ist obsolete. Die Installation bitte nach diesen Anleitungen vornehmen:\\
[[software:controller:vzlogger:installation_cpp-version|vzlogger]]
und [[software:middleware:installation|middleware]]\\
Oder gleich das fertige Image für die Raspi-Varianten (nicht Raspi 2) nehmen: [[https://demo.volkszaehler.org/downloads/volkszaehler_image.rar|Image-Quelle]]
Beide Zähler senden ihre Daten SML kodiert. Daher benötigt man die libsml1 [[http://packages.volkszaehler.org/vz/]] und vzlogger [[http://packages.mysmartgrid.de/]].
Beide Quellen zusammengefasst ergibt dann:
# apt-key adv --keyserver pool.sks-keyservers.net --recv-keys B1A0345B
# echo "deb http://packages.volkszaehler.org/vz/ wheezy main" >> /etc/apt/sources.list
# echo "deb http://packages.mysmartgrid.de/ubuntu/precise precise mysmartgrid" >> /etc/apt/sources.list
# echo "deb-src http://packages.mysmartgrid.de/ubuntu/precise precise mysmartgrid" >> /etc/apt/sources.list
# apt-get update
# apt-get install libsml1 vzlogger php5-curl
====== USB-IR-Leseköpfe konfigurieren ======
Eigentlich ist an den USB-IR-Leseköpfen nichts zu konfigurieren. Wie in [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang#linux-support|USB-IRLesekopf Linux Support]] beschrieben, kann es passieren, dass die Leseköpfe nicht immer den gleichen Devicenamen bekommen. Aber das udev System bietet da Abhilfe an. Wir sagen dem udev System, dass es anhand der Seriennummer des Lesekopfes immer einen sym. Link zum richtigen Device anlegen soll. Wir benutzen dann in der Konfiguration immer die sym. Links.
Dazu muss man die Seriennummer ermitteln.
# udevadm info --query=all --name=/dev/ttyUSB0
Ergibt dann folgende etwas gekürzte Ausgabe.
P: /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
S: serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_0061E011-if00-port0
...
E: ID_SERIAL_SHORT=0061E011
...
E: SUBSYSTEM=tty
...
Davon interessiert uns **ID_SERIAL_SHORT=0061E011**. Das ist die Seriennummer des Lesekopfes. Das wiederholt man für den zweiten Lesekopf, der unter "/dev/ttyUSB1" zu finden sein wird.
Man erstellt jetzt eine Datei “/etc/udev/rules.d/99-usb-ir-lesekopf.rules“ mit folgendem Inhalt.
SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0061E011", SYMLINK+="usb-ir-lesekopf0"
SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0061DF28", SYMLINK+="usb-ir-lesekopf1"
Natürlich statt **"0061E011"** und **"0061DF28"** die eigenen Seriennummern verwenden.
Ein anschließendes
# udevadm trigger
bringt das udev System dazu die neue Regel anzuwenden und die beiden sym. Links anzulegen. Die beiden Leseköpfe sind ab sofort immer unter "/dev/usb-ir-lesekopf0" und "/dev/usb-ir-lesekopf1" ansprechbar.
# ls -la /dev/usb*
lrwxrwxrwx 1 root root 7 Jan 13 22:19 /dev/usb-ir-lesekopf0 -> ttyUSB0
lrwxrwxrwx 1 root root 7 Jan 13 22:19 /dev/usb-ir-lesekopf1 -> ttyUSB1
Anschliessend kann man dann gleich mal testen, ob die neuen Device sym. Links auch funktioieren. [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang#testmoeglichkeiten_unter_linux|Testmoeglichkeiten unter Linux]]
====== Kanäle in der Middleware erstellen ======
Nun erstellen wir die [[development:definitions#channel|Kanäle]] in der [[development:definitions#middleware|Middleware]]. Dazu mit einem Browser http://localhost/frontend/ aufrufen.
Wir brauchen insgesamt sieben Stück. Vier vom Typ Stromsensor und drei vom Typ Stromzähler. Bei allen Kanälen: Style "steps" einstellen, sowie öffentlich, aktiv und Cookie aktivieren. Bei den Kanälen 1, 3 und 5 kann man unter Kosten noch die Vergütung bzw. den Strompreis angeben. Wird z.B. der Direktverbrauch mit 0,1236 €/kWh vergütet, trägt man 0.0001236 unter Kosten ein. Bekommt man 0,2874 €/kWh für Einspeisung, dann 0.0002874 bei Kanal 5 eintragen und kostet die kWh vom Energieversorger 0,2575 €, dann 0.0002575 bei Kanal 3 eingeben.
* Kanal 1: Direktverbrauch, Typ Stromsensor
* Kanal 2: Gesamtverbrauch, Typ Stromsensor
* Kanal 3: Haus 1.8.0 (Bezug +A), Typ Stromzähler, Auflösung 1000
* Kanal 4: Haus 16.7.0 (Leistung), Typ Stromsensor
* Kanal 5: Haus 2.8.0 (Lieferung -A), Typ Stromzähler, Auflösung 1000
* Kanal 6: PV 2.7.0 (Leistung), Typ Stomsensor
* Kanal 7: PV 2.8.1 (Erzeugung -A), Typ Stromzähler, Auflösung 1000
{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:kanal-stromsensor.jpg?100x75|Kanal-Stromsensor}}{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:kanal-stromzaehler.jpg?100x75|Kanal-Stromzähler}}
Beim Erstellen der Kanäle werden automatisch auch die [[http://de.wikipedia.org/wiki/Universally_Unique_Identifier|UUID]]s der Kanäle in der MySQL Datenbank angelegt. Diese UUIDs brauchen wir später noch. Es aber nicht nötig die jetzt zu notieren, da wir da jederzeit leicht ran kommen. Neben den erstellten Kanälen finden wir dieses Zeichen {{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:information.png?15|}}, mit dem wir die UUID später abrufen können.
Die Namen der Kanäle können selbstverständlich frei gewählt werden. Ich habe mich jedoch an den [[http://de.wikipedia.org/wiki/OBIS-Kennzahlen|OBIS-Kennzahlen]], die meine Zähler ausgeben orientiert. Wie man die ermittelt, dazu komme ich noch.
====== vzlogger konfigurieren ======
Kommen wir nun zum vzlogger. vzlogger ist der Teil, der die Zähler ausliest und die Daten per Middleware in die MySQL Datenbank speichert. Um eine passende vzlogger.conf zu erstellen, wollen wir jetzt erstmal wissen, was unsere Zähler den so von sich geben. Dazu erstellen wir uns nun eine minimale /etc/vzlogger.test die nur das Notwendigste enthält.
/**
* vzlogger configuration
*
* use proper encoded JSON with javascript comments
*
* take a look at the wiki for detailed information:
* http://wiki.volkszaehler.org/software/controller/vzlogger#configuration
*/
{
"retry" : 30, /* how long to sleep between failed requests, in seconds */
"daemon": false, /* run periodically */
"verbosity" : 15, /* between 0 and 15 */
"log" : "/var/log/vzlogger.log",/* path to logfile, optional */
"local" : {
"enabled" : false, /* should we start the local HTTPd for serving live readings? */
"port" : 80, /* the TCP port for the local HTTPd */
"index" : true, /* should we provide a index listing of available channels? */
"timeout" : 30, /* timeout for long polling comet requests, 0 disables comet, in seconds */
"buffer" : 600 /* how long to buffer readings for the local interface, in seconds */
},
"meters" : [{
"enabled" : true, /* disabled meters will be ignored */
"protocol" : "sml", /* use 'vzlogger -h' for list of available protocols */
"device" : "/dev/usb-ir-lesekopf0",
},{
"enabled" : true, /* disabled meters will be ignored */
"protocol" : "sml", /* use 'vzlogger -h' for list of available protocols */
"device" : "/dev/usb-ir-lesekopf1",
}
]}
Wenn wir jetzt
# vzlogger -c /etc/vzlogger.test
aufrufen, dann sollte eine Ausgabe in folgender Art auf dem Bildschirm erscheinen.
[Jan 15 22:30:39][] ===> Start meters.
[Jan 15 22:30:39][mtr0] Meter connection established
[Jan 15 22:30:39][mtr0] Meter thread started
[Jan 15 22:30:39][mtr0] meter is opened. Start channels.
[Jan 15 22:30:39][mtr0] Number of readers: 32
[Jan 15 22:30:39][mtr0] Config.daemon: 0
[Jan 15 22:30:39][mtr0] Config.local: 0
[Jan 15 22:30:39][mtr1] Meter connection established
[Jan 15 22:30:39][mtr1] Meter thread started
[Jan 15 22:30:39][mtr1] meter is opened. Start channels.
[Jan 15 22:30:39][] Startup done.
[Jan 15 22:30:39][mtr1] Number of readers: 32
[Jan 15 22:30:39][mtr1] Config.daemon: 0
[Jan 15 22:30:39][mtr1] Config.local: 0
[Jan 15 22:30:42][mtr0] Got 11 new readings from meter:
[Jan 15 22:30:42][mtr0] Reading: id=129-129:199.130.3*255/ObisItentifier:129-129:199.130.3*255 value=0.00 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:0.0.9*255/ObisItentifier:1-0:0.0.9*255 value=0.00 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:1.8.0*255/ObisItentifier:1-0:1.8.0*255 value=756082.40 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:2.8.0*255/ObisItentifier:1-0:2.8.0*255 value=26925.90 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:1.8.1*255/ObisItentifier:1-0:1.8.1*255 value=756082.40 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:2.8.1*255/ObisItentifier:1-0:2.8.1*255 value=26925.90 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:1.8.2*255/ObisItentifier:1-0:1.8.2*255 value=0.00 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:2.8.2*255/ObisItentifier:1-0:2.8.2*255 value=0.00 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=1-0:16.7.0*255/ObisItentifier:1-0:16.7.0*255 value=561.30 ts=1358285442.060
[Jan 15 22:30:42][mtr0] Reading: id=129-129:199.130.5*255/ObisItentifier:129-129:199.130.5*255 value=0.00 ts=2210964.000
[Jan 15 22:30:42][mtr0] Reading: id=0-0:0.0.0*0/ObisItentifier:0-0:0.0.0*0 value=0.00 ts=0.000
[Jan 15 22:30:42][mtr0] Updating interval to 3
[Jan 15 22:30:42][mtr1] Got 6 new readings from meter:
[Jan 15 22:30:42][mtr1] Reading: id=129-129:199.130.3*255/ObisItentifier:129-129:199.130.3*255 value=0.00 ts=1358285442.080
[Jan 15 22:30:42][mtr1] Reading: id=1-0:0.0.9*255/ObisItentifier:1-0:0.0.9*255 value=0.00 ts=1358285442.080
[Jan 15 22:30:42][mtr1] Reading: id=1-0:2.8.1*255/ObisItentifier:1-0:2.8.1*255 value=12018020.10 ts=1358285442.080
[Jan 15 22:30:42][mtr1] Reading: id=1-0:1.7.0*255/ObisItentifier:1-0:1.7.0*255 value=0.00 ts=1358285442.080
[Jan 15 22:30:42][mtr1] Reading: id=1-0:2.7.0*255/ObisItentifier:1-0:2.7.0*255 value=0.00 ts=1358285442.080
[Jan 15 22:30:42][mtr1] Reading: id=0-0:0.0.0*0/ObisItentifier:0-0:0.0.0*0 value=0.00 ts=0.000
[Jan 15 22:30:42][mtr1] Updating interval to 3
Nun sehen wir alle OBIS-Kennzahlen die unsere Zähler ausgeben. mtr0 ist der Zähler an /dev/usb-ir-lesekopf0 (im Beispiel der Zweirichtungszähler) und mtr1 der Zähler an /dev/usb-ir-lesekopf1 (Erzeugungszähler). Nun ist auch ersichtlich, warum ich die Kanäle so benannt habe, wie ich es tat.
Nun kann man die korrekte /etc/vzlogger.conf erstellen. Für die Beispielanlage brauchte ich
Vom Zweirichtungszähler
* 1.8.0 = Wirkarbeit Bezug +A
* 2.8.0 = Wirkarbeit Lieferung -A
* 16.7.0 = Wirkleistung
Vom Erzeugungszähler
* 2.7.0 = Wirkleistung
* 2.8.1 = Wirkarbeit Lieferung -A
Nun, das sind fünf Kanäle, die aus den Zählern in der Datenbank landen, warum aber wurden sieben Kanäle angelegt? Dazu kommen wir später. Geduld!
Die restlichen OBIS-Kennzahlen, die die Zähler ausgeben werden nicht benötigt
* 1.8.1 = Wirkarbeit Bezug Tarif 1 (da nur Tarif 1, ist 1.8.0 = 1.8.1)
* 1.8.2 = Wirkarbeit Bezug Tarif 2 (nicht vorhanden)
* 2.8.1 = Wirkarbeit Lieferung Tarif 1 (da nur in Tarif 1, ist auch hier 2.8.0 = 2.8.1)
* 2.8.2 = Wirkarbeit Lieferung Tarif 2 (nicht vorhanden)
* 1.7.0 = Wirkleistung Bezug ?
Jetzt ist auch der Moment, wo wir die im Abschnitt [[hardware:channels:meters:power:edl-ehz:emh_pv-anlage#kanaele_in_der_middleware_erstellen|"Kanäle in der Middleware erstellen"]] erstellten UUIDs benötigen. Die UUIDs wie oben beschrieben auslesen und an die korrekte Stelle einfügen.
{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:uuid-ermitteln.jpg?100|UUID ermitteln}}
/**
* vzlogger configuration
*
* use proper encoded JSON with javascript comments
*
* take a look at the wiki for detailed information:
* http://wiki.volkszaehler.org/software/controller/vzlogger#configuration
*/
{
"retry" : 30, /* how long to sleep between failed requests, in seconds */
"daemon": false, /* run periodically */
"verbosity" : 15, /* between 0 and 15 */
"log" : "/var/log/vzlogger.log", /* path to logfile, optional */
"local" : {
"enabled" : false, /* should we start the local HTTPd for serving live readings? */
"port" : 80, /* the TCP port for the local HTTPd */
"index" : true, /* should we provide a index listing of available channels if no UUID was requested? */
"timeout" : 30, /* timeout for long polling comet requests, 0 disables comet, in seconds */
"buffer" : 600 /* how long to buffer readings for the local interface, in seconds */
},
"meters" : [{
"enabled" : true, /* disabled meters will be ignored */
"protocol" : "sml", /* see 'vzlogger -h' for list of available prot$ */
"device" : "/dev/usb-ir-lesekopf0",
"channels": [{
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:16.7.0", /* Leistung */
}, {
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:1.8.0", /* Wirkarbeit Bezug +A */
}, {
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:2.8.0", /* Wirkarbeit Lieferung -A */
}]
}, {
"enabled" : true,
"protocol" : "sml",
"device" : "/dev/usb-ir-lesekopf1",
"channels" :[{
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:2.7.0", /* Leistung Erzeugung */
}, {
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:2.8.1", /* Wirkarbeit Erzeugung -A */
}]
}
]}
Speichern als "/etc/vzlogger.conf".Testen dann mit
# vzlogger
Nach erfolgreichem Test noch "daemon": false, in "daemon": true, und "verbosity" : 15, in "verbosity" : 1, ändern. Nach der Änderung kann man vzlogger dann als Daemon starten.
# service vzlogger start
Mein vzlogger hat da immer gemeckert
# service vzlogger start
#/etc/init.d/vzlogger: 15: /etc/init.d/vzlogger: server: not found
Einfach in /etc/init.d/vzlogger
DESC=smartmeter server for volkzaehler.org
in
DESC="smartmeter server for volkzaehler.org"
ändern.
====== Script für Gesamt- und Direktverbrauch ======
Nun ist neben dem Bezug und der Lieferung auch der Gesamt- und Direktverbrauch von Interesse. Diese Werte können jedoch nicht aus den Zählern ausgelesen werde. Sie können nur durch Berechnung ermittelt werden.
* Gesamtverbrauch = Bezug + Erzeugung - Lieferung
* Direktverbrauch = Erzeugung - Lieferung
Da alle für die Berechnung notwendigen Werte vorliegen erstellt man ein Script (gefunden im [[http://www.photovoltaikforum.com/volkszaehler-org-raspberrypi-loggen-t85872.html|Photovoltaikforum]] und etwas erweitert) und lässt es kontinuierlich durch [[http://de.wikipedia.org/wiki/Cron|Cron]] ausführen.
Folgendes Script z.B. als /var/www/volkszaehler.org/htdocs/direktverbrauch.php speichern und die richtigen UUIDs eintragen. //(Script geändert, es werden nun keine Nullen mehr bei Null Direktverbrauch in die Datenbank geschrieben)//
'a2fc7c10-5c06-11e2-a9fd-07ec3529dbce',
'Lieferung' => '295f8cd0-5c07-11e2-833b-39e13950d0c2',
'Erzeugung' => '83cd0400-5c1a-11e2-a8b1-41ba0e4e3b55',
);
$uuIdTarget=array('Gesamtverbrauch' => '72c08b30-5da7-11e2-ae92-c3c944e97303',
'Direktverbrauch' => '75bc5f20-5dab-11e2-97e3-035e5f4fa046'
);
$urlEnd='.json?from=30%20seconds%20ago';
function curl_file_get_contents($URL)
{
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c);
curl_close($c);
if ($contents) return $contents;
else return FALSE;
} // function curl_get_file_contents
function getTimestamp() {
$seconds = microtime(true); // false = int, true = float
return round( ($seconds * 1000) );
}
for ($i=1; $i<5 ; $i++) {
$minTimestamp = getTimestamp();
$maxTimestamp = $minTimestamp;
foreach($uuIds as $index=>$value) {
$url=$urlBase . $value . $urlEnd;
$content = curl_file_get_contents($url);
$content=json_decode($content);
if (!empty($content->data->tuples)) {
$lastTuple = end($content->data->tuples);
$minTimestamp = min($minTimestamp,$lastTuple[0]);
$maxTimestamp = max($maxTimestamp,$lastTuple[0]);
print_r($lastTuple);
$lastValue = $lastTuple[1];
} else {
$lastValue=0;
} // if
echo "$value / $index: $lastValue\n
";
$values[$index]=$lastValue;
} // foreach
$diffGV= $values['Bezug'] + $values['Erzeugung'] - $values['Lieferung'];
echo "Gesamtverbrauch = Bezug + Erzeugung - Lieferung: $diffGV \n
";
$timestamp = round($minTimestamp + ( ($maxTimestamp - $minTimestamp) / 2 ));
$linkGV=$urlBase . $uuIdTarget['Gesamtverbrauch'] . '.json?operation=add&value=' . $diffGV . '&ts=' . $timestamp;
$dummy=curl_file_get_contents($linkGV);
echo "$linkGV \n
";
$diffDV= $values['Erzeugung'] - $values['Lieferung'];
echo "Direktverbrauch = Erzeugung - Lieferung : $diffDV \n
";
if ($diffDV>0) {
$linkDV=$urlBase . $uuIdTarget['Direktverbrauch'] . '.json?operation=add&value=' . $diffDV . '&ts=' . $timestamp;
$dummy=curl_file_get_contents($linkDV);
echo "$linkDV \n
";
}
sleep(15);
} // for
?>
Zum testen mit
# php /var/www/volkszaehler.org/htdocs/direktverbrauch.php
aufrufen. Die Ausgabe sollte dann so aussehen. Jeweils 4 mal mit 15 s Pause.
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Bezug: 653.358
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Lieferung: 0
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Erzeugung: 0
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Gesamtverbrauch: 0
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Direktverbrauch: 0
Gesamtverbrauch = Bezug + Erzeugung - Lieferung: 653.358
Direktverbrauch = Erzeugung - Lieferung: 0
Fehlt nur noch der Crontab Eintrag. Unbedingt als letzte Zeile eine Leerzeile machen. Sonst funktioniert Cron nicht.
# crontab -e
MAILTO=""
* * * * * /usr/bin/php /var/www/volkszaehler.org/htdocs/direktverbrauch.php > /dev/null
# Hinter diesem Text noch eine Leerzeile einfuegen, sonst funktioniert cron nicht!
====== Ergebnis der Bemühungen ======
Wurde alles korrekt eingerichtet, dann sollte sich unter http://localhost/frontend/ folgendes Bild bieten. Man beachte die enorme Erzeugung und den ebenso enormen Direktverbrauch. :-) Das Modulfeld war an dem Tag zugeschneit. :-(
{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:ansicht.jpg?600|Ansicht}}
Danke für die Aufmerksamkeit.
Hier noch ein kleines Tuning an der Darstellung. [[http://www.cd-k.de/2013/01/pimp-my-volkszahler-diagramm-gefullte-flachen-anzeigen/|Gefüllte Flächen im Diagramm]]
{{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:ansicht-gefuellt.jpg?600|Ansicht gefüllte Flächen}} var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/datenmengen.txt 0000644 0000041 0000041 00000016555 12415455337 031101 0 ustar www-data www-data ==== Umgang mit den Datenmengen ====
Im Laufe der Zeit sammeln sich im Volkszähler die Daten an. Diese Seite soll Verfahren zeigen, wie man mit den Mengen umgehen kann.
=== Problem ===
Ein D0/SML-Zähler kann je nach Last mehrmals pro Sekunde die aktuelle Leistung ausgeben. Ein S0-Eingang kann mehrere Impulse pro Sekunde erzeugen. Diese Daten werden alle in der Datenbank gespeichert und benötigen Platz.
Jeder weitere Kanal benötigt zusätzlich Platz, da er seine eigenen Daten mitbringt.
Es gibt die Möglichleit, die Anzeige im Frontend durch Aggregation von Daten zu Beschleunigen. Dabei werden Daten errechnet, die weiterhin Platz benötigen.
Zusätzlich wird eine Datenbank umso langsamer je mehr Datensätze sie beinhaltet. Dieser Effekt tut vor allem dann "weh", wenn auch die Hardware weniger leistungsfähig ist- wie z.B. die des beliebten Raspberry Pi.
Erfahrungen zeigen, dass so innerhalb von 2 Jahren ca 180 Mio Datensätze gesammelt werden können die ca 19GB Platz benötigen.
=== Lösungen ===
== Daten externalisieren ==
* Frontend und Datenbank auf einem leistungsfähigen Rechner installieren
* Nur Datenbank auf einem leistungsfähigen Rechner installieren
== Daten löschen: hart ==
Wen die Vergangenheit nicht interessiert, der kann die Daten dafür löschen.
Ein harter Ansatz wäre einfach alles älter als ein gewisser Zeitraum zu löschen. Mit SQL könnte dies z.B. so aussehen:
delete FROM `data` where timestamp< (unix_timestamp(current_timestamp)-24*60*60)*1000 ;
Das Beispiel löscht alle Daten die vor den letzten 24h liegen. Läßt man das Script einmal am Tag laufen so hat man lediglich die Daten der letzten Stunden.
== Daten löschen: weich ==
Bei diesem Ansatz werden auch die Daten gelöscht. Die Daten werden immer mehr ausgedünnt je weiter man in die Vergangenheit geht. So behält man z.B. alle Daten von heute, behält von den letzten 2 Wochen nur eine Messung pro Minute und von der Zeit davor nur eine pro Viertelstunde.
Dazu steht das Script [[https://github.com/volkszaehler/volkszaehler.org/blob/master/misc/tools/vzcompress2.php|vzcompress2.php]] zur Verfügung. Dieses kann folgendermaßen per crontab aufgerufen werden:
0 3 * * * cd /var/www/volkszaehler.org/misc/tools ; php vzcompress2.php >> /var/log/vzcompress.log
Die Anzahl der Daten die gelöscht werden soll, sowie die Zeiträume sind frei konfigurierbar am Ende des Scriptes.
== Performance des Frontends erhöhen: Datenaggregation / Cache ==
Bleiben die Daten in voller Auflösung erhalten, wird mit der Zeit das Frontend immer langsamer, da es aus den Daten die zur Anzeige benötigten suchen muss. Gerade bei grossen Zoomstufen (z.B. auf ein Jahr) kann es dann notwendig werden, dass die gesamte Datenbank eingelesen werden muss.
Abhilfe schafft hier die Daten ganzer Zeiträume, wie z.B. eines Tages, in einzelnen Datenpunkten zusammenzufassen (etwa Durchschnittstemperatur an diesem Tag). Dies erzeugt zwar mehr Daten in der Datenbank und benötigt somit mehr Platz auf der Festplatte. Allerdings kann auf die Daten effizienter zugegriffen werden, so dass sich unter dem Strich die Geschwindigkeit erhöht.
Die Lösung besteht aus zwei Komponenten. Die eine ist bereits im Frontend eingebaut und aktiviert sich automatisch, sobald sie passende Daten findet. Die andere besteht aus einer weiteren Tabelle mit Scripten die diese füllen.
Zunächst muss die Option in der volkszaehler.conf.php aktiviert werden:
$config['aggregation'] = true;
Die folgende Zeilen legen die zusätzliche Tabelle an und aggregieren alle bestehenden Daten. Der Vorgang kann daher einige Stunden benötigen:
php /var/www/volkszaehler.org/misc/tools/aggregate.php create
php /var/www/volkszaehler.org/misc/tools/aggregate.php run -m full -l day -l hour -l minute
Mit den folgenden Einträgen in einer crontab hält man den Cache aktuell. Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz:
* * * * * php /var/www/volkszaehler.org/misc/tools/aggregate.php run -m delta -l minute >/dev/null
1 * * * * php /var/www/volkszaehler.org/misc/tools/aggregate.php run -m delta -l hour >/dev/null
* 1 * * * php /var/www/volkszaehler.org/misc/tools/aggregate.php run -m delta -l day >/dev/null
== Geringere Auflösung durch selteneres Messen ==
Wer keine feine Auflösung der Messungen im Sekundenbereich braucht, kann die Anzahl der Messungen verringern. Dies reduziert die Datenmenge, macht den Verlauf jedoch ungenauer, da kurze Vorgänge eventuell nicht mehr erfasst werden. Die Kurven verändern sich dann in etwa so, als würde man im Frontend raus zoomen. Da die Daten auch nicht indirekt erfasst wurden, können sie auch nachträglich nicht wieder hergestellt werden.
Das Frontend interpoliert selbständig die Daten, passend zum jeweilgen Kanal.
Umsetzung:
* Falls eine Messung per Script vorgenommen wird wird das Script einfach seltener aufgerufen, z.B. nur noch einmal pro Minute anstatt einmal pro Sekunde, so ist die Auflösung und Datenmenge geringer.
* Der vzlogger bietet eine entsprechende Option, mehrere Messungen zu einer Messung zusammenzufassen. Der vzlogger misst dann zwar noch häufiger, bzw. nimmt die Daten häufiger an, errechnet jedoch innerhalb eines Zeitraums einen Meßwert und gibt diesen dann an die Middleware weiter. Dies entlastet sowohl die Middleware und somit den Rechner an sich und hält auch die Datenmenge kleiner. \\ Die Konfiguration wird mit den Parametern "aggtime", "aggfixedinterval" und "aggmode" vorgenommen, wie in der [[http://wiki.volkszaehler.org/software/controller/vzlogger|Anleitung]] als Beispiel gezeigt.
== Aufrüstung: Hardware ==
Es gibt mehrere Möglichkeiten durch Einsatz von mehr Hardware das System zu beschleunigen:
* Das System hat ein n-Tier-Architektur. Dies bedeutet, dass jede einzelne Komponente (Messung, Middleware, Datenbank) beliebig auf das Netzwerk oder ins Internet verlegt werden kann. Beispiele:
* Man könnte z.B. die Datenbank von einem Raspi auf ein NAS verlegen. Der Einsatz von Festplatten gegenüber einer SD-Karte beschleunigt das System schon erheblich.
* Wer in seinem Netz einen eigenen Server betreibt kann auch diesen nutzen. Die Datenmengen die anfallen sind für ein aktuelles System normalerweise kein Problem. Wer z.B. 32GB Hauptspeicher erübrigen kann hält einen Großteil der Daten im Hauptspeicher und hat so immer einen schnellen Zugriff.
* Denkbar ist auch Middleware und Datenbank auf ein Webhosting oder einen angemieteten Server zu verlegen, wie [[http://wiki.volkszaehler.org/howto/installation_auf_webhoster|hier]] beschrieben.
== Einsatz und Konfiguration der Software ==
Es gibt zahlreiche Möglichkeiten im Bereich der Konfiguration anzusetzen. Diese sind jedoch von den individuellen Gegebenheiten abhängig. Ein paar Anregungen:
* Einsatz einer Ramdisk an geschickter Stelle
* Einsatz von diskless Clients die von einem schnellen Server das Filesystem beziehen
* schlankere Webserver wie lighttpd oder ngnix sparen gegenüber apache Hauptspeicher und performen teilweise schneller
* passende Konfiguration des apache wie Anzahl der Clients kann Durchsatz erhöhen
* Einsatz von php-Caches wie [[http://de.wikipedia.org/wiki/Alternative_PHP_Cache|hier]] beschrieben.
* Konfiguration der Datenbank z.B. zur besseren Nutzung des Hauptspeichers
* Einsatz von speziellen Datenbankfeatures wie der [[http://dev.mysql.com/doc/refman/5.1/de/partitioning-overview.html|Partitionierung]] var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/xampp-windows.txt 0000775 0000041 0000041 00000007030 12262740535 031417 0 ustar www-data www-data ====== Volkszaehler in XAMPP unter Windows installieren ======
===== Installtation der Komponenten =====
=== I. XAMPP ===
Xampp nach Anleitung installieren (es geht auch die Version ohne Installer)
http://www.apachefriends.org/de/xampp-windows.html
=== II. volkszaehler.org Skripte ===
volkszaehler.org Skripte aus dem Git herunterladen (https://github.com/volkszaehler/volkszaehler.org) und den "volkszaehler"-Ordner aus dem Archiv in das Verzeichnis
xampp\htdocs\
kopieren.
=== III. Benötigte Module ===
Composer für Windows von getcomposer.org installieren (http://getcomposer.org/Composer-Setup.exe)
In das Volkszaehler Verzeichnis wechseln
cd xampp\htdocs\volkszaehler
Ahängigkeiten laden und installieren (v.a. Doctrine)
composer install
===== Konfiguration =====
=== Middleware ===
* Datei volkszaehler.conf.template.php kopieren und in volkszaehler.conf.php umbenennen. Sie befindet sich hier:
xampp\htdocs\volkszaehler\etc\
* Folgende Anpassungen vornehmen
$config['db']['host'] = 'localhost';
$config['db']['user'] = 'vz';
$config['db']['password'] = '';
$config['db']['dbname'] = 'volkszaehler';
=== Datenbank ===
== Anlegen ==
* Datenbank-User in phpmyAdmin anlegen:
Home -> "Rechte" -> "Neuen Benutzer hinzufügen"
Benutzername: vz
Host: localhost
Passwort:
keine globalen Rechte vergeben!
-> ok
* Datenbank in phpMyAdmin anlegen:
Home -> "Datenbank anlegen", Name: "volkszaehler" -> "Anlegen"
== Struktur erzeugen ==
* Das php-Verzeichnis (z.B. C:\xampp\php) in den Umgebungsvariablen dem Suchpfad hinzufügen
Systemeigenschaften -> Tab: Erweiter -> KLick auf "Umgebungsvariablen" -> Unter "Systemvariablen" Doppelklick auf "Path"
-> Unter "Wert der Variablen" am Ende den Pfad mit Semikolon getrennt einfügen (hier: ;C:\xampp\php)
[dieser Schritt kann nach dem erstellen der Struktur wieder rückgängig gemacht werden]
* Windows-Konsole öffnen (cmd)
In das volkszaehler-Verzeichnis in der xampp-Installation wechseln
cd xampp\htdocs\volkszeahler
* Struktur erstellen:
php misc/tools/doctrine.php orm:schema-tool:create --dump-sql > misc/sql/mysql.sql
* In der erzeugten mysql.sql die Zeile
ATTENTION: This operation should not be executed in an production enviroment.
entfernen.
== Import und Rechte vergeben ==
Im phpAdmin-Webinterface:
* Tabellen in phpMyAdmin anlegen:
Datenbank -> "volkszaehler" auswählen (ggf. phpmyadmin neu laden, falls die neue DB noch nicht angezeigt wird)
* Erzeugte Struktur importieren:
"Importieren" aus misc/sql/mysql.sql
* Demoinhalte importieren:
Tabelle "entities" auswählen (unbedingt zuerst diese importieren!)
"Importieren"; das Gleiche mit "properties" und "data"
* Rechte setzen:
Home -> Datenbank -> "mysql", Tabelle "tables_priv":
"Einfügen":
Host: "localhost"
Db: "volkszaehler"
User: "vz"
Table_name: "data" (anschließend das Gleiche mit "entities", "entities_in_aggregator", "properties", "tokens"
Table_priv: "select", "update" und "insert"
Oder:
Home -> Rechte -> Benutzer "vz" auswählen -> unter "Datenbankspezifische Rechte" volkszaehler auswählen
-> Unter "Daten" update, insert und select markieren
-> unter "Administration" GRAND markieren
Aufruf des Volkszahler-WebFontends über:
http://localhost/volkszaehler/htdocs
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/sheevaplug.txt 0000775 0000041 0000041 00000006557 12140144302 030743 0 ustar www-data www-data ====== Volkszaehler auf einem SheevaPlug installieren ======
{{:howto:20120310_091937.jpg?100 |}}Hier findet Ihr die Umsetzung der IBN an einem SheevaPlug.
Dieser dient in Kombination mit dem IR Kopf als vollwertiges System zur Speicherung / Datenaufbereitung / Darstellung der Zählerwerte aus 2x eHZ.
Dabei wird im Moment nur die Wirkleistung des jeweiligen Zählers erfasst und im Frontend ausgegeben.
Aber auch die Rohdaten der Zählerstände sind in der DB ersichtlich. Diese korrelieren nach Umrechnung der Werte.
Die Grundidee das Frontend dazu zu verwenden via Hüllkurve für die PV Analge einen Sollwert aufzusetzten, soll als nächstes versucht werden. Dabei soll der IST Wert aus dem eHZ in Verbindung mit dem IST Wert aus dem eHZ der PV Analage den Stromverbrauch des Haushaltes beeinflussen.
Dies könnte evtl. über schaltbare Steckdosen und oder Hutschienen Automaten erfolgen. Damit ergibt sich die Möglichkeit, die höchstmögliche Menge an erzeugten Strom selbst zu verwenden, wenn dieser direkt angefordert wird oder auch die Stromgewohnheit dahin zu verlagern.
Schaltschrank mit kompletter IS für Vernetzung / Telefon / SheevaPlug
{{:howto:20120310_091859.jpg?200|}}
====== SheevaPlug ======
*[[ SheevaPlug Version]]http://www.newit.co.uk/shop/proddetail.php?prod=SheevaPlug
{{:howto:sheevaplug2b_small.jpg?200|}}
* 4fach USB Hub mit externer Stromversorgung
* USB Stick 8Gb
----
====== Software ======
* Debian Squeeze (Kirckwood) Installationsanleitung auf USB Stick / SD Card hier:http://www.cyrius.com/debian/kirkwood/sheevaplug/install.html
* vzlogger
====== Durchführung ======
Nach der Installation des Grundsystems, zuerst die Sources.list anpassen.
Meine sieht wie folgt aus:
#deb http://volkszaehler.org/vz/ squeeze main
deb http://ftp.de.debian.org/debian/ squeeze main contrib non-free
Danach ein:
apt-get update
Nun bitte die Build Essentails nachladen:
apt-get install pkg-config libcurl3-dev libjson0-dev libmicrohttpd-dev build-essential
Dann gehts weiter mit den benötigten Paketen für die Middleware:
apt-get install uuid-dev uuid-runtime
apt-get install libsml-dev libsml1
Falls die Installation von libsml fehlschlägt, die Abhängigkeiten prüfen und ggf. händisch aus dem Netz laden und via dpkg installieren.
====== "vzlogger" installieren ======
Bitte die folgenden Schritte aus der Anleitung einhalten.
http://wiki.volkszaehler.org/software/controller/vzlogger#installation
Dann wird es entweder Version 0.2 oder wenn Ihr aus dem git holt die 0.3.3.
Welche ich Euch empfehle aber was beim kompilieren zu Problemen geführt hat.
Falls es dabei Probleme gibt, bitte alternativ folgendes durchführen:
dpkg -i libcurl4-gnutls-dev_7.21.0-2.1+squeeze1_armel.deb
====== Server "Voraussetzungen" schaffen ======
Das kann aus dem Installationsleitfaden übernommen werden.
apt-get install git-core libapache2-mod-php5 php5-cli php5-mysql php-apc mysql-server mysql-client
Danach bitte wiefolgt aus dem Installationsleitfaden weiter:
[[http://wiki.volkszaehler.org/howto/getstarted#install-skript_empfohlene_installationsmethode]]
----
Und hier ein paar Bilder über den momentanen Aufbauzustand des Systems:
{{:howto:20120310_091859.jpg?direct&200|}}{{:howto:20120310_091937.jpg?200 |}}{{:howto:20120310_091956.jpg?200 |}}
----
././@LongLink 0000000 0000000 0000000 00000000160 00000000000 011562 L ustar root root var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/performance-optimierung_des_raspberry_pi.txt var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/performance-optimierung_des_raspb0000644 0000041 0000041 00000021430 12224307623 034635 0 ustar www-data www-data ==== Performance-Optimierung des Raspberry Pi ====
Der Start eines unkonfigurierten Raspberry Pi VZ-Images ist in der Regel noch problemlos, weil nur wenig IO-Last auf dem System liegt.
Das ändert sich aber wenn der vzlogger konfiguriert wird, und dieser dann die Daten an "localhost" sendet, so dass die PHP Middleware und MySQL zusätzliche IO-Last generieren.
=== Messung ===
Mit dem Kommando
vmstat 5
kann man einige wichtige Parameter abfragen und erste Erkenntnisse zur aktuellen Systemauslastung zu erhalten. Zusätzliche Pakete müssen dazu
nicht installiert werden, erst für weitergehende Analysen muss man dann das "sysstat" Paket installieren. Wenn Sie das Kommando starten ignorieren Sie bitte (immer) die erste Zeile der ausgegebenen Messwerte, achten Sie
aber auf alle folgenden. Wenn "vzlogger" konfiguriert und gestartet ist und fortan Messwerte sendet -- und die Ausgabe dann so aussieht:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 1 0 276644 15200 101032 0 0 95 11 369 130 2 2 87 9
0 1 0 276264 15204 101036 0 0 1 158 414 267 22 4 0 74
0 2 0 276232 15208 101036 0 0 0 10 367 142 0 1 0 99
0 1 0 276108 15236 101036 0 0 0 18 400 181 9 4 0 87
2 1 0 276108 15244 101036 0 0 0 134 397 248 19 5 0 76
0 2 0 276140 15248 101036 0 0 0 18 400 184 9 1 0 90
0 1 0 276108 15256 101040 0 0 1 8 381 186 13 4 0 83
Die Spalten ganz rechts beachten:
* "wa" = "IOwait" - ist die Zeit, die die CPU auf Ein-/Ausgabegeräte wie z.B. die SD-Karte warten muss
* "id" = "Idle" ist der Prozentsatz, den das System noch zur (weiteren) Erledigung von Aufgaben übrig hat
* "us" und "sy" sind die Prozent, die das System Rechenzeit im "User" und "System" Mode aufbringt
Die Messung oben stammt vom meinem Raspberry Pi mit der SD-Karte als root-Filesystem - das ist der Standardfall
wenn man den Installations-Anweisungen [[raspberry_pi_image]] folgt.
Die Messwerte zeigen eindeutig, dass das System den Großteil seiner Gesamtkapazität mit der IO-Ansteuerung (der SD-Karte) verbringt.
Freie Kapazität ist gar nicht mehr vorhanden (Idle = 0). Nun gibt es ja diverse SD-Karten in verschiedenen Klassen und Geschwindigkeiten,
ich habe mir im Computerladen eine Auswahl zusammengestellt - allerdings ohne Erfolg, dieser IO-Bottleneck war immer vorhanden.
Erschwerend kommt noch dazu, dass nicht alle Karten / Typen zuverlässig im Raspberry Pi funktionieren - und einige Karten schon nach wenigen
Stunden Betrieb dauerhaft zerstört waren.
== weiterführende Info ==
* http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/
=== Boot via SD-Karte, root auf USB-Stick ===
Leider kann der Raspberry Pi nicht direkt vom USB Stick booten - das Boot-Device ist immer die SD-Karte. Allerdings kann man den Bootstring leicht abändern,
so dass man schnell auf den USB Stick schalten und von dort den restlichen Boot-Vorgang fortsetzen kann.
Gehen Sie so vor:
* Erzeugen Sie sich eine SD-Karte mit einem kompletten Image - wie in [[raspberry_pi_image]] beschrieben
* Machen Sie genau dasselbe mit einem USB-Stick >= 4GB
* Stecken Sie nun SD-Karte und USB-Stick und Starten Sie die Stromversorgung des Rapberry Pi
* Nun startet der Raspberry Pi komplett von SD-Karte
* Sie können einloggen und mit
dmesg | more
alle Startmeldungen ansehen und prüfen, ob der USB-Stick erkannt wurde (als Gerät /dev/sda ). Probeweise können Sie /dev/sda2 mounten - und unmounten.
Mit
sudo nano /boot/cmdline.txt
ändern Sie nun
root=/dev/mmcblk0p2
in
root=/dev/sda2
und dann einfach mit
init 6
das System neu starten - falls der USB-Stick eine LED hat können Sie schon am "flackern" sehen dass der boot-Vorgang nun über den USB Stick läuft.
Die Boot-Partition der SD-Karte bleibt auf /boot gemountet.
== weiterführende Info ==
* http://www.dingleberrypi.com/2013/05/install-and-run-raspbian-from-a-usb-flash-drive/
=== root-Partition auf USB-Stick erweitern ===
Leider läßt sich mit einem root-Filesystem auf dem USB Stick der ungenutzte Platz nicht einfach wie bisher mit "raspi-config" nutzbar machen.
raspi-config merkt leider, dass das root-FS nun keine SD Karte ist und verweigert die Arbeit (don't know what to do). Ist aber kein großes Problem:
Hier die Ersatzprozedur (Unglaublich, geht wirklich am laufenden System):
sudo fdisk /dev/sda
p ## (print)
## Startsektor von P#2 merken (sollte 122880 sein)
d ## (delete)
2 ## Partition Nummer 2
n ## (new)
p ## primary
2 ## Partition Nummer 2
Start:
Nach (hoffentlich) erfolgreichem reboot
sudo resize2fs /dev/sda2
Dateisystem-Strukturen werden nun auf die neue Partitionsgröße angepasst - geht online auf der lebenden root Partition - kein reboot nötig
Schließlich mit
df -k
überprüfen.
=== VZ Konfigurieren ===
Nun wie gehabt vzlogger entsprechend einrichten (ist natürlich abhängig vom Zählertyp und den Kanälen die man auswerten möchte). Dann starten
=== IO Last überprüfen ===
Mit dem Kommando
vmstat 5
wie oben die Gesamtlast des Systems betrachten.
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 290516 18260 88032 0 0 81 9 362 157 2 2 93 2
2 0 0 290144 18284 88036 0 0 0 15 376 239 20 3 63 15
0 0 0 290208 18340 88036 0 0 0 323 449 319 16 3 32 49
0 0 0 290176 18364 88036 0 0 0 21 368 207 13 3 68 16
2 1 0 290176 18380 88036 0 0 0 128 392 256 17 5 50 28
0 0 0 290060 18444 88040 0 0 0 208 452 331 18 4 34 45
0 0 0 290092 18460 88040 0 0 0 12 360 199 15 2 74 9
7 0 0 290052 18516 88040 0 0 0 325 455 341 16 4 34 46
0 0 0 289928 18540 88044 0 0 0 14 369 227 19 3 57 21
0 1 0 289928 18564 88048 0 0 0 135 368 207 15 2 59 24
2 0 0 289960 18620 88048 0 0 0 207 453 332 17 4 38 41
0 1 0 289804 18636 88048 0 0 0 25 381 231 18 4 67 12
0 0 0 289804 18700 88052 0 0 0 312 432 299 13 3 41 42
2 0 0 289804 18716 88052 0 0 0 12 374 235 16 4 58 22
0 1 0 284332 18744 93204 0 0 1032 21 550 380 21 7 43 29
1 1 0 284224 18804 93208 0 0 0 314 451 296 14 4 36 45
0 0 0 284256 18824 93208 0 0 0 13 367 220 14 2 62 22
In meinem Fall haben die Werte jetzt so ausgesehen - wie man sieht (Spalte "id" ) hat das System jetzt ausreichend Kapazität frei
und reagiert auch schnell und störungsfrei auf Anfragen des "frontends".
=== Empfehlungen ===
Idealerweise legt man sich _zwei_ SD-Karten a 4GB und einen USB-Stick zurecht. Alle drei werden erst einmal mit dem Standard VZ-Raspberry Image beschrieben (und getestet).
* Auf der ersten SD-Karte modifiziert man den Boot-String wie oben beschrieben
* die zweite SD-Karte hinterlegt man an einem sicheren Ort - sie kommt dann zum Einsatz, wenn das System nicht mehr startet. Dann zieht man die SD-Karte (die mit dem
modifizierten boot-String) heraus und steckt diese zweite - nicht modifizierte - ein, bootet und versucht den USB-Stick mit "fsck" zu reparieren bzw Daten zu retten.
So hat man für diesen Fall gleich ein recovery System zur Hand.
Als USB-Stick habe ich einen 32GB USB3.0 für wenig Geld eingesetzt. Natürlich hat der Raspberry Pi keinen USB3.0 Port, aber ich wollte sichergehen dass die im Stick
verbauten Flash-Chips keine allzugroße Geschwindigkeitsbremse darstellen.
Aktuell liegen noch keine Erfahrungswerte über die Lebensdauer des USB Sticks vor, sicher ist nur, dass früher oder später die max Anzahl Schreibzyklen erreicht sein
wird und dann Probleme auftreten - und der Stick getauscht werden muss. Das sollte man von vornherein einplanen, alle Daten regelmäßig sichern, ebenso alle
config files und andere nachträglich vorgenommene Anpassungen.
Denkbar wäre auch der Einsatz einer kleinen USB Festplatte (was aber wohl den Stromverbrauch erhöht) oder eine USB Sticks mit "sandforce" Chipsatz - z.B. "USB-Stick Super Talent Express RC8 50 GB USB 3.0 silber"
darin sind die in SSD Festplatten verwendeten Chipsätze verbaut, was sich deutlich im Preis bemerkbar macht
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/debug.txt 0000775 0000041 0000041 00000004646 12125335446 027701 0 ustar www-data www-data ===== Fehlersuche =====
Hier entsteht ein Leitfaden zur Fehlersuche in volkszaehler-Installationen.
==== Allgemein ====
Zunaechst mal ein paar allgemeine Hinweise:
Die Daten nehmen vom Zaehler zum Frontend einen klaren Weg durch das System.\\
Wenn irgendwo am Ende nichts, oder nicht das Erwartete ankommt, nicht verzweifeln,\\
sondern den Weg der Daten verfolgen, dann findet man ganz automatisch die Stelle, wo sie haengen bleiben.
==== Skizze ====
Verlauf, erst mal fuer einen Zaehler mit Infrarot-Schnittstelle.
* Zaehler
* werden Daten gesendet (Digitalkamera, vorher mit Fernbedienung testen ob diese IR-Impulse sichtbar machen kann )
* IR-Kopf
* werden Daten empfangen (Einfacher Test: IR-Kopf 1-2 cm ueber eine weiße Fläche halten, mit HTerm Daten senden, diese sollten sofort wieder empfangen werden)
* serielle Schnittstelle
* werden Daten empfangen (Terminal-Programm)
* sind die Daten gueltige Daten fuer ein bekanntes Protokoll?
* Port-Parameter korrekt? Baudrate, Frameformat.
* (SML, Binaer, beginnt mit 1b1b1b1b) (D0, Ascii-Text mit Obis-IDs)
* vzlogger
* laeuft er ueberhaupt, oder stuerzt er wegen Bugs ab? (am besten erstmal mit -f starten)
* werden Daten empfangen (leider mit strace, debug-ausgabe fehlt momentan)
* werden die Daten korrekt dekodiert? ("Got new readings from meter")
* werden die Werte Kanaelen zugeordnet? ("Reading: id=... value=... ts=...")
* werden die Werte zur middleware gesendet? ("CURL: *")
* sind die requests korrekt? (leider server-log, strace oder tcpdump, debug-ausgabe fehlt momentan)
* middleware
* werden requests ueberhaupt verarbeitet? (Eingabe und Ausgabe! [[/software/middleware/einrichtung#testen]])
* kommen die requests an (webserver access_log)
* werden die Werte in die Datenbank geschrieben (mysql-client)?
* werden die Daten ausgegeben?
* frontend
* werden korrekte requests an die middleware gestellt und korrekt beantwortet? (firebug, 'network' tab) {{:howto:webconsole.png?linkonly|}}
==== Weiter... ====
Idealerweise solltet ihr (irgendwann einmal) anhand dieses Leitfadens jegliche Probleme selber loesen koennen.
Solange das nicht der Fall ist, geht bitte trotzdem die Liste durch, um den Fehler moeglichst weit einzugrenzen,
und bittet dann zu dem konkreten Problem (statt "hilfe! es funktioniet nicht!" dann zB.: "middleware schreibt nichts in die datenbank") um hilfe: [[/contact]] var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/hexabus.txt 0000644 0000041 0000041 00000062344 12220172732 030235 0 ustar www-data www-data ===== getting hexabus to work on an IOmega iconnect running Debian Squeeze (Debian version 6) ======
# uname -a
Linux iconnect 3.8.3-iconnect #1 Sun Mar 17 15:59:20 CET 2013 armv5tel GNU/Linux
=== plug hexaplug into iconnect ===
=== dmesg output ===
[3348709.273120] usb 1-1.4.3: new full-speed USB device number 9 using orion-ehci
[3348709.409492] usb 1-1.4.3: New USB device found, idVendor=24ad, idProduct=008e
[3348709.416777] usb 1-1.4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[3348709.424484] usb 1-1.4.3: Product: Jackdaw 6LoWPAN Adaptor
[3348709.430081] usb 1-1.4.3: Manufacturer: HEXABUS
[3348709.434735] usb 1-1.4.3: SerialNumber: 0250c40401e3
[3348709.445662] cdc_ether 1-1.4.3:130.0 usb0: register 'cdc_ether' at usb-orion-ehci.0-1.4.3, CDC Ethernet Device, 02:50:c4:04:01:e3
[3348709.458950] cdc_acm 1-1.4.3:130.2: ttyACM0: USB ACM device
=== lsusb output ===
Bus 001 Device 009: ID 24ad:008e
=== lsusb -v output ===
Bus 001 Device 009: ID 24ad:008e
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x24ad
idProduct 0x008e
bcdDevice 10.00
iManufacturer 1 HEXABUS
iProduct 2 Jackdaw 6LoWPAN Adaptor
iSerial 3 0250c40401e3
bNumConfigurations 5
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 6 RNDIS
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 255 Vendor Specific (MSFT RNDIS?)
iInterface 11 RNDIS
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x00
bDataInterface 0
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 138
bNumInterfaces 4
bConfigurationValue 130
iConfiguration 9 CDC-ECM+DEBUG
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
bFunctionClass 2 Communications
bFunctionSubClass 6 Ethernet Networking
bFunctionProtocol 0
iFunction 13 CDC-ECM
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 2 Communications
bInterfaceSubClass 6 Ethernet Networking
bInterfaceProtocol 0
iInterface 13 CDC-ECM
CDC Header:
bcdCDC 1.10
CDC Union:
bMasterInterface 0
bSlaveInterface 1
CDC Ethernet:
iMacAddress 4 0250c40401e3
bmEthernetStatistics 0x00000000
wMaxSegmentSize 1298
wNumberMCFilters 0x0000
bNumberPowerFilters 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 2
bInterfaceCount 2
bFunctionClass 2 Communications
bFunctionSubClass 2 Abstract (modem)
bFunctionProtocol 1 AT-commands (v.25ter)
iFunction 16 Debug Port
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 16 Debug Port
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x03
call management
use DataInterface
bDataInterface 3
CDC ACM:
bmCapabilities 0x02
line coding and serial state
CDC Union:
bMasterInterface 2
bSlaveInterface 3
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x06 EP 6 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 64
bNumInterfaces 2
bConfigurationValue 2
iConfiguration 8 CDC-ECM
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 2 Communications
bInterfaceSubClass 6 Ethernet Networking
bInterfaceProtocol 0
iInterface 13 CDC-ECM
CDC Header:
bcdCDC 1.10
CDC Union:
bMasterInterface 0
bSlaveInterface 1
CDC Ethernet:
iMacAddress 4 0250c40401e3
bmEthernetStatistics 0x00000000
wMaxSegmentSize 1298
wNumberMCFilters 0x0000
bNumberPowerFilters 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 141
bNumInterfaces 4
bConfigurationValue 129
iConfiguration 5 RNDIS+Debug
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
bFunctionClass 2 Communications
bFunctionSubClass 2 Abstract (modem)
bFunctionProtocol 255 Vendor Specific (MSFT RNDIS?)
iFunction 11 RNDIS
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 255 Vendor Specific (MSFT RNDIS?)
iInterface 11 RNDIS
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x00
bDataInterface 0
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 2
bInterfaceCount 2
bFunctionClass 2 Communications
bFunctionSubClass 2 Abstract (modem)
bFunctionProtocol 1 AT-commands (v.25ter)
iFunction 16 Debug Port
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 16 Debug Port
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x03
call management
use DataInterface
bDataInterface 3
CDC ACM:
bmCapabilities 0x02
line coding and serial state
CDC Union:
bMasterInterface 2
bSlaveInterface 3
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x06 EP 6 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0020 1x 32 bytes
bInterval 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 32
bNumInterfaces 1
bConfigurationValue 3
iConfiguration 7 CDC-EEM
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 2 Communications
bInterfaceSubClass 12 Ethernet Emulation
bInterfaceProtocol 7 Ethernet Emulation (EEM)
iInterface 12 CDC-EEM
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0000
(Bus Powered)
=== lsmod | grep cdc_ether ===
cdc_ether 3541 0
usbnet 15388 1 cdc_ether
=== ifconfig -a ===
usb0 Link encap:Ethernet HWaddr 02:50:c4:04:01:e3
BROADCAST MULTICAST MTU:1284 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
=== installation of libklio ===
mkdir /usr/local/packages
cd /usr/local/packages
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.4/gcc-4.4-base_4.4.7-2_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/gcc-4.7-base_4.7.2-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.4/gcc-4.4_4.4.7-2_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libgcc1_4.7.2-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libgcc1-dbg_4.7.2-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.4/cpp-4.4_4.4.7-2_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6_4.7.2-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/e/eglibc/multiarch-support_2.13-38_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-defaults/g++_4.6.3-8_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-defaults/cpp_4.6.3-8_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.6/gcc-4.6_4.6.3-14_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.6/cpp-4.6_4.6.3-14_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.6/gcc-4.6-base_4.6.3-14_armel.deb
http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/binutils/binutils_2.22-8_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.6/g++-4.6_4.6.3-14_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.6/libstdc++6-4.6-dev_4.6.3-14_armel.deb
http://ftp.de.debian.org/debian/pool/main/e/eglibc/libc6-dev_2.13-38_armel.deb
http://ftp.de.debian.org/debian/pool/main/c/cmake/cmake_2.8.9-1_armel.deb
http://ftp.de.debian.org/debian/pool/main/liba/libarchive/libarchive12_3.0.4-3+nmu1_armel.deb
http://ftp.de.debian.org/debian/pool/main/c/cmake/cmake-data_2.8.9-1_all.deb
http://ftp.de.debian.org/debian/pool/main/x/xz-utils/liblzma5_5.1.1alpha+20120614-2_armel.deb
http://ftp.de.debian.org/debian/pool/main/a/attr/libattr1_2.4.46-8_armel.deb
http://ftp.de.debian.org/debian/pool/main/a/acl/libacl1_2.2.51-8_armel.deb
http://ftp.de.debian.org/debian/pool/main/n/nettle/libnettle4_2.4-3_armel.deb
http://ftp.de.debian.org/debian/pool/main/p/pkg-config/pkg-config_0.26-1_armel.deb
http://ftp.de.debian.org/debian/pool/main/s/sqlite3/libsqlite3-dev_3.7.13-1_armel.deb
http://ftp.de.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.7.13-1_armel.deb
http://ftp.de.debian.org/debian/pool/main/x/xmlrpc-c/libxmlrpc-core-c3_1.16.33-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/e/eglibc/libc6_2.13-38_armel.deb
http://ftp.de.debian.org/debian/pool/main/e/eglibc/locales_2.13-38_all.deb
http://ftp.de.debian.org/debian/pool/main/e/eglibc/libc-bin_2.13-38_armel.deb
http://ftp.de.debian.org/debian/pool/main/e/eglibc/libc-dev-bin_2.13-38_armel.deb
http://ftp.de.debian.org/debian/pool/main/m/mpfr4/libmpfr4_3.1.0-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gmp/libgmp10_5.0.5+dfsg-2_armel.deb
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libgomp1_4.7.2-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/i/icu/libicu48_4.8.1.1-12_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-chrono1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-chrono1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-date-time1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-date-time1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-filesystem1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-filesystem1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-system1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-system1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-program-options1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-program-options1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-serialization1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-serialization1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-test1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-test1.49.0_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost-defaults/libboost-thread-dev_1.49.0.1_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-thread1.49-dev_1.49.0-3.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/boost1.49/libboost-thread1.49.0_1.49.0-3.2_armel.deb
clang
http://ftp.de.debian.org/debian/pool/main/libf/libffi/libffi5_3.0.10-3_armel.deb
http://ftp.de.debian.org/debian/pool/main/c/clang/clang_3.0-6.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/l/llvm-3.0/libllvm3.0_3.0-10_armel.deb
http://ftp.de.debian.org/debian/pool/main/b/binfmt-support/binfmt-support_2.0.12_armel.deb
http://ftp.de.debian.org/debian/pool/main/c/clang/libclang-common-dev_3.0-6.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.0.10-3_armel.deb
http://ftp.de.debian.org/debian/pool/main/l/llvm-3.0/libllvm3.0_3.0-10_armel.deb
http://ftp.de.debian.org/debian/pool/main/l/llvm-3.0/llvm-3.0-dev_3.0-10_armel.deb
http://ftp.de.debian.org/debian/pool/main/l/llvm-3.0/llvm-3.0-runtime_3.0-10_armel.deb
http://ftp.de.debian.org/debian/pool/main/libp/libpipeline/libpipeline1_1.2.1-1_armel.deb
http://ftp.de.debian.org/debian/pool/main/l/llvm-3.0/llvm-3.0_3.0-10_armel.deb
http://ftp.de.debian.org/debian/pool/main/c/clang/libclang-dev_3.0-6.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/c/clang/libclang1_3.0-6.2_armel.deb
http://ftp.de.debian.org/debian/pool/main/s/supercollider/libscsynth1_3.4.5-1wheezy1_armel.deb
http://ftp.de.debian.org/debian/pool/main/j/jackd2/libjack-jackd2-0_1.9.8~dfsg.4+20120529git007cdc37-5_armel.deb
http://ftp.de.debian.org/debian/pool/main/s/supercollider/libsclang1_3.4.5-1wheezy1_armel.deb
dpkg -i *.deb
git clone https://github.com/mysmartgrid/libklio.git
cd libklio
make
make release
cd ..
=== hexabus ===
cd /usr/local/src
git clone https://github.com/mysmartgrid/hexabus.git
cd hexabus
git checkout development
cd hostsoftware/libhexabus
make release
dpkg -i build/libhexabus-0.6.0-Linux.deb
hba: ca. 4h
hbc: ca. 20h
hexinfo: ca. 4h
=== Raspberry Pi running Debian Wheezy ===
cd /usr/local/src
apt-get install libboost1.49-dev libboost-chrono1.49-dev libboost-date-time1.49-dev libboost-system1.49-dev libboost-filesystem1.49-dev libboost-program-options1.49-dev libboost-test1.49-dev libsqlite0-dev libsqlite3-dev libboost-thread1.49-dev libboost-thread1.49.0
git clone https://github.com/mysmartgrid/libklio.git
cd libklio
make
make release
(ignore error message because we're in the .deb universe and not in .rpm world:
"CMake Error at /usr/share/cmake-2.8/Modules/CPackRPM.cmake:271 (MESSAGE):
RPM package requires rpmbuild executable
CPack Error: Error while execution CPackRPM.cmake
CPack Error: Cannot find rpmbuild
CPack Error: Problem compressing the directory
CPack Error: Error when generating package: libklio")
dpkg -i build/libklio-0.2.0-Linux.deb
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/wechselrichter_kostal_piko.txt 0000644 0000041 0000041 00000020546 12220054106 034200 0 ustar www-data www-data ====== Wechselrichter Kostal Piko ueber Web-Interface auslesen und im volkszaehler erfassen ======
Das Problem kennen bestimmt einige: Der Wechselrichter hat zwar meistens einen Netzwerkanschluss, zum lokalen Speichern der Leistung muss man trotzdem noch ein Kabel zum Controller oder Middleware verlegen.
Dann könnte das folgende PHP-Skript interessant sein. Damit habe ich meinen Wechselrichter (WR) Kostal Piko 5.5 über das eingebaute Web-Frontend an den Volkszähler angebunden.
Da der WR ohnehin die aktuelle Leistung, als auch den gesamten Stromertrag über das WR-Web-Frontend anzeigt, wollte ich diese Daten alle fünf Minuten auslesen und in die Volkszähler Datenbank schreiben.
Zum Auslesen und Anzeigen der Messwerte benutze ich einen Raspberry Pi.Das Script htmlvz.php liest die Parameter aus der Konfigurationsdatei htmlvz.ini und schreibt die Daten über vzclient in die entsprechenden Kanäle.
===== Image auf Raspberry Pi installieren =====
Zuerst muss das Volkszähler Image installiert werden: [[raspberry_pi_image|Volkszaehler auf einem Raspberry Pi installieren]].
Die korrekte Installation von vzclient überprüfen:
Falls vzclient get channel
nicht die öffentlichen Channels auflistet fehlt vielleicht:
sudo ln -s /usr/local/etc/vzclient.conf /etc/vzclient.conf
Weitere Infos unter [[.:software:clients:vzclient|vzclient]]
===== Kanäle im Frontend erstellen =====
Für den Wechselrichter habe ich zwei [[.:software:middleware:einrichtung|Kanäle]] angelegt:
Kanal 1: "PV aktuelle Leistung"
Typ: Stromsensor
style: steps
öffentlich: x
Farbe: black
aktiv: x
Kanal 2: "PV Zählerstand"
Typ: Stromzaehler
style: steps
öffentlich: x
Farbe: aqua
aktiv: x
Der zweite Kanal ist eigentlich nicht nötig. Man kann jedoch später den Zählerstand leichter auslesen.
===== Linux Skript zum Auslesen der Wechselrichter-Webseite =====
Die Scriptdatei htmlvz.php und die Konfigurationsdatei htmlvz.ini habe ich im Homeverzeichnis des Benutzers pi abgelegt (Standardverzeichnis).Du kannst die Dateien z.B. mit dem Programm psftp auf den Raspi kopieren.
Die UUID des gewünschten Kanals sowie die anderen Parameter (hoffentlich selbsterklärend) trägt man anschließend die Datei htmlvz.ini ein:
[allgemein]
; der Pfad zum Programm vzclient kann durch which vzclient ermittelt unter Linux werden
vzclient_pfad = '/usr/local/bin/vzclient'
logdatei = '/home/pi/piko.log'
[piko]
user = 'pvserver' ; user = Anmeldename des Wechselrichters
passwort = 'pvwr' ; Passwort dazu
wechselrichter_name = 'kostal' ; Name oder IP-Adresse des WR
UUID_aktuelle_leistung = 'abc-defg-hij'
UUID_gesamtenergieerzeugung =''
htmlvz.php:
",$contents); // erzeugt ein array mit als Trennung
foreach ( $full as $line) {
$line = strip_tags(html_entity_decode($line)); //lösche HTML Tags
//echo $line;
if ( preg_match("/aktuell/",$line))
{$line = str_replace(" x x x","0",trim($line));
unset($line2);
$line2 = array_filter(explode(" ",$line)); // durch Leerzeichen trennen u. leere Felder löschen
$line2 = array_values($line2); // array Index neu sortieren
//print_r($line2);
if ($line2[1] == "W") {
//unterschiedliche Anzeige Status An und Aus
//add array 1 mit 0 Watt
$line2[5] = $line2[4];
$line2[4] = $line2[3];
$line2[3] = $line2[2];
$line2[2] = $line2[1];
$line2[1] = 0;
}
//print_r($line2);
$aktuell = $line2[1];
$aktuellE = $line2[2]; //Einheit von aktuell
$Gesamtenergie = $line2[4];
$GesamtenergieE = $line2[5]; //Einheit von Gesamtenergie
//echo "aktuell: $aktuell $aktuellE \nGesamtenergie: $Gesamtenergie $GesamtenergieE \n";
}
if ( preg_match("/Tagesenergie/",$line)) {
//echo "$line \n";
unset($line2);
$line2 = array_filter(explode(" ",$line)); // durch Leerzeichen trennen u. leere Felder löschen
$line2 = array_values($line2); // array Index neu sortieren
//print_r($line2);
$tleistung = $line2[1]; // str_replace("Tagesenergie","",$line);
$tleistungE = $line2[2]; // Einheit von tleistung
//echo "Tagesenergie: $tleistung $tleistungE \n";
//print_r($line2);
}
if ( preg_match("/Status/",$line))
{ $status = trim(str_replace("Status","",$line));
//echo "Status: $status \n";
}
} // foreach Ende
// Daten mit vzclient in die DB schreiben
//shell_exec("date >> $logdatei");
// Zusammenfassung:
echo date("YmdGis"), " Erzeugung aktuell: $aktuell $aktuellE, Gesamtenergie: $Gesamtenergie $GesamtenergieE, Status: $status \n";
if (isset($UUID_aktuell) && !empty($UUID_aktuell)){
//echo "\n not empty UUID aktuell Zweig \n";
//shell_exec($ini_file["allgemein"]["vzclient_pfad"]." -u $UUID_aktuell add data value=$aktuell 2>> $logdatei");
exec($ini_file["allgemein"]["vzclient_pfad"]." -u $UUID_aktuell add data value=$aktuell ", $output, $vzrc);
//echo "vzrc: $vzrc \n";
if ($vzrc == 0) {
//shell_exec("echo aktuell übertragen: $aktuell >> $logdatei");
echo "aktuell übertragen: $aktuell \n";
}
else {
//shell_exec("echo Übertragung nicht erfolgreich! $output >> $logdatei");
echo "Übertragung nicht erfolgreich: $output \n";
}
}
if (isset($UUID_gesamt) && !empty($UUID_gesamt)) {
//echo "not empty UUID Gesamt Zweig \n";
exec($ini_file["allgemein"]["vzclient_pfad"]." -u $UUID_gesamt add data value=$Gesamtenergie ", $output, $vzrc);
if ($vzrc == 0) {
//shell_exec("echo Gesamtenergie übertragen: $Gesamtenergie >> $logdatei");
echo "Gesamtenergie übertragen: $Gesamtenergie \n";
}
else {
//shell_exec("echo Übertragung nicht erfolgreich! $output >> $logdatei");
echo "Übertragung nicht erfolgreich: $output \n";
}
//shell_exec("echo Gesamtenergie übertragen: $Gesamtenergie >> $logdatei");
}
echo date("YmdGis"), " Skriptende";
?>
Das Script muss noch als ausführbar gekennzeichnet werden:
chmod +x htmlvz.php
htmlvz ausführen:
pi@raspberrypi ~ $ php htmlvz.php
20130916222335 Erzeugung aktuell: 100 W, Gesamtenergie: 10000 kWh, Status: Aus
aktuell übertragen: 0
Gesamtenergie übertragen: 25822
20130916222337 Skriptende
Eine Zusammenfassung und Übertragungsbestätigung findet sich anschliessend in der log-Datei.
Um die Übertragung zu automatisieren, wird ein Cron-Job erstellt:
Mit dem voreingestellten Editor hatte ich meine Probleme und habe deshalb den Editor auf nano umgestellt:
$ export EDITOR=nano
Anschliessend wird das Script alle fünf Minuten eingeplant:
$ crontab -e
*/5 * * * * /usr/bin/php htmlvz.php >> /home/pi/piko.log 2>> /home/pi/piko.log
crontab -l zeigt die Einplanung an.
Wenn das Script bereits einige Male manuell ausgeführt wurde, kann man im VZ-Frontend die öffentlichen Kanäle anzeigen.
Weiterführende Links:
[[.:howto:emh_pv-anlage|Script für Gesamt- u. Direktverbrauch]]
var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/raspberry_pi_image.txt 0000775 0000041 0000041 00000023512 12521117510 032435 0 ustar www-data www-data ==== Volkszaehler auf einem Raspberry Pi installieren ====
Mit dem fertigen Image ist die Installation eines Volkszaehlers deutlich einfacher geworden. Hier der grobe Ablauf, Ihr müsst trotzdem noch einiges in der Doku lesen und verstehen, damit die Konfiguration gelingt...
=== Features ===
* vollständige Installation eines Volkszählers der sofort arbeitet
* vzlogger, s0vz und 1wirevz schon fertig installiert
* lediglich noch Anpassung an lokale Installation (Zähler, Netzwerk...) nötig
* Zugriff auf Datenbank über phpmyadmin
* optional grafischer Desktop
* Optimierungen um die SD-Karte zu schonen
* eingerichtete Datenkompression und Datenaggregation
=== Image aufspielen ===
* Aktuelles Image für RPi, RPi-B+ und RPi 2 herunterladen von [[https://demo.volkszaehler.org/downloads/volkszaehler_image.rar|Image-Quelle]]
* Image mit [[http://sourceforge.net/projects/win32diskimager/files/latest/download?source=navbar|Win32ImageWriter]] auf eine mindestens 8GB, besser 16GB große, Class 10, [[http://raspberrycenter.de/handbuch/sd-karten-raspberry-pi|Raspberry Pi kompatible SD-Karte]] kopieren
* SD-Karte in den Pi einlegen
Bitte nach aufspielen des Image KEIN sudo apt-get upgrade vornehmen!
=== Starten des Pi ===
* Pi an das Netzwerk anschließen (LAN-Kabel bevorzugt, [[http://raspberrycenter.de/handbuch/wlan-adapter-usb-raspberry-pi|WLAN geht aber auch]])
* Pi starten (Stromversorgung anschließen)
=== Anmelden an die Konsole ===
Sie können die Zuteilung der IP Adresse an den raspberry an Ihrem DHCP Server ablesen.
Sie können auch einen Netzwerk-Scanner benutzen um die IP des Raspberry Pi herauszufinden.
z.B. https://www.softperfect.com/products/networkscanner/
=== remote Konsole über LAN ===
* Mit z. B. [[http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html|putty]] die Konsole des Pi von einem beliebigen Rechner desselben Netzwerkes aufrufen: putty Port 22, Connection Type: SSH
User: pi Passwort: raspberry
=== Übersicht der Passwörter ===
^Anwendung^Benutzername^Passwort^
|Konsole|pi|raspberry|
|ssh (Konsole über Netzwerk)|pi|raspberry|
|Dateifreigabe|pi|raspberry|
|mysql-Standardbenutzer|vz|demo|
|mysql-Admin|root|raspberry|
=== Einrichten ===
== Das Betriebssystem auf Stand bringen ==
* Die root-Partition auf die Größe der SD-Karte vergrößern mit raspi-config. Dazu
- "sudo bash" ausführen -> dann hat man root-Rechte
- "raspi-config" ausführen
- im Menu den Unterpunkt "expand_rootfs" aufrufen
== evtl: MySQL übers Netz erreichbar machen ==
* wer aus dem lokalen Netz mit einem mysql-client (z.B. HeidiSQL) auf die DB zugreifen will, muss mit "sudo nano /etc/mysql/my.cnf" die Zeile bind-address = 127.0.1.1 ändern in bind-adress = 192.168.178.x (x = IP des Raspi, werden aber alle Clients im gleichen Netz zugelassen). Zudem braucht man einen User mit entsprechenden Rechten auf die DB:
- use mysql;
- CREATE USER "dbadmin"@"192.168.178.%" IDENTIFIED BY "meinPasswort";
- GRANT ALL PRIVILEGES ON *.* TO "dbadmin"@"192.168.178.%";
- flush privileges;
Alternativ können diese Schritte auch über phpmayadmin gemacht werden.
== Kanäle anlegen ==
* Mit dem VZ-Frontend unter http:///frontend
[[software/middleware/einrichtung|die gewüschten Kanäle anlegen]] und unnötige Demokanäle löschen
* über das (i) der Kanäle die UUIDs herausfinden, die beim Anlegen der Kanäle erzeugt wurden
== vzlogger konfigurieren ==
* mit sudo nano /etc/vzlogger.conf
die Konfigurationsdatei für den [[software/controller/vzlogger?s[]=vzlogger|vzlogger]] bearbeiten und gemäß Doku die UUIDs einfügen
== evtl. s0vz konfigurieren (nur bei Pi-Erweiterung von Udo!) ==
* mit sudo nano /etc/s0vz.cfg
die Konfigurationsdatei für [[https://github.com/UdoSchake/s0vz|s0vz]] bearbeiten und gemäß Doku die UUIDs einfügen
* Beispiel GPIO0 = "8102dbc0-6fcd-11e2-a8b7-a1607aa80770"; /* Mein S0-Zähler */
* Die ID des Kanals findet Ihr wie immer über das Frontend heraus, in dem der Kanal auch erstellt wurde. Über das Symbol (i) wird die UUID angezeigt.
== evtl. 1wirevz konfigurieren (nur bei Pi-Erweiterung von Udo!) ==
* mit sudo nano /etc/1wirevz.cfg
die Konfigurationsdatei für [[https://github.com/UdoSchake/1wirevz|1wirevz]] bearbeiten und gemäß Doku die UUIDs einfügen
* Beispiel *28-000004858252 = "fc73fdb0-831f-15e2-ab63-050a66acca61"
* Die ID des 1Wire Devices findet Ihr nach dem Booten mit cat /var/log/syslog | grep 1wirevz
heraus.
* Die ID des Kanals findet Ihr wie immer über das Frontend heraus, in dem der Kanal auch erstellt wurde. Über das Symbol (i) wird die UUID angezeigt.
== evtl. vzclient konfigurieren ==
* mit sudo ln -s /usr/local/etc/vzclient.conf /etc/vzclient.conf
die Konfigurationsdatei in das richtige Verzeichnis verlinken.
* mit vzclient get channel
Funktion überprüfen.
* weitere Infos unter [[software/clients/vzclient|vzclient]]
== reboot ==
* Pi neu starten mit sudo reboot
Im Idealfall läuft es jetzt schon... der Rest ist Geduld!
=== Fehlersuche: ===
* phpmyAdmin http:///phpmyadmin
User vz Passwort demo, da kann man die Daten ansehen und falsche Kanalparameter in der properties Tabelle korrigieren
* I/R-Kopf-Kontrolle xxd da kann man sehen, ob vom I/R-Kopf an ttyUSB0 was reinkommt (-> TTL-I/R-Kopf mit ttyAMA0 anstelle ttyUSB0)
* Wiki-Seite zur [[howto/debug]]
* Auszug aus der Mailing-Liste zum Raspberry-VZ [[http://www.google.de/search?q=site:http://volkszaehler.org/pipermail/+raspberry+pi+image|zur Dokumentation]]
* Bei Problemen mit vzlogger auf der Mailing-Liste melden.
=== Updates durchführen ===
Bevor man Updates durchführt ist es ratsam, die Karte einmal komplett zu sichern, z.B. indem man ein Image der Karte auf einem anderen Rechner erstellt. Geht dann beim Update etwas schief hat man schnell wieder ein funktionierendes System.
Betriebsystem
sudo apt-get update
Update Volkszaehler:
cd /var/www/volkszaehler.org
sudo git pull
=== Raspberry Performance Optimierung ===
Die Leistung des Raspberry für vzlogger, web- und PHP-Server und MySQL ist eigentlich ausreichend, allerdings kann die Leistung spürbar z.B. durch den SD-Karten Zugriff geschmälert werden. Hier einige Hinweise zur [[Performance-Optimierung des Raspberry Pi]].
Zudem hat der Raspberry schwer zu kämpfen wenn lange Zeiträume mit vielen Datensätzen abgefragt werden. Dazu bietet sich einerseits eine Reduktion der Daten bei der Erfassung im vzlogger an, aber auch für große Zoomstufen kann die Datenmenge reduziert und die Ausgabe beschleunigt werden [[datenmengen]].
=== statische IP statt DHCP ===
Das VZ Image für den raspberry Pi ist standardmäßig auf DHCP eingestellt, was für die ersten Schritte in der Regel von Vorteil ist, wenn das Gerät nach dem Verbinden mit dem LAN selbst versucht eine gültige IP Konfiguration zu beziehen. Solche Konfigurationen werden aber normalerweise nur auf Zeit vergeben, und müssen dann nach Ablauf dieser Zeit ("lease time", normalerweise einige Stunden) erneuert werden.
Debian Linux - und so auch das Raspbian - reagieren empfinglich wenn nach Ablauf der lease time einer DHCP Konfiguration der DHCP Server nicht antwortet. Das könnte z.B. der Fall sein wenn der DSL router DHCP Server ist, aber Nachts abgeschaltet ist. Wenn die DHCP config dann nicht verlängert oder erneuert wird, wird die Schnittstelle inaktiv, d.h. der Raspberry ist dann weder per putty noch per http erreichbar. Aus- und Einstecken des LAN Kabels erneuert dann die Konfiguration (sieht man auf dem DHCP Server), die Serverprozesse auf dem raspberry bekommen die neue Konfiguration aber nicht mit - und somit bleibt der raspberry weiterhin nicht erreichbar. Einzige Lösung ist Einloggen über lokale Konsole (Tastatur, Bildschirm) und manuelles restarten der "networking" scripte - wenn das Gerät aber ungünstig verbaut ist so dass Tastatur / Bildschirm nicht angeschlossen werden können bleibt nur die Unterbrechung der Spannungsversorgung.
== aktuelle IP Konfiguration ansehen ==
Da wir ja zunächst mit der dynamischen IP Konfiguration starten kann es ja nicht schaden wenn man sich diese mal ansieht:
ifconfig eth0
und
route -n
nur den Teil bei "0.0.0.0" betrachten.
== statische IP Konfiguration setzen ==
Zum Ändern mit "vi" oder "nano" die Datei "/etc/network/interfaces" öffnen:
sudo vi /etc/network/interfaces
und die Zeile
iface eth0 inet dhcp
ändern auf
iface eth0 inet static
darunter dann folgende Zeilen ergänzen (Beispieldaten, bitte auf *Ihre* LAN Situation anpassen, dazu auf die Daten von oben "ansehen" zurückreifen ):
address 172.27.12.167 ## hier "inet addr" der ifconfig-Ausgabe einsetzen
netmask 255.255.255.128 ## hier "Mask" der ifconfig-Ausgabe einsetzen
network 172.27.12.128
broadcast 172.27.12.255 ## hier "Bcast" der ifconfig-Ausgabe einsetzen
gateway 172.27.12.129 ## hier "Gateway" der route-Ausgabe Zeile 0.0.0.0 einsetzen
Leider habe ich keinen guten Tipp zur Berechnung des "networks" - das ist die UND-Verknüpfung von "address" und "netmask" (sorry, einfacher habe ich es leider nicht).
Nun kann man die "network"-scripten restarten oder einfach den ganzen raspberry rebooten - mit einer statischen IP Konfiguration ist man fortan _NICHT_ mehr abhängig davon ob der DHCP Server jederzeit im LAN reagiert (oder ob man den zum Stromsparen auch mal ausschaltet).
=== Einrichten einer ramdisk ===
Beim RaspberryPi führen alle Änderungen am Dateisystem zu Schreibzugriffen auf der eingelegten SD-Karte. Sollen diese minimiert werden, kann eine ramdisk eingerichtet werden. Eine Anleitung findet ihr hier: [[Ramdisk einrichten]] var/www/htdocs/kjm/wiki.volkszaehler.org/dokuwiki/data/pages/howto/ramdisk_einrichten.txt 0000644 0000041 0000041 00000003060 12236132410 032422 0 ustar www-data www-data Diese Seite befindet sich noch im Aufbau.
Quellen:
* http://www.raspberrypi.org/phpBB3/viewtopic.php?f=27&t=29175
* http://www.observium.org/wiki/Persistent_RAM_disk_RRD_storage
#!/bin/sh
### BEGIN INIT INFO
# Provides: A ramdisk to save intermittent data
# Required-Start:
# Required-Stop:
# X-Start-Before:
# X-Stop-After:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: create a ramdisk
# Description: create a ramdisk with 50MB and mount it to /media/ramdisk
### END INIT INFO
#
case "$1" in
start)
if [ ! -e /media/ramdisk ]; then
mkdir /media/ramdisk
fi
echo "Creating ramdisk..."
#/sbin/mke2fs -m 0 /dev/ramdisk
#/sbin/mkfs.ext4 -m 0 /dev/ram0
/bin/mount -t tmpfs /dev/ram0 -o size=50m /media/ramdisk
if [ -e /media/ramdisk-backup.tar.gz ]; then
echo "Copying files to ramdisk..."
cd /media
tar zxvf ramdisk-backup.tar.gz
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched from HD >> /var/log/ramdisk_sync.log
fi
;;
sync)
echo "Synching files from ramdisk to Harddisk"
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> /var/log/ramdisk_sync.log
cd /media
mv -f ramdisk-backup.tar.gz ramdisk-backup-old.tar.gz
tar zcvf ramdisk-backup.tar.gz ramdisk
;;
stop)
echo "Synching logfiles from ramdisk to Harddisk"
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> /var/log/ramdisk_sync.log
cd /media
tar zcvf ramdisk-backup.tar.gz ramdisk
/bin/umount -v /media/ramdisk
;;
*)
echo "Usage: $0 {start|stop|sync}"
exit 1
esac
exit 0