Gasmeter in Hager Domovea

2017-12-09 10_32_24-Configuratie software voor Domovea

1: Cumulatieve waarde
Totaal verbruik op KNX bus in m³

2: Momentane waarde
Actief verbruik op KNX bus in m³ / uur

3: Stapgrootte
Aangezien ik tot 2 cijfers na de komma als 1 decimaal getal op de bus verstuur dien ik de stapgrootte aan te passen van 1 naar 0.01. Bv: 670125 op de KNX bus is 6701,25 m³

De correcte momentane waarde visualiseren was een ander paar mouwen. Het moeilijkste stuk was achterhalen welke waarde de Hager TJA450 gebruikt om het momentaan gasverbruik uit te lezen. Na het uittesten van verschillende bus writes via de domovea configuration tool (automatisering) ben ik erachter gekomen dat er een 4 bytes float waarde nodig is vooraleer de Gauss meter in beweging treedt.

2017-12-09 22_45_02-Configuratie software voor Domovea

Na het testen van de verschillende datapoints had ik eindelijk succes met de 4 bytes Float value.

Hier merkte ik ook op dat na het verzenden van de waarde 1 de Gauss meter in de visualisatie 3600 m³ gas aangaf. Dit nam ik mee voor de latere berekening dat ik hoogstwaarschijnlijk nog eens mijn momentaan verbruik zal moeten delen door 3600 (of vermenigvuldigen met 0.000278)

Een 2de obstakel was mijn float waarde van het momentane verbruik omzetten naar een hexadecimale waarde. Ook dit heb ik uiteindelijk kunnen verwezenlijken door het gebruik van een python scriptje. Vanuit bash roep ik een python functie op en gebruik de return value ervan als hexadecimale waarde.

Het script loopt via crontab elke minuut en zal 5x dezelfde waarde in deze minuut op de bus uitsturen (elke 10 seconden). 1 update van het momentaan gasverbruik per minuut lijkt me voldoende. De reden om de waarde elke 10 seconden op de bus uit te sturen is omdat de domovea visualisatie na 20 seconden > durft terug te vallen op 0.

Gebruikte scripts:

crontab config

crontab -e
*/1 * * * * /root/scripts/knxScripts/gasToBus.sh

Bash script

#!/bin/bash
# Uitlezen gaswaarde via TRC5000 en RPI3
# Via crontab elke minuut momentaan verbruik starten, dit script zal 5x 10 seconden slapen en dezelfde waarde versturen
log="/root/logs/gasToBus.log"

# ophalen huidig gasverbruik
consumption=$(</var/run/shm/gascounter)

# ophalen vorig gasverbruik
pconsumption=$(</root/scripts/knxScripts/gasToBus.lastdata)

# berekenen nieuw verbruik
nconsumption=$(expr $consumption - $pconsumption)

# omzetten naar m^3/h
# script loopt elke 60 seconden
# 0,01 = 1 puls
# nconsumption = aantal nieuwe pulsen in 1 minuut
# nconsumption x 60 = aantal pulsen / uur
# hconsumption = hourly consumption
# 1/3600 = 0,000278 => 4 byte floatwaarde hourly consumption
hconsumption=$(echo $nconsumption*60/100 | bc -l)
hconsumption=$(echo $hconsumption*0.000278 | bc -l)

#afronden niet nodig
#hrconsumption=$(echo "($hconsumption)/6" | bc)

hexbusformat=`python /root/scripts/knxScripts/floatToHex.py "$hconsumption"`

#echo "$hrconsumption -> $whex"
#printf -v hexconsumption "%08x" "$hrconsumption"
#hexbusformat=$(echo $hexconsumption | sed 's/.\{2\}/& /g')

#echo "$(date "+%Y%m%d %T") Wegschrijven momentaan verbruik op KNX bus 4/6/16 -> dec: $hconsumption -> hex: $hexbusformat" >> $log
for i in {1..5}
do
 knxtool groupwrite local:/run/knx 4/6/16 $hexbusformat
 #echo "$(date "+%Y%m%d %T") iteratie $i -> write $hexbusformat done" >> $log
 sleep 10
