123solar PV-Monitoring einrichten
123solar installieren
Benötigte Dateien123solar1.8.4.5.tar.gz und 123solar.service von github.com/jeanmarc77/123solar/ (früher 123Solar.org) downloaden und im Verzeichnis /var/www/ entpacken bzw. ins Verzeichnis /etc/systemd/system/ kopieren.
wget -c https://github.com/jeanmarc77/123solar/releases/download/1.8.4.5/123solar1.8.4.5.tar.gz
wget -c https://github.com/jeanmarc77/123solar/blob/main/misc/examples/123solar.service
sudo cp /home/pi/123solar.service /etc/systemd/system/123solar.service
cd /var/www/
sudo tar -xzf /home/pi/123solar1.8.4.5.tar.gz
Verzeichnis umgruppieren
Den user www-data in die Gruppe uucp aufnehmen.sudo chown -R www-data:www-data 123solar
sudo usermod -a -G uucp www-data
Konfigurationsdatei für 123solar anlegen
123solar.conf
<VirtualHost *:80>
DocumentRoot /var/www/123solar
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<
Directory /var/www/123solar/>
AllowOverride All
</Directory>
<
Directory /var/www/html/123solar/admin>
AuthType Basic
AuthName "admin"
AuthUserFile /var/www/html/123solar/config/.htpasswd
Require valid-user
</Directory>
123solar in der Apache-Konfigurationsdatei eintragen
Der Apache Webserver kann aus einem oder mehreren sog. VirtualHosts bestehen. Diese Hosts können wie weitere kleine, virtuelle „Unterserver“ aufgefasst werden. Wenn der Webserver mehrere Domains bzw. Subdomains bedienen soll für jede Domain ein Virtual Host in der Konfiguration angelegt werden.
Hier wird die Document-Root sowie die user/pw Authentifizierung für das Konfigurations-Modul von 123solar eingestellt.
Apache Konfiguration (000-default.conf)
GNU nano 3.2 /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
#1. Default: DocumentRoot /var/www/html
#DocumentRoot /var/www/html
#2. Funtz aber nur direkt: DocumentRoot /var/www/123solar
#3. Funzt mit Ordnerauswahl DocumentRoot /var/www
DocumentRoot /var/www
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
<Directory /var/www/123solar/admin/>
AuthType Basic
AuthName '123solar Password Protected Area'
AuthUserFile '/var/www/123solar/config/.htpasswd'
Require valid-user
</Directory>
Passwort für 123solar-Admin-Account anlegen
Nach der Änderung Webserver neustarten.
Jetzt in im browser die Seitehttp://<IP-Adresse des PI>/123solar/admin/admin.php aufrufen und die Konfiguration von 123solar fertigstellen.
Grundkonfiguration (config_main.php)

Wechselrichter (config_invt1.php)
Nach dem Speichern der Konfigurations-Datei die SBFspot-Konfiguration des Inverter-Config anpassen (hier: SBFspot_1.cfg)
Um mehrere Wechselrichter via 123solar zu visualisieren, wird für jeden Wechselrichter ein separate Konfigurationsdatei (mit der jeweilige IP-Adresse und zugehörigem Passwort) benötigt. Die Namen der Konfigurationsdateien besteht dann aus Name des Protokolls und laufende Nummer des Wechselrichters (<PROTOKOLL>_<WR_NUMMER>.cfg). Bei 3 Wechselrichtern (Protokoll SBFspot) müssen dann die Konfigurationsdateien SBFspot_0.cfg, SBFspot_1.cfg und SBFspot_2.cfg vorhanden sein.
Beim Kommunikationstest wird sbfspot mit der Option "-cfgSBFspot_0.cfg" aufgerufen (/usr/local/bin/sbfspot.3/SBFspot -finq -q -123s=DATA -cfgSBFspot_0.cfg). Deshalb muss die Konfigurationsdatei SBFspot.cfg vor dem Test als SBFspot_0.cfg kopiert werden.
Kopie der Konfigurationsdatei erstellen
Kommunikation testen
Durch den Kommunikationstest wird 123solar gestoppt und muss danach wieder gestartet werden!



