Hieronder een overzicht van alle controles die geïmplementeerd zijn.
Het komt er op neer dat er thuis 2 toestellen continue draaien
- RPI3
- Synology
Beide toestellen controleren elkaar en sturen indien nodig email alerts uit.
De RPI3 heeft ook een M/Monit webinterface waar alles visueel en met historiek kan nagekeken worden.
Het is belangrijk dat er een werkende internetverbinding aanwezig is zodat er ten alle tijde emails kunnen verstuurd worden. Ik gebruik hiervoor de mailserver van telenet (uit.telenet.be) en heb op beide toestellen een secondary dns server geconfigureerd zodat de mailserver altijd resolveable zal zijn.
Beide toestellen inclusief internetverbinding (modem / router) hangen aan een backup-UPS 650. Zo zal bij kort stroomverlies geen uitval zijn. (< 1u)
Monitoring & Checks
RPI3
- Monit Agent
- Ping checks
- cam-garage.zilverlinde.home
- cam-voordeur.zilverlinde.home
- fietology.zilverlinde.home
- onkyo.zilverlinde.home
- MySQL checks
- fietology.zilverlinde.home
- HTTP checks
- Processes
- knxd
- sshd
- monit
- Systems
- SennePi
- Ping checks
- M/Monit visualisatie
Email alerting via uit.telenet.be
Synology
Controle meetwaarden elektriciteit
Python script dat elke 5 minuten controleert indien er nieuwe meetwaarden in de database binnenkomen.
Kort samengevat kunnen we met dit script het volgende vaststellen
- De RPI3 staat aan
- KNXD service draait
- De RPI3 kan de Hager TE360 uitlezen –> de Energiemeter functioneert goed
- De DB van de synology draait en is up to date
import os import sys import datetime # Import smtplib for the actual sending function import smtplib # Import the email modules we'll need from email.mime.text import MIMEText # Vars mysqlbin="/usr/bin/mysql" mysqlhost="localhost" mysqlport="3306" mysqluser="xxx" mysqldb="xxx" mysqlpass="xxx" # File Vars MySQLOutFile = "/tmp/tmpWRdata.txt" LogOutFile = "/volume2/data/scripts/log/checkElectricity.log" DateLastMailFile = "/volume2/data/scripts/log/checkElectricity.lastmail" # Email Vars smtphost = "uit.telenet.be" me = "synology@domovea.com" you = "skitex@gmail.com" def sql(sqlcmd): os.system(mysqlbin + " -h" + mysqlhost + " -P" + mysqlport + " -u" + mysqluser + " -p" + mysqlpass + " -e " + sqlcmd) # Body # Build MySQL connection & update database try: file = open(LogOutFile, "ab") # get all added dates, on this base we will filter reports already added to DB. In this way we will never add duplicate files # sql("'use stijn_domovea; select date from DailyStats INTO OUTFILE \"/volume2/data/scripts/DomoveaStats/tmpWRdata.txt\";'") sql("'use stijn_domovea; SELECT * FROM Electricity ORDER BY id DESC LIMIT 1 INTO OUTFILE \"/tmp/tmpWRdata.txt\";'") file2 = open(MySQLOutFile, "r") lastDBEntry = file2.read() file2.close() # Remove temporary file os.remove(MySQLOutFile) #Array maken van SQL record #0: ID #1: DATE #2: TIME #3: CONSUMPTION #4: CONSUMPTIONTOTAL lastDBEntry = lastDBEntry.split('\t') #ophalen tijd waarop laatste email verstuurd is file3 = open(DateLastMailFile, "r") timelastsend = file3.read() file3.close() form = '%Y-%m-%d %H:%M:%S.%f' timels = datetime.datetime.strptime(timelastsend,form) timedelta3hours = datetime.timedelta(hours=3) timenow = datetime.datetime.today() #Controle op CONSUMPTION = 0 #Dit wordt weggeschreven indien de KNXD tool geen correcte waarde kan uitlezen van de BYS if lastDBEntry[3] == '0': print "Fout: vermogen is 0" #print unicode(timels) #print unicode(timenow) #print unicode(timedelta3hours) if timels >= timenow - timedelta3hours: print "tijd is niet ouder dan 3 uur" print "stuur geen email" else: print "tijd is ouder dan 3 uur" print "stuur email en update tijd" #stuur email body = "laatste entry: \nid: %s \ndatum: %s \ntijd: %s \nverbruik: %s watt \ntotaal: %s watt" % (lastDBEntry[0],lastDBEntry[1],lastDBEntry[2],lastDBEntry[3],lastDBEntry[4].rstrip('\n')) # Create a text/plain message msg = MIMEText(body) msg['Subject'] = 'Elektriciteit: Foutieve waarde in DB' msg['From'] = me msg['To'] = you # Send the message via our own SMTP server. s = smtplib.SMTP(smtphost) s.sendmail(me, [you], msg.as_string()) s.quit() #update tijd file3 = open(DateLastMailFile, "w+") file3.write(unicode(timenow)) file3.close() #Sluit logfile en stop script file.close() sys.exit(0) #Controle op Datum en Tijd niet ouder dan 5 minuten! sqldate = "%s %s" % (lastDBEntry[1],lastDBEntry[2]) form = '%Y-%m-%d %H:%M:%S' timeindb = datetime.datetime.strptime(sqldate, form) timedelta = datetime.timedelta(seconds=305) #de tijd in de database moet altijd groter zijn als de huidige tijd - 5 min if timeindb >= timenow - timedelta: print "tijd is niet ouder als 5 min" print timeindb print timenow logline = "OK: " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " --> " + sqldate + " --> " + lastDBEntry[3] file.write(logline) file.write(u"\r\n") else: logline = "Probleem met laatste elektriciteitswaarde in DB: " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " --> " + sqldate + " --> " + lastDBEntry[3] file.write(logline) file.write(u"\r\n") print "stuur email met oude data indien er de laatste 3 uur geen email gestuurd is." if timels >= timenow - timedelta3hours: print "tijd is niet ouder dan 3 uur" print "stuur geen email" else: print "tijd is ouder dan 3 uur" print "stuur email en update tijd" #stuur email body = "laatste entry: \nid: %s \ndatum: %s \ntijd: %s \nverbruik: %s watt \ntotaal: %s watt" % (lastDBEntry[0],lastDBEntry[1],lastDBEntry[2],lastDBEntry[3],lastDBEntry[4].rstrip('\n')) # Create a text/plain message msg = MIMEText(body) msg['Subject'] = 'Elektriciteit: Er komen geen meetwaarden meer binnen in de DB' msg['From'] = me msg['To'] = you # Send the message via our own SMTP server. s = smtplib.SMTP(smtphost) s.sendmail(me, [you], msg.as_string()) s.quit() #update tijd file3 = open(DateLastMailFile, "w+") file3.write(unicode(timenow)) file3.close() file.close() except mdb.Error, e: # truncate temporary file os.remove(MySQLOutFile) # open(MySQLOutFile, 'w').close() print "Error %d: %s" % (e.args[0],e.args[1]) sys.exit(1) finally: sys.exit(0)
Email alerting elke 3 uur via uit.telenet.be
Backup
Synology
SQL Database
Backup location /volume2/data/Domotica/Database
Backup script /volume2/data/scripts/Backup/domotica.sh
#!/bin/ash find /volume2/data/Domotica/Database -type f -mtime +365 -exec rm {} \; DBNAME=xxx DATE=`date +"%Y%m%d"` SQLFILE=$DBNAME-${DATE}.sql mysqldump --opt --user=stijn_domovea --password=xxx $DBNAME > $SQLFILE gzip $SQLFILE SQLFILE=$SQLFILE.gz mv $SQLFILE "/volume2/data/Domotica/Database/"$SQLFILE
Script houdt de laatste de backups bij van de laatste 7 dagen. De PC-living houdt via syncbackfree alle historische backups bij.
PC-living
Kritische NAS data naar interne schijf
Via SyncBackFree
- \\fietology.zilverlinde.home\data\Domotica
- \\fietology.zilverlinde.home\data\Film
- \\fietology.zilverlinde.home\data\Fotos
- \\fietology.zilverlinde.home\mobofietje
- \\fietology.zilverlinde.home\stufjes\Music
- \\fietology.zilverlinde.home\data scripts
- \\fietology.zilverlinde.home\web
Schema: Elke zondag tussen 9u ’s morgens en 18u ’s avonds. Indien gemist zo snel mogelijk uitvoeren na opstart PC.
RPI3
Weekly backup naar fietology (via NFS mounts)
NASLOCATION=/mnt/nasdata/Domotica/SennePi/backup find $NASLOCATION -type f -mtime +365 -exec rm {} \; DATE=`date +"%Y%m%d"` FILE="/tmp/BACKUPSennePi-${DATE}.tar.gz" tar -hzcvf $FILE /root mv $FILE $NASLOCATION
Edit: added tar -h option to follow symlinks. In /root heb ik enkele symlinks aangemaakt met config files die ik graag meeneem in de backup. door de parameter -h mee te geven zal mijn tar archief niet de snelkoppeling maar het volledige bestand opnemen in de backup.
root@SennePi:~ # ln -s /etc/monit/monitrc monitrc root@SennePi:~ # ln -s /var/spool/cron/crontabs/root crontab root@SennePi:~ # ln -s /etc/knxd.conf knxd
Google Drive
Meerdere lokale syncs