Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:wechselrichter_sma

Dies ist eine alte Version des Dokuments!


Anleitung für den Wechselrichter SMA

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:

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

howto/wechselrichter_sma.1400617521.txt.gz · Zuletzt geändert: 2014/05/20 22:25 von mikemiller