done

# wegschrijven van nieuwe lastdata
#echo "$(date "+%Y%m%d %T") wegschrijven momentaan verbruik naar lastdata > $consumption" >> $log
echo $consumption > /root/scripts/knxScripts/gasToBus.lastdata
echo "$(date "+%Y%m%d %T") 5x groupwrite 4/6/16 -> $hexbusformat" >> $log

Python script

#!/usr/bin/python
import struct
import os
import sys
def float_to_hex(f):
return hex(struct.unpack('<I', struct.pack('<f', f))[0])
whex = float_to_hex(float(sys.argv[1]))
whex = whex.replace('0x','')
whex=' '.join([whex[i:i+2] for i in range(0, len(whex), 2)])
if whex == "0":
print "00 00 00 00"
sys.exit(0)
else:
print whex
sys.exit(0)

#whex = float_to_hex(0.000556)
#print whex
#plaats hexadecimaal telegram op de bus (via bash commando)
#wcommand = "knxtool groupwrite local:/run/knx 4/6/16 " + whex
#os.system(wcommand)

 

Het resultaat:

2017-12-09 22_56_53-Domovea2017-12-09 22_57_04-Domovea

Gas & waterteller op RPI

Gebruikt materiaal

  • DIY Hall Switch Hall Sensor Module for Smart Car – Blue
  • RPI3
  • Verlengde dupont kabeltjes

 

Foto van de Hall Sensor

Er werd voor een Hall sensor gekozen omdat een reed sensor onderhevig is aan metaalmoeheid.

In mijn eerste testopstelling maakte ik gebruik van een TCR5000 dit is een optische infrarood LED. De idee was om het blinkende embleempje onder de 6 van mijn gasteller uit te lezen maar omwille van het plexiglas en het miniscule embleempje was het niet mogelijk om de weerkaatsing in orde te krijgen.

2017-12-07 14_26_02-config - Word

Foto van een optische TCR5000 infrarood reflector

 

UPDATE: Met heel veel toeval heb ik alsnog de correcte positie van de TCR5000 op de gasmeter gevonden. Plexiglas is ook niet onderhevig aan de weerkaatsing van het infraroodlicht. 

20171209_091457.jpg

 

Zowel de TCR5000 als de Hall sensor komen met een digital output en een potentiometer om de gevoeligheid te regelen. De totale kostprijs van dit printje is 1.5 EUR en hiervoor kan je onmogelijk zelf een opstelling in elkaar boxen.

Beide sensors komen ook met een LED lampje welke brandt wanneer de Digital Output High is. Hiermee kan je heel eenvoudig en zonder programmeerwerk de werking van de sensor testen.

 

RPI Configuratie

Aangezien het de eerste GPIO pinnen zijn die ik zal gebruiken op mijn RPI bordje dien ik nog de WiringPi module te installeren.

http://wiringpi.com/

git clone git://git.drogon.net/wiringPi
cd /wiringPi
./build

 

Versiecontrole na installatie

 gpio -v

gpio version: 2.44
Copyright (c) 2012-2017 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
 Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Sony
 * Device tree is enabled.
 *--> Raspberry Pi 3 Model B Rev 1.2
 * This Raspberry Pi supports user-level GPIO access.

 

Gebruikte GPIO pinnen

2017-12-07 14_35_51-raspberry_pi_circuit_note_fig2a.jpg (1000×873)

 

GPIO PIN 2 : +5V Hall Sensor
GPIO PIN 12 : DO (Digital out) Hall Sensor (WiringPI NUMMER = 1)
GPIO PIN 14 : GND Hall Sensor

 

Opvragen van de GPIO pinnen met WiringPI


root@raspberrypi:~ # gpio readall

 

2017-12-07 14_39_45-Remote Desktop Manager [sennepi.zilverlinde.home]

Het voordeel van het aanspreken van de GPIO pinnen via de WiringPI nummering is dat deze nummers niet onderhevig zijn aan hardware changes. D.w.z. dat bij gebruik van de WiringPI library kan overgeschakeld worden naar andere hardware zonder de noodzaak om code te herschrijven.

 

