<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Erwin111</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Erwin111"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Erwin111"/>
	<updated>2026-04-10T03:34:01Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40814</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40814"/>
		<updated>2026-02-28T07:23:41Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Definitions-Beispiele */  Korrektur knxd options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
&lt;br /&gt;
Serielle- bzw. USB-KNX Gateways sind nicht direkt unterstützt. Empfohlen wird die Lösung mittels knxd&amp;lt;-&amp;gt;KNX-Gateway und Verbindung knxd&amp;lt;-&amp;gt;FHEM mittels mode KNXIO-M oder -T. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -B single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Serielle Gateways (USB Stick / TPUART) werden vom KNXIO-Modul nicht direkt unterstützt. Für diese Varianten ist die Empfehlung, das via knxd-Daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. (Der knxd-Daemon braucht weniger Resourcen und bietet eine wesentlich bessere Fehlertoleranz - für serielle Scnittstellen).&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Der Vorteil: Es kann keine msg verloren gehen, ohne einen Eintrag im Logfile! Falls allerdings FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest message out of sequence received: seqcntrRx received/expected= xxx/yyy - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht zur Lösung führt, ist die Empfehlung, die Kommunikation über knxd zu lösen. Also: KNX-GW &amp;lt;-&amp;gt; knxd &amp;lt;-&amp;gt; FHEM (mode S, M od. T). Der knxd als eigenständiger Deamon ist nicht von Verzögerungen durch FHEM betroffen und hat bessere Fehler-Toleranz. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Falls KNXD Serielle oder USB Schnittstellen verwenden soll, muss im run cmd die device option verwendet werden, z.B:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker run ... --device=/dev/ttyUSB0 ... &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alternativ kann der Container auch im privileged mode laufen, damit ist Zugriff auf &#039;&#039;&#039;alle&#039;&#039;&#039; Host devices gegeben!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40737</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40737"/>
		<updated>2026-01-15T13:44:43Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Vorwort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
&lt;br /&gt;
Serielle- bzw. USB-KNX Gateways sind nicht direkt unterstützt. Empfohlen wird die Lösung mittels knxd&amp;lt;-&amp;gt;KNX-Gateway und Verbindung knxd&amp;lt;-&amp;gt;FHEM mittels mode KNXIO-M oder -T. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Serielle Gateways (USB Stick / TPUART) werden vom KNXIO-Modul nicht direkt unterstützt. Für diese Varianten ist die Empfehlung, das via knxd-Daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. (Der knxd-Daemon braucht weniger Resourcen und bietet eine wesentlich bessere Fehlertoleranz - für serielle Scnittstellen).&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Der Vorteil: Es kann keine msg verloren gehen, ohne einen Eintrag im Logfile! Falls allerdings FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest message out of sequence received: seqcntrRx received/expected= xxx/yyy - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht zur Lösung führt, ist die Empfehlung, die Kommunikation über knxd zu lösen. Also: KNX-GW &amp;lt;-&amp;gt; knxd &amp;lt;-&amp;gt; FHEM (mode S, M od. T). Der knxd als eigenständiger Deamon ist nicht von Verzögerungen durch FHEM betroffen und hat bessere Fehler-Toleranz. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Falls KNXD Serielle oder USB Schnittstellen verwenden soll, muss im run cmd die device option verwendet werden, z.B:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker run ... --device=/dev/ttyUSB0 ... &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alternativ kann der Container auch im privileged mode laufen, damit ist Zugriff auf &#039;&#039;&#039;alle&#039;&#039;&#039; Host devices gegeben!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40643</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40643"/>
		<updated>2026-01-03T18:22:35Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RaumThermostat / HeizungsAktor mit widget controlminidash */  update Beispiel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test_Thermostat.png|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget und support siehe:  {{Link2Forum|LinkText=FHEM-Forum|Topic=142831}} .&lt;br /&gt;
