Drucken

Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv
 

Automatisches Setzen von Systemvariablen mit aktuellen Ventil-Zuständen

Mit dem im Folgenden dargestellten Programm können die Zustände von Heizkörperthermostaten oder Stellmotoren (z. B. die Ventilöffnung) in Systemvariable geschrieben werden, die dann per Kanalzuordnung mit den jeweiligen Geräten als Zusatzinformation angezeigt werden.

Es wird ein Homematic-Programm erstellt, das einfach nur bei bestimmten Werte-Aktualisierungen auslöst (alle mit ODER verknüpft). Das gestartete Script erkennt über das Systemobjekt "$src$", welcher Channel von denjenigen ist, der die tatsächliche Aktualisierung hatte und verwendet ein Lookup-Array, um Informationen zu der zu setzenden Systemvariable zu erhalten und diese dann zu befüllen.

Zuallererst wird ein Programm angelegt, das als Wenn-Bedingung eine Reihe von mit ODER verknüpften Events enthält. Diese Events sollten genau diejenigen sein, die zu inhaltlichen Updates der Systemvariablen führen sollen:

 Das daraufhin auszuführende Script:

var source = dom.GetObject("$src$");
if (!source) { quit; }

string src_channel=dom.GetObject((source.Channel())).Name();


string separator_line = ";";
string separator_fields = "@";

! 0:Source-Channel-Name @ 1:Variablen-Name @ 2:Source-Datapoint-Name @ 3:Channel 1 Name @ 4:Channel 1 Datapoint @ 5:Channel 2 Name @ 6:Channel 2 Datapoint @ 7:Unit Main @ 8:Unit Delta

string devicelist =
  "Heizung KUE 1@Ventil KUE 1@VALVE_STATE@Heizung KUE 1@ACTUAL_TEMPERATURE@Heizung KUE 1@SET_TEMPERATURE@%@°;" #
  "Heizung KUE 2@Ventil KUE 2@VALVE_STATE@Heizung KUE 2@ACTUAL_TEMPERATURE@Heizung KUE 2@SET_TEMPERATURE@%@°;" #
  "Heizung OG BAD@Ventil OG BAD@VALVE_STATE@Heizung OG BAD@ACTUAL_TEMPERATURE@Heizung OG BAD@SET_TEMPERATURE@%@°;" #
  "Heizung SZ1@Ventil SZ1@VALVE_STATE@Heizung SZ1@ACTUAL_TEMPERATURE@Heizung SZ1@SET_TEMPERATURE@%@°;" #
  "Heizung SZ2@Ventil SZ2@VALVE_STATE@Heizung SZ2@ACTUAL_TEMPERATURE@Heizung SZ2@SET_TEMPERATURE@%@°;" #
  "Heizung SZ3@Ventil SZ3@VALVE_STATE@Heizung SZ3@ACTUAL_TEMPERATURE@Heizung SZ3@SET_TEMPERATURE@%@°;" #
  "Heizung WOZI links@Ventil WOZI links@VALVE_STATE@Heizung WOZI links@ACTUAL_TEMPERATURE@Heizung WOZI links@SET_TEMPERATURE@%@°;" #
  "Heizung WOZI rechts@Ventil WOZI rechts@VALVE_STATE@Heizung WOZI rechts@ACTUAL_TEMPERATURE@Heizung WOZI rechts@SET_TEMPERATURE@%@°;" #
  "Wandthermostat WOZI Messwerte@WoZi Temperatur@TEMPERATURE@@@@@°@;" #
  "Wandthermostat WOZI Messwerte@WoZi Luftfeuchtigkeit@HUMIDITY@@@@@%@;" #
  "Wandthermostat EG FLUR Messwerte@FLUR Temperatur@TEMPERATURE@@@@@°@;" #
  "Wandthermostat EG FLUR Messwerte@FLUR Luftfeuchtigkeit@HUMIDITY@@@@@%@;";

!dom.GetObject("_DEBUG").State(src_channel);

string devdata;

