<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.konnekting.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=M.freudenreich</id>
	<title>KONNEKTING Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.konnekting.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=M.freudenreich"/>
	<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php/Special:Contributions/M.freudenreich"/>
	<updated>2026-04-20T08:01:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.11</generator>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=941</id>
		<title>EnOcean Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=941"/>
		<updated>2021-05-30T21:36:56Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|EnOcean Gateway&lt;br /&gt;
|-&lt;br /&gt;
!|[[File:EnOcean_Gateway_Case_close.jpg|300px|thumb|center]] Version 1&lt;br /&gt;
| [[File:EnOcean_Gateway_Case_close.jpg|300px|thumb|center]] Version 2&lt;br /&gt;
|-&lt;br /&gt;
!|[[File:EnOcean Gateway Case open.jpg|300px|thumb|center]]&lt;br /&gt;
| [[File:EnOcean Gateway Case open.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 0.9 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! EnOcean Module&lt;br /&gt;
| EnOceanPI&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
[https://github.com/KONNEKTING/Konnekting_EnOcean_Gateway GiitHub Source Code]&lt;br /&gt;
&lt;br /&gt;
===Software Components===&lt;br /&gt;
; KonnektingEnocean_V1.0.ino&lt;br /&gt;
: &amp;quot;Operating System&amp;quot;, maps together all components, here the set of devices is configured.&lt;br /&gt;
; kdevice_KNX_EnOcean_Gateway.h&lt;br /&gt;
: Derived from the Konnekting configuration XML this header-file defines the available-configuration elements&lt;br /&gt;
; EEPROM.h&lt;br /&gt;
: Basic input/output, to access the EEPROM storage that stores the configuration.&lt;br /&gt;
; EnOcean.h / EnOcean.cpp&lt;br /&gt;
: Core components, that are shared among the device-modules.&lt;br /&gt;
&lt;br /&gt;
; [[EnOcean_Gateway Device Software Template | EnOceanDevice_EMPTY.h]]&lt;br /&gt;
: Empty EnOcean device template, can be used as a source for copying, to create new Device modules for this Gateway. Feel free to join the development!&lt;br /&gt;
; [[EnOcean_Gateway Device NodOn 2Ch | EnOceanDevice_NodOn_2Ch.h]]&lt;br /&gt;
: Device Module to forward the [https://nodon.fr/en/nodon/enocean-relay-switch-2-channels/ actuators] states from EnOcean to KNX. To allow switching of the actuator from KNX it is neccessary to use a sender module.&lt;br /&gt;
; [[EnOcean_Gateway Device RPS sender | EnOceanDevice_RPS_sender.h]]&lt;br /&gt;
: Device Module that simulates a simple single EnOcean push-button. Can be used to switch EnOcean actuators. This module can be used independently from any actuator, it is working fire and forget.&lt;br /&gt;
; [[EnOcean_Gateway Device RPS simple | EnOceanDevice_RPS_simple.h]]&lt;br /&gt;
: Device Module that receives commands from EnOcean push-button devices with up to four rockers.&lt;br /&gt;
&lt;br /&gt;
===Software structure===&lt;br /&gt;
Each Device Module defines the Konnekting representation of a specific device-type. E.g. EnOceanDevice_RPS_simple.h is a module that reflects a standard push-button switches such as Eltako FT-55. If you have two switches, so two FT-55, you need two instances of that Device Module loaded in your Sketch.&lt;br /&gt;
&lt;br /&gt;
Within the &amp;quot;operating system&amp;quot; the devices are registered as objects and within the setup-routine configured. The order of appearance within the setup-routine matters.&lt;br /&gt;
&lt;br /&gt;
===How to build the software===&lt;br /&gt;
Use Arduino with the libraries Wire and KonnektingDevice.&lt;br /&gt;
&lt;br /&gt;
== Supported EEP Profiles ==&lt;br /&gt;
ETS* = Sonderversion die direkt in der ETS genutzt werden kann&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Profil !! Konnekting !! ETS* !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || F6-02-01 || x || x || Rocker Switch 2&lt;br /&gt;
|-&lt;br /&gt;
| 1 || F6-02-02 || x || x || Rocker Switch 2&lt;br /&gt;
|-&lt;br /&gt;
| 2 || F6-02-03 ||   || x || &lt;br /&gt;
|-&lt;br /&gt;
| 3 || F6-02-04 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 4 || F6-03-01 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 5 || F6-03-02 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 6 || F6-04-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 7 || F6-04-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || F6-05-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 9 || F6-10-00 || x || x || Fenstergriff&lt;br /&gt;
|-&lt;br /&gt;
| 10 || F6-10-01 || x || x || Fenstergriff (ERP2)&lt;br /&gt;
|-&lt;br /&gt;
| 11 || D5-00-01 || x || x || Fensterkontakt&lt;br /&gt;
|-&lt;br /&gt;
| 12 || A5-02-01 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 13 || A5-02-02 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 14 || A5-02-03 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 15 || A5-02-04 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 16 || A5-02-05 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 17 || A5-02-06 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 18 || A5-02-07 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 19 || A5-02-08 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 20 || A5-02-09 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 21 || A5-02-0A ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 22 || A5-02-0B ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 23 || A5-02-10 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 24 || A5-02-11 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 25 || A5-02-12 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 26 || A5-02-13 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 27 || A5-02-14 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 28 || A5-02-15 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 29 || A5-02-16 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 30 || A5-02-17 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 31 || A5-02-18 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 32 || A5-02-19 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 33 || A5-02-1A ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 34 || A5-02-1B ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 35 || A5-02-20 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 36 || A5-02-30 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 37 || A5-04-01 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 38 || A5-04-02 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 39 || A5-04-03 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 40 || A5-05-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 41 || A5-06-01 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 42 || A5-06-02 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 43 || A5-06-03 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 44 || A5-07-01 || x || x || PIR&lt;br /&gt;
|-&lt;br /&gt;
| 45 || A5-07-02 || x || x || PIR&lt;br /&gt;
|-&lt;br /&gt;
| 46 || A5-07-03 || x || x || PIR&lt;br /&gt;
|-&lt;br /&gt;
| 47 || A5-08-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 48 || A5-08-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 49 || A5-08-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 50 || A5-09-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 51 || A5-09-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 52 || A5-09-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 53 || A5-09-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 54 || A5-09-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 55 || A5-09-07 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 56 || A5-09-08 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 57 || A5-09-09 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 58 || A5-09-0A ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 59 || A5-09-0B ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 60 || A5-10-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 61 || A5-10-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 62 || A5-10-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 63 || A5-10-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 64 || A5-10-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 65 || A5-10-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 66 || A5-10-07 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 67 || A5-10-08 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 68 || A5-10-09 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 69 || A5-10-0A ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 70 || A5-10-0B ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 71 || A5-10-0C ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 72 || A5-10-0D ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 73 || A5-10-10 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 74 || A5-10-11 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 75 || A5-10-12 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 76 || A5-10-13 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 77 || A5-10-14 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 78 || A5-10-15 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 79 || A5-10-16 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 80 || A5-10-17 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 81 || A5-10-18 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 82 || A5-10-19 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 83 || A5-10-1A ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 84 || A5-10-1B ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 85 || A5-10-1C ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 86 || A5-10-1D ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 87 || A5-10-1E ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 88 || A5-10-1F ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 89 || A5-10-20 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 90 || A5-10-21 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 91 || A5-11-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 92 || A5-11-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 93 || A5-11-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 94 || A5-11-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 95 || A5-12-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 96 || A5-12-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 97 || A5-12-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 98 || A5-12-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 99 || A5-12-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 100 || A5-12-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 101 || A5-12-10 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 102 || A5-13-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 103 || A5-13-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 104 || A5-13-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 105 || A5-13-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 106 || A5-13-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 107 || A5-13-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 108 || A5-13-10 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 109 || A5-14-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 110 || A5-14-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 111 || A5-14-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 112 || A5-14-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 113 || A5-14-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 114 || A5-14-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 115 || A5-20-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 116 || A5-20-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 117 || A5-20-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 118 || A5-20-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 119 || A5-20-10 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 120 || A5-20-11 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 121 || A5-20-12 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 122 || A5-30-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 123 || A5-30-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 124 || A5-30-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 125 || A5-30-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 126 || A5-30-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 127 || A5-37-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 128 || A5-38-08 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 129 || A5-38-09 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 130 || A5-3F-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 131 || A5-3F-7F ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 132 || D2-00-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 133 || D2-01-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 134 || D2-01-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 135 || D2-01-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 136 || D2-01-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 137 || D2-01-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 138 || D2-01-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 139 || D2-01-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 140 || D2-01-07 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 141 || D2-01-08 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 142 || D2-01-09 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 143 || D2-01-0A ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 144 || D2-01-0B ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 145 || D2-01-0C ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 146 || D2-01-0D ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 147 || D2-01-0E ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 148 || D2-01-0F ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 149 || D2-01-10 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 150 || D2-01-11 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 151 || D2-01-12 || x || x || NodOn 2CH Aktor&lt;br /&gt;
|-&lt;br /&gt;
| 152 || D2-01-13 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 153 || D2-01-14 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 154 || D2-02-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 155 || D2-02-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 156 || D2-02-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 157 || D2-03-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 158 || D2-03-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 159 || D2-03-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 160 || D2-04-00 || x || x || CO2, Hum, Temp&lt;br /&gt;
|-&lt;br /&gt;
| 161 || D2-04-01 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 162 || D2-04-02 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 163 || D2-04-03 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 164 || D2-04-04 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 165 || D2-04-05 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 166 || D2-04-06 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 167 || D2-04-07 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 168 || D2-04-08 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 169 || D2-04-09 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 170 || D2-04-10 ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 171 || D2-04-1A ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 172 || D2-04-1B ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 173 || D2-04-1C ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 174 || D2-04-1D ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 175 || D2-04-1E ||  || x || &lt;br /&gt;
|-&lt;br /&gt;
| 176 || D2-05-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 177 || D2-05-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 178 || D2-05-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 179 || D2-06-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 180 || D2-10-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 181 || D2-10-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 182 || D2-10-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 183 || D2-11-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 184 || D2-11-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 185 || D2-11-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 186 || D2-11-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 187 || D2-11-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 188 || D2-11-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 189 || D2-11-07 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 190 || D2-11-08 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 191 || D2-20-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 192 || D2-20-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 193 || D2-20-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 194 || D2-30-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 195 || D2-30-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 196 || D2-30-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 197 || D2-30-03 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 198 || D2-30-04 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 199 || D2-30-05 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 200 || D2-30-06 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 201 || D2-31-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 202 || D2-31-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 203 || D2-32-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 204 || D2-32-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 205 || D2-32-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 206 || D2-33-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 207 || D2-34-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 208 || D2-34-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 209 || D2-34-02 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 210 || D2-40-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 211 || D2-40-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 212 || D2-50-00 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 213 || D2-50-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 214 || D2-50-10 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 215 || D2-50-11 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 216 || D2-A0-01 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 217 || D2-B0-51 ||  ||  || &lt;br /&gt;
|}&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
* Get the sketch from the GitHub Source. It comes with an example setup, that allows you to&lt;br /&gt;
** Receive telegrams from up to 10 EnOcean button-units ([[EnOcean_Gateway Device RPS simple | EnOceanDevice_RPS_simple.h]])&lt;br /&gt;
** Send telegrams as up to 10 Buttons would do, so you can teach your KNX group address (type DPT 1) to any EnOcean Device ([[EnOcean_Gateway Device RPS sender | EnOceanDevice_RPS_sender.h]])&lt;br /&gt;
** Update the Status of up to 10 2Ch Nodon Actuators ([[EnOcean_Gateway Device NodOn 2Ch | EnOceanDevice_NodOn_2Ch.h]])&lt;br /&gt;
* If needed change the device-configuration, e.g. if you need more or different Device Modules.&lt;br /&gt;
** Build the XML File with an XML-Editor of your choice&lt;br /&gt;
*** Add the Device Module XML snippets of your choice&lt;br /&gt;
*** Take good care of the order of the Device Modules within your XML-File&lt;br /&gt;
** Use the KONNEKTING-CodeCreator to create your h-File, matching the XML-File&lt;br /&gt;
** Alter the KonnektingEnocean_V1.0.ino file to match the XML-File.&lt;br /&gt;
* Upload the code to your Hardware. Refer [[HowToUploadArduinoCode]] if you are struggling with Uploading. Here the device only needs to be connected to your PC via USB, no KNX connection is needed.&lt;br /&gt;
** You need the Wire lib and this one: [https://github.com/KONNEKTING/KonnektingDeviceLibrary| KONNEKTING Lib]&lt;br /&gt;
* Configure the Gateway, using the Konnekting Suite and the XML-File, refer each Device Modules documentation on how to set the configuration. Some EnOcean device-ids might be needed here, so hold them ready.&lt;br /&gt;
* Upload the configuration to the device using the Suite. Now no USB connection is needed but your Hardware needs to be connected KNX instead.&lt;br /&gt;
* Now you don&amp;#039;t need your PC anymore. Teach in all relevant EnOcean devices. Follow the instructions on each Device Modules page to understand the way each device-type is configured.&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
[[EnOcean_Gateway Device Software Template | Refer this on how to build your own EnOcean Device Module]]&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;br /&gt;
&lt;br /&gt;
[https://knx-user-forum.de/forum/projektforen/konnekting/1132413-konnekting-enocean-gateway-alt-etwas-in-die-zukunft-geschaut-coming-soon| KNX User Forum Thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.enocean.com/fileadmin/redaktion/enocean_alliance/pdf/EnOcean_Equipment_Profiles_EEP_V2.6.3_public.pdf| EnOcean Equipment Profiles]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=739</id>
		<title>1-Wire Gateway BOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=739"/>
		<updated>2019-05-03T19:34:03Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10  &amp;lt;-- Zurück]&lt;br /&gt;
&lt;br /&gt;
 *)  Bauteile die bestückt werden wenn [[ein]] 5V Regler benötigt wird!&lt;br /&gt;
 **) Bauteile die bestückt werden wenn [[kein]] 5V Regler benötigt wird!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11 &lt;br /&gt;
|-&lt;br /&gt;
| Stecker || X2 || Micromatch 16p || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 || ADUM1251 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U3 ||ADUM1251 || 0|| x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U4 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U5 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U8 ||DS2482-100 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U24 || DS9503 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U6 || DS9503 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U9 || DS9503 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U11 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U10 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U12 || MAX9940 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q1 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q2 || MAX9940 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q3 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C1 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C2 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C6 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C8 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C10 || 100nF/50V/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C12 || 100nF/50V/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C13 || 100nF/50V/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C9 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C11 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C14 || 1uF/35V/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R1 || 4k7/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R2 || 4k7/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R11 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R12 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R5 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R15 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R16 || 300R/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R7 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R13 || 1k/0603 || 0 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R14 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| +5V Regler || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; U2 &amp;lt;div&amp;gt;  ||TPS7B7702 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; C3 &amp;lt;div&amp;gt; || 1uF/35V/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator ||  &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt;C4 &amp;lt;div&amp;gt; || 10uF/16V/0805 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator ||  &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt;C5 &amp;lt;div&amp;gt; || 10uF/16V/0805 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; C7 &amp;lt;div&amp;gt; || 10uF/16V/0805 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R3 &amp;lt;div&amp;gt; || 5k6/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R4 &amp;lt;div&amp;gt; || 5k6/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 30k Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R6 &amp;lt;div&amp;gt; || 30k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 30k Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R9 &amp;lt;div&amp;gt; || 30k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10k Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R8 &amp;lt;div&amp;gt; || 10k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10k Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt;  R10 &amp;lt;div&amp;gt; || 10k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R17 &amp;lt;div&amp;gt;  || 0R/0603 || 1** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || &amp;lt;div style=&amp;quot;background:yellow&amp;quot;&amp;gt; R19 &amp;lt;div&amp;gt;  || 0R/0603 || 1** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R20 || 0R/1206 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R21 || 0R/1206 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R18 || 0R/0603 || 1 || x&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=738</id>
		<title>1-Wire Gateway BOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=738"/>
		<updated>2019-05-03T19:18:11Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10  &amp;lt;-- Zurück]&lt;br /&gt;
&lt;br /&gt;
 *)  Bauteile die bestückt werden wenn [[ein]] 5V Regler benötigt wird!&lt;br /&gt;
 **) Bauteile die bestückt werden wenn [[kein]] 5V Regler benötigt wird!&lt;br /&gt;
 ***) Bauteile die bestückt werden wenn man nur einen ADUM12XX einsetzt und mehrere 1-Wire Master&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11 &lt;br /&gt;
