<?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=Jens.hoeppner</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=Jens.hoeppner"/>
	<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php/Special:Contributions/Jens.hoeppner"/>
	<updated>2026-04-20T08:01:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.11</generator>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=395</id>
		<title>EnOcean Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=395"/>
		<updated>2018-03-29T21:09:49Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: &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:EnOcean_Gateway_Case_close.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[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;
== 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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=394</id>
		<title>EnOcean Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=394"/>
		<updated>2018-03-29T20:40:36Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: &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:EnOcean_Gateway_Case_close.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[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;
== 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;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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=393</id>
		<title>EnOcean Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=393"/>
		<updated>2018-03-29T20:36:57Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: /* 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;|EnOcean Gateway&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[File:EnOcean_Gateway_Case_close.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[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;
&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;
== 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;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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=376</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=376"/>
		<updated>2018-03-16T19:54:52Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: &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;
! Needed libraries&lt;br /&gt;
| KONNEKTING Lib [https://github.com/KONNEKTING/KonnektingDeviceLibrary] &amp;lt;br/&amp;gt; PCF8575 I2C IO Expander [https://github.com/skywodd/pcf8574_arduino_library]&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;
Refer [[HowToUploadArduinoCode]]&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/KONNEKTING/KonnektingDeviceLibrary| KONNEKTING Lib]&lt;br /&gt;
* [https://github.com/skywodd/pcf8574_arduino_library| PCF8575 I2C IO Expander]&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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=375</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=375"/>
		<updated>2018-03-16T19:50:55Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: Streamlined How to 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;
Refer [[HowToUploadArduinoCode]]&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/KONNEKTING/KonnektingDeviceLibrary| KONNEKTING Lib]&lt;br /&gt;
* [https://github.com/skywodd/pcf8574_arduino_library| PCF8575 I2C IO Expander]&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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=374</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=374"/>
		<updated>2018-03-16T19:46:40Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: /* 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;
Refer [[HowToUploadArduinoCode]]&lt;br /&gt;
&lt;br /&gt;
needed Libraries:&lt;br /&gt;
* KonnektingDeviceLibrary&lt;br /&gt;
* PCF8575 I2C IO Expander&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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=Device/Kits_Template&amp;diff=373</id>
		<title>Device/Kits Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=Device/Kits_Template&amp;diff=373"/>
		<updated>2018-03-16T19:41:53Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: &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;|Foo Bar Device Kit&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;
| foo bar &lt;br /&gt;
|-&lt;br /&gt;
! Status&lt;br /&gt;
| foo bar&lt;br /&gt;
|-&lt;br /&gt;
! Microcontroller/Board&lt;br /&gt;
| foo bar&lt;br /&gt;
|-&lt;br /&gt;
! KNX connectivity&lt;br /&gt;
| foo bar&lt;br /&gt;
|-&lt;br /&gt;
! Needed libraries&lt;br /&gt;
| bar foo&amp;lt;br /&amp;gt;foo bar&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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=HowToUploadArduinoCode&amp;diff=368</id>
		<title>HowToUploadArduinoCode</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=HowToUploadArduinoCode&amp;diff=368"/>
		<updated>2018-03-15T19:34:36Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: Created page with &amp;quot; == 1. Install Arduino IDE == Getting Started can you find here: [LINK:|https://www.arduino.cc/en/Guide/HomePage] -&amp;gt; there are a lot of information and tutorials  == 2. Add ne...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 1. Install Arduino IDE ==&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;
== 2. Add needed libraries ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative 1: Download Arduino libs using Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Select &amp;quot;Sketch&amp;quot; -&amp;gt; &amp;quot;Add library&amp;quot; and on the top &amp;quot;manage libraries...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can now search the libraries-repository for the needed libraries, e.g. KonnektingDeviceLibrary&lt;br /&gt;
&lt;br /&gt;
=== Alternative 2: Download Arduino Libs directly as zip-files ===&lt;br /&gt;
Refer your Hardware requirements.&lt;br /&gt;
&lt;br /&gt;
In general you need at least KonnektingDeviceLibrary&lt;br /&gt;
Download link ([https://github.com/KONNEKTING/KonnektingDeviceLibrary]) -&amp;gt; KONNEKTING Lib&lt;br /&gt;
&lt;br /&gt;
To install from a zip file, you need to download the zip file to your PC, e.g. Desktop.&lt;br /&gt;
Click on both links on the green Button (Clone or Download) -&amp;gt; Download ZIP&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 you downloaded in 2. (as described in the instructions)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4. Open Arduino IDE with the sketch code ==&lt;br /&gt;
&lt;br /&gt;
Open the Arduino Code (so called &amp;quot;Sketch&amp;quot;) and connect the KNX device over USB with your PC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. 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;
&lt;br /&gt;
== 6. 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 that matches your device best, a lot of Konnekting Hardware is based on &amp;quot;&amp;#039;&amp;#039;Arduino/Genduino Zero (Native USB Port)&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 7. 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;/div&gt;</summary>
		<author><name>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=367</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=367"/>
		<updated>2018-03-15T19:23:58Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: /* 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;
Refer [[HowToUploadArduinoCode]]&lt;br /&gt;
&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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=16CH_Binary_Input&amp;diff=366</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=366"/>
		<updated>2018-03-15T19:23:10Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: /* 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;
Refer [HowToUploadArduinoCode]&lt;br /&gt;
&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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=354</id>
		<title>EnOcean Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=EnOcean_Gateway&amp;diff=354"/>
		<updated>2018-03-14T10:46:58Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: /* Links */&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:EnOcean_Gateway_Case_close.jpg|300px|thumb|center]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|[[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;
&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;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>Jens.hoeppner</name></author>
	</entry>
	<entry>
		<id>http://wiki.konnekting.de/index.php?title=Talk:16CH_Binary_Input&amp;diff=313</id>
		<title>Talk:16CH Binary Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.konnekting.de/index.php?title=Talk:16CH_Binary_Input&amp;diff=313"/>
		<updated>2018-03-12T10:37:55Z</updated>

		<summary type="html">&lt;p&gt;Jens.hoeppner: Created page with &amp;quot;Question: Should there be a generic page for the way to flash the software? I guess this will be common for several pages...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Question: Should there be a generic page for the way to flash the software? I guess this will be common for several pages...&lt;/div&gt;</summary>
		<author><name>Jens.hoeppner</name></author>
	</entry>
</feed>