<?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=GRZBRZ</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=GRZBRZ"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/GRZBRZ"/>
	<updated>2026-05-01T12:32:02Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33423</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33423"/>
		<updated>2020-06-27T13:37:21Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== Beispiel DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId[^\n]+\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId[^T]+T([-+.,0-9]+).*/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId[^\n]+\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId[^P]+P([-+.,0-9]+).*/; $1 }&lt;br /&gt;
reading humidity match &amp;quot;%devId[^\n]+\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId[^H]+H([-+.,0-9]+).*/; $1 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex für match ist in allen Zeilen gleich gestaltet. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar. &lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später unter Notify noch weiteres.&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel:humidity:.* { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 180m üNN. Die Erzeugung des Wertes für &amp;quot;airpressure_sealevel&amp;quot; ist übrigens an den Event &amp;quot;humidity geknüpft, sonst hat man im Event-Log in diesem Fall 3 Einträge, nämlich den beim Temperatur-, beim Druck- und beim Feuchte-Event (siehe auch beim folgenden Notify und dem linken Teil des Beispiel-Plots weiter unten).&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Log HISTORY ======&lt;br /&gt;
Die Werte sammeln sich nun im Log. Dort haben die Werte ebenfalls eine Einheit, in diesem Fall &amp;quot;°C&amp;quot; für reading-Namen, die mit &amp;quot;temperature&amp;quot; beginnen und &amp;quot;%&amp;quot; für reading-Namen, die mit &amp;quot;humidity&amp;quot; beginnen. Andere Einheiten oder andere reading-Namen lassen sich entweder über ein Attribut in der Log-Definition&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr myDbLog valueFn {&lt;br /&gt;
  if ($DEVICE eq &amp;quot;BME280_42356&amp;quot;){&lt;br /&gt;
    if ($READING=~ m(^airpressure)){&lt;br /&gt;
      $UNIT = &amp;quot;hPa&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ($READING=~ m(^pressure)){&lt;br /&gt;
      $UNIT = &amp;quot;Pa&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;oder direkt im Device ergänzen bzw. beeinflussen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr BME280_42356 DbLogValueFn {&lt;br /&gt;
  if ($READING=~ m(^airpressure)){&lt;br /&gt;
    $UNIT = &amp;quot;hPa&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if ($READING=~ m(^pressure)){&lt;br /&gt;
    $UNIT = &amp;quot;Pa&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Damit lassen sich freilich auch ungewöhnliche Einheiten festlegen, Blutdruck wird z.B. in &amp;quot;mmHg&amp;quot; gemessen.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball  (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val/2-10). Eine Y-Achse für die Feuchte wäre ja die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C.&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GHplotECMD.png|rahmenlos|1197x1197px]]&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33422</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33422"/>
		<updated>2020-06-25T14:47:37Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später unter Notify noch weiteres.&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel:humidity:.* { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 180m üNN. Die Erzeugung des Wertes für &amp;quot;airpressure_sealevel&amp;quot; ist übrigens an den Event &amp;quot;humidity geknüpft, sonst hat man im Event-Log in diesem Fall 3 Einträge, nämlich den beim Temperatur-, beim Druck- und beim Feuchte-Event (siehe auch beim folgenden Notify und dem linken Teil des Beispiel-Plots weiter unten).&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GHplotECMD.png|rahmenlos|1197x1197px]]&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33421</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33421"/>
		<updated>2020-06-25T14:36:54Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später unter Notify noch weiteres.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Nachtrag: Zum Zeitpunkt der Erstellung dieses Artikels gibt es Probleme in dem Fall, dass die bei &amp;quot;partial&amp;quot; übliche Zusammensetzung der Lesung versagt, wenn das abschließende &amp;quot;\n&amp;quot; als einzelnes Zeichen übertragen wird. Beim DISPATCH des gerade gelesenen Fragments durch fhem.pm wird ein einzelnes &amp;quot;\n&amp;quot; verschluckt und es kommt in Folge zu keinem match mit den dokumentierten match-Ausdrücken.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel:humidity:.* { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 180m üNN. Die Erzeugung des Wertes für &amp;quot;airpressure_sealevel&amp;quot; ist übrigens an den Event &amp;quot;humidity geknüpft, sonst hat man im Event-Log in diesem Fall 3 Einträge, nämlich den beim Temperatur-, beim Druck- und beim Feuchte-Event (siehe auch beim folgenden Notify und dem linken Teil des Beispiel-Plots weiter unten).&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GHplotECMD.png|rahmenlos|1197x1197px]]&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33417</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33417"/>
		<updated>2020-06-22T18:33:24Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GHplotECMD.png|rahmenlos|1197x1197px]]&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33416</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33416"/>
		<updated>2020-06-22T18:30:19Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
[[Datei:GHplotECMD.png|links|rahmenlos|1197x1197px|Voila]]&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:GHplotECMD.png&amp;diff=33415</id>
		<title>Datei:GHplotECMD.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:GHplotECMD.png&amp;diff=33415"/>
		<updated>2020-06-22T18:27:44Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: Plot aus ECMD Daten&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Plot aus ECMD Daten&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:GHplotECMD.svg&amp;diff=33414</id>
		<title>Datei:GHplotECMD.svg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:GHplotECMD.svg&amp;diff=33414"/>
		<updated>2020-06-22T18:15:59Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: Plot aus Daten ECMD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Plot aus Daten ECMD&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33413</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33413"/>
		<updated>2020-06-22T18:02:05Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33412</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33412"/>
		<updated>2020-06-22T17:35:40Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
&lt;br /&gt;
====== Klassendefinition ======&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
====== Schnittstelle ======&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
====== Device ======&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
====== Notify ======&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
====== Weiterführend ======&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
====== FIN ======&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33411</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33411"/>
		<updated>2020-06-22T17:27:23Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dabei wird der Luftdruck auf einen plausiblen Bereich eingegrenzt, Drücke außerhalb dieses Bereichs hat es noch nicht gegeben auf diesem Erdball. Der Wert der Feuchte wird dem zu erwartenden Temperaturbereich (-10 bis 40) angeglichen, das ergibt eine schönere Kurve (:$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val). Eine Y-Achse für die Feuchte wäre die dritte Y-Achse, die haben wir also nicht. Also landet 100% Feuchte bei 40°C und 0% Feuchte bei -10°C (:$val=$val/2-10).&lt;br /&gt;
&lt;br /&gt;
Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33409</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33409"/>
		<updated>2020-06-22T16:16:28Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt, .&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33408</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33408"/>
		<updated>2020-06-22T12:11:23Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des state auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt erstellt, der anzuzeigenden Linien und Beschriftungen des Plots beschreibt, .&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33407</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33407"/>
		<updated>2020-06-22T12:08:31Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;amp;#x2460; &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. &amp;amp;#x2462; Dies wird zunächst im Log vermerkt und &amp;amp;#x2463; als nächstes ein wenig gewartet, damit eine Änderung des sttate auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird &amp;amp;#x2464; der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte &amp;amp;#x2465;,&amp;amp;#x2466;,&amp;amp;#x2467; versorgt.&lt;br /&gt;
&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt, der die Inhalte des Plots beschreibt, erstellt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33401</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33401"/>
		<updated>2020-06-22T01:05:08Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;1 &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. 3 Dies wird zunächst im Log vermerkt und 4 als nächstes ein wenig gewartet, damit eine Änderung des sttate auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird 5 der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte 6,7,8 versorgt.&lt;br /&gt;
&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt, der die Inhalte des Plots beschreibt, erstellt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß bei den eigenen Experimenten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33400</id>
		<title>ECMD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ECMD&amp;diff=33400"/>
		<updated>2020-06-22T01:03:22Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: /* Beispiele &amp;amp; Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ECMD bedeutet &amp;quot;Ethersex Command&amp;quot;&amp;lt;ref&amp;gt;[http://www.ethersex.de/index.php/Main_Page_%28Deutsch%29 Ethersex.de]&amp;lt;/ref&amp;gt; und ist laut FHEM-Dokumentation&lt;br /&gt;
&amp;quot;Any physical device with request/response-like communication capabilities over a TCP connection&amp;quot;&amp;lt;ref&amp;gt;{{Link2CmdRef|Anker=ECMD|Label=FHEM Commandref}}&amp;lt;/ref&amp;gt;, das heisst, irgendein physisches Gerät, welches request/response-artige Kommunikationsfähigkeiten aufweist, sei es über eine TCP-Verbindung (Netzwerk) oder eine serielle Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind enthalten:&lt;br /&gt;
* Modul [[ECMD (Modul)|ECMD]] für die Bearbeitung physischer I/O-Schnittstellengeräte und&lt;br /&gt;
* Modul [[ECMDDevice]] für einzelne logische Geräte, deren Kommunikation über ein ECMD-Gerät läuft&lt;br /&gt;
&lt;br /&gt;
==Beispiele &amp;amp; Links==&lt;br /&gt;
Siehe {{Link2Forum|Topic= 60753 |Message=521462|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
Siehe [[Radioaktivitätsmessung mit DIYGeigerCounter]]&lt;br /&gt;
&lt;br /&gt;
=== DIY Sensor via HC-12 ===&lt;br /&gt;
Ein BME280 Temperatur/Druck/Feuchte-Sensor liefert via eines HC-12 Pärchens seine Daten an der seriellen Schnittstelle eines RasPi ab. Der Sketch im Nano, an dem sowohl der BME280 als auch einer der HC-12 hängen, liefert alle 10 Minuten ein Datagramm ab und schickt seinen Wirt in den Tiefschlaf bis zum nächsten Datagramm, um mit den notwendigen Batterien über ein Jahr aushalten zu können.&lt;br /&gt;
&lt;br /&gt;
Das Datagramm hat die Form &lt;br /&gt;
 DevId T-3.45°C P995.31hPa H63.27%RH\r\n&lt;br /&gt;
Daraus werden die notwendigen Definitionen für eine Klassendefinition abgeleitet. Die z.B. unter &#039;/opt/fhem/BME280.classdef&#039; abgelegte Datei erhält den Inhalt&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
params devId&lt;br /&gt;
reading temperature match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading temperature postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $1 }&lt;br /&gt;
reading airpressure match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading airpressure postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $2 }&lt;br /&gt;
reading humidity match &amp;quot;%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n&amp;quot;&lt;br /&gt;
reading humidity postproc { /%devId\sT([-+.,0-9]+)\S+\sP([-+.,0-9]+)\S+\sH([-+.,0-9]+)\S+\r?\n/; $3 }&lt;br /&gt;
state humidity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die regex ist in allen Zeilen der Einfachheit zuliebe gleich gehalten, bei den match könnte man freilich die Klammern löschen und bei den postproc auf ein Paar reduzieren und $_ gleichmäßig mit $1 befüllen. Geschmackssache. Alle Werte werden durch diese Vorgehensweise gleichzeitig und erst dann gelesen, wenn das gesamte Datagramm eingetroffen ist. Es ließe sich auch auf Teil-Strings abfragen, Konflikte bei mehreren Sensoren sind dann denkbar.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile sorgt dafür, dass der state nur dann einen neuen Wert erhält, wenn (in diesem Fall) &#039;humidity&#039; ein Update erfährt. Bei den gewählten regex trift das hier eigentlich für alle zu, aber da humidity der letzte übertragene Wert ist, ist die Wahl auf ihn gefallen. Außerdem steht nun nur ein Wert im state ohne einleitenden reading Namen, der wäre hier im Beispiel erwartungsgemäß &#039;humidity&#039;, was hier insofern irritiert, weil ja 3 Werte gelesen wurden und man sich unwillkürlich fragt, wo den die anderen geblieben sind. Zum state daher später noch weiteres.&lt;br /&gt;
&lt;br /&gt;
Sollte bereits eine ECMD Schnittstelle bestehen, kann nun die Definition hinzugefügt werden. Z.B. die ECMD Schnittstelle namens &#039;SerDevDef&#039; erhält eine zusätzliche Klasse &#039;BME280&#039; mit den Definitionen aus der vorher generierten Datei, Beispiel siehe oben.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ist noch keine ECMD Schnittstelle definiert, wird diese erstellt und gleich mit passenden Attributen versehen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define SerDevDef ECMD serial /dev/ttyS0@9600&lt;br /&gt;
set SerDevDef classdef BME280 /opt/fhem/BME280.classdef&lt;br /&gt;
attr SerDevDef partial 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die letzte Zeile ist für die serielle Schnittstelle gerade bei längeren Datagrammen ein Muss. Sie sorgt dafür, dass die kleineren Informationsbröckchen zu einer vollständigen Einheit werden. Kommt das nächste Päckchen innerhalb von (hier) 2 Sekunden, wird das neue Päckchen an die bereits gelesenen Daten angehängt, ansonsten startet eine neue Aufzeichnung beginnend mit dem Päckchen.&lt;br /&gt;
&lt;br /&gt;
Für den Start kann noch zur Erleichterung der Fehlersuche folgendes ergänzt werden&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr SerDevDef logTraffic 5&lt;br /&gt;
attr SerDevDef verbose 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Rückstelllen dieser Attribute nicht vergessen, so ist&#039;s reichlich gesprächig und füllt schnell das Log !!!&lt;br /&gt;
&lt;br /&gt;
Damit ist alles vorbereitet den ECMD Device zu erstellen.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define BME280_42356 ECMDDevice BME280 42356&lt;br /&gt;
attr BME280_42356 alias Gartenhaus&lt;br /&gt;
attr BME280_42356 room Grundstück&lt;br /&gt;
attr BME280_42356 IODev SerDevDef &lt;br /&gt;
attr BME280_42356 userReadings airpressure_sealevel { sprintf(&amp;quot;%.2f&amp;quot;, ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;pressure&amp;quot;,0)*1.023);; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der fragliche Sensor beginnt seine Datagramme immer mit &#039;42356&#039;, das ist seine DevId, die über den Parameter &#039;devId&#039; in der Klassendefinition (siehe oben) Eingang in die readings findet. Über &#039;BME280&#039; wird die Klassendefinition festgelegt, über &#039;42356&#039; die devId. Sinnigerweise wird im Beispiel hier &#039;BME280_42356&#039; als Devicename festgelegt, Systematik ist Trumpf.&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile macht aus dem vom Sensor gemessenen Luftdruck noch den auf NormalNull Bezogenen. Nicht jeder wohnt direkt am Meer und kann auf diesen Schritt verzichten. Ansonsten weichen die Werte des Sensors immer von der Wettervorhersage ab, je höher der Sensor, um so markanter. Das Beispiel hier gilt für ca. 160m üNN.&lt;br /&gt;
&lt;br /&gt;
Da der state nach einer Übermittlung aufgrund der Festlegungen aus der Klassendefinition nun nur den Wert der Luftfeuchte enthält, ist es hilfreich ein &#039;notify&#039; für eine gefälligere Darstellung zu definieren.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* { Log 1, &amp;quot;$NAME has new values&amp;quot;;;sleep 1;;fhem &amp;quot;setstate BME280_42356&amp;quot;.&amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die Übersicht zerlegt:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
define ECMDDevState notify BME280_42356:humidity:.* &lt;br /&gt;
{&lt;br /&gt;
  Log 1, &amp;quot;$NAME has new values&amp;quot;;;&lt;br /&gt;
  sleep 1;;&lt;br /&gt;
  fhem &amp;quot;setstate BME280_42356&amp;quot;.&lt;br /&gt;
    &amp;quot; T:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;temperature&amp;quot;,0).&lt;br /&gt;
    &amp;quot; P:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;airpressure_sealevel&amp;quot;,0).&lt;br /&gt;
    &amp;quot; H:&amp;quot;.ReadingsVal(&amp;quot;BME280_42356&amp;quot;,&amp;quot;humidity&amp;quot;,0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;1 &#039;ECMDDevState&#039; wird immer dann benachrichtigt und ausgeführt, wenn der Device &#039;BME280_42356&#039; ein reading &#039;humidity&#039; mit einem beliebigen (.*) Wert hat. 3 Dies wird zunächst im Log vermerkt und 4 als nächstes ein wenig gewartet, damit eine Änderung des sttate auf jeden Fall nach dem Befüllen des state durch das humidity reading stattfindet und auch der Luftdruck fertig berechnet ist. Dann wird 5 der state mit einer Verkettung der gerade gelesenen bzw. berechneten Daten aller Werte 6,7,8 versorgt.&lt;br /&gt;
&lt;br /&gt;
Abschließend soll noch ein Plot der Messwerte gemacht werden, eine Kurve liest sich leichter. Als Erstes wird eine Datei z.B. &#039;/opt/fhem/www/gplot/SVG_BME280_42356.gplot&#039; mit folgendem Inhalt, der die Inhalte des Plots beschreibt, erstellt.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot;Verlauf&amp;quot;&lt;br /&gt;
set title &#039;Wetter&#039;&lt;br /&gt;
set ylabel &amp;quot;Temperatur&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Luftdruck&amp;quot;&lt;br /&gt;
#myDbLog BME280_42356:temperature:0:&lt;br /&gt;
#myDbLog BME280_42356:airpressure_sealevel:0::$val=$val&amp;gt;1100?1100:$val&amp;lt;800?800:$val&lt;br /&gt;
#myDbLog BME280_42356:humidity:0::$val=$val/2-10&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftdruck&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Feuchte&#039; ls l2 lw 1 with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dann wird der Plot definiert. In diesem Fall mit den Daten aus DbLog, für FileLog muss geringfügig angepaßt werden. Dann fehlten freilich auch die FileLog -Definitionen für &#039;BME280_42356&#039;.&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod SVG_BME280_42356 SVG myDbLog:SVG_BME280_42356:HISTORY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Term &#039;SVG_BME280_42356&#039; liest dabei die Definitionen aus der vorher angelegten Datei &#039;SVG_BME280_42356.gplot&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Viel Spaß bei den eigenen Experimenten. ====&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MAX!CubeMigrationToFHEM&amp;diff=33397</id>
		<title>MAX!CubeMigrationToFHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MAX!CubeMigrationToFHEM&amp;diff=33397"/>
		<updated>2020-06-20T12:40:51Z</updated>

		<summary type="html">&lt;p&gt;GRZBRZ: /* Planned changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{todo|Fertigstellung des Artikels oder zumindest Löschung der ADD Me-Einträge}}&lt;br /&gt;
== WORK IN PROGRESS / NOT FINISHED: HowTo Migrate from MAX!Cube to FHEM ==&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; This pages describes the steps required to migrate a house installation from MAX!Cube solution (using a Cube and MAX! Software from ELV/EQ-3) to FHEM on a Raspberry Pi combined with a CUL. The benefit of such a migration is to gain better logfiles, to get graphs (Desired vs. Actual temperature and Valve position) and more reliable software.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Initial situation ===&lt;br /&gt;
The appartment has 125 sqm and five rooms (child 1, child 2, livingroom, bedroom, working room), one bathroom, a kitchen and a toilette. Each room has one heater below the window, the living room has two heaters. Two rooms require multiple window shutter contacts: bedroom and living room due to the amount of windows. MAX!Cube software is running since a year controlling all heaters, all windows and in combination with one wall thermostat in the living room and one ECO-switch at the main door to bring the full house to ECO mode when leaving.&lt;br /&gt;
&lt;br /&gt;
=== Desired situation ===&lt;br /&gt;
MAX!Cube software was unstable and the update to v1.3.10 triggered the decision to move to a new setup: keep the MAX system, but control it via FHEM. Have the ability to add more sensors, more actors from other brands than MAX (looking for Homematic due to the amount of different sensors and 1-Wire to avoid the unreliable radio transmission). Have the ability to better see what the system is doing (logfiles) and graph it out (diagrams for each room). Get some more flexibility for home-cinema setup, for light controls, etc. Increase the &#039;&#039;WAF&#039;&#039; (Women&#039;s Acceptance Factor) for the wife who was complaining about the MAX!Cube solution.&lt;br /&gt;
&lt;br /&gt;
=== Procurement list ===&lt;br /&gt;
While it is possible to use the existing MAX Cube with FHEM certain features would not be available. Therefore I decided to go with a Rasperry Pi and a CUL. Here is the shopping list:&lt;br /&gt;
&lt;br /&gt;
# Rasperry Pi from G3 with cooling kit for enhanced reliability ([http://www.amazon.de/pi3g-Raspberry-Betriebssystem-Coolkit-installiert/dp/B00CB1C96E])&lt;br /&gt;
# 32 GB SDHX Card Class 10 from SANDisk&lt;br /&gt;
# CC1101-USB-Lite 868MHz ([http://shop.busware.de/product_info.php/cPath/1/products_id/29]) with 36cm antenna (+8dBi) for MAX protocol&lt;br /&gt;
# 8 Channel 1-Wire Daughterboard without RTC with some sensors for testing ([http://www.sheepwalkelectronics.co.uk/product_info.php?cPath=22&amp;amp;products_id=33])&lt;br /&gt;
&lt;br /&gt;
(Note: The 1-Wire board has not yet arrived and may not fit into the supplied case - but I am too lazy to attach the cooling modules myself).&lt;br /&gt;
&lt;br /&gt;
=== Installation of Raspberry Pi ===&lt;br /&gt;
Please follow one of the many documentations how to install Linux on your Raspberry Pi - a good starting point would be [http://www.raspberrypi.org/downloads]. I tried to install Raspbian using the advanced method of copying the image directly to the SD-card but it did not worked out well as many perl/python-modules were missing, had to be identified and installed to use FHEM.&lt;br /&gt;
&lt;br /&gt;
For my second approach I used the provided image from busware.de, which also includes drivers for their COC daughter board. Available for download here [http://files.busware.de/RPi/README.kernel]. Unfortunately this has a slightly outdated FHEM installation, but works for all other parts. Please note that there is no HDMI output enabled during the first boot. Just use &amp;lt;code&amp;gt;ssh pi@fhem&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ssh pi@&amp;lt;IP-address&amp;gt;&amp;lt;/code&amp;gt; to login and use raspi-config for initial setup of passwords, timezone and disk size. Do not forget to install an ntp-client using &amp;lt;code&amp;gt;apt-get install ntp-client&amp;lt;/code&amp;gt;, an editor of your choice (I selected vim &amp;lt;code&amp;gt;apt-get install vim&amp;lt;/code&amp;gt;) and edit &amp;lt;code&amp;gt;/etc/ntp.conf&amp;lt;/code&amp;gt; to adjust ntpservers and select a country-pool (see [http://www.pool.ntp.org/zone/europe]).&lt;br /&gt;
&lt;br /&gt;
==== Upgrade of FHEM ====&lt;br /&gt;
Once the initial setup is completed reboot your Raspberry and login into FHEM using your web browser at &amp;lt;code&amp;gt;&amp;lt;IP-address&amp;gt;:8083&amp;lt;/code&amp;gt;. Enter the &amp;lt;code&amp;gt;upgrade&amp;lt;/code&amp;gt; command to upgrade your FHEM-installation to the latest revision. Use &amp;lt;code&amp;gt;shutdown restart&amp;lt;/code&amp;gt; to start the new code version.&lt;br /&gt;
&lt;br /&gt;
==== CUL firmware flashing ====&lt;br /&gt;
Login using ssh and become root using &amp;lt;code&amp;gt;su -&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sudo -i&amp;lt;/code&amp;gt; to flash the empty CUL. This only works as root from the directory &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt; using the command string&lt;br /&gt;
&lt;br /&gt;
 dfu-programmer atmega32u4 erase &amp;amp;&amp;amp; dfu-programmer atmega32u4 flash ./FHEM/CUL_V3.hex &amp;amp;&amp;amp; dfu-programmer atmega32u4 start&lt;br /&gt;
&lt;br /&gt;
If the application dfu-programmer is not installed, install using &amp;lt;code&amp;gt;apt-get install dfu-programmer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Migration Preparation ===&lt;br /&gt;
ADD ME&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
If you have not done it before now it&#039;s a good start to document your existing MAX!Cube solution. Room for room write each device, the MAX address, location and intended profile into an Excel file. It could look like&lt;br /&gt;
&lt;br /&gt;
 Roomname DeviceName DeviceAddress Location WeekDayProfile WeekendProfile Dependencies&lt;br /&gt;
&lt;br /&gt;
where WeekDayProfile and WeekendProfile only make sense for actors like Heaters within the MAX-solution. Dependencies can indicate Window Contacts to Heater actors or Wall Thermostat to Heater actors. Document as well your current heating profile configuration with MAX!Cube.&lt;br /&gt;
&lt;br /&gt;
Make a backup.&lt;br /&gt;
&lt;br /&gt;
==== Selecting the right time of the year ====&lt;br /&gt;
ADD ME&lt;br /&gt;
==== What do you want to archive ====&lt;br /&gt;
ADD ME&lt;br /&gt;
=== Migration Execution ===&lt;br /&gt;
ADD ME&lt;br /&gt;
==== MAX!Cube Configuration ====&lt;br /&gt;
ADD ME&lt;br /&gt;
==== fhem Configuration ====&lt;br /&gt;
===== CUL Setup =====&lt;br /&gt;
First step to setup FHEM is to define the protocol and adaptor FHEM should use. You need one CUL for each protocol (e.g. FS20, Homematic and MAX) as the CUL can listen to the same frequency, but does not understand multiple protocols. The &amp;lt;fhem.cfg&amp;gt; comes pre-installed with some default configuration. At the end add&lt;br /&gt;
&lt;br /&gt;
 #### CUL Definition, MAX!Cube&lt;br /&gt;
 define CUL0 CUL /dev/ttyACM0@9600 1234&lt;br /&gt;
 attr CUL0 rfmode MAX&lt;br /&gt;
 define cm CUL_MAX 123456&lt;br /&gt;
&lt;br /&gt;
and save fhem.cfg. After a reload FHEM will start to &#039;&#039;listen&#039;&#039; to MAX-commands sent by your still active MAX-Cube.&lt;br /&gt;
&lt;br /&gt;
===== Find MAX devices =====&lt;br /&gt;
As each MAX device communicates with the MAX!Cube over the time of two-three days, FHEM will detect in use MAX-devices like Heaters, Thermostats and WindowsContacts (but not the ECO wall switch) and create alias definitions within the fhem.cfg file. To get all devices including addresses in use let FHEM listen for a two-three days while the MAX!Cube is still in use and working.&lt;br /&gt;
&lt;br /&gt;
===== Identify MAX devices =====&lt;br /&gt;
Login into MAX!Cube using one browser window (or tab) and into FHEM using a second browser window (or tab). For each room change the temperature within the MAX!Software to an unsual value (like 27.5), change to the FHEM window and identify the change in FHEM. This allows you to detect one heater actor by the other.&lt;br /&gt;
&lt;br /&gt;
To identify the Window Contacts just open one window, swap to FHEM and see which contact reports an &#039;&#039;Open&#039;&#039; status.&lt;br /&gt;
&lt;br /&gt;
===== Define alias names =====&lt;br /&gt;
Open a third browser window (or tab), login to FHEM webpage and select Edit Files, fhem.cfg. You can now add the alias by adding lines like&lt;br /&gt;
&lt;br /&gt;
 define MAX_Bathroom_Heating MAX HeatingThermostat 05615b&lt;br /&gt;
 define MAX_Bathroom_WindowSensor MAX ShutterContact 053767&lt;br /&gt;
&lt;br /&gt;
room by room, one by one. Just identify the fhem-name in the &amp;quot;MAX&amp;quot;-room in FHEM and adjust the address (last hex-number in the line).&lt;br /&gt;
&lt;br /&gt;
If you already have meaningfull names in the MAX-Software you can try to use the code from this {{Link2Forum|Topic=19473|Message=131095|LinkText=forum post}} to automaticaly use these as the alias names for all MAX devices.&lt;br /&gt;
&lt;br /&gt;
===== Assigning a room name =====&lt;br /&gt;
For better structure create and assign devices of one physical room into one room within FHEM. Rooms are managed by the &#039;&#039;attribute&#039;&#039; room for a specific device. Each defined devices require one or more room attributes:&lt;br /&gt;
&lt;br /&gt;
 attr MAX_Bedroom_Heating room Bedroom&lt;br /&gt;
&lt;br /&gt;
===== Understanding the setup =====&lt;br /&gt;
The rooms are still controlled from the MAX!Cube and MAX-software. FHEM only listens and has useable names. FHEM does not communicate with the devices and it cannot configure devices. However you have useable and human-understandable names instead of hex-codes.&lt;br /&gt;
&lt;br /&gt;
===== Migration =====&lt;br /&gt;
As MAX!Cube will interfere with CUL (both sending the same protocol on the same frequency) and due to the sending restrictions (1%-rule) we need to&lt;br /&gt;
&lt;br /&gt;
# Remove all rooms in MAX!Cube (which deletes the devices in MAX!Cube)&lt;br /&gt;
# Reset all heaters and window contacts to factory settings&lt;br /&gt;
# Pair the device to FHEM&lt;br /&gt;
# Define the week heating program&lt;br /&gt;
# Define the connectivity between heater and window sensors&lt;br /&gt;
&lt;br /&gt;
Make a backup of your MAX!Cube configuration in case something goes seriously wrong. Have the family out of the house for 1-2 days while you run around to re-pair devices. While resetting the devices the PI-learned heating curves will be lost and the heaters need to adopt again to your house-specific heating curves.&lt;br /&gt;
&lt;br /&gt;
===== Re-setting devices =====&lt;br /&gt;
Remove batteries and wait 45 seconds. For&lt;br /&gt;
&lt;br /&gt;
# Heater actors: Press all three buttons at the same time, insert battery until &amp;lt;code&amp;gt;reS&amp;lt;/code&amp;gt; is displayed. Press Boost for installation menu&lt;br /&gt;
# Window contacts: Press button while inserting battery and keep pressed until LED is flashing again&lt;br /&gt;
# ECO-Wallcontact: Press Eco or AUTO button while inserting battery and keep pressed until LED is flashing again&lt;br /&gt;
# Wallthermostats: Press &amp;quot;Moon&amp;quot;, &amp;quot;OK&amp;quot; and &amp;quot;-&amp;quot; at the same time, then insert the battery [http://www.elv.de/controller.aspx?cid=824&amp;amp;detail=10&amp;amp;detail2=3537]&lt;br /&gt;
&lt;br /&gt;
===== Pairing devices with FHEM =====&lt;br /&gt;
Enter&lt;br /&gt;
&lt;br /&gt;
 set cm pairmode 45&lt;br /&gt;
&lt;br /&gt;
into the command field on top of the FHEM page to configure the CUL into pairing mode for 45 seconds. Initiate the pair sequence on the device by:&lt;br /&gt;
&lt;br /&gt;
# Heater actors: Pressing Boost for about 3 seconds until &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; is displayed. The pairing succeeded when the timer is gone.&lt;br /&gt;
# Window contacts: Press button, LED starts flashing. Success is reported by one last long LED signal.&lt;br /&gt;
# ECO-Wallcontact: Press one button three seconds, LED starts flashing. Success is reported by one last long LED signal&lt;br /&gt;
# Wallthermostat: First click several times &amp;quot;OK&amp;quot; to set a random date and time until you see the temperature again. Then press OK button three seconds until &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; is displayed. The pairing succeeded when the timer is gone.&lt;br /&gt;
&lt;br /&gt;
==== FHEM One-Time Device-specific configuration ====&lt;br /&gt;
Certain information about FHEM are stored in the fhem.cfg which you can edit using a text editor and ssh or using the webfront. A big other, device-specific part is entered as part of commands into the webfrontend, but not documented and not stored within fhem.cfg. You will end up in a documented, structure information stored in fhem.cfg (like any other UNIX related configuration file in /etc) and a un-documented part which is stored within the devices of your appartment only.&lt;br /&gt;
&lt;br /&gt;
My solution for this was to add the relevant commands into fhem.cfg as &#039;&#039;comments&#039;&#039;, so after a multiple month pause on playing with FHEM I do still see which commands belonged into which room and what I have done. However if you follow this route is important to understand that changes to these &#039;&#039;comments&#039;&#039; will never take place and change your configuration unless you copy and paste them into the command-field and execute your change.&lt;br /&gt;
&lt;br /&gt;
The information stored in devices and not in fhem.cfg are&lt;br /&gt;
&lt;br /&gt;
# Heating weekProfiles - which temperature you want when&lt;br /&gt;
# Associations between WindowContacts and Heaters to detect open windows.&lt;br /&gt;
&lt;br /&gt;
Within the FHEM forums you find a longer discussion if windows sensors really make sense. The statement there is as the heaters have a decreasing temperature sensor they are not. It is hard for me to follow this argumentation as:&lt;br /&gt;
&lt;br /&gt;
# The heating water temperature will be impacted when it keep running while windows is open&lt;br /&gt;
# The WAF (Women&#039;s Acceptance Factor) is lowered as the house should be smart&lt;br /&gt;
# You may wish to have open windows longer than 10-15 minutes&lt;br /&gt;
# I can document the time of getting fresh air into the rooms (for any discussions with the landlord in a rented appartment)&lt;br /&gt;
&lt;br /&gt;
===== Window Contacts and Heaters =====&lt;br /&gt;
To connect a window contact with a heater to decrease the temperature they need to be &#039;&#039;associated&#039;&#039; to each other:&lt;br /&gt;
&lt;br /&gt;
 set MAX_Bedroom_WindowSensor1 associate MAX_Bedroom_Heating&lt;br /&gt;
 set MAX_Bedroom_Heating associate MAX_Bedroom_WindowSensor1&lt;br /&gt;
&lt;br /&gt;
As you can see the associations is called twice for both directions and you need to call both commands for each Window Contact in the room. FHEM will ask you in the logfile for each command to press the MAX Window Contact button when you open the Window Contact. If you have (against advice) already configured the graphing you need to disable the graphing to get the command being transmitted.&lt;br /&gt;
&lt;br /&gt;
===== Open Window Temperature =====&lt;br /&gt;
Configure the desired Open Window temperature for that room using&lt;br /&gt;
&lt;br /&gt;
 set MAX_Bedroom_Heating windowOpenTemperature 5.5&lt;br /&gt;
&lt;br /&gt;
You may have to wait a couple of minutes until the command has been transmitted.&lt;br /&gt;
&lt;br /&gt;
Test your room by opening each Window with a Window Contact, the heater should immediately change temperature in both directions.&lt;br /&gt;
&lt;br /&gt;
===== The Heating Profile =====&lt;br /&gt;
Device-specific configuration also includes the weekProfile, e.g. the desired temperature for each day and each hour. The format is quite simple and starts with an implicit 00:00 (midnight) and ends with an implicit 24:00 (midnight next day). In between desired temperatures are specificed interleaving with hours, seperated by &#039;&#039;&#039;,&#039;&#039;&#039;s. Temperature is specific in degrees celsius. Example:&lt;br /&gt;
&lt;br /&gt;
 17,06:00,21,20:00,17&lt;br /&gt;
&lt;br /&gt;
will set 17 degrees from midnight to 06:00am, 21 degrees 06:00am to 20:00 (8:00pm) and then again 17 degrees until midnight. Such profiles are defined for each day (Mon, Tue, Wed, Thu, Fri, Sat, Sun) and set with the weekProfile command:&lt;br /&gt;
&lt;br /&gt;
 set MAX_Child1_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Wed 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Sat 17,06:00,21,20:00,17 Sun 17,06:00,21,20:00,17&lt;br /&gt;
&lt;br /&gt;
Do not attempt to break this line into multiple lines for better reading. Just one single long line. Transmission may take a couple of minutes.&lt;br /&gt;
&lt;br /&gt;
==== Testing and Verifying ====&lt;br /&gt;
ADD ME&lt;br /&gt;
&lt;br /&gt;
=== Add-Ons ===&lt;br /&gt;
ADD ME&lt;br /&gt;
==== Graphs using 99_UtilsMaxScan.pm ====&lt;br /&gt;
There is a Wiki-articel how to use the [[MAX! Temperatur-Scanner]] with FHEM. At the time of writing this article v1.05a has been published.&lt;br /&gt;
&lt;br /&gt;
Few people have published changes to this version within the forum, which enables the use of ECO wall button and multiple WindowShutter contacts.&lt;br /&gt;
&lt;br /&gt;
If you consider to create graphs for your installation your migration (as outlined above) should &#039;&#039;&#039;work stable&#039;&#039;, e.g.&lt;br /&gt;
&lt;br /&gt;
# week programs for all rooms are active and working&lt;br /&gt;
# open windows are detected and the desired temperature is decreased&lt;br /&gt;
# you do not face any logfile entries like: &amp;lt;code&amp;gt;CUL_MAX_SendQueueHandler: Not enough credit! credit10ms is 101, but we need 110. Waiting 9 seconds.&amp;lt;/code&amp;gt;&lt;br /&gt;
# you do not face any logfile entries like: &amp;lt;code&amp;gt;CUL_MAX_SendQueueHandler: Missing ack from 020341 for 0f010403123456020341000e18003655&amp;lt;/code&amp;gt;&lt;br /&gt;
# you do not plan any changes to week programs any time soon.&lt;br /&gt;
&lt;br /&gt;
Do not &#039;&#039;&#039;even think&#039;&#039;&#039; about starting to graph out heaters and rooms while migration is still in progress.&lt;br /&gt;
&lt;br /&gt;
Do download the Scanner Module you need to register and login into the forum. The Scanner Module is attached to the post linked at [[MAX! Temperatur-Scanner]]. Copy this file to &amp;lt;code&amp;gt;/opt/fhem/FHEM&amp;lt;/code&amp;gt; and change ownership to fhem.&lt;br /&gt;
&lt;br /&gt;
(Original Articles: {{Link2Forum|Topic=11624|Message=114140}} und {{Link2Forum|Topic=11624|Message=119519}})&lt;br /&gt;
&lt;br /&gt;
==== ECO-Wallswitch ====&lt;br /&gt;
According to an extensive Google search it is currently not possible to group all Heater actors and send a single command to the group to save communication credits.&lt;br /&gt;
&lt;br /&gt;
A workaround is to define a FHEM &#039;&#039;structure&#039;&#039; with a speaking name and type which includes all Heaters, assign it to a new room labelled &amp;quot;House&amp;quot; and add a web control button to FHEM:&lt;br /&gt;
&lt;br /&gt;
 # Define House to control all Heaters at once&lt;br /&gt;
 define AllHeaters structure AllMyHeaters MAX_Child2_Heating MAX_Workingroom_Heating MAX_Child1_Heating MAX_Livingroom_THSensor MAX_Bedroom_Heating MAX_Toilette_Heating MAX_Kitchen_Heating MAX_Bathroom_Heating&lt;br /&gt;
 attr AllHeaters room House&lt;br /&gt;
 attr AllHeaters webCmd desiredTemperature&lt;br /&gt;
&lt;br /&gt;
The ECO Wall button has a type PushButton and is easily defined using (you have to update the address of course):&lt;br /&gt;
&lt;br /&gt;
 ### 9.1 ECO-Wallbutton&lt;br /&gt;
 define MAX_WallButton MAX PushButton 0521c4&lt;br /&gt;
&lt;br /&gt;
To set all heaters into ECO mode until the AUTO mode is pressed on the button or the AUTO mode is called from the webpage use:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define MAX_HouseECOHeating notify MAX_WallButton:(onoff).* { if ($EVTPART1 eq 0) { Log(3,&amp;quot;Setting ECO-Mode&amp;quot;) &amp;amp;&amp;amp; fhem(&amp;quot;set AllHeaters desiredTemperature eco&amp;quot;);;} else { Log(3,&amp;quot;Setting AUTO-Mode&amp;quot;) &amp;amp;&amp;amp; fhem(&amp;quot;set AllHeaters desiredTemperature auto&amp;quot;);;}} &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Original discussion: {{Link2Forum|Topic=17128|Message=112191}})&lt;br /&gt;
&lt;br /&gt;
=== Full fhem.cfg file (all rooms) ===&lt;br /&gt;
This is the full example of all discussed settings for the specific outlined room. If you want to adopt this setup you need to replace all MAX addresses with the addresses of your devices.&lt;br /&gt;
&lt;br /&gt;
 attr global autoload_undefined_devices 1&lt;br /&gt;
 attr global logfile ./log/fhem-%Y-%m.log&lt;br /&gt;
 attr global modpath .&lt;br /&gt;
 attr global motd Remember to set passwords&lt;br /&gt;
 attr global statefile ./log/fhem.save&lt;br /&gt;
 attr global userattr MAX_Child2_Heating MAX_Child2_Heating_map devStateIcon devStateStyle icon sortby webCmd&lt;br /&gt;
 attr global verbose 3&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; Telnet&lt;br /&gt;
 define telnetPort telnet 7072 global&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; Screen setup&lt;br /&gt;
 define WEB FHEMWEB 8083 global&lt;br /&gt;
 attr WEB stylesheetPrefix dark&lt;br /&gt;
 &lt;br /&gt;
 define WEBphone FHEMWEB 8084 global&lt;br /&gt;
 attr WEBphone stylesheetPrefix smallscreen &lt;br /&gt;
 &lt;br /&gt;
 define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
 attr WEBtablet stylesheetPrefix touchpad &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; Logfile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Fake FileLog entry, to access the FHEM log from FHEMWEB &lt;br /&gt;
 define Logfile FileLog ./log/fhem-%Y-%m.log fakelog &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; Autocreate&lt;br /&gt;
 define autocreate autocreate&lt;br /&gt;
 attr autocreate autosave 1&lt;br /&gt;
 attr autocreate device_room %TYPE&lt;br /&gt;
 attr autocreate filelog ./log/%NAME-%Y.log&lt;br /&gt;
 attr autocreate weblink 1&lt;br /&gt;
 attr autocreate weblink_room Plots &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Disable this to avoid looking for new USB devices on startup&lt;br /&gt;
 define initialUsbCheck notify global:INITIALIZED usb create &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; CUL Definition, MAX!Cube&lt;br /&gt;
 define CUL0 CUL /dev/ttyACM0@9600 1234&lt;br /&gt;
 attr CUL0 rfmode MAX&lt;br /&gt;
 define cm CUL_MAX 123456 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; Room Definitions&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; Heating Control = MAX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; 1.1 Bathroom (Heating Thermostat)&lt;br /&gt;
 define MAX_Bathroom_Heating MAX HeatingThermostat 05615b&lt;br /&gt;
 attr MAX_Bathroom_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Bathroom_Heating room Bathroom&lt;br /&gt;
 attr MAX_Bathroom_Heating scanTemp 1&lt;br /&gt;
 define FileLog_MAX_Bathroom_Heating FileLog ./log/MAX_Bathroom_Heating-%Y.log MAX_Bathroom_Heating&lt;br /&gt;
 attr FileLog_MAX_Bathroom_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Bathroom_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Bathroom_Heating room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 1.2 Bathroom (Window Sensor)&lt;br /&gt;
 define MAX_Bathroom_WindowSensor MAX ShutterContact 053767&lt;br /&gt;
 attr MAX_Bathroom_WindowSensor room Bathroom&lt;br /&gt;
 define FileLog_MAX_Bathroom_WindowSensor FileLog ./log/MAX_Bathroom_WindowSensor-%Y.log MAX_Bathroom_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Bathroom_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Bathroom_WindowSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 1.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bathroom_WindowSensor associate MAX_Bathroom_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bathroom_Heating associate MAX_Bathroom_WindowSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bathroom_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Tue 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Wed  17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Thu 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Fri 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Sat  17,06:00,21,10:00,19,19:00,21,20:45,17 Sun 17,06:00,21,10:00,19,19:00,21,20:45,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Bathroom_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Bathroom_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Bathroom_Heating userReadings watchShutter { return &amp;quot;MAX_Bathroom_WindowSensor&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; WindowOpenTemperature (4.5 = OFF, No Window Detection)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bathroom_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 2.1 Bedroom (Heating Thermostat)&lt;br /&gt;
 define MAX_Bedroom_Heating MAX HeatingThermostat 020341&lt;br /&gt;
 attr MAX_Bedroom_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Bedroom_Heating room Bedroom&lt;br /&gt;
 attr MAX_Bedroom_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Bedroom_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Bedroom_Heating FileLog ./log/MAX_Bedroom_Heating-%Y.log MAX_Bedroom_Heating&lt;br /&gt;
 attr FileLog_MAX_Bedroom_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Bedroom_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Bedroom_Heating room MAX &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 2.2 Bedroom (Window Sensor)&lt;br /&gt;
 define MAX_Bedroom_WindowSensor1 MAX ShutterContact 053fdd&lt;br /&gt;
 attr MAX_Bedroom_WindowSensor1 room Bedroom&lt;br /&gt;
 define FileLog_MAX_Bedroom_WindowSensor1 FileLog ./log/MAX_Bedroom_WindowSensor1-%Y.log MAX_Bedroom_WindowSensor1&lt;br /&gt;
 attr FileLog_MAX_Bedroom_WindowSensor1 logtype text&lt;br /&gt;
 attr FileLog_MAX_Bedroom_WindowSensor1 room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 2.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bedroom_WindowSensor1 associate MAX_Bedroom_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bedroom_Heating associate MAX_Bedroom_WindowSensor1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bedroom_Heating weekProfile Mon 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Tue 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Wed 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Thu 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Fri 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Sat 17,07:00,19,09:00,21,10:00,17 Sun 17,07:00,19,09:00,21,10:00,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Bedroom_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Bedroom_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Bedroom_Heating userReadings watchShutter { return &amp;quot;MAX_Bedroom_WindowSensor1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; WindowOpenTemperature (4.5 = OFF, No Window Detection)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Bedroom_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 3.1 Child 1 (Heating Thermostat)&lt;br /&gt;
 define MAX_Child1_Heating MAX HeatingThermostat 05034f&lt;br /&gt;
 attr MAX_Child1_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Child1_Heating room Child1&lt;br /&gt;
 attr MAX_Child1_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Child1_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Child1_Heating FileLog ./log/MAX_Child1_Heating-%Y.log MAX_Child1_Heating&lt;br /&gt;
 attr FileLog_MAX_Child1_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Child1_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Child1_Heating room MAX &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 3.2 Child 1 (Window Sensor)&lt;br /&gt;
 define MAX_Child1_WindowSensor MAX ShutterContact 053f76&lt;br /&gt;
 attr MAX_Child1_WindowSensor room Child1&lt;br /&gt;
 define FileLog_MAX_Child1_WindowSensor FileLog ./log/MAX_Child1_WindowSensor-%Y.log MAX_Child1_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Child1_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Child1_WindowSensor room MAX &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 3.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child1_WindowSensor associate MAX_Child1_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child1_Heating associate MAX_Child1_WindowSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child1_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Wed  17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Sat 17,06:00,21,20:00,17 Sun 17,06:00,21,20:00,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Child1_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Child1_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Child1_Heating userReadings watchShutter { return &amp;quot;MAX_Child1_WindowSensor&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child1_Heating windowOpenTemperature 5.5 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 4.1 Child 2 (Heating Thermostat)&lt;br /&gt;
 define MAX_Child2_Heating MAX HeatingThermostat 050352&lt;br /&gt;
 attr MAX_Child2_Heating room Child2&lt;br /&gt;
 attr MAX_Child2_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Child2_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Child2_Heating FileLog ./log/MAX_Child2_Heating-%Y.log MAX_Child2_Heating&lt;br /&gt;
 attr FileLog_MAX_Child2_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Child2_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Child2_Heating room MAX&lt;br /&gt;
 define SVG_FileLog_MAX_Child2_Heating_1 SVG FileLog_MAX_Child2_Heating:SVG_FileLog_MAX_Child2_Heating_1:CURRENT&lt;br /&gt;
 attr SVG_FileLog_MAX_Child2_Heating_1 room Child2&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 4.2 Child 2 (Window Sensor)&lt;br /&gt;
 define MAX_Child2_WindowSensor MAX ShutterContact 053fce&lt;br /&gt;
 attr MAX_Child2_WindowSensor room Child2&lt;br /&gt;
 define FileLog_MAX_Child2_WindowSensor FileLog ./log/MAX_Child2_WindowSensor-%Y.log MAX_Child2_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Child2_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Child2_WindowSensor room MAX &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 4.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child2_WindowSensor associate MAX_Child2_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child2_Heating associate MAX_Child2_WindowSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child2_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Wed 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17  Sat 17,06:00,21,20:00,17 Sun 17,06:00,21,20:00,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Child2_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Child2_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Child2_Heating userReadings watchShutter { return &amp;quot;MAX_Child2_WindowSensor&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Child2_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 5.1 Kitchen (Heating Thermostat)&lt;br /&gt;
 define MAX_Kitchen_Heating MAX HeatingThermostat 06546c&lt;br /&gt;
 attr MAX_Kitchen_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Kitchen_Heating room Kitchen&lt;br /&gt;
 attr MAX_Kitchen_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Kitchen_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Kitchen_Heating FileLog ./log/MAX_Kitchen_Heating-%Y.log MAX_Kitchen_Heating&lt;br /&gt;
 attr FileLog_MAX_Kitchen_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Kitchen_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Kitchen_Heating room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 5.2 Kitchen (Window Sensor)&lt;br /&gt;
 define MAX_Kitchen_WindowSensor MAX ShutterContact 0612ce&lt;br /&gt;
 attr MAX_Kitchen_WindowSensor room Kitchen&lt;br /&gt;
 define FileLog_MAX_Kitchen_WindowSensor FileLog ./log/MAX_Kitchen_WindowSensor-%Y.log MAX_Kitchen_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Kitchen_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Kitchen_WindowSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 5.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Kitchen_WindowSensor associate MAX_Kitchen_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Kitchen_Heating associate MAX_Kitchen_WindowSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Kitchen_Heating weekProfile Mon 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Tue 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Wed 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Thu 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Fri 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Sat 17,07:00,21,20:00,17 Sun 17,07:00,21,20:00,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Kitchen_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Kitchen_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Kitchen_Heating userReadings watchShutter { return &amp;quot;MAX_Kitchen_WindowSensor&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Kitchen_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 6.1 Livingroom (Heating Thermostats - Two)&lt;br /&gt;
 define MAX_Livingroom_Heating1 MAX HeatingThermostat 065531&lt;br /&gt;
 attr MAX_Livingroom_Heating1 room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_Heating1 FileLog ./log/MAX_Livingroom_Heating1-%Y.log MAX_Livingroom_Heating1&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating1 icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating1 logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating1 room MAX &lt;br /&gt;
 &lt;br /&gt;
 define MAX_Livingroom_Heating2 MAX HeatingThermostat 06563a&lt;br /&gt;
 attr MAX_Livingroom_Heating2 room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_Heating2 FileLog ./log/MAX_Livingroom_Heating2-%Y.log MAX_Livingroom_Heating2&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating2 icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating2 logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating2 room MAX &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 6.2 Livingroom (Window Sensors - Two)&lt;br /&gt;
 define MAX_Livingroom_WindowSensor_Balcony MAX ShutterContact 0618ce&lt;br /&gt;
 attr MAX_Livingroom_WindowSensor_Balcony room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_WindowSensor_Balcony FileLog ./log/MAX_Livingroom_WindowSensor_Balcony-%Y.log MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 attr FileLog_MAX_Livingroom_WindowSensor_Balcony logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_WindowSensor_Balcony room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 6.3 Livingroom (Wall Thermostat)&lt;br /&gt;
 define MAX_Livingroom_THSensor MAX WallMountedThermostat 01c93f&lt;br /&gt;
 attr MAX_Livingroom_THSensor MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Livingroom_THSensor room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_THSensor FileLog ./log/MAX_Livingroom_THSensor-%Y.log MAX_Livingroom_THSensor&lt;br /&gt;
 attr FileLog_MAX_Livingroom_THSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_THSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 6.4 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_WindowSensor_Balcony associate MAX_Livingroom_Heating1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_Heating1 associate MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_WindowSensor_Balcony associate MAX_Livingroom_Heating2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_Heating2 associate MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_WindowSensor_Balcony associate MAX_Livingroom_THSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_THSensor associate MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_THSensor associate MAX_Livingroom_Heating1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_Heating1 associate MAX_Livingroom_THSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_THSensor associate MAX_Livingroom_Heating2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_Heating2 associate MAX_Livingroom_THSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_THSensor weekProfile Mon 17,05:00,19,06:00,22,07:15,21,22:30,17 Tue 17,05:00,19,06:00,22,07:15,21,22:30,17 Wed 17,05:00,19,06:00,22,07:15,21,22:30,17 Thu 17,05:00,19,06:00,22,07:15,21,22:30,17 Fri 17,05:00,19,06:00,22,07:15,21,22:30,17 Sat 17,06:00,21,22:30,17 Sun 17,06:00,21,22:30,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_Heating1 scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_Heating2 scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_Heating1 userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_Heating1 userReadings watchShutter { return &amp;quot;MAX_Livingroom_WindowSensor_Balcony&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_Heating2 userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_Heating2 userReadings watchShutter { return &amp;quot;MAX_Livingroom_WindowSensor_Balcony&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_THSensor userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Livingroom_THSensor scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_Heating1 windowOpenTemperature 5.5&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_Heating2 windowOpenTemperature 5.5&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Livingroom_THSensor windowOpenTemperature 5.5 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 7.1 Toilette (Heating Thermostat)&lt;br /&gt;
 define MAX_Toilette_Heating MAX HeatingThermostat 06b990&lt;br /&gt;
 attr MAX_Toilette_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Toilette_Heating room Toilette&lt;br /&gt;
 attr MAX_Toilette_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Toilette_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Toilette_Heating FileLog ./log/MAX_Toilette_Heating-%Y.log MAX_Toilette_Heating&lt;br /&gt;
 attr FileLog_MAX_Toilette_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Toilette_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Toilette_Heating room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 7.2 Toilette (Window Sensor)&lt;br /&gt;
 define MAX_Toilette_WindowSensor MAX ShutterContact 053d50&lt;br /&gt;
 attr MAX_Toilette_WindowSensor room Toilette&lt;br /&gt;
 define FileLog_MAX_Toilette_WindowSensor FileLog ./log/MAX_Toilette_WindowSensor-%Y.log MAX_Toilette_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Toilette_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Toilette_WindowSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 7.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Toilette_WindowSensor associate MAX_Toilette_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Toilette_Heating associate MAX_Toilette_WindowSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Toilette_Heating weekProfile Mon 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Tue 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Wed 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Thu 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Fri 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Sat 17,07:00,21,20:00,17 Sun 17,07:00,21,20:00,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Toilette_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Toilette_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Toilette_Heating userReadings watchShutter { return &amp;quot;MAX_Kitchen_WindowSensor&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Toilette_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 8.1 Working room (Heating Thermostat)&lt;br /&gt;
 define MAX_Working_Heating MAX HeatingThermostat 020551&lt;br /&gt;
 attr MAX_Working_Heating room Workingroom&lt;br /&gt;
 attr MAX_Working_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Working_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Working_Heating FileLog ./log/MAX_Working_Heating-%Y.log MAX_Working_Heating&lt;br /&gt;
 attr FileLog_MAX_Working_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Working_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Working_Heating room MAX&lt;br /&gt;
 define SVG_FileLog_MAX_Working_Heating_1 SVG FileLog_MAX_Working_Heating:SVG_FileLog_MAX_Working_Heating_1:CURRENT&lt;br /&gt;
 attr SVG_FileLog_MAX_Working_Heating_1 room Workingroom&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 8.2 Working room (Window Sensor)&lt;br /&gt;
 define MAX_Working_WindowSensor MAX ShutterContact 06102b&lt;br /&gt;
 attr MAX_Working_WindowSensor room Workingroom&lt;br /&gt;
 define FileLog_MAX_Working_WindowSensor FileLog ./log/MAX_Working_WindowSensor-%Y.log MAX_Working_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Working_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Working_WindowSensor room MAX &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 8.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Activate Open Window detection&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Working_WindowSensor associate MAX_Working_Heating&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Working_Heating associate MAX_Working_WindowSensor&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define Week Profile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Working_Heating weekProfile Mon 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Wed 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17  Sat 17,06:00,21,09:00,19,16:00,21,20:00,17 Sun 17,06:00,21,09:00,19,16:00,21,20:00,17&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Temperatur Scanner (Graphical)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Working_Heating scanTemp 1&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Working_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; attr MAX_Working_Heating userReadings watchShutter { return &amp;quot;MAX_Working_WindowSensor&amp;quot;;;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; set MAX_Working_Heating windowOpenTemperature 5.5 &lt;br /&gt;
 &lt;br /&gt;
 define SVG_FileLog_MAX_Bedroom_Heating_1 SVG FileLog_MAX_Bedroom_Heating:SVG_FileLog_MAX_Bedroom_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Child1_Heating_1 SVG FileLog_MAX_Child1_Heating:SVG_FileLog_MAX_Child1_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Bedroom_Heating_2 SVG FileLog_MAX_Bedroom_Heating:SVG_FileLog_MAX_Bedroom_Heating_2:CURRENT &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;###&amp;lt;/nowiki&amp;gt; 9.1 ECO-Wallbutton&lt;br /&gt;
 define MAX_WallButton MAX PushButton 0521c4&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define House to control all Heaters at once&lt;br /&gt;
 define AllHeaters structure AllMyHeaters MAX_Child2_Heating MAX_Workingroom_Heating MAX_Child1_Heating MAX_Livingroom_THSensor MAX_Bedroom_Heating MAX_Toilette_Heating MAX_Kitchen_Heating  MAX_Bathroom_Heating&lt;br /&gt;
 attr AllHeaters room House&lt;br /&gt;
 attr AllHeaters webCmd desiredTemperature&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 define MAX_HouseECOHeating notify MAX_WallButton:(onoff).* { if ($EVTPART1 eq 0) { fhem(&amp;quot;set AllHeaters desiredTemperature eco&amp;quot;) &amp;amp;&amp;amp; Log(3,&amp;quot;===&amp;gt; ECO-Mode set&amp;quot;);;} else {  fhem(&amp;quot;set AllHeaters desiredTemperature auto&amp;quot;) &amp;amp;&amp;amp; Log(3,&amp;quot;===&amp;gt; AUTO-Mode set&amp;quot;);;}}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 define SVG_FileLog_MAX_Bathroom_Heating_1 SVG FileLog_MAX_Bathroom_Heating:SVG_FileLog_MAX_Bathroom_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Bedroom_Heating_3 SVG FileLog_MAX_Bedroom_Heating:SVG_FileLog_MAX_Bedroom_Heating_3:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Child1_Heating_2 SVG FileLog_MAX_Child1_Heating:SVG_FileLog_MAX_Child1_Heating_2:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Child2_Heating_2 SVG FileLog_MAX_Child2_Heating:SVG_FileLog_MAX_Child2_Heating_2:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Kitchen_Heating_1 SVG FileLog_MAX_Kitchen_Heating:SVG_FileLog_MAX_Kitchen_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Livingroom_THSensor_1 SVG FileLog_MAX_Livingroom_THSensor:SVG_FileLog_MAX_Livingroom_THSensor_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Toilette_Heating_1 SVG FileLog_MAX_Toilette_Heating:SVG_FileLog_MAX_Toilette_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Working_Heating_2 SVG FileLog_MAX_Working_Heating:SVG_FileLog_MAX_Working_Heating_2:CURRENT&lt;br /&gt;
&lt;br /&gt;
=== Planned changes ===&lt;br /&gt;
ADD ME&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MAX]]&lt;/div&gt;</summary>
		<author><name>GRZBRZ</name></author>
	</entry>
</feed>