Zwar werden monatlich die diversen Zählerstände abgelesen und notiert - schließlich will man ja ungefähr Bescheid wissen, ob die geplanten Zahlen einigermaßen zutreffen und/oder ob es signifikante Änderungen im Verbrauch gibt - aber das Ganze noch schön als aktuelle und historische Verbrauchsdaten graphisch dargestellt, das macht schon die Sache etwas leichter.
Für diese Aufgabe nutzen wir kleines Perl-Script, das die Daten aus der MySQL-Datenbank ausliest, aufbereitet und für Cacti lesbar ausgibt. Damit Cacti diese Ausgabe(n) auch verarbeiten kann, müssen diese einem bestimmten Format entsprechen - gibt ein Script nur einen Wert zurück, sieht die Ausgabe so aus:
<Feldname>:<Wert>
Wollen wir mehrere Werte zugleich verarbeiten, so sind die einzelnen Ausgabepaare mittels Leerzeichen zu trennen und hat demnach folgendes Aussehen:
<Feldname_1>:<Wert_1> <Feldname_2>:<Wert_2> <Feldname_3>:<Wert_3> <Feldname_n>:<Wert_n>
Als Dezimaltrennzeichen erwartet Cacti einen Punktund kein Komma!
Zum Auslesen der aktuellen Verbrauchswerte aus der MySQL-Datenbanktabelle fhem.history verwenden wir nicht das von fhem mitgelieferte Perl-Script, sondern unser eigenes. Hauptgrund ist, dass wir durch anpassung(en) des nachfolgenden Scriptes werte meherer Devices auf einmal abfragen und bei Bedarf auch noch umrechnen/bearbeiten können.
#!/usr/bin/perl -w # # strom_edv.pl: liest den aktuellen Verbrauchswert aus de Datenbank und gibt diesen cacti-tauglich in der # Einheit Watt aus. # # (c) Django 2009 - email: michael@nausch.org # # Ausgabe: direkt auf der Konsole # # Eingabe: Tabelle current aus MySQL-Datenbank fhem # # Returncodes: 0 = Alles OK # 1 = Fehler bei der MySQL-Verbindung # 2 = Fehler beim Lesen aus der MySQL-DB # # Version: # 0.01 12.01.09: Erste Version # Todo : nix ;) ################################################################################################################# use strict; use DBI; use DBD::mysql; use IO::File; my ($query,$dbquery,$sthm,$sthd,$sqlstate,$sql,@row,$sqltodo,%row1,$line,$insql,$val,$dosql,$sqlstated); ### MySQL Setup ### my $DBuser="fhemuser"; # Username des MySQL-Clients my $DBpass="Gas_und_Stromzaehler"; # Passwort des MySQL-Clients my $dbhm=DBI->connect("dbi:mysql:database=fhem;host=localhost;port=3306","$DBuser","$DBpass", { PrintError => 1, } ); unless ( $dbhm ){ print "Fehler bei der Verbindung zu MySQL\n"; exit("1"); } $sql="SELECT value *1000 FROM current WHERE reading = 'power_kW'"; #sql statement ausführen $sthd=$dbhm->prepare($sql); # SQL-Statement zusammensetzen/vorbereiten $sthd->execute(); # SQL-Statement ausführen #rückgabestatus der sqlabfrage überprüfen. wenn fehler dann beenden des programms if ($sqlstated) { print "Fehler beim Lesen aus der MySQL Tabelle fhem:current\nQUERY: $sql\nSTATE: $sqlstated"; exit("2"); }; ### Rückgabewerte der SQL-Abfrage bearbeiten und ausgeben ### $insql=undef; while (@row=$sthd->fetchrow_array()) { $insql=undef; foreach $line (@row) { $val=''; $val=$line if ($line); $insql.="$val" } } print "power:$insql\n";
Diese Codezeilen speichern wir unter /usr/local/bin/ ab, und versehen das Script mit Ausführungsrechten.
# chmod +x /usr/local/bin/strom_edv.pl
Beim Ausruf unseres Scriptes wird uns nun, der in der MySQL-Tabelle fhem.current enthaltene Verbrauchswert in der Einheit kW, auf der Konsole in der Einheit Watt ausgegeben.
# /usr/local/bin/strom_edv.pl power:350
Unter dem Menüpunkt Collection Methods definieren wir nun eine neue Datenquelle beim Punkt Data Input Methods. Mit Anwahl der Schaltfläche add erzeugen wir nun diese Quelle.
Im Feld Name geben wir der Eingabemethode einen sprechenden Namen; als Input Type wählen wir Script/Command aus. Der Input String enthält den kompletten Pfad des Perl-Scriptes, also /usr/local/bin/strom_edv.pl . Mit einem Klick auf die schaltfläche create speichern wir nun diese Werte ab. Als nächstes legen wir das Ausgabefeld Output Fields an, über diese Cacti die Ausgaben unseres Scriptes auswerten wird. Wir wählen also die Schaltfläche Add an.
Der String im Feld Field [Output] muss der Ausgabe unseres Scriptes entsprechen, also in unserem fall power. Im Feld Friendly Name geben wir dem Ganzen einen aussagekräftigen Namen. Das Häckchen bei Update RRD File muss aktiviert sein, damit Cacti die Werte in das RRD-File (Datenbank) aufnehmen kann.
Zum Schluß speichern wir unsere Angaben mit einem Klick auf die Schaltfläche save. Wir haben nun das „Aussehen“ unserer Daten definiert - Cacti sammelt zum jetzigen Zeitpunkt aber noch keine Daten! Nicht nervös werden, dies erfolgt erst später!
Wir lagen also eine Datenquelle unter dem Menüpunkt Managemen Datasource an, damit Cacti die Daten auch einsammeln und ablegen kann. Dort klicken wir auf Add und lassen die Felder Selected Data Template und Host auf „None“ stehen und klicken auf create.
Der Datenquelle geben wir einen Namen, damit wir bei den weiteren Schritten diese einfach wiederfinden. Das Feld Data Source Path brauchen wir nicht zu befüllen, dies erledigt Cacti selbst, sobald wir den Datensatz abspeichern. Bei Data Input Method wählen wir unser zuvor definierte Dateneingabe strom-itrack aus.
Bei Data Source Item vergeben wir noch einen sprechenden Namen unter Internal Data Source Name und definieren mögliche Minimal- und Maximalwerte, die unsere Meßfühler generieren wird. Als Data Source Type wählen wir Gauge; dies definiert Datenquellen die wechselnde Werte liefern, wie z.B. Strom oder Gasverbräuche. Wollten Zählerstande als Absolutwerte, also aufsteigende Zahlenreihen nutzen, so müssten wir hier den Typ Counter auswählen. Zum Schluß speichern wir nun unsere Eingaben durch Anwahl der Schaltfläche save.
Nun wird Cacti beginnen, in dem vorgegebenen 5 Minutenraster unser Perl-Script zum Auslesen der MySQL-Datenbanktabelle aufzurufen und die Rückgabewerte in das betreffende RRD-File zu schreiben.
Nachdem nun Cacti auf Grund unserer zuvor definierten Datenquelle, Meßwerte zusammenträgt, gilt es nun für die Darstellung einen Ausgabegraphen zu bestimmen. Unter Managemnt Graph Management legen wir nun fest, wie die Darstellung erfolgen soll.
Hier klicken wir auf Add und lassen die Felder Selected Data Template und Host auf „None“ stehen und klicken auf create.
Im Feld Title (–title) tragen wir nun die Überschrift ein, die über unserer Graphik erscheinen soll. Bei Vertical Label (–vertical-label) geben wir an, was neben der Y-Achse als Beschriftung erscheinen soll, in unsere Fall z.B. Watt als Einheitenangabe der Meßwerte. Abgespeichert werden unsere Angaben, wie gewohnt nach Anwahl der Schaltfäche save.
Über Graph Items müssen wir nun noch festlegen, wie die Daten dargestellt werden, also letztendlich der Graph gezeichnet werden soll. Wir wählen also bei Graph Items die schaltfläche Add an und gelangen zum nächsten Eingabefenster.
Bei den Eingabefeldern orientieren wir uns nun an Hand der vom System vorgegebenen Graphen und/oder wir experimentieren einfach ein wenig. Sehr hilfreich ist dabei, den Punkt *Turn Off Graph Debug Mode. (rechts oben am Bildschirm) zu aktivieren. Cacti zeigt dann sofort an, wenn etwas nicht passen sollte!