Op domoticz.com heb ik een mooi c programma gevonden welke de sensor kan pollen

https://www.domoticz.com/forum/viewtopic.php?f=32&t=3151&start=60#p112272

Dit heb ik als basis gebruikt om het programma gascounter en watercounter te compileren. De enige aanpassing in de C-code is de WiringPi ID waarop de puls binnenkomt.

 

gcc -o gascounter gascounter.c –lwiringPi

// What GPIO input are we using?
// This is a wiringPi pin number
#define IN_PIN 1
#define INTERRUPT_DEBOUNCE_DELAY 500

IN_PIN GAS = 1
IN_PIN Water = 4

Hierna het programma compileren:

gcc -o gascounter gascounter.c –lwiringPi

Verplaatsen van programma naar default linux locatie

mv gascounter /usr/local/bin

Startwaarde eenmalig instellen

echo 300 > /var/run/shm/gascounter

SHM = Shared memory -> de counter telt in het virtuele geheugen. Pas bij een start / stop schrijft hij de waarde weg naar persistent storage. Dit gebeurt via het service script:

vim /etc/init.d/gascounter
SAVEFILE="/root/counters/$NAME"

Meer info:
https://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html

Verdere vars aanpassen en startup script optimalisatie

vim /etc/init.d/gascounter
chown root:root /etc/init.d/gascounter
chmod 755 /etc/init.d/gascounter

Testen van het c-programma in de voorgrond (zonder service script)

 vim /etc/init.d/gascounter
root@raspberrypi:~ #/usr/local/bin/gascounter /var/run/shm/gascounter /root/counters/gascounter /root/logs/gasmeter.log
Usage: /usr/local/bin/gascounter tempfilename storagefilename logfilename

Activeren van de daemon

systemctl daemon-reload
systemctl enable gascounter
systemctl start gascounter

Autostart & monitoring via MONIT

vi /etc/monit/monitrc
check process GAS_Meter matching "/usr/local/bin/gascounter"
start program "/etc/init.d/gascounter start"
stop program "/etc/init.d/gascounter stop"

monit status
monit reload