|-&lt;br /&gt;
| Stecker || X2 || Micromatch 16p || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 || ADUM1251 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U3 ||ADUM1251 || 0|| x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U4 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U5 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U8 ||DS2482-100 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U24 || DS9503 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U6 || DS9503 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U9 || DS9503 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U11 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U10 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U12 || MAX9940 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q1 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q2 || MAX9940 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q3 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| +5V Regler || U2 ||TPS7B7702 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C1 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C2 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C6 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C8 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C10 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C12 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C13 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C3 || 1uF/35V/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C9 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C11 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C14 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || C4 || 10uF/16V/0805 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || C5 || 10uF/16V/0805 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || C7 || 10uF/16V/0805 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R1 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R2 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R11 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R12 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || R3 || 5k6/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || R4 || 5k6/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R5 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R15 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R16 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 30k Widerstand || R6 || 30k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 30k Widerstand || R9 || 30k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R7 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R13 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R14 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 10k Widerstand || R8 || 10k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 10k Widerstand || R10 || 10k/0603 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R17 || 0R/0603 || 1** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R19 || 0R/0603 || 1** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R18 || 0R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R20 || 0R/1206 || 1*** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R21 || 0R/1206 || 1*** || x&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=737</id>
		<title>1-Wire Gateway BOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=737"/>
		<updated>2019-05-03T19:14:04Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10  &amp;lt;-- Zurück]&lt;br /&gt;
&lt;br /&gt;
 *)  Bauteile die bestückt werden wenn [[ein]] 5V Regler benötigt wird!&lt;br /&gt;
 **) Bauteile die bestückt werden wenn [[kein]] 5V Regler benötigt wird!&lt;br /&gt;
 ***) Bauteile die bestückt werden wenn man nur einen ADUM12XX einsetzt und mehrere 1-Wire Master&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11 &lt;br /&gt;
|-&lt;br /&gt;
| Stecker || X2 || Micromatch 16p || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 || ADUM1251 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U3 ||ADUM1251 || 0|| x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U4 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U5 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U8 ||DS2482-100 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U24 || DS9503 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U6 || DS9503 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| ESD Diode  || U9 || DS9503 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U11 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U10 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| OV Protection  || U12 || MAX9940 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q1 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q2 || MAX9940 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| Mosfet    || Q3 || MAX9940 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| +5V Regler || U2 ||TPS7B7702 || 1* || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C1 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C2 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C6 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C8 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C10 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C12 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Kondensator || C13 || 100nF/50V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C3 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C9 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C11 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1uF Kondensator || C14 || 1uF/35V/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || C4 || 10uF/16V/0805 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || C5 || 10uF/16V/0805 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 10uF Kondensator || C7 || 10uF/16V/0805 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R1 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R2 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R11 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 4k7 Widerstand || R12 || 4k7/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || R3 || 5k6/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || R4 || 5k6/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 5k6 Widerstand || R4 || 5k6/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R5 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R15 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 300R Widerstand || R16 || 300R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 30k Widerstand || R6 || 30k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R7 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R13 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1k Widerstand || R14 || 1k/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R17 || 0R/0603 || 1** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R19 || 0R/0603 || 1** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R18 || 0R/0603 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R20 || 0R/1206 || 1*** || x&lt;br /&gt;
|-&lt;br /&gt;
| 0R Widerstand || R21 || 0R/1206 || 1*** || x&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=736</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=736"/>
		<updated>2019-05-03T08:34:30Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Firmware10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
===Block Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Hardware BlockDiagram.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Übersicht aller verfügbarer Firmware-Stände&lt;br /&gt;
&lt;br /&gt;
===Firmware10 (FW10)===&lt;br /&gt;
&lt;br /&gt;
 Belegung: 1-Wire-Bus&lt;br /&gt;
 * CH1: abfragen Sensor ID&lt;br /&gt;
 * CH2: Temperatursensoren DS18B20 (max 20)&lt;br /&gt;
 * CH3: N/A&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway BOM | Bauteilliste (BOM) ]]&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway Bestückung | HW Bestückung ]]&lt;br /&gt;
&lt;br /&gt;
Link auf GitHub&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Firmware10 Overview.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Software Aufbau ==&lt;br /&gt;
&lt;br /&gt;
===XML File Aufbau anhand der FW10===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bold text&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=735</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=735"/>
		<updated>2019-05-03T08:34:02Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* XML File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
===Block Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Hardware BlockDiagram.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Übersicht aller verfügbarer Firmware-Stände&lt;br /&gt;
&lt;br /&gt;
===Firmware10===&lt;br /&gt;
&lt;br /&gt;
 Belegung: 1-Wire-Bus&lt;br /&gt;
 * CH1: abfragen Sensor ID&lt;br /&gt;
 * CH2: Temperatursensoren DS18B20 (max 20)&lt;br /&gt;
 * CH3: N/A&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway BOM | Bauteilliste (BOM) ]]&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway Bestückung | HW Bestückung ]]&lt;br /&gt;
&lt;br /&gt;
Link auf GitHub&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Firmware10 Overview.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Software Aufbau ==&lt;br /&gt;
&lt;br /&gt;
===XML File Aufbau anhand der FW10===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bold text&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=734</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=734"/>
		<updated>2019-05-03T08:33:12Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Firmware10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
===Block Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Hardware BlockDiagram.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Übersicht aller verfügbarer Firmware-Stände&lt;br /&gt;
&lt;br /&gt;
===Firmware10===&lt;br /&gt;
&lt;br /&gt;
 Belegung: 1-Wire-Bus&lt;br /&gt;
 * CH1: abfragen Sensor ID&lt;br /&gt;
 * CH2: Temperatursensoren DS18B20 (max 20)&lt;br /&gt;
 * CH3: N/A&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway BOM | Bauteilliste (BOM) ]]&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway Bestückung | HW Bestückung ]]&lt;br /&gt;
&lt;br /&gt;
Link auf GitHub&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Firmware10 Overview.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Software Aufbau ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bold text&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_Best%C3%BCckung&amp;diff=733</id>
		<title>1-Wire Gateway Bestückung</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_Best%C3%BCckung&amp;diff=733"/>
		<updated>2019-05-03T08:30:39Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: Created page with &amp;quot;[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10  &amp;lt;-- Zurück]&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10  &amp;lt;-- Zurück]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=732</id>
		<title>1-Wire Gateway BOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=732"/>
		<updated>2019-05-03T08:30:06Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10  &amp;lt;-- Zurück]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11 &lt;br /&gt;
|-&lt;br /&gt;
| Stecker || J1 || Micromatch 16p || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 || ADUM1251 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 ||ADUM1251 || 0|| x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| +5V Regler || U1 ||TPS7B7702 || 1* || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 *)  Bauteile die bestückt werden wenn [[ein]] 5V Regler benötigt wird!&lt;br /&gt;
 **) Bauteile die bestückt werden wenn [[kein]] 5V Regler benötigt wird!&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=731</id>
		<title>1-Wire Gateway BOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=731"/>
		<updated>2019-05-03T08:29:40Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.konnekting.de/index.php/1-Wire_Gateway#Firmware10 | &amp;lt;-- Zurück]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11 &lt;br /&gt;
|-&lt;br /&gt;
| Stecker || J1 || Micromatch 16p || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 || ADUM1251 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 ||ADUM1251 || 0|| x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| +5V Regler || U1 ||TPS7B7702 || 1* || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 *)  Bauteile die bestückt werden wenn [[ein]] 5V Regler benötigt wird!&lt;br /&gt;
 **) Bauteile die bestückt werden wenn [[kein]] 5V Regler benötigt wird!&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=730</id>
		<title>1-Wire Gateway BOM</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway_BOM&amp;diff=730"/>
		<updated>2019-05-03T08:26:59Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: Created page with &amp;quot;   {| class=&amp;quot;wikitable&amp;quot; |- ! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11  |- | Stecker || J1 || Micromatch 16p || 1 || x |- | gal Tr. I2C || U1 || ADUM1251 || 1 || x |-...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil Funktion !! Ref !! Bauteil !! FW10 !! FW11 &lt;br /&gt;
|-&lt;br /&gt;
| Stecker || J1 || Micromatch 16p || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 || ADUM1251 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| gal Tr. I2C || U1 ||ADUM1251 || 0|| x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || 1 || x&lt;br /&gt;
|-&lt;br /&gt;
| 1-Wire Master I2C || U1 ||DS2482-100 || x || x&lt;br /&gt;
|-&lt;br /&gt;
| +5V Regler || U1 ||TPS7B7702 || 1* || x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 *)  Bauteile die bestückt werden wenn [[ein]] 5V Regler benötigt wird!&lt;br /&gt;
 **) Bauteile die bestückt werden wenn [[kein]] 5V Regler benötigt wird!&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=729</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=729"/>
		<updated>2019-05-03T07:40:20Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
