MAX: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Added to Kategorie:Heizungsventile.)
Keine Bearbeitungszusammenfassung
 
(32 dazwischenliegende Versionen von 14 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
MAX! ist eine Heizungssteuerung, die die Raumtemperatur durch funkvernetzte Heizkörperthermostate an den Heizkörpern regelt. MAX! stellt eine Alternative zur FHT und HomeMatic Heizungsteuerung dar.
'''MAX!''' ist eine Heizungssteuerung, die die Raumtemperatur durch funkvernetzte Heizkörperthermostate an den Heizkörpern regelt. MAX! stellt eine Alternative zur [[:Kategorie:FHT Components|FHT]] und [[HomeMatic]] Heizungsteuerung dar.
 
== Features ==
== Features ==
* Bidirektionale Kommuniktion (jeder Befehl wird mit ACK quittiert)
* Bidirektionale Kommuniktion (jeder Befehl wird mit ACK quittiert)
* Heizkörperthermostate übertragen auch die gemessene Temperatur
* Heizkörperthermostate übertragen auch die gemessene Temperatur
== FHEM Module ==
== FHEM Module ==
Die MAX Komponenten können über den MAX!Cube per Modul 00_MAXLAN,
Die MAX Komponenten können über den MAX!Cube per Modul 00_MAXLAN oder über einen [[CUL]] oder [[CUNO]] per 14_CUL_MAX gesteuert werden. In beiden Fällen werden die einzelnen MAX! Geräte vom Modul 10_MAX
oder über einen [[CUL]] oder [[CUNO]] per 14_CUL_MAX gesteuert werden.
bereitgestellt. Alternativ kann man nach {{Link2Forum|Topic=38404}} einen MAX!CUBE als CUNO umflashen.
In beiden Fällen werden die einzelnen MAX! Geräte vom Modul 10_MAX
bereitgestellt.


Nachteil vom Cube ist, dass man ein Polling machen muss, um zu sehen ob sich der Status eines Gerätes geändert hat. Z.B.
Nachteil vom Cube ist, dass man ein Polling machen muss, um zu sehen ob sich der Status eines Gerätes geändert hat. Z.B. checkt man das alle 30 Sekunden. Dann sieht man aber auch Änderungen möglicherweise erst nach 30 Sekunden. Beim CUL sieht man die Funknachrichten direkt. Es wird aber auch ein Kombimodus unterstützt, in welchem man alles über den MAXLAN steuert, der CUL_MAX aber für zeitnahe Benachrichtigungen sorgt.
checkt man das alle 30 Sekunden. Dann sieht man aber auch Änderungen möglicherweise erst nach 30 Sekunden.
Beim CUL sieht man die Funknachrichten direkt.
Es wird aber auch ein Kombimodus unterstützt, in welchem man alles über den MAXLAN steuert,
der CUL_MAX aber für zeitnahe Benachrichtigungen sorgt.


== Komponenten ==
== Komponenten ==
=== Limit ===
=== Limit ===
* Auf 8 Thermostate pro Raum beschränkt
* Auf 8 Thermostate pro Raum beschränkt
* Limit mit Cube liegt bei ca. 140 Geräten. Durch die [[1% Regel]]ung dürften es aber in der Praxis weniger sein
* Limit mit Cube liegt bei ca. 140 Geräten. Durch die [[1% Regel]] dürften es aber in der Praxis weniger sein


=== Heizkörperthermostate ===
=== Heizkörperthermostate ===
Zeile 30: Zeile 26:


* der gemessenen Temperatur. (Hinweis: Wird bei Verwendung des MAX CUBE nicht regelmäßig aktualisiert)
* der gemessenen Temperatur. (Hinweis: Wird bei Verwendung des MAX CUBE nicht regelmäßig aktualisiert)
=== Fensterkontakte ===
=== Fensterkontakte ===
Der aktuelle Status (offen/geschlossen) wird (praktisch ohne Verzögerung) angezeigt. '''[[Nur bei CUL, oder?]]'''
Der aktuelle Status (offen/geschlossen) wird (praktisch ohne Verzögerung) angezeigt.


Falls wir nicht mit Ack antworten, wird er mehrmals wiederholt.
Falls wir nicht mit Ack antworten, wird er mehrmals wiederholt.


Die Fensterkontakte können zusätzlich direkt an mehrere Heizkörperthermostate angelernt werden,
Die Fensterkontakte können zusätzlich direkt an mehrere Heizkörperthermostate angelernt werden, und versetzen diese dann automatisch in windowOpenTemperature während sie geöffnet sind.
und versetzen diese dann automatisch in windowOpenTemperature während sie geöffnet sind.


Wenn der Fensterkontakt an mindestens ein Heizkörperthermostat angelernt ist, dann sendet er zusätzlich stündlich seinen aktuellen Zustand.
Wenn der Fensterkontakt an mindestens ein Heizkörperthermostat angelernt ist, dann sendet er zusätzlich stündlich seinen aktuellen Zustand.
Zeile 62: Zeile 58:


* der gemessenen Temperatur.
* der gemessenen Temperatur.
=== Eco-Taster ===
=== Eco-Taster ===
'''Achtung''': Zumindest über MAXLAN lässt sich der Zustand weder auslesen, noch wird
'''Achtung''': Zumindest über MAXLAN lässt sich der Zustand weder auslesen, noch wird man über Veränderungen informiert.
man über Veränderungen informiert.<br /><br />
 
Per CUL_MAX funktioniert der Eco-Taster problemlos.
Per CUL_MAX funktioniert der Eco-Taster problemlos.


==== Beispielhafte Definition ====
==== Beispielhafte Definition ====
define BUTTON.EG MAX PushButton 069d33
:<code>define BUTTON.EG MAX PushButton 069d33</code>


==== Beispielhafte Event-Ausgabe ====
==== Beispielhafte Event-Ausgabe ====
Zeile 88: Zeile 84:


== Anlernen per CUL ==
== Anlernen per CUL ==
Das Anlernen funktioniert nur mit zurückgesetzen (Werksreset, also entweder alle 3 Tasten am Heizkörperthermostate betätigen, Batterien einlegen, Anzeige rES; oder in FHEM set factoryReset) Heizkörperthermostaten. Bereits an einen Cube angelernte Heizungsregler können NICHT an ein CUL angemeldet werden, hier ist dann nur das "mitlesen" der Funkbotschaften möglich.
Das Anlernen funktioniert nur mit zurückgesetzten (Werksreset, also entweder alle 3 Tasten am Heizkörperthermostat betätigen, Batterien einlegen, Anzeige rES; oder in FHEM set factoryReset) Heizkörperthermostaten. Bereits an einen Cube angelernte Heizungsregler können '''nicht''' an ein CUL angemeldet werden, hier ist dann nur das "mitlesen" der Funkbotschaften möglich.
Info: Durch den Reset geht auch ein evtl. per Cube eingestelltes Automatikprogramm verloren.
Info: Durch den Reset geht auch ein evtl. per Cube eingestelltes Automatikprogramm verloren.


== Konfiguration ==
== Konfiguration ==
Siehe [http://fhem.de/commandref.html#CUL_MAX CUL_MAX].
Siehe {{Link2CmdRef|Anker=CUL_MAX}}.


Die Module sind so konzipiert, dass man die offizielle Max! Software nicht benutzen muss. Man kann alles aus FHEM heraus machen.
Die Module sind so konzipiert, dass man die offizielle Max! Software nicht benutzen muss. Man kann alles aus FHEM heraus machen. Nachdem das MAXLAN oder CUL_MAX Modul konfiguriert wurden (siehe unten), werden bereits gepairte Geräte automatisch erkannt.
Nachdem das MAXLAN oder CUL_MAX Modul konfiguriert wurden (siehe unten), werden bereits gepairte Geräte automatisch erkannt.


=== MAXLAN ===
=== MAXLAN ===
Minimale Konfiguration:
Minimale Konfiguration:
 
:<code>define ml MAXLAN 192.168.178.2</code>
<nowiki>define ml MAXLAN 192.168.178.2</nowiki>
wobei 192.168.178.2 die IP des MAX! Cube ist. Das MAXLAN-Modul findet selbstständig bereits gepairte Geräte und trägt diese in die Konfigurationsdatei fhem.cfg ein. Diese können dann im WEB-Interface mittels „alias“ einen eindeutigen Namen bekommen.
wobei 192.168.178.2 die IP des MAX! Cube ist. Das MAXLAN-Modul findet selbstständig bereits gepairte Geräte und trägt diese in die Konfigurationsdatei fhem.cfg ein. Diese können dann im WEB-Interface mittels „alias“ einen eindeutigen Namen bekommen.


Zeile 109: Zeile 104:
  attr CUL0 rfmode MAX
  attr CUL0 rfmode MAX
  define cm CUL_MAX 123456</nowiki>
  define cm CUL_MAX 123456</nowiki>
=== Anlernen ===
=== Anlernen ===
Dazu muss der "pairmode" auf MAXLAN/CUL_MAX per
Dazu muss der "pairmode" auf MAXLAN mit
 
:<code>set ml pairmode</code>
<nowiki>set cm/ml pairmode</nowiki>
bzw. bei CUL_MAX mit
oder über das Web-Interface aktiviert werden. Falls kein Parameter angegeben wird, ist er
:<code>set cm pairmode</code>
standardmäßig für 60 Sekunden aktiviert. In dieser Zeit können MAX! Geräte nach deren Anleitung
oder über das Web-Interface aktiviert werden. Falls kein Parameter angegeben wird, ist er standardmäßig für 60 Sekunden aktiviert. In dieser Zeit können MAX! Geräte nach deren Anleitung in den Anlernmodus versetzt werden, um sie mit FHEM zu pairen.
in den Anlernmodus versetzt werden, um sie mit FHEM zu pairen.


=== Geräte untereinander anlernen ===
=== Geräte untereinander anlernen ===
Es gibt einen anderen Befehl, um Devices untereinander anzulernen (in neueren Versionen des MAX Moduls enthalten, heißt "associate").
Die MAX-Devices können direkt untereinander angelernt werden. Dazu gibt es den "associate"-Befehl in FHEM, mit dem die Geräte untereinander
angelernt werden. Er muss in jede Richtung einmal verwendet werden, also sowohl z.B. Fensterkontakt an Thermostat wie auch umgekehrt.
Also
:<code>set Heizthermostat1 associate Fensterkontakt1</code>
:<code>set Fensterkontakt1 associate Heizthermostat1</code>
Während Wand- und Heizkörperthermostat stets empfangsbereit sind, benötigt der Fensterkontakt zum "Wecken" einen Schaltvorgang
des Reed-Relais (Fenster öffnen oder schließen). Von einer eventuellen Log-Meldung
:<code>There is a packet for ShutterContact Fensterkontakt1 in queue. Please push the button on the respective ShutterContact so the packet can be send.</code>
bitte nicht verwirren lassen: Den Anlern-Button auf der Rückseite zu drücken, wäre völlig falsch! Sofern das Pairing erfolgreich war, sich im Logfile aber diese
Meldung trotzdem alle 3 Sekunden wiederholt, hilft ein Restart von FHEM.


Wenn ich z.B.
Jetzt wechselt Heizthermostat1 immer dann auf die windowOpenTemperature, wenn der Fensterkontakt1 offen ist. Dabei muss die groupId von beiden Geräte nicht gleich sein.
set MAXFensterKontakt0 associate MaxHeizkörperthermostat3
ausführe, dann
sendet der MAXFensterKontakt0 jede Änderung zusätzlich (direkt über Funk, ohne Cube oder FHEM)
an das MaxHeizkörperthermostat3.


Damit MaxHeizkörperthermostat3 auch auf die Nachrichten vom MAXFensterKontakt0 hört, muss noch ein
Ebenso können Wand- mit Heizkörperthermostaten gekoppelt werden. Temperaturänderung am Wandthermostaten werden so an den / die Heizkörper gesendet.
set MaxHeizkörperthermostat3 associate MAXFensterKontakt0
Allerdings leitet das Wandthermostat nur Änderungen weiter, die am Wandgerät selbst (manuell) vorgenommen wurden. Wer also via FHEM die <code>desiredTemperature</code> an den
erfolgen.
Wandthermostaten sendet, verändert damit weder direkt noch indirekt die Einstellung der assoziierten Heizkörper, sondern muss auch an diese Heizkörper senden.


Dann wechselt MaxHeizkörperthermostat3 immer dann auf die windowOpenTemperature, wenn der MAXFensterKontakt0 offen ist.
=== Temperatursturzerkennung ===
Dabei muss die groupId von beiden Geräte gar nicht gleich sein! (Die Semantik der groupId erschließt sich mir deshalb noch nicht ganz.
Die Heizkörperthermostate verfügen über eine interne "Fenster-offen Erkennung" (Temperatursturzerkennung). Wird diese ausgelöst, regeln sie für die Zeit die unter "windowOpenDuration" festgelegt wurde auf die als "windowOpenTemperature" festgelegte Temperatur herunter und danach wieder auf die zuvor eingestellte Temperatur zurück.
Ich glaube, man kann damit Befehle (ala set desiredTemperature) an mehrere Thermostate gleichzeitig richten. Im Moment sendet FHEM einfach an jedes Thermostat einen Befehl.)


Wahrscheinlich funktioniert associate genauso zwischen Heizkörper/Wandthermostaten. Das müsste mal eine ausprobieren und dann hier berichten.
Nachteil: Die Erkennung benötigt etwas Zeit und reagiert nicht sofort wie es beim Fensterkontakt oben der Fall ist


=== Temperatursturzerkennung ===
Die Heizkörperthermostate verfügen über eine interne "Fenster-offen Erkennung" (Temperatursturzerkennung). Wird diese ausgelöst regeln sie für die Zeit die unter "windowOpenDuration" festgelegt wurde auf die als "windowOpenTemperature" festgelegt Temperatur herunter und danach wieder auf die zuvor eingestellte Temperatur zurück.
Nachteil: Die Erkennung benötigt etwas Zeit und reagiert nicht sofort wie es beim Fensterkontakt oben der Fall ist
Vorteil: Es ist kein Fensterkontakt erforderlich
Vorteil: Es ist kein Fensterkontakt erforderlich


'''Wichtig:''' Setzt man die windowOpenTemperature auf "Off" (= 4.5 Grad), dann ist die Fenster-offen-Funktion abgeschaltet. Und auch wenn die desiredTemperature gerade auf "On" (= 30.5 Grad") steht, geht der Heizkörper nicht in die Fenster-offen-Funktion.
'''Wichtig:''' Setzt man die windowOpenTemperature auf "Off" (= 4.5 Grad), dann ist die Fenster-offen-Funktion abgeschaltet. Und auch wenn die desiredTemperature gerade auf "On" (= 30.5 Grad") steht, geht der Heizkörper nicht in die Fenster-offen-Funktion.
=== Telegram-Benachrichtigung bei dauergeöffnetem Fenster ===
Einen schönen Einstieg in die Event- und Watchdog-Verarbeitung von FHEM bildet die zeitversetzte Benachrichtigung per Telegram, wenn
das Fenster länger offen stehen gelassen wurde.
Ist ein Telegram-Bot eingerichtet (siehe [[TelegramBot]]), und der Default-Peer gesetzt, so
reicht ein
:<code> define w1 watchdog Fensterkontakt1:opened 00:12 Fensterkontakt1:closed set Telegram message Das Fenster ist seit 12 min offen!</code>
um pünktlich nach 12 Minuten eine Erinnerungs-Nachricht zu erhalten: Penetrant und schnell wie SMS, kostenlos wie Mail!


=== Externer Sensor für Fenster-offen-Erkennung ===
=== Externer Sensor für Fenster-offen-Erkennung ===
Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate in und aus dem Fenster-offen Modus zu holen.
'''Achtung''': Wird nur von CUL_MAX unterstützt!
Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:
 
Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate in und aus dem Fenster-offen Modus zu holen. Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:


  <nowiki>define CUL0 CUL /dev/ttyACM0@9600 0000
  <nowiki>define CUL0 CUL /dev/ttyACM0@9600 0000
Zeile 152: Zeile 159:
  define Heizung MAX HeatingThermostat abcdef
  define Heizung MAX HeatingThermostat abcdef
  attr Heizung IODev cm</nowiki>
  attr Heizung IODev cm</nowiki>
Wir müssen einmalig den internen Fake-Fensterkontakt mit dem Heizkörper assozieren
Wir müssen einmalig den internen Fake-Fensterkontakt mit dem Heizkörper assozieren
 
:<code>set Heizung associate fakeShutterContact</code>
<nowiki>set Heizung associate fakeShutterContact</nowiki>
damit dieser die Nachrichten vom Fensterkontakt akzeptiert.
damit dieser die Nachrichten vom Fensterkontakt akzeptiert.


Nun können wir per  
Nun können wir per  
 
:<code>set cm fakeSC Heizung 1</code>
<nowiki>set cm fakeSC Heizung 1</nowiki>
die Nachricht "Fenster offen" an die Heizung senden und per
die Nachricht "Fenster offen" an die Heizung senden und per
 
:<code>set cm fakeSC Heizung 0</code>
<nowiki>set cm fakeSC Heizung 0</nowiki>
die Nachricht "Fenster zu".
die Nachricht "Fenster zu".


=== Externer Temperatursensor für Heizkörperregelung ===
=== Externer Temperatursensor für Heizkörperregelung ===
Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate zu regeln.
'''Achtung''': Wird nur von CUL_MAX unterstützt!
Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:
 
Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate zu regeln. Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:


  <nowiki>define CUL0 CUL /dev/ttyACM0@9600 0000
  <nowiki>define CUL0 CUL /dev/ttyACM0@9600 0000
Zeile 173: Zeile 179:
  define Heizung MAX HeatingThermostat abcdef
  define Heizung MAX HeatingThermostat abcdef
  attr Heizung IODev cm</nowiki>
  attr Heizung IODev cm</nowiki>
Wir müssen einmalig das interne Fake-Wandthermostat mit dem Heizkörper assozieren:  
Wir müssen einmalig das interne Fake-Wandthermostat mit dem Heizkörper assozieren:  
 
:<code>set Heizung associate fakeWallThermostat</code>
<nowiki>set Heizung associate fakeWallThermostat</nowiki>
damit dieser die Nachrichten vom Wandthermostat akzeptiert. Achtung: Dies schaltet im
damit dieser die Nachrichten vom Wandthermostat akzeptiert. Achtung: Dies schaltet im
Heizkörperthermostat die Regelung mit dem internen Temperaturfühler aus. Ohne die gleich kommenden "fakeWT" Nachrichten wird das Heizkörperthermostat nicht mehr regeln.
Heizkörperthermostat die Regelung mit dem internen Temperaturfühler aus. Ohne die gleich kommenden "fakeWT" Nachrichten wird das Heizkörperthermostat nicht mehr regeln.


Nun können wir per  
Nun können wir per  
:<code>set cm fakeWT Heizung 14.5 12.1</code>
die desiredTemperature 14.5 und gemessene Temperatur 12.1 an die Heizung senden. Diese wird dann die Ventile öffnen, bis wir ein "fakeWT" absetzten, dessen gemessene Temperatur höher als die desiredTemperature ist.


<nowiki>set cm fakeWT Heizung 14.5 12.1</nowiki>
Falls man zu lange Zeit (ca. 30 Minuten) kein neues "fakeWT" sendet, wird bei der Heizung das Attribut rferror gleich 1. Es ist nicht klar, ob das neben diesem Attribut auch Auswirkung auf die Funktionalität hat. Es wurde beobachtet, dass dann der interne Temperatursensor bis zum nächsten "fakeWT" aktiviert wird.
die desiredTemperature 14.5 und gemessene Temperatur 12.1 an die Heizung senden.
Diese wird dann die Ventile öffnen, bis wir ein "fakeWT" absetzten, dessen gemessene Temperatur
höher als die desiredTemperature ist.
 
Falls man zu lange Zeit (ca. 30 Minuten) kein neues "fakeWT" sendet, wird bei Heizung das Attribut rferror gleich 1. Es ist nicht klar, ob das neben diesem Attribute auch Auswirkung auf die Funktionalität hat. Es wurde beobachtet, das dann der interne Temperatursensor bis zum nächsten FakeWT aktiviert wird.


Beispiel eines automatischen Sendens einer externen Temperatur, der externe Temperatursensor heißt "WS300":
Beispiel eines automatischen Sendens einer externen Temperatur, der externe Temperatursensor heißt "WS300":


  <nowiki>define SendExtTemp notify WS300:temperature.* {
  <nowiki>define SendExtTemp notify WS300:temperature.* {
  MaxFakeWallThermostat("Heizung",&#160;%EVTPART1);
  MaxFakeWallThermostat("Heizung",&#160;$EVTPART1);
}</nowiki>
}</nowiki>
Dazu die Funktion, bitte in 99_MyUtils.pm eintragen:


  <nowiki>sub MaxFakeWallThermostat($$)
Dazu die Funktion, bitte in [https://wiki.fhem.de/wiki/99_myUtils_anlegen 99_myUtils.pm] eintragen:
{
 
my ($heizung, $aktTemp)    = @_;
  <nowiki>
my $CULMAX     = $defs{$heizung}{LASTInputDev};
sub MaxFakeWallThermostat {
my $desiredTemp   = ReadingsVal($heizung, "desiredTemperature", undef);
    my $heizung = shift;
my $windowOpenTemp = ReadingsVal($heizung, "windowOpenTemperature", undef);
    my $aktTemp = shift;
my $lastTemp   = ReadingsVal($heizung, "LastExtTemperature", 0);
    my $CULMAX   = (exists($defs{$heizung}{IODev}->{NAME})) ? $defs{$heizung}{IODev}->{NAME} : '';
my $lastSet     = ReadingsTimestamp($heizung, "LastExtTemperature", 0);
    my $desiredTemp   = ReadingsNum($heizung, 'desiredTemperature', 0);
if($desiredTemp &amp;&amp; $windowOpenTemp &amp;&amp;
    my $windowOpenTemp = ReadingsNum($heizung, 'windowOpenTemperature', 0);
$desiredTemp&#160;!= $windowOpenTemp &amp;&amp;
 
(time()-time_str2num($lastSet) &gt;= 600 || abs($aktTemp-$lastTemp)&gt;=0.2 )) {
    return if (!$CULMAX || !$desiredTemp && !$windowOpenTemp);
  Log 3, "set $CULMAX fakeWT $heizung $desiredTemp $aktTemp";
 
  readingsSingleUpdate($defs{$heizung}, "LastExtTemperature", $aktTemp, 0);
    my $lastTemp       = ReadingsNum($heizung, 'LastExtTemperature', 0);
  fhem("set $CULMAX fakeWT $heizung $desiredTemp $aktTemp");
    my $lastSet       = ReadingsAge($heizung, 'LastExtTemperature', 0);
}
 
}</nowiki>
    if ((($desiredTemp != $windowOpenTemp) && ($lastSet > 599)) || (abs($aktTemp-$lastTemp) > 0.1)) {
        Log3($CULMAX, 3, "$CULMAX, set fakeWT $heizung $desiredTemp $aktTemp");
        readingsSingleUpdate($defs{$heizung}, 'LastExtTemperature', $aktTemp, 0);
        my $ret = CommandSet(undef, "$CULMAX fakeWT $heizung $desiredTemp $aktTemp");
        Log3($CULMAX, 2, "$CULMAX, error : $ret") if ($ret);
    }
    return;
}</nowiki>
 
In diesem Beispiel heißt das zu steuernde Thermostat "Heizung". Die vom externen Sensor gemessene Temperatur wird nur unter den folgenden Voraussetzungen gesendet:
In diesem Beispiel heißt das zu steuernde Thermostat "Heizung". Die vom externen Sensor gemessene Temperatur wird nur unter den folgenden Voraussetzungen gesendet:
- Das Thermostat befindet sich nicht im "Fenster-offen" Modus, und
* das Thermostat befindet sich nicht im "Fenster-offen" Modus, und
- das letzte Senden liegt mindestens 10min zurück
* das letzte Senden liegt mindestens 10min zurück
- oder die gemessene Temperatur weicht um mindestens 0.2°C von der letzten gesendeten Temperatur ab
* oder die gemessene Temperatur weicht um mindestens 0.2°C von der letzten gesendeten Temperatur ab


=== Wochenheizplan für Wandthermostat/Ventilantriebe erstellen ===
Ein Heizplan, den das Wandthermostat und auch der Ventilantrieb versteht und speichern kann, sieht folgendermaßen aus:
:<code>set WZ_Wandthermostat weekProfile Mon 17,17:30,20,23:00,17 Tue 17,17:30,20,23:00,17 Wed 17,17:30,20,23:00,17 Thu 17,17:30,20,23:00,17 Fri 17,15:00,20,23:00,17 Sat 17,11:00,20,23:00,17 Sun 17,11:00,20,23:00,17</code>
Genauer erläutert wird die Funktionsweise auch in der {{Link2CmdRef|Anker=MAX}}.


=== Wochenheizplan für Wandthermostat erstellen ===
Der gesamte Block kann kopiert und als FHEM Befehl abgesetzt werden. Unter Umständen benötigt das Speichern bzw. Übertragen wegen der Größe etwas Zeit, bevor die aktuellen, neu gesetzten Werte wieder ausgelesen werden können.
Ein Heizplan, den der Wandthermostat versteht und speichern kann, sieht folgendermaßen aus:


<nowiki>set WZ_Wandthermostat weekProfile
'''Bitte folgendes beachten:'''
Mon 17,17:30,20,23:00,17
Tue 17,17:30,20,23:00,17
Wed 17,17:30,20,23:00,17
Thu 17,17:30,20,23:00,17
Fri 17,15:00,20,23:00,17
Sat 17,11:00,20,23:00,17
Sun 17,11:00,20,23:00,17</nowiki>
Genauer erläutert wird die Funktionsweise auch unter [http://fhem.de/commandref.html#MAX http://fhem.de/commandref.html#MAX].
Der gesamte Block kann kopiert und als FHEM Befehl abgesetzt werden. Unter Umständen benötigt das Speichern, bzw Übertragen wegen der Größe etwas Zeit, bevor die aktuellen, neu gesetzten Werte wieder ausgelesen werden können.


Es gibt im Zusammenhang mit dem Wochenprogramm ein Problem mit dem letzten Schaltpunkt des Tages.
Der Workaround wurde  {{Link2Forum|Topic=17231|Message=112738|LinkText=hier}}
beschrieben.
Man muss dafür sorgen, dass man kurz vor Ende des Tages noch einen Schaltpunkt setzt! Bei mir hat sich ein Schaltpunkt (ohne Änderung der Soll-Temperatur) um 23:55 bewährt:
:<code>set WZ_Wandthermostat weekProfile Mon 17,17:30,20,22:00,17,23:55,17</code>


=== Werte Plotten ===
=== Werte Plotten ===
[[File:Plot_MAX_Beispiel.png|thumb|right|Plot eines MAX Heizkörperthermostates]]
[[File:Plot_MAX_Beispiel.png|thumb|right|Plot eines MAX Heizkörperthermostates]]
In den Log-Dateien wird regelmäßig der Batteriestatus, die Soll-Temperatur, die Ventilstellung und die Ist-Temperatur (Vorsicht wird nicht zuverlässig, möglicherweise nur bei einer Änderung der Ventilstellung übertragen.)
In den Log-Dateien wird regelmäßig der Batteriestatus, die Soll-Temperatur, die Ventilstellung und die Ist-Temperatur (Vorsicht: Wird nicht zuverlässig, möglicherweise nur bei einer Änderung der Ventilstellung, übertragen.)


Inhalt der LOG-Datei eines Heizkörperthermostates:
Inhalt der LOG-Datei eines Heizkörperthermostates:
Zeile 265: Zeile 274:
"&lt; egrep 'valveposition' &lt;IN&gt;"\
"&lt; egrep 'valveposition' &lt;IN&gt;"\
   using 1:4 axes x1y1 title 'Ventil (%)' with lines lw 2</nowiki>
   using 1:4 axes x1y1 title 'Ventil (%)' with lines lw 2</nowiki>
Einbinden eines Plots in der fhem.cgf
Einbinden eines Plots in der fhem.cfg


  <nowiki>#Werte plotten
  <nowiki>#Werte plotten
Zeile 271: Zeile 280:
attr MAX_017840_weblink label "Kueche Soll-Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr MAX_017840_weblink label "Kueche Soll-Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr MAX_017840_weblink room MAX</nowiki>
attr MAX_017840_weblink room MAX</nowiki>
=== Nützliche kleine Erweiterungen ===
=== Nützliche kleine Erweiterungen ===
'''Einen Alias-Namen vergeben für eine bessere Lesbarkeit im Webinterface'''
'''Einen Alias-Namen vergeben für eine bessere Lesbarkeit im Webinterface'''
<nowiki>attr MAX_018d3f alias Kueche</nowiki>
:<code>attr MAX_018d3f alias Kueche</code>
'''Die Anzeigen für die einzelnen File-Logs füllen das Webinterface schnell und machen es unübersichtlich.''' Die File-Logs können einfach in einen separaten Raum verbannt werden.
'''Die Anzeigen für die einzelnen File-Logs füllen das Webinterface schnell und machen es unübersichtlich.''' Die File-Logs können einfach in einen separaten Raum verbannt werden.
<nowiki>attr FileLog_MAX_018d3f room LOG</nowiki>
:<code>attr FileLog_MAX_018d3f room LOG</code>
'''Einstellmöglichkeit für die Soll-Temperatur direkt in der „Raum-Seite“ schaffen.''' Die Temperatur wird dauerhaft auf einen bestimmten Wert gestellt. Das Wochenprogramm in dem Thermostat wird deaktiviert.
'''Einstellmöglichkeit für die Soll-Temperatur direkt in der „Raum-Seite“ schaffen.''' Die Temperatur wird dauerhaft auf einen bestimmten Wert gestellt. Das Wochenprogramm in dem Thermostat wird deaktiviert.
:<code>attr MAX_018d3f webCmd desiredTemperature</code>


<nowiki>attr MAX_018d3f webCmd desiredTemperature</nowiki>
'''Soll-Temperatur setzen, ohne das automatische Programm des Thermostates abzuschalten.'''
'''Soll-Temperatur setzen, ohne das automatische Programm des Thermostates abzuschalten.'''
Es besteht die Möglichkeit eine Soll-Temperatur bis zum nächsten Schaltzeitpunkt zu setzen. Zum Beispiel kann das automatische Wochenprogramm in den Thermostaten dazu genutzt werden, nur abends die Soll-Temperatur zu senken. So läuft die Heizung nachts nicht voll durch. Wenn jedoch die Temperatur im Web-Interface von Fhem verändert wird, wird auch der Thermostat auf manuell gesetzt. So greift das Wochenprogramm nicht mehr. Abhilfe schafft der Befehl <code>set MAX_04711 desiredTemperature auto 20</code>. Damit die Eingabe komfortabel aus Fhem möglich ist, kann ein Dummy-Device erstellt werden:
Es besteht die Möglichkeit eine Soll-Temperatur bis zum nächsten Schaltzeitpunkt zu setzen. Zum Beispiel kann das automatische Wochenprogramm in den Thermostaten dazu genutzt werden, nur abends die Soll-Temperatur zu senken. So läuft die Heizung nachts nicht voll durch. Wenn jedoch die Temperatur im Web-Interface von FHEM verändert wird, wird auch der Thermostat auf manuell gesetzt. So greift das Wochenprogramm nicht mehr. Abhilfe schafft der Befehl  
:<code>set MAX_04711 desiredTemperature auto 20</code>  
Damit die Eingabe komfortabel aus FHEM möglich ist, kann ein Dummy-Device erstellt werden:


  <nowiki>#Dummy für die Schnell-Einstellung der Temperatur bis zum nächsten automatischen Schaltzeitpunkt
  <nowiki>#Dummy für die Schnell-Einstellung der Temperatur bis zum nächsten automatischen Schaltzeitpunkt
Zeile 288: Zeile 300:
  attr HeizkoerperBad webCmd state
  attr HeizkoerperBad webCmd state
  define HeizkoerperBad.ntfy notify HeizkoerperBad.* {\
  define HeizkoerperBad.ntfy notify HeizkoerperBad.* {\
   my $valtemp = "%";;\
   my $valtemp = "$EVENT";;\
   my $device = "MAX_04711";;\
   my $device = "MAX_04711";;\
   my $cmd = 'set '.$device.' desiredTemperature auto '.$valtemp;;\
   my $cmd = 'set '.$device.' desiredTemperature auto '.$valtemp;;\
   fhem($cmd);;\
   fhem($cmd);;\
  }</nowiki>
  }</nowiki>
Diese Dummy-Device kann alternativ oder ergänzend zu <code>attr MAX_018d3f webCmd desiredTemperature</code> verwendet werden.
Dieses Dummy-Device kann alternativ oder ergänzend zu <code>attr MAX_018d3f webCmd desiredTemperature</code> verwendet werden.


== Internals ==
== Internals ==
=== IST-Temperaturwerte ===
=== IST-Temperaturwerte ===
[[File:Plot_MAX_Beispiel.png|thumb|right|Plot eines MAX Heizkörperthermostates]]
[[File:Plot_MAX_Beispiel.png|thumb|right|Plot eines MAX Heizkörperthermostates]]
Diese Abbildung zeigt, dass die IST-Temperatur nicht regelmäßig dem MAX CUBE mitgeteilt wird. Im Automatikbetrieb wird beim einer Änderung der Ventilstellung die neue Ventilstellung zusammen mit der aktuellen IST-Temperatur gesendet. Bei der Abbildung war die Therme in der Nacht ausgeschaltet. Daraufhin sinkte die Temperatur soweit ab, dass das Heizungsthermostat das Ventil in Maximalstellung geöffnet hat. Gegen 08:50 wurde die Therme eingeschaltet und die Soll-Temperatur an diesem Heizungsthermostat erhöht. Während dieser ganzen Zeit erfolgt keine Aktualisierung der Ist-Temperatur. So kommt es auch gegen 10:30 zu einem sprunghaften Temperaturanstieg von 13,5°C auf 19°C (siehe Markierung *A).
Diese Abbildung zeigt, dass die IST-Temperatur nicht regelmäßig dem MAX CUBE mitgeteilt wird. Im Automatikbetrieb wird bei einer Änderung der Ventilstellung die neue Ventilstellung zusammen mit der aktuellen IST-Temperatur gesendet. Bei der Abbildung war die Therme in der Nacht ausgeschaltet. Daraufhin sank die Temperatur soweit ab, dass das Heizungsthermostat das Ventil in Maximalstellung geöffnet hat. Gegen 08:50 wurde die Therme eingeschaltet und die Soll-Temperatur an diesem Heizungsthermostat erhöht. Während dieser ganzen Zeit erfolgt keine Aktualisierung der Ist-Temperatur. So kommt es auch gegen 10:30 zu einem sprunghaften Temperaturanstieg von 13,5°C auf 19°C (siehe Markierung *A).


Die IST-Temperatur wird anscheinend aktualisiert bei einer Änderung der:
Die IST-Temperatur wird anscheinend aktualisiert bei einer Änderung der:
Zeile 304: Zeile 316:
* Ventilstellung
* Ventilstellung
* Soll-Temperatur
* Soll-Temperatur
* des Betriebsmodis (Auto/Manuell)
* des Betriebsmodus (Auto/Manuell)
 
Wer eine detaillierte Kurve wünscht, sollte sich den [[MAX! Temperatur-Scanner]] ansehen.


=== MAXLAN ===
=== MAXLAN ===
=== CUL_MAX ===
=== CUL_MAX ===
The Max devices use a CC1100 chip. For parameters see rf_moritz.c in culfw.
The MAX devices use a CC1100 chip. For parameters see rf_moritz.c in culfw.
The thermostats use a Wake-On-Radio, thus one has to send packets at the right time.
The thermostats use a Wake-On-Radio, thus one has to send packets at the right time.


CC1100 initialization sequence on one of the max devices (not Cube) (format: addr value, both in hex):
CC1100 initialization sequence on one of the MAX devices (not Cube) (format: addr value, both in hex):


  <nowiki>00 08
  <nowiki>00 08
Zeile 353: Zeile 367:
  rx timeout = EVENT0·C(RX_TIME, WOR_RES) ·26/X(=26) = 34667*0.2254 us = 7.8139 ms</nowiki>
  rx timeout = EVENT0·C(RX_TIME, WOR_RES) ·26/X(=26) = 34667*0.2254 us = 7.8139 ms</nowiki>


The ShutterContact seems to always sleep. Thus it is necessary to trigger it manually (by opening/closing the window) to make it receive messages. Pushing the button may work to. It is also awake just after
The ShutterContact seems to always sleep (DEVELOPMENT NOTE: from memory I can state that this phenomenon very likely is similar to / "caused by" the very precisely time-delay-slot-based battery-conserving Rx reception window protocol implementation of certain FS20 devices - window contacts?). Thus it is necessary to trigger it manually (by opening/closing the window) to make it receive messages. Pushing the button may work too. It is also awake just after
pairing, so one may send messages right then. One can use the WakeUp message to keep it from sleeping for some time. (This is also the reason why in the official MAX software, one must trigger the ShutterContact
pairing, so one may send messages right then. One can use the WakeUp message to keep it from sleeping for some time. (This is also the reason why in the official MAX software, one must trigger the ShutterContact
after removing it from the house. The "factoryReset" packet is sent directly after the "ShutterContactState" packet has been acked.)
after removing it from the house. The "factoryReset" packet is sent directly after the "ShutterContactState" packet has been acked.)
Zeile 366: Zeile 380:
  2013.03.20 15:12:30 5: CUL_MAX_SendQueueHandler: 1 items in queue
  2013.03.20 15:12:30 5: CUL_MAX_SendQueueHandler: 1 items in queue
  2013.03.20 15:12:30 2: CUL_MAX_SendQueueHandler: Missing ack from 01c9bb for 0b05008212345601c9bb0000</nowiki>
  2013.03.20 15:12:30 2: CUL_MAX_SendQueueHandler: Missing ack from 01c9bb for 0b05008212345601c9bb0000</nowiki>
auftauchen (im Verbose Modus 5), dann wurde vermutlich kein oder ein inkorrektes Paring durchgeführt.
auftauchen (im Verbose Modus 5), dann wurde vermutlich kein oder ein inkorrektes Pairing durchgeführt.
Nach dem Pairing sollten diese Meldungen verschwinden und stattdessen etwas wie
Nach dem Pairing sollten diese Meldungen verschwinden und stattdessen etwas wie
 
:<code>2013.03.20 15:21:43 5: Got matching ack</code>
<nowiki>2013.03.20 15:21:43 5: Got matching ack</nowiki>
auftauchen.
auftauchen.


[[Kategorie:Kontaktsensor (magnetisch)]]
[[Kategorie:Kontaktsensor (magnetisch)]]
[[Kategorie:Glossary]]
[[Kategorie:MAX]]
[[Kategorie:MAX]]
[[Kategorie:Heizungsventile]]
[[Kategorie:Heizungsventile]]

Aktuelle Version vom 9. Juni 2020, 09:23 Uhr

MAX! ist eine Heizungssteuerung, die die Raumtemperatur durch funkvernetzte Heizkörperthermostate an den Heizkörpern regelt. MAX! stellt eine Alternative zur FHT und HomeMatic Heizungsteuerung dar.

Features

  • Bidirektionale Kommuniktion (jeder Befehl wird mit ACK quittiert)
  • Heizkörperthermostate übertragen auch die gemessene Temperatur

FHEM Module

Die MAX Komponenten können über den MAX!Cube per Modul 00_MAXLAN oder über einen CUL oder CUNO per 14_CUL_MAX gesteuert werden. In beiden Fällen werden die einzelnen MAX! Geräte vom Modul 10_MAX bereitgestellt. Alternativ kann man nach Thema einen MAX!CUBE als CUNO umflashen.

Nachteil vom Cube ist, dass man ein Polling machen muss, um zu sehen ob sich der Status eines Gerätes geändert hat. Z.B. checkt man das alle 30 Sekunden. Dann sieht man aber auch Änderungen möglicherweise erst nach 30 Sekunden. Beim CUL sieht man die Funknachrichten direkt. Es wird aber auch ein Kombimodus unterstützt, in welchem man alles über den MAXLAN steuert, der CUL_MAX aber für zeitnahe Benachrichtigungen sorgt.

Komponenten

Limit

  • Auf 8 Thermostate pro Raum beschränkt
  • Limit mit Cube liegt bei ca. 140 Geräten. Durch die 1% Regel dürften es aber in der Praxis weniger sein

Heizkörperthermostate

Unterstützt wird das Einstellen von

  • desiredTemperature = auto (Wochenprogramm), manuell (4.5 - 30.5), eco, comfort, boost, until
    • (Besonderheit der Werte: 4.5 = Off und 30.5 = On)
  • ecoTemperature, comfortTemperature, measurementOffset, maximumTemperature, minimumTemperature, windowOpenTemperature, windowOpenDuration

und das Auslesen

  • der gemessenen Temperatur. (Hinweis: Wird bei Verwendung des MAX CUBE nicht regelmäßig aktualisiert)

Fensterkontakte

Der aktuelle Status (offen/geschlossen) wird (praktisch ohne Verzögerung) angezeigt.

Falls wir nicht mit Ack antworten, wird er mehrmals wiederholt.

Die Fensterkontakte können zusätzlich direkt an mehrere Heizkörperthermostate angelernt werden, und versetzen diese dann automatisch in windowOpenTemperature während sie geöffnet sind.

Wenn der Fensterkontakt an mindestens ein Heizkörperthermostat angelernt ist, dann sendet er zusätzlich stündlich seinen aktuellen Zustand.

Beispiel Autocreate

MAXLAN_Parse: Paired new device, type ShutterContact, addr 1a2b3c, serial JEQ0123456
autocreate: define MAX_1a2b3c MAX ShutterContact 1a2b3c
autocreate: define FileLog_MAX_1a2b3c FileLog /fhem/log/MAX_1a2b3c-%Y.log MAX_1a2b3c

Beispiel Definition

define MAX_1a2b3c MAX ShutterContact 1a2b3c

Beispiel Log

==> MAX_1a2b3c-2013.log <==
2013-10-20_18:52:08 MAX_1a2b3c battery: ok
2013-10-20_18:52:08 MAX_1a2b3c onoff: 0
2013-10-20_18:52:08 MAX_1a2b3c closed

Wandthermostate

Unterstützt wird das Einstellen von

  • desiredTemperature (siehe Heizkörperthermostate), ecoTemperature, comfortTemperature

und das Auslesen

  • der gemessenen Temperatur.

Eco-Taster

Achtung: Zumindest über MAXLAN lässt sich der Zustand weder auslesen, noch wird man über Veränderungen informiert.

Per CUL_MAX funktioniert der Eco-Taster problemlos.

Beispielhafte Definition

define BUTTON.EG MAX PushButton 069d33

Beispielhafte Event-Ausgabe

2013-07-02 21:06:14 MAX BUTTON.EG battery: ok
2013-07-02 21:06:14 MAX BUTTON.EG onoff: 0
2013-07-02 21:06:14 MAX BUTTON.EG closed

Wobei gilt

onoff Bedeutung
0 Eco
1 Auto

Anlernen per CUL

Das Anlernen funktioniert nur mit zurückgesetzten (Werksreset, also entweder alle 3 Tasten am Heizkörperthermostat betätigen, Batterien einlegen, Anzeige rES; oder in FHEM set factoryReset) Heizkörperthermostaten. Bereits an einen Cube angelernte Heizungsregler können nicht an ein CUL angemeldet werden, hier ist dann nur das "mitlesen" der Funkbotschaften möglich.

Info: Durch den Reset geht auch ein evtl. per Cube eingestelltes Automatikprogramm verloren.

Konfiguration

Siehe commandref/CUL_MAX.

Die Module sind so konzipiert, dass man die offizielle Max! Software nicht benutzen muss. Man kann alles aus FHEM heraus machen. Nachdem das MAXLAN oder CUL_MAX Modul konfiguriert wurden (siehe unten), werden bereits gepairte Geräte automatisch erkannt.

MAXLAN

Minimale Konfiguration:

define ml MAXLAN 192.168.178.2

wobei 192.168.178.2 die IP des MAX! Cube ist. Das MAXLAN-Modul findet selbstständig bereits gepairte Geräte und trägt diese in die Konfigurationsdatei fhem.cfg ein. Diese können dann im WEB-Interface mittels „alias“ einen eindeutigen Namen bekommen.

CUL_MAX

Minimale Konfiguration:

define CUL0 CUL /dev/ttyACM0@9600 0000
 attr CUL0 rfmode MAX
 define cm CUL_MAX 123456

Anlernen

Dazu muss der "pairmode" auf MAXLAN mit

set ml pairmode

bzw. bei CUL_MAX mit

set cm pairmode

oder über das Web-Interface aktiviert werden. Falls kein Parameter angegeben wird, ist er standardmäßig für 60 Sekunden aktiviert. In dieser Zeit können MAX! Geräte nach deren Anleitung in den Anlernmodus versetzt werden, um sie mit FHEM zu pairen.

Geräte untereinander anlernen

Die MAX-Devices können direkt untereinander angelernt werden. Dazu gibt es den "associate"-Befehl in FHEM, mit dem die Geräte untereinander angelernt werden. Er muss in jede Richtung einmal verwendet werden, also sowohl z.B. Fensterkontakt an Thermostat wie auch umgekehrt. Also

set Heizthermostat1 associate Fensterkontakt1
set Fensterkontakt1 associate Heizthermostat1

Während Wand- und Heizkörperthermostat stets empfangsbereit sind, benötigt der Fensterkontakt zum "Wecken" einen Schaltvorgang des Reed-Relais (Fenster öffnen oder schließen). Von einer eventuellen Log-Meldung

There is a packet for ShutterContact Fensterkontakt1 in queue. Please push the button on the respective ShutterContact so the packet can be send.

bitte nicht verwirren lassen: Den Anlern-Button auf der Rückseite zu drücken, wäre völlig falsch! Sofern das Pairing erfolgreich war, sich im Logfile aber diese Meldung trotzdem alle 3 Sekunden wiederholt, hilft ein Restart von FHEM.

Jetzt wechselt Heizthermostat1 immer dann auf die windowOpenTemperature, wenn der Fensterkontakt1 offen ist. Dabei muss die groupId von beiden Geräte nicht gleich sein.

Ebenso können Wand- mit Heizkörperthermostaten gekoppelt werden. Temperaturänderung am Wandthermostaten werden so an den / die Heizkörper gesendet. Allerdings leitet das Wandthermostat nur Änderungen weiter, die am Wandgerät selbst (manuell) vorgenommen wurden. Wer also via FHEM die desiredTemperature an den Wandthermostaten sendet, verändert damit weder direkt noch indirekt die Einstellung der assoziierten Heizkörper, sondern muss auch an diese Heizkörper senden.

Temperatursturzerkennung

Die Heizkörperthermostate verfügen über eine interne "Fenster-offen Erkennung" (Temperatursturzerkennung). Wird diese ausgelöst, regeln sie für die Zeit die unter "windowOpenDuration" festgelegt wurde auf die als "windowOpenTemperature" festgelegte Temperatur herunter und danach wieder auf die zuvor eingestellte Temperatur zurück.

Nachteil: Die Erkennung benötigt etwas Zeit und reagiert nicht sofort wie es beim Fensterkontakt oben der Fall ist

Vorteil: Es ist kein Fensterkontakt erforderlich

Wichtig: Setzt man die windowOpenTemperature auf "Off" (= 4.5 Grad), dann ist die Fenster-offen-Funktion abgeschaltet. Und auch wenn die desiredTemperature gerade auf "On" (= 30.5 Grad") steht, geht der Heizkörper nicht in die Fenster-offen-Funktion.

Telegram-Benachrichtigung bei dauergeöffnetem Fenster

Einen schönen Einstieg in die Event- und Watchdog-Verarbeitung von FHEM bildet die zeitversetzte Benachrichtigung per Telegram, wenn das Fenster länger offen stehen gelassen wurde.

Ist ein Telegram-Bot eingerichtet (siehe TelegramBot), und der Default-Peer gesetzt, so reicht ein

define w1 watchdog Fensterkontakt1:opened 00:12 Fensterkontakt1:closed set Telegram message Das Fenster ist seit 12 min offen!

um pünktlich nach 12 Minuten eine Erinnerungs-Nachricht zu erhalten: Penetrant und schnell wie SMS, kostenlos wie Mail!

Externer Sensor für Fenster-offen-Erkennung

Achtung: Wird nur von CUL_MAX unterstützt!

Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate in und aus dem Fenster-offen Modus zu holen. Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:

define CUL0 CUL /dev/ttyACM0@9600 0000
 define cm CUL_MAX 123456
 define Heizung MAX HeatingThermostat abcdef
 attr Heizung IODev cm

Wir müssen einmalig den internen Fake-Fensterkontakt mit dem Heizkörper assozieren

set Heizung associate fakeShutterContact

damit dieser die Nachrichten vom Fensterkontakt akzeptiert.

Nun können wir per

set cm fakeSC Heizung 1

die Nachricht "Fenster offen" an die Heizung senden und per

set cm fakeSC Heizung 0

die Nachricht "Fenster zu".

Externer Temperatursensor für Heizkörperregelung

Achtung: Wird nur von CUL_MAX unterstützt!

Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate zu regeln. Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:

define CUL0 CUL /dev/ttyACM0@9600 0000
 define cm CUL_MAX 123456
 define Heizung MAX HeatingThermostat abcdef
 attr Heizung IODev cm

Wir müssen einmalig das interne Fake-Wandthermostat mit dem Heizkörper assozieren:

set Heizung associate fakeWallThermostat

damit dieser die Nachrichten vom Wandthermostat akzeptiert. Achtung: Dies schaltet im Heizkörperthermostat die Regelung mit dem internen Temperaturfühler aus. Ohne die gleich kommenden "fakeWT" Nachrichten wird das Heizkörperthermostat nicht mehr regeln.

Nun können wir per

set cm fakeWT Heizung 14.5 12.1

die desiredTemperature 14.5 und gemessene Temperatur 12.1 an die Heizung senden. Diese wird dann die Ventile öffnen, bis wir ein "fakeWT" absetzten, dessen gemessene Temperatur höher als die desiredTemperature ist.

Falls man zu lange Zeit (ca. 30 Minuten) kein neues "fakeWT" sendet, wird bei der Heizung das Attribut rferror gleich 1. Es ist nicht klar, ob das neben diesem Attribut auch Auswirkung auf die Funktionalität hat. Es wurde beobachtet, dass dann der interne Temperatursensor bis zum nächsten "fakeWT" aktiviert wird.

Beispiel eines automatischen Sendens einer externen Temperatur, der externe Temperatursensor heißt "WS300":

define SendExtTemp notify WS300:temperature.* {
 MaxFakeWallThermostat("Heizung", $EVTPART1);
}

Dazu die Funktion, bitte in 99_myUtils.pm eintragen:

sub MaxFakeWallThermostat {
    my $heizung  = shift;
    my $aktTemp  = shift;
    my $CULMAX   = (exists($defs{$heizung}{IODev}->{NAME})) ? $defs{$heizung}{IODev}->{NAME} : '';
    my $desiredTemp    = ReadingsNum($heizung, 'desiredTemperature', 0);
    my $windowOpenTemp = ReadingsNum($heizung, 'windowOpenTemperature', 0);

    return if (!$CULMAX || !$desiredTemp && !$windowOpenTemp);

    my $lastTemp       = ReadingsNum($heizung, 'LastExtTemperature', 0);
    my $lastSet        = ReadingsAge($heizung, 'LastExtTemperature', 0);

    if ((($desiredTemp != $windowOpenTemp) && ($lastSet > 599)) || (abs($aktTemp-$lastTemp) > 0.1)) {
        Log3($CULMAX, 3, "$CULMAX, set fakeWT $heizung $desiredTemp $aktTemp");
        readingsSingleUpdate($defs{$heizung}, 'LastExtTemperature', $aktTemp, 0);
        my $ret = CommandSet(undef, "$CULMAX fakeWT $heizung $desiredTemp $aktTemp");
        Log3($CULMAX, 2, "$CULMAX, error : $ret") if ($ret);
    }
    return;
 }

In diesem Beispiel heißt das zu steuernde Thermostat "Heizung". Die vom externen Sensor gemessene Temperatur wird nur unter den folgenden Voraussetzungen gesendet:

  • das Thermostat befindet sich nicht im "Fenster-offen" Modus, und
  • das letzte Senden liegt mindestens 10min zurück
  • oder die gemessene Temperatur weicht um mindestens 0.2°C von der letzten gesendeten Temperatur ab

Wochenheizplan für Wandthermostat/Ventilantriebe erstellen

Ein Heizplan, den das Wandthermostat und auch der Ventilantrieb versteht und speichern kann, sieht folgendermaßen aus:

set WZ_Wandthermostat weekProfile Mon 17,17:30,20,23:00,17 Tue 17,17:30,20,23:00,17 Wed 17,17:30,20,23:00,17 Thu 17,17:30,20,23:00,17 Fri 17,15:00,20,23:00,17 Sat 17,11:00,20,23:00,17 Sun 17,11:00,20,23:00,17

Genauer erläutert wird die Funktionsweise auch in der commandref/MAX.

Der gesamte Block kann kopiert und als FHEM Befehl abgesetzt werden. Unter Umständen benötigt das Speichern bzw. Übertragen wegen der Größe etwas Zeit, bevor die aktuellen, neu gesetzten Werte wieder ausgelesen werden können.

Bitte folgendes beachten:

Es gibt im Zusammenhang mit dem Wochenprogramm ein Problem mit dem letzten Schaltpunkt des Tages. Der Workaround wurde hier beschrieben. Man muss dafür sorgen, dass man kurz vor Ende des Tages noch einen Schaltpunkt setzt! Bei mir hat sich ein Schaltpunkt (ohne Änderung der Soll-Temperatur) um 23:55 bewährt:

set WZ_Wandthermostat weekProfile Mon 17,17:30,20,22:00,17,23:55,17

Werte Plotten

Plot eines MAX Heizkörperthermostates

In den Log-Dateien wird regelmäßig der Batteriestatus, die Soll-Temperatur, die Ventilstellung und die Ist-Temperatur (Vorsicht: Wird nicht zuverlässig, möglicherweise nur bei einer Änderung der Ventilstellung, übertragen.)

Inhalt der LOG-Datei eines Heizkörperthermostates:

2012-12-30_08:55:31 MAX_018d3f battery: ok
2012-12-30_08:55:31 MAX_018d3f desiredTemperature: 19.5
2012-12-30_08:55:31 MAX_018d3f valveposition: 83
2012-12-30_08:55:31 MAX_018d3f temperature: 16.4

Mit folgender Plot-Datei (max_temp.gplot) kann der Verlauf der Sensordaten gut angezeigt werden.

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set y2tics
set title '<L1>'
set grid xtics y2tics
set y2label "Temperatur in Grad Celsius"
set ylabel "Signal in %"
#FileLog 4:desiredTemperature:0:
#FileLog 4:temperature:0:
#FileLog 4:valveposition:0:
plot \
"< egrep 'desiredTemperature' <IN>"\
  using 1:4 axes x1y2 title 'Soll-Temperatur (C)' with lines lw 2 \
"< egrep 'temperature' <IN>"\
  using 1:4 axes x1y2 title 'Ist-Temperatur(ungenau)(C)' with lines lw 2 \
"< egrep 'valveposition' <IN>"\
  using 1:4 axes x1y1 title 'Ventil (%)' with lines lw 2

Einbinden eines Plots in der fhem.cfg

#Werte plotten
define MAX_017840_weblink weblink fileplot FileLog_MAX_017840:max_temp:CURRENT
attr MAX_017840_weblink label "Kueche Soll-Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr MAX_017840_weblink room MAX

Nützliche kleine Erweiterungen

Einen Alias-Namen vergeben für eine bessere Lesbarkeit im Webinterface

attr MAX_018d3f alias Kueche

Die Anzeigen für die einzelnen File-Logs füllen das Webinterface schnell und machen es unübersichtlich. Die File-Logs können einfach in einen separaten Raum verbannt werden.

attr FileLog_MAX_018d3f room LOG

Einstellmöglichkeit für die Soll-Temperatur direkt in der „Raum-Seite“ schaffen. Die Temperatur wird dauerhaft auf einen bestimmten Wert gestellt. Das Wochenprogramm in dem Thermostat wird deaktiviert.

attr MAX_018d3f webCmd desiredTemperature

Soll-Temperatur setzen, ohne das automatische Programm des Thermostates abzuschalten. Es besteht die Möglichkeit eine Soll-Temperatur bis zum nächsten Schaltzeitpunkt zu setzen. Zum Beispiel kann das automatische Wochenprogramm in den Thermostaten dazu genutzt werden, nur abends die Soll-Temperatur zu senken. So läuft die Heizung nachts nicht voll durch. Wenn jedoch die Temperatur im Web-Interface von FHEM verändert wird, wird auch der Thermostat auf manuell gesetzt. So greift das Wochenprogramm nicht mehr. Abhilfe schafft der Befehl

set MAX_04711 desiredTemperature auto 20

Damit die Eingabe komfortabel aus FHEM möglich ist, kann ein Dummy-Device erstellt werden:

#Dummy für die Schnell-Einstellung der Temperatur bis zum nächsten automatischen Schaltzeitpunkt
 define HeizkoerperBad dummy
 attr HeizkoerperBad room MAX,Heizungen
 attr HeizkoerperBad setList state:eco,auto,14.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0
 attr HeizkoerperBad webCmd state
 define HeizkoerperBad.ntfy notify HeizkoerperBad.* {\
  my $valtemp = "$EVENT";;\
  my $device = "MAX_04711";;\
  my $cmd = 'set '.$device.' desiredTemperature auto '.$valtemp;;\
  fhem($cmd);;\
 }

Dieses Dummy-Device kann alternativ oder ergänzend zu attr MAX_018d3f webCmd desiredTemperature verwendet werden.

Internals

IST-Temperaturwerte

Plot eines MAX Heizkörperthermostates

Diese Abbildung zeigt, dass die IST-Temperatur nicht regelmäßig dem MAX CUBE mitgeteilt wird. Im Automatikbetrieb wird bei einer Änderung der Ventilstellung die neue Ventilstellung zusammen mit der aktuellen IST-Temperatur gesendet. Bei der Abbildung war die Therme in der Nacht ausgeschaltet. Daraufhin sank die Temperatur soweit ab, dass das Heizungsthermostat das Ventil in Maximalstellung geöffnet hat. Gegen 08:50 wurde die Therme eingeschaltet und die Soll-Temperatur an diesem Heizungsthermostat erhöht. Während dieser ganzen Zeit erfolgt keine Aktualisierung der Ist-Temperatur. So kommt es auch gegen 10:30 zu einem sprunghaften Temperaturanstieg von 13,5°C auf 19°C (siehe Markierung *A).

Die IST-Temperatur wird anscheinend aktualisiert bei einer Änderung der:

  • Ventilstellung
  • Soll-Temperatur
  • des Betriebsmodus (Auto/Manuell)

Wer eine detaillierte Kurve wünscht, sollte sich den MAX! Temperatur-Scanner ansehen.

MAXLAN

CUL_MAX

The MAX devices use a CC1100 chip. For parameters see rf_moritz.c in culfw. The thermostats use a Wake-On-Radio, thus one has to send packets at the right time.

CC1100 initialization sequence on one of the MAX devices (not Cube) (format: addr value, both in hex):

00 08
 02 46
 04 C6
 05 26
 0B 06
 10 C8 //MDMCFG4 DRATE_E=8
 11 93 //MDMCFG3 DRATE_M=147, data rate = (256+DRATE_M)*2^DRATE_E/2^28*f_xosc = (9992.599) 1kbit/s (at f_xosc=26 Mhz)
 12 03
 15 34
 17 00
 18 18
 19 16
 1B 43
 21 56
 25 00
 26 11
 0D 21
 0E 65
 0F 6A
 07 4C //PKTCTRL1: ADR_CHK=0 APPEND_STATUS=1 CRC_AUTOFLUSH=1 PQT=2 (preamble must have 8 toggling bits before sync word detection)
 16 1C //RXTIME=4
     RX_TIME_QUAL=1 (when rx timeout expires, keep receiving if either sync word is found or PQI is set (see PQT))
     RX_TIME_RSSI=1 (terminate RX if there is no carrier sense within the first 8 symbol periods)
 20 78 //WORCTRL, WOR_RES=00 (1.8-1.9 sec), RC_CAL=1, EVENT1=7 (48 ticks), RC_PD=0
 1E 87 //WOREVT1
 1F 6B //WOREVT0, i.e. EVENT0 = 34667
 29 59
 2C 81
 2D 35
 3E C3

Not set, i.e. factory defaults: 13 MDMCFG1 NUM_PREAMBLE=2 (4 preamble bytes) From the configuration, we see that the

RC Oscillator: f_xosc/750 = 34666.66 Hz
 Event1 = Event1(=48 ticks)/RC Oscillator = 1.385 ms
 t_Event0 = 750/26Mhz * EVENT0 * 2^(5*WOR_RES) = 1.00 second
 C(RX_TIME, WOR_RES)= 0.2254
 rx timeout = EVENT0·C(RX_TIME, WOR_RES) ·26/X(=26) = 34667*0.2254 us = 7.8139 ms

The ShutterContact seems to always sleep (DEVELOPMENT NOTE: from memory I can state that this phenomenon very likely is similar to / "caused by" the very precisely time-delay-slot-based battery-conserving Rx reception window protocol implementation of certain FS20 devices - window contacts?). Thus it is necessary to trigger it manually (by opening/closing the window) to make it receive messages. Pushing the button may work too. It is also awake just after pairing, so one may send messages right then. One can use the WakeUp message to keep it from sleeping for some time. (This is also the reason why in the official MAX software, one must trigger the ShutterContact after removing it from the house. The "factoryReset" packet is sent directly after the "ShutterContactState" packet has been acked.)


Probleme und Lösungen

Der Wandthermostat oder Heizthermostat reagieren nicht auf Änderungen über FHEM

Das Autocreate von FHEM erkennt, wenn aktiviert, die Geräte initial und legt auch Einträge an. Es fehlt aber noch das Pairing, da sonst keine Steuerung möglich ist! Wenn im Log also Meldungen wie

2013.03.20 15:12:30 5: CUL_MAX_SendQueueHandler: 1 items in queue
 2013.03.20 15:12:30 5: CUL_MAX_SendQueueHandler: 1 items in queue
 2013.03.20 15:12:30 2: CUL_MAX_SendQueueHandler: Missing ack from 01c9bb for 0b05008212345601c9bb0000

auftauchen (im Verbose Modus 5), dann wurde vermutlich kein oder ein inkorrektes Pairing durchgeführt. Nach dem Pairing sollten diese Meldungen verschwinden und stattdessen etwas wie

2013.03.20 15:21:43 5: Got matching ack

auftauchen.