Ertragsdaten zusätzlich im Solarlog-Format bereitstellen
Dateien und Aufbau des Solarlog-Formats
Beim Solarlog-Format werden die Ertrags-Daten im Wesentlichen in vier verschiedenen Dateien für Tages- Monats- und Jahres-Ertrag bereitgestellt, und zwar die Datei "minyyMMDD.js" für den Tagesertrag im 5-Minuten Intervall sowie die Dateien "days_hist.js", "months.js" und "years.js" für die Tages-, Monats- und Jahres-Historie.Tagesertrag im 5-Minuten Intervall minyyMMDD.js (z.B. min120508.js)
Es wird pro Tage eine Datei benötigt. Diese Dateien enthalten die fortlaufend Messwerte des jeweiligen Tages im 5-Minuten-Intervall (in absteigender Reihenfolge), d.h. alle 5 Minuten wird eine neue Zeile mit folgendem Zeilenaufbau hinzugefügt:| Kennung | Datum Uhrzeit | PAC | PDC | PDC2 | Tages-Summe | UDC1 | UDC2 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TT.MM.yy HH:MM:SS | [W] | [W] | [W] | [Wh] | [V] | [V] | |||||||||
| m[mi++]= | “ | 08.05.12 15:35:00 | | | 4768 | ; | 2520 | ; | 2462 | ; | 28102 | ; | 464 | ; | 463 | “ |
| m[mi++]= | “ | 08.05.12 15:30:00 | | | 5114 | ; | 2700 | ; | 2645 | ; | 27686 | ; | 468 | ; | 467 | “ |
| m[mi++]= | “ | 08.05.12 15:25:00 | | | 3564 | ; | 1904 | ; | 1853 | ; | 27261 | ; | 466 | ; | 466 | “ |
Gesamt-Tagesertrag je Tag (days_hist.js)
Die Datei days_hist.js enthält die Tageswerte aller vergangenen Tage (in absteigender Reihenfolge), d.h. am Tagesende bzw. nach Sonnenuntergang wird jeweils eine neue Zeile mit folgendem Zeilenaufbau hinzugefügt:| Kennung | Datum | Tagesertrag | Max PAC des Tages | ||||
|---|---|---|---|---|---|---|---|
| TT.MM.YYYY | [Wh] | [W] | |||||
| da[da++]= | “ | 19.06.2020 | | | 1689 | ; | 1236 | “ |
| da[da++]= | “ | 18.06.2020 | | | 46279 | ; | 7428 | “ |
| da[da++]= | “ | 17.06.2020 | | | 21077 | ; | 6912 | “ |
Monatsertrag (months.js)
Die Datei enthält den jeweiligen Monatsertrag bis zum aktuellen Tag (in absteigender Reihenfolge). Die Datei wird täglich mit folgendem Zeilenaufbau aktualisiert:| Kennung | Datum | Monatsertrag | |||
|---|---|---|---|---|---|
| TT.MM.yy | [Wh] | ||||
| mo[mx++]= | “ | 26.09.20 | | | 758239 | " |
| mo[mx++]= | “ | 31.08.20 | | | 1007000 | " |
| mo[mx++]= | “ | 31.07.20 | | | 1274000 | " |
Jahresertrag (years.js)
Die Datei enthält den Jahresertrag (in absteigender Reihenfolge). Die Datei wird täglich mit folgendem Zeilenaufbau aktualisiert:| Kennung | Datum | Monatsertrag | |||
|---|---|---|---|---|---|
| TT.MM.YYYY | [Wh] | ||||
| ye[yx++]= | “ | 31.12.2019 | | | 8557620 | " |
| ye[yx++]= | “ | 31.12.2018 | | | 8672925 | " |
| ye[yx++]= | “ | 31.12.2017 | | | 8399968 | " |
DB View für Solarlog-Daten erstellen
Um die aktuellen Daten in das Solarlog-Format zu konvertieren wird ein zusätzlicher View (vwSolarlogData) benötigt mit dem die Werte entsprechend konvertiert werden können:Sqlite starten und den nachstehenden Inhalt des Views via (cut u. paste) einfügen und ausführen
View vwSolarlogData
DROP VIEW IF EXISTS vwSolarlogData;
CREATE VIEW vwSolarlogData AS
SELECT dd.Timestamp,
CASE WHEN dd.Power > 8500
THEN 0
ELSE
dd.Power
END AS PAC,
CASE WHEN spot.Pdc1 is Null
THEN 0
ELSE
spot.pdc1
END AS PDC1,
CASE WHEN spot.Pdc2 is Null
THEN 0
ELSE
spot.pdc2
END AS PDC2,
dd.TotalYield AS DaySum,
CASE WHEN spot.udc1 is Null
THEN 0
ELSE
spot.udc1
END AS UDC1,
CASE WHEN spot.udc2 is Null
THEN "0"
ELSE
spot.udc2
END AS UDC2
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;
Scripts zur Erstellung der Solarlog-Daten
Die Erstellung der Solarlog-Dateien erfolgt durch die vier scripts mSolToday.sh, mSolDayhist.sh, mSolMonths.sh und mSolYears.sh die per cron gestartet werden. Die Solarlogdaten werden auf derm Raspberry Pi im Verzeichnis =/home/pi/solarlog/mpsol/ abgelegt und nach Sonnenuntergang per Backup-Skript (siehe Datensicherung) zusammen mit den 123solar-Daten auf dem OMV-NAS gesichert.Mit den script mSolUpload werden die erzeugten Solarlog-Dateienauf den externen Webserver "himbeerix.12hp.de" übertragen.
Script mSolToday.sh
#!/bin/bash
#
##############################################################################
# mSolToday.sh
# script generiert aus SBFspot.db die solarlog-dateien vom aktuellen Tag
##############################################################################
LOGFILE=/home/pi/logs/mSol`date +%Y-%m-%d`.log
date >> $LOGFILE
echo "Starte Script mSolToday.sh " >> $LOGFILE
###################w###########################################################
#--- als erstes die ggf. zu grossen werte in der DB-tabelle daydata loeschen
###################w###########################################################
SMADB=/home/pi/smadata/SBFspot.db
CLRFILE=/home/pi/sol_tmp/cleanup.cmd
CLRLOG=/home/pi/logs/cleanup.log
echo "In der DB $SMADB wird die Tabelle Daydata geprüft und ggf. bereinigt: " >> $LOGFILE
echo .header on >$CLRFILE
echo .mode list >>$CLRFILE
echo .separator ";" >>$CLRFILE
echo .output $CLRLOG >>$CLRFILE
echo "select date(TimeStamp, 'unixepoch'),* from daydata where power>1205987;" >> $CLRFILE
echo "update daydata set power=0 where power>1205987;" >> $CLRFILE
echo .quit >> $CLRFILE
#sudo sqlite3 $SMADB <$CLRFILE
sqlite3 $SMADB <$CLRFILE
cat $CLRLOG >> $LOGFILE
date >> $LOGFILE
echo "Ende Prüfung/Bereinigung Tabelle Daydata " >> $LOGFILE
##############################################################################
#--- jetzt die solarlogdaten erstellen
##############################################################################
SMADB=/home/pi/smadata/SBFspot.db
CMDFILE=/home/pi/sol_tmp/mSolToday.cmd
TODAYSQL=`date +'%Y-%m-%d'`
MINFILE="/home/pi/solarlog/min`date +'%y%m%d'`.js"
date >> $LOGFILE
echo "Solarlog 5-Minuten-Daten werden erstellt als: $MINFILE" >> $LOGFILE
DAYS_MIN=$(sqlite3 $SMADB "select min(daysum) from vwSolarlogdata where substr(TimeStamp,1,10)=='$TODAYSQL'")
echo .header off > $CMDFILE
echo .mode list >> $CMDFILE
echo .separator ";" >> $CMDFILE
echo .output $MINFILE >> $CMDFILE
echo " select 'm[mi++]=\"'||strftime('%d.%m.',timestamp)||substr(timestamp,3,2)|| strftime(' %H:%M:%S',timestamp) ||'|' ||PAC||';'||cast(pdc1 as integer)||';'||cast(pdc2 as integer)||';'||(daysum-($DAYS_MIN))||';'||cast(udc1 as integer)||';'||cast(udc2 as integer)||'\"' from vwSolarlogdata where substr(TimeStamp,1,10)==\""$TODAYSQL"\";" >>$CMDFILE
echo .quit >> $CMDFILE
#sudo sqlite3 $SMADB < $CMDFILE
sqlite3 $SMADB < $CMDFILE
echo "Solarlog 5-Minuten-Daten wurden erstell" >> $LOGFILE
date >> $LOGFILE
echo "Ende Script mSolToday.sh " >> $LOGFILE
echo -e " \n--------------\n " >> $LOGFILE
Script mSolDayhist.sh
#
#########################################################
# --mSolDayhist.sh ---
#--- Solarlog Tagesdatei days.js und Tageshistorie day_hist.js generieren
#
# zielformat: da[dx++]="25.03.20|5980;1204"
#
##########################################################
LOGFILE=/home/pi/logs/mSol`date +%Y-%m-%d`.log
date >> $LOGFILE
echo "Starte script mSolDayhist.sh " >> $LOGFILE
SMADB=/home/pi/smadata/SBFspot.db
CMDFILE=/home/pi/sol_tmp/dayshist.cmd
DAY_FILE="/home/pi/solarlog/days.js"
HST_FILE="/home/pi/solarlog/days_hist.js"
TMP_FILE="/home/pi/sol_tmp/days_hist_tmp.txt"
echo "Solarlog Tagesdatei: $DAY_FILE und Tageshistorie: $HST_FILE wird erstellt" >> $LOGFILE
TODAYSQL=`date +'%Y-%m-%d'`
echo .header off > $CMDFILE
echo .mode list >> $CMDFILE
echo .separator ";" >> $CMDFILE
echo .output $DAY_FILE >> $CMDFILE
echo "select 'da[dx++]=\"'||strftime('%d.%m.',date(timestamp,'unixepoch'))||substr(strftime('%Y',datetime(TimeStamp,'unixepoch')) ,3,2) ||'|'|| cast(max(Totalyield) - min(Totalyield) as text), max(power) ||'\"' from daydata where date(TimeStamp,'unixepoch')==\""$TODAYSQL"\";" >> $CMDFILE
echo .quit >> $CMDFILE
sqlite3 $SMADB < $CMDFILE
FIRST_LINE=$(head -n1 $HST_FILE)
FILE_DATUM=${FIRST_LINE:10:8}
DATUM=`date +'%d.%m.%y'`
#echo "erste zeile: $FIRST_LINE " >> $LOGFILE
#echo "datum der ersten zeile: $FILE_DATUM " >> $LOGFILE
#echo "datum von heute : $DATUM " >> $LOGFILE
if [ "$DATUM" = "$FILE_DATUM" ];
then
#echo "eintrag von Heute bereits vorhanden, erst ab zeile zwei uebernehmen" >> $LOGFILE
#echo " $HST_FILE als $TMP_FILE ab zerile zwei uebernehmen" >> $LOGFILE
tail +2 $HST_FILE > $TMP_FILE
else
#echo "$HST_FILE kopieren nach $TMP_FILE " >> $LOGFILE
cp $HST_FILE $TMP_FILE
fi
cat $DAY_FILE $TMP_FILE > $HST_FILE
echo "Solarlog Tages-Datei und Tageshistorie wurde erstellt" >> $LOGFILE
date >> $LOGFILE
echo "Ende script mSolDayhist.sh " >> $LOGFILE
echo -e "\n--------------\n" >> $LOGFILE
Script mSolMonth.sh
#!/bin/bash
#
#############################################################################
# mSolMonths.sh
# solarlog-monatsertrag-datei months.js aktualisieren
#
# zielformat: mo[mx++]="24.10.20|313053" monatsertrag bisd zum aktuellen tag
# mo[mx++]="30.09.20|839526" monatsertrag bis zum monatsende
#
# startdatum 01.aktueller monat.jahr
# min_daysum ermitteln vom startdaytum
# max_daysum ermitteln alles > startdatum
# monatertrag = max -min
# zeile schreiben
# wenn aktueller tag == 01 dann zeile als erste zeile zu month.js zufügen
# sonst zeile als austauschen .. cat +2 eile + tail +2 month.js
#
##############################################################################
LOGFILE=/home/pi/logs/mSol`date +%Y-%m-%d`.log
date >> $LOGFILE
echo "Starte script mSolMonths.sh " >> $LOGFILE
TAG=$(date +'%d')
MONAT=$(date +'%m')
JAHR=$(date +'%y')
SMADB=/home/pi/smadata/SBFspot.db
CMDFILE=/home/pi/sol_tmp/mSolMonths.cmd
MON_FILE="/home/pi/solarlog/months.js"
TMP_FILE="/home/pi/sol_tmp/months_tmp.txt"
NEW_FILE="/home/pi/sol_tmp/months_new.txt"
STARTSQL=`date +'%Y-%m-01'`
echo "Solarlog Monatserträge werden aktuallisiert als $MON_FILE " >> $LOGFILE
min_daysum=$(sqlite3 $SMADB "select min(totalyield) from daydata where date(TimeStamp,'unixepoch')>='$STARTSQL'")
max_daysum=$(sqlite3 $SMADB "select max(totalyield) from daydata where date(TimeStamp,'unixepoch')>='$STARTSQL'")
echo 'mo[mx++]="'$TAG.$MONAT.$JAHR'|'$(($max_daysum-$min_daysum))'"' > $NEW_FILE
if [ $TAG -eq "01" ]
then
#echo "es ist der erster tag im monat, alle zeilen uebernehmen"
cat $MON_FILE > $TMP_FILE
else
#echo " es ist nicht der erste tag im monat, ab zeile zwei uebernehmen"
tail +2 $MON_FILE > $TMP_FILE
fi
cat $NEW_FILE $TMP_FILE > $MON_FILE
date >> $LOGFILE
echo "Ende script mSolMonths.sh " >> $LOGFILE
echo -e "\n--------------\n" >> $LOGFILE
Script mSolYears.sh
#
#########################################################
# mSolYears.sh
# solarlog-jahresertrag-datei years.js aktualisieren
#
# zielformat: ye[yx++]="24.10.20|8450000" jahresertrag bis zum aktuellen tag
# ye[yx++]="31.12.19|8557620" jahresertrag bis zum jahresende
#
##########################################################
LOGFILE=/home/pi/logs/mSol`date +%Y-%m-%d`.log
date >> $LOGFILE
echo "Starte script mSolYears.sh " >> $LOGFILE
TAG=$(date +'%d')
MONAT=$(date +'%m')
JAHR=$(date +'%y')
SMADB=/home/pi/smadata/SBFspot.db
CMDFILE=/home/pi/sol_tmp/mSolYears.cmd
YRS_FILE="/home/pi/solarlog/years.js"
TMP_FILE="/home/pi/sol_tmp/years_tmp.txt"
NEW_FILE="/home/pi/sol_tmp/years_new.txt"
STARTSQL=`date +'%Y-01-01'`
echo "Solarlog Jahresserträge werden aktuallisiert als $YRS_FILE " >> $LOGFILE
min_sum=$(sqlite3 $SMADB "select min(totalyield) from monthdata where date(TimeStamp,'unixepoch') >= '$STARTSQL'")
max_sum=$(sqlite3 $SMADB "select max(totalyield) from monthdata where date(TimeStamp,'unixepoch') >= '$STARTSQL'")
echo "Prüfdatum= $STARTSQL " >> $LOGFILE
echo "max= $max_sum " >> $LOGFILE
echo "min= $min_sum " >> $LOGFILE
echo "Differenz = $(($max_sum-$min_sum))" >> $LOGFILE
echo 'ye[yx++]="'$TAG.$MONAT.$JAHR'|'$(($max_sum-$min_sum))'"' > $NEW_FILE
if [ $TAG -eq "01" ]
then
if [ $MONAT -eq "01" ]
then
#echo "es ist der erster tag im ersten monat, alle zeilen uebernehmen" >> $LOGFILE
cat $YRS_FILE > $TMP_FILE
fi
else
#echo " es ist nicht der erste tag im monat, ab zeile zwei uebernehmen" >> $LOGFILE
tail +2 $YRS_FILE > $TMP_FILE
fi
cat $NEW_FILE $TMP_FILE > $YRS_FILE
date >> $LOGFILE
echo "Ende script mSolYears.sh " >> $LOGFILE
echo -e "\n--------------\n" >> $LOGFILE
Script mSolUpload.sh
#
##########################################################
# mSolUpload.sh
# script kopiert die aktuellen Daten im Solarlog-Format
# auf die entsprechenden Webserver/webspace
#
##########################################################
## upload der solarlog-Daten zur webseite home.solarlog-web.de
##
## ftp-server=ftp://home.solarlog-web.de
##
## zielverzeichnis=default-website/daten
## user=***** (siehe keepass)
## pw=******* (siehe keepass)
#####################w####################################
LOGFILE=/home/pi/logs/mSol`date +%Y-%m-%d`.log
date >> $LOGFILE
echo "Starte script mSolUpload.sh " >> $LOGFILE
HOST='ftp://home.solarlog-web.de'
USER='*********'
PASS='**********'
TARGETFOLDER='/'
SOURCEFOLDER='/home/pi/solarlog'
echo "Starte Upload der Solarlog-Dateien zu $HOST " >> $LOGFILE
lftp -f "
open $HOST
user $USER $PASS
lcd $SOURCEFOLDER
mirror --reverse --verbose $SOURCEFOLDER $TARGETFOLDER >> $LOGFILE
bye
" >> $LOGFILE
echo "Upload der Solarlog-Dateien zu $HOST beendet" >> $LOGFILE
####################w########################################
## upload der solarlog-Daten zur webseite https://himbeerix.12hp.de/
##
## ftp-server=ftp://himbeerix.lima-ftp.de
##
## zielverzeichnis=default-website/slog_daten
## user=***** (siehe keepass)
## pw=******* (siehe keepass)
####################w########################################
HOST='ftp://himbeerix.lima-ftp.de'
USER='********'
PASS='************'
TARGETFOLDER='/default-website/slog_daten'
SOURCEFOLDER='/home/pi/solarlog'
echo "Starte der Solarlog-Dateien Upload zu $HOST " >> $LOGFILE
lftp -f "
open $HOST
user $USER $PASS
lcd $SOURCEFOLDER
mirror --reverse --verbose $SOURCEFOLDER $TARGETFOLDER >> $LOGFILE
bye
" >> $LOGFILE
echo "Upload der Solarlog-Dateien zu $HOST beendet" >> $LOGFILE
date >> $LOGFILE
echo "Ende script mSolUpload.sh " >> $LOGFILE
echo -e "\n--------------\n" >> $LOGFILE
Scripte in crontab eintragen
10 22 * * * /home/pi/scripts/mSolDayhist.sh
12 22 * * * /home/pi/scripts/mSolMonths.sh
14 22 * * * /home/pi/scripts/mSolYears.sh
20 22 * * * /home/pi/scripts/mSolUpload.sh
crontab anzeigen
*/5 6-23 * * * /usr/local/bin/sbfspot.3/daydata
55 05 * * * /usr/local/bin/sbfspot.3/monthdata
05 22 * * * /home/pi/scripts/mSolToday.sh
10 22 * * * /home/pi/scripts/mSolDayhist.sh
12 22 * * * /home/pi/scripts/mSolMonths.sh
14 22 * * * /home/pi/scripts/mSolYears.sh
20 22 * * * /home/pi/scripts/mSolUpload.sh
*/5 6-22 * * * sleep 15 && /home/pi/scripts/m123Upload.sh
30 22 * * * /home/pi/scripts/bkup_mpsol.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 zurück zu Home