Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:emh_pv-anlage

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
howto:emh_pv-anlage [2017/05/15 22:55] – Frontend-Verzeichnis geändert jauhowto:emh_pv-anlage [2019/09/02 11:02] – virtuelle Kanäle statt direktverbrauch.php jau
Zeile 19: Zeile 19:
 ====== Installation der Volkszähler Software ====== ====== Installation der Volkszähler Software ======
  
-Installation wie im [[software:middleware/installation#software|Installationsleitfaden]] beschrieben.+Installation wie im [[software:middleware:installation#software|Installationsleitfaden]] beschrieben.
  
 ====== Installation von libsml und vzlogger ====== ====== Installation von libsml und vzlogger ======
Zeile 54: Zeile 54:
 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. 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.+Man erstellt jetzt eine Datei ''/etc/udev/rules.d/99-usb-ir-lesekopf.rules'' mit folgendem Inhalt.
  
-<code>+<code 99-usb-ir-lesekopf.rules>
 SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0061E011", SYMLINK+="usb-ir-lesekopf0" SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0061E011", SYMLINK+="usb-ir-lesekopf0"
 SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0061DF28", SYMLINK+="usb-ir-lesekopf1" SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0061DF28", SYMLINK+="usb-ir-lesekopf1"
Zeile 69: Zeile 69:
 </code> </code>
  
-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-lesekopf0und "/dev/usb-ir-lesekopf1ansprechbar.+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.
  
 <code> <code>
Zeile 84: Zeile 84:
 Wir brauchen insgesamt sieben Stück. Vier mit Leistungswerten und drei Zählerständen. 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. Wir brauchen insgesamt sieben Stück. Vier mit Leistungswerten und drei Zählerständen. 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 El. Energie (Leistungswerte) +  * Kanal 1: Haus 1.8.0 (Bezug +A), Typ El. Energie (Zählerstände), Auflösung 1000 
-  * Kanal 2: Gesamtverbrauch, Typ El. Energie (Leistungswerte) +  * Kanal 2: Haus 16.7.0 (Leistung), Typ El. Energie (Leistungswerte) 
-  * Kanal 3: Haus 1.8.0 (Bezug +A), Typ El. Energie (Zählerstände), Auflösung 1000 +  * Kanal 3: Haus 2.8.0 (Lieferung -A), Typ El. Energie (Zählerstände), Auflösung 1000 
-  * Kanal 4: Haus 16.7.0 (Leistung), Typ El. Energie (Leistungswerte) +  * Kanal 4: PV 2.7.0 (Leistung), Typ StomEl. Energie (Leistungswerte)sensor 
-  * Kanal 5: Haus 2.8.0 (Lieferung -A), Typ El. Energie (Zählerstände), Auflösung 1000 +  * Kanal 5: PV 2.8.1 (Erzeugung -A), Typ El. Energie (Zählerstände), Auflösung 1000
-  * Kanal 6: PV 2.7.0 (Leistung), Typ StomEl. Energie (Leistungswerte)sensor +
-  * Kanal 7: PV 2.8.1 (Erzeugung -A), Typ El. Energie (Zählerstände), 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}} {{: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}}
Zeile 99: Zeile 97:
 ====== vzlogger konfigurieren ====== ====== 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.conf die nur das Notwendigste enthält. +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.conf'' die nur das Notwendigste enthält.
- +
-<file> +
-/** +
- * 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 +
- */+
  
 +<code base vzlogger.conf>
 { {
 "retry" : 0,                   /* how long to sleep between failed requests, in seconds */ "retry" : 0,                   /* how long to sleep between failed requests, in seconds */
Zeile 136: Zeile 125:
 ]} ]}
  
-</file>+</code>
  
 Wenn wir jetzt Wenn wir jetzt
  
 <code> <code>
-sudo systemctl start vzlogger+vzlogger -c /etc/vzlogger.test
 </code> </code>
  
Zeile 184: Zeile 173:
 </code> </code>
  
-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 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+Nun kann man die korrekte ''/etc/vzlogger.conf'' erstellen. Für die Beispielanlage brauchte ich
  
 Vom Zweirichtungszähler Vom Zweirichtungszähler
Zeile 199: Zeile 188:
   * 2.8.1 = Wirkarbeit Lieferung -A   * 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äterGeduld!+Nun, das sind fünf Kanäle, die aus den Zählern in der Datenbank landen.
  
 Die restlichen OBIS-Kennzahlen, die die Zähler ausgeben werden nicht benötigt Die restlichen OBIS-Kennzahlen, die die Zähler ausgeben werden nicht benötigt
Zeile 213: Zeile 202:
 {{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:uuid-ermitteln.jpg?100|UUID ermitteln}} {{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:uuid-ermitteln.jpg?100|UUID ermitteln}}
  
-<file> +<code base vzlogger.conf>
-/** +
-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" : 0, /* how long to sleep between failed requests, in seconds */ "retry" : 0, /* how long to sleep between failed requests, in seconds */
Zeile 269: Zeile 249:
 } }
 ]} ]}
-</file>+</code>
  
