Projekt 23 Smarthome / Zugriff Wechselrichter

Aus c3RE.de
Wechseln zu: Navigation, Suche

Diese Seite gehört zum Kontext Projekt 23 Smarthome und beschreibt die Umsetzung bei Zugriff auf den Wechselrichter.

Display am Gerät

Display von 'SMA® Sunny Tripower 10000TL-20'

Der Wechselrichter verfügt über ein Display zur manuellen Ablesung und Kontrolle von Funktion und Daten.

Angezeigte Daten in diesem Beispiel:

  • Power (aktuelle Leistung): 603 W
  • Erzeugte Strommenge am aktuellen Tag: 1,211 KWh
  • Erzeugte Strommenge über die Gesamtlaufzeit: 4,200 MWh
  • Graphische Aufbereitung der Tagesstatistik
  • Durchlaufend Systemparameter wie die IP-Adresse, Serien-Nummer oder Version der Firmware (angezeigt während der Boot-Phase oder bei 2x Klopfen)
  • ...

Durch Klopfen auf das Gehäuse kann der zeitliche Bezug der Statistik gewechselt werden.

Zugriff auf Wechselrichter 'SMA® Sunny Tripower 10000TL-20'

Aus der Projektbeschreibung von SBFspot: SBFspot is an open source project to get actual and archive data out of an SMA® inverter over Bluetooth or Ethernet (Speedwire®) Quelle: [1]

Es handelt sich um ein Projekt, dessen Software in C++ geschrieben wurde.

Installation 'SBFspot '

Die Installation erfolgt auf CentOS7.

Die Datei mit dem Quellcode ist von der Projektseite zu laden und auszupacken:

# tar -xzf SBFspot_SRC_331_Linux_Win32.tar.gz

Einige Abhängigkeiten sind vor dem Compile von Seiten des Betriebssystems zu erfüllen:

# yum install -y bluez-libs-devel boost-devel mysql-devel mariadb mysql++-devel.x86_64

Es gibt (neben ein paar Warnings beim Compile) eine Fehlermeldung beim Linken:

# make install_mysql
[...]
g++  -o bin/Release_MySQL/SBFspot obj/Release_MySQL/boost_ext.o obj/Release_MySQL/db_MySQL.o obj/Release_MySQL/db_MySQL_Export.o obj/Release_MySQL/misc.o obj/Release_MySQL/strptime.o obj/Release_MySQL/sunrise_sunset.o obj/Release_MySQL/SBFNet.o obj/Release_MySQL/Bluetooth.o obj/Release_MySQL/CSVexport.o obj/Release_MySQL/Ethernet.o obj/Release_MySQL/EventData.o obj/Release_MySQL/ArchData.o obj/Release_MySQL/SBFspot.o obj/Release_MySQL/TagDefs.o   -s -lbluetooth -lboost_date_time -lboost_system -lpthread -lmysqlclient
/bin/ld: cannot find -lmysqlclient
collect2: Fehler: ld gab 1 als Ende-Status zurück
make: *** [out_release_mysql] Fehler 1

Die Fehlermeldung beim Linken kann behoben werden, wenn das makefile angepasst wird.

Original:

LIB_RELEASE_MYSQL = $(LIB) -lmysqlclient

Änderung:

LIB_RELEASE_MYSQL = $(LIB) -L/usr/lib64/mysql -lmysqlclient

Siehe: linux-club.de

Installation 'mysql/mariadb'

Es erfolgt eine Standard-Installation. Client-Pakete mit Boardmitteln aus den Repositories installiert (s.o.). Zusätzlich fehlen noch Server-Komponenten:

# yum -y install mariadb-server

Den Datenbank-Server starten):

# systemctl start mariadb

Für automatischen Start (nach Boot) vorsehen:

# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

mariadb härten:

# mysql_secure_installation

Es empfiehlt sich eine möglichst restriktive Policy für den Betrieb zu verwenden, insbesondere kein root-Zugriff für 'remote'. Auch die Vergabe eines starken Passwortes ist ratsam.

Die Datenbank-Struktur für die Nutzdaten erzeugen:

# mysql -u root -p < CreateMySQLDB.sql
Enter password: <xxx>

Anschließend sollte eine Client-Verbindung zum Server mit dem neu generierten Passwort testweise möglich sein:

# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 5.5.50-MariaDB MariaDB Server
[...]
MariaDB [(none)]>

Einen Datenbank-User für die Verwendung durch das Tool einrichten (Password merken):

MariaDB [(none)]> CREATE USER 'SBFspotUser'@'localhost' IDENTIFIED BY '<yyy>';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT DELETE,INSERT,SELECT,UPDATE ON SBFspot.* TO 'SBFspotUser'@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Anzeige der Datenbank-Struktur:

MariaDB [(none)]> use SBFspot;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [SBFspot]>    
MariaDB [SBFspot]> show tables;
+-------------------+
| Tables_in_SBFspot |
+-------------------+
| Config            |
| Consumption       |
| DayData           |
| EventData         |
| Inverters         |
| MonthData         |
| SpotData          |
| vwAvgConsumption  |
| vwAvgSpotData     |
| vwConsumption     |
| vwDayData         |
| vwEventData       |
| vwInverters       |
| vwMonthData       |
| vwPvoData         |
| vwSpotData        |
+-------------------+
16 rows in set (0.00 sec)

MariaDB [SBFspot]> exit
Bye

Konfiguration 'SBFspot'

Vorweg: Es bietet sich an, die Konfiguration sowohl von 'SBFspot' als auch 'mariadb' in ein git-Repository zu importieren, um hier jederzeit auf ältere (funktionierende) Stände zurückkehren zu können.

Hierzu werden Anpassungen an der mitgelieferten Konfigurationsdatei vorgenommen.

Auskommentiert, weil kein Bluetooth verwendet werden soll:

#BTAddress=00:00:00:00:00:00
Plantname=<xxx>

Insbesondere ist die Datenbank-Verbindung zu konfigurieren:

# MySQL
SQL_Database=SBFspot
SQL_Hostname=localhost
SQL_Username=SBFspotUser
SQL_Password=<yyy>

Wichtig ist darüber hinaus die Konfiguration des Standortes im geographischen Koordinatensystem (WGS 84) und der Zeitzone, damit Sonnenaufgang und Sonnenuntergang korrekt berechnet werden können:

Latitude=54.11
Longitude=7.53
Timezone=Europe/Berlin

Testweiser Aufruf

Für einen ersten Test bietet sich dieser Aufruf an:

