Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
centos:energieverbrauch [13.07.2012 06:40. ]
django [Perl Script zum Datenbankauslesen]
centos:energieverbrauch [20.04.2018 10:37. ] (aktuell)
Zeile 1: Zeile 1:
 +====== Darstellung des Energieverbrauchs (Strom und Gas) ======
 +{{ :​fun:​fhem-cacti.png?​125}}\\ 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.\\
 +===== Verbrauchsdaten über ein eigenes Script auslesen =====
 +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!
 +==== Perl Script zum Datenbankauslesen ====
 +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.
 +
 +<file perl usr/​local/​bin/​strom_edv.pl>#​!/​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";​
 +</​file>​
 +
 +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
 +===== Cacti-Konfigurationen =====
 +==== Definition Dateneingabe ====
 +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.\\
 +\\
 +{{ :​centos:​strom_1.png?​775 }}
 +\\
 +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.\\
 +\\
 +{{ :​centos:​strom_2.png?​775 }}
 +\\
 +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.\\
 +\\
 +{{ :​centos:​strom_3.png?​775 }}
 +\\
 +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!
 +==== Definition Datenquelle ====
 +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**.\\
 +\\
 +{{ :​centos:​strom_4.png?​775 }} 
 +\\
 +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.\\
 +\\
 +{{ :​centos:​strom_5.png?​775 }}
 +\\
 +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.
 +==== Definition Ausgabegraphen ====
 +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.
 +
 +{{ :​centos:​strom_6.png?​775 }}
 +
 +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**.
 +
 +{{ :​centos:​strom_7.png?​775 }}
 +
 +Ü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.
 +
 +{{ :​centos:​strom_8.png?​775 }}
 +
 +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!
 +
 +{{ :​centos:​strom_9.png?​775 }}
 +
 +