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.

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

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

 

Hager TU402 afstandsbediening

Een TU402 is een draadloze RF afstandsbediening met 2 druktoetsen van Hager welke communiceert via de TR131A en zo KNX telegrammen op de bus kan versturen.

Hager_TU402

 

Voeg het knx product TU402 toe aan de TP lijn voor RF producten.

TU402_1

TU402_2

Configureer de parameters

TU402_3

TU402_4

1 = drukknop licht
2 = rolluik op / neer

Hier zit dus een bug in de applicatie:
De 3de selectie geeft mij het gewenste resultaat met de rolluiken.

Configureer de groepsobjecten

TU402_5

Open de TR313A plugin

RESET device out of installation

Met deze functie kan je een reeds gekoppeld RF toestel terugbrengen naar de fabrieksinstellingen.

TU402_6

TU402_7

Kies voor:
Unidirectional Device with addr. button

Na het resetten klik je het product aan in de lijst en kies je voor Addressing links boven. Met deze knop kan het RF product opnemen in het project.

TU402_8

Indrukken van Cfg. Knop (blauw knopje op de achterkant van de TU402)

TU402_9

Na het adresseren komt er een draadloos icoontje voor knx device address te staan. Hieraan kan je zien dat het nieuwe product toegevoegd is in het project.

TU402_10

Nu rest ons nog enkel de ETS groepsadressen die we eerder reeds toegekend hadden te koppelen in de TU402. Dit doe je door de gegevens te downloaden. (linksboven op selected duwen voor het starten van de download)

TU402_11

Als alles goed verlopen is krijg je normaal gezien onderstaand resultaat.

TU402_12

 

RPI3 – Raspbian Jessie Lite – knxd

Via knxd hoop ik volgende problemen op te lossen

  1. Invalid frames bij de BusMonitor van ETS5 wanneer EIBD in tunneling mode gebruikt wordt.
  2. Mijn Hager TR131A wil niet werken in ETS 5 zowel voor Tunnel als Router mode

Ik heb er ook voor gekozen om niet meer via noobs te werken maar van een lege linux doos. Hoe minder toepassingen er uiteindelijk om de RPI3 komen te staan. Hoe stabieler deze zal werken.

Basic RPI setup

Downloaden van raspbian jessie lite
https://downloads.raspberrypi.org/raspbian_lite_latest

Wegschrijven naar SD card met Win32diskimager
https://www.raspberrypi.org/documentation/installation/installing-images/windows.md

via HDMI en USB toetsenbord

  • passwd pi, root
  • sudo raspi-config
  • timezone, keyboard layout
  • Update OS
    • apt-get update
    • apt-get upgrade

Blacklist Wifi & Bleutooth

/etc/modprobe.d/raspi-blacklist.conf

#wifi
blacklist brcmfmac
blacklist brcmutil
#bt
blacklist btbcm
blacklist hci_uart

Installatie Vim

Voor gebruik vi
Geeft problemen met de pijltjestoetsen
De gemakkelijkste manier is gewoon vim erbij installeren

apt-get install vim

 

Netwerk configureren

Procedure met DHCP (Debian Jessie)

vi /etc/dhcpcd.conf

interface eth0
static ip_address=192.168.10.15/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.5 195.130.130.11

 

Procedure zonder DHCP (oude manier)

Uitschakelen van DHCP services

systemctl disable dhcpcd

 

ipv6 uitschakelen (momenteel nog niet in gebruik)

Static network config

ifdown wlan0
/etc/hosts --> hostname wijzigen
vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.10.15
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 192.168.10.5
post-up route add -net 224.0.23.12 netmask 255.255.255.255 eth0
pre-down route del -net 224.0.23.12 netmask 255.255.255.255 eth0

 

SSH activeren onboot

systemctl enable ssh

Verplaatsen RPI3

RPI3 terug in de garage aangesloten

  • Stroomkabel
  • UTP
  • USB -> KNX connectie Hager TH101

 

Controle USB interface


pi@Pi:~ $ sudo lsusb -v