# /usr/local/bin/sbfspot.3/SBFspot -v -finq -nocsv
SBFspot V3.3.1
Yet another tool to read power production of SMA solar inverters
(c) 2012-2016, SBF (https://sbfspot.codeplex.com)
Compiled for Linux (LE) 64 bit

Commandline Args: -v -finq -nocsv
Reading config '/usr/local/bin/sbfspot.3/SBFspot.cfg'
Sun Nov 20 21:56:17 2016: INFO: Starting...
sunrise: 07:59
sunset : 16:34
Connecting to Local Network...
Initializing...
SUSyID: 125 - SessionID: 923766608 (0x370F8F50)
Inverter IP address: 172.16.22.10 from SBFspot.cfg
Logon OK
SUSyID: 181 - SN: <xxx>
Device Name:      SN: <xxx>
Device Class:     Solar-Wechselrichter
Device Type:      STP 10000TL-20
Software Version: 02.54.00.R
Serial number:    <xxx>
SUSyID: 181 - SN: <xxx>
Device Status:      Ok
SUSyID: 181 - SN: <xxx>
Device Temperature: 0.0°C
SUSyID: 181 - SN: <xxx>
GridRelay Status:      Information liegt nicht vor
SUSyID: 181 - SN: <xxx>
Pac max phase 1: 10000W
Pac max phase 2: 10000W
Pac max phase 3: 10000W
SUSyID: 181 - SN: <xxx>
Energy Production:
        EToday: 6.785kWh
        ETotal: 3882.580kWh
        Operation Time: 1546.55h
        Feed-In Time  : 1533.15h
SUSyID: 181 - SN: <xxx>
DC Spot Data:
        String 1 Pdc:   0.000kW - Udc:   0.00V - Idc:  0.000A
        String 2 Pdc:   0.000kW - Udc:   0.00V - Idc:  0.000A
SUSyID: 181 - SN: <xxx>
AC Spot Data:
        Phase 1 Pac :   0.000kW - Uac:   0.00V - Iac:  0.000A
        Phase 2 Pac :   0.000kW - Uac:   0.00V - Iac:  0.000A
        Phase 3 Pac :   0.000kW - Uac:   0.00V - Iac:  0.000A
        Total Pac   :   0.000kW
SUSyID: 181 - SN: <xxx>
Grid Freq. : 0.00Hz
SUSyID: 181 - SN: <xxx>
Current Inverter Time: 20/11/2016 21:58:00
Inverter Wake-Up Time: 20/11/2016 08:22:48
Inverter Sleep Time  : 20/11/2016 16:43:16
********************
* ArchiveDayData() *
********************
startTime = 5830D970 -> 20/11/2016 00:00:00
**********************
* ArchiveMonthData() *
**********************
startTime = 581875B0 -> 01/11/2016 12:00:00
Reading events: 2016-Nov-01
Sun Nov 20 21:56:17 2016: INFO: Done.

Die aktuellen Werte für die Energieproduktion lauten also:

EToday: 6.785kWh            (Stromproduktion an diesem Tag)
ETotal: 3882.580kWh         (Stromprodutkon gesamt)

Es sind also an diesem durchwachsenen Herbsttag 6.785 kWh geerntet worden, insgesamt hat die Anlage seit Inbetriebnahme vor 4 Monaten 3,8 MWh (3882.580 kWh) erzeugt. Eine Kontrolle am Display bestättigt diese Werte. Ebenso ein Blick in die manuell aufgezeichneten historischen Daten.

Datenbank-Struktur

Voriger Aufruf schreibt parallel auch gleich die Daten in die Datenbank.

Tabelle Inverters

Diese Tabelle enthält alle verfügbaren Wechselrichter (in diesem Fall nur einer) mit ihren Eigenschaften und aktuellen Erzeugungswerten.

MariaDB [SBFspot]> desc Inverters;
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| Serial        | int(4)      | NO   | PRI | NULL    |       |
| Name          | varchar(32) | YES  |     | NULL    |       |
| Type          | varchar(32) | YES  |     | NULL    |       |
| SW_Version    | varchar(32) | YES  |     | NULL    |       |
| TimeStamp     | int(4)      | YES  |     | NULL    |       |
| TotalPac      | int(4)      | YES  |     | NULL    |       |
| EToday        | int(8)      | YES  |     | NULL    |       |
| ETotal        | int(8)      | YES  |     | NULL    |       |
| OperatingTime | double      | YES  |     | NULL    |       |
| FeedInTime    | double      | YES  |     | NULL    |       |
| Status        | varchar(10) | YES  |     | NULL    |       |
| GridRelay     | varchar(10) | YES  |     | NULL    |       |
| Temperature   | float       | YES  |     | NULL    |       |
+---------------+-------------+------+-----+---------+-------+

MariaDB [SBFspot]> select * from Inverters;
+-----------+---------------+----------------+------------+------------+----------+--------+--------+---------------+------------+--------+-----------+-------------+
| Serial    | Name          | Type           | SW_Version | TimeStamp  | TotalPac | EToday | ETotal | OperatingTime | FeedInTime | Status | GridRelay | Temperature |
+-----------+---------------+----------------+------------+------------+----------+--------+--------+---------------+------------+--------+-----------+-------------+
| <xxx>     | SN: <xxx>     | STP 10000TL-20 | 02.54.00.R | 1479761762 |        0 |      3 |   3885 |       1554.38 |    1540.76 | OK     | N/A       |           0 |
+-----------+---------------+----------------+------------+------------+----------+--------+--------+---------------+------------+--------+-----------+-------------+

Tabelle DayData

MariaDB [SBFspot]> desc DayData;
+------------+--------+------+-----+---------+-------+
| Field      | Type   | Null | Key | Default | Extra |
+------------+--------+------+-----+---------+-------+
| TimeStamp  | int(4) | NO   | PRI | NULL    |       |
| Serial     | int(4) | NO   | PRI | NULL    |       |
| TotalYield | int(8) | YES  |     | NULL    |       |
| Power      | int(8) | YES  |     | NULL    |       |
| PVoutput   | int(1) | YES  |     | NULL    |       |
+------------+--------+------+-----+---------+-------+

MariaDB [SBFspot]> select * from DayData order by TimeStamp desc limit 5;
+------------+-----------+------------+-------+----------+
| TimeStamp  | Serial    | TotalYield | Power | PVoutput |
+------------+-----------+------------+-------+----------+
| 1479741300 | <xxx>     |    3885365 |    24 |     NULL |
| 1479741000 | <xxx>     |    3885363 |    12 |     NULL |
| 1479740700 | <xxx>     |    3885362 |     0 |     NULL |
| 1479740400 | <xxx>     |    3885362 |    12 |     NULL |
| 1479740100 | <xxx>     |    3885361 |    12 |     NULL |
+------------+-----------+------------+-------+----------+

Oder reduziert auf die wesentlichen Fakten und mit leserlichem Timestamp, sortiert und begrenzt:

MariaDB [SBFspot]> select FROM_UNIXTIME(TimeStamp, '%Y-%m-%d') as Datum, max( round( TotalYield/1000, 3)) - min( round( TotalYield/1000, 3)) as 'Gesamterzeugung [KWh]' from DayData group by Datum order by Datum desc limit 10;
+------------+-----------------------+
| Datum      | Gesamterzeugung [KWh] |
+------------+-----------------------+
| 2016-12-11 |                 2.594 |
| 2016-12-10 |                 5.215 |
| 2016-12-09 |                 2.557 |
| 2016-12-08 |                 8.788 |
| 2016-12-07 |                 4.279 |
| 2016-12-06 |                27.214 |
| 2016-12-05 |                30.981 |
| 2016-12-04 |                31.958 |
| 2016-12-03 |                29.691 |
| 2016-12-02 |                13.761 |
+------------+-----------------------+
10 rows in set (0.12 sec)

Kontinuierliches Logging der Daten

Für statistische Zwecke (wie beispielsweise die monatliche Umstatzsteuererklärung) oder Steuerungsaufgaben in Abhängigkeit von jüngeren Erzeugungsdaten werden die Daten des aktuellen Tages (Parameter '-ad1') kontinuierlich mit einer Frequenz von 5 Minuten erfasst und gespeichert. Hierfür wird ein entsprechender cron-Job aufgesetzt:

# crontab -l -u sbfspot
*/5 * * * * sleep 30 && /usr/local/bin/sbfspot.3/SBFspot -q -nocsv -ad1

Hinweise:

  • Die historischen Werte können mit dem Parameter -adX auch beim Wechselrichter abgefragt werden. Allerdings hat der nur einen begrenzten Speicher, welcher ungefähr 3 Monate zurück reicht.
  • 5 Minuten entspricht auch der internen Frequenz des Wechselrichters.
  • Der Verzicht auf den Parameter '-finq' (force inquiry) verhindert unnötige Abfragen nach Sonnenuntergang. Ohne diesen Parameter stellt schon der Client auf Basis der konfigurierten Koordinaten fest, dass wegen Dunkelheit keine Anfrage notwendig ist:
Nothing to do... it's dark. Use -finq to force inquiry.

Kontrolle:

  • Ein Mitschnitt des Netzwerkverkehrs mit tcpdump belegt die Behauptung, dass der Wechselrichter in dieser Zeit tatsächlich nicht angefragt wird.
  • Eine Abfrage am folgenden Tag zeigt, dass der Wechselrichter mit Sonnenuntergang um 16:30 die Arbeit eingestellt und um 08:50 wieder aufgenommen hat.
$ date ; mysql -u SBFspotUser -p SBFspot --execute="select FROM_UNIXTIME(TimeStamp, '%Y-%m-%d %H:%i') as Datum, round( TotalYield/1000, 3) as 'Gesamterzeugung [KWh]' from DayData order by Datum desc limit 10;"
Fr 9. Dez 09:10:35 CET 2016
Enter password: 
+------------------+-----------------------+
| Datum            | Gesamterzeugung [KWh] |
+------------------+-----------------------+
| 2016-12-09 09:10 |              4198.940 |
| 2016-12-09 09:05 |              4198.924 |
| 2016-12-09 09:00 |              4198.918 |
| 2016-12-09 08:55 |              4198.914 |
| 2016-12-09 08:50 |              4198.912 |
| 2016-12-08 16:30 |              4198.912 |
| 2016-12-08 16:25 |              4198.910 |
| 2016-12-08 16:20 |              4198.908 |
| 2016-12-08 16:15 |              4198.905 |
| 2016-12-08 16:10 |              4198.897 |
+------------------+-----------------------+

Auswertung

<ToDo>

Links