Kleine optimalisatie: (vastgesteld van warning tijdens starten service -> systemctl status gascounter:

chmod 755 /root/counters/gascounter

Zelfde config aanmaken voor de watercounter

watercounter.c
GPIO_PIN = wiringPI number 4

gcc -o watercounter watercounter.c –lwiringPi
mv watercounter /usr/local/bin/
cp /etc/init.d/gascounter /etc/init.d/watercounter
echo 600 > /var/run/shm/watercounter

systemctl daemon-reload
systemctl enable watercounter
systemctl start watercounter

vi /etc/monit/monitrc
check process watercounter matching "/usr/local/bin/watercounter"
start program "/etc/init.d/watercounter start"
stop program "/etc/init.d/watercounter stop"

chmod 755 /root/counters/watercounter

monit status
monit reload

 

Handig commando om elke second de huidige tellerstand uit te lezen (om te debuggen)

while sleep 1; do cat /var/run/shm/gascounter; echo ""; done

Hager Domovea Custom Reporting

De Hager Domovea TJA450 server biedt geen mogelijkheid om data automatisch te exporteren naar een database. Via de servermanager kan je de historische data van meetwaarden wel downloaden naar een csv of xml bestand maar daar houdt het dus ook op.

Persoonlijk vind ik het interessant om bv bij te houden hoeveel keer een bepaald event zich voorgedaan heeft. bv: het openen van de achterdeur of garagepoort.

De domovea server is wel in staat om emails te sturen. Dus de idee ontstond al snel om elke week een rapportje naar mezelf te mailen met een overzichtje van wat er allemaal gebeurd is.

BV: Magneetcontact achterdeur gaat open

–> busevent komt bij de domovea server

domoveastats1

domoveastats2

–> de domovea server doet de variabele achterdeurOpen + 1

domoveastats3

–> zondagnacht verstuurt de domoveaserver een rapportje en reset alle variabelen.

domoveastats4

domoveastats5

 

Zo een wekelijks rapportje ziet er als volgt uit

————————————————————–
START DOMOVEA REPORT
————————————————————–

Weekly Facts:

– Aantal keer garage geopend: 34
– Aantal keer schuifraam geopend: 27
– Aantal keer achterdeur geopend: 164
– Aantal keer voordeur geopend: 7
– Aantal keer alarm ingeschakeld: 6
– Buitenalarm afgegaan: 0
– Binnenkomst als alarm nog actief was (Lichten pinken): 1
– Aantal keer op de deurbel geduwd: 4
– Aantal keer de filmmodus ingeschakeld: 0
– Aantal keer nachtmodus aangezet: 7

————————————————————–
Variabelen Check:

Status Filmmodus: Vals (0)
Status AlarmNetAan: Vals (0)
Status DeurbelVerlichting: Vals (0)

————————————————————–
END DOMOVEA REPORT
————————————————————–

 

Het zou interessant zijn mocht er een mogelijkheid bestaan om zelf een logfile aan te maken of de waarden vanuit domovea rechtstreeks te kunnen wegschrijven in een database. Maar tot op heden is dit dus niet het geval.

Als workaround heb ik een python scriptje geschreven die deze mailtjes uitleest uit mijn gmail account en wegschrijft in een MySQL tabel.

import os
import sys
import datetime
from gmail import Gmail

## Important notes
# give stijn_domovea file permissions for writing files to NAS!
#
# UPDATE mysql.user SET File_priv = 'Y' WHERE user='stijn_domovea' AND host='localhost';
# 1 rij bijgewerkt.
# FLUSH PRIVILEGES;
# MySQL gaf een lege resultatenset terug (0 rijen).

# Vars
mysqlbin="/usr/bin/mysql"
mysqlhost="localhost"
mysqlport="3306"
#mysqluser="xxx"
mysqluser="xxx"
mysqldb="xxx"
#mysqlpass="xxx"
mysqlpass="xxx"

MySQLOutFile = "/tmp/tmpWRdata.txt"
LogOutFile = "/volume2/data/scripts/DomoveaStats/log/processedDomoveaStats.log"

# Classes
class Report:
def __init__(self, date, garage, schuifraam, achterdeur, voordeur, alarm_aan, alarm_actief, alarm_stil, deurbel, filmmodus, nachtmodus):
self.date = date
self.garage = garage
self.schuifraam = schuifraam
self.achterdeur = achterdeur
self.voordeur = voordeur
self.alarm_aan = alarm_aan
self.alarm_actief = alarm_actief
self.alarm_stil = alarm_stil
self.deurbel = deurbel
self.filmmodus = filmmodus
self.nachtmodus = nachtmodus

def toString(self):
datest = str(self.date)
st = "reportdate %s - garage %d - schuifraam %d - achterdeur %d - voordeur %d - alarm_aan %d - alarm_actief %d - alarm_stil %d - deurbel %d - filmmodus %d - nachtmodus %d" % (datest, self.garage, self.schuifraam, self.achterdeur, self.voordeur, self.alarm_aan, self.alarm_actief, self.alarm_stil, self.deurbel, self.filmmodus, self.nachtmodus)
return st

def sql(sqlcmd):
os.system(mysqlbin + " -h" + mysqlhost + " -P" + mysqlport + " -u" + mysqluser + " -p" + mysqlpass + " -e " + sqlcmd)

# Body
# Retrieve mails
g = Gmail()
g.login("xxx@gmail.com", "onetimeapplicationpassword")
mails = g.label("DeLinde/WeeklyStats").mail(prefetch=True)

# Build array with reports
allReports = []
x = 0
totalmails = len(mails)

# Quit when gmail label is empty !
if totalmails == 0:
print "no reports found --> exiting script!"
exit(0)

while x < totalmails:
r = Report(0,0,0,0,0,0,0,0,0,0,0)
r.date = mails[x].sent_at
bl = mails[x].body.split('\n')

r.garage = int(filter(str.isdigit, bl[7]))
r.schuifraam = int(filter(str.isdigit, bl[8]))
r.achterdeur = int(filter(str.isdigit, bl[9]))
r.voordeur = int(filter(str.isdigit, bl[10]))
r.alarm_aan = int(filter(str.isdigit, bl[11]))
r.alarm_actief = int(filter(str.isdigit, bl[12]))
r.alarm_stil = int(filter(str.isdigit, bl[13]))
r.deurbel = int(filter(str.isdigit, bl[14]))
r.filmmodus = int(filter(str.isdigit, bl[15]))
r.nachtmodus = int(filter(str.isdigit, bl[16]))
allReports.append(r)

x = x + 1
print "Done! building report objects"

# Build MySQL connection & update stijn_domovea 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 WeeklyReports INTO OUTFILE \"/volume2/data/scripts/DomoveaStats/tmpWRdata.txt\";'")
sql("'use stijn_domovea; select date from WeeklyReports INTO OUTFILE \"/tmp/tmpWRdata.txt\";'")

for ar in allReports:
#check date already in DB
date = str(ar.date)
if date in open(MySQLOutFile).read():
print "found %s already in db." % date
else:
sqlstr = "'use stijn_domovea; INSERT INTO WeeklyReports (date,garage,schuifraam,achterdeur,voordeur,alarm_aan,alarm_actief,alarm_stil,deurbel,filmmodus,nachtmodus) VALUES (\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d);'" % (str(ar.date), ar.garage, ar.schuifraam, ar.achterdeur, ar.voordeur, ar.alarm_aan, ar.alarm_actief, ar.alarm_stil, ar.deurbel, ar.filmmodus, ar.nachtmodus)
sql(sqlstr)
#print "%s --> Totaal aantal keer garagepoort geopend: %d" % (str(ar.date), ar.garage)
#print sqlstr
print "added %s to db." % date
# append entry to log
logline = "date added: " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " --> " + ar.toString() + "\n"
#with open(LogOutFile, "a") as myfile:
# myfile.write(logline)
file.write(logline)
file.write(u"\r\n")

# Remove temporary file
os.remove(MySQLOutFile)

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)

 

