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


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:



min120508.js
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:

days_hist.js
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:

months.js
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:

years.js
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:


sqlite3 /home/pi/smadata/SBFspot.db

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

 

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

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

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

crontab -e


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


crontab anzeigen

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