Markdown source

#Integrazione di KNX in OpenHAB via TPUART

<abstract>
Come creare un interfaccia Openhab su un impianto domotico basato su KNX con interfaccia fisica TPUART. Informazione pratiche 
sull'installazione dell'hardware e software necessari su una Raspberry PI3. In questo articolo sarà presentato un caso pratico di 
installazione basata su hardware TPUART seguendo il modello descritto:
</abstract>

<img src="./KNX_LayerStack.png" class="img-responsive center-block" width="50%"/>

##Interfacciamento verso sistemi di domotica commerciali

OpenHAB è predisposto per essere interfacciato anche verso sistemi commerciali più o meno aperti derivanti dall'[EIB](https://it.wikipedia.org/wiki/European_Installation_Bus), come il KNX e l'SCS.
Il [KNX](https://it.wikipedia.org/wiki/KNX_(standard)) è un protocollo aperto usato da diversi produttori. La Vimar, nel sistema ByMe dedicato alle utenze residenziali, ad esempio ne usa una versione compatibile con altri bus ma proprietaria nel sistema di assegnamento degli indirizzi dei dispositivi. Non facendo parte del consorzio KNX, i suoi dispositivi non sono inseriti nel database ufficiale e non possono essere configurati dal software ETS come quelli di Siemens, Gewiss e altri. L'assegnazione degli indirizzi avviene in una modalità automatica (di tipo DHCP tanto per fare un esempio) tramite una centralina dedicata. L'[SCS](https://it.wikipedia.org/wiki/Bus_SCS) di BTicino si basa su concetti molto simili al KNX con alcune differenze anche sui primi livelli dello stack di comunicazione.

L'interfacciamento verso il bus EIB da parte di openHAB richiede dei dispositivi hardware collegati fisicamente al doppino da un lato e tramite USB o ethernet dall'altro. Ci sono molti dispositivi che effettuano questa conversione, a seconda della complessità del gateway i dati possono arrivare già convertiti oppure in modalità raw, richiedendo in questo caso dei driver aggiuntivi per essere interpretati da openHAB.

Di seguito alcuni link sui diversi sistemi di interfacciamento fisico

* [KNX Basic Course](http://knx.org/media/fileadmin/template/documents/downloads_support_menu/KNX_tutor_seminar_page/tutor_documentation/summary/Communication_E1210b.pdf)
* [KNX Project Design with ETS](http://knx.org/media/fileadmin/template/documents/downloads_support_menu/KNX_tutor_seminar_page/tutor_documentation/summary/ETS4_Planning%20complex_E0411a.pdf)
* [Domotica e Building Automation](http://web.eurogroup.com/it/servizi/domotica_e_building_automation.php)
* [Sviluppo di dispositivi KNX](http://web.eurogroup.com/it/servizi/domotica_e_building_automation/sviluppo_di_dispositivi_knx.php)
* [Accessing_the_KNX_bus](https://sourceforge.net/p/linknx/wiki/Accessing_the_KNX_bus/)
* [EIB interface devices supported for FT1.2 and for EIBnet/IP](https://www.sbc-support.com/en/faq/100793/)
* [EIB/KNX IP Gateway and Router with knxd](http://michlstechblog.info/blog/raspberry-pi-eibknx-ip-gateway-and-router-with-knxd/)
* Esempi di schede non commerciali
	* [Guido PIC](http://guidopic.altervista.org/alter/index.html)
	* [GuiOtt](http://www.guiott.com/KNX/index.html)


## TPUART

Per il collegamento al bus KNX è richiesto un hardware che segua le specifiche del livello fisico. 
In questo esempio è usato il chip ufficiale della Siemens: [TPUART-2](./TPUART2_Datenblatt_20130806_01.pdf). [In questa scheda di sviluppo](https://www.auto.tuwien.ac.at/~mkoegler/index.php/tpuart) può essere visto un possibile schema applicativo con optoisolatori. Questa scheda è basata sul TPUART-1. Attualmente è disponibile il TPUART-2, più piccolo e più economico con alcune funzionalità in più, ma perfettamente compatibile con il precedente. Come si può vedere dal diagramma questo chip si occupa dei livelli più bassi del protocollo riportando su una seriale a 19.200kbps i telegrammi già decodificati.


## KNX demon

knxd è un programma che può essere lanciato come servizio e crea un gateway verso praticamente tutti i sistemi hardware di connessione al bus KNX.
L'installazione su Raspberry PI o Pine64 è facilitata da alcuni script già pronti, ma può essere compilato per tutti le maggiori distribuzioni Linux esistenti.
Sul [wiki github](https://github.com/knxd/knxd/wiki) sono descritte tutte le interfacce utilizzabili: seriali, USB o IP. Il demone deve girare sulla macchina fisicamente collegata al bus, questa pubblica in rete un servizio a disposizione di Openhab o di altri programmi come i knxtools, disponibili sempre su [github](https://github.com/knxd/knxd/), per poter effettuare tutte le operazioni necessarie sul bus di campo.
Anche ETS, il programma di gestione dei dispositivi ufficiale del consorzio KNX, può usare knxd come sistema di collegamento al bus.
Nel nostro esempio, per collegarsi al TPUART knxd usa la porta seriale ttyAMA0 che deve essere liberata dai servizi di console del sistema operativo.
La configurazione di default del servizio, quella proposta dagli script di installazione, va bene per la Raspberry PI. Nella Raspberry PI3 bisogna disabilitare anche il bluetooth che occupa la stessa porta:

<pre class="terminal">
openhabian@RasPIguiott:~$ nano /etc/default/knxd
KNXD_OPTIONS="--eibaddr=1.1.128 --client-addrs=1.1.129:1 -d -D -T -R -S -i --listen-local=/tmp/knx -b tpuarts:/dev/ttyAMA0"
</pre>

Per verificare che la configurazione effettuata fino a questo punto sia corretta, si possono usare i [knxtool](https://github.com/knxd/knxd/wiki/KnxTool) installati insieme al servizio.

monitor dei telegrammi sul bus:

<pre class="terminal">
openhabian@RasPIguiott:~$ knxtool busmonitor1 ip:localhost
LPDU: B4 11 F0 0D D1 E1 00 81 16 :L_Data urgent from 1.1.240 to 1/5/209 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write (small) 01 
LPDU: B4 :Unknown LPDU: B4 
LPDU: B4 11 F0 0D D1 E1 00 80 17 :L_Data urgent from 1.1.240 to 1/5/209 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write (small) 00 
LPDU: B4 :Unknown LPDU: B4 
LPDU: B4 11 F0 0E 69 E1 00 81 AD :L_Data urgent from 1.1.240 to 1/6/105 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write (small) 01 
LPDU: B4 :Unknown LPDU: B4 
LPDU: B4 11 F0 0E 69 E1 00 80 AC :L_Data urgent from 1.1.240 to 1/6/105 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write (small) 00 
LPDU: B4 :Unknown LPDU: B4 
</pre>

Comando di dispositivi:
<pre class="terminal">
[13:00:36] openhabian@RasPIguiott:~$ knxtool on ip:localhost 1/6/105
Send request
[13:02:25] openhabian@RasPIguiott:~$ knxtool off ip:localhost 1/6/105
Send request
[13:02:34] openhabian@RasPIguiott:~$ 
</pre>

##Installazione

Per avere un ambiente Openhabian2 completamente configurato è consigliabile partire dalla distribuzione ufficiale fornita come immagine SD card e [seguire tutte le istruzioni](http://docs.openhab.org/installation/openhabian.html).
Al primo login si avvia l'installazione completa di tutto il SW a contorno necessario. Questo può richiedere anche un'ora.

Una volta finita l'installazione si può usare openhabian-config (l'equivalente di raspi-config del raspbian) per aggiungere eventuale SW aggiuntivo e per configurare la scheda

<pre class="terminal">
openhabian@RasPIguiott:~$ sudo openhabian-config
</pre>

<img src="./ConfigKNX.png" class="img-responsive center-block" width="50%"/>

Prima di installare knxd occorre rilasciare la porta serial ttyAMA0 dai servizi di console e, per la RPI3, anche dal bluetooth

	* 30 | System Settings      A range of system and hardware related configuration steps ►
		* 35 | Serial Port                           Prepare serial ports for peripherals like R
			* [*] 1  (RPi) Disable serial console           (Razberry, SCC, Enocean)
        	* [*] 2  (RPi3) Disable Bluetooth module        (Razberry)           
        	* [*] 3  Add common serial ports to openHAB JVM (Razberry, Enocean)  
        	 
        	
Per installare knxd seguire i comandi 20 -> 27 

	* 20 | Optional Components  Choose from a set of optional software components ►
		* 27 | knxd       KNX specific, the KNX router/gateway daemon knxd 
		

## Openhabian

Aprire l'interfaccia openhabian con un browser su "http://indirizzo-ip-raspi:8080".

Tramite l'interfaccia paper ui aggiungere il binding KNX:

<img src="./AddKNX.png" class="img-responsive center-block" width="50%"/>

Collegare il binding KNX al servizio knxd

<pre class="terminal">
openhabian@RasPIguiott:~$ nano /etc/openhab2/services/knx.cfg
</pre>

Si può lasciare tutto a default tranne 2 righe:
<pre class="terminal">
type=ROUTER
localIp=localhost
</pre>

Per verificare la configurazione si può aprire la console specifica

<pre class="terminal">
[12:44:08] openhabian@RasPIguiott:~$ ssh -p 8101 openhab@localhost
Password authentication
Password: 

                          __  _____    ____      
  ____  ____  ___  ____  / / / /   |  / __ )     
 / __ \/ __ \/ _ \/ __ \/ /_/ / /| | / __  | 
/ /_/ / /_/ /  __/ / / / __  / ___ |/ /_/ /      
\____/ .___/\___/_/ /_/_/ /_/_/  |_/_____/     
    /_/                        2.1.0
                               - release build -   

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown openHAB.

openhab> config:list "(service.pid=org.openhab.knx)"
----------------------------------------------------------------
Pid:            org.openhab.knx
BundleLocation: mvn:org.openhab.binding/org.openhab.binding.knx/1.10.0
Properties:
   localIp = localhost
   service.pid = org.openhab.knx
   type = ROUTER
openhab> 
</pre>

In caso di problemi può essere utile aumentare il livello di debug per verificare eventuali errori nella configurazione:

<pre class="terminal">
openhab> log:set debug tuwien.auto.calimero
</pre>

oppure abilitare il trace

<pre class="terminal">
log:set TRACE org.openhab.binding.knx
log:set TRACE tuwien.auto.calimero
</pre>

E' consigliabile disabilitarlo alla fine del debug.

<pre class="terminal">
log:set DEFAULT org.openhab.binding.knx
log:set DEFAULT tuwien.auto.calimero
</pre>

Tutte le informazioni utili si trovano in:

<pre class="terminal">
/var/log/openhab2/event
/var/log/openhab2/openhab.log
</pre>

Oppure con il comando 
log:tail
in console

La configurazione viene normalmente presa in modo dinamico dal file /etc/openhab2/services/knx.cfg. Può succedere però che le informazioni rimangano in cache e sopravvivano anche al restart del servizio. A quel punto è consigliabile ripulire la cache prima di riavviare:
<pre class="terminal">
openhab> config:delete org.openhab.knx

openhabian@RasPIguiott:~$ sudo systemctl restart openhab2
</pre>

## Configurazione dispositivi

 Tutte le configurazioni sono in /etc/openhab2

<pre class="terminal">
[13:02:34] openhabian@RasPIguiott:~$ cd /etc/openhab2/
[13:08:30] openhabian@RasPIguiott:/etc/openhab2$ ll
total 52K
drwxrwxr-x+ 13 openhab openhabian 4.0K Aug 10 19:25 ./
drwxr-xr-x  92 root    root       4.0K Aug 12 16:44 ../
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 html/
drwxrwxr-x+  3 openhab openhabian 4.0K Aug 10 19:25 icons/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 12 17:06 items/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 persistence/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 rules/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 scripts/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 12 21:25 services/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 12 17:19 sitemaps/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 sounds/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 things/
drwxrwxr-x+  2 openhab openhabian 4.0K Aug 10 19:25 transform/
[13:08:31] openhabian@RasPIguiott:/etc/openhab2$ 
</pre>
   
Una volta che l'ambiente è pronto si possono creare gli item su openhab, collegarli al binding...

<pre class="terminal">
openhabian@RasPIguiott:~$ nano /etc/openhab2/items/knx.items

Group Grele
Switch          L_Laboratorio       "Laboratorio"           <light>        (Grele)       { knx="1/6/25" }
Switch          L_SalAbatjour       "Salone Abatjour"       <light>        (Grele)       { knx="1/6/105" }
Switch          L_SalDX            	"Salone DX"         	<light>        (Grele)       { knx="1/5/217" }
Switch          L_SalSX         	"Salone SX"         	<light>        (Grele)       { knx="1/5/209" }
Switch          L_CucExt         	"Cucina Esterno"        <light>        (Grele)       { knx="1/5/225" }
Switch          L_Cuc         		"Cucina"        		<light>        (Grele)       { knx="1/5/233" }
Switch          L_CucPens         	"Cucina Pensili"        <light>        (Grele)       { knx="1/5/241" }
Switch          L_BagnoG         	"Bagno Giorno"        	<light>        (Grele)       { knx="1/6/97" }
Switch          L_Ingr	         	"Ingresso"       		<light>        (Grele)       { knx="1/6/81" }
Switch          L_CorridG         	"Corridoio Giorno"      <light>        (Grele)       { knx="1/6/33" }
Switch          L_TV         		"Mobile TV"        		<light>        (Grele)       { knx="1/6/113" }

Switch          L_CamMat1       	"Camera Matrimoniale 1" <light>        (Grele)       { knx="1/6/41" }
Switch          L_CamMat2       	"Camera Matrimoniale 2" <light>        (Grele)       { knx="1/6/49" }
Switch          L_Testata	       	"Testata Letto Matr"	<light>        (Grele)       { knx="1/6/129" }
Switch          L_Camera1       	"Camera 1" 				<light>        (Grele)       { knx="1/6/57" }
Switch          L_Camera2       	"Camera 2" 				<light>        (Grele)       { knx="1/6/65" }
Switch          L_BagnoN         	"Bagno Notte"        	<light>        (Grele)       { knx="1/6/73" }
Switch          L_CorridN         	"Corridoio Notte"       <light>        (Grele)       { knx="1/6/89" }

Switch          S_LuciOff         	"Luci OFF"      		<light>        (Grele)       { knx="1/3/3" }
Switch          S_TvOff	        	"TV OFF"      			<light>        (Grele)       { knx="1/3/4" }
Switch          S_TvOn	        	"TV ON"      			<light>        (Grele)       { knx="1/3/5" }
Switch          S_TapGiu        	"Tapparelle GIU"   		<light>        (Grele)       { knx="1/3/1" }
Switch          S_TapSu	        	"Tapparelle SU"   		<light>        (Grele)       { knx="1/3/2" }

Group Tapparelle
Rollershutter 	T_Salone 			"Salone" 				   			(Tapparelle) { knx="1/5/202, 1/5/201" }
Rollershutter 	T_Laboratorio		"Laboratorio" 			   			(Tapparelle) { knx="1/5/250, 1/5/249" }
Rollershutter 	T_BagnoG			"Bagno Giorno" 			   			(Tapparelle) { knx="1/6/122, 1/6/121" }
Rollershutter 	T_CucinaP			"Cucina Porta" 			  			(Tapparelle) { knx="1/5/186, 1/5/185" }
Rollershutter 	T_CucinaF			"Cucina Fin." 			  			(Tapparelle) { knx="1/5/194, 1/5/193" }
Rollershutter 	T_Camera			"Camera" 				   			(Tapparelle) { knx="1/6/18, 1/6/17" }
Rollershutter 	T_CameraMat			"Camera Mat." 			   			(Tapparelle) { knx="1/6/10, 1/6/9" }
Rollershutter 	T_BagnoN			"Bagno Notte" 			   			(Tapparelle) { knx="1/6/2, 1/6/1" }
</pre>

... e assegnarli ai pulsanti nell'interfaccia grafica:

<pre class="terminal">
openhabian@RasPIguiott:~$ nano /etc/openhab2/sitemaps/knx.sitemap

sitemap knx label="GUIOTT home" 
{
	Frame label="Zona Giorno"
        {
              Switch item=L_Laboratorio
              Switch item=L_SalAbatjour
              Switch item=L_SalSX
              Switch item=L_SalDX
              Switch item=L_CucExt
              Switch item=L_Cuc
              Switch item=L_CucPens
              Switch item=L_BagnoG
              Switch item=L_Ingr
              Switch item=L_CorridG
              Switch item=L_TV
        }   
        
    Frame label="Zona Notte"
        {
              Switch item=L_CamMat1
              Switch item=L_CamMat2
              Switch item=L_Testata
              Switch item=L_Camera1
              Switch item=L_Camera2
              Switch item=L_BagnoN
              Switch item=L_CorridN
        }    
    
    Frame label="Tapparelle"
        {
        	  Switch item=T_Salone
        	  Switch item=T_Laboratorio
        	  Switch item=T_BagnoG
        	  Switch item=T_CucinaP
        	  Switch item=T_CucinaF
        	  Switch item=T_Camera
        	  Switch item=T_CameraMat
        	  Switch item=T_BagnoN
        }
            
    Frame label="Scenari"
        {
              Switch item=S_LuciOff
              Switch item=S_TvOff
              Switch item=S_TvOn
              Switch item=S_TapGiu
              Switch item=S_TapSu
        }       
		
}
</pre>

Questo è il risultato aprendo la pagina a "http://indirizzo-ip-raspi:8080/classicui/app"

<img src="./GuiKNX.png" class="img-responsive center-block" width="50%"/>

## App Mobile

Per usare la stessa configurazione su dispositivi mobile, senza essere fisicamente collegati alla rete domestica, si può usare il servizio cloud open di [openhab](https://myopenhab.org/) e la relativa app sia su [iOS](https://itunes.apple.com/it/app/openhab/id492054521?mt=8) che su [Android](https://play.google.com/store/apps/details?id=org.openhab.habdroid)

Una volta installato l'add-on relativo 

<img src="./OHcloud.png" class="img-responsive center-block" width="40%"/>

si troveranno i file:

<pre class="terminal">
/var/lib/openhab2/uuid
/var/lib/openhab2/openhabcloud/secret
</pre>

il cui contenuto serve per configurare l'account del servizio cloud.
Un tutorial completo sull'installazione e configurazione di questo servizio si può [trovare qui](https://youtu.be/joz5f4ejJVc
).

Lanciando l'app e collegandola con l'account configurato saranno disponibili tutte le funzioni configurate anche sul dispositivo mobile.

<img src="./AppOH.png" class="img-responsive center-block" width="25%"/>

## Links

* [Interfacce KNX ufficiali](https://www.knx.org/knx-en/Landing-Pages/development/system-components/index_backup.php)
* 
* TPUART
	* [TPUART-2](./TPUART2_Datenblatt_20130806_01.pdf)
	* [Scheda di sviluppo](https://www.auto.tuwien.ac.at/~mkoegler/index.php/tpuart)
	
* knxd
	* [knxd KNX demon](https://github.com/knxd/knxd/wiki)
	* [Configurazione manuale](http://michlstechblog.info/blog/raspberry-pi-eibknx-ip-gateway-and-router-with-knxd/)
	
* OpenHAB
	* [Open HAB su Raspberry Pi](http://docs.openhab.org/installation/rasppi.html)
	* [openHABian - Hassle-free openHAB Setup](http://docs.openhab.org/installation/openhabian.html)
	* [Installazione manuale di openHAB su Raspberry PI 3](./opeHAB_RaspberryPI-3.pdf)
	* [Servizio cloud](https://myopenhab.org/)
	* [Slides di Massimiliano Casini su Open HAB](https://docs.google.com/presentation/d/10DPPHumq0PqhR1W8O9O3a_Z710Q-2M1eWKkTn41gLdw/edit?usp=sharing)
	 
	

@include='bio_guido_ottaviani'
@include='bio_massimiliano_casini'

The TanzoLab Project

Il TanzoLab è una iniziativa senza fini di lucro, nata da un'idea di Sergio Tanzilli socio fondatore di Acme Systems srl nel Novembre 2015, per trasferire ad appassionati di elettronica e informatica, professionisti e aziende nel settore, le conoscenze necessarie per poter creare prodotti embedded adatti per la produzione industriale.

Le attività del TanzoLab si svolgono ogni mercoledi sera, salvo casi speciali, dalle ore 18:30 presso i locali della Acme Systems srl e consistono in:

  • Talk monotematici a cura di professionisti in vari settori tecnologici
  • Workshop pratici su elettronica embedded, produzione e informatica
  • Progettazione e realizzazione di nuovi prodotti embedded per l'IT

Le attività vengono coordinate tramite questo sito, in cui vengono pubblicati tutti i lavori svolti o in via di sviluppo, e tramite un gruppo Telegram con cui per interagire direttamente via chat con gli altri membri.