===Block Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Hardware BlockDiagram.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Übersicht aller verfügbarer Firmware-Stände&lt;br /&gt;
&lt;br /&gt;
===Firmware10===&lt;br /&gt;
&lt;br /&gt;
Belegung: 1-Wire-Bus&lt;br /&gt;
&lt;br /&gt;
* CH1: abfragen Sensor ID&lt;br /&gt;
* CH2: Temperatursensoren DS18B20 (max 20)&lt;br /&gt;
* CH3: N/A&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway BOM | Bauteilliste (BOM) ]]&lt;br /&gt;
&lt;br /&gt;
[[ 1-Wire Gateway Bestückung | HW Bestückung ]]&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Firmware10 Overview.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Software Aufbau ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bold text&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=728</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=728"/>
		<updated>2019-05-03T06:11:24Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Firmware10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
===Block Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Hardware BlockDiagram.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Übersicht aller verfügbarer Firmware-Stände&lt;br /&gt;
&lt;br /&gt;
===Firmware10===&lt;br /&gt;
&lt;br /&gt;
Belegung: 1-Wire-Bus&lt;br /&gt;
&lt;br /&gt;
* CH1: abfragen Sensor ID&lt;br /&gt;
* CH2: Temperatursensoren DS18B20 (max 20)&lt;br /&gt;
* CH3: N7A&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Firmware10 Overview.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Software Aufbau ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bold text&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=727</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=727"/>
		<updated>2019-05-03T06:09:53Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