SBFspot Aufruf von 123solar verzögert starten
Da 123solar in der aktuellen Einstellung alle 5 Minuten, also zeitgleich mit dem cron-Aufruf von daydata ebenfalls SBFspot startet, kann es zu Netzwerk Kollisionen kommen (siehe SBFspot Probleme durch Verbindungsabbrüche). Deshalb wird im Ordner /123solar/scripts/protocols/ eine Kopie der dortigen Protokolldatei SBFspot.php als SBFspot_mp.php erstellt und so geändert, dass der der Aufruf von SBFspot um einige Sekunden verzögert wird. In der WR-Konfiguration (config_invt1.php) wird diese anschliessend selektiert.
Script SBFspot_mp.php
<?php
/**
* /srv/http/123solar/scripts/protocols/SBFspot_mp.php
*
* @package default
*/
if (!defined('checkaccess')) {
die('Direct access not permitted');
}
// For SBFspot https://sbfspot.codeplex.com/
// Use $COMOPTION for SBFspot CSV command switches (-ad# -am# -nocsv etc)
// Timeout setup : for SBFspot timeout management by 123Solar (relies on timeout command)
$CMD_RETURN = '';
$cfgdir = realpath('../../config/'); // /srv/http/123solar/config/SBFspot_X.cfg
sleep(3); // mp20201025 verzögerter aufruf weil wr kein multicast protokol benutzt
if (!$DEBUG) {
$CMD_POOLING = 'timeout --kill-after=15s 10s /usr/local/bin/sbfspot.3/SBFspot -finq -q -123s=DATA -cfg' . $cfgdir . "SBFspot_${'ADR'.$invt_num}.cfg ${'COMOPTION'.$invt_num}";
} else {
$CMD_POOLING = 'timeout --kill-after=15s 10s /usr/local/bin/sbfspot.3/SBFspot -finq -q -123s=DATA -cfg' . $cfgdir . "SBFspot_${'ADR'.$invt_num}.cfg ${'COMOPTION'.$invt_num}";
// This output is really verbose and does not respect the 123s data frame hence why you will had no data !
//$CMD_POOLING = $timeout_setup . " SBFspot -finq -d5 -v5 -123s=DATA -cfg" . $cfgdir . "SBFspot_${'ADR'.$invt_num}.cfg ${'COMOPTION'.$invt_num}";
}
$CMD_RETURN = exec($CMD_POOLING);
$dataarray = preg_split('/[[:space:]]+/', $CMD_RETURN);
if (isset($dataarray[24])) { // SBFspot might send trames shorter than 24
if ($dataarray[24] == '>>>S123:OK') {
$SDTE = $dataarray[0];
$G1V = $dataarray[1]; // GridMs.PhV.phsA
settype($G1V, 'float');
$G1A = $dataarray[2]; // GridMs.A.phsA
settype($G1A, 'float');
$G1P = $dataarray[3]; // GridMs.W.phsA
settype($G1P, 'float');
$G2V = $dataarray[4]; // GridMs.PhV.phsB
settype($G2V, 'float');
$G2A = $dataarray[5]; // GridMs.A.phsB
settype($G2A, 'float');
$G2P = $dataarray[6]; // GridMs.W.phsB
settype($G2P, 'float');
$G3V = $dataarray[7]; // GridMs.PhV.phsC
settype($G3V, 'float');
$G3A = $dataarray[8]; // GridMs.A.phsC
settype($G3A, 'float');
$G3P = $dataarray[9]; // GridMs.W.phsC
settype($G3P, 'float');
$FRQ = $dataarray[10]; // GridMs.Hz
settype($FRQ, 'float');
$EFF = $dataarray[11]; // Value computed by SBFspot
settype($EFF, 'float');
$INVT = $dataarray[12]; // Inverter temperature - n/a for SMA inverters
settype($INVT, 'float');
$BOOT = $dataarray[13]; // Booster temperature - n/a for SMA inverters
settype($BOOT, 'float');
$KWHT = $dataarray[14]; // Metering.TotWhOut (kWh)
settype($KWHT, 'float');
$I1V = $dataarray[15]; // DcMs.Vol[A]
settype($I1V, 'float');
$I1A = $dataarray[16]; // DcMs.Amp[A]
settype($I1A, 'float');
$I1P = $dataarray[17]; // DcMs.Watt[A]
settype($I1P, 'float');
$I2V = $dataarray[18]; // DcMs.Vol[B]
settype($I2V, 'float');
$I2A = $dataarray[19]; // DcMs.Amp[B]
settype($I2A, 'float');
$I2P = $dataarray[20]; // DcMs.Watt[B]
settype($I2P, 'float');
if ($KWHT > 0) { // Avoid null values at early startup
$RET = 'OK';
} else {
$RET = 'NOK';
}
} else {
$RET = 'NOK';
}
} else {
$RET = 'NOK';
}
?>
PVOutput-Konfiguration (config_pvoutput.php)