Bus 001 Device 004: ID 135e:0025
Device Descriptor:
 bLength 18
 bDescriptorType 1
 bcdUSB 1.10
 bDeviceClass 0 (Defined at Interface level)
 bDeviceSubClass 0
 bDeviceProtocol 0
 bMaxPacketSize0 8
 idVendor 0x135e
 idProduct 0x0025
 bcdDevice 1.01
 iManufacturer 1 Hager Electro
iProduct 2 KNX-USB Data Interface

Installatie KNXD

Nu is onze RPI3 klaar om KNXD te installeren.
Volg de readme op https://github.com/knxd/knxd

Installatie build tools

sudo apt-get install git-core build-essential

 

Ophalen source code

git clone https://github.com/knxd/knxd.git

wget https://www.auto.tuwien.ac.at/~mkoegler/pth/pthsem_2.0.8.tar.gz

 

Compilatie & installatie pthsem

tar xzf pthsem_2.0.8.tar.gz
cd pthsem-2.0.8
sudo apt-get install debhelper
sudo apt-get install cdbs
dpkg-buildpackage -b -uc
cd ..
sudo dpkg -i libpthsem*.deb

 

Compilatie installatie KNXD

cd knxd/
sudo apt-get install libsystemd-dev libsystemd-daemon-dev libusb-1.0-0-dev dh-systemd
dpkg-buildpackage -b -uc
cd ..
sudo dpkg -i knxd_*.deb knxd-tools_*.deb

 

Aanpassen van de EIBD options.
Deze configuratieregel stelt de parameters in waarmee KNXD moet opstarten.


vi /etc/knxd.conf

KNXD_OPTS="-e 1.1.128 -DTRS -b usb:1:4:1:0:0"
 Debugging opties:
KNXD_OPTS="-e 1.1.128 -t1023 -f9 -DTRS -b usb:1:4:1:0:0"

EDIT AUGUST 2016: Tunneling mode opnieuw toegevoegd aan KNXD server!!! Dit omdat ik problemen ondervond tijdens het opladen van de applicatiecode in een domoticaproduct van Hager.

Onderstaande regel heb ik moeten toevoegen aan de udev rules. Indien ik dit niet doe mag de user knxd de USB interface niet gebruiken.

vi /etc/udev/rules.d/70-knxd.rules
# Hager KNX-USB Data Interface
SUBSYSTEM=="usb", ATTR{idVendor}=="135e", ATTR{idProduct}=="0025", ACTION=="add", GROUP="knxd", MODE="0664"

 

MySQL client tools

sudo apt-get install mysql-client

Reboot pi

Na het herstarten de status van onze knxd instantie controleren

systemctl status knxd

root@SennePi:/etc/udev/rules.d# systemctl status knxd
● knxd.service - KNX Daemon
 Loaded: loaded (/lib/systemd/system/knxd.service; enabled)
 Active: active (running) since Thu 2016-03-24 15:08:41 CET; 4min 22s ago
 Main PID: 498 (knxd)
 CGroup: /system.slice/knxd.service
 └─498 /usr/bin/knxd -e 1.1.128 -DRS -b usb:1:4:1:0:0

Mar 24 15:08:41 SennePi systemd[1]: Started KNX Daemon.

Mar 24 15:10:02 SennePi knxd[498]: W00000033: RecvError 2

De periodieke RecvError2 krijg ik nog niet weg. Ik merk dat er nog andere personen met dit probleem zitten en het zou te maken hebben met een timeout van de USB connectie.

Het ziet er echter wel naar uit dat alle functies van knxd correct werken.
Dus voorlopig laat ik de foutmelding gerust staan.

Testen van knxd

Testen in linux met knxtool

Busmonitor

knxtool vbusmonitor1 ip:localhost

Waarde uitlezen van een knx apparaat (in dit voorbeeld een Hager TE360 energiemeter)

knxtool groupreadresponse local:/run/knx 4/6/9
Send request
Response from 1.1.9: 00 51 E7 08
Ending groupreadresponse.

Testen in ETS5

In routing mode werkt ETS5 zoals het hoort.
In tunneling mode krijg ik nog steeds invalid frames bij de busmonitor. De groepmonitor werkt wel goed in tunneling mode. Momenteel geen idee waar het verschil zou kunnen zitten.

