Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:wechselrichter_sma

Dies ist eine alte Version des Dokuments!


SMA Wechselrichter

Der Hersteller SMA bietet Solarwechselrichter http://www.sma.de/produkte/solarwechselrichter.html an, 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:

  1. Herunterladen des Sourcecodes z.B. als SMAspot_SRC_244_Linux_Win32.tar.gz z.B. /usr/local/src
  2. Anlegen eines Verzeichnisses z.b. „smaspot“
  3. Wechseln in dieses Verzeichnis
  4. Auspacken mit ../tar xvfz SMAspot_SRC_244_Linux_Win32.tar.gz
  5. Installieren der nötigen Libraries sudo apt-get install libbluetooth-dev libcurl4-openssl-dev libboost-all-dev
  6. Übersetzen mit sudo make
  7. 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

lsusb | grep -i blue
Bus 002 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
SMA Geräte mit Bluetooth suchen

XXXX verdeckt die Angaben des konkreten Beispiels

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
Ergebnisse in SMASpot.cfg eintragen

Wenn mehrere Inverter vorliegen einfach mehrere cfg Dateien erstellen z.B. 4000Watt.cfg, 1300Watt.cfg

SMASpot testen
SMASpot -v 

oder

SMASpot -v -cfg4000Watt.cfg

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:

|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";
    }
 
}

Das Script wird dabei einmal pro Minute mit cron aufgerufen.

*  * * * *    /usr/bin/perl /home/markus/hack/Volksz/sma.pl

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.

#!/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

auch diese Script wird mit cron gestartet, aber nur ein mal die Stunde.

1  * * * *    bash /home/markus/hack/Volksz/eigenverbrauch.bash

Und so sieht es aus:

Beispiel SB 4000 TL-21 + SB 1300TL-10 mit SMASpot und PHP
howto/wechselrichter_sma.1401355924.txt.gz · Zuletzt geändert: 2014/05/29 11:32 von wf_bitplan.com