-Speichern als "/etc/vzlogger.conf".Testen dann mit+Speichern als ''/etc/vzlogger.conf''. Testen dann mit
  
 <code> <code>
Zeile 280: Zeile 260:
 <note warning>Ein dauerhaft hohes Loglevel lässt das Logfile sehr schnell sehr groß werden und verursacht Probleme.</note> <note warning>Ein dauerhaft hohes Loglevel lässt das Logfile sehr schnell sehr groß werden und verursacht Probleme.</note>
  
-====== Script für Gesamt- und Direktverbrauch ====== +====== 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. 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.
  
 +  * Direktverbrauch = Erzeugung - Lieferung
   * Gesamtverbrauch = Bezug + Erzeugung - Lieferung   * Gesamtverbrauch = Bezug + Erzeugung - Lieferung
-  * Direktverbrauch = Erzeugung - Lieferung 
  
 +Da alle für die Berechnung notwendigen Werte vorliegen erstellt man 2 virtuelle Kanäle vom Typ "Verbrauchsensor (virt.)".
  
-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. +{{:software:frontends:frontend:virtuellen_kanal_erstellen.png?100x75|Virtueller Kanal}}
- +
-Damit das Script funktioniert, muss zuerst Curl installiert werden (fehlt im aktuellen Raspberry Image). +
-<code> +
-sudo apt-get install php5-curl +
-</code> +
- +
-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)// +
- +
-<file> +
-<?php +
-    $urlBase='http://localhost/middleware.php/data/'; +
-    $uuIds=array( 'Bezug' => '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<br>"; +
- +
-    $values[$index]=$lastValue; +
-    } // foreach +
- +
-    $diffGV= $values['Bezug'] + $values['Erzeugung'] - $values['Lieferung']; +
-    echo "Gesamtverbrauch = Bezug + Erzeugung - Lieferung$diffGV \n<br>"; +
-    $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<br>"; +
-     +
-    $diffDV= $values['Erzeugung'] - $values['Lieferung']; +
-    echo "Direktverbrauch = Erzeugung - Lieferung $diffDV \n<br>"; +
-    if ($diffDV>0) { +
-        $linkDV=$urlBase $uuIdTarget['Direktverbrauch'] . '.json?operation=add&value=' . $diffDV . '&ts=' . $timestamp; +
-        $dummy=curl_file_get_contents($linkDV); +
-        echo "$linkDV \n<br>"; +
-    } +
-    sleep(15); +
-// for +
-?> +
-</file> +
- +
-Zum testen mit +
- +
-<code> +
-# php /var/www/volkszaehler.org/htdocs/direktverbrauch.php +
-</code> +
- +
-aufrufen. Die Ausgabe sollte dann so aussehen. Jeweils 4 mal mit 15 s Pause. +
- +
-<code> +
-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Bezug: 653.358 +
-<br>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Lieferung: 0 +
-<br>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Erzeugung: 0 +
-<br>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Gesamtverbrauch:+
-<br>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / Direktverbrauch:+
-<br>Gesamtverbrauch = Bezug + Erzeugung - Lieferung: 653.358  +
-<br>Direktverbrauch = Erzeugung - Lieferung: 0  +
-</code> +
- +
-Fehlt nur noch der Crontab Eintrag. Unbedingt als letzte Zeile eine Leerzeile machen. Sonst funktioniert Cron nicht. +
- +
-<code> +
-# 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! +
- +
-</code>+
  
 +  * Kanal 6:
 +    * Einheit: W
 +    * Regel: val(in1) - val(in2)
 +    * Eingang 1: UUID von Kanal 5 (PV 2.8.1)
 +    * Eingang 2: UUID von Kanal 3 (Haus 2.8.0)
 +  * Kanal 7:
 +    * Einheit: W
 +    * Regel: val(in1) + val(in2) - val(in3)
 +    * Eingang 1: UUID von Kanal 1 (Haus 1.8.0)
 +    * Eingang 2: UUID von Kanal 5 (PV 2.8.1)
 +    * Eingang 3: UUID von Kanal 3 (Haus 2.8.0)
  
 ====== Ergebnis der Bemühungen ====== ====== Ergebnis der Bemühungen ======
  
-Wurde alles korrekt eingerichtet, dann sollte sich unter http://localhost/ folgendes Bild bieten. Man beachte die enorme Erzeugung und den ebenso enormen Direktverbrauch. :-) Das Modulfeld war an dem Tag zugeschneit. :-(+Wurde alles korrekt eingerichtet, dann sollte sich unter ''http://localhost/'' 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}} {{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:ansicht.jpg?600|Ansicht}}
  
-Danke für die Aufmerksamkeit. +Wer es optisch mag kann in den Kanal-Eigenschaften den Füllgrad noch etwas höher setzen.
- +
-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}} {{:hardware:channels:meters:power:edl-ehz:emh_pv-anlage:ansicht-gefuellt.jpg?600|Ansicht gefüllte Flächen}}
howto/emh_pv-anlage.txt · Zuletzt geändert: 2022/04/21 20:29 von jau