<?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=Heating_Control_Basic</id>
	<title>Heating Control Basic - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/index.php?action=history&amp;feed=atom&amp;title=Heating_Control_Basic"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;action=history"/>
	<updated>2026-05-16T10:54:53Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in FHEMWiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;diff=12936&amp;oldid=prev</id>
		<title>Markusbloch: @@ =&gt; @</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;diff=12936&amp;oldid=prev"/>
		<updated>2015-11-17T23:02:07Z</updated>

		<summary type="html">&lt;p&gt;@@ =&amp;gt; @&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 18. November 2015, 01:02 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l37&quot;&gt;Zeile 37:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 37:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This means that in the end, &amp;lt;code&amp;gt;$burner_state&amp;lt;/code&amp;gt; will be either &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; instead of&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This means that in the end, &amp;lt;code&amp;gt;$burner_state&amp;lt;/code&amp;gt; will be either &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; instead of&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt;my &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;@&lt;/del&gt;@fhts=devspec2array(&quot;TYPE=FHT&quot;);;\&amp;lt;/nowiki&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt;my @fhts=devspec2array(&quot;TYPE=FHT&quot;);;\&amp;lt;/nowiki&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here we create an array of all the device parameters. FHEM has a built-in function called &amp;lt;code&amp;gt;devspec2array&amp;lt;/code&amp;gt; which makes this easy. The only argument we pass is &amp;lt;code&amp;gt;TYPE=FHT&amp;lt;/code&amp;gt; which restricts the returned array to only contain FHT devices.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here we create an array of all the device parameters. FHEM has a built-in function called &amp;lt;code&amp;gt;devspec2array&amp;lt;/code&amp;gt; which makes this easy. The only argument we pass is &amp;lt;code&amp;gt;TYPE=FHT&amp;lt;/code&amp;gt; which restricts the returned array to only contain FHT devices.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt;foreach(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;@&lt;/del&gt;@fhts) {\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt;foreach(@fhts) {\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   my $actuator=ReadingsVal($_, &amp;quot;actuator&amp;quot;, &amp;quot;101%&amp;quot;);;\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   my $actuator=ReadingsVal($_, &amp;quot;actuator&amp;quot;, &amp;quot;101%&amp;quot;);;\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   $actuator=(substr($actuator, 0, (length($actuator)-1)));;\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   $actuator=(substr($actuator, 0, (length($actuator)-1)));;\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l66&quot;&gt;Zeile 66:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 66:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt;else {\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt;else {\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   if ($idle_actuators == &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;@&lt;/del&gt;@fhts) {\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   if ($idle_actuators == @fhts) {\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    Log(3,&amp;quot;No (more) heating needed. Previous burner status: &amp;quot; . $burner_state);;\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    Log(3,&amp;quot;No (more) heating needed. Previous burner status: &amp;quot; . $burner_state);;\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    fhem(&amp;quot;set heater off&amp;quot;) if ($burner_state == 11)\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    fhem(&amp;quot;set heater off&amp;quot;) if ($burner_state == 11)\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    else {\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    else {\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    Log(3,&quot;Heating request: &quot; . $idle_actuators . &quot; of &quot; . &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;@&lt;/del&gt;@fhts . &quot; actuators are idle.&quot;)\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    Log(3,&quot;Heating request: &quot; . $idle_actuators . &quot; of &quot; . @fhts . &quot; actuators are idle.&quot;)\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   }\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   }\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  }\&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  }\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key c1fhemwiki:diff:1.41:old-1529:rev-12936:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Markusbloch</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;diff=1529&amp;oldid=prev</id>
		<title>Markusbloch am 11. Mai 2013 um 18:56 Uhr</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;diff=1529&amp;oldid=prev"/>
		<updated>2013-05-11T18:56:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 11. Mai 2013, 20:56 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l89&quot;&gt;Zeile 89:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 89:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here&amp;#039;s an example of the script turning the heater on and off. You can nicely see the oscillations of the temperature in the three rooms.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here&amp;#039;s an example of the script turning the heater on and off. You can nicely see the oscillations of the temperature in the three rooms.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[File:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/w/images/4/4e/&lt;/del&gt;Fhem_heating_example.png|822px&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|link=/wiki/Datei&lt;/del&gt;:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Fhem_heating_example.png|alt=Fhem heating example.png&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[File:Fhem_heating_example.png|822px&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategorie&lt;/ins&gt;:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Examples&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key c1fhemwiki:diff:1.41:old-963:rev-1529:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Markusbloch</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;diff=963&amp;oldid=prev</id>
		<title>Generix: Die Seite wurde neu angelegt: „Die Deutsche Version ist hier verfügbar: Heizungskontrolle Einfach  The aim of this project is to control a central heating system using FHEM. The main co…“</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Heating_Control_Basic&amp;diff=963&amp;oldid=prev"/>
		<updated>2013-05-10T20:29:59Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „Die Deutsche Version ist hier verfügbar: &lt;a href=&quot;/wiki/Heizungskontrolle_Einfach&quot; title=&quot;Heizungskontrolle Einfach&quot;&gt;Heizungskontrolle Einfach&lt;/a&gt;  The aim of this project is to control a central heating system using FHEM. The main co…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Die Deutsche Version ist hier verfügbar: [[Heizungskontrolle Einfach]]&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to control a central heating system using FHEM. The main contribution for the solution described below is from a [http://groups.google.com/group/fhem-users/msg/bf43f2c7374cb9b7 forum post] by borsti. The heating logic is to switch on heating if one or more radiators are open and switch off heating when all of them are closed.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
The system is composed of the following components:&lt;br /&gt;
&lt;br /&gt;
* A central heater with a thermostat input.&lt;br /&gt;
* A server with FHEM installed.&lt;br /&gt;
* CUL USB stick connected to the server.&lt;br /&gt;
* FS20 AS1 radio-controlled switch connected to the thermostat input of the heater.&lt;br /&gt;
* 3x FHT80b thermostats for 3 rooms.&lt;br /&gt;
* As many FHT8V as there are radiators in the 3 rooms above.&lt;br /&gt;
== FHEM Configuration ==&lt;br /&gt;
Once the hardware set up and FHEM running as described in the manuals, we can start configuring the heating system. The rest of the article describes the contents of the &amp;lt;code&amp;gt;fhem.cfg&amp;lt;/code&amp;gt; file step by step. The file can be easily edited from withing FHEM.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define CUL1 CUL /dev/CUL@9600 5643&lt;br /&gt;
define room1 FHT 5030&lt;br /&gt;
define room2 FHT 235d&lt;br /&gt;
define room3 FHT 2d28&lt;br /&gt;
define heater FS20 5643 53&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The configuration starts with the definition of the hardware components. The CUL is defined first, then the different FHT80b thermostats each with their house codes (which will be different in your installation of course). We then set the &amp;lt;code&amp;gt;retrycount&amp;lt;/code&amp;gt; which defines how many times FHEM will try to send commands to the FHT. In the last line we define the FS20 AS1 that is hooked up to the central heater.&lt;br /&gt;
Note that we don&amp;#039;t have to define the actual motors (actuators) mounted on the radiator. These are controlled by the FHT thermostats and FHEM does not need to interfere.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define n_heater notify n_heater {\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
This line defines a new notify called &amp;lt;code&amp;gt;n_heater&amp;lt;/code&amp;gt; which will hold the code. This basically represents a macro which we can later run whenever we want, using a single command. From now on we are using normal Perl commands. Since the code is embedded in an FHEM command, some special characters need to be repeated (i.e. &amp;lt;code&amp;gt;;;&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; and adding a &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; to the end of all lines). Check the [http://fhem.de/commandref.html#perl reference manual] for more information about using Perl inside FHEM scripts.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;my $need_heat=0;;\&lt;br /&gt;
  my $idle_actuators=0;;\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Here we are defining two variables which we will use to track whether one of the FHT wants to heat and how many FHT agree not to heat.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;my $burner_state=$fs20_c2b{ReadingsVal(&amp;quot;heater&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;off&amp;quot;)};;\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
We define another variable representing the current state of the heater. &amp;lt;code&amp;gt;ReadingsVal&amp;lt;/code&amp;gt; is a function with three arguments: Device name (&amp;lt;code&amp;gt;heater&amp;lt;/code&amp;gt;), reading (&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;) and default value which will be used if no other value is found (&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
The function will return either &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Because programming with text strings is cumbersome, we want to use codes instead. The array &amp;lt;code&amp;gt;fs20_c2b&amp;lt;/code&amp;gt; is filled with text string of FS20 devices and their corresponding code. By using &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; as keys, we can look up the codes that corresponds to the text.&lt;br /&gt;
&lt;br /&gt;
This means that in the end, &amp;lt;code&amp;gt;$burner_state&amp;lt;/code&amp;gt; will be either &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; instead of&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;my @@fhts=devspec2array(&amp;quot;TYPE=FHT&amp;quot;);;\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Here we create an array of all the device parameters. FHEM has a built-in function called &amp;lt;code&amp;gt;devspec2array&amp;lt;/code&amp;gt; which makes this easy. The only argument we pass is &amp;lt;code&amp;gt;TYPE=FHT&amp;lt;/code&amp;gt; which restricts the returned array to only contain FHT devices.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;foreach(@@fhts) {\&lt;br /&gt;
  my $actuator=ReadingsVal($_, &amp;quot;actuator&amp;quot;, &amp;quot;101%&amp;quot;);;\&lt;br /&gt;
  $actuator=(substr($actuator, 0, (length($actuator)-1)));;\&lt;br /&gt;
  if ($actuator &amp;amp;gt; 50) {\&lt;br /&gt;
   $need_heat=1\&lt;br /&gt;
  }\&lt;br /&gt;
  if ($actuator &amp;amp;lt; 20) {\&lt;br /&gt;
   $idle_actuators++\&lt;br /&gt;
  }\&lt;br /&gt;
 }\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
This is the loop where we check all FHT for their actuator settings. The for-construct loops through the array we created earlier (&amp;lt;code&amp;gt;@fhts&amp;lt;/code&amp;gt;). For each of them we read the actuator setting using &amp;lt;code&amp;gt;ReadingsVal&amp;lt;/code&amp;gt; as described above. The first parameter &amp;lt;code&amp;gt;$_&amp;lt;/code&amp;gt; is a placeholder for the variable that is looped, in our case the FHT device we&amp;#039;re currently checking.&lt;br /&gt;
Since the acutator value is already numeric, we don&amp;#039;t need the &amp;lt;code&amp;gt;$fs20_c2b&amp;lt;/code&amp;gt; but can directly continue with the check. We do have to get rid of the percentage sign though e.g. transform &amp;lt;code&amp;gt;10%&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;. For this we use the &amp;lt;code&amp;gt;substr&amp;lt;/code&amp;gt; function to extract a string starting from position 0 to the second but last character (length - 1) of the orginial string. Effectively this chops off the last character, leaving only the number.&lt;br /&gt;
&lt;br /&gt;
Next, we check whether the actuator value is bigger than 50 (i.e. the radiators are more than 50% open). If this is the case, the variable &amp;lt;code&amp;gt;$need_heat&amp;lt;/code&amp;gt; is set to 1.&lt;br /&gt;
&lt;br /&gt;
If the actuator is below 20, we increment the &amp;lt;code&amp;gt;$idle_actuators&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
Effectively this means that at the end of the for loop, &amp;lt;code&amp;gt;$need_heat&amp;lt;/code&amp;gt; will be 1 if &amp;lt;u&amp;gt;any&amp;lt;/u&amp;gt; of the FHT needs heat, and &amp;lt;code&amp;gt;$idle_actuators&amp;lt;/code&amp;gt; will contain the number of FHT that don&amp;#039;t need heat anymore.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if ($need_heat&amp;amp;#160;!= 0) {\&lt;br /&gt;
  Log(3,&amp;quot;Heating needed. Previous burner status: &amp;quot; . $burner_state);;\&lt;br /&gt;
  fhem(&amp;quot;set heater on&amp;quot;) if ($burner_state == 00)\&lt;br /&gt;
 }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Now we&amp;#039;re ready for action. If we decided above that heating is needed, we write a short message to the log file indicating the previous state of the heater. The first argument of the &amp;lt;code&amp;gt;Log&amp;lt;/code&amp;gt; function is the level. Important messages have level 1, less important ones have higher levels. The second argument is the text to print, in our case a static sentence followed by the heater state that we saved before.&lt;br /&gt;
The actual order to FHEM is sent using the &amp;lt;code&amp;gt;fhem&amp;lt;/code&amp;gt; function. This allows to use normal FHEM commands such as &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; etc. Here, we simply set the FS20 device &amp;lt;code&amp;gt;heater&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;. This is only done if the heater was previously off.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;else {\&lt;br /&gt;
  if ($idle_actuators == @@fhts) {\&lt;br /&gt;
   Log(3,&amp;quot;No (more) heating needed. Previous burner status: &amp;quot; . $burner_state);;\&lt;br /&gt;
   fhem(&amp;quot;set heater off&amp;quot;) if ($burner_state == 11)\&lt;br /&gt;
  }&lt;br /&gt;
   else {\&lt;br /&gt;
   Log(3,&amp;quot;Heating request: &amp;quot; . $idle_actuators . &amp;quot; of &amp;quot; . @@fhts . &amp;quot; actuators are idle.&amp;quot;)\&lt;br /&gt;
  }\&lt;br /&gt;
 }\&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
This last block is executed if there was no need to switch on the heater. At this moment we have to check whether or not we want to switch it off. For this we use the number of FHT that indicated not needing any heat and compare it to the total number of FHT devices (&amp;lt;code&amp;gt;@fhts&amp;lt;/code&amp;gt; is the array of FHT devices, using it simply like this will return the size of the array, which is what we need).&lt;br /&gt;
If the numbers are equal this means that all FHT agree to switch off the heater. We print some log message again and then switch off the FS20 device, but again only if it was previously switched on.&lt;br /&gt;
&lt;br /&gt;
The only case remaining now is when the heater should stay unchanged. We capture this with a last else statement and print a log message indicating the current vote for switching off the heater.&lt;br /&gt;
&lt;br /&gt;
This concludes the &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; and we can now use it either by typing &amp;lt;code&amp;gt;trigger n_heater&amp;lt;/code&amp;gt; into the command box or as part of a scheduled command. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define a_heater at +*00:10:00 trigger n_heater&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To schedule the command every 10 minutes we define an &amp;lt;code&amp;gt;at&amp;lt;/code&amp;gt; structure called &amp;lt;code&amp;gt;a_heater&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; indicates that is should happen in 10 minutes (as opposed to 10 past midnight) and the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; means that it is to be repeated.&lt;br /&gt;
Effectively this will result in our macro defined above being executed every 10 minutes. This also defines the minimal time the heater will be turned on. While more frequent executions would improve the reactivity it is probably not a good idea to switch the heater on and off too frequently.&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
Here&amp;#039;s an example of the script turning the heater on and off. You can nicely see the oscillations of the temperature in the three rooms.&lt;br /&gt;
&lt;br /&gt;
[[File:/w/images/4/4e/Fhem_heating_example.png|822px|link=/wiki/Datei:Fhem_heating_example.png|alt=Fhem heating example.png]]&lt;/div&gt;</summary>
		<author><name>Generix</name></author>
	</entry>
</feed>