Anlagenbild Tomatenauswahl 123solar_raspi OMV SMA WR 123solar_web SL HP Kit pvoutput OpenWeatherMap SBFspot 123solar_org Stromzähler Bash Script Fun Daikin Solar Asola PV Module Gallery


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.

 

cd /home/pi
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.

cd /var/www/
sudo chown -R www-data:www-data 123solar
sudo usermod -a -G uucp www-data

 

Konfigurationsdatei für 123solar anlegen


sudo nano /etc/apache2/sites-available/123solar.conf

 

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.


sudo nano /etc/apache2/sites-available/000-default.conf


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


sudo htpasswd -c /var/www/123solar/config/.htpasswd admin

 

Nach der Änderung Webserver neustarten.

 

sudo service apache2 restart

 

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

sudo cp /usr/local/bin/sbfspot.3/SBFspot.cfg /usr/local/bin/sbfspot.3/SBFspot_0.cfg

 

 

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.

 

cd /home/pi/tmp/
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

sudo nano /etc/systemd/system/123solar.service

 

123solar.service

[Unit]
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

sudo systemctl enable 123solar
systemctl status 123solar.service

 

pi@himbeerix:~ $ 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 cp –R /var/www/123solar/styles/default /var/www/123solar/styles/mpsol
sudo nano /var/www/123solar/styles/mpsol/header.php

 

 

<head>
</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'>&nbsp;<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>&nbsp;<td align='right'>&nbsp;</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.

sudo chown -R www-data:www-data /var/www/123solar

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

#!/bin/bash
# #############################################################
# 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 -e


*/5 6-22 * * * sleep 15 && /home/pi/scripts/m123Upload.sh



crontab anzeigen

pi@himbeerix: ~ $/crontab -l
*/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