===Block Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Hardware BlockDiagram.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Übersicht aller verfügbarer Firmware-Stände&lt;br /&gt;
&lt;br /&gt;
===Firmware10===&lt;br /&gt;
&lt;br /&gt;
Belegung: 1-Wire-Bus&lt;br /&gt;
&lt;br /&gt;
* CH1: abfragen Sensor ID&lt;br /&gt;
* CH2: Temperatursensoren (max 20)&lt;br /&gt;
* CH3: N7A&lt;br /&gt;
&lt;br /&gt;
[[File:1-Wire Gateway Firmware10 Overview.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Software Aufbau ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bold text&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Min&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Max&amp;#039;&amp;#039;&amp;#039; = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=File:1-Wire_Gateway_Hardware_BlockDiagram.PNG&amp;diff=726</id>
		<title>File:1-Wire Gateway Hardware BlockDiagram.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=File:1-Wire_Gateway_Hardware_BlockDiagram.PNG&amp;diff=726"/>
		<updated>2019-05-03T05:57:35Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=File:1-Wire_Gateway_Firmware10_Overview.PNG&amp;diff=725</id>
		<title>File:1-Wire Gateway Firmware10 Overview.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=File:1-Wire_Gateway_Firmware10_Overview.PNG&amp;diff=725"/>
		<updated>2019-05-03T05:52:49Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=724</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=724"/>
		<updated>2019-05-01T10:49:26Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|1-Wire Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht, warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
Min = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Max = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
Min = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Max = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=723</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=723"/>
		<updated>2019-05-01T10:47:00Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|EnOcean Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
Lest euch zuerst bitte diese Seite durch:&lt;br /&gt;
[https://www.konnekting.de/konnekting-lernen/lektion-3-aufbau-von-konnekting/#Das_kdevicexml_Format| Aufbau Konnekting ]&lt;br /&gt;
&lt;br /&gt;
Was benötige ich:&lt;br /&gt;
* Notepad ++ (kann ich empfehlen und kostet nichts)&lt;br /&gt;
;&lt;br /&gt;
Eine Beschreibung der XML Struktur findet ihr hier: &lt;br /&gt;
[https://wiki.konnekting.de/index.php/KONNEKTING_XML_Device_Description | Beschreibung XML ]&lt;br /&gt;
Wenn ihr bei den Punkten unten nicht genau versteht, warum ich das so gemacht habe, dann könnt ihr hier noch einmal nachschauen.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Jetzt können wir Anfangen :-)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Jede XML Datei beginnt mit diesem Kopf. Hier muss man nur anpassen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;KonnektingDevice xmlns=&amp;quot;http://konnekting.de/xml/KonnektingDevice/v0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Device ManufacturerId=&amp;quot;57005&amp;quot; DeviceId=&amp;quot;8&amp;quot; Revision=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ManufacturerName&amp;gt;KONNEKTING&amp;lt;/ManufacturerName&amp;gt;&lt;br /&gt;
        &amp;lt;DeviceName&amp;gt;KNX 1-Wire Gateway&amp;lt;/DeviceName&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ManufacturerId:&amp;#039;&amp;#039;&amp;#039;  bekommt man zugewiesen wenn man sich eine beantragt hat -&amp;gt; Meine ID ist: 57005 -&amp;gt; in HEX 0xDEAD&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DeviceId:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt; alle meine 1-Wire Device haben die ID = 8&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision:&amp;#039;&amp;#039;&amp;#039; kann frei gewählt werden -&amp;gt;  als neue Revision nutze ich 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Eine XML ist immer so im Grundgerüst aufgebaut:&lt;br /&gt;
 * Kopf&lt;br /&gt;
 * Parameter&lt;br /&gt;
 * CommObjects (GA)&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
Der Kopf ist mit den Änderungen schon fertig, jetzt kommen wir zu den Parametern. Es macht hier Sinn, sich schon im Voraus Gedanken zu machen, welche Parameter benötigt werden. Änderungen in Nachgang sind eher etwas lästig. &lt;br /&gt;
&lt;br /&gt;
 Bei den Parametern gibt es auch ein Grundgerüst: &lt;br /&gt;
 * ParameterGroup: Hier können Parametergruppen erzeugt werden, die in der Suite dann als eigene Seite dargestellt werden. Hat keinen Einfluß auf die spätere Funktion, es sieht in der Suite &lt;br /&gt;
 einfach nur übersichtlicher aus.&lt;br /&gt;
 * Parameter: Hier werden dann die eigentlichen Parameter/Settings definiert. &lt;br /&gt;
&lt;br /&gt;
Für die ersten Parameter werde ich folgende Struktur aufsetzen:&lt;br /&gt;
 ParameterGroup_0:  &amp;quot;Einlesen Sensor IDs&amp;quot;&lt;br /&gt;
 :: Parameter_0: „zyklisches senden neuer ID  ON / OFF“ &lt;br /&gt;
 :: Parameter_1: „neue Sensor ID zyklisch senden alle:  X sek/min“&lt;br /&gt;
 ParameterGroup_1:  &amp;quot;Temperatur-Sensoren“&lt;br /&gt;
 :: Parameter_2: „Temperaturwerte zyklisch senden alle:  X sek/min“&lt;br /&gt;
&lt;br /&gt;
Wir haben jetzt zwei getrennte Menüs/Seiten in der Suite und drei Parameter verteilt auf diese zwei Seiten. ParameterGroup_0 definiert den Einlernvorgang neuer Senoren.  Parameter_0 bestimmt, ob diese Funktion aktiv ist oder nicht. Parameter_1 definiert die Periodenzeit wie schnell hintereinander die ID auf den KNX Bus geschickt wird.&lt;br /&gt;
 &lt;br /&gt;
Die zweite ParameterGroup_1 dient dazu, um alle Parameter für die eigentliche Temperatursensormessung zu bestimmen. Ich habe hier bis jetzt nur einen Parameter_2 und dieser gibt Periodenzeit an wie schnell die Temperaturwerte der Sensoren auf den Bus geschickt werden sollen. &lt;br /&gt;
Schreibt man all diese Parameter zusammen, dann muss das im XML so aussehen:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&amp;lt;Parameters&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Einlesen Sensor IDs&amp;quot; Id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Parameter Id=&amp;quot;0&amp;quot; IdName=&amp;quot;OnOffZyklischSendenNeuID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;zyklisches senden neuer ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=OFF|01=ON&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	 &amp;lt;Parameter Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ZeitZyklischesSendenID&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Description&amp;gt;neue Sensor ID zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
             &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;00&amp;quot; Options=&amp;quot;00=30sek|01=1min|02=10min|03=30min|04=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
  &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren&amp;quot; Id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Parameter Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ZeitZyklischesSenden&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;Description&amp;gt;Temperaturwerte zyklisch senden alle:&amp;lt;/Description&amp;gt;&lt;br /&gt;
              &amp;lt;Value Type=&amp;quot;uint8&amp;quot; Default=&amp;quot;03&amp;quot; Options=&amp;quot;00=30s|01=1min|02=2min|03=3min|04=5min|05=10min|06=30min|07=60min&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
  &amp;lt;/ParameterGroup&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup Name&amp;#039;&amp;#039;&amp;#039; = ist einfach der Name der in der Suite als Seitenüberschrift auftaucht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ParameterGroup ID&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die ParameterGroup Gültigkeit besitzt. In dieser Gruppe können dann mehrere Parameter definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameter Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die Parameter Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für diesen Parameter. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; = Ist die Description wie sie später in der Suite angezeigt wird&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Value Type&amp;#039;&amp;#039;&amp;#039; = gibt an um welchen Typen es sich handelt   &amp;quot;uint8&amp;quot; oder „unit16“  …&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Default&amp;#039;&amp;#039;&amp;#039; = gibt den Wert an, der Default mäßig zuerst in der Suite angezeigt wird. Dieser muss im Bereich des „Value Type“ liegen. Bei „uint8“ wäre das zwischen 0 … 255&lt;br /&gt;
Man kann dem Default wert auch noch MIN MAX Werte angeben. Die Suite lässt dann nur Werte zu, die interhalb dieses Bereiches liegen. Z.B.:&lt;br /&gt;
&lt;br /&gt;
Min = &amp;quot;10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Max = &amp;quot;100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das nicht gewünscht, dann lässt man Min / Max einfach leer:&lt;br /&gt;
&lt;br /&gt;
Min = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Max = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Options&amp;#039;&amp;#039;&amp;#039; = hiermit kann man ein Dropdown Menü implementieren wie man es auch aus Excel und so kennt. Die Syntax ist einfach:  „Parameter_value1“ =  „Text1 des Dropdown Menüs“ | „Parameter_value2“ =  „Text2 des Dropdown Menüs“&lt;br /&gt;
Wenn man kein Dropdown Menü benötigt, dann lässt man die option einfach weg.&lt;br /&gt;
&lt;br /&gt;
Was jetzt aber noch fehlt sind die Parameter für einzelnen Sensoren. Hier müssen wir die Sensor-ID eintragen, damit der Code später weiß, welcher Sensor auf welche GA geschickt werden muss. Dafür erzeugen wir uns eine weitere Parametergroup und erstellen darin 20 Sensor-IDs. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   &amp;lt;ParameterGroup Name=&amp;quot;Temperatur-Sensoren ID&amp;quot; Id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Description&amp;gt;Sensor:1 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
                &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	   &amp;lt;Parameter Id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:2 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
	…&lt;br /&gt;
&lt;br /&gt;
           &amp;lt;Parameter Id=&amp;quot;22&amp;quot; IdName=&amp;quot;SensorID20&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;Description&amp;gt;Sensor:20 DS18B20 ID&amp;lt;/Description&amp;gt;&lt;br /&gt;
               &amp;lt;Value Type=&amp;quot;raw8&amp;quot; Default=&amp;quot;0100AABBCCDDEEFF&amp;quot; Min=&amp;quot;&amp;quot; Max=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/ParameterGroup&amp;gt;&lt;br /&gt;
 &amp;lt;/Parameters&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CommObjects ====&lt;br /&gt;
Mit den Parametern sind wir auch schon fertig, jetzt kommt noch die CommObjects. Wir brauchen für die gewünschten Funktionen:&lt;br /&gt;
&lt;br /&gt;
 1x CommObject zum Senden der neuen Sensor ID&lt;br /&gt;
 20x CommObjects für die 20 Temperatursensoren&lt;br /&gt;
&lt;br /&gt;
Im XML File ergänzt man direkt unter den Parametern:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  &amp;lt;CommObjects&amp;gt;&lt;br /&gt;
          CommObject Id=&amp;quot;0&amp;quot; IdName=&amp;quot;ComObNeuID&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Nicht registrierter iButton gefunden&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Status&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;16.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
	        &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;	&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;1&amp;quot; IdName=&amp;quot;ComObTvalue1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 1&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;2&amp;quot; IdName=&amp;quot;ComObTvalue2&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 2&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             …&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;CommObject Id=&amp;quot;20&amp;quot; IdName=&amp;quot;ComObTvalue20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;Name&amp;gt;Temperatursenor 20&amp;lt;/Name&amp;gt;&lt;br /&gt;
                &amp;lt;Function&amp;gt;Temp (°C)&amp;lt;/Function&amp;gt;&lt;br /&gt;
                &amp;lt;DataPointType&amp;gt;9.001&amp;lt;/DataPointType&amp;gt;&lt;br /&gt;
                &amp;lt;Flags&amp;gt;52&amp;lt;/Flags&amp;gt;&lt;br /&gt;
          &amp;lt;/CommObject&amp;gt;&lt;br /&gt;
        &amp;lt;/CommObjects&amp;gt;&lt;br /&gt;
    &amp;lt;/Device&amp;gt;&lt;br /&gt;
&amp;lt;/KonnektingDevice&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CommObject Id&amp;#039;&amp;#039;&amp;#039; = ist eine fortlaufende ID die immer mit „0“ beginnt und nur für die CommObjects Gültigkeit besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;IdName&amp;#039;&amp;#039;&amp;#039; = Ist ein frei benennbarer Name für dieses CommOblect. Es macht Sinn in Selbsterklärend zu bennen, da man mit diesem Namen später im Code arbeiten muss.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; = Ist der Text der später das CommObject in der Suite beschreibt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Function&amp;#039;&amp;#039;&amp;#039; =  hier kann man eine kurze Funktionsbeschreibung des CommObjects ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DataPointType&amp;#039;&amp;#039;&amp;#039; = hier gibt man den DPT Typ des KNX Busses an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flags&amp;#039;&amp;#039;&amp;#039; = hier können die Flags für das jeweilige Commobject gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
 Und schon fertig ist die XML :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=722</id>
		<title>1-Wire Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=1-Wire_Gateway&amp;diff=722"/>
		<updated>2019-05-01T10:14:19Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: Created page with &amp;quot;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot; ! colspan=&amp;quot;2&amp;quot;|EnOcean Gateway |- ! colspan=&amp;quot;2&amp;quot;|File:1-Wire Gateway Overview...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|EnOcean Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:1-Wire Gateway Overview Picture.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 beta&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| Cortex M0+ SAMD (Arduino Zero)&lt;br /&gt;
| SAMD mini&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| KNX Transceiver on Board&lt;br /&gt;
|-&lt;br /&gt;
! 1-Wire Module&lt;br /&gt;
| Ds2482-100&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; Wire (part of Standard Arduino)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===XML File===&lt;br /&gt;
; KonnektingEnocean_V1.0.ino&lt;br /&gt;
: &amp;quot;Operating System&amp;quot;, maps together all components, here the set of devices is configured.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=File:1-Wire_Gateway_Overview_Picture.PNG&amp;diff=721</id>
		<title>File:1-Wire Gateway Overview Picture.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=File:1-Wire_Gateway_Overview_Picture.PNG&amp;diff=721"/>
		<updated>2019-05-01T10:12:48Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=Projects_and_Devices&amp;diff=720</id>
		<title>Projects and Devices</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=Projects_and_Devices&amp;diff=720"/>
		<updated>2019-05-01T10:06:33Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, we list all kind of KONNEKTING related projects and of course devices. &lt;br /&gt;
&lt;br /&gt;
== ID Overview ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/KONNEKTING/KonnektingDocumentation/blob/master/konnekting_manufacturers.md Manufacturer ID List]&lt;br /&gt;
* [[Device_ID_List | Device ID List]]&lt;br /&gt;
&lt;br /&gt;
== Naming Guide == &lt;br /&gt;
&lt;br /&gt;
If you look at different KNX device vendors, you will easily see, that they have a specific device name pattern. For KONNEKTING it would be good to have also a kind of device name pattern. &lt;br /&gt;
&lt;br /&gt;
Recommendation so far:&lt;br /&gt;
&lt;br /&gt;
* Find a &amp;quot;short name&amp;quot; for your device. For instance, if you have a LED PWM Dimmer, you could name it &amp;quot;LED Dimmer&amp;quot;, and the short version could be &amp;quot;LEDD&amp;quot;&lt;br /&gt;
* Check if your device has channels or inputs... For instance your dimmer could have 4 channels/outputs. &lt;br /&gt;
* Check if the device exists in it&amp;#039;s first, 2nd or 3rd &amp;quot;major version&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Combine all three things together:&lt;br /&gt;
&lt;br /&gt;
 LEDD4.1&lt;br /&gt;
 &lt;br /&gt;
 LEDD --&amp;gt; LED Dimmer&lt;br /&gt;
 4 --&amp;gt; 4 channels&lt;br /&gt;
 . --&amp;gt; just a separator&lt;br /&gt;
 1 --&amp;gt; 1st version&lt;br /&gt;
&lt;br /&gt;
== Devices/Kits == &lt;br /&gt;
&lt;br /&gt;
Template for new pages: [[ Device/Kits Template | Device/Kits Template ]]&lt;br /&gt;
&lt;br /&gt;
Completed:&lt;br /&gt;
&lt;br /&gt;
* [[ Multi Interface (MI) | Multi Interface ]]&lt;br /&gt;
* [[ DFF4.1 | DFF4.1 - ROTO Rototronic Roof Window Actuator (Din Rail)]]&lt;br /&gt;
* [[ LEDD4.1 | LEDD4.1 - 4 channel LED PWM Dimmer (Din Rail)]]&lt;br /&gt;
* [[ EnOcean Gateway | EnOcean Gateway ]]&lt;br /&gt;
* [[ 16CH Binary Input | 16ch Binary Input ]]&lt;br /&gt;
* [[ HW1.2 | HW1.2 Beginner PCB ]]&lt;br /&gt;
* [[ MicroBCU | MicroBCU  ]]&lt;br /&gt;
* [[ UUPS | UUPS ]]&lt;br /&gt;
* [[ 1-Wire Gateway | 1-Wire Gateway ]]&lt;br /&gt;
&lt;br /&gt;
Not completed:&lt;br /&gt;
&lt;br /&gt;
* [[ Modular LED Dimmer 1-12CH | Modular LED Dimmer 1-12CH ]]&lt;br /&gt;
* [[ Berker-Sensor-Einsatz (T,H,P,VOC) | Berker-Sensor-Einsatz (T,H,P,VOC) ]]&lt;br /&gt;
* [[ Codelock and Doorlock Controller | Codelock and Doorlock Controller ]]&lt;br /&gt;
* [[ DB2.1_1.0 | DoorBell 2.1 ]]&lt;br /&gt;
* [[ Sliding Gate Controller for Wisniowski gates | Sliding Gate Controller for Wisniowski gates ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ideas / Wishes:&lt;br /&gt;
* [[ SoundModule | SoundModule]]&lt;br /&gt;
&lt;br /&gt;
== REG Components ==&lt;br /&gt;
&lt;br /&gt;
=== Controller === &lt;br /&gt;
&lt;br /&gt;
* [[ M0dularis+ | M0dularis+ ]]&lt;br /&gt;
&lt;br /&gt;
=== Applications === &lt;br /&gt;
&lt;br /&gt;
* [[ 8 Relay Bistable | 8x Relay Bistable, bus powered ]]&lt;br /&gt;
&lt;br /&gt;
=== Frontends === &lt;br /&gt;
&lt;br /&gt;
* [[ Frontend 8 Buttons 8 LEDs | 8x Button + 8x LED ]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=310</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=310"/>
		<updated>2018-03-10T16:13:02Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* HowTo: upload Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== HowTo: upload Arduino Code ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.Step:&amp;#039;&amp;#039;&amp;#039; install Arduino IDE&lt;br /&gt;
&lt;br /&gt;
Getting Started can you find here: [LINK:|https://www.arduino.cc/en/Guide/HomePage] -&amp;gt; there are a lot of information and tutorials&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.Step:&amp;#039;&amp;#039;&amp;#039; download Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/skywodd/pcf8574_arduino_library]) -&amp;gt; PCF8575 I2C IO Expander&lt;br /&gt;
&lt;br /&gt;
click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.Step:&amp;#039;&amp;#039;&amp;#039; add both Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Installing Additional Arduino Libraries  [HowTo:|https://www.arduino.cc/en/Guide/Libraries#toc4]&lt;br /&gt;
&lt;br /&gt;
add the .ZIP files (as described in the instructions)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;open Arduino IDE&lt;br /&gt;
&lt;br /&gt;
open the Arduino Code and connect the KNX device over USB with your PC&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;set the Arduino Board&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Board to &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;set the USB Port&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Port to the Port with the name &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;Upload the Code to the KNX-Device&lt;br /&gt;
&lt;br /&gt;
click the green arrow to upload the code.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=309</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=309"/>
		<updated>2018-03-10T16:11:48Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* HowTo: upload Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== HowTo: upload Arduino Code ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.Step:&amp;#039;&amp;#039;&amp;#039; install Arduino IDE&lt;br /&gt;
&lt;br /&gt;
Getting Started can you find here: [LINK:|https://www.arduino.cc/en/Guide/HomePage] -&amp;gt; there are a lot of information and tutorials&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.Step:&amp;#039;&amp;#039;&amp;#039; download Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/skywodd/pcf8574_arduino_library]) -&amp;gt; PCF8575 I2C IO Expander&lt;br /&gt;
&lt;br /&gt;
click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.Step:&amp;#039;&amp;#039;&amp;#039; add both Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Installing Additional Arduino Libraries  [HowTo:|https://www.arduino.cc/en/Guide/Libraries#toc4]&lt;br /&gt;
&lt;br /&gt;
add here the .ZIP files &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;open Arduino IDE&lt;br /&gt;
&lt;br /&gt;
open the Arduino Code and connect the KNX device over USB with your PC&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;set the Arduino Board&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Board to &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;set the USB Port&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Port to the Port with the name &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;Upload the Code to the KNX-Device&lt;br /&gt;
&lt;br /&gt;
click the green arrow to upload the code.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=308</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=308"/>
		<updated>2018-03-10T16:09:36Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* HowTo: upload Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== HowTo: upload Arduino Code ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.Step:&amp;#039;&amp;#039;&amp;#039; install Arduino IDE&lt;br /&gt;
&lt;br /&gt;
Getting Started can you find here: [LINK:|https://www.arduino.cc/en/Guide/HomePage] -&amp;gt; there are a lot of information and tutorials&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.Step:&amp;#039;&amp;#039;&amp;#039; download Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/skywodd/pcf8574_arduino_library]) -&amp;gt; PCF8575 I2C IO Expander&lt;br /&gt;
&lt;br /&gt;
click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.Step:&amp;#039;&amp;#039;&amp;#039; add both Arduino Libs\&lt;br /&gt;
&lt;br /&gt;
Installing Additional Arduino Libraries (HowTo [https://www.arduino.cc/en/Guide/Libraries#toc4])&lt;br /&gt;
&lt;br /&gt;
add here the .ZIP files &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;open Arduino IDE&lt;br /&gt;
&lt;br /&gt;
open the Arduino Code and connect the KNX device over USB with your PC&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;set the Arduino Board&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Board to &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;set the USB Port&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Port to the Port with the name &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;Upload the Code to the KNX-Device&lt;br /&gt;
&lt;br /&gt;
click the green arrow to upload the code.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=307</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=307"/>
		<updated>2018-03-10T16:04:53Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* How you upload the Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== HowTo: upload Arduino Code ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.Step:&amp;#039;&amp;#039;&amp;#039; install Arduino IDE&lt;br /&gt;
&lt;br /&gt;
Getting Started can you find here: [https://www.arduino.cc/en/Guide/HomePage]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.Step:&amp;#039;&amp;#039;&amp;#039; download Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/skywodd/pcf8574_arduino_library]) -&amp;gt; PCF8575 I2C IO Expander&lt;br /&gt;
&lt;br /&gt;
click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.Step:&amp;#039;&amp;#039;&amp;#039; add both Arduino Libs\&lt;br /&gt;
&lt;br /&gt;
Installing Additional Arduino Libraries (HowTo [https://www.arduino.cc/en/Guide/Libraries#toc4])&lt;br /&gt;
&lt;br /&gt;
add here the .ZIP files &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;open Arduino IDE&lt;br /&gt;
&lt;br /&gt;
open the Arduino Code and connect the KNX device over USB with your PC&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;set the Arduino Board&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Board to &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;set the USB Port&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Port to the Port with the name &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;Upload the Code to the KNX-Device&lt;br /&gt;
&lt;br /&gt;
click the green arrow to upload the code.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=306</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=306"/>
		<updated>2018-03-10T16:03:18Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* How you upload the Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== How you upload the Arduino Code ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.Step:&amp;#039;&amp;#039;&amp;#039; install Arduino IDE&lt;br /&gt;
&lt;br /&gt;
Getting Started can you find here: [https://www.arduino.cc/en/Guide/HomePage]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.Step:&amp;#039;&amp;#039;&amp;#039; download Arduino Libs&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
&lt;br /&gt;
Download link ([https://github.com/skywodd/pcf8574_arduino_library]) -&amp;gt; PCF8575 I2C IO Expander&lt;br /&gt;
&lt;br /&gt;
click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.Step:&amp;#039;&amp;#039;&amp;#039; add both Arduino Libs\&lt;br /&gt;
&lt;br /&gt;
Installing Additional Arduino Libraries (HowTo [https://www.arduino.cc/en/Guide/Libraries#toc4])&lt;br /&gt;
&lt;br /&gt;
add here the .ZIP files &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;open Arduino IDE&lt;br /&gt;
&lt;br /&gt;
open the Arduino Code and connect the KNX device over USB with your PC&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;set the Arduino Board&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Board to &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;set the USB Port&lt;br /&gt;
&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Port to the Port with the name &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;Upload the Code to the KNX-Device&lt;br /&gt;
&lt;br /&gt;
click the green arrow to upload the code.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=305</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=305"/>
		<updated>2018-03-10T15:59:25Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* User Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== How you upload the Arduino Code ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.Step:&amp;#039;&amp;#039;&amp;#039; install Arduino IDE&lt;br /&gt;
Getting Started can you find here: [https://www.arduino.cc/en/Guide/HomePage]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.Step:&amp;#039;&amp;#039;&amp;#039; download Arduino Libs &lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
Download link ([https://github.com/skywodd/pcf8574_arduino_library]) -&amp;gt; PCF8575 I2C IO Expander&lt;br /&gt;
click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.Step:&amp;#039;&amp;#039;&amp;#039; add both Arduino Libs&lt;br /&gt;
Installing Additional Arduino Libraries (HowTo [https://www.arduino.cc/en/Guide/Libraries#toc4])&lt;br /&gt;
add here the .ZIP files &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;open Arduino IDE&lt;br /&gt;
open the Arduino Code and connect the KNX device over USB with your PC&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.Step:&amp;#039;&amp;#039;&amp;#039;set the Arduino Board&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Board to &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;set the USB Port&lt;br /&gt;
click in the Arduino IDE -&amp;gt; Tools -&amp;gt; set the Port to the Port with the name &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5.Step:&amp;#039;&amp;#039;&amp;#039;Upload the Code to the KNX-Device&lt;br /&gt;
click the green arrow to upload the code.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Finish &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=304</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=304"/>
		<updated>2018-03-10T15:30:23Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE ([https://www.arduino.cc/en/main/software])&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=303</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=303"/>
		<updated>2018-03-10T15:29:32Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* What you need */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Lib PCF8575 ([https://github.com/skywodd/pcf8574_arduino_library])&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=280</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=280"/>
		<updated>2018-03-07T15:14:23Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* SW Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Set &amp;quot;Zählerstände&amp;quot; over Suite ====&lt;br /&gt;
Über die Suite kann man die Zählerstände im EEPROM überschreiben.  &lt;br /&gt;
&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=279</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=279"/>
		<updated>2018-03-07T15:05:21Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Loop() ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void loop(){ &lt;br /&gt;
  //digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
  Knx.task();&lt;br /&gt;
  if (Konnekting.isReadyForApplication()) {&lt;br /&gt;
    // Sendet bei Zählerstand-Änderung&lt;br /&gt;
    if(sende_Zyklus_Zaehler == 0){&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,S0_Zaehler_old);&lt;br /&gt;
      }&lt;br /&gt;
    else if(sendZaehler_Cycle==true){&lt;br /&gt;
      sendZaehler_Cycle = false;&lt;br /&gt;
      if(S0_aktiv[1]== 1) sendZaehlerStand(0,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[2]== 1) sendZaehlerStand(1,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[3]== 1) sendZaehlerStand(2,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      if(S0_aktiv[4]== 1) sendZaehlerStand(3,S0_Zaehler,!S0_Zaehler);&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
    // Zyklisches Abfragen&lt;br /&gt;
    if(isDelay==true)&lt;br /&gt;
    {    &lt;br /&gt;
     if(inputCH&amp;lt;16)&lt;br /&gt;
          {&lt;br /&gt;
            switch(CHState)&lt;br /&gt;
            {&lt;br /&gt;
              case SetVCC:&lt;br /&gt;
                expander_VCC.digitalWrite(inputCH,LOW);&lt;br /&gt;
                CHState = ReadIO;&lt;br /&gt;
                &lt;br /&gt;
              break;&lt;br /&gt;
              case ReadIO:&lt;br /&gt;
                #ifdef I2COFF&lt;br /&gt;
                PNS = expander.read();&lt;br /&gt;
                #endif&lt;br /&gt;
                CHState = IsInvert;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsInvert:&lt;br /&gt;
                if(CH_invert[inputCH]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH;}&lt;br /&gt;
                if(CH_invert[inputCH+1]==1) //wenn Open_LOW&lt;br /&gt;
                   {PNS ^= 1 &amp;lt;&amp;lt; inputCH+1;}   &lt;br /&gt;
                CHState = MaskIO;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskIO:&lt;br /&gt;
                  &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH)))  {ch[inputCH] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH] = 1;} &lt;br /&gt;
                 &lt;br /&gt;
                 if( (PNS &amp;amp; (1 &amp;lt;&amp;lt; inputCH+1))){ch[inputCH+1] = 0;} &lt;br /&gt;
                 else                         {ch[inputCH+1] = 1;}&lt;br /&gt;
                                    &lt;br /&gt;
              CHState = IsChange_CH_ONE;&lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_ONE:&lt;br /&gt;
              isChange(inputCH,ch,ch_old); &lt;br /&gt;
              CHState = IsChange_CH_TWO;  &lt;br /&gt;
              break;&lt;br /&gt;
              case IsChange_CH_TWO:&lt;br /&gt;
              isChange(inputCH+1,ch,ch_old); &lt;br /&gt;
              CHState = UnsetVCC;&lt;br /&gt;
              break;&lt;br /&gt;
              case UnsetVCC:&lt;br /&gt;
                Knx.task();&lt;br /&gt;
                if( (S0_aktiv[4]==1 &amp;amp;&amp;amp; inputCH==14) || (S0_aktiv[3]==1 &amp;amp;&amp;amp; inputCH-1==13) || (S0_aktiv[2]==1 &amp;amp;&amp;amp; inputCH==12) || (S0_aktiv[1]==1 &amp;amp;&amp;amp; inputCH-1==11) )&lt;br /&gt;
                   {&lt;br /&gt;
                    ;&lt;br /&gt;
                   }&lt;br /&gt;
                else&lt;br /&gt;
                    {&lt;br /&gt;
                   //expander_VCC.digitalWrite(inputCH,HIGH);&lt;br /&gt;
                    ;&lt;br /&gt;
                    }&lt;br /&gt;
              CHState = MaskRoom;&lt;br /&gt;
              break;&lt;br /&gt;
              case MaskRoom:&lt;br /&gt;
                if(ch[inputCH] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH);}&lt;br /&gt;
                if(ch[inputCH+1] == true)    {maske |= (1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                else                        {maske &amp;amp;= ~(1&amp;lt;&amp;lt;inputCH+1);}&lt;br /&gt;
                CHState = Finish;&lt;br /&gt;
              break;&lt;br /&gt;
              case Finish:&lt;br /&gt;
                inputCH=inputCH+2;&lt;br /&gt;
                if(inputCH==16)&lt;br /&gt;
                  {&lt;br /&gt;
                    inputCH = 17;&lt;br /&gt;
                    isDelay = false;   &lt;br /&gt;
                  }&lt;br /&gt;
                CHState = SetVCC;   &lt;br /&gt;
              break;   &lt;br /&gt;
            }//Ende Switch&lt;br /&gt;
           }//Ende Abfrage Ports&lt;br /&gt;
                                  &lt;br /&gt;
        // CHECK Zimmer maskierung&lt;br /&gt;
        for(int cha=0;cha&amp;lt;5;cha++)&lt;br /&gt;
             {  &lt;br /&gt;
               maske2 = maske &amp;amp; mask_Zimmer[cha];&lt;br /&gt;
               if( maske2 !=  mask_Zimmer[cha]) &lt;br /&gt;
                      {state_Zimmer[cha]= true;}&lt;br /&gt;
               else     &lt;br /&gt;
                      {state_Zimmer[cha]= false;} &lt;br /&gt;
               if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
                      {state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
                       send_Zimmer_Status(cha,state_Zimmer);}&lt;br /&gt;
              }&lt;br /&gt;
        &lt;br /&gt;
      }//ENDE ISDELAY&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************        &lt;br /&gt;
  // S0_1 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[0] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[0] = time_count;&lt;br /&gt;
        S0_LED_ON[0] = true;&lt;br /&gt;
        set_S0_LED[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[0] = 3600.0/ ((time_S0_stopp[0]-time_S0_start[0])/(zaehler_Impulse[0]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W0: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[0]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[0] = time_S0_stopp[0]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[0] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[0]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[0] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-12,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
        &lt;br /&gt;
    // S0_2 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[1] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[1] = time_count;&lt;br /&gt;
        S0_LED_ON[1] = true;&lt;br /&gt;
        set_S0_LED[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[1] = 3600.0/ ((time_S0_stopp[1]-time_S0_start[1])/(zaehler_Impulse[1]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W1: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[1]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[1] = time_S0_stopp[1]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[1] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[1]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[1] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-13,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
    // S0_3 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[2] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[2] = time_count;&lt;br /&gt;
        S0_LED_ON[2] = true;&lt;br /&gt;
        set_S0_LED[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[2] = 3600.0/ ((time_S0_stopp[2]-time_S0_start[2])/(zaehler_Impulse[2]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W2: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[2]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[2] = time_S0_stopp[2]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[2] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[2]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[2] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-14,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }  &lt;br /&gt;
&lt;br /&gt;
    // S0_4 LED Blinken  &lt;br /&gt;
    if(set_S0_LED[3] == true)&lt;br /&gt;
      { &lt;br /&gt;
        set_S0_LED_time[3] = time_count;&lt;br /&gt;
        S0_LED_ON[3] = true;&lt;br /&gt;
        set_S0_LED[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,LOW);&lt;br /&gt;
        #endif  &lt;br /&gt;
        // Berechnung mom Leistung&lt;br /&gt;
        watt_S0[3] = 3600.0/ ((time_S0_stopp[3]-time_S0_start[3])/(zaehler_Impulse[3]*1.0));&lt;br /&gt;
         #ifdef KDEBUG&lt;br /&gt;
         Debug.print(&amp;quot;W3: &amp;quot;);&lt;br /&gt;
         Debug.println(&amp;quot;%f&amp;quot;, watt_S0[3]);  &lt;br /&gt;
         #endif&lt;br /&gt;
        time_S0_start[3] = time_S0_stopp[3]; &lt;br /&gt;
      }&lt;br /&gt;
    if(S0_LED_ON[3] == true &amp;amp;&amp;amp; (time_count &amp;gt; set_S0_LED_time[3]+30))&lt;br /&gt;
      {&lt;br /&gt;
        S0_LED_ON[3] = false;&lt;br /&gt;
        #ifdef ANZEIGE_Platine&lt;br /&gt;
        expander_LED.digitalWrite(MAX_CH-15,HIGH);&lt;br /&gt;
        #endif&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************      &lt;br /&gt;
  //Momentane Verlustleistung senden     &lt;br /&gt;
&lt;br /&gt;
  if(is_5min == true)&lt;br /&gt;
    {&lt;br /&gt;
     switch(MomL_State)&lt;br /&gt;
       {&lt;br /&gt;
        case state_S0:&lt;br /&gt;
        if(S0_aktiv[1]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[0]&amp;gt;60000)   &lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[0]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[0] = 0;&lt;br /&gt;
                     Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (180000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (180000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[0]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (120000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (120000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[0]&amp;gt;(3600.0 / (60000/zaehler_Impulse[0])))&lt;br /&gt;
                          {watt_S0[0] = 3600.0 / (60000/zaehler_Impulse[0]);}&lt;br /&gt;
                      Knx.write(33,watt_S0[0]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 } &lt;br /&gt;
          else&lt;br /&gt;
                   Knx.write(33,watt_S0[0]);     &lt;br /&gt;
        }           &lt;br /&gt;
        MomL_State = state_S1;       &lt;br /&gt;
        break;&lt;br /&gt;
        &lt;br /&gt;
        case state_S1:&lt;br /&gt;
        if(S0_aktiv[2]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[1]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[1]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[1] = 0;&lt;br /&gt;
                     Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (180000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (180000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[1]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (120000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (120000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[1]&amp;gt;(3600.0 / (60000/zaehler_Impulse[1])))&lt;br /&gt;
                          {watt_S0[1] = 3600.0 / (60000/zaehler_Impulse[1]);}&lt;br /&gt;
                      Knx.write(36,watt_S0[1]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(36,watt_S0[1]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S2;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S2:&lt;br /&gt;
        if(S0_aktiv[3]==1)&lt;br /&gt;
        {&lt;br /&gt;
          if(millis()-time_S0_start[2]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[2]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (180000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (180000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[2]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (120000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (120000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[2]&amp;gt;(3600.0 / (60000/zaehler_Impulse[2])))&lt;br /&gt;
                          {watt_S0[2] = 3600.0 / (60000/zaehler_Impulse[2]);}&lt;br /&gt;
                      Knx.write(39,watt_S0[2]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
          else&lt;br /&gt;
              Knx.write(39,watt_S0[2]); &lt;br /&gt;
        }            &lt;br /&gt;
        MomL_State = state_S3;       &lt;br /&gt;
        break;&lt;br /&gt;
        case state_S3:&lt;br /&gt;
        if(S0_aktiv[4]==1)&lt;br /&gt;
        {&lt;br /&gt;
            if(millis()-time_S0_start[3]&amp;gt;60000)&lt;br /&gt;
                {&lt;br /&gt;
                 if(millis()-time_S0_start[3]&amp;gt;240000)       // kein Impuls nach 4min&lt;br /&gt;
                    {&lt;br /&gt;
                     watt_S0[3] = 0;&lt;br /&gt;
                     Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;180000)  // kein Impuls nach 3min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (180000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (180000/zaehler_Impulse[3]);}//20W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);&lt;br /&gt;
                    }&lt;br /&gt;
                  else if(millis()-time_S0_start[3]&amp;gt;120000)  // kein Impuls nach 2min&lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (120000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (120000/zaehler_Impulse[3]);} //30W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]); &lt;br /&gt;
                    }          &lt;br /&gt;
                  else &lt;br /&gt;
                    {&lt;br /&gt;
                      if(watt_S0[3]&amp;gt;(3600.0 / (60000/zaehler_Impulse[3])))&lt;br /&gt;
                        {watt_S0[3] = 3600.0 / (60000/zaehler_Impulse[3]);}  //60W&lt;br /&gt;
                      Knx.write(42,watt_S0[3]);  &lt;br /&gt;
                    }         &lt;br /&gt;
                 }&lt;br /&gt;
            else&lt;br /&gt;
                Knx.write(42,watt_S0[3]); &lt;br /&gt;
        }              &lt;br /&gt;
        MomL_State = state_S0; &lt;br /&gt;
        is_5min = false;      &lt;br /&gt;
        break;&lt;br /&gt;
      }//Switch &lt;br /&gt;
    }//5min&lt;br /&gt;
&lt;br /&gt;
  //***************************************************************************************************&lt;br /&gt;
  // Wenn neue Zälerstände über Suite gespeichert werden&lt;br /&gt;
    if(run_save == true)&lt;br /&gt;
      {&lt;br /&gt;
        run_save = false;&lt;br /&gt;
        #ifdef KDEBUG&lt;br /&gt;
        Debug.println(&amp;quot;Set Zaehlerstand&amp;quot;);&lt;br /&gt;
        #endif  &lt;br /&gt;
        sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
        sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
        writeSAVE(S0_Zaehler,S0_impuls);&lt;br /&gt;
        digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
      }&lt;br /&gt;
  }//ENDE KONNEKTING APPLIKATION RUNING&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=278</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=278"/>
		<updated>2018-03-07T14:48:28Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* RTC Config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 void alarmMatch()&lt;br /&gt;
 { &lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;SAFE&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  run_save=true;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=277</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=277"/>
		<updated>2018-03-07T14:28:58Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=276</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=276"/>
		<updated>2018-03-07T14:27:38Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup() Routine ====&lt;br /&gt;
&lt;br /&gt;
 void setup(){&lt;br /&gt;
&lt;br /&gt;
 //****************** Init IO *******************************************************&lt;br /&gt;
  pinMode(LED_YELLOW, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_YELLOW, HIGH);&lt;br /&gt;
  pinMode(S0_1_pin, INPUT);&lt;br /&gt;
  pinMode(S0_2_pin, INPUT);&lt;br /&gt;
  pinMode(S0_3_pin, INPUT);&lt;br /&gt;
  pinMode(S0_4_pin, INPUT);&lt;br /&gt;
  Wire.begin(); // join i2c bus (address optional for master)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
 //****************** Init Debug Interface ********************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
      // Start debug serial with 9600 bauds&lt;br /&gt;
      DEBUGSERIAL.begin(115200);&lt;br /&gt;
  #if defined(__AVR_ATmega32U4__) || defined(__SAMD21G18A__)&lt;br /&gt;
      // wait for serial port to connect. Needed for Leonardo/Micro/ProMicro/Zero only&lt;br /&gt;
      while (!DEBUGSERIAL)&lt;br /&gt;
  #endif&lt;br /&gt;
      // make debug serial port known to debug class&lt;br /&gt;
      // Means: KONNEKTING will sue the same serial port for console debugging&lt;br /&gt;
      Debug.setPrintStream(&amp;amp;DEBUGSERIAL);&lt;br /&gt;
      Debug.print(F(&amp;quot;KONNEKTING DemoSketch\n&amp;quot;));&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Init Debug KONNEKTING ********************************************  &lt;br /&gt;
  Konnekting.setMemoryReadFunc(&amp;amp;readEeprom);&lt;br /&gt;
  Konnekting.setMemoryWriteFunc(&amp;amp;writeEeprom);&lt;br /&gt;
  Konnekting.setMemoryUpdateFunc(&amp;amp;updateEeprom);    &lt;br /&gt;
  &lt;br /&gt;
  // Initialize KNX enabled Arduino Board&lt;br /&gt;
  Konnekting.init(KNX_SERIAL,&lt;br /&gt;
            PROG_BUTTON_PIN,&lt;br /&gt;
            PROG_LED_PIN,&lt;br /&gt;
            MANUFACTURER_ID,&lt;br /&gt;
            DEVICE_ID,&lt;br /&gt;
            REVISION);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 //****************** Read Parameter ***************************************************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Parameter&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  abfrage_Interval            = (((uint8_t) Konnekting.getUINT8Param(0)+1)*30);  // abfrage_Interval&lt;br /&gt;
  sende_Zyklus_Zaehler        = (uint8_t) Konnekting.getUINT8Param(1);           // sende_Zyklus_Zaehler&lt;br /&gt;
  zimmerMaskierung_Sendvalue  = (uint8_t) Konnekting.getUINT8Param(2);           // Ob HIGH oder LOW gesendet wird&lt;br /&gt;
  invertLED                   = (uint8_t) Konnekting.getUINT8Param(3);           // invertiert LED Anzeige&lt;br /&gt;
                              &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Abfrage-Interval: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,abfrage_Interval); &lt;br /&gt;
  Debug.print(&amp;quot;Zimmer Maskierung Sendvalue: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zimmerMaskierung_Sendvalue); &lt;br /&gt;
  Debug.print(&amp;quot;Anzahl Messungen: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,filter_count); &lt;br /&gt;
  Debug.print(&amp;quot;LED invert: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,invertLED); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Set Sendezyklus (S0-Schnittstelle) ********************************&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 1) sende_Zyklus =   6000;  // 1min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 2) sende_Zyklus =  60000;  //10min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 3) sende_Zyklus = 180000;  //30min&lt;br /&gt;
  if(sende_Zyklus_Zaehler == 4) sende_Zyklus = 360000;  //60min&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Sende-Zyklus: &amp;quot;);  &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,sende_Zyklus); &lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
 //****************** Load Settings *****************************************************  &lt;br /&gt;
  //Kanal 1 - 16 Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;16; cha++)&lt;br /&gt;
    {&lt;br /&gt;
     CH_invert[cha] = (uint8_t) Konnekting.getUINT8Param(cha+5); &lt;br /&gt;
    }&lt;br /&gt;
  //S0 1 - 4 Load Settings&lt;br /&gt;
  for(int cha=1; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    S0_aktiv[cha] = (uint8_t) Konnekting.getUINT8Param(cha+20); &lt;br /&gt;
    }&lt;br /&gt;
  //ZÃƒÂ¤hlerimpulse Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;4; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    zaehler_Impulse[cha] = (uint16_t) Konnekting.getUINT16Param(cha+25);   &lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehler&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp/kwh): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,zaehler_Impulse[3]);&lt;br /&gt;
  #endif  &lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zimmermaske&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //ZimmerMasken Load Settings&lt;br /&gt;
  for(int cha=0; cha&amp;lt;5; cha++)&lt;br /&gt;
    {&lt;br /&gt;
    mask_Zimmer[cha] = (uint16_t) Konnekting.getUINT16Param(cha+29);&lt;br /&gt;
    }&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer1: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[0], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer2: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[1], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer3: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[2], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer4: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[3], BIN);&lt;br /&gt;
  Debug.print(&amp;quot;Zimmer5: &amp;quot;);  &lt;br /&gt;
  SerialUSB.println(mask_Zimmer[4], BIN);&lt;br /&gt;
  #endif    &lt;br /&gt;
 &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;READ Zaehlerstaende&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  //Read ZÃƒÂ¤hlerstÃƒÂ¤nde&lt;br /&gt;
  S0_Zaehler[0] = (((uint16_t)readEeprom(1024))&amp;lt;&amp;lt;8 | readEeprom(1025));&lt;br /&gt;
  S0_Zaehler[1] = (((uint16_t)readEeprom(1026))&amp;lt;&amp;lt;8 | readEeprom(1027));&lt;br /&gt;
  S0_Zaehler[2] = (((uint16_t)readEeprom(1028))&amp;lt;&amp;lt;8 | readEeprom(1029));&lt;br /&gt;
  S0_Zaehler[3] = (((uint16_t)readEeprom(1030))&amp;lt;&amp;lt;8 | readEeprom(1031));&lt;br /&gt;
  S0_impuls[0]  = (((uint16_t)readEeprom(1032))&amp;lt;&amp;lt;8 | readEeprom(1033));&lt;br /&gt;
  S0_impuls[1]  = (((uint16_t)readEeprom(1034))&amp;lt;&amp;lt;8 | readEeprom(1035));&lt;br /&gt;
  S0_impuls[2]  = (((uint16_t)readEeprom(1036))&amp;lt;&amp;lt;8 | readEeprom(1037));&lt;br /&gt;
  S0_impuls[3]  = (((uint16_t)readEeprom(1038))&amp;lt;&amp;lt;8 | readEeprom(1039));&lt;br /&gt;
  attachInterrupt(SAVE_PIN,SAVE_State, FALLING);&lt;br /&gt;
&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Aktuelle ZÃƒÂ¤hler_Impulse&amp;quot;);&lt;br /&gt;
  Debug.print(&amp;quot;S0_1 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_2 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_3 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]);&lt;br /&gt;
  Debug.print(&amp;quot;S0_4 Zaehler(Imp): &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);&lt;br /&gt;
  #endif   &lt;br /&gt;
  &lt;br /&gt;
  S0_Zaehler_old[0] = S0_Zaehler[0];&lt;br /&gt;
  S0_Zaehler_old[1] = S0_Zaehler[1];&lt;br /&gt;
  S0_Zaehler_old[2] = S0_Zaehler[2];&lt;br /&gt;
  S0_Zaehler_old[3] = S0_Zaehler[3];&lt;br /&gt;
&lt;br /&gt;
  //Sendet aktuellen ZÃƒÂ¤hlerstand&lt;br /&gt;
  sendZaehlerStand_2(0,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(1,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(2,S0_Zaehler);&lt;br /&gt;
  sendZaehlerStand_2(3,S0_Zaehler);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //S0 Schnittstelle &lt;br /&gt;
  if (S0_aktiv[1] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_1_pin,irq_S0_1, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_1 aktiv&amp;quot;);  &lt;br /&gt;
       #endif &lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_1 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }&lt;br /&gt;
  if (S0_aktiv[2] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_2_pin,irq_S0_2, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_2 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
  else {&lt;br /&gt;
        #ifdef KDEBUG &lt;br /&gt;
        Debug.println(&amp;quot;S0_2 inaktiv&amp;quot;);  &lt;br /&gt;
        #endif &lt;br /&gt;
        }     &lt;br /&gt;
  if (S0_aktiv[3] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_3_pin,irq_S0_3, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_3 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_3 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
   if (S0_aktiv[4] == 1)   &lt;br /&gt;
      {attachInterrupt(S0_4_pin,irq_S0_4, FALLING);&lt;br /&gt;
       #ifdef KDEBUG&lt;br /&gt;
       Debug.println(&amp;quot;S0_4 aktiv&amp;quot;);  &lt;br /&gt;
       #endif&lt;br /&gt;
       }&lt;br /&gt;
   else {&lt;br /&gt;
         #ifdef KDEBUG &lt;br /&gt;
         Debug.println(&amp;quot;S0_4 inaktiv&amp;quot;);  &lt;br /&gt;
         #endif &lt;br /&gt;
         }    &lt;br /&gt;
&lt;br /&gt;
  //****** State Maschine ***********************&lt;br /&gt;
  //Init POrt Abfrage&lt;br /&gt;
  CHState = SetVCC;&lt;br /&gt;
  //Init 5min mom Leistung &lt;br /&gt;
  MomL_State = state_S0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  //****** INIT I2C Expander ********************&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT START&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander.begin(0x20);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander IO finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  expander_VCC.begin(0x23);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander VCC finish&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef ANZEIGE_Platine&lt;br /&gt;
  expander_LED.begin(0x24);    &lt;br /&gt;
  #endif&lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;Expander INIT FINISH&amp;quot;);&lt;br /&gt;
  #endif&lt;br /&gt;
  // Init OUTPUTS LED &lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {expander.pinMode(i, INPUT_PULLUP);  // WICHTIG: muss &amp;quot;INPUT_PULLUP&amp;quot; sein !!! &lt;br /&gt;
         expander_VCC.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_VCC.digitalWrite(i,LOW);&lt;br /&gt;
         #ifdef ANZEIGE_Platine&lt;br /&gt;
         expander_LED.pinMode(i, OUTPUT);&lt;br /&gt;
         expander_LED.digitalWrite(i,LOW);&lt;br /&gt;
         #endif &lt;br /&gt;
         } &lt;br /&gt;
  #endif   &lt;br /&gt;
    &lt;br /&gt;
  // Daten Lesen&lt;br /&gt;
  #ifdef I2COFF&lt;br /&gt;
  PNS = expander.read();&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         //check Open_HIGH &amp;amp; Open_LOW&lt;br /&gt;
         if(CH_invert[i]==1) //wenn Open_LOW&lt;br /&gt;
           {PNS ^= 1 &amp;lt;&amp;lt; i;}&lt;br /&gt;
        }   &lt;br /&gt;
   maske = (uint16_t) PNS;&lt;br /&gt;
   &lt;br /&gt;
   // Abfrage Ports&lt;br /&gt;
   for(int i=0;i&amp;lt;16;i++)&lt;br /&gt;
        {&lt;br /&gt;
         // HW-PIN &amp;quot;open&amp;quot; &lt;br /&gt;
         if( (maske &amp;amp; (1 &amp;lt;&amp;lt; i)))  &lt;br /&gt;
          { ch_old[i] = false; }          &lt;br /&gt;
         //HW-PIN &amp;quot;closed&amp;quot;&lt;br /&gt;
         else                   &lt;br /&gt;
           { ch_old[i] = true; } &lt;br /&gt;
          &lt;br /&gt;
        sendStatus(i,ch_old);  &lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
   // CHECK Zimmer maskierung&lt;br /&gt;
   for(int cha=0;cha&amp;lt;5;cha++){  &lt;br /&gt;
      if((maske &amp;amp; mask_Zimmer[cha]) != 0) &lt;br /&gt;
          {state_Zimmer[cha]= true;}&lt;br /&gt;
      else     &lt;br /&gt;
          {state_Zimmer[cha]= false;} &lt;br /&gt;
           #ifdef KDEBUG&lt;br /&gt;
           Debug.println(&amp;quot;%d&amp;quot;,state_Zimmer[cha]);  &lt;br /&gt;
           #endif&lt;br /&gt;
     // if(state_Zimmer[cha] != state_Zimmer_old[cha])&lt;br /&gt;
          send_Zimmer_Status(cha,state_Zimmer);&lt;br /&gt;
          state_Zimmer_old[cha]=state_Zimmer[cha];&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
  //****************** Init RTC *******************************************************  &lt;br /&gt;
  rtc.begin();&lt;br /&gt;
  rtc.setTime(hours, minutes, seconds);&lt;br /&gt;
  rtc.setDate(day, month, year);&lt;br /&gt;
&lt;br /&gt;
  rtc.setAlarmTime(23, 59, 00);&lt;br /&gt;
  rtc.enableAlarm(rtc.MATCH_HHMMSS);&lt;br /&gt;
  rtc.attachInterrupt(alarmMatch);    &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //****************** Init Timer *******************************************************  &lt;br /&gt;
  setTimer();&lt;br /&gt;
  setTimer_ms(10);&lt;br /&gt;
      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.println(&amp;quot;FINISH Setup&amp;quot;);  &lt;br /&gt;
  #endif&lt;br /&gt;
  digitalWrite(LED_YELLOW, LOW);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=275</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=275"/>
		<updated>2018-03-07T14:24:20Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRQ S0 Interface ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void irq_S0_1(){&lt;br /&gt;
  time_S0_stopp[0] = millis();&lt;br /&gt;
  S0_impuls[0]++;&lt;br /&gt;
  if(S0_impuls[0]&amp;gt;=zaehler_Impulse[0])&lt;br /&gt;
    {S0_Zaehler[0]++;&lt;br /&gt;
     S0_impuls[0] = 0;}&lt;br /&gt;
  set_S0_LED[0] = true;      &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_1: &amp;quot;);&lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[0]);&lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_2(){&lt;br /&gt;
  time_S0_stopp[1] = millis();&lt;br /&gt;
    S0_impuls[1]++;&lt;br /&gt;
  if(S0_impuls[1]&amp;gt;=zaehler_Impulse[1])&lt;br /&gt;
    {S0_Zaehler[1]++;&lt;br /&gt;
     S0_impuls[1] = 0;}&lt;br /&gt;
  set_S0_LED[1] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_2: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[1]);&lt;br /&gt;
  #endif   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_3(){&lt;br /&gt;
  time_S0_stopp[2] = millis();&lt;br /&gt;
    S0_impuls[2]++;&lt;br /&gt;
  if(S0_impuls[2]&amp;gt;=zaehler_Impulse[2])&lt;br /&gt;
    {S0_Zaehler[2]++;&lt;br /&gt;
     S0_impuls[2] = 0;}&lt;br /&gt;
  set_S0_LED[2] = true;   &lt;br /&gt;
  #ifdef KDEBUG&lt;br /&gt;
  Debug.print(&amp;quot;S0_3: &amp;quot;); &lt;br /&gt;
  Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[2]); &lt;br /&gt;
  #endif   &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void irq_S0_4(){&lt;br /&gt;
  time_S0_stopp[3] = millis();&lt;br /&gt;
    S0_impuls[3]++;&lt;br /&gt;
  if(S0_impuls[3]&amp;gt;=zaehler_Impulse[3])&lt;br /&gt;
    {S0_Zaehler[3]++;&lt;br /&gt;
     S0_impuls[3] = 0;}&lt;br /&gt;
  set_S0_LED[3] = true;    &lt;br /&gt;
    #ifdef KDEBUG&lt;br /&gt;
    Debug.print(&amp;quot;S0_4: &amp;quot;);&lt;br /&gt;
    Debug.println(&amp;quot;%d&amp;quot;,S0_impuls[3]);  &lt;br /&gt;
    #endif&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=274</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=274"/>
		<updated>2018-03-07T14:18:29Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* define IO Config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 #define S0_1_pin        11    //IO6&lt;br /&gt;
 #define S0_2_pin         5    //IO7&lt;br /&gt;
 #define S0_3_pin         6    //IO8&lt;br /&gt;
 #define S0_4_pin         2    //IO9&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=273</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=273"/>
		<updated>2018-03-07T14:15:08Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Save Parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED indicator &lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=272</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=272"/>
		<updated>2018-03-07T14:14:25Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save Parameters ====&lt;br /&gt;
Funktion wird aufgerufen:&lt;br /&gt;
:- jeden Tag um 0Uhr&lt;br /&gt;
:- Wenn ein Busspannugsabfall detekiert wird&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void SAVE_State(){&lt;br /&gt;
 digitalWrite(LED_YELLOW, HIGH);   // LED Indikator&lt;br /&gt;
 writeSAVE(S0_Zaehler,S0_impuls);  // EEPROM write routine to save all values&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=269</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=269"/>
		<updated>2018-03-07T12:55:47Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=268</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=268"/>
		<updated>2018-03-07T12:54:35Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Debug Config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 &amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=267</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=267"/>
		<updated>2018-03-07T11:58:06Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Arduino Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
==== Libs ====&lt;br /&gt;
 #include &amp;lt;KonnektingDevice.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;kdevice_KNX_Bineareingang_Multi.h&amp;quot;  -&amp;gt; erzeugte lib aus Konnekting&lt;br /&gt;
 #include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;EEPROM.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;S0_Schnittstelle.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;RTCZero.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;PCF8575.h&amp;gt; // Required for PCF8575&lt;br /&gt;
&lt;br /&gt;
==== Debug Config ====&lt;br /&gt;
Hier hat man Möglichkeiten bestimmte Funktionen zu aktivieren/deaktivieren&lt;br /&gt;
 // I2C-MODE (enable for normal mode)&lt;br /&gt;
 #define I2COFF // comment this line to disable I2C mode&lt;br /&gt;
 // DEBUG-MODE (for normal mode without debugging you must deactivate the function)&lt;br /&gt;
 #define KDEBUG // comment this line to disable DEBUG mode&lt;br /&gt;
 // Anzeige-Platine (enable if you use the Status LED PCB)&lt;br /&gt;
 #define ANZEIGE_Platine&lt;br /&gt;
&lt;br /&gt;
==== KNX Serial Config ====&lt;br /&gt;
Hier wird das Serial-IF zum KNX-Bus konfiguriert&lt;br /&gt;
 #ifdef __AVR_ATmega328P__&lt;br /&gt;
 #define KNX_SERIAL Serial // Nano/ProMini etc. use Serial&lt;br /&gt;
 #elif ESP8266&lt;br /&gt;
 #define KNX_SERIAL Serial // ESP8266 use Serial&lt;br /&gt;
 #else&lt;br /&gt;
 #define KNX_SERIAL Serial1 // Leonardo/Micro/Zero etc. use Serial1&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
==== RTC Config ====&lt;br /&gt;
Jeden Tag um 0UHr werden alle Daten ins EEPROM geschrieben&lt;br /&gt;
 /* Create an rtc object */&lt;br /&gt;
 RTCZero rtc;&lt;br /&gt;
 /* Change these values to set the current initial time */&lt;br /&gt;
 const byte seconds = 0;&lt;br /&gt;
 const byte minutes = 00;&lt;br /&gt;
 const byte hours = 00;&lt;br /&gt;
 /* Change these values to set the current initial date */&lt;br /&gt;
 const byte day = 1;&lt;br /&gt;
 const byte month = 1;&lt;br /&gt;
 const byte year = 17;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== define IO Config ====&lt;br /&gt;
 #define PROG_LED_PIN    A2&lt;br /&gt;
 #define PROG_BUTTON_PIN A1&lt;br /&gt;
 #define LED_YELLOW      25     &lt;br /&gt;
 #define SAVE_PIN        38&lt;br /&gt;
 #define MAX_CH          15&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=HW1.2&amp;diff=220</id>
		<title>HW1.2</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=HW1.2&amp;diff=220"/>
		<updated>2018-03-04T10:59:08Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|HW 1.2&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:HW1.2 on BCU.PNG|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| ProMicro (5V/3,3V)&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Simens BCU &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Assembly ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Jumper Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[File:HW1.2 SolderJumper.png|700px]]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=File:HW1.2_SolderJumper.png&amp;diff=219</id>
		<title>File:HW1.2 SolderJumper.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=File:HW1.2_SolderJumper.png&amp;diff=219"/>
		<updated>2018-03-04T10:56:56Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=File:HW1.2_on_BCU.PNG&amp;diff=218</id>
		<title>File:HW1.2 on BCU.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=File:HW1.2_on_BCU.PNG&amp;diff=218"/>
		<updated>2018-03-04T10:49:56Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=HW1.2&amp;diff=217</id>
		<title>HW1.2</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=HW1.2&amp;diff=217"/>
		<updated>2018-03-04T10:45:16Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: Created page with &amp;quot;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot; ! colspan=&amp;quot;2&amp;quot;|HW 1.2 |- ! colspan=&amp;quot;2&amp;quot;|center...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|HW 1.2&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:foobar.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| ProMicro (5V/3,3V)&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Simens BCU &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=Projects_and_Devices&amp;diff=216</id>
		<title>Projects and Devices</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=Projects_and_Devices&amp;diff=216"/>
		<updated>2018-03-04T10:42:17Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Devices/Kits */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page, we list all kind of KONNEKTING related projects and of course devices. &lt;br /&gt;
&lt;br /&gt;
== ID Overview ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/KONNEKTING/KonnektingDocumentation/blob/master/konnekting_manufacturers.md Manufacturer ID List]&lt;br /&gt;
* [[Device_ID_List | Device ID List]]&lt;br /&gt;
&lt;br /&gt;
== Naming Guide == &lt;br /&gt;
&lt;br /&gt;
If you look at different KNX device vendors, you will easily see, that they have a specific device name pattern. For KONNEKTING it would be good to have also a kind of device name pattern. &lt;br /&gt;
&lt;br /&gt;
Recommendation so far:&lt;br /&gt;
&lt;br /&gt;
* Find a &amp;quot;short name&amp;quot; for your device. For instance, if you have a LED PWM Dimmer, you could name it &amp;quot;LED Dimmer&amp;quot;, and the short version could be &amp;quot;LEDD&amp;quot;&lt;br /&gt;
* Check if your device has channels or inputs... For instance your dimmer could have 4 channels/outputs. &lt;br /&gt;
* Check if the device exists in it&amp;#039;s first, 2nd or 3rd &amp;quot;major version&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Combine all three things together:&lt;br /&gt;
&lt;br /&gt;
 LEDD4.1&lt;br /&gt;
 &lt;br /&gt;
 LEDD --&amp;gt; LED Dimmer&lt;br /&gt;
 4 --&amp;gt; 4 channels&lt;br /&gt;
 . --&amp;gt; just a separator&lt;br /&gt;
 1 --&amp;gt; 1st version&lt;br /&gt;
&lt;br /&gt;
== Devices/Kits == &lt;br /&gt;
&lt;br /&gt;
Template for new pages: [[ Device/Kits Template | Device/Kits Template ]]&lt;br /&gt;
&lt;br /&gt;
Completed:&lt;br /&gt;
&lt;br /&gt;
* [[ Multi Interface (MI) | Multi Interface ]]&lt;br /&gt;
* [[ DFF4.1 | DFF4.1 - ROTO Roof Window Actuator ]]&lt;br /&gt;
* [[ EnOcean Gateway | EnOcean Gateway ]]&lt;br /&gt;
* [[ 16CH Binary Input | 16ch Binary Input ]]&lt;br /&gt;
* [[ HW1.2 | HW1.2 Beginner PCB ]]&lt;br /&gt;
&lt;br /&gt;
Not completed:&lt;br /&gt;
&lt;br /&gt;
* [[ Modular LED Dimmer 1-12CH | Modular LED Dimmer 1-12CH ]]&lt;br /&gt;
* [[ Berker-Sensor-Einsatz (T,H,P,VOC) | Berker-Sensor-Einsatz (T,H,P,VOC) ]]&lt;br /&gt;
* [[ Codelock and Doorlock Controller | Codelock and Doorlock Controller ]]&lt;br /&gt;
* [[ DB2.1_1.0 | DoorBell 2.1 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ideas / Wishes:&lt;br /&gt;
&lt;br /&gt;
* [[ Sliding Gate Controller for Wisniowski gates | Sliding Gate Controller for Wisniowski gates ]]&lt;br /&gt;
&lt;br /&gt;
== REG Components ==&lt;br /&gt;
&lt;br /&gt;
=== Controller === &lt;br /&gt;
&lt;br /&gt;
* [[ M0dularis+ | M0dularis+ ]]&lt;br /&gt;
&lt;br /&gt;
=== Applications === &lt;br /&gt;
&lt;br /&gt;
* [[ 8 Relay Bistable | 8x Relay Bistable, bus powered ]]&lt;br /&gt;
&lt;br /&gt;
=== Frontends === &lt;br /&gt;
&lt;br /&gt;
* [[ Frontend 8 Buttons 8 LEDs | 8x Button + 8x LED ]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=215</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=215"/>
		<updated>2018-03-02T17:33:23Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Detection Circuit ====&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=214</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=214"/>
		<updated>2018-03-02T17:30:21Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: /* Block Diagramm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagramm ===&lt;br /&gt;
&lt;br /&gt;
[[File:16CH Binary INput Block Diagramm.PNG]]&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=File:16CH_Binary_INput_Block_Diagramm.PNG&amp;diff=213</id>
		<title>File:16CH Binary INput Block Diagramm.PNG</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=File:16CH_Binary_INput_Block_Diagramm.PNG&amp;diff=213"/>
		<updated>2018-03-02T17:29:35Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=212</id>
		<title>16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=212"/>
		<updated>2018-03-02T07:44:47Z</updated>

		<summary type="html">&lt;p&gt;M.freudenreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right;margin-left: 15px;margin-top: 15px; margin-bottom: 15px;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|16CH Binary Input&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input Overview.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:16CH Binary Input comp.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
| Matthias F.&lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| Version 1.0 finished&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| Mini-BCU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
16ch Binary Input (potential-free) &lt;br /&gt;
&lt;br /&gt;
The binary input has 16 inputs available and is used to connect eight conventional push-buttons or floating contacts such as window or relay contacts.&lt;br /&gt;
There is one status LED for each input. In addition, the input status is sent to the bus. A separate power supply is not necessary&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Technical Data: ===&lt;br /&gt;
* Operating voltage:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  KNX Bus voltage &amp;lt;10mA&lt;br /&gt;
* Installation type:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Top Hat Rail mounting &lt;br /&gt;
* Number of Inputs:           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   16 &lt;br /&gt;
* Number of S0-Inputs:        &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 4 (CH13 - CH16) &lt;br /&gt;
* Input polling:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    with 100ms, 300ms or 500ms&lt;br /&gt;
* Typ of Inputs:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;    potential-free / floating contacts&lt;br /&gt;
* Max. cable length:          &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  30m tested (more possible) &lt;br /&gt;
* input voltage:              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;   5V&lt;br /&gt;
* Max. input voltage:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  24V (absolute rating, for &amp;lt;1min) &lt;br /&gt;
* Max. input current:         &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  10mA &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The device makes a contact supply voltage (5V) which is not electrically isolated from the bus voltage!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* x-Inputs can configure to a &amp;quot;room&amp;quot; (&amp;quot;room&amp;quot;-GA can show if one of the windows is open in the room)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
for this device do you need:&lt;br /&gt;
* 1x OKW Housing &lt;br /&gt;
* 1x PCB Kit&lt;br /&gt;
* 1x Mounting Kit (screws, ...) &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;OKW Housing&amp;#039;&amp;#039;&amp;#039; link OKW-Website:[https://www.okw.com/de/category/813fb100-6960-11e5-b123-8eba63e66ed5/products?vs=c9f11140-cb2e-11e3-89f9-00163e72470b%24%24f3236741-633f-11e3-937d-00163e72470b]&lt;br /&gt;
 1x B6503121 RAILTEC B, 4 Module&lt;br /&gt;
 3x B6607140 Klemmenabdeckung, flach &lt;br /&gt;
 1x B6607145 Abdeckung KNX, flach&lt;br /&gt;
 4x B6607142 Klemmenabdeckung, flach &lt;br /&gt;
 (1x) B6603180 Frontplatte, 4 Module (only if you don&amp;#039;t use the &amp;quot;LED-Status-PCB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;PCB Kit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1) Application PCB&lt;br /&gt;
 2) Controller PCB&lt;br /&gt;
 3) LED-Status PCB (for function not necessary, only to show the status of the Inputs)&lt;br /&gt;
 4) Mini-BCU (KNX-Transceiver)&lt;br /&gt;
 [[File:16CH_Binary_Input_PCBs.jpg|390px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Mounting Kit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 1x Micromatch cable&lt;br /&gt;
 8x Screws &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input PCB Stacked.jpg|450px|thumb|without housing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Block Diagramm ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
[[File:16CH Binary Input Schematic.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== What you need ===&lt;br /&gt;
* Arduino IDE (link)&lt;br /&gt;
* Arduino Code for 16CH Binary Input&lt;br /&gt;
* XML-File for 16CH Binary Input&lt;br /&gt;
* KONNEKTING SUITE (link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Arduino Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XML-File ===&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== SW Documentation ===&lt;br /&gt;
==== Sperrobjekte ====&lt;br /&gt;
==== Room classification ====&lt;br /&gt;
&lt;br /&gt;
 Die Raumerkennung funktioniert als 16Bit Wert und jedes Bit ist ein Input. Möchte man also alle 16 Inputs zusammen als &amp;quot;Zimmer&amp;quot; definieren, dann wäre das:&lt;br /&gt;
 b1111111111111111 = 65535&lt;br /&gt;
&lt;br /&gt;
 oder frei, Inputs wären hier: 1,5,6,10,14,15&lt;br /&gt;
 b1000110001000110 = 35910&lt;br /&gt;
&lt;br /&gt;
 Die Dezimalwerte kann man in die Suite eingeben, beim parameterisieren werden diese Werte ins EEPROM geschrieben. Bei jedem Start werden die Daten ins RAM geladen und decodiert.&lt;br /&gt;
 Aktuell können so 5 &amp;quot;Zimmer&amp;quot; definiert werden&lt;br /&gt;
 [[File:16CH Binary Input Suite ZimmerErkennung.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
=== HW Documentation ===&lt;br /&gt;
==== Circuit diagram ====&lt;br /&gt;
One VCC Output-Pin shares two Input-Channels. Because of that always two Channels will monitoring together.  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;S0 interface&amp;#039;&amp;#039;&amp;#039; Up to four Inputs can configure to an S0-interface. possible CH are Ch13 - Ch16&lt;br /&gt;
note: If you configure only one Ch to an S0-Interface on an VCC-Output pair, then the output of the other CH can not be switched off, because the VCC-Output voltage supply always both Channels. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| [[File:16CH Binary Input Overview Inputs.jpg|200px|thumb|16Ch Input]]&lt;br /&gt;
| [[File:Übersicht S0.png|200px|thumb|12Ch Input + 4Ch S0-Interface]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
=== State Machine ===&lt;br /&gt;
&lt;br /&gt;
START -&amp;gt; Loop over all Channels (activation Outputs x + y -&amp;gt; readout inputs x + y -&amp;gt; update Status LED -&amp;gt; deactivation Outputs x + y)&lt;br /&gt;
&lt;br /&gt;
== Build It ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Device/Kits]]&lt;/div&gt;</summary>
		<author><name>M.freudenreich</name></author>
	</entry>
</feed>