Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:wechselrichter_sma

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
howto:wechselrichter_sma [2014/05/29 12:14] – modifiziertes script mit variablen und funktionen wf_bitplan.comhowto:wechselrichter_sma [2018/04/01 15:56] (aktuell) – Titel jau
Zeile 1: Zeile 1:
-===== SMA Wechselrichter ===== +===(verschobene Seite)=== 
-Der Hersteller SMA bietet Solarwechselrichter [[http://www.sma.de/produkte/solarwechselrichter.html]] an, +#redirect hardware:channels:solar_inverters:sma
-deren Daten über verschiedenen Schnittstellen ausgelesen werden können. SMA bietet zum Auslesen die +
-Software "Sunny Explorer" an, die unter Windows läuft. +
-Für die Nutzung mit der Volkszähler Lösung ist die Quelloffene Software SMASpot besser geeignet, die platttformübergreifend genutzt werden kann, und sich in die Volkszaehler Infrastruktur auf unterschiedliche Weise +
-einbinden lässt. Auf dieser Seite sind einige Beispiele gezeigt. +
- +
-==== SMAspot ==== +
-Die Software SMASpot ist inzwischen bei [[https://smaspot.codeplex.com/]] zu finden. Die downloads +
-befinden sich unter [[https://smaspot.codeplex.com/releases]]  +
-=== Kompilieren von SMAspot unter Linux === +
-Die folgenden Punkte wurden unter Ubuntu 12.04 LTS getestet sollten aber auch in anderen Debian-kompatiblen +
-Distributionen funktionieren: +
- +
-  - Herunterladen des Sourcecodes z.B. als SMAspot_SRC_244_Linux_Win32.tar.gz z.B. /usr/local/src +
-  - Anlegen eines Verzeichnisses z.b. "smaspot" +
-  - Wechseln in dieses Verzeichnis +
-  - Auspacken mit ../tar xvfz SMAspot_SRC_244_Linux_Win32.tar.gz  +
-  - Installieren der nötigen Libraries sudo apt-get install libbluetooth-dev libcurl4-openssl-dev libboost-all-dev  +
-  - Übersetzen mit sudo make +
-  - Kopieren des Ergebnisses sudo cp bin/Release/SMASpot /usr/local/bin  +
- +
-=== Anpassen der Konfiguration für Bluetooth === +
-== Bluetooth Adapter prüfen == +
-Beispiel: Cambridge Silicon Radio Bluetooth Adapter +
-<code> +
-lsusb | grep -i blue +
-Bus 002 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) +
-</code> +
-== SMA Geräte mit Bluetooth suchen == +
-XXXX verdeckt die Angaben des konkreten Beispiels +
-<code> +
-hcitool scan | grep -i SMA +
- 00:80:25:24:XX:XX SMA002d SN: 200221XXXX SN200221XXXX +
- 00:80:25:29:XX:XX SMA002d SN: 213010XXXX SN213010XXXX +
-</code> +
- +
-== Ergebnisse in SMASpot.cfg eintragen == +
-Wenn mehrere Inverter vorliegen einfach mehrere cfg Dateien erstellen z.B. 4000Watt.cfg, 1300Watt.cfg  +
- +
-== SMASpot testen == +
-<code> +
-SMASpot -v  +
-</code> +
-oder  +
-<code> +
-SMASpot -v -cfg4000Watt.cfg +
-</code> +
- +
-==== Beispiele ==== +
-=== Beispiel STP 9000 TL-20 mit SMASpot per Ethernet / Perl->Middleware === +
- +
- +
-Ich besitze den Wechselrichter STP 9000TL-20 [[http://www.sma.de/produkte/solar-wechselrichter-ohne-transformator/sunny-tripower-5000tl-6000tl-7000tl-8000tl-9000tl.html]]. Dieser hat direkt einen Ethernetanschluss, der mit dem Tool smaspot [[https://smaspot.codeplex.com/]] angesprochen werden kann. Das Tool smaspot ist zu kompilieren. Sobald es läuft, findet es den Wechselrichter und gibt ein paar Infos aus: +
-SMAspot -sp0 -v +
- +
-Ich möchte den Gesamtertrag, sowie den Ertrag je String in den Volkszaehler übernehmen: +
-Hierzu habe ich für den Gesamtertrag einen Kanal  +
-El. Energie (Zählerstände)  +
-und für den Ertrag je String  je einen Kanal  +
-El. Energie (Leistungswerte) +
-angelegt. Die UUID sind später im Script einzutragen. +
-Anbei das Script: +
- +
-<code perl |sma.pl> +
-#!/usr/bin/perl +
-use LWP::UserAgent; +
-open STATUS, "/home/markus/hack/sma/smaspot/bin/Release/SMAspot -sp0 -v |" +
-or die "can't fork$!"; +
-while (<STATUS>) { +
- if (/ETotal:[ ]*(.*)kWh/){ +
- &submitt("e63106b0-dd25-11e3-9cd5-27aa144849cd",  $1); +
-  +
-    } +
-    if (/String 1 Pdc:[ ]*(.*)kW/){ +
-    $value = $1; +
-    $value =~ s/\.//g; +
-    &submitt("103ec300-dd27-11e3-84b2-a98f0b16e92d",  $value); +
-     +
-     +
-    } +
-    if (/String 2 Pdc:[ ]*(.*)kW/){ +
-    $value = $1; +
-    $value =~ s/\.//g; +
-    &submitt("2d130060-dd27-11e3-b78b-738251a19608",  $value); +
-    } +
-}  +
-close STATUS or die "bad netstat: $! $?"; +
- +
-#------ +
-sub submitt +
-+
-     $uuid =  $_[0] ; +
-    $val =  $_[1] ; +
-    print $uuid . " : " . $val . "\n"; +
- +
- +
-    my $server_endpoint = "http://localhost/volkszaehler.org/htdocs/middleware.php/data/${uuid}.json?value=" . $val; +
-#    get("http://localhost/volkszaehler.org/htdocs/middleware.php/data/2d130060-dd27-11e3-b78b-738251a19608.json?value=" . $1)."\n"; +
-    #print "serverget = " .  $server_endpoint . "\n"; +
- +
-    # 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; +
-      print "Received reply: $message\n"; +
-    } else { +
-      print "HTTP GET error code: ", $resp->code, "\n"; +
-      print "HTTP GET error message: ", $resp->message, "\n"; +
-    } +
- +
-+
-</code> +
- +
-Das Script wird dabei einmal pro Minute mit cron aufgerufen. +
-<code> +
-*  * * * *    /usr/bin/perl /home/markus/hack/Volksz/sma.pl +
-</code> +
- +
-Um den Eigenverbrauch zu bestimmen bilde ich die Differenz zwischen der Einspeisung, gemessen am Stromzähler. ( mit vzlogger) und der erzeugten Strommenge des SMA. Da der SMA immer etwas verzögert die Werte anzeigt, lege ich nur einen Messpunkt alle 15 Minuten ab: Die Kanäle sind zuvor in der Weboberfläche anzulegen, und mit mysql die channel_id zu selektieren. +
- +
-== Originalscript von Markus == +
-<code bash|eigenverbrauch.bash> +
-#!/bin/bash +
-echo ' +
-delete from `data` where `timestamp` = (select * from (select max(timestamp) from data where channel_id = 7) x) and channel_id = 7 +
-' | mysql --user=vz --password=fdfdfdfdf volkszaehler -T +
-echo ' +
-INSERT INTO `data`( `channel_id`, `timestamp`, `value`) select 7,  timestamp_2,   data_4.value - data_2.value /1000    from ( +
-SELECT  +
-max(case when `channel_id`  = 2 then timestamp else 0 end) timestamp_2, +
-max(case when `channel_id`  = 4 then timestamp else 0 end) timestamp_4 +
-  FROM `data` where channel_id in (2,4)  +
-and timestamp > (select max(timestamp) from data where `channel_id` = 7) +
-group by floor(`timestamp`/60/1000/15) ) a inner join data data_2 on  timestamp_2  = data_2.timestamp and data_2.channel_id = 2 +
-inner join data data_4 on  timestamp_4  = data_4.timestamp and data_4.channel_id = 4 +
-' | mysql --user=vz --password=fdfdfdfdf volkszaehler +
- +
-echo ' +
-delete from `data` where channel_id = 8 +
-' | mysql --user=vz --password=fdfdfdfdf volkszaehler -T +
-#and timestamp > (select max(timestamp) from data where `channel_id` = 8) +
- +
-echo ' +
-INSERT INTO `data`( `channel_id`, `timestamp`, `value`) select 8,  timestamp_7,   data_7.value + data_1.value/1000     from ( +
-SELECT  +
-max(case when `channel_id`  = 1 then timestamp else 0 end) timestamp_1, +
-max(case when `channel_id`  = 7 then timestamp else 0 end) timestamp_7 +
-  FROM `data` where channel_id in (1,7)  +
-group by floor(`timestamp`/60/1000/15) ) a inner join data data_7 on  timestamp_7  = data_7.timestamp and data_7.channel_id = 7 +
-inner join data data_1 on  timestamp_1  = data_1.timestamp and data_1.channel_id = 1 +
-' | mysql --user=vz --password=fdfdfdfdf volkszaehler +
- +
-</code> +
-auch diese Script wird mit cron gestartet, aber nur ein mal die Stunde. +
-<code> +
-1  * * * *    bash /home/markus/hack/Volksz/eigenverbrauch.bash +
-</code> +
- +
-== Modifiziertes Script (Versuch von Wolfgang) == +
-<code bash|eigenverbrauch.bash> +
-#!/bin/bash +
-# calculate own PV usage  +
-# Author: Markus 2014-05-20 +
-# latest version: +
-# $Header: /home/wf/smaspot/RCS/eigenverbrauch.bash,v 1.4 2014/05/29 10:12:45 wf Exp wf $ +
- +
-+
-# get the delete query for the given channel +
-+
-deletequery() { +
-local l_channel=$1 +
-cat << EOF +
-  DELETE  +
-   FROM `data`  +
-   WHERE `timestamp` =  +
-     (SELECT MAX(timestamp) FROM data WHERE channel_id = $l_channel)   +
-   AND channel_id = $l_channel; +
-EOF +
-+
- +
-+
-# get the insert query for the given channels +
-#  l_chanel the channel to insert into +
-#    l_c2 - the channel to substract  +
-#    l_c3 - the channel to substract the value from +
-+
-insertquery() { +
-  local l_channel=$1 +
-  local l_c2=$2 +
-  local l_c3=$3 +
-cat << EOF +
-  INSERT INTO `data`( `channel_id`, `timestamp`, `value`)  +
-    SELECT $l_chanel,  timestamp_2,   data_3.value - data_2.value /1000     +
-    FROM ( +
-      SELECT  +
-        MAX(CASE WHEN `channel_id` = $l_c2 then timestamp else 0 end) timestamp_2, +
-        MAX(CASE WHEN `channel_id` = $l_c3 then timestamp else 0 end) timestamp_3 +
-        FROM `data`  +
-        WHERE channel_id in ($l_c2,$l_c3)  +
-          AND timestamp > ( +
-            SELECT MAX(timestamp) FROM data WHERE `channel_id` = $l_channel  +
-          ) +
-        GROUP by floor(`timestamp`/60/1000/15) ) a  +
-        INNER JOIN data data_2  +
-          ON  timestamp_2  = data_2.timestamp  +
-          AND data_2.channel_id = $l_c2  +
-        INNER JOIN data data_3  +
-          ON  timestamp_3  = data_3.timestamp  +
-          AND data_3.channel_id = $l_c3  +
-EOF +
-+
- +
-# modify according to your volkszaehler mysql database settings +
-user=vz +
-password=fdfdfdfdf  +
-db=volkszaehler  +
- +
-# debug setting +
-debug= +
-# uncomment to debug sql +
-#debug=-T +
- +
-# modify to suite your channel settings +
-# channel 7 is calculated from channel 2 and 4 +
-deletequery 7 | egrep -v "^#" | mysql --user=$user --password=$password $db $debug +
-insertquery 7 2 4 | egrep -v "^#" | mysql --user=$user --password=$password $db $debug +
-# channel 8 is calculated from channel 1 and 7  +
-echo "DELETE FROM `data` WHERE channel_id = 8"  mysql --user=$user --password=$password $db $debug +
-insertquery 8 1 7 | egrep -v "^#" | mysql --user=$user --password=$password $db $debug +
- +
-</code> +
-Und so sieht es aus: +
- +
-{{:howto:screenshotsma.jpg?800|}} +
- +
-== Beispiel SB 4000 TL-21 + SB 1300TL-10 mit SMASpot und PHP == +
- +
howto/wechselrichter_sma.1401358441.txt.gz · Zuletzt geändert: 2014/05/29 12:14 von wf_bitplan.com