Checks, Monitoring & Backup

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.

mmonit

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
  • 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

  1. De RPI3 staat aan
  2. KNXD service draait
  3. De RPI3 kan de Hager TE360 uitlezen –> de Energiemeter functioneert goed
  4. 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

Plaats een reactie