foreach (devdata, devicelist.Split(separator_line))  {
  string line_src_channel = devdata.StrValueByIndex(separator_fields,0);
  if (line_src_channel == src_channel) {
    string line_var_name = devdata.StrValueByIndex(separator_fields,1);
    string line_src_dp_name = devdata.StrValueByIndex(separator_fields,2);
    string line_ch1_name = devdata.StrValueByIndex(separator_fields,3);
    string line_ch1_dp_name = devdata.StrValueByIndex(separator_fields,4);
    string line_ch2_name = devdata.StrValueByIndex(separator_fields,5);
    string line_ch2_dp_name = devdata.StrValueByIndex(separator_fields,6);
    string line_unit = devdata.StrValueByIndex(separator_fields,7);
	string line_unit_delta = devdata.StrValueByIndex(separator_fields,8);

    real src_measure = dom.GetObject(line_src_channel).DPByHssDP(line_src_dp_name).Value();

    string s_delta = "";
    if (line_ch1_name <> "" && line_ch1_dp_name <> "" && line_ch2_name <> "" && line_ch2_dp_name <> "") {
      real ch1_measure = dom.GetObject(line_ch1_name).DPByHssDP(line_ch1_dp_name).Value();
      real ch2_measure = dom.GetObject(line_ch2_name).DPByHssDP(line_ch2_dp_name).Value();
      real delta_measure = ch1_measure - ch2_measure;
      if (delta_measure >= 0) { s_delta="+"; } else { s_delta = ""; };
      s_delta = " / " # s_delta # delta_measure.ToString(1) # line_unit_delta;
    }

    string s = src_measure.ToString(1) + line_unit + s_delta;
    dom.GetObject(line_var_name).State(s);
  }
}

 

Ein zentrales Element ist das Array "devicelist". Es handelt sich um eine einzige Zeichenkette; einzelne Datensätze werden mit einem Semikolon getrennt; einzelne Spalten in einem Datensatz wiederum werden mit einem "@"-Zeichen separiert.

Bedeutung der Spalten in einem Datensatz:

Spalte Bezeichnung Bedeutung
0 Source Channel Name Der Name eines Channels, der dieses Script auslöst; alle Datensätze mit einem matchenden Channel-Namen werden bearbeitet; es können Kanalnamen mehrfach auftreten (siehe Beispiel im Script, bei dem bei Aktualisierung durch einen Wandthermostat-Channel zwei Variablen gesetzt werden, für Temperatur und Luftfeuchtigkeit)
1 Variablen-Name Der Name einer bereits existierenden Systemvariable vom Typ Zeichenkette, in die das Ergebnis geschrieben wird
2 Source Datapoint Name Der Name eines Datenpunkts, den der auslösende Kanal bietet, um einen Messwert auszulesen, z. B. VALVE_STATE bei einem Thermostatventil (Kanal 4). Wenn die nächsten 4 Spalten leer sind, wird die Systemvariable mit dem Messwert gefüllt, gefolgt von der Maßeinheit aus Spalte 7 (die auch leer sein kann)
3 Channel 1 Name Name des ersten Zusatzkanals
4 Channel 1 Datapoint Name des Datenpunkts des ersten Zusatzkanals
5 Channel 2 Name Name des Zweiten Zusatzkanals
6 Channel 2 Datapoint Name des Datenpunkts des zweiten Zusatzkanals
7 Unit Main Maßeinheit, die, hinter den Haupt-Messwert gestellt wird; kann leer sein
8

Unit Delta

Maßeinheit, die hinter den Delta-Messwert gestellt wird; kann leer sein

Sobald alle vier Spalten 3 bis 6 nicht-leer sind, wird ein zweiter Wert ermittelt, nämlich das Delta von zwei weiteren Messwerten; es wird der Wert von (Channel 1 - Channel 2) ermittelt, ein "+"-Zeichen vorangestellt, falls positiv, und dieses Delta mit dem Trennzeichen " / " hinter den Haupt-Messwert gesetzt. Beispiel für diese Anwendung: die prozentuale Ventilöffnung (Source Channel Name und Datapoint) wird durch die Abweichung der Ist-Temperatur (Channel 1 Name und Datapoint) zur Soll-Temperatur (Channel 2 Name und Datapoint) ergänzt.

Zugriffe: 5199