<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/index.php?action=history&amp;feed=atom&amp;title=EBUS-ECMD</id>
	<title>EBUS-ECMD - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/index.php?action=history&amp;feed=atom&amp;title=EBUS-ECMD"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EBUS-ECMD&amp;action=history"/>
	<updated>2026-04-08T15:48:31Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in FHEMWiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EBUS-ECMD&amp;diff=29857&amp;oldid=prev</id>
		<title>Reinhart: ebus Konfiguration von ECMD zur besseren Übersicht ausgegliedert</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EBUS-ECMD&amp;diff=29857&amp;oldid=prev"/>
		<updated>2019-03-12T10:51:45Z</updated>

		<summary type="html">&lt;p&gt;ebus Konfiguration von ECMD zur besseren Übersicht ausgegliedert&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Ebus ECMD ==&lt;br /&gt;
Eine einfache aber sichere Anbindung des eBusd an FHEM kann mit [[ECMD]] durchgeführt werden. Es ist egal ob eBusd auf dem selben Raspberry wie FHEM läuft oder ein eigener Raspberry dafür verwendet wird. Die gezeigten Beispiele sind nur eine der Möglichkeiten die zum Ziel führen, sollen aber sicher und schnell zu den ersten Erfolgen führen.&lt;br /&gt;
&lt;br /&gt;
===ECMD in FHEM aktivieren===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# fhem.cfg&lt;br /&gt;
define EBUS ECMD telnet &amp;#039;&amp;#039;&amp;#039;ip-raspi-ebusd&amp;#039;&amp;#039;&amp;#039;:8888   # IP Adresse ebusd einsetzen!!!&lt;br /&gt;
attr EBUS classdefs bai00.class=/opt/fhem/FHEM/bai00.cfg&lt;br /&gt;
attr EBUS icon usb&lt;br /&gt;
attr EBUS requestSeparator 000&lt;br /&gt;
attr EBUS room Vaillant&lt;br /&gt;
&lt;br /&gt;
# Die Definition von ECMD, &amp;quot;ip-raspi-ebusd&amp;quot; muss durch die IP-Adresse ersetzt werden. Beispiel:&lt;br /&gt;
define EBUS ECMD telnet 192.168.0.10:8888&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Kommunikation erfolgt über Telnet und  8888 ist das Port über welches kommuniziert werden soll.&lt;br /&gt;
&lt;br /&gt;
===ECMD Devices definieren===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# fhem.cfg&lt;br /&gt;
define Vorlauf ECMDDevice bai00.class&lt;br /&gt;
attr Vorlauf IODev EBUS&lt;br /&gt;
attr Vorlauf group Vaillant&lt;br /&gt;
attr Vorlauf icon sani_supply_temp&lt;br /&gt;
attr Vorlauf room Vaillant&lt;br /&gt;
&lt;br /&gt;
define Ruecklauf ECMDDevice bai00.class&lt;br /&gt;
attr Ruecklauf IODev EBUS&lt;br /&gt;
attr Ruecklauf group Vaillant&lt;br /&gt;
attr Ruecklauf icon sani_return_temp&lt;br /&gt;
attr Ruecklauf room Vaillant&lt;br /&gt;
&lt;br /&gt;
define PumpeWatt ECMDDevice bai00.class&lt;br /&gt;
attr PumpeWatt IODev EBUS&lt;br /&gt;
attr PumpeWatt group Vaillant&lt;br /&gt;
attr PumpeWatt icon measure_power&lt;br /&gt;
attr PumpeWatt room Vaillant&lt;br /&gt;
&lt;br /&gt;
define Fanspeed ECMDDevice bai00.class&lt;br /&gt;
attr Fanspeed IODev EBUS&lt;br /&gt;
attr Fanspeed group Vaillant&lt;br /&gt;
attr Fanspeed icon vent_ventilation_level_automatic&lt;br /&gt;
attr Fanspeed room Vaillant&lt;br /&gt;
&lt;br /&gt;
define HKurve ECMDDevice bai00.class&lt;br /&gt;
attr HKurve IODev EBUS&lt;br /&gt;
attr HKurve group Vaillant&lt;br /&gt;
attr HKurve icon temp_control&lt;br /&gt;
attr HKurve room Vaillant&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Jeder Messwert der von eBusd abgefragt werden soll, muss dazu ein ECMDDevice erstellt werden. Hier ein paar Beispiele mit Vorlauf, Rücklauf, Leistung der Pumpe, Ventilatorgeschwindigkeit und der Heizkurve.&lt;br /&gt;
&lt;br /&gt;
[[Datei:EBUS_Daten_Heizung.png|thumb|left|alt=EBUS-USB Interface]]&lt;br /&gt;
Zu jedem ECMDDevice muss es eine Classdefinition in der bai00.cfg geben. Der Name &amp;quot;bai00.cfg&amp;quot; ist frei gewählt und wird in diesen Beispielen verwendet.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ECMD Classdefinition===&lt;br /&gt;
&lt;br /&gt;
Um eine Klasse zu definieren muss der dazu benötigte Code in eine eigene Datei (hier bai00.cfg) geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
################## bai00.cfg ###############&lt;br /&gt;
# &lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
# Aussentemperatur&lt;br /&gt;
get Aussentemp cmd {&amp;quot;r -f outsidetemp temp\n&amp;quot;}&lt;br /&gt;
get Aussentemp expect &amp;quot;.*\n*&amp;quot;&lt;br /&gt;
get Aussentemp postproc { $_ }&lt;br /&gt;
#&lt;br /&gt;
# vorlauftemperatur&lt;br /&gt;
get Vorlauf cmd {&amp;quot;r -m 10 status01 temp1.0\n&amp;quot;}&lt;br /&gt;
get Vorlauf expect &amp;quot;\d+\.\d+\n\n&amp;quot;&lt;br /&gt;
get Vorlauf postproc { sprintf(&amp;quot;%5.1f&amp;quot;,$_) }&lt;br /&gt;
#&lt;br /&gt;
# Ruecklauftemperatur&lt;br /&gt;
get Ruecklauf cmd {&amp;quot;r -m 10 status01 temp1.1\n&amp;quot;}&lt;br /&gt;
get Ruecklauf expect &amp;quot;\d+\.\d+\n\n&amp;quot;&lt;br /&gt;
get Ruecklauf postproc { sprintf(&amp;quot;%5.1f&amp;quot;,$_) }&lt;br /&gt;
#&lt;br /&gt;
# Pumpenleistung&lt;br /&gt;
get PumpeWatt cmd {&amp;quot;r -f PumpPower\n&amp;quot;}&lt;br /&gt;
get PumpeWatt expect &amp;quot;\d+\n\n&amp;quot;&lt;br /&gt;
get PumpeWatt postproc { sprintf(&amp;quot;%5.0f&amp;quot;,$_) }&lt;br /&gt;
#&lt;br /&gt;
# Fanspeed&lt;br /&gt;
get Fanspeed cmd {&amp;quot;r -f SDFanSpeed\n&amp;quot;}&lt;br /&gt;
get Fanspeed expect &amp;quot;\d+\n\n&amp;quot;&lt;br /&gt;
get Fanspeed postproc { sprintf(&amp;quot;%5.0f&amp;quot;,$_) }  &lt;br /&gt;
#&lt;br /&gt;
# Heizkurve lesen&lt;br /&gt;
get HKurve cmd {&amp;quot;r -f Hc1HeatCurve\n&amp;quot;}&lt;br /&gt;
get HKurve expect &amp;quot;\d+\.\d+\n&amp;quot;&lt;br /&gt;
get HKurve postproc { sprintf(&amp;quot;%3.1f&amp;quot;,$_) }&lt;br /&gt;
#&lt;br /&gt;
# HeizkurveSchreiben&lt;br /&gt;
get HeizkurveSchreiben cmd {&amp;quot;write 430 Hc1HeatCurve &amp;quot;.Value(&amp;quot;HeizkurveEinstellen&amp;quot;).&amp;quot;\n&amp;quot;}&lt;br /&gt;
get HeizkurveSchreiben expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get HeizkurveSchreiben postproc  { $_ } &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für jeden Device wird hier festgelegt wie die Befehls Syntax der Abfrage auszusehen hat (cmd) und wie die Ergebnisse zu filtern sind (expect), wie soll das Ausgabeformat sein (postproc). Diese Definitionen bitte in einer neuen Datei &amp;quot;bai00.cfg&amp;quot; speichern.&lt;br /&gt;
&lt;br /&gt;
===ECMD Zyklische Abfrage===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Abfrage Timersteuerung, fhem.cfg&lt;br /&gt;
define EBUS.Timer at +*00:15:00 get Aussentemp Aussentemp;;get Vorlauf Vorlauf;;get Ruecklauf Ruecklauf;;get PumpeWatt PumpeWatt;get Fanspeed Fanspeed;;get PumpeWatt PumpeWatt;;get HKurve HKurve&lt;br /&gt;
attr EBUS.Timer group VaillantControl&lt;br /&gt;
attr EBUS.Timer icon time_timer&lt;br /&gt;
attr EBUS.Timer room Vaillant&lt;br /&gt;
attr EBUS.Timer verbose 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Daten auch zyklisch vom eBus abholen zu können, wird ein Timer gesetzt. Hier wird alle 15 Minuten abgefragt.&lt;br /&gt;
Tipp: unwichtige Daten wie Druck oder irgendwelche Zähler definiert man in einem zweiten Timer, welcher dann zB. auf 1 Stunde getriggert wird. So wird die Häufigkeit des Zugriffs auf den eBus entlastet.&lt;br /&gt;
&lt;br /&gt;
===ECMD Solar, Warmwasser und Heizkreis===&lt;br /&gt;
&lt;br /&gt;
====ECMD Beispiel Solar====&lt;br /&gt;
Im nachfolgenden Beispiel wird der EBUS über das Modul ECMD angebunden und mit drei Klassen von Kommandos versehen. IP Adresse ist jene des Device wo der eBusd läuft. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
define EBUS ECMD telnet 192.168.0.192:8888&lt;br /&gt;
attr EBUS classdefs HK.SOL.class=/opt/fhem/FHEM/ebus_solar.cfg:HK.WW.class=/opt/fhem/FHEM/ebus_ww.cfg:HK.Hz.class=/opt/fhem/FHEM/ebus_hz.cfg&lt;br /&gt;
attr EBUS room System&lt;br /&gt;
#--&lt;br /&gt;
define HK.Hz ECMDDevice HK.Hz.class&lt;br /&gt;
attr HK.Hz IODev EBUS&lt;br /&gt;
attr HK.Hz group heating&lt;br /&gt;
attr HK.Hz room Verbrauch&lt;br /&gt;
#--&lt;br /&gt;
define HK.WW ECMDDevice HK.WW.class&lt;br /&gt;
attr HK.WW IODev EBUS&lt;br /&gt;
attr HK.WW group heating&lt;br /&gt;
attr HK.WW room Verbrauch&lt;br /&gt;
#--&lt;br /&gt;
define HK.SOL ECMDDevice HK.SOL.class&lt;br /&gt;
attr HK.SOL IODev EBUS&lt;br /&gt;
attr HK.SOL group solarGenerator&lt;br /&gt;
attr HK.SOL room Solaranlage&lt;br /&gt;
#--&lt;br /&gt;
# Diese drei Klassen werden als separate Files mit den in der EBUS-Definition stehenden Dateinamen &amp;#039;&amp;#039;ebus_hz.cfg&amp;#039;&amp;#039;, &amp;#039;&amp;#039;ebus_ww.cfg&amp;#039;&amp;#039; sowie &amp;#039;&amp;#039;ebus_solar.cfg&amp;#039;&amp;#039; angelegt. Alle drei ECMD-Devices werden nun zyklisch (z.B. jede Minute) abgefragt mit&lt;br /&gt;
define EBUS.Timer at +*00:01:00 get HK.Hz A.Temp;;get HK.Hz state;;get HK.WW state;;get HK.SOL state&lt;br /&gt;
attr EBUS.Timer group heatingControl&lt;br /&gt;
attr EBUS.Timer room Verbrauch&lt;br /&gt;
attr EBUS.Timer verbose 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ECMD Classdefinition Heizkreis====&lt;br /&gt;
Die erste Datei definiert die FHEM-Readings für die Abfrage von Außentemperatur und Heizkreis:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
# Außentemperatur&lt;br /&gt;
get A.Temp cmd {&amp;quot;cyc broad temp\n&amp;quot;}&lt;br /&gt;
get A.Temp expect &amp;quot;.*&amp;quot;&lt;br /&gt;
get A.Temp postproc { my $rval;\&lt;br /&gt;
 if(($_ eq &amp;quot;&amp;quot;)||($_ eq &amp;quot;no data stored&amp;quot;) ){\&lt;br /&gt;
   $rval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
 }else{\&lt;br /&gt;
   $rval=sprintf(&amp;quot;%5.2f °C&amp;quot;,$_);\&lt;br /&gt;
 }\&lt;br /&gt;
$rval; }&lt;br /&gt;
# Heizkeis HK1&lt;br /&gt;
get state cmd {&amp;quot;cyc mv HK1_temp\n&amp;quot;}&lt;br /&gt;
get state expect &amp;quot;.*&amp;quot;&lt;br /&gt;
get state postproc { my ($bval,$rval,$tval,$pval,$qval,$sval,$xval,$zval);\&lt;br /&gt;
my $hash  = $defs{&amp;quot;%NAME&amp;quot;};\&lt;br /&gt;
 if( ($_ eq &amp;quot;&amp;quot;)||($_ eq &amp;quot;no data stored&amp;quot;) ){\&lt;br /&gt;
    $bval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $rval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $tval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $pval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $qval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $sval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $xval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $zval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
 }else{\&lt;br /&gt;
    my @values=split(&amp;#039; &amp;#039;,$_);\&lt;br /&gt;
    if( $values[0] &amp;lt; 15 ){\&lt;br /&gt;
       $bval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $rval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $tval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $pval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $qval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $sval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $xval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $zval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    } else { \&lt;br /&gt;
       $bval = HzBedarf();\&lt;br /&gt;
       $rval = sprintf(&amp;quot;%5.2f °C&amp;quot;,$values[0]);\&lt;br /&gt;
       $tval = sprintf(&amp;quot;%5.2f °C&amp;quot;,$values[1]);\&lt;br /&gt;
       if( $values[2] == 0 ){\&lt;br /&gt;
          $pval = &amp;quot;OFF&amp;quot;;\&lt;br /&gt;
          $qval = &amp;quot;0 0&amp;quot;;\&lt;br /&gt;
       }elsif( $values[2] == 1 ){\&lt;br /&gt;
          $pval = &amp;quot;ON (HK)&amp;quot;;\&lt;br /&gt;
          $qval = &amp;quot;80 0&amp;quot;;\&lt;br /&gt;
       }elsif( $values[2] == 2 ){\&lt;br /&gt;
          $pval = &amp;quot;ON (WW)&amp;quot;;\&lt;br /&gt;
          $qval = &amp;quot;0 80&amp;quot;;\&lt;br /&gt;
       }else{\&lt;br /&gt;
          $pval = &amp;quot;unknown&amp;quot;;\&lt;br /&gt;
          $qval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       }\&lt;br /&gt;
       $sval = sprintf(&amp;quot;%d&amp;quot;,$values[2]);\&lt;br /&gt;
       $xval = sprintf(&amp;quot;%5.2f %5.2f %s %5.2f&amp;quot;,\&lt;br /&gt;
         $values[0],$values[1],$qval,$bval);\&lt;br /&gt;
       $zval = sprintf(&amp;quot;VL.T %5.2f °C, RL.T %5.2f °C, %s&amp;quot;,\&lt;br /&gt;
         $values[0],$values[1],$pval);\&lt;br /&gt;
    }\&lt;br /&gt;
  }\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;VL.T&amp;quot;, $rval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;RL.T&amp;quot;, $tval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Pumpe&amp;quot;, $pval, 1); \&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Pumpe.P&amp;quot;, $qval, 1); \&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Bedarf&amp;quot;, $bval, 1); \&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Status&amp;quot;, $sval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;reading&amp;quot;, $xval, 1);\&lt;br /&gt;
