SBFspot PV-Daten-Logger installieren
Im Gegensatz zur alten (manuellen Installation) von SBFspot , kann ab der Version 3.6 die Installation/Konfiguration von SBFspot recht einfach mit dem tool sbfspot-config erfolgen.
Um den Schreibzugriff auch für Web-Scripte mit www-dat:www-data zu gewähren müssen die Rechte für das Verzeichniss entsprechend gesetzt werden.
Jetzt sollte SBFspot noch kurz getestet werden ....
Verfügbare Optionen anzeigen
SBFspot V3.6.0
Yet another tool to read power production of SMA solar inverters
(c) 2012-2019, SBF (https://github.com/SBFspot/SBFspot)
Compiled for Linux (LE) 32 bit with SQLite support
SBFspot [-options]
-scan Scan for bluetooth enabled SMA inverters.
-d# Set debug level: 0-5 (0=none, default=2)
-v# Set verbose output level: 0-5 (0=none, default=2)
-ad# Set #days for archived daydata: 0-300
0=disabled, 1=today (default), ...
-am# Set #months for archived monthdata: 0-300
0=disabled, 1=current month (default), ...
-ae# Set #months for archived events: 0-300
0=disabled, 1=current month (default), ...
-cfgX.Y Set alternative config file to X.Y (multiple inverters)
-finq Force Inquiry (Inquire inverter also during the night)
-q Quiet (No output)
-nocsv Disables CSV export (Overrules CSV_Export in config)
-nosql Disables SQL export
-sp0 Disables Spot.csv export
-installer Login as installer
-password:xxxx Installer password
-loadlive Use predefined settings for manual upload to pvoutput.org
-startdate:YYYYMMDD Set start date for historic data retrieval
-settime Sync inverter time with host time
-mqtt Publish spot data to MQTT broker
Libraries used:
SQLite V3.27.2
BOOST V1.67.0
Ausserdem gibt es noch weitere undokumentierte Optionen ("Set 123Solar command value (Undocumented - For 123Solar usage only"). Siehe hierzu im Quellcode SBFspot.cpp ab Zeile 1215:
| SBFspot -q -123s | Gibt die Daten im 123solar -Format auf der Konsole aus |
| SBFspot -q -123s=DATA | Gibt die Daten im 123solar -Format auf der Konsole aus |
| SBFspot -q -123s=INFO=SYNC | Gibt die WR-Informationen im 123solar-Format auf der Konsole aus |
| SBFspot -q -123s=SYNC | Startet die Synchronisation des Wechselrichters |
| SBFspot -q -123s=STATE | Gibt den WR-Status im 123solar-Format auf der Konsole aus |
Prüfen ob in Einträge der DB vorhanden sind
sqlite3 SBFspot.db
select * from vwspotdata
pi@himbeerix: ~ $ sqlite3 SBFspot.db
SQLite version 3.27.2 2019-02-25 16:06:06
Enter ".help" for usage hints.
sqlite> select * from vwspotdata;
2019-10-21 15:11:10|2014-09-21 15:10:00|SN: 2002170358|SB 1600TL-
10|2002170358|208|0|1.213|0.0|172.0|0.0|0|0|0|0.0|0.0|0.0|233.8|0.0|0.0|208|0|0.0|4412|3
8.0|03.00.08.R|1579769402|1482|0|553 125|574.575|533.894|OK|Closed|0.0
sqlite> select * from inverters;
3005977634|STP8.0-3AV-40 634|Sunny Tripower 8.0|03.00.08.R|1579769402|1482|0|553
125|574.575|533.894|OK|Closed|0.0
sqlite> .quit
Probleme durch Verbindungsabbrüche beseitigen
Durch sbfspot_config wurden die scripts daydata und monthdata erstellt und in der crontab eingetragen.#
############################################################
#--- daydata ---
#--- script zum Abruf der Tagesdaten
#---
###########################################################
log=/var/log/sbfspot.3/mpSol_$(date '+%Y%m%d').log
/usr/local/bin/sbfspot.3/SBFspot -v -ad1 -am0 -ae0 -cfg/usr/local/bin/sbfspot.3/SBFspot.cfg &>>$log
#
############################################################
#--- monthdata ---
#--- script zum Abruf der Monatsdaten
#---
###########################################################
log=/var/log/sbfspot.3/mpSol_$(date '+%Y%m').log
/usr/local/bin/sbfspot.3/SBFspot -v -sp0 -ad0 -am1 -ae1 -finq -cfg/usr/local/bin/sbfspot.3/SBFspot.cfg &>>$log
crontab
*/5 6-23 * * * /usr/local/bin/sbfspot.3/daydata
55 05 * * * /usr/local/bin/sbfspot.3/monthdata
Wie in der crontab ersichtlich, wird das Script daydata alle 5 Minuten im Zeitraum zwischen 06:00 Uhr und 23:00 Uhr und das Script monthdata jeden Tag um 05:55 gestartet. Nach einigen Tagen stellte sich allerdings heraus, dass beim einmaligen Aufruf von SBFspot (via daydatay bzw. monthdata) das Scrip sehr oft mit der FM: "CRITICAL: Failed to initialize Speedwire connection" abbricht. Pingt man den WR an kommt immer eine Antwort, es gibt keine Aussetzer! Wenn SBFspot in kurzen Intervallen mehrfach aufgerufen wird, antwortet der WR dann nach spätestens dem vierten/fünften Aufruf.
Laut SBFspot-Forum (#256 und#354) versendet der Wechselrichter (entgegen der technischen Unterlagen) keine Mulicast-Pakete. Da SBFspot sowohl von daydata per cron, als auch von 123solar alle 5 min gestartet wird kommt es hier dann zwangsweise zu Kollisionen bzw. Verbindungsabbrüchen. Um diese zu verhindern mussten die Scrips daydata und monthdata geändert werden. In dem geänderten Script wird SBFspot solange gestartet bis die Verbindung zu Stande kommt.
Script daydata ändern
#!/bin/bash
#
###############################################################################
#--- daydata ---
#--- script zum Abruf der Tagesdaten
#---
##############################################################################
counter=0
grepCount=99
return=""
log=/var/log/sbfspot.3/mpsol_$(date '+%Y%m%d').log
logTmp=/var/log/sbfspot.3/daydata_tmp.log
while [ $counter -lt 10 -a $grepCount -ne 0 ];
do
echo -e $return$counter": ********************** $(date) ********************** from spotdata">$logTmp
/usr/local/bin/sbfspot.3/SBFspot -v -ad1 -am0 -ae0 -finq -cfg/usr/local/bin/sbfspot.3/SBFspot.cfg &>>$logTmp
cat $logTmp >> $log
grepCount=$(grep -c -i "ERROR" $logTmp)
grepCount=$(( $grepCount + $(grep -c -i "CRITICAL" $logTmp) ))
let counter+=1
return="\n"
$(sleep 4)
done
Script monthdata ändern
#!/bin/bash
#
counter=0
grepCount=99
return=""
log=/var/log/sbfspot.3/mpSol_$(date '+%Y%m').log
logTmp=/var/log/sbfspot.3/monthdata_tmp.log
while [ $counter -lt 10 -a $grepCount -ne 0 ];
do
echo -e $return$counter": ********************** $(date) ********************** from spotdata">$logTmp
/usr/local/bin/sbfspot.3/SBFspot -v -sp0 -ad0 -am1 -ae1 -finq -cfg/usr/local/bin/sbfspot.3/SBFspot.cfg &>>$logTmp
cat $logTmp >> $log
grepCount=$(grep -c -i "ERROR" $logTmp)
grepCount=$(( $grepCount + $(grep -c -i "CRITICAL" $logTmp) ))
let counter+=1
return="\n"
$(sleep 4)
done
Upload zu PVOutput einrichten
Zuerst die benötigte Library installieren. Dann in den Ordner /usr/local/bin/sbfspot.3/SBFspotUploadDaemon wechseln und den SBFspotUploadDaemon (mit SQLite-Support) kompilieren, binden und nach /usr/local/bin/sbfspot.3 installieren.
cd /home/pi/sbfspot.3/SBFspotUploadDaemon
sudo make sqlite
sudo make install_sqlite
Für die Konfiguration werden die Seriennummer des Wechselrichters sowie die System-ID und der API-Key von PVOutput benötigt und in der Konfigurationsdatei SBFspotUpload.cfg eingetragen.
| PVoutput_SID | <Seriennummer des Wechselrichters> : <Pvoutput System-ID> |
| 123****890634 : 4***01 | |
| PVoutput_Key | <API-Key> |
| 5e******eafre78150d3a4a3d2f10a************6 |
*(SID u. Key siehe PVOutput und/oder keePass)
SBFspotUpload.cfg
############################################################
# SBFspotUpload.cfg - Configuration file for SBFspotUploadService/Daemon
# (c)2012-2014, SBF (https://sbfspot.codeplex.com)
#
# DISCLAIMER:
# A user of SBFspotUploadService/Daemon software acknowledges that he or she is
# receiving this software on an "as is" basis and the user is not relying on
# the accuracy or functionality of the software for any purpose. The user
# further acknowledges that any use of this software will be at his own risk
# and the copyright owner accepts no responsibility whatsoever arising from
# the use or application of the software.
#
############################################################
################################
### Log Settings ###
################################
# Windows: C:\Users\Public\SMAdata\Logs
# Linux : /home/pi/smadata/logs
#LogDir=C:\Users\Public\SMAdata\Logs
LogDir=/home/pi/smadata/logs
#LogLevel=debug|info|warning|error (default info)
LogLevel=info
################################
### PVoutput Upload Settings ###
################################
#PVoutput_SID
#Map inverters to PVoutput System ID's
#PVoutput_SID=SerialNmbrInverter_1:PVoutput_System_ID_1,SerialNmbrInverter_2:PVoutput_System_ID_2
#e.g. PVoutput_SID=200212345:4321
PVoutput_SID=123****890634:4***01
#PVoutput_Key
#Sets PVoutput API Key
PVoutput_Key=5e******eafre78150d3a4a3d2f10a************6
################################
### SQL DB Settings ###
################################
# SQL_Database (Fullpath to SQLite DB)
# Windows: C:\Users\Public\SMAdata\SBFspot.db
# Linux : /home/pi/smadata/SBFspot.db
#SQL_Database=C:\Users\Public\SMAdata\SBFspot.db
SQL_Database=/home/pi/smadata/SBFspot.db
# Reserved for MySQL
#SQL_Database=SBFspot
#SQL_Hostname=<Network Name> or <IP-address>
#SQL_Username=SBFspotUser
#SQL_Password=SBFspotPassword
Autostart des UploadDaemon einrichten
Der UploadDaemon soll nach einem Neustart des Pi automatisch gestartet werden. Dazu wird im Verzeichnis /usr/local/bin/sbfspot.3/ die Service-Datei SBFspotUpload.service bereitgestellt. Ab der SBFspot Version 3.5.x erfolgt der Start via system.d (bei älteren Versionen wurde via local.rc gestartet).
SBFspotUpload.service
[Unit]
Description=SBFspot Upload Daemon
After=mysql.service mariadb.service network.target
[Service]
User=pi
Type=simple
TimeoutStopSec=10
ExecStart=/usr/local/bin/sbfspot.3/SBFspotUploadDaemon
Restart=on-success
RestartSec=10
[Install]
WantedBy=multi-user.target
Service aktivieren & Starten
sudo systemctl start SBFspotUpload
UploadDaemon prüfen
● SBFspotUpload.service - SBFspot Upload Daemon
Loaded: loaded (/usr/local/bin/sbfspot.3/SBFspotUpload.service; enabled; vend
Active: active (running) since Thu 2020-06-04 17:31:03 CEST; 21min ago.
Main PID: 533 (SBFspotUploadDa)
Tasks: 1 (limit: 4915) Memory: 10.9M
CGroup: /system.slice/SBFspotUpload.service
└─533 /usr/local/bin/sbfspot.3/SBFspotUploadDaemon
Jun 04 17:31:03 himbeerix systemd[1]: Started SBFspot Upload Daemon.
Upload prüfen
Wenn der Daemon gestartet ist im Logfile unter in /home/pi/smadata/logs nachschauen ob ein Logfile erstellt wurde und der Upload richtig funktioniert.
cat SBFspotUpload20191129.log
pi@himbeerix: ~/smadata/logs $ cat SBFspotUpload20191129.log
[13:36:48] INFO: SBFspotUploadDaemon Version 2.0.0
[13:36:48] INFO: Starting Daemon...
[13:36:48] INFO: Uploading 30 datapoints, starting with 20191128,11:00,94403,840 => OK (200)
[13:37:31] INFO: Uploading 30 datapoints, starting with 20191128,13:30,99306,3456 => OK (200)
Nach kurze Zeit sollte der Upload auch unter den Live-Daten von PVOutput angezeigt werden.

Raspi neu starten
Zu Schluss sollte der PI noch neugestartet werden. Dieses erfolgt mit dem Shutdown-Befehl als Soft Reboot, mit der Option –r
.... oder als Hard Reboot, mit der Option –h, durch Herunterfahren und anschließendem Aus- und Einschalten per Netzschalter.
Probleme mit fehlerhaften Datensätzen beseitigen
ist seit der Version 3.8.4 (11-DEC-2021) (bugfix release) nicht mehr relvantPvoutput akzetiert beim Upload Werte von maximal 150% der Peak-Leistung, was bei einer Anlage mit 8.5 KWP einem Wert von 12.750KW entspricht. Wird versucht größere Werte wie 12750 W hochzuladen, werden diese nicht akzetiert.
Da alle Momentanwerte in der SBFspot.db gespeichert bleiben wird der SBFspot-UploadDaemon immer wieder versuchen diesen Datensatz nach PVoutput.org hochzuladen. Fehlerhafte Uploads werden im entsprechenden Logfile von SBFspotUpload dokumentiert. Da ein “fehlerhafter” Datensätze den weiteren Upload verhindern, muss der betreffende Datensatz in der DB gelöscht werden. Sobald der fehlerhafte Datensatz gelöscht wurde (oder der zu hohe Wert “Power” 12750 ) korrigiert wurde, wird der Upload-Daemon seine Arbeit fortsetzen.
In den nachstehenden LOG-Files vom 29.11.2019 bzw. 30.11.2019 ist der Fehler zu erkennen. SBFspot hat erstmal um 02:40 Uhr ein Peak-Wert von <1205988 Watt (also 1.2 MW) gespeichert. Der Upload hat daraufhin gestoppt.
Dieser Fehler tritt laut SBFspot-Forum #137 ab und zu auf und niemand kennt die genaue Ursache. Im Forum wurde deshalb ein Workaround vorgestellt der das manuelle Löschen überflüssig macht.
Aktuelle Log Files prüfen
cd /home/pi/smadata/logs
ls –l
cat SBFspotUpload20191129.log
...
cat SBFspotUpload20191130.log
pi@himbeerix: ~/smadata/logs $ cat SBFspotUpload20191129.log
[13:36:48] INFO: SBFspotUploadDaemon Version 2.0.0
[13:36:48] INFO: Starting Daemon...
[13:36:48] INFO: Uploading 30 datapoints, starting with 20191128,11:00,94403,840 => OK (200)
[13:37:31] INFO: Uploading 30 datapoints, starting with 20191128,13:30,99306,3456 => OK (200)
....
....
[14:06:49] INFO: SBFspotUploadDaemon Version 2.0.0
[14:06:49] INFO: Starting Daemon...
[14:06:49] ERROR: Uploading 30 datapoints, starting with 20191129,02:40,100498,0 Bad request 400: Power value [1205988] too high for system size [8500]
[14:07:41] ERROR: Uploading 30 datapoints, starting with 20191129,02:40,100498,0 Bad request 400: Power value [1205988] too high for system size [8500]
[14:08:30] ERROR: Uploading 30 datapoints, starting with 20191129,02:40,100498,0 Bad request 400: Power value [1205988] too high for system size [8500]
[00:00:31] ERROR: Uploading 30 datapoints, starting with 20191129,08:05,100498,1205988,,,0,234.03 Bad request 400: Power value [1205988] too high for system size [8500]
....
[00:01:30] ERROR: Uploading 30 datapoints, starting with 20191129,08:05,100498,1205988,,,0,234.03 Bad request 400: Power value [1205988] too high for system size [8500]
[00:02:30] ERROR: Uploading 30 datapoints, starting with 20191129,08:05,100498,1205988,,,0,234.03 Bad request 400: Power value [1205988] too high for system size [8500]
[00:03:31] ERROR: Uploading 30 datapoints, starting with 20191129,08:05,100498,1205988,,,0,234.03 Bad request 400: Power value [1205988] too high for for system size [8500]
....
....
Manuelles Löschen des fehlerhaften Datensatzes
Datensatz mit zu großen Wert (z.B. >1205987) suchen und Wert auf 0 setzen.
sqlite3 SBFspot.db
select * from daydata where power>1205987;
update daydata set power=0 where power>1205987;
Workaround bei fehlerhaften Datensätzen
Die Tagesdaten (daydata) werden mit den VIEW „vwPvoData“ für den Upload vorbereitet. Der View wird so geändert, dass nur Datensätze mit korrekten Werten übernommen, fehlerhafte (zu große) Werten auf 0 gesetzt und erst dann an PVOutput übermittelt werden. Dadurch wird erreicht, dass der Upload nicht mit Fehler stehen bleibt. Der fehlerhafte Datensatz wird in der Tabelle daydata nicht gelöscht und es kann dadurch später (select * from daydata where power >8500;) nachvollzogen werden wie oft der Fehler aufgetreten ist. Theoretisch wären Werte bis 12750W möglich, in der Praxis werden jedoch bei einer Anlage von 8,5 KWp maximal 8500W auftreten. Deshalb wird als Grenzwert hier auch die tatsächlich Peak-Leistung der Anlage (8500W) eingetragen.
View vwPvoData
dd.Name,
dd.Type,
dd.Serial,
dd.TotalYield AS V1,
dd.Power AS V2,
cons.EnergyUsed AS V3,
cons.PowerUsed AS V4,
spot.Temperature AS V5,
spot.Uac1 AS V6,
NULL AS V7,
NULL AS V8,
NULL AS V9,
NULL AS V10,
NULL AS V11,
NULL AS V12,
dd.PVoutput
FROM vwDayData AS dd
LEFT JOIN vwAvgSpotData AS spot
ON dd.Serial = spot.Serial AND dd.Timestamp = spot.Nearest5min
LEFT JOIN vwAvgConsumption AS cons
ON dd.Timestamp = cons.Nearest5min
ORDER BY dd.Timestamp DESC;
Dem VIEW vwPvoData wird die markierte Abfrage hinzugefügt. Da SQLite kein „ALTER VIEW" kennt, muss der VIEW zuerst gelöscht und anschließend neu erstellt werden.
View vwPvoData neu erstellen
sqlite3 SBFspot.db
DROP VIEW IF EXISTS vwPvoData;
CREATE VIEW vwPvoData AS
SELECT dd.Timestamp,
dd.Name,
dd.Type,
dd.Serial,
dd.TotalYield AS V1,
CASE WHEN dd.Power > 8500
THEN 0
ELSE dd.Power
END AS V2,
cons.EnergyUsed AS V3,
cons.PowerUsed AS V4,
spot.Temperature AS V5,
spot.Uac1 AS V6,
NULL AS V7,
NULL AS V8,
NULL AS V9,
NULL AS V10,
NULL AS V11,
NULL AS V12,
dd.PVoutput
FROM vwDayData AS dd
LEFT JOIN vwAvgSpotData AS spot
ON dd.Serial = spot.Serial AND dd.Timestamp = spot.Nearest5min
LEFT JOIN vwAvgConsumption AS cons
ON dd.Timestamp = cons.Nearest5min
ORDER BY dd.Timestamp DESC;
Daten-Verzeichnis bereinigen
Wenn SBFspot einige Monate lang läuft, werden Verzeichnisse mit Log-Dateien ziemlich voll. Mit den nachstehenden Aufrufen werden entsprechende Einträge in der crontab erstellt um die Log-Dateien die älter als 7 Tage sind zu löschen. Zuvor wurden diese Daten mit dem Backupscript allerdings auf die OMV gesichert.
Scripts zum Löschen der Log-Dateien in crontab eintragen
(crontab -l ; echo '0 1 * * * find /home/pi/smadata/logs/ -name "*.log" -mtime +7 -delete')|crontab -
(crontab -l ; echo '0 1 * * * find /home/pi/smadata/ -name "*.csv" -mtime +7 -delete')|crontab -
(crontab -l ; echo '0 1 * * * find /home/pi/solarlog/ -name "*.*" -mtime +7 -delete')|crontab -
(crontab -l ; echo '0 1 * * * find /home/pi/logs/ -name "*.log" -mtime +7 -delete')|crontab --
crontab anzeigen
*/5 6-23 * * * /usr/local/bin/sbfspot.3/daydata
55 05 * * * /usr/local/bin/sbfspot.3/monthdata
0 1 * * * find /var/log/sbfspot.3/ -name "*.log" -mtime +7 -delete
0 1 * * * find /home/pi/smadata/logs/ -name "*.log" -mtime +7 -delete
0 1 * * * find /home/pi/smadata/ -name "*.csv" -mtime +7 -delete
0 1 * * * find /home/pi/solarlog/ -name "*.*" -mtime +7 -delete
0 1 * * * find /home/pi/logs/ -name "*.log" -mtime +7 -delete
Hier gehts weiter zu 123solar PV-Monitoring einrichten