Uitlezen Hager TE360 met KNXD

Inleiding

Dit script zal de totale verbruikte energie (in Watt) van een Hager TE360 ophalen en toevoegen aan een MySQL database.

Het groepsadres dat gebruikt wordt is 4/6/9
TE360 – 9 – TE360 – totale actieve energie tarief 1 + 2 (Wh)

Dependencies

MySQL client om data weg te schrijven naar de MySQL database

apt-get install mysql-client

Basic Calculator (BC)

apt-get install bc

 

Actieve KNXD logfile (niet meer van toepassing)

crontab -e
@reboot knxtool log local:/run/knx

knxd tools

knxtool groupreadresponse

 

Script die Hager TE360 bevraagt en resultaat in textbestand wegschrijft:

log=/root/logs/getTotalConsumption.log
knxresult=/root/scripts/getTotalConsumption.knxresult
data=/root/scripts/getTotalConsumption.data

echo "$(date "+%Y%m%d %T") ## start ophalen totaal verbruik van Hager TE360 ##" >> $log

echo "$(date "+%Y%m%d %T") uitlezen TE360 met knxtool groupreadresponse" >> $log
#knxtool groupreadresponse local:/run/knx 4/6/9 > $knxresult
knxtool groupreadresponse ip:localhost 4/6/9 > $knxresult

hexdata=$(cat $knxresult | grep -m 1 "from 1.1.9:" | cut -d ":" -f 2)
echo "$(date "+%Y%m%d %T") hexadecimale energiewaarde extraheren: $hexdata" >> $log

# controle opgehaalde hexadecimale waarde
if [ -z "$hexdata" ]; then
echo "$(date "+%Y%m%d %T") fout met uitlezen hexadecimale waarde" >> $log
echo "$(date "+%Y%m%d %T") hexadecimale waarde is leeg" >> $log
echo "$(date "+%Y%m%d %T") script wordt gestopt!" >> $log
exit
fi
if ! [[ $hexdata =~ [!0-9A-Fa-f] ]]; then
echo "$(date "+%Y%m%d %T") fout met uitlezen hexadecimale waarde" >> $log
echo "$(date "+%Y%m%d %T") hexadecimale niet correct: $hexdata" >> $log
echo "$(date "+%Y%m%d %T") script wordt gestopt!" >> $log
exit
fi