Het probleem met de TR131A is ook opgelost geraakt.
Dit had te maken in een bug van ETS5. Met de laatste nieuwe update ETS5.0.8 blijkt de TR131A in combinatie met een routing interface goed te werken.

Raspberry Pi 3 – EIBD – OpenHab

De kogel is door de kerk. Ik heb dan toch niet voor de Pine64 gekozen voor onze domotica te automatiseren via opensource software maar voor de Raspberry Pi 3. Dit nieuwe bordje is dan wel 2x zo duur maar heeft nu ook een 64bit processor en bleutooth en wifi onboard. De voornaamste reden om voor de Raspberry te kiezen was toch de ondersteuning van de community online. Raspbian OS (het besturingsysteem welke op de Pi draait, gebasseerd op debian) lijkt me een goede startkeuze.

Basic install van de RPI3 via Noobs

Noobs is de installer meegeleverd op SD card bij aankoop van de RPI3.

Installatie van Raspbian OS

RPI3 aangesloten via HDMI op de TV


Netwerkkaart configuren

(op de oude debian manier! dus niet via systemd! onder Debian Jessie)

 

cat /etc/network/interfaces
auto eth0iface eth0 inet static
address 192.168.10.15
netmask 255.255.255.0
gateway 192.168.10.1
post-up route add -net 224.0.23.12 netmask 255.255.255.255 eth0
pre-down route del -net 224.0.23.12 netmask 255.255.255.255 eth0

Door gebruik te maken van auto eth0 vertel je debian dat je niet gebruik wil maken van de systemd / dhcpd.service. Dit is belangrijk om later de EIBD service automatisch te kunnen starten wanneer de RPI3 boot. Indien toch gebruik gemaakt wordt van de vernieuwde systemd (systeem om services te starten / stoppen) zal de EIBD niet starten onboot!

Verder heb ik de dhcpd service volledig uitgezet omdat ik anders 2 ip adressen op mijn RPI3 kreeg. 1 statisch en 1 via dhcpd (dynamisch adres)

 

systemctl disable dhcpcd

 

Fysiek verplaatsen RPI3

Eenmaal het netwerk actief is kunnen we de RPI3 loskoppelen en verplaatsen naar de garage.

Koppelen van stroom & UTP kabel.

Koppelen aan de USB KNX Bus.V ia een Hager TH101 BCU (bus coupling unit)

 

Hager_TH101

Globale linux instellingen configureren

Via raspi-config volgende instellingen aanpassen

  • Boot options -> text console, requiring user to login
  • Pi wachtwoord wijzigen
  • Internationalisation -> locale, timezone, keyboard layout NL-BE, Wifi country BE

Installatie EIBD

opgelet! niet meer in actieve ontwikkeling

er is een fork van EIBD -> KNXD maar op dit moment nog niet ver genoeg ontwikkeld om over te schakelen. Ook in de officiële documentatie van OpenHab wordt er verwezen naar EIBD. Vandaar (momenteel) toch nog de voorkeur naar EIBD

https://github.com/knxd/knxd/wiki

Installatie van EIBD liep volledig geautomatiseerd met dank aan volgend script:

http://michlstechblog.info/blog/download/electronic/install_eibd_usb_with_cemi_patches_systemd.sh

Meer info op: 

http://michlstechblog.info/blog/raspberry-pi-eibd-with-a-knx-usb-interface/

 

Na de installatie heb ik voor de zekerheid alle wgets en git clone manueel uitgevoerd in het geval dat ik later dezelfde opstelling nogmaals wil compileren en in het geval dat er 1 of meerdere scripts / bestanden zouden verdwijnen.

Nu hoop ik in de toekomst knxd volwassen wordt en er een eenvoudige installer komt voor connectie met de USB BCU .


Nu rest ons enkel nog systemctl aan te geven dat we graag EIBD starten onboot.

systemctl enable eibd

 Dit commando zal een symbolic link aanmaken in 

/etc/systemd/system/multi-user.target.wants/

naar

eibd.service -> /lib/systemd/system/eibd.service

Hiermee zal systemd de eibd.service starten wanneer de RPI3 boot.

Testen EIBD

Via findknxusb controleren of de BCU gevonden wordt