Autostart von 123Solar einrichten
Damit nach einem Neustart des PI 123Solar ebenfalls automatisch gestartet wird muss der entsprechende Service erstellt werden. Einfacher gehst wenn der fertige Service von github.com/jeanmarc77/123solar/ heruntergeladen und entsprechend angepasst wird. Um einen sicheren Start zu gewährleisten sollte der Start um 10 Sekunden verzögert werden.
Falls noch nicht geschehen, jetzt den 123solar.service von github.com downloaden und ins Verzeichnis /etc/systemd/system/ kopieren.
wget -c https://github.com/jeanmarc77/123solar/blob/main/misc/examples/123solar.service
sudo cp /home/pi/tmp/123solar.service /etc/systemd/system/123solar.service
Start-Verzögerung in der Service-Datei 123solar.service eintragen
123solar.service
Description=123Solar
Requires=network.target
After=network-online.target nginx.service php-fpm.service
StartLimitIntervalSec=60
StartLimitBurst=5
[Service]
Type=simple
WorkingDirectory=/var/www/123solar/scripts/
ExecStart=/usr/bin/php 123solar.php
# force PIDFILE see 'man systemd.service'
ExecStartPost=/bin/sh -c 'systemctl show -p MainPID --value 123solar.service > /var/www/123solar/scripts/123solar.pid'
ExecStopPost=/usr/bin/rm -f /var/www/123solar/scripts/123solar.pid
User=www-data
Group=www-data
Restart=always
RestartSec=30s
#Since version 7.4 php-fpm is hardened
ReadWritePaths = /var/lock
[Install]
WantedBy=default.target
123solar Start Service aktivieren und überprüfen
systemctl status 123solar.service
pi@himbeerix:~ $ sudo systemctl enable 123solar
pi@himbeerix:~ $ systemctl status 123solar
● 123solar.service - 123Solar
Loaded: loaded (/etc/systemd/system/123solar.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Jun 04 17:31:03 himbeerix systemd[1]: Starting 123Solar...
Jun 04 17:31:13 himbeerix curl[643]: % Total % Received % Xferd Average Speed Time Time
Jun 04 17:31:13 himbeerix curl[643]: Dload Upload Total Spent
Jun 04 17:31:14 himbeerix curl[643]: [237B blob data]
Jun 04 17:31:14 himbeerix systemd[1]: 123solar.service: Succeeded.
Jun 04 17:31:14 himbeerix systemd[1]: Started 123Solar.
lines 1-10/10 (END)
pi@himbeerix:~ $
Webseiten Header anpassen
Die Webseite von 123solar (/var/www/123solar/index.php) wird via vorgeschalteter Webseite (/var/www/index.html) aufgerufen. Um von dort zurückzukommen wird im Header von 123Solar ein zusätzliche Button „Home“ benötigt. Deshalb wird unter Styles eine Kopie des vorhandene Ordner „default“ als „mpsol“ abgelegt und dem Kopfbereich (header.php) der „Home“-Button („<b><a href='../'>Home</a></b> ||“ ) hinzugefügt.

Style kopieren und Header (mpsol) anpassen
sudo nano /var/www/123solar/styles/mpsol/header.php
</head>
<body>
<table width="95%" border=0 cellspacing=0 cellpadding=0 align="center">
<tr bgcolor="#FFFFFF" height=64>
<td class="cadretopleft" width=128><img src="styles/mpSol/images/sun6048.png" width=60 alt="123Solar"></td>
<td class="cadretop" align="center"><b><?php echo "$TITLE";?></b><br><font size="-1"><?php echo "$SUBTITLE";?></font></td>
<td class="cadretopright" width=128 align="right"></td>
</tr>
<tr bgcolor="#CCCC66" valign="top">
<td COLSPAN=3 class="cadre">
<div class="menu">
<font class="menu">
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td align='left'> <b>< a href='../'>Home</a ></b> || <a href="index.php"><?php echo "$lgMINDEX";?></a>
<?php
if ($NUMINV>1) {
for ($i=1;$i<=$NUMINV;$i++) {
echo " | <a href='index.php?selectinvt=$i'>$lgINVT$i</a>";
}
}
?>
| <a href="detailed.php"><?php echo "$lgMDETAILED";?></a> | <a href="production.php"><?php echo "$lgMPRODUCTION";?></a> | <a href="comparison.php"><?php echo "$lgMCOMPARISON";?></a> | <a href="info.php"><?php echo "$lgMINFO";?></a> || <a href='admin/'>admin</a> <td align='right'> </td>
</tr>
</table>
</font>
</td></tr>
<tr valign="top">
<td COLSPAN=3 class="cadrebot" bgcolor="#d3dae2">
!-- #BeginEd itable "mainbox" -->
Anschließend sicherstellen, dass der Ordner „mpsol“ dem user www-data zugeordnet ist.
Auf der Konfigurationsseite von 123Solar kann dann der Style entsprechend ausgewählt werden.

Der eingefügten Home-Button steht dann im Header zur Verfügung.


Rekonstruieren fehlender 123-CSV-Dateien
Sobald 123Solar aktiviert ist werden die aktuellen Daten (seit Aktivierung 123solar) aus der SBFspot-DB gelesen und im Ordner /etc/www/123solar\data\invt1\ als csv-Datei abgelegt und entsprechend visualisiert. Werte die vor dem Zeitpunkt der Aktivierung liegen werden nicht berücksichtigt. Um diese „historischen“ Daten ebenfalls in 123solar zu sehen müssen die entsprechenden CSV-Dateien manuell bzw. mit Script erzeugt werden. Mit dem Script 123repair.sh das sich im Ordner /home/pi/scripts/befindet, werden die fehlenden Spot-Daten aus SBFspot.db ausgelesen und als csv-Datei unter /home/pi/tmp gespeichert und nach Überprüfung in den Ordner /etc/www/123solar\data\invt1 kopiert werden. Ggf. muss noch der Owner der Dateien angepasste werden. (sudo –R chown www-data:www-data 123solar).
Script 123repair.sh
# #############################################################
# 123repair.sh Vers. _new4
# script um fehlende 123-csv-dateien zu generieren
# Quelle - vwAvgSpotdata und vwSpotdata
# Ausgabe als tagesdatei im format YYYYMMDD_4.csv
#
#
#############################################################
JAHR=2020
MONAT=01
TAG=01
read -p "Jahr:" JAHR
read -p "Monat:" MONAT
read -p "Tag:" TAG
Datum0=`date +$JAHR-$MONAT-$TAG`
Datum1=$JAHR'-'$MONAT'-'$TAG' 00:00:00'
Datum2=$JAHR'-'$MONAT'-'$TAG' 23:59:59'
SMADB=/home/pi/smadata/SBFspot.db
CSVFILE=/home/pi/tmp/`date +$JAHR$MONAT$TAG`_4.csv
CMDFILE=/home/pi/tmp/mp_123repair
TMPFILE=/home/pi/tmp/tmp.csv
echo"Time,I1V,I1A,I1P,I2V,I2A,I2P,I3V,I3A,I3P,I4V,I4A,I4P,G1V,G1A,G1P,G2V,G2A,G2P,G3V,G3A,G3P,FRQ,EFF,INVT,BOOT,SR,KWHT">>$CSVFILE
echo .header off >$CMDFILE
echo .separator , >>$CMDFILE
echo .mode csv >>$CMDFILE
echo .output $TMPFILE >>$CMDFILE
echo "select time(ad.Nearest5min),ad.Udc1,ad.Idc1,ad.Pdc1,ad.Udc2,ad.Idc2,ad.Pdc2,NULL,NULL,NULL,NULL,NULL,NULL,ad.Uac1, ad.Iac1,ad.Pac1,ad.Uac2,ad.Iac2,ad.Pac2,ad.Uac3,ad.Iac3,ad.Pac3,sd.Frequency,NULL,NULL,NULL,sd.Serial, ((sd.ETotal*1.0)/1000) from vwavgSpotData as ad join vwSpotdata as sd on ad.Nearest5min=sd.Nearest5min where ad.Nearest5min >=\""$Datum1"\" and ad.Nearest5min <\""$Datum2"\" order by ad.Nearest5min ;" >>$CMDFILE
echo .quit >>$CMDFILE
sudo sqlite3 $SMADB <$CMDFILE
sudo cat $TMPFILE >> $CSVFILE
ls -l $CSVPATH
Upload auf externen Server einrichten
Die lokal auf dem Raspberry Pi vorhandenen 123solar-Daten sollen zusätzlich auf einen externen Webserver (https://himbeerix.12hp.de) übertragern werdern. Hierzu wird das script m123Upload.sh erstellt und per cron aufgerufen.
Script m123Upload.sh
#!/bin/bash
#
#############################################################
# m123Upload.sh
# script kopiert die aktuellen Daten im 123solar-Format
# auf den Webserver
#
#############################################################
LOGFILE=/home/pi/logs/m123Upload_`date +%Y-%m-%d`.log
date >> $LOGFILE
#echo "Starte Script m123Upload.sh " >> $LOGFILE
############################################################
## upload der 123solar-Daten zur webseite https://himbeerix.12hp.de/
##
## ftp-server=ftp://himbeerix.lima-ftp.de
##
## zielverzeichnis=default-website/123solar/data/invt1/csv
## zielverzeichnis=default-website/123solar/data/invt1/production
## user=himbeerix
## pw=eHHXHRk2Pv
####################w########################################
HOST='ftp://himbeerix.lima-ftp.de'
USER='*********'
PASS='************'
TARGETFOLDER='/default-website/123solar/data/invt1'
SOURCEFOLDER='/var/www/123solar/data/invt1/'
#echo "Starte Upload der 123-Dateien zu $HOST " >> $LOGFILE
lftp -f "
open $HOST
user $USER $PASS
lcd $SOURCEFOLDER
mirror --reverse --verbose $SOURCEFOLDER $TARGETFOLDER
bye
"
# >> $LOGFILE
#echo "Upload der 123-Dateien zu $HOST beendet" >> $LOGFILE
#date >> $LOGFILE
#echo "Ende script m123Upload.sh " >> $LOGFILE
#echo -e "\n--------------\n" >> $LOGFILE
Script m123Upload.sh in crontab eintragen
crontab anzeigen
*/5 6-23 * * * /usr/local/bin/sbfspot.3/daydata
55 05 * * * /usr/local/bin/sbfspot.3/monthdata
*/5 6-22 * * * sleep 15 && /home/pi/scripts/m123Upload.sh
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 Datensicherung und weitere Optimierungen