&amp;lt;br&amp;gt;Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt. Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
&amp;lt;br&amp;gt;Die KNX spezifischen Anpassungen:&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus &amp;lt;y&amp;gt;&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp &amp;lt;xx&amp;gt;&amp;quot;, wobei xx der aktuelle wert plus/minus y ist. Der Stepwert &amp;lt;y&amp;gt; wird durch die button-definition im widgetoverride definiert. Die &amp;quot;fw=&amp;gt;....&amp;quot; Definition zeigt die Optionen, wie (im Detail-View) der set-cmd pulldown dargestellt oder nicht dargestellt wird. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;readingNmap&#039;&#039;&#039; alle Werte die auf GAD desired-temp-ext ankommen, werden auf reading &#039;&#039;&#039;desired-temp&#039;&#039;&#039; dargestellt.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;userattr knobColor knobMinMax&#039;&#039;&#039; ermöglicht das setzen dieser Attribute im Device.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;widgetOverride Parameter:&#039;&#039;&#039; Detaillierte Übersicht über die Parameter ist: [[FHEMWEB/ControlMiniDash#Parameterübersicht]] zu finden. &lt;br /&gt;
&lt;br /&gt;
Der erste Param (ring1Val) spezifiziert einen reading-Namen, dessen wert im Ring/Knob dargestellt wird. (in diesem Beisoiel desired-temp).&lt;br /&gt;
&lt;br /&gt;
Der zweite Param (ring2Val) definiert den command, der nach &amp;quot;mouse-out&amp;quot; an FHEM gesendet wird. (in diesem Beispiel: &amp;quot;set &amp;lt;device&amp;gt; desired-temp &amp;lt;value&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Die nächsten 4 Parameter definieren reading-Namen, die Werte werden im Zentrum des Kreises dargestellt.&lt;br /&gt;
&lt;br /&gt;
Die nächsten 6 Param &amp;lt;Icon&amp;gt;@&amp;lt;cmd&amp;gt; definieren Buttons links und rechts vom Kreissegment. Diese lösen commands in fhem aus. (In diesem Beispiel &amp;quot;Minus 1 / Plus 1&amp;quot; - das wird jedoch durch die eventMap in &amp;quot;set &amp;lt;device&amp;gt; desired-temp &amp;lt;aktuelle desired-temp +/- 1&amp;gt;&amp;quot; umgesetzt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod test_Thermostat KNX 4/0/1:dpt9:desired-temp:set:nosuffix&lt;br /&gt;
4/1/1:dpt9:temperature:get:nosuffix&lt;br /&gt;
4/2/1:dpt9:desired-temp-ext:listenonly:nosuffix&lt;br /&gt;
4/3/1:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
4/4/1:dpt5.001:humidity:get:nosuffix&lt;br /&gt;
attr test_Thermostat userattr knobColor knobMinMax&lt;br /&gt;
attr test_Thermostat comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition&lt;br /&gt;
attr test_Thermostat eventMap {usr=&amp;gt;{&#039;^plus.(\d+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) + $1)) . &amp;quot;&#039;, &lt;br /&gt;
&#039;^minus.(\d+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) - $1)) . &amp;quot;&#039;}, &lt;br /&gt;
fw=&amp;gt; {&#039;^plus.(\d+)&#039; =&amp;gt; &#039;plus:1,2,3,4,5&#039;, &#039;^minus.(\d+)&#039; =&amp;gt; &#039; &#039;}&lt;br /&gt;
}&lt;br /&gt;
attr test_Thermostat knobMinMax 5,30&lt;br /&gt;
attr test_Thermostat readingNmap desired-temp-ext:desired-temp&lt;br /&gt;
attr test_Thermostat stateCmd {return ReadingsNum($name,&#039;temperature&#039;,0);}&lt;br /&gt;
attr test_Thermostat webCmd climacontrol&lt;br /&gt;
attr test_Thermostat widgetOverride climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos,#,rc_MINUS@minus.1,#,#,rc_PLUS@plus.1,#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;Raw Definition&amp;quot; oder &amp;quot;Copy for forum...&amp;quot; erstellt.  Erkennbar ist das an doppelten Strichpunkten und an backslash &amp;quot;\&amp;quot; am Zeilenende. Die Übernahme mit c&amp;amp;p in die FHEM- Kommandozeile, oder auch via Telnet funktioniert damit. Bei der Eingabe via FHEMWEB (detailView Definition, Attribut) müssen doppelte Strichpunkte und Backslash entfernt werden. &lt;br /&gt;
&lt;br /&gt;
Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40606</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40606"/>
		<updated>2025-12-29T08:17:58Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RaumThermostat / HeizungsAktor mit widget controlminidash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test_Thermostat.png|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget und support siehe:  {{Link2Forum|LinkText=FHEM-Forum|Topic=142831}} .&lt;br /&gt;
&amp;lt;br&amp;gt;Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt. Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
&amp;lt;br&amp;gt;Die KNX spezifischen Anpassungen:&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus &amp;lt;y&amp;gt;&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp &amp;lt;xx&amp;gt;&amp;quot;, wobei xx der aktuelle wert plus/minus y ist. Der Stepwert &amp;lt;y&amp;gt; wird durch die button-definition im widgetoverride definiert. Die &amp;quot;fw=&amp;gt;....&amp;quot; Definition zeigt die Optionen, wie (im Detail-View) der set-cmd pulldown dargestellt oder nicht dargestellt wird. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;readingNmap&#039;&#039;&#039; alle Werte die auf GAD desired-temp-ext ankommen, werden auf reading &#039;&#039;&#039;desired-temp&#039;&#039;&#039; dargestellt.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;userattr knobColor knobMinMax&#039;&#039;&#039; ermöglicht das setzen dieser Attribute im Device.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;widgetOverride Parameter:&#039;&#039;&#039; to be done - Das widget mit dieser Funktionalität ist noch nicht im SVN (im contrib), daher kann sich noch einiges an Parameter/Funktion ändern.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod test_Thermostat KNX 4/0/1:dpt9:desired-temp:set:nosuffix&lt;br /&gt;
4/1/1:dpt9:temperature:get:nosuffix&lt;br /&gt;
4/2/1:dpt9:desired-temp-ext:listenonly:nosuffix&lt;br /&gt;
4/3/1:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
4/4/1:dpt5.001:humidity:get:nosuffix&lt;br /&gt;
attr test_Thermostat userattr knobColor knobMinMax&lt;br /&gt;
attr test_Thermostat comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition&lt;br /&gt;
attr test_Thermostat eventMap {usr=&amp;gt;{&#039;^plus.(\d+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) + $1)) . &amp;quot;&#039;, &lt;br /&gt;
&#039;^minus.(\d+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) - $1)) . &amp;quot;&#039;}, &lt;br /&gt;
fw=&amp;gt; {&#039;^plus.(\d+)&#039; =&amp;gt; &#039;plus:1,2,3,4,5&#039;, &#039;^minus.(\d+)&#039; =&amp;gt; &#039; &#039;}&lt;br /&gt;
}&lt;br /&gt;
attr test_Thermostat knobMinMax 5,30&lt;br /&gt;
attr test_Thermostat readingNmap desired-temp-ext:desired-temp&lt;br /&gt;
attr test_Thermostat stateCmd {return ReadingsNum($name,&#039;temperature&#039;,0);}&lt;br /&gt;
attr test_Thermostat webCmd climacontrol&lt;br /&gt;
attr test_Thermostat widgetOverride climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos,#,rc_MINUS@minus.1,#,#,rc_PLUS@plus.1,#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;Raw Definition&amp;quot; oder &amp;quot;Copy for forum...&amp;quot; erstellt.  Erkennbar ist das an doppelten Strichpunkten und an backslash &amp;quot;\&amp;quot; am Zeilenende. Die Übernahme mit c&amp;amp;p in die FHEM- Kommandozeile, oder auch via Telnet funktioniert damit. Bei der Eingabe via FHEMWEB (detailView Definition, Attribut) müssen doppelte Strichpunkte und Backslash entfernt werden. &lt;br /&gt;
&lt;br /&gt;
Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40591</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40591"/>
		<updated>2025-12-27T23:25:42Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Übernehmen dieser Beispiele in die eigene Konfiguration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test_Thermostat.png|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget und support siehe: [https://forum.fhem.de/index.php?topic=142831 KNX-Forum].&lt;br /&gt;
&amp;lt;br&amp;gt;Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt. Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
&amp;lt;br&amp;gt;Die KNX spezifischen Anpassungen:&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp xx&amp;quot;, wobei xx der aktuelle wert plus/minus 1 ist. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;readingNmap&#039;&#039;&#039; alle Werte die auf GAD desired-temp-ext ankommen, werden auf reading &#039;&#039;&#039;desired-temp&#039;&#039;&#039; dargestellt.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;userattr knobColor knobMinMax&#039;&#039;&#039; ermöglicht das setzen dieser Attribute im Device.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;widgetOverride Parameter:&#039;&#039;&#039; to be done - Das widget mit dieser Funktionalität ist noch nicht im SVN (im contrib), daher kann sich noch einiges an Parameter/Funktion ändern.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod test_Thermostat KNX 4/0/1:dpt9:desired-temp:set:nosuffix&lt;br /&gt;
4/1/1:dpt9:temperature:get:nosuffix&lt;br /&gt;
4/2/1:dpt9:desired-temp-ext:listenonly:nosuffix&lt;br /&gt;
4/3/1:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
4/4/1:dpt5.001:humidity:get:nosuffix&lt;br /&gt;
attr test_Thermostat userattr knobColor knobMinMax&lt;br /&gt;
attr test_Thermostat comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition&lt;br /&gt;
attr test_Thermostat eventMap {usr=&amp;gt;{&#039;^plus&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) + 1)) . &amp;quot;&#039;, &lt;br /&gt;
&#039;^minus&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) - 1)) . &amp;quot;&#039;}, &lt;br /&gt;
fw=&amp;gt; {&#039;^plus&#039; =&amp;gt; &#039; &#039;, &#039;^minus&#039; =&amp;gt; &#039; &#039;}&lt;br /&gt;
}&lt;br /&gt;
attr test_Thermostat knobColor red&lt;br /&gt;
attr test_Thermostat knobMinMax 10,30&lt;br /&gt;
attr test_Thermostat readingNmap desired-temp-ext:desired-temp&lt;br /&gt;
attr test_Thermostat stateCmd {return ReadingsNum($name,&#039;temperature&#039;,0);}&lt;br /&gt;
attr test_Thermostat webCmd climacontrol&lt;br /&gt;
attr test_Thermostat widgetOverride climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos,#,rc_MINUS@minus,#,#,rc_PLUS@plus,#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;Raw Definition&amp;quot; oder &amp;quot;Copy for forum...&amp;quot; erstellt.  Erkennbar ist das an doppelten Strichpunkten und an backslash &amp;quot;\&amp;quot; am Zeilenende. Die Übernahme mit c&amp;amp;p in die FHEM- Kommandozeile, oder auch via Telnet funktioniert damit. Bei der Eingabe via FHEMWEB (detailView Definition, Attribut) müssen doppelte Strichpunkte und Backslash entfernt werden. &lt;br /&gt;
&lt;br /&gt;
Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40590</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40590"/>
		<updated>2025-12-27T17:04:37Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RaumThermostat / HeizungsAktor mit widget controlminidash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test_Thermostat.png|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget und support siehe: [https://forum.fhem.de/index.php?topic=142831 KNX-Forum].&lt;br /&gt;
&amp;lt;br&amp;gt;Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt. Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
&amp;lt;br&amp;gt;Die KNX spezifischen Anpassungen:&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp xx&amp;quot;, wobei xx der aktuelle wert plus/minus 1 ist. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;readingNmap&#039;&#039;&#039; alle Werte die auf GAD desired-temp-ext ankommen, werden auf reading &#039;&#039;&#039;desired-temp&#039;&#039;&#039; dargestellt.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;userattr knobColor knobMinMax&#039;&#039;&#039; ermöglicht das setzen dieser Attribute im Device.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;widgetOverride Parameter:&#039;&#039;&#039; to be done - Das widget mit dieser Funktionalität ist noch nicht im SVN (im contrib), daher kann sich noch einiges an Parameter/Funktion ändern.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod test_Thermostat KNX 4/0/1:dpt9:desired-temp:set:nosuffix&lt;br /&gt;
4/1/1:dpt9:temperature:get:nosuffix&lt;br /&gt;
4/2/1:dpt9:desired-temp-ext:listenonly:nosuffix&lt;br /&gt;
4/3/1:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
4/4/1:dpt5.001:humidity:get:nosuffix&lt;br /&gt;
attr test_Thermostat userattr knobColor knobMinMax&lt;br /&gt;
attr test_Thermostat comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition&lt;br /&gt;
attr test_Thermostat eventMap {usr=&amp;gt;{&#039;^plus&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) + 1)) . &amp;quot;&#039;, &lt;br /&gt;
&#039;^minus&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) - 1)) . &amp;quot;&#039;}, &lt;br /&gt;
fw=&amp;gt; {&#039;^plus&#039; =&amp;gt; &#039; &#039;, &#039;^minus&#039; =&amp;gt; &#039; &#039;}&lt;br /&gt;
}&lt;br /&gt;
attr test_Thermostat knobColor red&lt;br /&gt;
attr test_Thermostat knobMinMax 10,30&lt;br /&gt;
attr test_Thermostat readingNmap desired-temp-ext:desired-temp&lt;br /&gt;
attr test_Thermostat stateCmd {return ReadingsNum($name,&#039;temperature&#039;,0);}&lt;br /&gt;
attr test_Thermostat webCmd climacontrol&lt;br /&gt;
attr test_Thermostat widgetOverride climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos,#,rc_MINUS@minus,#,#,rc_PLUS@plus,#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40589</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40589"/>
		<updated>2025-12-27T16:49:12Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RaumThermostat / HeizungsAktor mit widget controlminidash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test_Thermostat.png|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget siehe: [https://forum.fhem.de/index.php?topic=142831 KNX-Forum].&lt;br /&gt;
&amp;lt;br&amp;gt;Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt. Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
&amp;lt;br&amp;gt;Die KNX spezifischen Anpassungen:&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp xx&amp;quot;, wobei xx der aktuelle wert plus/minus 1 ist. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;readingNmap alle Werte die auf GAD desired-temp-ext kommen, werden auf reading desirde-temp dargestellt.&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod test_Thermostat KNX 4/0/1:dpt9:desired-temp:set:nosuffix&lt;br /&gt;
4/1/1:dpt9:temperature:get:nosuffix&lt;br /&gt;
4/2/1:dpt9:desired-temp-ext:listenonly:nosuffix&lt;br /&gt;
4/3/1:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
4/4/1:dpt5.001:humidity:get:nosuffix&lt;br /&gt;
attr test_Thermostat userattr knobColor knobMinMax&lt;br /&gt;
attr test_Thermostat comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition&lt;br /&gt;
attr test_Thermostat eventMap {usr=&amp;gt;{&#039;^plus&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) + 10)) . &amp;quot;&#039;, &lt;br /&gt;
&#039;^minus&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;desired-temp %.1f&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;desired-temp&amp;quot;,0) - 10)) . &amp;quot;&#039;}, &lt;br /&gt;
fw=&amp;gt; {&#039;^plus&#039; =&amp;gt; &#039; &#039;, &#039;^minus&#039; =&amp;gt; &#039; &#039;}&lt;br /&gt;
}&lt;br /&gt;
attr test_Thermostat knobColor red&lt;br /&gt;
attr test_Thermostat knobMinMax -10,30&lt;br /&gt;
attr test_Thermostat readingNmap desired-temp-ext:desired-temp&lt;br /&gt;
attr test_Thermostat stateCmd {return ReadingsNum($name,&#039;temperature&#039;,0);;}&lt;br /&gt;
attr test_Thermostat webCmd climacontrol&lt;br /&gt;
attr test_Thermostat widgetOverride climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos,#,rc_MINUS@minus,#,#,rc_PLUS@plus,#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40588</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40588"/>
		<updated>2025-12-27T16:37:42Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RaumThermostat / HeizungsAktor mit widget controlminidash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test_Thermostat.png|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget siehe: [https://forum.fhem.de/index.php?topic=142831 KNX-Forum].&lt;br /&gt;
&amp;lt;br&amp;gt;Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
&amp;lt;br&amp;gt;Die KNX spezifischen Anpassungen:&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp xx&amp;quot;, wobei xx der aktuelle wert plus/minus 1 ist. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Test_Thermostat.png&amp;diff=40587</id>
		<title>Datei:Test Thermostat.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Test_Thermostat.png&amp;diff=40587"/>
		<updated>2025-12-27T16:29:46Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40586</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=40586"/>
		<updated>2025-12-27T16:20:08Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RaumThermostat / HeizungsAktor mit widget */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor mit widget controlminidash ====&lt;br /&gt;
[[Datei:Test Thermostat|rahmenlos|rechts|alternativtext=screenshot]]&lt;br /&gt;
Ähnlich dem obigen Beispiel, die GUI jedoch mit dem widget &#039;&#039;&#039;controlminidash&#039;&#039;&#039; gestaltet. Details zu diesem widget siehe: [https://forum.fhem.de/index.php?topic=142831 KNX-Forum].&lt;br /&gt;
Das widget besteht aus einem Kreissegment, um den aktuellen Wert anzeigen und ändern zu können. Im Zentrum werden bis zu 4 Werte dargestellt Zusätzlich sind bis zu 6 Buttons möglich. Wertbereich und Farbe des Sliders sind durch user-Attribute definierbar. &lt;br /&gt;
Die KNX spezifischen Anpassungen:&lt;br /&gt;
&#039;&#039;&#039;eventmap&#039;&#039;&#039; modifiziert ein &amp;quot;set test_Thermostat plus/minus&amp;quot; event (ausgelöst durch die beiden buttons plus/minus) zu &amp;quot;set test_Thermostat desired-temp xx&amp;quot;, wobei xx der aktuelle wert plus/minus 1 ist. Die syntax ist gewöhnungsbedürftig, aber sie funktioniert.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=40535</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=40535"/>
		<updated>2025-12-09T12:18:16Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Define mittels autocreate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst hier: https://wiki.fhem.de/wiki/KNX#Umstellung_von_EIB_auf_KNX_Modul oder diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Als dpt-Typ wird dptRAW gesetzt, weil autocreate keinen richtigen dpt vergeben kann . Wichtig ist, einen korrekten dpt-Typ zu definieren,  damit valides en- / de-coding von Messages möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading!  Diese Attribut ist abgekündigt, nicht mehr verwenden. Besser stateCmd, stateRegex oder stateFormat verwenden.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst, welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst, welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist, wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;readingNmap&#039;&#039;&#039; - ändert reading Name(n) mittels regex. Beispiele in der cmd-ref. Dieses Attribut wird vor allen anderen Attributen verarbeitet, daher müssen readingNamen die in z.B. stateCmd,..., notifies... verwendet werden, angepasst werden.&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung von EIB auf KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr aktualisiert wurde und abgekündigt ist, möchte ich dazu motivieren, auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen und Beispiele sind in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40533</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40533"/>
		<updated>2025-12-08T09:43:06Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Bekannte Probleme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Serielle Gateways (USB Stick / TPUART) werden vom KNXIO-Modul nicht direkt unterstützt. Für diese Varianten ist die Empfehlung, das via knxd-Daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. (Der knxd-Daemon braucht weniger Resourcen und bietet eine wesentlich bessere Fehlertoleranz - für serielle Scnittstellen).&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Der Vorteil: Es kann keine msg verloren gehen, ohne einen Eintrag im Logfile! Falls allerdings FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest message out of sequence received: seqcntrRx received/expected= xxx/yyy - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht zur Lösung führt, ist die Empfehlung, die Kommunikation über knxd zu lösen. Also: KNX-GW &amp;lt;-&amp;gt; knxd &amp;lt;-&amp;gt; FHEM (mode S, M od. T). Der knxd als eigenständiger Deamon ist nicht von Verzögerungen durch FHEM betroffen und hat bessere Fehler-Toleranz. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Falls KNXD Serielle oder USB Schnittstellen verwenden soll, muss im run cmd die device option verwendet werden, z.B:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker run ... --device=/dev/ttyUSB0 ... &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alternativ kann der Container auch im privileged mode laufen, damit ist Zugriff auf &#039;&#039;&#039;alle&#039;&#039;&#039; Host devices gegeben!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40523</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=40523"/>
		<updated>2025-12-07T14:52:39Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Timing Problem Mode H */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Serielle Gateways (USB Stick / TPUART) werden vom KNXIO-Modul nicht direkt unterstützt. Für diese Varianten ist die Empfehlung, das via knxd-Daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. (Der knxd-Daemon braucht weniger Resourcen und bietet eine wesentlich bessere Fehlertoleranz - für serielle Scnittstellen).&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht zur Lösung führt, ist die Empfehlung, die Kommunikation über knxd zu lösen. Also: KNX-GW &amp;lt;-&amp;gt; knxd &amp;lt;-&amp;gt; FHEM (mode S, M od. T). Der knxd als eigenständiger Deamon ist nicht von Verzögerungen durch FHEM betroffen und hat bessere Fehler-Toleranz. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Falls KNXD Serielle oder USB Schnittstellen verwenden soll, muss im run cmd die device option verwendet werden, z.B:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker run ... --device=/dev/ttyUSB0 ... &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alternativ kann der Container auch im privileged mode laufen, damit ist Zugriff auf &#039;&#039;&#039;alle&#039;&#039;&#039; Host devices gegeben!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=40522</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=40522"/>
		<updated>2025-12-07T11:46:29Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Attribute */ readingNmap neu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst hier: https://wiki.fhem.de/wiki/KNX#Umstellung_von_EIB_auf_KNX_Modul oder diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Allerdings wird automatisch das  disable Attribut gesetzt, weil autocreate keinen dpt vergeben kann und damit en- / de-coding von Messages nicht möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Um das disable attribut zu löschen, muß man vorher einen gültigen dpt in die Definition einfügen. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading!  Diese Attribut ist abgekündigt, nicht mehr verwenden. Besser stateCmd, stateRegex oder stateFormat verwenden.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;readingNmap&#039;&#039;&#039; - ändert reading Name(n) mittes regex. Beispiele in der cmd-ref. Diese Attribut wird vor allen anderen Attributen verarbeitet, daher müssen readingNamen die in z.B. stateCmd,..., notifies... verwendet werden, angepasst werden.&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung von EIB auf KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr aktualisiert wurde und abgekündigt ist, möchte ich dazu motivieren, auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen und Beispiele sind in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=40521</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=40521"/>
		<updated>2025-12-07T11:38:38Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Attribute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst hier: https://wiki.fhem.de/wiki/KNX#Umstellung_von_EIB_auf_KNX_Modul oder diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Allerdings wird automatisch das  disable Attribut gesetzt, weil autocreate keinen dpt vergeben kann und damit en- / de-coding von Messages nicht möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Um das disable attribut zu löschen, muß man vorher einen gültigen dpt in die Definition einfügen. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading!  Diese Attribut ist abgekündigt, nicht mehr verwenden. Besser stateCmd, stateRegex oder stateFormat verwenden.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;readingNmap&#039;&#039;&#039; - blblabla&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung von EIB auf KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr aktualisiert wurde und abgekündigt ist, möchte ich dazu motivieren, auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen und Beispiele sind in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=39643</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=39643"/>
		<updated>2024-11-10T17:49:37Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* on/off Device - mit verzögerter Rückmeldung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:switch:set 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /switch-set/steuern-/ /switch-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:switch:set:nosuffix 14/2/1:dpt1:status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off off:off:on&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name switch off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # sende text zum KNX display (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # löscht gesamten text am KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon. Das Beispiel soll auch zeigen, dass man aus einem cmd bzw. event einen (zusätzlichen) beliebigen reading-namen mit Wert erstellen kann.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=39641</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=39641"/>
		<updated>2024-11-04T14:32:10Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Garagentor Steuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:EinAus:set:nosuffix 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;Status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name EinAus off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;Status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-move ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-move_status ist die übliche Rückmeldung vom Status des Aktors. Wird hier nicht verwendet, kann weggelassen werden.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:move:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:move_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 2 seconds, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;move on-for-timer 2&#039;,&#039;move off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /move// /move_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride move:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set move on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von move und von move_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
#attr Slider2_Test userReadings Position:PosStatus.* {return readingsNum($name, &#039;PosStatus&#039;,0);; } &lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ zu Attr stateCmd kann auch Attr userReadings verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39628</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39628"/>
		<updated>2024-10-30T10:15:26Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNXD im Docker &amp;amp; Multicast */  --device option&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Serielle Gateways (USB Stick / TPUART) werden vom KNXIO-Modul nicht direkt unterstützt. Für diese Varianten ist die Empfehlung, das via knxd-Daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. (Der knxd-Daemon braucht weniger Resourcen und bietet eine wesentlich bessere Fehlertoleranz - für serielle Scnittstellen).&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Falls KNXD Serielle oder USB Schnittstellen verwenden soll, muss im run cmd die device option verwendet werden, z.B:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker run ... --device=/dev/ttyUSB0 ... &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alternativ kann der Container auch im privileged mode laufen, damit ist Zugriff auf &#039;&#039;&#039;alle&#039;&#039;&#039; Host devices gegeben!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=39387</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=39387"/>
		<updated>2024-07-29T10:56:41Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Umstellung EIB -&amp;gt; KNX Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst hier: https://wiki.fhem.de/wiki/KNX#Umstellung_von_EIB_auf_KNX_Modul oder diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Allerdings wird automatisch das  disable Attribut gesetzt, weil autocreate keinen dpt vergeben kann und damit en- / de-coding von Messages nicht möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Um das disable attribut zu löschen, muß man vorher einen gültigen dpt in die Definition einfügen. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading! Sinnvoll um z.B. Einheiten hinzuzufügen.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung von EIB auf KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr aktualisiert wurde und abgekündigt ist, möchte ich dazu motivieren, auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen und Beispiele sind in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=39386</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=39386"/>
		<updated>2024-07-29T10:56:10Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst hier: https://wiki.fhem.de/wiki/KNX#Umstellung_von_EIB_auf_KNX_Modul oder diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Allerdings wird automatisch das  disable Attribut gesetzt, weil autocreate keinen dpt vergeben kann und damit en- / de-coding von Messages nicht möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Um das disable attribut zu löschen, muß man vorher einen gültigen dpt in die Definition einfügen. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading! Sinnvoll um z.B. Einheiten hinzuzufügen.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung EIB -&amp;gt; KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr aktualisiert wurde und abgekündigt ist, möchte ich dazu motivieren, auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen und Beispiele sind in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=39385</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=39385"/>
		<updated>2024-07-29T10:51:29Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst hier: https://wiki.fhem.de/wiki/KNX#Umstellung_EIB_-&amp;gt;_KNX_Modul oder diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Allerdings wird automatisch das  disable Attribut gesetzt, weil autocreate keinen dpt vergeben kann und damit en- / de-coding von Messages nicht möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Um das disable attribut zu löschen, muß man vorher einen gültigen dpt in die Definition einfügen. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading! Sinnvoll um z.B. Einheiten hinzuzufügen.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung EIB -&amp;gt; KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr aktualisiert wurde und abgekündigt ist, möchte ich dazu motivieren, auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen und Beispiele sind in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39378</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39378"/>
		<updated>2024-07-16T16:07:47Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* TUL-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Serielle Gateways (USB Stick / TPUART) werden vom KNXIO-Modul nicht direkt unterstützt. Für diese Varianten ist die Empfehlung, das via knxd-Daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. (Der knxd-Daemon braucht weniger Resourcen und bietet eine wesentlich bessere Fehlertoleranz - für serielle Scnittstellen).&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39377</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39377"/>
		<updated>2024-07-16T15:53:00Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Umstellung von TUL oder KNXTUL Modul */  Beschreibung vereinfacht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: fhem.cfg sichern! Bestehende TUL/KNXTUL - Definition noch nicht löschen, neue KNXIO - Definition anlegen.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht. Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das löschen  vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach save  - FHEM restart! Den fhem-start mit einem Blick ins Log-file beobachten. &lt;br /&gt;
&lt;br /&gt;
Danach die bisherige TUL/KNXTUL definition löschen.&lt;br /&gt;
&lt;br /&gt;
Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in allen KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=39366</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=39366"/>
		<updated>2024-06-13T14:16:11Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RGBW Steuerung (dpt251.600) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:EinAus:set:nosuffix 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;Status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name EinAus off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;Status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird &#039;&#039;&#039;[[AutoShuttersControl|hier]]&#039;&#039;&#039; behandelt. Im Folgenden werden nur jene Definitionen gezeigt, die KNX-spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: automatisch Rauf-/Runterfahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstation auch Beschattung. Das ASC Modul sendet Werte von 0-100, um die Jalousieposition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-Device zusammengestellt werden, also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist, um die korrekte Funktion des ASC Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man den Befehl &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. &lt;br /&gt;
&lt;br /&gt;
Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Knxd&amp;diff=39288</id>
		<title>Knxd</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Knxd&amp;diff=39288"/>
		<updated>2024-04-24T12:23:51Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== knxd mit einem IP Gateway einrichten ==&lt;br /&gt;
Damit FHEM auf den KNX Bus zugreifen kann, wird ein passendes Interface benötigt. Es gibt:&lt;br /&gt;
* RS232&lt;br /&gt;
* USB&lt;br /&gt;
* IP&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Einrichtung von knxd mit einem IP Gateway auf einem Raspberry Pi2 mit Wheezy oder Jessie beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
==== Für Debian Jessie: ====&lt;br /&gt;
&#039;&#039;&#039;als erstes müssen folgende Pakete installiert werden (Referenz Debian Jessie):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install debhelper cdbs automake libtool libusb-1.0-0-dev git-core build-essential libsystemd-daemon-dev dh-systemd libev-dev cmake&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;knxd herunterladen und installieren&#039;&#039;&#039;&lt;br /&gt;
Achtung: Wenn Abhängigkeiten fehlen, dann müssen diese nachinstalliert werden. Nicht einfach mittels &amp;quot;-d&amp;quot; diese übergehen!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/knxd/knxd.git&lt;br /&gt;
cd knxd&lt;br /&gt;
git checkout deb&lt;br /&gt;
dpkg-buildpackage -b -uc&lt;br /&gt;
cd ..&lt;br /&gt;
sudo dpkg -i knxd_*.deb knxd-tools_*.deb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ab Debian Stretch, Buster, ... ====&lt;br /&gt;
&#039;&#039;&#039;knxd ist in den Debian packages vorhanden, muss daher nicht compiliert werden.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install knxd knxd-tools&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Konfiguration &#039;&#039;&#039;mit Systemd weitermachen!&#039;&#039;&#039; &lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&#039;&#039;&#039;1. Ohne systemd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es muss als nächstes die Konfigurationsdatei editiert werden, das geht mit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/default/knxd &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann folgende Einträge anpassen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DAEMON_ARGS=&amp;quot;-u /tmp/eib -u /var/run/knx -i -b ipt:192.168.188.XX&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_KNXD=YES&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Mit systemd z. B. für Debian Jessie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei bei Jessie hat sich wegen der Nutzung von systemd geändert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/knxd.conf &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann folgende Einträge anpassen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 1.2.202 -E 1.2.203:8 -c -DTRS -b ipt:192.168.188.XX&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bei Verwendung von KNXIO als IO-Modul finden sich detaillierte infos zu diesen Parametern hier: {{Link2CmdRef|Anker=KNXIO-define}}&lt;br /&gt;
&lt;br /&gt;
=== knxd Status überprüfen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/knxd status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== knxd als IP-Gateway einrichten ==&lt;br /&gt;
Der knxd kann auch gleich als IP-Gateway eingerichtet und sowohl mit FHEM als auch parallel mit der ETS genutzt werden. Dazu ist, neben einem Raspberry Pi, ein Interface zum KNX-Bus erforderlich. Geeignet sind z.B.:&lt;br /&gt;
* ROT&lt;br /&gt;
* PIGATOR mit PIM-TPUART&lt;br /&gt;
* TUL&lt;br /&gt;
der Fa. [http://busware.de Busware]. Wer einen Rasperry Pi3 benutzen möchte, der sollte zum TUL greifen, da die serielle Schnittstelle UART0 das Bluetooth-Modul des Pi3 bedient und wieder auf die GPIO-Pins umgeleitet werden muss. Der TUL bringt seine eigene serielle Schnittstelle mit, so dass Bluetooth erhalten bleibt.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereiten des TUL ===&lt;br /&gt;
==== TUL flashen ====&lt;br /&gt;
Der TUL wird ohne Software geliefert und kann über den Raspberry Pi programmiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install dfu-programmer&lt;br /&gt;
wget -O TPUARTtransparent.hex http://busware.de/tiki-download_file.php?fileId=54&lt;br /&gt;
sudo dfu-programmer atmega32u4 erase&lt;br /&gt;
sudo dfu-programmer atmega32u4 flash TPUARTtransparent.hex&lt;br /&gt;
sudo dfu-programmer atmega32u4 reset&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Soll der TUL unter Windows programmiert werden, so geht das mit [https://www.microchip.com/developmenttools/ProductDetails/FLIP FLIP]. Die HEX-Datei kann [http://files.busware.de/TUL/Transparent/ hier] herunter geladen werden.&lt;br /&gt;
Der TUL hat an der Unterseite einen winzigen Button. Dieser muss gedrückt werden, während der TUL in die USB-Buchse gesteckt wird.&lt;br /&gt;
In FLIP nun als &#039;&#039;Device=&amp;gt;Select&#039;&#039; ATmega32U4 auswählen und über &#039;&#039;Settings=&amp;gt;Communication=&amp;gt;USB&#039;&#039; die Verbindung herstellen. *.hex-Datei laden und im Rahmen &#039;&#039;Operation-Flow&#039;&#039; auf &#039;&#039;Run&#039;&#039; klicken. Fertig.&lt;br /&gt;
&lt;br /&gt;
==== TUL einen dauerhaften Namen geben ====&lt;br /&gt;
Linux bindet USB-Geräte beim Boot in einer eher zufälligen Reihenfolge ein. Werden mehrere USB-Geräte betrieben, so ist es sinnvoll, dem TUL einen festen Namen zuzuordnen. Dazu wird der TUL zunächst mit dem Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -la /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
identifiziert. Das Ergebnis sollte ungefähr so aussehen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
usb-busware.de_TPUART_8543934393935171B1C1-if00 -&amp;gt; ../../ttyACM0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Seriennummer (8543934393935171B1C1) wird später benötigt. Der Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sollte u.a. diese Zeile liefern&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Bus 001 Device 005: ID 03eb:204b Atmel Corp. LUFA USB to Serial Adapter Project&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
03eb ist dabei die Herstellerkennung, 204b die Produktkennung. Nun muss die Datei /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erstellt oder erweitert werden mit der Zeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;204b&amp;quot;, ATTRS{serial}==&amp;quot;8543934393935171B1C1&amp;quot;, SYMLINK+=&amp;quot;knx&amp;quot;, OWNER=&amp;quot;knxd&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der TUL wird dann unter /dev/knx erreichbar sein. Der knxd läuft als Benutzer knxd und hat damit die Berechtigung, auf den TUL zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereiten des Raspberry Pi für ROT oder PIGATOR ===&lt;br /&gt;
Der Raspberry Pi nutzt standardmäßig die serielle Schnittstelle als Terminal. Dies muss deaktiviert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo raspi-config&lt;br /&gt;
5 Interfaceoption&lt;br /&gt;
P6 Serial&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der knxd arbeitet als Benutzer knxd. Nach der Installation von knxd muss dieser noch der Gruppe dialout zugeordnet werden, damit er auf ttyAMA0 zugreifen kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -aG dialout knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Raspberry Pi 3 und 4 nutzen für die serielle Schnittstelle einen mini UART, der nicht mit dem knxd zusammenarbeitet. Der Hardware UART wird für Bluetooth verwendet. Bluetooth muss deaktiviert werden, damit der Hardware UART wieder unter ttyAMA0 zur Verfügung steht. In der /boot/config.txt muss die Zeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=disable-bt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
am Ende eingefügt werden. Nun muss noch der Dienst hciuart deaktiviert werden (initialisiert das Bluetooth-Modem):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable hciuart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nach einem anschließenden Reboot ist der TPUART unter ttyAMA0 ansprechbar.&lt;br /&gt;
&lt;br /&gt;
Nach dieser Prozedur ist natürlich die Benuzung des Bluetooth-Moduls nicht mehr möglich. Wer das Modul benötigt, findet die Anleitung hier:&lt;br /&gt;
&lt;br /&gt;
[[Raspberry Pi 3: GPIO-Port Module und Bluetooth]]&lt;br /&gt;
&lt;br /&gt;
Der Raspberry Pi 4 besitzt weitere UARTs, die auch für den knxd genutzt werden können. Weitere Informationen dazu gibt es [https://gitlab.com/knx-makerstuff/knx_microbcu2/-/wikis/DualKNX-RaspiHat-Quick-Installation-Guide#uart-configuration hier].&lt;br /&gt;
&lt;br /&gt;
=== Andere BCU&#039;s (BusCouplerUnit) ===&lt;br /&gt;
Natürlich sind auch andere BCU&#039;s geeignet. Wer weiß, an welchem Ende er einen Lötkolben anzufassen hat, ist mit der [https://knx-user-forum.de/forum/projektforen/konnekting/1045398-microbcu-sehr-kleiner-knx-transceiver MicroBCU] gut bedient. Sie kann z.B. über einen ADUM1201 mit dem UART des Raspberry Pi verbunden werden (Tx-&amp;gt;Rx, Rx-&amp;gt;Tx, Konfiguration wie unter [[Knxd#Vorbereiten_des_Raspberry_Pi_f.C3.BCr_ROT_oder_PIGATOR|ROT]] beschrieben) oder über einen USB2Seriell-Konverter (Konfiguration ähnlich [[Knxd#TUL_einen_dauerhaften_Namen_geben|TUL]]).{{Hinweis|Die MicroBCU wird vom Bus gespeist und liefert auch zwei Spannungen, wovon die 3,3V auch für den ADUM genutzt werden kann. Wer den Raspi aus dem KNX-Netzteil versorgen möchte, sollte sich [https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/diy-do-it-yourself/1597469-dualknx-microbcu-hat-f%C3%BCr-raspberrypi-mit-dc-dc-netzteil das hier] mal ansehen.}}&lt;br /&gt;
&lt;br /&gt;
=== Installieren des knxd ===&lt;br /&gt;
Die Installation erfolgt nun wie oben unter [[Knxd#Installation|Installation]] beschrieben. Hier noch mal der dringende Hinweis, fehlende Abhängigkeiten nicht mit -d zu überspringen. Jede Abhängigkeit, die als Fehlend moniert wird, nachinstallieren und Kompilierung neu starten. Prozedur notfalls mehrfach wiederholen. Das Kompilieren dauert und manchmal geht es scheinbar nicht weiter. Also Geduld.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration erfolgt wieder in der knxd.conf mit&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/knxd.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun die Konfiguarionszeile anpassen&amp;lt;br&amp;gt;&lt;br /&gt;
(serielle Schnittstelle)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 1.2.202 -E 1.2.203:8 -c -DTRS -b tpuarts:/dev/ttyAMA0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(USB)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 1.2.202 -E 1.2.203:8 -c -DTRS -b tpuarts:/dev/knx&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und dann noch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_KNXD=YES&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
um knxd beim Systemstart sofort zu starten.&lt;br /&gt;
&lt;br /&gt;
-e definiert die physikalische Adresse des knxd, -E definiert einen Adressbereich für ETS5 etc. (hier einen Bereich aus acht Adressen). Diese Adressen müssen an das eigene Netz angepasst werden. In FHEM sieht das dann so aus &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO T 127.0.0.1:6720 1.2.203&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alternativ via Multicast: (siehe auch KNXIO-wiki):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 1.2.203&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Spätestens jetzt sollte der KNX-Bus angeschlossen werden.{{Hinweis|Da der TPUART (wie auch andere BCU‘s) vom Bus gespeist wird, kann der knxd den TPUART nur initialisieren, wenn der Bus angeschaltet ist.}}&lt;br /&gt;
Wer Multicast nutzen möchte, muss ab Buster dieses noch aktivieren (z.B. für Tasmota-KNX)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&lt;br /&gt;
&amp;quot;1&amp;quot; durch &amp;quot;0&amp;quot; ersetzen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nach einem&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sollte der knxd dann laufen.&lt;br /&gt;
{{Hinweis|Manche KNX-Module bringen zusätzlich eine IP-Gateway-Funktion mit (z.B. sonnenKNX zur Verbindung der sonnenBatterie mit dem KNX-Bus). Hier führt die Option -R in der Konfigurationsdatei zu Problemen (KNX-IP Daten werden mehrfach auf den Bus gespiegelt). Daher muss die Option -R entfernt werden (-DTS), wenn ein solches Modul nachträglich in das System integriert wird.}}&lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker Environment ==&lt;br /&gt;
siehe: [[KNXIO#KNXD_im_Docker_&amp;amp;_Multicast]]&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&#039;&#039;&#039;Wie wird eibd vorher deinstalliert?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -r /usr/local/bin/{eibd,knxtool,group*} /usr/local/lib/lib{eib,pthsem}*.so* /usr/local/include/pth*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&amp;lt;/u&amp;gt;: knxd unterstützt im Gegensatz zu eibd die Hilfsprogramme knxtools nur sehr eingeschränkt (Siehe dazu Hinweis unter https://github.com/knxd/knxd#migrating-to-012. &amp;quot;progmode&amp;quot; sowie alle mit &amp;quot;m&amp;quot; beginnenden Kommandos sind entgegen der Doku ab Version 0.12 nicht mehr funktionsfähig. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;folgender Fehler: dpkg-buildpackage: Fehler: Fehler-Exitstatus von debian/rules build war 2&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install git-core build-essential&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
in der datei knxd/debian/rules die Zeile:&lt;br /&gt;
bash tools/test.sh auskommentieren&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehler: dpkg-buildpackage: error: fakeroot not found, either install the fakeroot &amp;lt;....&amp;gt; &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install fakeroot dpkg-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Benutzer:Marthinx]]&lt;br /&gt;
* [https://github.com/knxd/knxd Github knxd]&lt;br /&gt;
* [https://knx-user-forum.de/forum/projektforen/knxd/1049547-grundlagen-zum-knxd-mit-installationsanleitung-vor-dem-schreiben-lesen Forums-Thread zu knxd. Sehr informativ.]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39287</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39287"/>
		<updated>2024-04-24T12:10:19Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Attribute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39286</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39286"/>
		<updated>2024-04-24T12:08:21Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Attribute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=de|Anker=KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39285</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39285"/>
		<updated>2024-04-24T12:05:19Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Definitions-Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=de|Anker=KNXIO#KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39284</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39284"/>
		<updated>2024-04-24T12:03:25Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: Attribute  enableKNXscan added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
* &#039;&#039;&#039;enableKNXscan&#039;&#039;&#039; - löst ein KNXscan cmd aus: nie -&amp;gt; 0 , Fhem Start -&amp;gt; 1 , bei jedem connect event -&amp;gt; 2. Details dazu: {{Link2CmdRef|Lang=de|Anker=#KNX-utilities|Label=hier}}&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39216</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39216"/>
		<updated>2024-04-02T10:05:24Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNXD im Docker &amp;amp; Multicast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch &#039;&#039;&#039;Multicas&#039;&#039;&#039;t oder &#039;&#039;&#039;discovery&#039;&#039;&#039; (verwendet von ETS) unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39204</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39204"/>
		<updated>2024-03-26T10:08:42Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNXD im Docker &amp;amp; Multicast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;--network=mymacvlannetwork&#039;&#039; ist nur notwendig, falls der knxd auch Multicast unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker Container) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Multicast zwischen Docker-Containern (FHEM &amp;lt;.&amp;gt; knxd) funktioniert nicht, daher die Empfehlung KNXIO mode S  zu verwenden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39203</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39203"/>
		<updated>2024-03-26T09:28:50Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNXD im Docker &amp;amp; Multicast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker) mittels KNXIO mode S ! Die dazu passende FHEM Definition:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S UNIX:STREAM:/var/run/knx/knxd.sock &amp;lt;x.y.z&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39202</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39202"/>
		<updated>2024-03-26T09:21:30Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNXD im Docker &amp;amp; Multicast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker) mittels KNXIO mode S !&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39201</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39201"/>
		<updated>2024-03-26T09:15:11Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* neu: KNXD im Docker &amp;amp; Multicast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== FHEM im Docker Environment &amp;amp; Multicast ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== KNXD im Docker &amp;amp; Multicast ==&lt;br /&gt;
KNXD Docker Images gibit es einige am docker.hub, die meisten davon kompilieren knxd aus den sourcen, was nicht mehr nötig ist. Daher hier eine Anleitung, wie knxd im Docker funktionieren kann, inklusive MC-support:&lt;br /&gt;
&lt;br /&gt;
Ein Verzeichnis erstellen und in dieses wechseln:, z.B:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mkdir ~/knxd &amp;amp;&amp;amp; cd ~/knxd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile in diesem Verzeichnis erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
FROM debian:bullseye-slim AS knxd&lt;br /&gt;
&lt;br /&gt;
ENV TZ=&amp;quot;Europe/Vienna&amp;quot;&lt;br /&gt;
RUN date&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get upgrade -y \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
       knxd \&lt;br /&gt;
       knxd-tools \&lt;br /&gt;
       net-tools \&lt;br /&gt;
       iproute2 \&lt;br /&gt;
       iputils-ping \&lt;br /&gt;
       nano \&lt;br /&gt;
       procps \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* /tmp/* /usr/share/doc/* /usr/share/man/*/* /var/cache/apt \&lt;br /&gt;
    &amp;amp;&amp;amp; adduser knxd tty&lt;br /&gt;
&lt;br /&gt;
COPY --chmod=755 ./startknxd.sh /&lt;br /&gt;
COPY --chmod=666 ./knxd.ini /&lt;br /&gt;
&lt;br /&gt;
RUN mkdir /var/run/knx&lt;br /&gt;
RUN chmod 777 /var/run/knx&lt;br /&gt;
&lt;br /&gt;
EXPOSE 3671/udp&lt;br /&gt;
EXPOSE 6720&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;/startknxd.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;startknxd.sh erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# wait for knxd started and create socks file&lt;br /&gt;
#sleep 10 &amp;amp;&amp;amp; chmod 777 /var/run/knx/knxd.sock &amp;amp;&lt;br /&gt;
SOCKSFILE=&amp;quot;/var/run/knx/knxd.sock&amp;quot;&lt;br /&gt;
waitForSocksFile() {&lt;br /&gt;
  local  sFile=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local dt=$(date &#039;+%F %H:%M:%S.%3N&#039;)&lt;br /&gt;
  echo -en &amp;quot;${dt} waiting for knxd start &amp;quot;&lt;br /&gt;
  for i in {1..20}&lt;br /&gt;
  do&lt;br /&gt;
    if test -S &amp;quot;$sFile&amp;quot;; then&lt;br /&gt;
      echo -e &amp;quot;\n$(date &#039;+%F %H:%M:%S.%3N&#039;) socks file updated\n&amp;quot;&lt;br /&gt;
      chmod 777 $sFile&lt;br /&gt;
      break&lt;br /&gt;
    else&lt;br /&gt;
      echo -en &amp;quot;.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 0.5&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if test -e &amp;quot;$SOCKSFILE&amp;quot;; then&lt;br /&gt;
  rm &amp;quot;$SOCKSFILE&amp;quot; # delete old file&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
waitForSocksFile &amp;quot;$SOCKSFILE&amp;quot; &amp;amp;&lt;br /&gt;
sleep 0.2&lt;br /&gt;
exec knxd /knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;knxd.ini erstellen:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[A.tcp]&lt;br /&gt;
server = knxd_tcp&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[B.unix]&lt;br /&gt;
path = /var/run/knx/knxd.sock&lt;br /&gt;
server = knxd_unix&lt;br /&gt;
systemd-ignore = true&lt;br /&gt;
[C.ipt]&lt;br /&gt;
driver = ipt&lt;br /&gt;
filters = retryFilter&lt;br /&gt;
ip-address = 192.168.10.232&lt;br /&gt;
[debug-server]&lt;br /&gt;
name = mcast:knxd&lt;br /&gt;
[main]&lt;br /&gt;
addr = 0.0.20&lt;br /&gt;
client-addrs = 0.0.21:8&lt;br /&gt;
connections = server,A.tcp,B.unix,C.ipt&lt;br /&gt;
systemd = systemd&lt;br /&gt;
[server]&lt;br /&gt;
debug = debug-server&lt;br /&gt;
discover = true&lt;br /&gt;
multicast-address = 224.0.23.12&lt;br /&gt;
port = 3671&lt;br /&gt;
router = router&lt;br /&gt;
server = ets_router&lt;br /&gt;
tunnel = tunnel&lt;br /&gt;
[retryFilter]&lt;br /&gt;
filter = retry&lt;br /&gt;
max-retries = 0&lt;br /&gt;
retry-delay = 60&lt;br /&gt;
start-timeout = 10&lt;br /&gt;
may-fail = true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Diese knxd.ini ist als Beispiel zu sehen, muß jedenfalls an die eigenen Anfordeungen angepasst werden. Es gibt ein Utility um eine knxd.ini aus dem commandline-syntax zu erstellen:&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/knxd_args -e 0.0.20 -E 0.0.21:8  -D -T -R .... &amp;gt;knxd.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig: Nachdem in diesem docker-image &#039;&#039;&#039;kein systemd&#039;&#039;&#039; läuft, alle Einräge auf:  &#039;&#039;systemd-ignore = true&#039;&#039; ändern! Weiters ist der Abschnitt retryFilter sinnvoll, wel sonst der knxd unmittelbar terminiert (Error: F00000105), falls ein x.ipt oder x.tcp nicht erreichbar sein sollte!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;create image &amp;amp; run knxd:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo docker build -t MH/knxd .&lt;br /&gt;
sudo docker run -d --name knxd --network=mymacvlannetwork --ip=192.168.5.145 -h cl-RPI4-knxd -v /var/run/knx:/var/run/knx --restart=unless-stopped MH/knxd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;build muss bei jeder Änderung in knxd.ini und startknxd.sh aufgerufen werden. Name / Host-name / ImageName / ip sind als Beispiel zu sehen. Das &#039;&#039;-v /var/run/knx:/var/run/knx&#039;&#039; ermöglicht die Kommunikation via socks file zu einem FHEM (im Docker) mittels KNXIO mode S !&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39190</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39190"/>
		<updated>2024-03-19T17:16:26Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNX im Docker Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== KNX im Docker Environment ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 16 Addressen 192.168.5.144 - .159), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; (optional) eine statische Adresse aus dem definierten ip-range. Falls nicht angegeben, vergibt Docker eine Adresse aus diesem Bereich.&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar. Von anderen Containern im gleichen macvlan ist der FHEM-container unter &#039;&#039;fhemdocker.mymacvlannetwork&#039;&#039; erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39148</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39148"/>
		<updated>2024-02-29T10:52:56Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNX im Docker Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== KNX im Docker Environment ==&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 8 Addressen 192.168.5.144 - .151), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; eine (statische) Adresse aus den definierten ip-range Bereich&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39147</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39147"/>
		<updated>2024-02-29T10:51:17Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNX im Docker Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
=== KNX im Docker Environment ===&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher Docker host-mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip-range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 8 Addressen 192.168.5.144 - .151), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; eine (statische) Adresse aus den definierten ip-range Bereich&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39141</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39141"/>
		<updated>2024-02-20T18:31:47Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* KNX im Docker Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
==== KNX im Docker Environment ====&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher host mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip.range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 8 Addressen 192.168.5.144 - .151), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; eine (statische) Adresse aus den definierten ip-range Bereich&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host der FHEM Container und umgekehrt! Das ist eine Docker/macvlan Einschränkung. Container &amp;lt;-&amp;gt; Container connectivity ist gegeben, wenn die Container im gleichen macvlan sind.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39138</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=39138"/>
		<updated>2024-02-20T11:03:12Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: neu: KNX im Docker environment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
==== KNX im Docker Environment ====&lt;br /&gt;
Wie bekannt, unterstützt Docker in Bridge Konfiguration &#039;&#039;&#039;kein Broadcast / Multicast.&#039;&#039;&#039;  Daher funktioniert KNXIO Mode M nicht im Docker! In diversen Foren wird  daher host mode empfohlen.Alle anderen KNXIO-modes funktionieren im bridge Modus!&lt;br /&gt;
&lt;br /&gt;
Der Host mode hat jedoch einige Nachteile, daher basierend auf {{Link2Forum|Topic=114284|LinkText=diesem Forum post}}, folgenden Lösung mittels macvlan:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker network create -d macvlan -o parent=eth0 --subnet=192.168.5.0/24 --gateway=192.168.5.254 --ip-range=192.168.5.144/28 mymacvlannetwork&lt;br /&gt;
docker run -d --name fhemdocker --network=mymacvlannetwork --ip=192.168.5.144 -h cl-RPI4-d1 -v /opt/volumes/fhem:/opt/fhem fhem/fhem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Erstellen macvlan Network:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;eth0&#039;&#039;&#039; ist der name des Ethernet Interfaces an docker-host&lt;br /&gt;
* &#039;&#039;&#039;subnet / gateway&#039;&#039;&#039; dem Netzwerk Environment entsprechend.&lt;br /&gt;
* &#039;&#039;&#039;ip.range&#039;&#039;&#039; ein Adress-Bereich aus dem Netzwerk, (in diesem Beispiel 8 Addressen 192.168.5.144 - .151), diese &#039;&#039;&#039;dürfen nicht&#039;&#039;&#039;  im DHCP Range oder durch statische Adressen bereits vergeben sein!&lt;br /&gt;
* &#039;&#039;&#039;mymacvlannetwork&#039;&#039;&#039; Name des macvlan&lt;br /&gt;
&lt;br /&gt;
Docker run cmd:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;--name&#039;&#039;&#039; des containers&lt;br /&gt;
* &#039;&#039;&#039;--network&#039;&#039;&#039; referenz auf macvlan&lt;br /&gt;
* &#039;&#039;&#039;--ip&#039;&#039;&#039; eine (statische) Adresse aus den definierten ip-range Bereich&lt;br /&gt;
* &#039;&#039;&#039;-v&#039;&#039;&#039; Mapping von /opt/volumes/fhem (am Docker host) auf /opt/fhem (im Container) - dort wird z.B auch die fhem.cfg / logs / ... permanent gespeichert.&lt;br /&gt;
* &#039;&#039;&#039;fhem/fhem&#039;&#039;&#039; standard Image von docker hub&lt;br /&gt;
&lt;br /&gt;
Erreichbar ist FHEM auf: &amp;lt;nowiki&amp;gt;http://192.168.5.144:8083/fhem&amp;lt;/nowiki&amp;gt; Alle ports die FHEM öffnet sind von überall (Ausnahme Docker-host) im eigenen Netz erreichbar.&lt;br /&gt;
&lt;br /&gt;
Nicht erreichbar ist vom docker host &amp;lt;-&amp;gt; FHEM und umgekehrt! Das ist eine Docker/macvlan Einschränkung.&lt;br /&gt;
&lt;br /&gt;
Falls die Namensauflösung (--name fhemdocker) im Netz nicht funktioniert, kann der name z.B. in der Fritzbox statisch definiert werden. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38728</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38728"/>
		<updated>2023-11-21T08:17:24Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:EinAus:set:nosuffix 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;Status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name EinAus off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;Status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird [[AutoShuttersControl|hier]] behandelt. Hier werden nur jene Definitionen gezeigt, die KNX spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Etliche Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: Autom. Hinauf/Runter fahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstion auch Beschattung. Das ASC Modul sendet Werte von 0-100 um die JalousiePosition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device überein stimmen&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-device zusammengestellt werden - also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist um die korrekte Funktion des ASC.Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu Testen, kann man den command:  &#039;&#039;&#039;set &amp;lt;ASC_device&amp;gt; wiggle&#039;&#039;&#039; verwenden. Die Jalousie sollte sich um 5% (default) bewegen und nach 60 Sekunden um 5% in die Gegenrichtung. &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38727</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38727"/>
		<updated>2023-11-21T08:00:44Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Jalousie / Rolladen */  Erweiterung ASC Funktion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:EinAus:set:nosuffix 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;Status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name EinAus off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;Status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen -  Erweiterung mit ASC (AutoShuttersControl) ====&lt;br /&gt;
Das ist eine Erweiterung des vorigen Beispiels. Die grundsätzliche Funktionalität von ASC wird [[AutoShuttersControl|hier]] behandelt. Hier werden nur jene Definitionen gezeigt, die KNX spezifisch sind.&lt;br /&gt;
&lt;br /&gt;
Etliche Funktionen des ASC.Moduls sind in einem KNX.System möglicherweise bereits vorhanden, z.B.: Autom. Hinauf/Runter fahren bei diversen Alarmen (Wind,Regen,Frost, Fenster/Tür offen) oder in Kombination mit einer Wetterstion auch Beschattung. Das ASC Modul sendet Werte von 0-100 um die JalousiePosition zu setzen und erwartet im ASC_Pos_Reading Attribut die aktuelle Position.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Jal_Kueche ASC 1&lt;br /&gt;
attr Jal_Kueche ASC_Closed_Pos 100&lt;br /&gt;
attr Jal_Kueche ASC_Open_Pos 0&lt;br /&gt;
attr Jal_Kueche ASC_CommandTemplate set $name position $pos&lt;br /&gt;
attr Jal_Kueche ASC_Pos_Reading posstatus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ASC_Open_Pos, ASC_Closed_Pos: 0 bedeutet Jalousie ist oben, 100 unten. &lt;br /&gt;
&lt;br /&gt;
ASC_Pos_Reading: das ist der Ist-Wert der Jalousie. Muss mit dem Readingnamen im KNX-Device überein stimmen&lt;br /&gt;
&lt;br /&gt;
ASC_CommandTemplate: so muss der set command für das KNX-device zusammengestellt werden - also z.B:  &#039;&#039;&#039;set Jal_Kueche position 50&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Testen wurde festgestellt, dass nach Definition/Änderung von Attributen u.U. ein FHEM Restart erforderlich ist um die korrekte Funktion des ASC.Moduls zu erhalten.&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Einrichten_von_eibd_f%C3%BCr_das_Weinzierl_IP_730_Interface&amp;diff=38656</id>
		<title>Einrichten von eibd für das Weinzierl IP 730 Interface</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Einrichten_von_eibd_f%C3%BCr_das_Weinzierl_IP_730_Interface&amp;diff=38656"/>
		<updated>2023-10-26T16:14:14Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= eibd mit dem Weinzierl IP 730 Interface einrichten =&lt;br /&gt;
Damit FHEM auf den KNX Bus zugreifen kann, wird ein passendes [[Interface]] benötigt.&lt;br /&gt;
&lt;br /&gt;
Es gibt:&lt;br /&gt;
* RS232&lt;br /&gt;
* USB&lt;br /&gt;
* IP&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Einrichtung von eibd mit dem Weinzierl IP 730 Interface beschrieben.&lt;br /&gt;
&lt;br /&gt;
Der eibd wurde weiterentwickelt und heisst nun [[knxd]]. Er kann nun auf aktuellen debian systemen mittels &amp;quot;apt-get&amp;quot; installiert werden und ist auf der Seite [[knxd]] im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
Das Weinzierl IP 730 Interface kann bis zu fünf Verbindungen gleichzeitig handhaben.&lt;br /&gt;
Die erste physikalische Adresse wird im Kommunikation Menü konfiguriert. Jede weitere wird durch das drücken des Programmknopfes generiert.&lt;br /&gt;
Dabei gilt: jedes drücken entspricht letzte phy-addr +1. Daher empfiehlt es sich, mit der ersten Adresse (0.0.51) zu beginnen.&lt;br /&gt;
&lt;br /&gt;
In Verbindung mit FHEM funktionieren die Parameter:&lt;br /&gt;
&lt;br /&gt;
 KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:5 -D -T -R -S -b ipt:&amp;amp;lt;IP vom 730&amp;amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Definition in der FHEM [[Konfiguration]] sieht dann z.B. so aus (weitere Beispiele zur Konfiguration sind auf der Seite [[KNXIO]] verfügbar):&lt;br /&gt;
&lt;br /&gt;
 define myKNXGW KNXIO T localhost:6720 0.0.51 &lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=38640</id>
		<title>KNX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX&amp;diff=38640"/>
		<updated>2023-10-04T11:54:56Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: Migration EIB -&amp;gt; KNX&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=122582&lt;br /&gt;
|ModTechName=10_KNX.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNX]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das KNX-Modul umzusteigen!&lt;br /&gt;
Unterstützung gibst in diesem Thread:  https://forum.fhem.de/index.php/topic,126994.0.html im Forum|RNTyp=Warn|style=}}&lt;br /&gt;
&lt;br /&gt;
Der KNX support ist in FHEM als 2stufiges Modul konzipiert, braucht daher zusätzlich zu diesem Modul ein sog. IO-Modul, das mit der &amp;quot;Aussenwelt&amp;quot; spricht. Das IO-Modul: [[KNXIO|&#039;&#039;&#039;KNXIO&#039;&#039;&#039;]] ersetzt die bisher verfügbaren Module &#039;&#039;&#039;TUL&#039;&#039;&#039; und &#039;&#039;&#039;KNXTUL&#039;&#039;&#039;, es unterstützt die (meisten) Funktionen der bisherigen IO-Module und bietet zusätzlich weitere Kommunikationsoptionen.&lt;br /&gt;
&lt;br /&gt;
Weiters wird eine Schnittstellen-Hardware gebraucht zwischen dem KNX-Bus und der LAN- oder USB- oder Seriell-Schnittstelle, das kann ein serielles-&amp;gt;KNX-Bus Modul sein (Bsp: siehe Fa. Busware TUL,...) oder auch ein Hardware Gateway oder Router.&lt;br /&gt;
&lt;br /&gt;
Als Middleware kommt meistens knxd zum Einsatz. [https://github.com/knxd/knxd/wiki knxd wiki] &lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNX &amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt;[:[gadName]:[set|get|listenonly]:[nosuffix]] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..] [&amp;lt;group&amp;gt;:&amp;lt;dpt&amp;gt; ..]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind mandatory Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
Mehrfache &amp;lt;group&amp;gt;&amp;lt;dpt&amp;gt;....  sind in einer Definition zulässig. Damit kann man Geräte mit komplexen Funktionen in einem FHEM Gerät abbilden. (siehe Beispiele) &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
* &#039;&#039;&#039;group&#039;&#039;&#039; - Das ist die GruppenAdresse (GA) des jeweiligen KNX-Geräts. Diese wird (meist) mit der ETS in das KNX-Gerät programmiert. Ein KNX Aktor reagiert nur auf diese Adresse, wenn es eine seiner eigenen ist. Format: &amp;lt;0-31&amp;gt;/&amp;lt;0-7&amp;gt;/&amp;lt;0-255&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dpt&#039;&#039;&#039; - Das ist die Definition (Data Point Type), wie FHEM und auch das KNX-Gerät den gesendeten/empfangenen Wert interpretieren! Die Werte (am Bus) können 1bit, 2bit,....4byte lang sein, oder auch 14Char.Text, oder Zeit und Datum. Falls der dpt in FHEM nicht mit dem im KNX-Gerät übereinstimmt, gibts falsche od. gar keine Werte! Eine vollständige Liste der unterstützen dpt-Types: {{Link2CmdRef|Anker=KNX-dpt}}. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gadName&#039;&#039;&#039; - GruppenAdressName bzw. GA-Alias. Angabe ist optional, sinnvoll ist ein &amp;quot;sprechender Name&amp;quot;, z.B. &amp;quot;EinAus&amp;quot; od. &amp;quot;steuern&amp;quot; für eine GA die zum senden eines Befehls dient, oder z.B. &amp;quot;status&amp;quot; für die Rückmeldung vom Gerät. Ist kein gadName definiert, wird g1...g9 als gadName verwendet. Der gadName beeinflusst auch die entsprechenden Reading-Namen! Die Wahl eines  gadName ist fast völlig frei - (Einschränkungen sind in der cmdref dokumentiert), allerdings ist eine Überlegung, den gadNamen so zu wählen, das der daraus abgeleitete readingName und auch set-cmd  mit einem externen System (z.B. Sprachsteuerung) kompatibel ist. Z.B.: für Soll-Temperatur-&amp;gt;desired-temp, Luftfeuchte-&amp;gt;humidity, Luftdruck-&amp;gt;pressure, Temperatur-&amp;gt;temperature, usw... Damit erspart man sich mühsame mappings bei der Umsetzung der Sprachsteuerung.  Beispiel: &#039;&#039;&amp;quot;Axxx wie ist die Solltemperatur im Wohnzimmer&amp;quot;&#039;&#039; - wird mit &amp;lt;code&amp;gt;get Wohnzimmer desired-temperature&amp;lt;/code&amp;gt; übersetzt....&lt;br /&gt;
* &#039;&#039;&#039;set | get | listenonly&#039;&#039;&#039; - alternative optionen, optional, (nur eine Angabe möglich) zur Beeinflussung was FHEM (oder der User) mit dieser Definition machen darf. set bzw get steht für: Fhem darf senden bzw. aktiv ein Gerät abfragen, listenonly bedeutet dass weder was gesendet noch was abgefragt werden darf, es soll nur ankommende Messages verarbeitet werden. Sinnvoll z.B. bei einem Windsensor der in Intervallen die Windgeschwindigkeit auf den Bus sendet.&lt;br /&gt;
* &#039;&#039;&#039;nosuffix&#039;&#039;&#039; - optional, beeinflusst den readingNamen. Ohne diesen Parameter lauten Reading-Namen z.b. &amp;quot;EinAus-set&amp;quot; u. &amp;quot;EinAus-get&amp;quot; bzw. &amp;quot;setG1&amp;quot; u. &amp;quot;getG1&amp;quot;, mit nosuffix fällt das -set bzw. -get weg, alle gesendeten- und empfangenen-Messages landen im reading EinAus.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX}}.&lt;br /&gt;
&lt;br /&gt;
==== Define mittels autocreate ====&lt;br /&gt;
Autocreate wird unterstützt. Ankommende Messages erhalten DeviceNamen nach dem Schema: &#039;&#039;&#039;KNX_nnmmooo&#039;&#039;&#039;. &amp;quot;nn&amp;quot; bezeichnet die Hauptlinie, &amp;quot;mm&amp;quot; die Bereichsline und &amp;quot;ooo&amp;quot; das KNX-Gerät (= die GA_Addresse). Allerdings wird automatisch das  disable Attribut gesetzt, weil autocreate keinen dpt vergeben kann und damit en- / de-coding von Messages nicht möglich ist.  Es wird auch keine FileLog- oder SVG-Definition erstellt. Um das disable attribut zu löschen, muß man vorher einen gültigen dpt in die Definition einfügen. Sinnvollerweise ändert man auch den DeviceName auf etwas &amp;quot;sprechendes&amp;quot; (z.B. Licht_Wohnzimmer). Man kann das definieren durch autocreate beeinflussen, mit dem Attributen: &#039;&#039;&#039;autocreateThreshold&#039;&#039;&#039; und &#039;&#039;&#039;ignoreTypes&#039;&#039;&#039;  im globalen autocreate-device. &lt;br /&gt;
&lt;br /&gt;
Falls man einen FileLog für ALLE KNX-Geräte haben will, die mittels Autocreate angelegt wurden - oder künftig werden, könnte das so aussehen: &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNX_default_Fl FileLog %L/KNX_default-%Y-W%W.log KNX_.*&lt;br /&gt;
attr KNX_default_Fl logtype text&lt;br /&gt;
attr KNX_default_Fl nrarchive 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ESF-import oder: Wie bekomme ich alle GA&#039;s aus der ETS in FHEM definiert? ====&lt;br /&gt;
Dazu gibts ein XLSX [https://forum.fhem.de/index.php/topic,128532.msg1231776.html#msg1231776 im Forum] , welches automatisiert FHEM definitionen erstellt. Danke an JooNey, der dafür auch Unterstützung im Forum leistet!&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Zusätzlich zu den FHEM-standard Attributen sind folgende Attribute verfügbar:&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard - kein Senden oder Empfangen möglich!&lt;br /&gt;
* &#039;&#039;&#039;format&#039;&#039;&#039; - hängt den Inhalt dieses Attr. an den Wert an, - im state Reading! Sinnvoll um z.B. Einheiten hinzuzufügen.&lt;br /&gt;
* &#039;&#039;&#039;stateRegex&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, und zwar durch string-substitution. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;stateCmd&#039;&#039;&#039; - beeinflusst welcher Wert in das Reading state gesetzt wird, mittels perl-funktion. Siehe auch Beispiele.&lt;br /&gt;
* &#039;&#039;&#039;putCmd&#039;&#039;&#039; - Falls dieses Attr gesetzt ist wird ein read-request vom KNX Gerät beantwortet. Der Rückgabe-Wert wird mit einer perl Funktion bestimmt.&lt;br /&gt;
* &#039;&#039;&#039;KNX_toggle&#039;&#039;&#039; - Bei einem &amp;quot;toggle-cmd&amp;quot; muss das Device den aktuellen Status des Gerätes wissen. Mit diesem Attr. kann das &amp;quot;Status Device&amp;quot; definiert werden.&lt;br /&gt;
* &#039;&#039;&#039;IODev&#039;&#039;&#039; - Auf Grund von Änderungen im IO-Handling durch FHEM (-core) ist dieses Attribut in den allermeisten Fällen nicht mehr nötig und evtl. sogar kontraproduktiv! Die Ausnahme ist: Falls mehrere KNX-IO (TUL,KNXTUL,KNXIO) devices definiert sind. Hier ist jedoch extreme Vorsicht geboten, es kann zu endlosen msg-loops kommen! &lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=KNX-attr}}.&lt;br /&gt;
&lt;br /&gt;
=== Set Command ===&lt;br /&gt;
Ein Set command ist nur erlaubt, wenn die option im define nicht get oder listenonly ist!&lt;br /&gt;
&lt;br /&gt;
Die Syntax:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;gadName&amp;gt; &amp;lt;wert&amp;gt; &lt;br /&gt;
set &amp;lt;device&amp;gt; &amp;lt;wert&amp;gt;&lt;br /&gt;
set &amp;lt;device&amp;gt; g1 &amp;lt;wert&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In der 2ten Zeile fehlt der gadName, das ist dennoch ein gültiges Set, es wird die erste Gruppenadresse (g1) zum senden verwendet.&lt;br /&gt;
&lt;br /&gt;
In der 3ten Zeile wird explizit die erste Gruppenadresse verwendet, allerdings darf dann kein gadName definiert sein!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Werte sind im Set Command erlaubt ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die erlaubten Werte sind vom dpt abhängig!&lt;br /&gt;
* Alle Werte / Wertbereiche die für diesen dpt vorgesehen sind - Referenz: {{Link2CmdRef|Anker=KNX-dpt}}&lt;br /&gt;
* Für dpt1 und dpt1.001 zusätzlich: toggle, blink &amp;lt;Anzahl&amp;gt; &amp;lt;Dauer&amp;gt;, (on|off)-for-timer &amp;lt;Sekunden&amp;gt;,  (on|off)-until &amp;lt;hh:mm:ss&amp;gt;&lt;br /&gt;
* Für dpt10, dpt11, dpt19 (Datum/Zeit) zusätzlich: now&lt;br /&gt;
* Für dpt16 (14 Char Text) zusätzlich: &amp;gt;CLR&amp;lt; -löscht gesamten Text&lt;br /&gt;
&lt;br /&gt;
=== Get Command ===&lt;br /&gt;
Ein Get command ist nur erlaubt, wenn die option im define nicht set oder listenonly ist! Die Syntax ist analog zum Set command (ohne &amp;lt;wert&amp;gt;). Kommt eine Antwort vom KNX-Gerät wird dieser Wert im entsprechenden Reading gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Umstellung EIB -&amp;gt; KNX Modul ==&lt;br /&gt;
Nachdem das EIB-Modul seit März 2018 nicht mehr upgedatet wurde und deprecated ist, möchte ich dazu motivieren auf das aktuelle KNX-Modul umzustellen.&lt;br /&gt;
&lt;br /&gt;
Ausführliche Erklärungen, Beispiele im [https://forum.fhem.de/index.php?topic=126994.0 FHEM Forum]&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
Eine umfangreiche Sammlung von Anwendungsbeispielen ist auf der Seite &#039;&#039;&#039;[[KNX Device Definition - Beispiele]]&#039;&#039;&#039; zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=38639</id>
		<title>KNXIO</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNXIO&amp;diff=38639"/>
		<updated>2023-10-03T12:25:36Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Timing Problem Mode H */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung des KNX Feldbus in FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=KNX/EIB&lt;br /&gt;
|ModFTopic=&lt;br /&gt;
|ModTechName=00_KNXIO.pm&lt;br /&gt;
|ModOwner=Erwin ({{Link2FU|115|Forum}}/[[Benutzer Diskussion:Erwin111|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
Das Modul [[KNXIO]] implementiert die Unterstützung für den Gebäudeautomations-Feldbus [https://de.wikipedia.org/wiki/KNX-Standard KNX] (eine Weiterentwicklung von EIB) innerhalb von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
KNX ist in FHEM nach dem 2-stufigen Modell implementiert. Das KNXIO-Modul unterstützt die Kommunikation mit einem KNX-Gateway, der &amp;quot;Aussenwelt&amp;quot;, während das [[KNX|KNX-Modul]] die logische Schnitstelle zum Anwender ist.&lt;br /&gt;
&lt;br /&gt;
Die Idee zu diesem Modul ist: ein Modul für (fast) alle möglichen Kommunikations-Varianten zu haben, das auch vernünftig wartbar ist. Dieses Modul soll langfristig die bisherigen Module TUL und KNXTUL ablösen. &lt;br /&gt;
&lt;br /&gt;
KNX-secure ist nicht unterstüzt, weil bisher m.W. keine frei zugängliche Dokumentation des Prokotolls verfügbar ist und ich dzt. kein GW besitze, dass KNX-secure unterstützt. &lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO &amp;lt;[MHT]&amp;gt; &amp;lt;IP-Adresse/Hostname&amp;gt;:&amp;lt;Port&amp;gt; &amp;lt;Phy-Adresse&amp;gt; bzw.&lt;br /&gt;
define &amp;lt;name&amp;gt; KNXIO S &amp;lt;socket-path&amp;gt; &amp;lt;Phy-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wie in FHEM üblich, alles was hier zwischen &amp;lt;...&amp;gt; dargestellt ist, sind verpflichtende Angaben! Optionales wird zwischen [...] dargestellt. &lt;br /&gt;
&lt;br /&gt;
==== Definitions-Felder im Detail ====&lt;br /&gt;
[[Datei:KNXIO.png|gerahmt|KNXIO Connectivity]]&lt;br /&gt;
&lt;br /&gt;
====== Mode: ======&lt;br /&gt;
* &#039;&#039;&#039;H -Host Mode:&#039;&#039;&#039; Verbindung zu einem KNX-Gateway mit UDP Point-Point Protokoll. Dieser Protokoll wird auch von der ETS verwendet (KNXNET/IP). Das Protokoll ist sehr kritisch in Bezug auf Timing, Verzögerungen in FHEM (durch andere Tasks...) größer 1 Sekunde führen zu Verbindungsabbrüchen! Die Verbindung wird zwar unmittelbar wieder hergestellt, allerdings können einige Messages verloren gehen. &lt;br /&gt;
* &#039;&#039;&#039;M -Multicast mode:&#039;&#039;&#039; Verbindung zu knxd-Daemon oder KNX-Router mit Multicast Protokoll. Dieses Protokoll wird auch von der ETS verwendet (KNXNET/Routing). Falls ein KNX-Gateway Multicast unterstützt, braucht man keine knxd Installation! Dieser Modus ist der Nachfolger des KNXTUL-Moduls. &lt;br /&gt;
* &#039;&#039;&#039;T -TCP Mode:&#039;&#039;&#039; Verbindet mittels TCP-Protokoll mit knxd. Dieser Modus ist der Nachfolger des TUL-Moduls.. Eine direkte Unterstützung von Seriellen/USB Gateways ist nicht implementiert! Falls ein Serielles / USB -Gateway verwendet wird ist die Empfehlung, das via knxd-daemon einzubinden und die Modes: M,S oder T zur Verbindung knxd-&amp;gt;FHEM zu verwenden. &lt;br /&gt;
* &#039;&#039;&#039;S -Socket Mode:&#039;&#039;&#039; Verbindet mittels UNIX_Socket zum knxd - Funktionert nur wenn sowohl FHEM als auch knxd am selben System laufen! Getestet wurde mit knxd-Verion 0.14.30. (Funktioniert definitiv NICHT mit knxd Version 0.10.0) &lt;br /&gt;
* &#039;&#039;&#039;X - Dummy Mode:&#039;&#039;&#039; Mode zum Testen ohne KNX-GW (und für ganz spezielle Fälle...) &lt;br /&gt;
&lt;br /&gt;
=====IP-Adresse/Hostname:Port=====&lt;br /&gt;
Hostnamen sind unterstützt im Mode H und T. &lt;br /&gt;
&lt;br /&gt;
Default/Standard Multicast Adresse (Mode M) ist: 244.0.23.12&lt;br /&gt;
&lt;br /&gt;
Default/Standard Port für Mode H und M ist 3671, für Mode T 6720.&lt;br /&gt;
&lt;br /&gt;
Default Socket path (Mode S) : /var/run/knxd (knxd-Version: 0.10.0) oder /run/knx  (knxd-Version: 0.14.46) oder  /var/run/knx (knxd-Version: 0.14.46), am besten in /etc/knxd.conf nachschauen!&lt;br /&gt;
&lt;br /&gt;
=====Phy-Adresse=====&lt;br /&gt;
Das ist die Physikalische Adresse, die das KNX-Gateway bzw. knxd für Clients am LAN (also auch FHEM) bereitstellt. Der Wert sollte (bei Verwendung knxd) dem -E Parameter (Pool) in der knxd-Konfiguration entsprechen.&lt;br /&gt;
&lt;br /&gt;
Alle Parameter sind verpflichtend! Bitte sicherstellen, dass es nur einen Kommunikationspfad zwischen dem KNX-Gateway und FHEM gibt!  Das ist am sichersten erreichbar, wenn es in FHEM &#039;&#039;&#039;nur ein IO-Device&#039;&#039;&#039; (TUL/KNXTUL/KNXIO) für den KNX-Bus gibt.&lt;br /&gt;
====Definitions-Beispiele====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define myKNXGW KNXIO H 192.168.1.201:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.51&lt;br /&gt;
define myKNXGW KNXIO S /var/run/knx 0.0.51&lt;br /&gt;
define myKNXGW KNXIO T 192.168.1.200:6720 0.0.51&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch {{Link2CmdRef|Anker=KNXIO}}. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Parameter für knxd Konfiguration: (üblicherweise zu finden: /etc/knxd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -b ipt:192.168.xx.yy&amp;quot; # connect to a knx-GW with ip-addr&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -R -S -single -b tpuarts:/dev/ttyxxx&amp;quot; # connect to a serial/USB KNX GW&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 0.0.50 -E 0.0.51:8 -D -T -S -b ip:&amp;quot; # knxd acts as multicast client (connect to other knxd or KNX-Router with MC support)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Parameter &#039;&#039;&#039;-e 0.0.50&#039;&#039;&#039; definiert die phy-Addresse des Gateways, &#039;&#039;&#039;-E 0.0.51:8&#039;&#039;&#039; definiert einen Pool von 8 Phy-Addr. für Clients am LAN! (FHEM ist ein Client am LAN aus KNX Sicht! )&lt;br /&gt;
&lt;br /&gt;
Die Parameter &#039;&#039;&#039;-R -S&#039;&#039;&#039; aktivieren den Multicast Support, &#039;&#039;&#039;-T -S&#039;&#039;&#039; den Tunnel Support im knxd. &#039;&#039;&#039;-D&#039;&#039;&#039; aktiviert Autodiscovery, wird allerdings von FHEM/KNXIO nicht verwendet, aber von der ETS-Software!  &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;-S&#039;&#039;&#039; Parameter muss immer als letztes der Server Parameter (-D -T -R) stehen! &lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Knxd|knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;disable&#039;&#039;&#039; - ident zum FHEM Standard  - kein Senden / Empfangen möglich.&lt;br /&gt;
* &#039;&#039;&#039;verbose&#039;&#039;&#039; - ident zum FHEM Standard  - bestimmt welche/wieviele Meldungen ins Log geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Matrix - Modes&amp;lt;-&amp;gt;Produkte ==&lt;br /&gt;
Die Tabelle soll die möglichen KNXIO-modes für KNX-GW&#039;s bzw. KNX-Router zeigen. Entstanden (und hoffentlich erweitert...) durch eigene Erfahrung und Tests bzw. auch aus Feedback aus dem Forum. Verwendete Produkt-Bezeichnungen können geschützte Namen sein, Diese werden hier ausschließlich verwendet um die Kompatibilität zum KNXIO-Modul darzustellen. Info über Produkte und ErfolgsMeldungen, aber auch Korrekturen sind willkommen, entweder direkt hier hinzufügen oder via Forum!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Produkt&lt;br /&gt;
!KNXIO-mode&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|knxd&lt;br /&gt;
|M S T&lt;br /&gt;
|knxd -daemon (getestet ab V.0.10.0), &lt;br /&gt;
Mode S nur falls knxd am selben host läuft. (getested ab ab V.0.14.30)&lt;br /&gt;
|-&lt;br /&gt;
|Weinzierl IP731&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Hager TYF120&lt;br /&gt;
|H&lt;br /&gt;
|? Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP000.02&lt;br /&gt;
|H&lt;br /&gt;
|4 Tunnel &lt;br /&gt;
|-&lt;br /&gt;
|MDT SCN-IP100.02&lt;br /&gt;
|M H&lt;br /&gt;
|4 Tunnel&lt;br /&gt;
|-&lt;br /&gt;
|Enertex® KNX IP Secure Router&lt;br /&gt;
|M H&lt;br /&gt;
|kein support im secure Mode - H untested&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Produkte mit seriellen od. USB Schnittstellen&lt;br /&gt;
z.B: TUL-Stick, ROT; usw...&lt;br /&gt;
| -&lt;br /&gt;
|Nur über knxd unterstützt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umstellung von TUL oder KNXTUL Modul ==&lt;br /&gt;
Vorgangsweise: Config sichern! Bestehende TUL/KNXTUL - Definition löschen und neue KNXIO - Definition anlegen. FHEM restart!&lt;br /&gt;
&lt;br /&gt;
Auf Grund der Änderung des Namens kann es passieren, dass im &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; der KNX-Geräte nach wie vor das bisherige IO-Device (z.b: myTUL) steht.&lt;br /&gt;
&lt;br /&gt;
Damit würde das Senden von FHEM -&amp;gt; KNX nicht funktionieren. Abhilfe schaftt das definieren vom &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; für alle KNX-Geräte, z.B so:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr TYPE=KNX IODev myKNXGW&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das &#039;&#039;&#039;Attribut IODev&#039;&#039;&#039; kann nach einem weiteren restart vom FHEM wieder gelöscht werden! &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sollte jetzt das &#039;&#039;&#039;Reading IODev&#039;&#039;&#039; in den KNX-Geräten auf das neue KNXIO-Gerät gesetzt sein! Das wird ab jetzt auch für künftige FHEM Starts verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myTUL TUL eibd:192.168.5.246:6720 5.1.251&lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO T 192.168.5.246:6720 5.1.251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KNXTUL-Modul ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Aus:&lt;br /&gt;
define myKNXTUL KNXTUL 0.0.252 &lt;br /&gt;
..wird:&lt;br /&gt;
define myKNXGW KNXIO M 224.0.23.12:3671 0.0.252&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
==== Timing Problem Mode H ====&lt;br /&gt;
Wie bereits erwähnt, dieser Mode stellt hohe Ansprüche an das Antwortzeitverhalten von FHEM. Jede empfangene und gesendete Message muss in weniger als 1 Sekunde bestätigt werden. Falls FHEM länger mit anderen Modulen beschäftigt ist, gibt das Probleme. Typische Module, die Probleme machen können, sind (u.A.): SVG, Onewire, HTTPMOD, usw...&lt;br /&gt;
&lt;br /&gt;
Typische Meldungen im Log:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2021.12.13 00:00:06.506 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1216]: timeout - attempt resend&lt;br /&gt;
2021.12.13 00:00:08.023 3: &amp;lt;device&amp;gt; [KNXIO_TunnelRequestTO 1224]: timeout - sending disconnect request&lt;br /&gt;
2021.12.15 13:12:09.045 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 414]: TunnelRequest received: duplicate message received (seqcntr= xxx) - ack it&lt;br /&gt;
2021.12.15 13:12:10.012 3: &amp;lt;device&amp;gt; [KNXIO_ReadH 426]: TunnelRequest received: out of sequence, (seqcntrRx= xxx seqcntrTx= yyy ) - no ack &amp;amp; discard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Eine mögliche Lösung: Mittels [[Apptime]] cmd: &amp;quot;apptime average&amp;quot; bzw. &amp;quot;apptime max&amp;quot;  jene Funktionen/Module herausfinden, die viel Zeit in FHEM beanspruchen... Werte größer 500ms können die Kommunikation zwischen FHEM und dem KNX-GW massiv stören.  Werte die mit &amp;quot;tmr_&amp;quot; beginnen, sind nicht ganz so kritisch, sollten aber jedenfalls unter 900ms sein.&lt;br /&gt;
&lt;br /&gt;
Evtl hilft auch, die Anzahl Events zu reduzieren (Stichwort: event-on-change-reading).&lt;br /&gt;
&lt;br /&gt;
Falls das nicht funktioniert, gibts noch die Möglichkeit, für das KNXIO-Modul eine eigene FHEM Instanz zu installieren und mittels FHEM2FHEM mit der Hauptinstanz zu verbinden.. In diesem Beispiel auf zwei Raspberrys im selben LAN. Sinnvollerweise beginnt man mit der Konfiguration von FHEM-B.&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-A (Hauptinstanz): =====&lt;br /&gt;
Das ist jenes FHEM, wo bisher das KNXIO Modul und alle KNX-Devices definiert sind.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO X # das ist ein dummy device,wird aber für die FHEM2FHEM definition benötigt&lt;br /&gt;
&lt;br /&gt;
define &amp;lt;name_F2F&amp;gt; FHEM2FHEM &amp;lt;ip-addr:port&amp;gt; RAW:&amp;lt;remoteDevice&amp;gt; # verbindet zum telnet-dev auf FHEM-B&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; keepaliveInterval 60&lt;br /&gt;
attr &amp;lt;name_F2F&amp;gt; reportConnected 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; &amp;lt;remoteDevice&amp;gt; muss in allen Definitionen (FHEM-A, FHEM-B) &#039;&#039;&#039;der gleiche Name&#039;&#039;&#039; sein! &amp;lt;ip-addr:port&amp;gt; ist die Adresse von FHEM-B, port ist der port aus der telnet-Definition. &lt;br /&gt;
&lt;br /&gt;
Ändern des Attr IODev in allen KNX-definitionen: Attr IODev muss auf das FHEM2FHEM &amp;lt;name_F2F&amp;gt; Device zeigen. Entweder jedes KNX-device einzeln ändern, oder alle IODev Attribute in allen KNX-devices auf einmal löschen, mittels:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
deleteattr TYPE=KNX IODev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das ist kein Problem, (solange man nur EIN IO-device für KNX definiert hat), FHEM sucht beim start / defmod sich ein passendes IO-Device automatisch aus.&lt;br /&gt;
&lt;br /&gt;
Die bisherige KNXIO-Definition löschen. Die sollte jetzt bereits in FHEM-B aktiv sein !&lt;br /&gt;
&lt;br /&gt;
===== Konfiguration FHEM-B: =====&lt;br /&gt;
Starten mit minimal (default) Konfiguration, am besten nach Neu-Installation und fhem-update.&lt;br /&gt;
&lt;br /&gt;
Hier wird das KNXIO-Modul konfiguriert, das mit dem KNX Gateway kommuniziert. Das ist exakt die gleiche def wie bisher in FHEM-A !&lt;br /&gt;
&lt;br /&gt;
Es braucht aber zusätzlich noch einige Definitionen zur Kommunikation mit FHEM-A:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;remoteDevice&amp;gt; KNXIO &amp;lt;mode&amp;gt; &amp;lt;GW-IP:GW-port&amp;gt; &amp;lt;phy-addr&amp;gt; # exakt gleiche Definition wie bisher in FHEM-A&lt;br /&gt;
&lt;br /&gt;
define telnetPortKNX telnet &amp;lt;port&amp;gt; global # das kommuniziert mit dem FHEM2FHEM device auf FHEM-A&lt;br /&gt;
attr telnetPortKNX allowfrom (127.0.0.1|192.168.x) # little bit of security, replace x with yr. local network...&lt;br /&gt;
&lt;br /&gt;
define allowed_telnetPortKNX allowed # little bit of security&lt;br /&gt;
attr allowed_telnetPortKNX allowedCommands iowrite,inform,trigger,quit&lt;br /&gt;
attr allowed_telnetPortKNX allowedIfAuthenticatedByMe 0&lt;br /&gt;
attr allowed_telnetPortKNX validFor telnetPortKNX&lt;br /&gt;
&lt;br /&gt;
attr initialUsbCheck disable 1 # stört alle seriellen IO&#039;s (ausser CUL....)&lt;br /&gt;
&lt;br /&gt;
attr autocreate ignoreTypes KNX_.* # we dont need/want KNX-devices on this FHEM&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Empfohlen:&#039;&#039;&#039; Für die telnet definition nicht den Standard-port 7072 verwenden, sondern z.B: 7073. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nach der Definition: save und shutdown/restart auf beiden FHEMs! Danach sollte das FHEM2FHEM-device connected zeigen, das KNXIO-device auf FHEM-A &amp;lt;remoteDevice&amp;gt; ebenfalls connected, wenn es ein passendes FHEM2FHEM Device gibt! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keine weiteren Verbindungen&#039;&#039;&#039; zwischen den beiden FHEM machen, e.g: FHEM2FHEM im Log Modus, RFHEM, notifies., Telnet connections,...., -Das ergibt Chaos!&lt;br /&gt;
&lt;br /&gt;
Es werden alle KNX-Messages zwischen FHEM-A und FHEM-B ausgetauscht!&lt;br /&gt;
&lt;br /&gt;
Zur Verbesserung der Sicherheit könnte man das telnet-device UND das FHEM2FHEM-device jeweils mit Passwort (globalpassword) und/oder SSL versehen. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Info zum Thema KNXD Konfiguration (beim Author): [https://github.com/knxd/knxd/wiki KNXD Wiki]&lt;br /&gt;
&lt;br /&gt;
[[Knxd|Knxd-Wiki]]&lt;br /&gt;
&lt;br /&gt;
[[FHEM2FHEM|FHEM2FHEM-Wiki]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38561</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38561"/>
		<updated>2023-09-06T07:28:38Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* on/off Device - Treppenlicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - Treppenlicht ====&lt;br /&gt;
Üblicherweise haben KNX-Aktoren eine Staircase (Treppenlicht) Funktion, die mittes ETS programmiert werden kann. Falls das nicht der Fall ist, oder man die Zeitdauer dynamisch vorgeben will, könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod dpt1Treppenlicht KNX 14/1/1:dpt1:EinAus:set:nosuffix 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1Treppenlicht devStateIcon on-for-timer.*:on-for-timer@red:off on:on@red:off&lt;br /&gt;
attr dpt1Treppenlicht stateCmd { if ($gadName eq &#039;Status&#039; &amp;amp;&amp;amp; $state eq &#039;on&#039;) {&lt;br /&gt;
     fhem (&amp;quot;sleep 15.0 $name quiet; set $name EinAus off&amp;quot;);&lt;br /&gt;
     return &#039;on-for-timer&#039;; &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;stateCmd reagiert auf die &amp;quot;Status = on&amp;quot; -msg vom Aktor, startet einen 15 Sekunden Timer und schaltet nach Ablauf auf off. Gleichzeitig wird das DevstateIcon auf &amp;quot;on-for-timer&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert Umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38557</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38557"/>
		<updated>2023-09-04T05:25:19Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* Slider - einfach */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind@set:slider,0,1,100 slat@set:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp@set:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position@set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert Umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe@set:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white@set:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38536</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38536"/>
		<updated>2023-08-13T13:07:13Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: dpt251GUI.png positionierung geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen! Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen! Tips zur Migration sind auch in {{Link2Forum|Topic=126994|LinkText=diesem Forenthema}} zu finden.}}&lt;br /&gt;
Hier soll ein Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels [[notify]], [[DOIF]], usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz] ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Infos, Tips &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier gibt es zwei GA-Adressen, eine zum Schalten und die zweite für die Rückmeldung vom Aktor (muss natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um drei Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für zwei Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GAs der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet), kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position-set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind:slider,0,1,100 slat:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmds lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entsprechenden set-cmds lauten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings zwei Subroutinen in der 99_myUtils!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden subs in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert Umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
[[Datei:KNX_dpt251GUI.png|rechts|503x503px]]&lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus zwei Widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt zwei &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPTs unterstützt, die in den frei verfügbaren Standarddokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPTs, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen unterscheiden sich die sub-DPTs z.B. dpt9.020 von den &amp;quot;Haupt-DPTs&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falsch definierte DPTs (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene Konfiguration ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.B. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine Syntaxfehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.B. im stateCmd aufgerufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hat dann auch den Vorteil, dass die sub-Routine von mehreren Devices verwendet werden kann!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38530</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38530"/>
		<updated>2023-08-07T07:09:37Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RGBW Steuerung (dpt251.600) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen!&lt;br /&gt;
Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen!&lt;br /&gt;
Tips zur Migration sind auch im  [https://forum.fhem.de/index.php/topic,126994.0.html Forum]  zu finden.|RNTyp=Warn}}&lt;br /&gt;
&lt;br /&gt;
Hier soll mit eine Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels notify, doif, usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz]  ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Info&#039;s, Tip&#039;s &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hier gibt es 2 GA-Adressen, eine zum Schalten und die 2te für die Rückmeldung vom Aktor (muß natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um 3 Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen:slider,0,5,100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für 2 Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GA&#039;s der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: Falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat, (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet, kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position-set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind:slider,0,1,100 slat:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmd&#039;s lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die entsprechenden set-cmd&#039;s lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings 2 sub-routinen in der 99_myUtils!&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden sub&#039;s in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert Umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Die GUI für diesen dpt ist komplex, weil sie aus 2 widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt 2 &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
[[Datei:KNX_dpt251GUI.png]]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal($NAME,&amp;quot;state&amp;quot;,&amp;quot;00000000&amp;quot;),0,6),round($1*2.55,0))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = round(hex(substr($state,6,2))/2.55,0);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul ? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPT&#039;s unterstützt, die in den frei verfügbaren Standard-Dokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPT&#039;s, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im wesentlichen unterscheiden sich die sub-DPT&#039;s z.B. dpt9.020 von den &amp;quot;Haupt-DPT&#039;s&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Falsch definierte DPT&#039;s (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene config ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.b. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine syntax-Fehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.b. im stateCmd aufgerufen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das hat dann auch den Vorteil, dass die sub-Routine von mehreren devices verwendet werden kann!&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;br /&gt;
[[Kategorie:Gerätemodul]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38529</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38529"/>
		<updated>2023-08-06T10:12:41Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: /* RGBW Steuerung (dpt251.600) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen!&lt;br /&gt;
Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen!&lt;br /&gt;
Tips zur Migration sind auch im  [https://forum.fhem.de/index.php/topic,126994.0.html Forum]  zu finden.|RNTyp=Warn}}&lt;br /&gt;
&lt;br /&gt;
Hier soll mit eine Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels notify, doif, usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz]  ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Info&#039;s, Tip&#039;s &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hier gibt es 2 GA-Adressen, eine zum Schalten und die 2te für die Rückmeldung vom Aktor (muß natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um 3 Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen:slider,0,5,100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für 2 Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GA&#039;s der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: Falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat, (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet, kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position-set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind:slider,0,1,100 slat:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmd&#039;s lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die entsprechenden set-cmd&#039;s lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings 2 sub-routinen in der 99_myUtils!&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden sub&#039;s in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert Umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Diese GUI für diesen dpt ist komplex, weil sie aus 2 widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt 2 &amp;quot;Hilfs-readings&amp;quot; (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
[[Datei:KNX_dpt251GUI.png]]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal(&amp;quot;dpt251tst&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;aa&amp;quot;),6,2)) . &amp;quot;&#039; , &lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal(&amp;quot;dpt251tst&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;aa&amp;quot;),0,6),int($1*2.555))    . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);&lt;br /&gt;
  my $white = sprintf(&#039;%d&#039;,hex(substr($state,6,2))/2.55);&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1; setreading $name rgb $rgb; setreading $name white $white&amp;quot;);&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul ? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPT&#039;s unterstützt, die in den frei verfügbaren Standard-Dokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPT&#039;s, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im wesentlichen unterscheiden sich die sub-DPT&#039;s z.B. dpt9.020 von den &amp;quot;Haupt-DPT&#039;s&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Falsch definierte DPT&#039;s (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene config ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.b. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine syntax-Fehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.b. im stateCmd aufgerufen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das hat dann auch den Vorteil, dass die sub-Routine von mehreren devices verwendet werden kann!&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;br /&gt;
[[Kategorie:Gerätemodul]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38528</id>
		<title>KNX Device Definition - Beispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=KNX_Device_Definition_-_Beispiele&amp;diff=38528"/>
		<updated>2023-08-06T10:08:36Z</updated>

		<summary type="html">&lt;p&gt;Erwin111: neu: RGBW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Vorwort ===&lt;br /&gt;
{{Randnotiz|RNText=Hinweis: Das EIB-Modul ist seit 2018 deprecated und wird auch nicht mehr gewartet. Es ist daher dringend empfohlen, auf das [[KNX]]-Modul umzusteigen!&lt;br /&gt;
Mit diesen Beispielen sollte auch der Umstieg auf das KNX-Modul etwas leichter fallen!&lt;br /&gt;
Tips zur Migration sind auch im  [https://forum.fhem.de/index.php/topic,126994.0.html Forum]  zu finden.|RNTyp=Warn}}&lt;br /&gt;
&lt;br /&gt;
Hier soll mit eine Austausch von funktionierenden Beispielen aus dem KNX Bereich stattfinden. Es geht um die Definition, die Darstellung im FHEM-Web und um die Weiterverarbeitung  mittels notify, doif, usw.&lt;br /&gt;
&lt;br /&gt;
Viele Anfragen im Forum beziehen sich auf Probleme bei der Definition, Darstellung und &amp;quot;Weiterverarbeitung&amp;quot; von KNX-Geräten. Alle User sind eingeladen, mit weiteren Beispielen mitzuwirken. Im ersten Schritt werden einige Beispiele aus der  [https://fhem.de/commandref.html#KNX Command-Referenz] hierher übertragen, auch um die Command-Ref (in einem zweiten Schritt) etwas kompakter zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Die [https://fhem.de/commandref.html#KNX Command-Referenz]  ist nach wie vor die aktuellste (und verbindliche) Dokumentation des Moduls. Hier sollen zusätzliche Info&#039;s, Tip&#039;s &amp;amp; Tricks gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Generelle Hinweise zum KNX Modul sind hier auf der Modulbeschreibungsseite [[KNX]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== on/off Device - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe1 KNX 14/0/1:dpt1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Einfachstes KNX-Device ohne Alias und Rückmeldung.&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Lampe2 KNX 14/1/1:dpt1:EinAus 14/2/1:dpt1:Status:listenonly&lt;br /&gt;
attr Lampe2 webCmd EinAus&lt;br /&gt;
# attr Lampe2 webCmd :&lt;br /&gt;
attr Lampe2 stateFormat Status-get&lt;br /&gt;
attr Lampe2 devStateIcon off:li_wht_off:on on:li_wht_on:off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hier gibt es 2 GA-Adressen, eine zum Schalten und die 2te für die Rückmeldung vom Aktor (muß natürlich via ETS so programmiert sein!).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich hat jede GA-Adresse nun einen Alias (=gadName), z.B. EinAus, Status. Das Attr &amp;quot;webcmd EinAus&amp;quot; erzeugt ein Pulldown Menü das die jeweilige Funktion ausführt. Falls man kein Pulldown Menü will, nimmt man die 2te Variante von webCmd und klickt auf das DeviceIcon um Ein/Aus zu schalten.  DevStateIcon hat den Sinn, damit Icons den Zustand darstellen und beim anklicken die jeweilige Funktion ausführen. Die listenonly Option verhindert, dass ein Set- oder Get-cmd im FHEMWeb dargestellt wird. - Set oder Get sind auf diesen Alias dann nicht möglich!   &lt;br /&gt;
&lt;br /&gt;
==== on/off Device - blinken ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1blink KNX 14/1/1:dpt1:Blinker:set:nosuffix&lt;br /&gt;
attr dpt1blink comment blink example&lt;br /&gt;
attr dpt1blink devStateIcon on:sprinkler_icon@red:off off:sprinkler_icon@green:on&lt;br /&gt;
attr dpt1blink eventMap {usr=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;Blinker blink $1 $2&#039;}, fw=&amp;gt;{&#039;^(?:.*)?blink.([\d])[\s,]([\d])&#039;=&amp;gt;&#039;blink&#039;} }&lt;br /&gt;
attr dpt1blink widgetOverride blink@set:widgetList,2,textField,Anzahl_blinks,2,textField,Dauer(sec) Blinker@set:widgetList,4,select,on,off,blink,2,textField,Anzahl_blinks,2,textField,Dauer(sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ein Beispiel, wie man ein KNX-Geräte blinken lassen kann. Extensive Nutzung der Möglichkeiten vom attr eventmap und widgetoverride!&lt;br /&gt;
&lt;br /&gt;
==== on/off Device - mit verzögerter Rückmeldung ====&lt;br /&gt;
Es gibt KNX-Aktoren, die erst nach erfolgreicher Ausführung (mit Verzögerung) eine Rückmeldung schicken. Bsp: Großer Drehstrom Motor mit Anlaufstrom-Begrenzung. Nach einem set-cmd (von FHEM) wird vorerst ein hourglass-icon dargestellt, solange bis die Rückmeldung vom KNX-Aktor kommt.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt1_1tst KNX 14/1/1:dpt1:EinAus:set 14/2/1:dpt1:Status:listenonly:nosuffix&lt;br /&gt;
attr dpt1_1tst devStateIcon on:general_an:off off:general_aus:on steuern.*:hourglass:off&lt;br /&gt;
attr dpt1_1tst stateRegex /EinAus-set/steuern-/ /EinAus-get//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gleichzeitig ein Beispiel zu stateRegex Verwendung: der 1. Teil muss dem reading[:value] entsprechen,  Im konkreten Fall übersetzt das stateRegex &amp;quot;EinAus-set[:value]&amp;quot; nach &amp;quot;steuern-&amp;lt;value&amp;gt; im  state-reading, Ein EinAus-get wird ignoriert! Damit kann das state-reading nicht on oder off werden, außer es kommt ein Status von der GA: 14/2/1. Das wird im devStateIcon genutzt, um 3 Zusände darzustellen (on,off,steuern). &lt;br /&gt;
&lt;br /&gt;
==== Sensor - mit Umrechnung ====&lt;br /&gt;
Ein Windspeed Sensor sendet einen dpt9 Wert in Meter/Sekunde (nach ISO). Nachdem die gebräuchliche Einheit für Windgeschwindigkeiten km/h sind, muss also umgerechent werden. Das kann mittels Userreading passieren, geht aber auch einfacher:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Windspeed KNX 14/0/9:dpt9.005:get:nosuffix&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
attr Windspeed stateFormat state km/h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im reading &#039;&#039;&#039;g1&#039;&#039;&#039; steht die WIndspeed in m/s, im reading &#039;&#039;&#039;state&#039;&#039;&#039; (siehe stateCmd) die Windspeed in km/h - ohne Einheit, im Internal &#039;&#039;&#039;STATE&#039;&#039;&#039; die Windspeed mit Einheit. &lt;br /&gt;
&lt;br /&gt;
Will man jedoch auch im reading &#039;&#039;&#039;state&#039;&#039;&#039; die Einheit haben, adaptiert man das stateCmd Attribute z.b. so:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Windspeed stateCmd {return sprintf(&amp;quot;%.1f km/h&amp;quot;,ReadingsNum($name,&#039;g1&#039;,0)*3.6);;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;und lässt das Attr. stateFormat weg.&lt;br /&gt;
&lt;br /&gt;
==== Dimmer ====&lt;br /&gt;
[[Datei:Dimmer.png|mini|600x600px]]&lt;br /&gt;
Eine Steuerung für KNX-Dimmer. Die Bedienung kann sowohl über on/off, als auch über prozent-Helligkeit und über dimup/dimdown (jeweils 10%) erfolgen. Dazu sind insgesamt vier GA-Adressen definert, die im KNX-Aktor (mittels ETS) konfiguriert sind . &lt;br /&gt;
&lt;br /&gt;
&amp;quot;EinAus&amp;quot; ist die GA für das senden von on/off, &amp;quot;Status&amp;quot; - die Rückmeldung vom Aktor, &amp;quot;Dimmen&amp;quot; ist die GA für das Senden von Helligkeitswerten (Range 0-100%), &amp;quot;Dimmstatus&amp;quot; die Rückmeldung vom Aktor. &lt;br /&gt;
&lt;br /&gt;
Das devStateIcon wird grau bei state=off, gelb bei state=on oder bei state= &amp;gt;0.&lt;br /&gt;
&lt;br /&gt;
Die [[eventMap]]-Syntax ist reichlich verwirrend, im Wesentlichen: ein klick auf &amp;quot;dimup&amp;quot; erhöht den Wert von &amp;quot;Dimmen&amp;quot; um 10%, &amp;quot;dimdown&amp;quot; reduziert um 10%.&lt;br /&gt;
&lt;br /&gt;
stateCmd wird bei jedem Event aufgerufen, in diesem Fall: Wenn sich &amp;quot;EinAus&amp;quot; ändert, wird dieser Wert nicht nur in das reading EinAus geschrieben, sondern auch in das reading Dimmen, allerdings übersetzt: on =&amp;gt;100, off=&amp;gt;0. Damit zeigt der Slider jederzeit den richtigen Zustand an. Zusätzlich wird der Wert auch in das Reading state geschrieben. Weiters: ändert sich &amp;quot;Dimmstatus&amp;quot;, wird dieser Wert auch in das reading Dimmen geschreiben, damit der Slider auch den richtigen Wert anzeigt (der Dimmer könnte ja auch ausserhalb von FHEM bedient werden...).&lt;br /&gt;
&lt;br /&gt;
webCmd und widgetOverride bestimmen das Aussehen und die Funktion der Overview Zeile.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Dimmer KNX 14/6/1:dpt1:EinAus:set:nosuffix\&lt;br /&gt;
14/7/1:dpt1:Status:listenonly:nosuffix\&lt;br /&gt;
14/6/5:dpt5.001:Dimmen:set:nosuffix\&lt;br /&gt;
14/7/5:dpt5.001:DimmStatus:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Dimmer devStateIcon devStateIcon off:li_wht_off:on on:li_wht_on:off 0.*:li_wht_off:on \d+.*:li_wht_on:off&lt;br /&gt;
attr Dimmer eventMap {usr=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,minNum(100,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) + 10)) . &amp;quot;&#039;, \&lt;br /&gt;
&#039;^dimdown&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;Dimmen %d&amp;quot;,maxNum(0,ReadingsNum($NAME,&amp;quot;Dimmen&amp;quot;,0) - 10)) . &amp;quot;&#039;}, \&lt;br /&gt;
fw=&amp;gt;{&#039;^dimup&#039;=&amp;gt; &#039;dimup&#039;, &#039;^dimdown&#039;=&amp;gt; &#039;dimdown&#039;}  }&lt;br /&gt;
attr Dimmer stateCmd { if ($gadName eq &#039;DimmStatus&#039;) {\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $state;;&amp;quot;);; \&lt;br /&gt;
  }\&lt;br /&gt;
  elsif ($gadName eq &#039;EinAus&#039;) {\&lt;br /&gt;
    my $val = ($state eq &#039;on&#039;)?&#039;100&#039;:&#039;0&#039;;;\&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet;;setreading $name Dimmen $val;;&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr Dimmer webCmd :dimup:dimdown:Dimmen&lt;br /&gt;
attr Dimmer widgetOverride Dimmen:slider,0,5,100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Garagentor Steuerung ====&lt;br /&gt;
Dieses Beispiel kann für die (noch immer) üblichen 1-Taster Garagentor-Steuerungen genutzt werden.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/100-aufzu ist einem Aktor zugeordnet, der den Garagentor-Taster simuliert.  &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/101-aufzu_status ist die übliche Rückmeldung vom Status des Aktors.   &lt;br /&gt;
&lt;br /&gt;
Die GA 14/1/102-Doorstatus ist mit dem Garagensensor (KNX-Input) Tor= zu/offen verknüpft.  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod Garagentor KNX 14/1/100:dpt1.001:aufzu:set:nosuffix\&lt;br /&gt;
14/1/101:dpt1.001:aufzu_status:listenonly:nosuffix\&lt;br /&gt;
14/1/102:dpt1.019:Doorstatus:listenonly:nosuffix\&lt;br /&gt;
&lt;br /&gt;
attr Garagentor IODev myKNXIO&lt;br /&gt;
attr Garagentor comment set door trigger for 1 second, Status des Tors wird durch GA &amp;quot;Doorstatus&amp;quot; bestimmt.&lt;br /&gt;
attr Garagentor devStateIcon closed:fts_garage_door_100@green:on open:fts_garage@red:on&lt;br /&gt;
attr Garagentor eventMap {usr=&amp;gt;{&#039;on&#039;=&amp;gt;&#039;aufzu on-for-timer 2&#039;,&#039;aufzu off&#039;=&amp;gt;&#039;off&#039;} }&lt;br /&gt;
attr Garagentor stateRegex /aufzu// /aufzu_status//&lt;br /&gt;
attr Garagentor webCmd :&lt;br /&gt;
attr Garagentor widgetOverride aufzu:on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ein Klick auf das DeviceState-Icon bewirkt ein &amp;quot;Set on&amp;quot;, das wird mittels eventMap auf &amp;quot;Set aufzu on-for-timer 2&amp;quot; geändert. Der KNX-Aktor schließt den entsprechenden Kontakt für 2 Sekunden, simuliert damt einen Taster. Das Attribut stateRegex verhindert, dass von aufzu und von aufzu_status GA&#039;s der Wert ins reading &amp;quot;state&amp;quot; geschrieben wird. Ist das Garagentor geöffnet, wird der Wert von GA Doorstatus &amp;quot;open&amp;quot; - was auch ins state-reading kopiert wird und damit das DevstateIcon als offen/geschlossen anzeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ: Falls der KNX-Aktor eine &amp;quot;TreppenLicht Funktion&amp;quot; implementiert hat, (bei einem on wird eingeschaltet und nach x Sekunden augeschaltet, kann das Attribut eventMap komplett weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Doorstatus&amp;quot; muss nicht unbedingt ein KNX-Gerät sein, das könnte auch von einem anderen Device z.B.via notify gesetzt werden:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
setreading Garagentor Doorstatus open/closed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - einfach ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider_Test KNX 15/2/2:dpt5:Position&lt;br /&gt;
attr Slider_Test webCmd Position&lt;br /&gt;
attr Slider_Test widgetOverride Position-set:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Slider2_Test KNX 15/2/2:dpt5.001:Position:set:nosuffix 15/2/3:dpt5.001:PosStatus:get:nosuffix&lt;br /&gt;
attr Slider2_Test stateCmd { fhem &amp;quot;sleep 0.05 quiet;; setreading $name Position $state&amp;quot; if ($gadName eq &#039;PosStatus&#039;);; return $state;; }&lt;br /&gt;
attr Slider2_Test webCmd Position&lt;br /&gt;
attr Slider2_Test widgetOverride Position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Attr stateCmd setzt den Wert der vom Aktor kommt - zusätzlich in das reading &#039;Position&#039;, damit der Slider immer auch die aktuelle Position anzeigt. Die doppelten semicolons sind aus parsing Gründen nötig. Falls man das Attribut über Device-Detail-view setzt, sind nur einfache ; nötig!&lt;br /&gt;
&lt;br /&gt;
==== Zwei Slider mit Rückmeldung ====&lt;br /&gt;
[[Datei:KNX dpt5tst.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Z.B. für eine Jalousie mit Lamellensteuerung. Das ist eine Erweiterung des vorigen Beispiels.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt5test KNX 9/1/1:dpt5.001:blind:set:nosuffix 9/1/2:dpt5.001:blindStatus:listenonly:nosuffix&lt;br /&gt;
9/1/3:dpt5.001:slat:set:nosuffix 9/1/4:dpt5.001:slatStatus:listenonly:nosuffix&lt;br /&gt;
attr dpt5test devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr dpt5test room KNXtest&lt;br /&gt;
attr dpt5test stateCmd { if ($gadName =~ /(.*)Status/x) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.05 quiet; setreading $name $1 $state&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr dpt5test stateFormat 1:blind&lt;br /&gt;
&amp;lt;br/&amp;gt; &lt;br /&gt;
2:slat&lt;br /&gt;
attr dpt5test webCmd blind:slat&lt;br /&gt;
attr dpt5test webCmdLabel Blind&lt;br /&gt;
:Slat&lt;br /&gt;
attr dpt5test widgetOverride blind:slider,0,1,100 slat:slider,0,10,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dazu braucht es noch eine sub in 99_myUtils.pm (siehe auch Beispiel Jalousie / Rolladen). Der Trick liegt in der indizierten Variante von stateFormat (1:blind,...), damit wird auch in devStateIcon dieser Index ausgewertet! Leider gibts für die Lamellen-Stellung nur 3 Icons, für die Stellungen: 0%,50%,100%.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &amp;quot;block.off: &amp;quot; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;1.100.*:fts_shutter_100 1.1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;1.2\d.*:fts_shutter_20 1.3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;1.4\d.*:fts_shutter_40 1.5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;1.6\d.*:fts_shutter_60 1.7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;1.8\d.*:fts_shutter_80 1.9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;1.\d.*:fts_window_2w &#039; .&lt;br /&gt;
         &#039;2.100.*:fts_blade_arc_close_100 &#039; .&lt;br /&gt;
         &#039;2.\d\d.*:fts_blade_arc_close_50 &#039; .&lt;br /&gt;
         &#039;2.\d.*:fts_blade_arc_close_00 &#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RaumThermostat / HeizungsAktor  ====&lt;br /&gt;
[[Datei:Fhemwiki KNX - RaumThermostat.png|rechts|rahmenlos|674x674px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define XXXZimmer_Heizung KNX 5/0/52:dpt9:solltemp:set:nosuffix 5/0/53:dpt9:solltemp_ist:get:nosuffix 5/0/50:dpt9:temperature:get:nosuffix 5/0/51:dpt5.001:valvepos:get:nosuffix&lt;br /&gt;
attr XXXZimmer_Heizung comment GAs: SollTemp-schreiben, SollTemp-lesen, IstTemp, ValvePosition&lt;br /&gt;
attr XXXZimmer_Heizung stateFormat temperature °C, Soll: solltemp_ist °C, Ventil: valvepos&lt;br /&gt;
attr XXXZimmer_Heizung webCmd solltemp&lt;br /&gt;
attr XXXZimmer_Heizung webCmdLabel SollTemperatur&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
attr XXXZimmer_Heizung widgetOverride solltemp:slider,18,0.5,25,1 solltemp_ist:noArg temperature:noArg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Beispiel für einen RaumThermostat / Heizungsregler. Die Soll-Temperatur kann entweder mittels pull-down oder mittels slider eingestellt werden. Siehe die beiden Attribute widgetoverride... (nur eines davon verwenden!)&lt;br /&gt;
&lt;br /&gt;
Falls &#039;&#039;&#039;solltemp_ist&#039;&#039;&#039; nicht zur Verfügung steht, kann es weggelassen werden. Funktion: Es könnte ja die SollTemperatur am Raumthermostat eingestellt worden sein! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;valvepos&#039;&#039;&#039; ist der Prozentwert, den das Raumthermostat für das Ventil der FB-Heizung sendet.&lt;br /&gt;
&lt;br /&gt;
==== Zeit und Datum ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define timedev KNX 0/0/7:dpt10:time 0/0/8:dpt11:date 0/0/9:dpt19:datetime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hier sind alle Varianten von Zeit / Datum dargestellt. Die Empfänger müssen den jeweiligen DPT natürlich unterstützen!&lt;br /&gt;
&lt;br /&gt;
die entsprechenden set-cmd&#039;s lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# setze das Datum auf den Bus:&lt;br /&gt;
set timedev date now&lt;br /&gt;
set timedev date 01.11.2021&lt;br /&gt;
&lt;br /&gt;
# setze die Zeit auf den Bus:&lt;br /&gt;
set timedev time now&lt;br /&gt;
set timedev time 18:33:44&lt;br /&gt;
&lt;br /&gt;
# setze Datum und Zeit (gleichzeitig) auf den Bus:&lt;br /&gt;
set timedev datetime now&lt;br /&gt;
set timedev datetime 01.11.2020_18:33:44&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text senden / empfangen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define textdev KNX 0/0/9:dpt16:txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die entsprechenden set-cmd&#039;s lauten:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
set textdev txt AbCdEfGhIjkLmN  # send text to Bus (max 14 Char.)&lt;br /&gt;
set textdev txt &amp;gt;CLR&amp;lt; # delete text on the KNX display&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fhem antwortet auf Read Request vom Bus ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define putDemo KNX 1/0/30:dpt9.001:temp 1/0/31:dpt9.001:humidity 1/0/32:dpt9:refVal&lt;br /&gt;
&lt;br /&gt;
attr putDemo putCmd {ReadingsNum($name,&#039;refVal-get&#039;,0) if ($gadName eq &#039;temp&#039;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es sind 3 GA_Adressen definiert, FHEM antwortet allerdings nur auf einen read-request vom Bus wenn die 1/0/30 Adresse angesprochen wird, mit dem Wert der im refVal reading steht!&lt;br /&gt;
&lt;br /&gt;
==== Jalousie / Rolladen ====&lt;br /&gt;
[[Datei:KNX JalKueche.png|rechts|rahmenlos|450x450px]]&lt;br /&gt;
Ein komplexes Beispiel, getestet mit einem Jal-Aktor von MDT. Ganz wichtig ist die GA: moving, der Aktor sendet on solange sich die Jalousie bewegt. Das ist ein Parameter, der mittels ETS konfiguriert werden kann. Ergebnis ist ein Device, dass jederzeit die Position anzeigt, Schlaltfllächen für Auf/Ab und einen Slider für&#039;s setzen der absoluten Position bietet. Dazu braucht es allerdings 2 sub-routinen in der 99_myUtils!&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define Jal_Kueche KNX 5/1/53:dpt1.008:aufab:set:nosuffix&lt;br /&gt;
5/1/55:dpt1.010:stop:set:nosuffix&lt;br /&gt;
5/1/57:dpt1:moving:listenonly:nosuffix&lt;br /&gt;
5/1/58:dpt5.001:position:set:nosuffix&lt;br /&gt;
5/1/60:dpt5.001:posstatus:get:nosuffix&lt;br /&gt;
5/1/72:dpt1:block:set:nosuffix&lt;br /&gt;
5/1/65:dpt1:uppos:listenonly:nosuffix&lt;br /&gt;
5/1/66:dpt1:dnpos:listenonly:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr Jal_Kueche cmdIcon Auf:black_up Ab:black_down Stop:remotecontrol/black_btn_RED&lt;br /&gt;
attr Jal_Kueche comment GA&#039;s: aufab,stop,movestatus,posstatus,Setposition,block,uppos,dnpos&lt;br /&gt;
attr Jal_Kueche devStateIcon {Jal_devStateIcon()}&lt;br /&gt;
attr Jal_Kueche eventMap { usr=&amp;gt;{&#039;Stop&#039;=&amp;gt;&#039;stop stop&#039;,&#039;Auf&#039;=&amp;gt;&#039;aufab up&#039;,&#039;Ab&#039;=&amp;gt;&#039;aufab down&#039;} }&lt;br /&gt;
attr Jal_Kueche stateCmd {Jal_stateCmd($name,$gadName,$state)}&lt;br /&gt;
attr Jal_Kueche webCmd Auf:Ab:position&lt;br /&gt;
attr Jal_Kueche widgetOverride position:slider,0,5,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.. und die beiden sub&#039;s in 99_myUtils.pm (Diese werden von allen Jalousien / Rolladen verwendet.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
### Jalousie Utilities&lt;br /&gt;
## return string for stateCmd&lt;br /&gt;
## input: devicename, Gadname, state&lt;br /&gt;
sub Jal_stateCmd {&lt;br /&gt;
   my ($dname,$gadname,$dstate) = @_;&lt;br /&gt;
   my $newstate = &#039;&#039;;&lt;br /&gt;
   if (ReadingsVal($dname,&#039;block&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;block:on&#039;;&lt;br /&gt;
   } elsif (ReadingsVal($dname,&#039;moving&#039;,&#039;off&#039;) eq &#039;on&#039; ) {&lt;br /&gt;
      $newstate = &#039;moving&#039;;&lt;br /&gt;
      Log3 $dname, 5, &amp;quot;in stateCmd-movingon: $dname, $gadname,$dstate,newstate: $newstate&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      $newstate = int((ReadingsNum($dname,&#039;posstatus&#039;,0)+5)/10) * 10;&lt;br /&gt;
   }&lt;br /&gt;
   return $newstate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## return string for devStateIcon&lt;br /&gt;
## input: none&lt;br /&gt;
## return string&lt;br /&gt;
sub Jal_devStateIcon {&lt;br /&gt;
  my $iconstring = &#039;block.on:fts_door_open@red &#039; .&lt;br /&gt;
         &#039;block.off: &#039; .&lt;br /&gt;
         &#039;wind.on:weather_wind@red &#039; .&lt;br /&gt;
         &#039;wind.off: &#039; .&lt;br /&gt;
         &#039;aufab.off:black_down:Ab &#039; .&lt;br /&gt;
         &#039;aufab.on:black_up:Auf &#039; .&lt;br /&gt;
         &#039;moving:fts_shutter_updown@red:Stop &#039; .&lt;br /&gt;
         &#039;100.*:fts_shutter_100 1\d.*:fts_shutter_10 &#039; .&lt;br /&gt;
         &#039;2\d.*:fts_shutter_20 3\d.*:fts_shutter_30 &#039; .&lt;br /&gt;
         &#039;4\d.*:fts_shutter_40 5\d.*:fts_shutter_50 &#039; .&lt;br /&gt;
         &#039;6\d.*:fts_shutter_60 7\d.*:fts_shutter_70 &#039; .&lt;br /&gt;
         &#039;8\d.*:fts_shutter_80 9\d.*:fts_shutter_90 &#039; .&lt;br /&gt;
         &#039;\d.*:fts_window_2w&#039;;&lt;br /&gt;
   return $iconstring;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die sub stateCmd berücksichtigt auch noch die GA: block - z.B. wenn Fenster/Tür offen ist oder einen einen WindAlarm! &lt;br /&gt;
&lt;br /&gt;
==== Slider - mit Rückmeldung &#039;&#039;&#039;und Wert Umrechnung&#039;&#039;&#039; ====&lt;br /&gt;
Ein komplexer Fall, wo ein Hersteller zwar den dpt5 verwendet, aber sein &amp;quot;eigenes Zahlen-Format&amp;quot; implementiert hat. Konkret geht&#039;s um eine Lüftungsanlage, die Stufen 0 (=Aus) bis 8 (=Maximum) verwendet. Am Bus kommen / werden erwartet die folgenden Werte:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0 (Aus)-&amp;gt;0, 1-&amp;gt;31, 2-&amp;gt;63, 3-&amp;gt;95, ... , 8-&amp;gt;255&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im FHEM-Web sollen aber die Stufen 0-8 verwendet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define KNXStufentest KNX 11/1/18:dpt5:StufeSoll:set:nosuffix 11/1/20:dpt5:StufeIst:get:nosuffix&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest eventMap { usr =&amp;gt; {&#039;Aus&#039; =&amp;gt; &#039;StufeSoll 0&#039;, &#039;^Ein&#039; =&amp;gt; &#039;StufeSoll &#039; . (3 * 32 - 1), &#039;^Stufe (\d)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;StufeSoll %d&amp;quot;,(($1 == 0)?0:($1 * 32 - 1)) ) . &amp;quot;&#039; },&lt;br /&gt;
fw =&amp;gt; {&#039;^Ein&#039; =&amp;gt; &#039;Ein&#039;, &#039;^Stufe (\d)&#039; =&amp;gt; &#039;Stufe&#039; } }&lt;br /&gt;
&lt;br /&gt;
attr KNXStufentest stateCmd { ($state,undef) = split(/\s/ix,$state);&lt;br /&gt;
  my $stateC = int(($state + 1) / 32);&lt;br /&gt;
  if ($gadName eq &#039;StufeIst&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  if ($gadName eq &#039;StufeSoll&#039;) {&lt;br /&gt;
    fhem (&amp;quot;sleep 0.1;setreading $name Stufe $stateC&amp;quot;); &lt;br /&gt;
  }&lt;br /&gt;
  return $state;&lt;br /&gt;
}&lt;br /&gt;
attr KNXStufentest webCmd Aus:Ein:Stufe&lt;br /&gt;
attr KNXStufentest widgetOverride Aus:noArg Ein:noArg Stufe:slider,0,1,8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ankommende Messages (von Alias StufeIst) werden wie üblich im reading &amp;quot;StufeIst&amp;quot; (Werte: 0-255) gespeichert und &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; umgerechnet und im reading &amp;quot;Stufe&amp;quot; (Wert: 0-8) gespeichert. Ein cmd vom User (Werte: 0-8)  wird durch die eventMap umgerechnet und auf den Bus gesendet. Zusätzlich gibt&#039;s noch die Schaltflächen &amp;quot;Ein&amp;quot; und &amp;quot;Aus&amp;quot; . Auch diese Werde mittels eventMap auf Stufe 3(=Ein) bzw. Stufe 0(=Aus) umgerechnet. Die Syntax der eventMap ist gewöhnungsbedüftig, aber so funktioniert&#039;s! Was noch fehlt ist die Darstellung der Lüfterstufe mittels Icon.  &lt;br /&gt;
&lt;br /&gt;
==== RGBW Steuerung (dpt251.600) ====&lt;br /&gt;
Diese GUI für di4esen dpt ist komplex, weil sie aus 2 widgets besteht: &#039;&#039;&#039;colopicker,RGB&#039;&#039;&#039; und &#039;&#039;&#039;slider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die eventmap setzt die beiden Werte (RGB u. White), die jeweils von den widgets kommen, zusammen und sendet das Resultat an den Bus. Der stateCmd setzt 2 &amp;quot;Hilfs-readings (rgb,white), die aktuellen Basis-Werte für die widgets darstellen.&lt;br /&gt;
[[Datei:KNX dpt251GUI.png|mini]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt251tst KNX 14/1/251:dpt251.600:set:nosuffix&lt;br /&gt;
attr dpt251tst eventMap {usr =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%s&amp;quot;,$1,substr(ReadingsVal(&amp;quot;dpt251tst&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;aa&amp;quot;),6,2)) . &amp;quot;&#039; , \&lt;br /&gt;
&#039;^white.(.+)&#039; =&amp;gt; &#039;&amp;quot; . sprintf(&amp;quot;g1 %s%.2x&amp;quot;,substr(ReadingsVal(&amp;quot;dpt251tst&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;aa&amp;quot;),0,6),int($1*2.555))    . &amp;quot;&#039; },\&lt;br /&gt;
fw =&amp;gt; {&#039;^rgb.(.+)&#039; =&amp;gt; &#039;rgb&#039;, &#039;^white.(.+)&#039; =&amp;gt; &#039;white&#039;},\&lt;br /&gt;
}\&lt;br /&gt;
attr dpt251tst stateCmd { my $rgb = substr($state,0,6);;\&lt;br /&gt;
  my $white = sprintf(&#039;%d&#039;,hex(substr($state,6,2))/2.55);;\&lt;br /&gt;
  fhem(&amp;quot;sleep 0.1;; setreading $name rgb $rgb;; setreading $name white $white&amp;quot;);;\&lt;br /&gt;
  return $state;;\&lt;br /&gt;
}&lt;br /&gt;
attr dpt251tst webCmd rgb:white&lt;br /&gt;
attr dpt251tst widgetOverride rgb:colorpicker,RGB white:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DPT nicht unterstützt im KNX Modul ? ===&lt;br /&gt;
Im KNX-Modul sind (fast) alle DPT&#039;s unterstützt, die in den frei verfügbaren Standard-Dokumenten definiert sind. Hersteller definieren manchmal eigene sub-DPT&#039;s, die dann möglicherweise nicht unmittelbar unterstützt sind. &lt;br /&gt;
&lt;br /&gt;
Im wesentlichen unterscheiden sich die sub-DPT&#039;s z.B. dpt9.020 von den &amp;quot;Haupt-DPT&#039;s&amp;quot; z.B. dpt9 durch die angefügte Einheit, den min/max Werte-Bereich, die Skalierung oder einen Offset. Falls also ein Gerät eine 2Byte-float Wert senden will, dann könnte das so aussehen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
define dpt9test KNX 0/4/6:dpt9&lt;br /&gt;
attr dpt9test format g/m&amp;amp;sup3; # gramm / m³&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;und schon steht die richtige Einheit dahinter... Oder Skalierung - Watt -&amp;gt; kW:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr dpt9test stateCmd { return sprintf(&#039;%.3f kW&#039;,$state / 1000); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Falsch definierte DPT&#039;s (z.B: dpt5 statt dpt7) produzieren falsche Ergebnisse, sowohl in FHEM als auch im KNX Device!&lt;br /&gt;
&lt;br /&gt;
=== Übernehmen dieser Beispiele in die eigene config ===&lt;br /&gt;
Die meisten dieser Beispiele sind mittels &amp;quot;exportdevice &amp;lt;name&amp;gt;&amp;quot; erstellt. Bei der Übernahme mit c&amp;amp;p in die FHEM- commandozeile (oder auch Telnet) gibt&#039;s Fallstricke...(Es müssen Semicolons u. Zeilenumbrüche maskiert werden). Um das zu umgehen, schlage ich folgenden Vorgangsweise vor:&lt;br /&gt;
&lt;br /&gt;
Definiere z.b. ein (kompliziertes) Attr stateCmd auf der FHEM-cmd Zeile:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr meinDevice stateCmd {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;... also mit nichts drin! - Damit kann&#039;s auch keine syntax-Fehler geben! Danach geht man in den device-detail-View, klickt auf statecmd und mit c&amp;amp;p wird der code zwischen den (äussersten {} ) eingefügt. Selbes Vorgehen gilt auch für komplexe DevstateIcon, notifies, at,... Noch grössere code Teile sind sinnvoller in einer sub-routine in 99_myUtils.pm aufgehoben und werden z.b. im stateCmd aufgerufen:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;meinDevice&amp;gt; stateCmd { $state = meineAllerwichtigsteSubroutine(p1,p2,p3); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das hat dann auch den Vorteil, dass die sub-Routine von mehreren devices verwendet werden kann!&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;br /&gt;
[[Kategorie:Gerätemodul]]&lt;/div&gt;</summary>
		<author><name>Erwin111</name></author>
	</entry>
</feed>