Skip to content

Der Glas RTR von MDT in Smarthome.py und Smartvisu

Stefan edited this page Nov 2, 2017 · 31 revisions

Die Raumtemperaturregler aus der Glasserie von MDT sind mittlerweile recht beliebt und weit verbreitet. Sie lassen sich sehr gut in smarthomy.py und smartvisu integrieren. Da einige das schon gemacht haben findet mal im Grunde alles im Netz, aber die Information ist auf mehrere Diskussionen verteilt und man muss sich alles mühsam zusammensuchen. Daher hier mal der Versuch einer kompletten Zusammenfassung des Themas. Das Ergebnis sieht in der Smartvisu am Ende so aus:

Screenshot

Alle Knöpfe liefern die entsprechende Funktion an den RTR der diese auch auf seinem Display richtig anzeigt. Umgekehrt werden auch Tastendrücke am RTR Display richtig in die Visu übertragen und dargestellt. Dazu müssen etliche Einstellungen zueinander passen. Fangen wir zunächst mit dem RTR an.

Den RTR parametrieren:

In der ETS vergibt man sechs Gruppenadressen wie in folgendem Bild:

Screenshot

Temperaturmesswert ist die aktuell im Raume gemessene Temperatur. Die Sollwertverschiebung bezeichnet die manuell (am RTR oder in der Visu) eingestellte Temperatur. Die Frostschutz Adresse benötigt man wenn man die Solltemperatur auf ein Mimimum absenken möchte wenn ein Fenster auf geht. Auf der Adresse Aktueller Sollwert liefert der RTR den Sollwert zurück, abhängig von Status und der Sollwertverschiebung. Die Betriebsdartenvorwahl steuert den Statut des RTR, also Anwesend, Abwesend, Nacht. Das ist sozusagen eine Zusammenfassung der Objekte 11,12 und 13 in einem Byte. Daher benötigen wir die Objekte 11 und 12 hier nicht. Dieser Status hat folgende Werte:

Frost: 04
Nacht: 03
Anwesend: 01
Abwesend: 02

Der oberste Zustand hat jeweils Priorität heißt: Frost und Nacht gleichzeitig geht nicht. Es bleibt nur Frost übrig. Wird der RTR richtig parametriert (nächster Absatz) so meldet er den Status stets zurück. Das ist wichtig für die Anzeige in der Visu.

Stellwert Heizen ist schliesslich der Wert welcher zum Ventil geht. Neben den Gruppenadressen sind folgende Parameter wichtig:

Screenshot

Sollwertänderungen senden sorgt dafür das Änderungen welche durch die Tasten am RTR vorgenummen werden auch in der Visu sichtbar werden. Status auf Objekt 31 senden tut das gleiche für den Status. Auf diesem Objekt kommt der Status genauso kodiert zurück wie er an den RTR gesendet wird (siehe oben). Daher ist die Visu immer mit dem RTR synchron. Die RTR Objekte 25 und 30 senden zwar auch den Status, aber in anderer Form. Daher werden sie hier nicht verwendet.

Die Items:

Zu den Gruppenadressen bauen wir uns jetzt die Items:

[OG]
  [[Tobias]]
    [[[FensterZu]]]
      type = bool
      visu_acl = r
      knx_dpt = 1
      knx_listen = 0/1/0
      knx_init = 0/1/0
    [[[DachfensterZu]]]
      type = bool
      visu_acl = r
      knx_dpt = 1
      knx_listen= 0/1/2
      knx_init = 0/1/2
    [[[Heizung]]]
      [[[[ist]]]]
        type = num
        visu_acl = rw
        knx_dpt = 9
        knx_init = 0/4/0
        knx_listen = 0/4/0
        sqlite = yes
        [[[[soll]]]]
          type = num
          visu_acl = rw
          knx_dpt = 9
          knx_init = 0/4/1
          knx_listen = 0/4/1
          sqlite = yes
        [[[[sollwertverschiebung]]]]
          type = num
          visu_acl = rw
          knx_dpt = 9
          knx_init = 0/4/2
          knx_listen = 0/4/2
          knx_send = 0/4/2
        [[[[stellwert]]]]
          type = num
          visu = true
          knx_dpt = 5001
          knx_init = 0/4/3
          knx_listen = 0/4/3
          sqlite = yes
        [[[[frost]]]]
          type = bool
          knx_dpt = 1
          visu_acl = rw
          knx_init = 0/4/5
          knx_listen = 0/4/5
          knx_send = 0/4/5
        [[[[status]]]]
          type = num
          visu_acl = rw
          knx_dpt = 20
          knx_init = 0/4/4
          knx_listen = 0/4/4
          knx_send = 0/4/4
        [[[[[uzsu]]]]]
          type = dict
          uzsu_item = OG.Tobias.Heizung.status
          visu_acl = rw
          cache = True

Hier ist jeder der oben genannten Gruppenadresse ein Item zugeordnet. Zusätzlich liegt auf dem Status eine Uhr damit z.B. Nachtmodus zeitgesteuert erfolgen kann. Die beiden Items für die beiden Fenster steuern über eine Logik das Item frost:

!/usr/bin/env python

if (sh.OG.Tobias.FensterZu()==0) or (sh.OG.Tobias.DachfensterZu()==0):
    sh.OG.Tobias.Heizung.frost(1)
if (sh.OG.Tobias.FensterZu()==1) and (sh.OG.Tobias.DachfensterZu()==1):
    sh.OG.Tobias.Heizung.frost(0)

So geht der RTR immer auf frost wenn eines der beiden Fenster geöffnet ist und nur dann wieder zurück wenn beide Fenster geschlossen sind. Kommen wir jetzt zur Visu.

Die Visu

ab Version 2.9

Mit dem Release von 2.9 wird der Standard device.rtr um die notwendigen Funktionen erweitert. Es muss kein separates Widget mehr eingerichtet werden.

Dazu muss device.rtr entsprechend folgendem Beispiel aufgerufen werden:

{{ device.rtr('', '', 'OG.Tobias.Heizung.ist', 'OG.Tobias.Heizung.soll', 
  'OG.Tobias.Heizung.status', 'OG.Tobias.Heizung.status', 'OG.Tobias.Heizung.status', 
  '', '', 0.2, 'OG.Tobias.Heizung.sollwertverschiebung', 
  [ 
    device.uzsuicon('','OG.Tobias.Heizung.status.uzsu','Anwesend','','','list',['Da:1','Weg:2','Nacht:3']), 
    icon.heating('','','OG.Tobias.Heizung.stellwert',0,90) 
  ]
) }}

bis und mit Version 2.8

Hier wurde das RTR Widget welches in der Smartvisu bereits vorhanden ist etwas angepasst. Ich habe alles rausgenommen was nicht notwendig ist und die UZSU hinzugefügt. Unten rechts gibt es jetzt einen Shifter welcher ein Heizungsicon abhängig vom Stellwert anzeigt. Somit wird das Icon abhängig vom Stellwert immer roter.

/**
 * MDT Glass RTR (Room Temperatur Regulator)
 *
 */
{% macro rtr(id, gad_actual, gad_set_value, gad_set, gad_status, gad_heat_value, gad_uzsu, step) %}
{% import "basic.html" as basic %}
{% import "widget_uzsu.html" as uzsu %}

<div id="{{ uid(page, id) }}" data-widget="device.rtr" data-step="{{ step|default(0.5) }}" class="rtr">

    <div class="actual">
        <div class="temp">{{ basic.float(id~'actual', gad_actual, 'C' ) }}</div>
    </div>

    <div class="set">
        <a data-role="button" data-icon="minus" data-inline="true" data-iconpos="notext" class="ui-mini"></a>
        <div class="temp" style="display:none;">{{ basic.float(id~'set', gad_set, '°' ) }}</div>
        <div class="temp">{{ basic.float(id~'set_value', gad_set_value, 'C' ) }}</div>
        <a data-role="button" data-icon="plus" data-inline="true" data-iconpos="notext" class="ui-mini"></a>
    </div>

    <div class="control">
        {{ basic.switch(id~'mode', gad_status, icon1~'user_available.png', icon0~'user_away.png', '1', '2') }}
        {{ basic.switch(id~'night', gad_status, icon1~'scene_night.png', icon0~'scene_day.png', '3', '2') }}
        {{ basic.switch(id~'frost', gad_status, icon1~'weather_frost.png', icon0~'weather_frost.png', '4', '2') }}
        {{ uzsu.uzsu_icon(id~'uzsu',gad_uzsu,'Anwesend','0','','','list','Da:1,Weg:2,Nacht:3') }}
        {{ basic.shifter(id~'shift', '', gad_heat_value, icon1~'sani_heating_series_00.png', icon0~'sani_heating_series_00.png',0,90 ) }}
    </div>
</div>
{% endmacro %}

Die png Dateien für orange gibt es hier:

PNG und SVG Dateien.

Dort findet sich auch die svg Datei womit ich sie erzeugt habe. Wer die Version 2.8 oder neuer der Visu verwendet muss trotzdem die png Versionen benutzen. Die kann man genauso in den icons/or oder icons/ws Ordner kopieren wie bei Version 2.7 auch. Ein dynamiamisches Icon gibts noch nicht.

Zum Schluss wird das Widget in die html Seite eingebunden:

<div class="block">
  <div class="set-2" data-role="collapsible-set" data-theme="c" data-content-theme="a" data-mini="true">
    <div data-role="collapsible" data-collapsed="false">
      <h3>Heizung</h3>
      {% import "widget_ext.html" as ext %}
      {{ ext.rtr('OG.Tobias.Heizung', 'OG.Tobias.Heizung.ist', 'OG.Tobias.Heizung.soll', 'OG.Tobias.Heizung.sollwertverschiebung', 'OG.Tobias.Heizung.status', 'OG.Tobias.Heizung.stellwert','OG.Tobias.Heizung.status.uzsu',0.2) }}
    </div>
  </div>
</div>

Das sollte dann so ausschauen wie in dem Beispiel oben. Wenn nicht ist irgendwas falsch.