# verwijderen spaties
hexdata="$(echo -e "${hexdata}" | tr -d '[[:space:]]')"

# omzetten naar decimale waarde
echo "$(date "+%Y%m%d %T") omzetten hexadecimale waarde naar decimale waarde en wegschrijven naar $data" >> $log
echo $((16#$hexdata)) > $data

echo "$(date "+%Y%m%d %T") ## einde ophalen totaal verbruik van Hager TE360 ##" >> $log

 

Script die elke 5 minuten de database met meetwaarden update:

#!/bin/bash

# Uitlezen energiewaarde Hager TE360 via knxd
# Nadien het totaal verbruik van de afgelopen 5 minuten berekenen
# en wegschrijven naar de SQL database.

log="/root/logs/electricityToMySQL.log"
mysql_host=xx
mysql_user=xx
mysql_pass=xx
mysql_db=xx

# db connectie testen
# indien niet mogelijk script direct stoppen zodat later de correcte waarde in de db kan worden toegevoegd.
if ! mysql -h $mysql_host -u $mysql_user -p$mysql_pass -e "use $mysql_db"; then
echo "$(date "+%Y%m%d %T") db connection error -> script wordt gestopt" >> $log
exit
fi

echo "$(date "+%Y%m%d %T") ## start ophalen elektriciteit ##" >> $log

# ophalen huidig verbruik
echo "$(date "+%Y%m%d %T") uitlezen TE360 met knxtool groupreadresponse" >> $log
/root/scripts/getTotalConsumption.sh
currdata=$(</root/scripts/getTotalConsumption.data)

# ophalen totaalverbruik MySQL database
consumptionTotal=$(mysql -h $mysql_host $mysql_db -u $mysql_user -p$mysql_pass -e "SELECT consumptionTotal FROM Electricity ORDER BY id DESC LIMIT 1;")
consumptionTotal=$(echo $consumptionTotal | cut -d " " -f2)
echo "$(date "+%Y%m%d %T") Vorig totaal verbuik: $consumptionTotal watt" >> $log

# ophalen waarde van 5 minuten geleden
lastdata=$(</root/scripts/electricityToMySQL.lastdata)

# berekenen verbruik laatste 5 minuten
consumption=$(expr $currdata - $lastdata)
echo "$(date "+%Y%m%d %T") Energieverbruik laatste 5 minuten: $consumption watt" >> $log

consumptionTotal=$(($consumptionTotal + $consumption))

# ophalen prijs piek- en daluren
q=$(mysql -h $mysql_host $mysql_db -u $mysql_user -p$mysql_pass -e "SELECT priceHigh,priceLow FROM ElectricityPrice ORDER BY id DESC LIMIT 1;")
priceHigh=$(echo $q | cut -d " " -f3)
priceLow=$(echo $q | cut -d " " -f4)
echo "$(date "+%Y%m%d %T") kostprijs piek: $priceHigh, kostprijs dal: $priceLow" >> $log

# berekenen kostprijs verbruikte energie
# huidige uur
h=$(date +%H)
#dag van de week 1=maandag, 7=zondag
dow=$(date +%u)
# huidig tarief
ct="dal"
if [[ $dow -gt 5 ]] ; then
#echo "$h -> dal -> weekend"
conPrice=$(echo $consumption*$priceLow/1000 | bc -l)
elif (( 7 <= 10#$h && 10#$h < 22 )) ; then
#echo "$h -> piek"
conPrice=$(echo $consumption*$priceHigh/1000 | bc -l)
ct="piek"
else
#echo "$h -> dal"
conPrice=$(echo $consumption*$priceLow/1000 | bc -l)
fi

# toevoegen waarde is MySQL database
date=$(date +"%Y-%m-%d")
time=$(date +"%T")
echo "$(date "+%Y%m%d %T") toevoegen data aan MySQL -> tarief: $ct - verbruik: $consumption - kostprijs: $conPrice --> stijn_domovea -> Electricity" >> $log

mysql -h $mysql_host $mysql_db -u $mysql_user -p$mysql_pass -e "insert into Electricity (date,time,consumption,consumptionTotal,price) values ('$date','$time','$consumption','$consumptionTotal','$conPrice')"

# wegschrijven van nieuwe lastdata
echo "$(date "+%Y%m%d %T") wegschrijven totaal verbruik naar tekstfile -> totaalverbruik: $currdata" >> $log
echo $currdata > /root/scripts/electricityToMySQL.lastdata

echo "$(date "+%Y%m%d %T") ## einde ophalen elektriciteit ##" >> $log

Toevoegen aan crontab

*/5 * * * * /root/scripts/electricityToMySQL.sh

 

Monit

Er is dringend nood aan monitoring van alle interne apparaten. Het is dan ook zeer belangrijk dat ik onmiddellijk een email kan krijgen wanneer de RPI niet beschikbaar meer zou zijn. Het belangrijkste is dat de RPI een zo klein mogelijke downtime kent omdat deze instaat voor periodieke metingen. Hoe minder downtime hoe meer meetwaarden dus.

Mijn ogen vielen op de opensource tool Monit. Deze tool is compatibel met ARM processoren zoals de RPI en kan via apt-get eenvoudig geïnstalleerd worden.

https://mmonit.com/monit/

Installatie agent

apt-get install monit

Controle onboot

Controleer dat START=yes voorkomt in

vim /etc/default/monit

 

Installatie Monitoring Server (M/Monit)


cd /opt
wget https://mmonit.com/dist/mmonit-3.5.1-linux-arm.tar.gz
tar -xvf mmonit-3.5.1-linux-arm.tar.gz

Autostart M/Monit via Monit Agent

vim /etc/monit/monitrc
check process mmonit with pidfile /opt/mmonit-3.5.1/logs/mmonit.pid
start program = "/opt/mmonit-3.5.1/bin/mmonit"
stop program = "/opt/mmonit-3.5.1/bin/mmonit stop"

Autostart M/Monit via systemctl

cd /lib/systemd/system
vim mmonit.service

[Unit]
Description = Easy, proactive monitoring of Unix systems, network and cloud services
After = network.target

[Service]
Type=forking
ExecStart = /opt/mmonit-3.5.1/bin/mmonit start
ExecStop = /opt/mmonit-3.5.1/bin/mmonit stop
PIDFile = /opt/mmonit-3.5.1/logs/mmonit.pid

[Install]
WantedBy = multi-user.target

systemctl enable mmonit
systemctl start mmonit
systemctl status mmonit

 

Monit Agent koppelen

vim /etc/monit/monitrc

 

set mmonit http://monit:password@192.168.10.15:8080/collector

set httpd port 2812
allow localhost
allow 192.168.10.15
allow monit:password

 

Extra service toevoegen

check device root with path /dev/root
 if SPACE usage > 80% then alert

check process sshd with pidfile /var/run/sshd.pid
start program "/etc/init.d/ssh start"
stop program "/etc/init.d/ssh stop"
if failed port 22 protocol ssh then restart

check process knxd
matching "knxd";
start program = "/etc/init.d/knxd start"
stop program = "/etc/init.d/knxd stop"
# not working: if failed unixsocket /run/knx then alert

check host fietology.zilverlinde.local with address 192.168.10.5
if failed ping then alert
if failed port 3306 protocol mysql with timeout 15 seconds then alert
if failed port 80 protocol http
and request /domotics/assets/monitcheck with content = "MMonit OK"
then alert

check host cam-voordeur.zilverlinde.local with address 192.168.10.81
if failed ping then alert

check host cam-garage.zilverlinde.local with address 192.168.10.80
if failed ping then alert

check host onkyo.zilverlinde.local with address 192.168.10.41
if failed ping then alert

root@raspberrypi:/etc/monit # monit reload
Reinitializing monit daemon