TRC270F – KNX Tussenstekker

TRC270F

Hager TRC270F – draadloos knx 230v relais

 

Nu ik eindelijk dacht dat KNX geen geheimen meer had voor mij kwam ik toch wel vast te zitten bij het configureren van een nieuwe draadloze knx relais. Bovenstaande tussenstekker schakelt een belasting op 230v.

Vol goede moed voegde ik dit toestel toe op mijn RF lijn van mijn ETS project. Als 5de draadloze busdeelnemer.

Even een refresh: Een draadloze lijn voor de hager mediacoupler onder te brengen gebeurt niet op een RF lijn maar op een TP lijn. Verder wordt er als eerste device dan een Hager Media Coupler geplaatst welke .0 als busdeelnemer adres heeft.

2019-06-18 12_54_58-Calculator

Nieuwe groepsadressen aanmaken en koppelen

trc270_groupsaddresses

Nadien volgt het starten van de configuratieplugin (openen onder de parameter tab van 1.2.0 Media coupler)

Hier ging alles heel vlot:

  1. Onder physical addressing het nieuwe toestel zoeken. Aangezien deze de fabrieksinstellingen had kwam de nieuwe TRC270 automatisch in de lijst.
  2. Fix address procedure uitvoeren
  3. Download van parameters uitvoeren
  4. Physical effect testen ==> OK

2019-06-18 12_58_24-Photos

Alles werkte perfect en ik dacht dat ik na een kwartiertje werk reeds klaar was.

Toen ik het toestel in productie bracht kwam ik tot de vaststelling dat er niets gebeurde!

Al snel keek ik via de busmonitor en zag dat er geen telegrammen van de nieuwe TCR270 op de bus terechtkwamen.

Na contact met support van Hager bleek er een filtering op de groepsadressen aanwezig te zijn. Wanneer er een nieuw groepsadres aangemaakt wordt kan deze standaard niet tussen verschillende lijnen communiceren. (Filtered)

De oplossing was op het niveau van de groepsadressen een parameter aan te passen zodat de groepsadressen van de TRC270 weldegelijk tussen verschillende lijnen mag communiceren.

filtered_addresses

(Of in het Engels Pass through line coupler) aanvinken en nadien de download opnieuw uitvoeren via de media coupler plugin.

De enige vraag dat nog openstaat is waarom mijn draadloze afstandsbedieningen (Hager TU402) en draadloze rookmelders (Hager TGA510A) wel kunnen communiceren. (Zonder niet filteren aan te zetten!) Ik gebruik deze KNX componenten reeds enkele jaren en doen het perfect.

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

DNS .local domein adressen onder linux

Als intern dns domain gebruikte ik tot op heden zilverlinde.local. Dit heeft altijd goed gewerkt tot op het moment dat ik van op een linux client enkele adressen probeerde te pingen.

root@SennePi:/home/pi# ping htpc.zilverlinde.local
ping: unknown host htpc.zilverlinde.local

Na wat troubleshooting en installatie van dnsutils bleek dat dit adres wel resolveable was.

apt-get install dnsutils

root@SennePi:/home/pi# nslookup htpc.zilverlinde.local
Server: 192.168.10.5
Address: 192.168.10.5#53

Name: htpc.zilverlinde.local
Address: 192.168.10.42

Na wat rondneuzen op google kwam ik tot de vaststelling dat .local onder linux zou gebruikt worden als root voor multicast adressen. Vandaar dat bovenstaande een foutmelding geeft.

Ik kan nu 2 dingen doen.

  • Beginnen prutsen in linux en ervoor zorgen dat ipv mutlicast toch unicast gebruikt wordt voor zilverlinde.local. Maar dan zal ik in de toekomst bij eventueel andere linux clients ook in de problemen komen.
  • Aangezien ik nog maar een beperkt aantal interne dns-records heb. mijn interne dns domain aanpassen naar alles behalve .local.

 

Ik heb voor de 2de optie gekozen en alles gemigreerd naar zilverlinde.home. Het pingen en het resolven werkt nu zonder problemen.

root@SennePi:/home/pi# ping onkyo.zilverlinde.home
PING onkyo.zilverlinde.home (192.168.10.41) 56(84) bytes of data.
64 bytes from 192.168.10.41: icmp_seq=1 ttl=64 time=0.558 ms