$zval; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ECMD Classdefinition Warmwasserkreis====&lt;br /&gt;
Die zweite Datei definiert die FHEM-Readings für den Warmwasserkreis:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
# Warmwasserkreis&lt;br /&gt;
get state cmd {&amp;quot;cyc broad getstatus_WW\n&amp;quot;}&lt;br /&gt;
get state expect &amp;quot;.*&amp;quot;&lt;br /&gt;
get state postproc { my ($rval,$tval,$bval,$pval,$xval,$zval);\&lt;br /&gt;
my $hash  = $defs{&amp;quot;%NAME&amp;quot;};\&lt;br /&gt;
 if( ($_ eq &amp;quot;&amp;quot;)||($_ eq &amp;quot;no data stored&amp;quot;) ){\&lt;br /&gt;
    $rval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $tval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $bval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $pval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $xval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $zval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
 }else{\&lt;br /&gt;
    my @values=split(&amp;#039; &amp;#039;,$_);\&lt;br /&gt;
    if( $values[1] &amp;lt; 15 ){\&lt;br /&gt;
       $rval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $tval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $bval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $pval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $xval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
       $zval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    }else {\&lt;br /&gt;
       $rval = sprintf(&amp;quot;%5.2f °C&amp;quot;,$values[0]);\&lt;br /&gt;
       $tval = sprintf(&amp;quot;%5.2f °C&amp;quot;,$values[1]);\&lt;br /&gt;
       $bval = ($values[2] == 80) ? &amp;quot;ON (WW)&amp;quot; : &amp;quot;OFF&amp;quot;;\&lt;br /&gt;
       $pval = ($values[3] == 1) ? &amp;quot;ON&amp;quot; : &amp;quot;OFF&amp;quot;;\&lt;br /&gt;
       $xval = sprintf(&amp;quot;%5.2f %5.2f %5.2f %d %d&amp;quot;,\&lt;br /&gt;
        $values[0],0.0,$values[1],$values[2],$values[3]);\&lt;br /&gt;
       $zval = sprintf(&amp;quot;SF1.T %5.2f °C, %s&amp;quot;,\&lt;br /&gt;
        $values[0],$pval);\&lt;br /&gt;
    }\&lt;br /&gt;
  }\&lt;br /&gt;
$zval; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ECMD Classdefinition Solarkreis====&lt;br /&gt;
Die dritte Datei definiert die FHEM-Readings für den Solarkreis:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
# Solarkreis&lt;br /&gt;
get state cmd {&amp;quot;cyc broad getstatus_SOL\n&amp;quot;}&lt;br /&gt;
get state expect &amp;quot;.*&amp;quot;&lt;br /&gt;
get state postproc { my ($rval,$pval,$qval,$lval,$yval,$xval,$zval);\&lt;br /&gt;
my $hash  = $defs{&amp;quot;%NAME&amp;quot;};\&lt;br /&gt;
 if( ($_ eq &amp;quot;&amp;quot;)||($_ eq &amp;quot;no data stored&amp;quot;) ){\&lt;br /&gt;
    $rval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $pval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $qval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $lval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $yval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $xval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
    $zval = &amp;quot;err&amp;quot;;\&lt;br /&gt;
 }else{\&lt;br /&gt;
    my @values=split(&amp;#039; &amp;#039;,$_);\&lt;br /&gt;
    $rval = sprintf(&amp;quot;%5.2f °C&amp;quot;,$values[0]);\&lt;br /&gt;
    $pval = ($values[1] == 1)?&amp;quot;ON&amp;quot;:&amp;quot;OFF&amp;quot;;\&lt;br /&gt;
    $qval = ($values[1] == 1)?65:0;\&lt;br /&gt;
    $lval = sprintf(&amp;quot;%5.2f %%&amp;quot;,$values[2]);\&lt;br /&gt;
    $yval = sprintf(&amp;quot;%d&amp;quot;,$values[3]);\&lt;br /&gt;
    $xval = sprintf(&amp;quot;%5.2f %d %5.2f %d&amp;quot;,\&lt;br /&gt;
      $values[0],$qval,$values[2],$values[3]);\&lt;br /&gt;
    $zval = sprintf(&amp;quot;Coll.T %5.2f °C, %s&amp;quot;,\&lt;br /&gt;
      $values[0],$pval);\&lt;br /&gt;
 }\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Coll.T&amp;quot;, $rval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Pumpe&amp;quot;, $pval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Pumpe.P&amp;quot;, $qval.&amp;quot; W&amp;quot;, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Load&amp;quot;,  $lval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;Yield&amp;quot;, $yval, 1);\&lt;br /&gt;
readingsSingleUpdate($hash, &amp;quot;reading&amp;quot;, $xval, 1);\&lt;br /&gt;
$zval; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ECMD Classdefinition Heizkurve===&lt;br /&gt;
&lt;br /&gt;
Diese Klassendefinition muss in der bai00.cfg gespeichert (angehängt) werden.&lt;br /&gt;
in diesem Beispiel wurde sie für die Vaillant Calormatic 430 definiert, bei einer Calormatic 470 muss der Text entsprechend geändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# HeizkurveSchreiben Calormatic 430, bai00.cfg&lt;br /&gt;
get HeizkurveSchreiben cmd {&amp;quot;write -c 430 Hc1HeatCurve &amp;quot;.Value(&amp;quot;HeizkurveEinstellen&amp;quot;).&amp;quot;\n&amp;quot;}&lt;br /&gt;
get HeizkurveSchreiben expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get HeizkurveSchreiben postproc  { $_ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heizkurve schreiben===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
#fhem.cfg&lt;br /&gt;
define HeizkurveEinstellen dummy&lt;br /&gt;
attr HeizkurveEinstellen group Heizkurve_Einstellen&lt;br /&gt;
attr HeizkurveEinstellen icon temp_control&lt;br /&gt;
attr HeizkurveEinstellen room Vaillant,Heizung&lt;br /&gt;
attr HeizkurveEinstellen setList state:0.20,0.40,0.50,0.60,0.70,0.80,0.90,1.00,1.10,1.20,1.30,1.40,1.50,1.60,1.70&lt;br /&gt;
attr HeizkurveEinstellen webCmd state&lt;br /&gt;
&lt;br /&gt;
define HeizkurveSchreiben_Click notify HeizkurveEinstellen {\&lt;br /&gt;
 fhem(&amp;quot;get HeizkurveSchreiben HeizkurveSchreiben&amp;quot;);;\&lt;br /&gt;
}&lt;br /&gt;
attr HeizkurveSchreiben_Click group heatingControl&lt;br /&gt;
attr HeizkurveSchreiben_Click room Vaillant&lt;br /&gt;
&lt;br /&gt;
define HeizkurveSchreiben ECMDDevice bai00.class&lt;br /&gt;
attr HeizkurveSchreiben IODev EBUS&lt;br /&gt;
attr HeizkurveSchreiben group Heizkurve_Einstellen&lt;br /&gt;
attr HeizkurveSchreiben room Vaillant&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Demo wie man via ECMD und eBus die Daten zurück in die Register der Therme (Calormatic) schreiben kann. Hier wird die Heizkurve verstellt.&lt;br /&gt;
Ein Dummy wird definiert und über eine setList werden die verschiedenen Kurven vorgegeben. Dank setList kann es zu keinen unerlaubten Eingaben kommen. Über den notify wird die Heizkurve dann schließlich gesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:EBUS_Heizkurve_Einstellen.png|thumb|left|alt=EBUS-USB Interface]]&lt;br /&gt;
Vorsicht: überlegt euch bitte gut was ihr zurück schreiben wollt, es kann unter Umständen gefährlich für eure Hardware oder Gesundheit werden (zB: Warmwasser auf über 60 Grad). Alles was hier durchgeführt wird, führt ihr auf eigene Verantwortung durch.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wochenprogramme===&lt;br /&gt;
Ein gerne benutztes Feature ist die Änderung der Zeitprogramme des Heizgerätes in FHEM. Die Visualisierung  ist etwas komplexer weil alles x 7 ist und hier Steuerzeichen beim Zusammensetzen des Sendestrings vorkommen die nicht direkt übergeben werden können. Einzelne Timer können damit nicht geschrieben werden, daher wird bei jeder Timereingabe der komplette String geschrieben. Der Einfachheit halber und wegen der Übersicht sind nur 2 Tagesprogramme (Timer) im Beispielcode vorgesehen (die Calormatic kann 3).&lt;br /&gt;
[[Datei:EBUS_Timerprogramme.png|thumb|left|alt=Wochentimer]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#####################&lt;br /&gt;
#  Timer-Programme  #&lt;br /&gt;
#####################&lt;br /&gt;
get Mo cmd {&amp;quot;r -f hc1Timer.Monday\n&amp;quot;}&lt;br /&gt;
get Mo expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get Mo postproc { Vaillant_Timer($_); }&lt;br /&gt;
get Di cmd {&amp;quot;r -f hc1Timer.Tuesday\n&amp;quot;}&lt;br /&gt;
get Di expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get Di postproc { Vaillant_Timer($_); }&lt;br /&gt;
get Mi cmd {&amp;quot;r -f hc1Timer.Wednesday\n&amp;quot;}&lt;br /&gt;
get Mi expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get Mi postproc { Vaillant_Timer($_); }&lt;br /&gt;
get Do cmd {&amp;quot;r -f hc1Timer.Thursday\n&amp;quot;}&lt;br /&gt;
get Do expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get Do postproc { Vaillant_Timer($_); }&lt;br /&gt;
get Fr cmd {&amp;quot;r -f hc1Timer.Friday\n&amp;quot;}&lt;br /&gt;
get Fr expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get Fr postproc { Vaillant_Timer($_); }&lt;br /&gt;
get Sa cmd {&amp;quot;r -f hc1Timer.Saturday\n&amp;quot;}&lt;br /&gt;
get Sa expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get Sa postproc { Vaillant_Timer($_); }&lt;br /&gt;
get So cmd {&amp;quot;r -f hc1Timer.Sunday\n&amp;quot;}&lt;br /&gt;
get So expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get So postproc { Vaillant_Timer($_); }&lt;br /&gt;
get ZeitfensterSchreibenMo cmd {&amp;quot;write -c 430 hc1Timer.Monday &amp;quot;.ReadingsVal(&amp;quot;TimeMo&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeMo&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeMo&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeMo&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenMo expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenMo postproc  { $_ }&lt;br /&gt;
get ZeitfensterSchreibenDi cmd {&amp;quot;write -c 430 hc1Timer.Tuesday &amp;quot;.ReadingsVal(&amp;quot;TimeDi&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeDi&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeDi&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeDi&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenDi expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenDi postproc  { $_ }&lt;br /&gt;
get ZeitfensterSchreibenMi cmd {&amp;quot;write -c 430 hc1Timer.Wednesday &amp;quot;.ReadingsVal(&amp;quot;TimeMi&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeMi&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeMi&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeMi&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenMi expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenMi postproc  { $_ }&lt;br /&gt;
get ZeitfensterSchreibenDo cmd {&amp;quot;write -c 430 hc1Timer.Thursday &amp;quot;.ReadingsVal(&amp;quot;TimeDo&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeDo&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeDo&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeDo&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenDo expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenDo postproc  { $_ }&lt;br /&gt;
get ZeitfensterSchreibenFr cmd {&amp;quot;write -c 430 hc1Timer.Friday &amp;quot;.ReadingsVal(&amp;quot;TimeFr&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeFr&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeFr&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeFr&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenFr expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenFr postproc  { $_ }&lt;br /&gt;
get ZeitfensterSchreibenSa cmd {&amp;quot;write -c 430 hc1Timer.Saturday &amp;quot;.ReadingsVal(&amp;quot;TimeSa&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeSa&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeSa&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeSa&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenSa expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenSa postproc  { $_ }&lt;br /&gt;
get ZeitfensterSchreibenSo cmd {&amp;quot;write -c 430 hc1Timer.Sunday &amp;quot;.ReadingsVal(&amp;quot;TimeSo&amp;quot;,&amp;quot;HHMM1&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeSo&amp;quot;,&amp;quot;HHMM2&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeSo&amp;quot;,&amp;quot;HHMM3&amp;quot;,0) . chr(59) . ReadingsVal(&amp;quot;TimeSo&amp;quot;,&amp;quot;HHMM4&amp;quot;,0) . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;24:00&amp;quot; . chr(59) . &amp;quot;selected\n&amp;quot;}&lt;br /&gt;
get ZeitfensterSchreibenSo expect &amp;quot;.*\n\n&amp;quot;&lt;br /&gt;
get ZeitfensterSchreibenSo postproc  { $_ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel ist für eine Vaillant Calormatic 430, bei einer Calormatic 470 müssen die entsprechenden Zeilen angepasst werden (write -c 430....) .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#########################################################&lt;br /&gt;
#&lt;br /&gt;
#                      Vaillant_Timer&lt;br /&gt;
# Datenstring = 03:30;19:30;20:00;20:00;20:00;20:00;Mo-Fr&lt;br /&gt;
#########################################################&lt;br /&gt;
# 99_myUtils.pm&lt;br /&gt;
sub Vaillant_Timer($)&lt;br /&gt;
{&lt;br /&gt;
 my @values=split(/[; ]/,$_);&lt;br /&gt;
 #-- suppress leading zero ?&lt;br /&gt;
 for(my $i=0;$i&amp;lt;7;$i++){ &lt;br /&gt;
   $values[$i]=~s/^0//;&lt;br /&gt;
 }&lt;br /&gt;
 my $sval=sprintf(&amp;quot;%s-%s&amp;quot;,$values[0],$values[1]);&lt;br /&gt;
 $sval  .=sprintf(&amp;quot;, %s-%s&amp;quot;,$values[2],$values[3])&lt;br /&gt;
   if($values[2] ne $values[3]);&lt;br /&gt;
 $sval  .=sprintf(&amp;quot;, %s-%s&amp;quot;,$values[4],$values[5])&lt;br /&gt;
   if($values[4] ne $values[5]);&lt;br /&gt;
 return $sval;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oben gezeigtes Beispiel benötigt den Vaillant_Timer (von Prof. Peter Henning). Dieser Code muss in die 99_myUtils.pm gespeichert werden. Unter diesem {{Link2Forum|Topic=41064|Message=336911|LinkText=Link}} gibt es weiterreichende Informationen zu diesem Thema.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>Reinhart</name></author>
	</entry>
</feed>