root@Pi:~# findknxusb
Possible addresses for KNX USB devices:
device: 1:4:1:0:0 (Hager Electro:KNX-USB Data Interface)

Ik heb het eibd.service script een beetje aangepast zodat EIBD een logfile wegschrijft

[Unit]
Description=EIB Daemon
After=network.target

[Service]
EnvironmentFile=/etc/default/eibd
ExecStartPre=/usr/local/bin/eibd-findusb.sh
ExecStart=/usr/local/bin/eibd -p /run/eibd/eibd.pid $EIBD_OPTIONS
Type=forking
PIDFile=/run/eibd/eibd.pid
User=eibd
Group=eibd

[Install]
WantedBy=multi-user.target

 

In deze file zitten de $EIBD_OPTIONS. Hierin heb ik de logging toegevoegd

EIBD_OPTIONS=”–daemon=/var/log/eibd.log -D -T -R -S -i -u -t1023 –eibaddr=1.1.128 usb:1:4:1:0:0″

-t1023 zou voor extra debugging moeten zorgen.

eibd-findusb.sh controleert op welke USB poort de BCU aangesloten zit en zal indien nodig het blauwe gedeelte van de opties updaten.

Logfile aanmaken (moet onder de correcte user draaien!)

  • touch /var/log/eibd.log
  • chown eibd:eibd /var/log/eibd.log

Via journalctl kan je fouten opsporen tijdens het booten / starten van de service.

Via systemctl status eibd kan je eveneens de laatste status opvragen van de service
root@Pi:~# systemctl status eibd
● eibd.service - EIB Daemon
        Loaded: loaded (/lib/systemd/system/eibd.service; enabled)
        Active: active (running) since vr 2016-03-18 13:39:06 CET; 1h 55min ago
        Process: 694 ExecStart=/usr/local/bin/eibd -p /run/eibd/eibd.pid $EIBD_OPTIONS (code=exited, status=0/SUCCESS)
        Process: 525 ExecStartPre=/usr/local/bin/eibd-findusb.sh (code=exited, status=0/SUCCESS)
        Main PID: 695 (eibd)
        CGroup: /system.slice/eibd.service
        └─695 /usr/local/bin/eibd -p /run/eibd/eibd.pid --daemon=/var/log/eibd.log -D -T -R -S -i -u -t1023 --eibaddr=1.1.128 usb:1:4:1:0:0

mrt 18 13:39:06 SennePi systemd[1]: Started EIB Daemon.

Controleren van de log file
pi@Pi:~ $ tail -f /var/log/eibd.log

Layer 0(01F9FF98,56EC140C) RecvComplete 64
Layer 0(01F9FF98,56EC140C) RecvUSB(064): 01 13 15 00 08 00 0D 01 01 00 00 49 BC 11 09 26 06 E5 00 80 00 1D 78 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Layer 0(01F9FF98,56EC140C) StartRecv
Layer 1(01F9FF98,56EC140C) Recv(064): 01 13 15 00 08 00 0D 01 01 00 00 49 BC 11 09 26 06 E5 00 80 00 1D 78 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Layer 0(01FA00E8,56EC140C) RecvEMI(013): 49 BC 11 09 26 06 E5 00 80 00 1D 78 24
Layer 2(01FA1190,56EC140C) Recv L_Data low from 1.1.9 to 4/6/6 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write 00 1D 78 24
Layer 2(01FA1190,56EC140C) Recv L_Data low from 1.1.9 to 4/6/6 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write 00 1D 78 24
Layer 3(01FA16D0,56EC140C) Recv L_Data low from 1.1.9 to 4/6/6 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write 00 1D 78 24
Layer 8(01FA0818,56EC140C) Send_Route L_Data low from 1.1.9 to 4/6/6 hops: 05 T_DATA_XXX_REQ A_GroupValue_Write 00 1D 78 24
Layer 1(01FA10D0,56EC140C) Send(015): 29 00 BC D0 11 09 26 06 05 00 80 00 1D 78 24
Layer 0(01FA10D0,56EC140C) Send(021): 06 10 05 30 00 15 29 00 BC D0 11 09 26 06 05 00 80 00 1D 78 24
Layer 0(01F9FF98,56EC140C) RecvComplete 64

 

1.1.9 is mijn Hager TE360 welke zijn energiewaarden elke 3 min op de bus wegschrijft.

Hoera! de buskoppeling werkt. 

Hierna heb ik de logging naar het bestand terug uitgeschakeld!



Test met groupswrite commando
2/1/0 = een klassiek licht (aan/uit)
Inschakelen van licht

pi@Pi:~ $ groupswrite ip:localhost 2/1/0 1

Uitschakelen van licht

pi@Pi:~ $ groupswrite ip:localhost 2/1/0 0

Leuk om te zien dat mijn RPI3 het licht in de keuken kan schakelen 🙂
Test met busmonitor

pi@Pi:~ $ vbusmonitor1 ip:localhost

 

Installatie OpenHab

Todo!

Hopelijk krijg ik geen spijt van het feit dat OpenHab gebasseerd is op java technologie. Voor de rest kan ik vooraf geen minpuntjes aanhalen voor mijn keuze naar visualisatie toe.

Connectie ETS5 -> EIBD

Todo!

Aangezien ik maar 1 BCU heb en aangezien de investering heel groot is om een KNX IP Router te kopen zou ik graag gelijktijdig gebruik maken van EIBD voor ETS te programmeren en OpenHab te gebruiken.

 

MySQL database aanvullen met data van telegrammen

Todo!

Koppelen Rookmelder TG510A

 

tg510a

De rookmelders toevoegen waren een echte pain-in-the-ass. Vooral omdat ik tijdens het resetten naar fabrieksinstellingen altijd een vervelende foutmelding kreeg van de plugin welke crashed.

Edit: sinds ik gebruik maak van een KXN router en dus niet meer rechstreeks de USB interface gebruik om te programmeren in ETS5 blijft de foutmelding achterweg.

Uiteindelijk ben ik er dan alsnog in geslaagd door exact volgende procedure te volgen.

Belangrijk hierbij is te weten dat wanneer je een Hager TG510A rookmelder in ETS mode plaatst –> dit doe je door 3 seconden of langer op de 0 knop te duwen aan de onderkant van het toestel –> hierna 15 seconden de tijd hebt om het product naar fabrieksinstellingen te brengen.

1) Product toevoegen aan de TP lijn voor draadloze producten in ETS5

Geen RF lijn aanmaken –> de Hager plugin van de mediakoppelaar crashed hierop.

De mediakoppelaar werkt uitsluitend op een TP lijn waarbij de Hager TR131 als 1ste apparaat gekoppeld is bv device address = 1.2.0

2) Product terug naar fabrieksinstellingen brengen

In de plugin kies je voor Fysiek adres

  • Reset overig (product niet in de installatie)
  • Bidirectioneel apparaat

TGA510A_2

  • OK –> binnen de 15 seconden nadat je de TG510A in ETS mode geplaatst hebt !
    • in geen geval de melder herstarten of zonder stroom zetten!

TGA510A_3

TGA510A_4

TGA510A_5

TGA510A_6

–> Doorgaan

Edit: Deze foutmelding doet zich niet voor in combinatie met ETS5.0.8 – KNXD IP Router (via Raspberry PI3) – Routing mode

Klik nu op adres programmeren (blauw-geel symbool) –> apparaat zoeken

TGA510A_7

Selecteer het gevonden apparaat en klik op adres programmeren (groen plus-symbool)

TGA510A_7

Als alles goed gegaan is zie je nu een draadloos icoontje naast de rookmelder verschijnen

TGA510A_8

Download de ETS parameters via de download module van de plugin.

TGA510A_9

Na de download kan je de rookmelder terug in de bedrijfsmodus zetten door kort op de knop 0 te duwen. Nu kan je eventueel ook de plugin afsluiten.

Om te testen, minstens 30 seconden wachten en nadien kan met 1 druk op de knop 1 een test verstuurd worden op de bus.

Opgelet!

Indien je de parameters in de laatste stap download naar de rookmelder moet je ervoor zorgen dat binnen ETS deze groepsadressen toegekend zijn aan een of meerdere actoren. Indien niet worden de nieuwe groepsadressen niet toegekend aan de melder.