je mehr Aktoren ich von HM auf HmIP umrüste, umso enttäuschter werde ich. Die virtuellen Kanäle und die Trennung von "Befehls-Kanälen" und Status bringt Vorteile, im Bezug auf GUI und Apps wie TinyMatic bringt es allerding einiges durcheinander.
Mich hat es zum Beispiel genervt, dass in TinyMatic immer eine falsche Behanghöhe angezeigt wird, wenn man das Rollo unterwegs angehalten hat. Das Thema wurde ja auch schon öfters hier im Forum diskutiert.
Um nicht bei jedem Rollo den Kanal 4 zum Bedienen und Kanal 3 für den Status einbauen zu müssen, habe ich mir ein Skript gebastelt, dass die Ist-Behanghöhe aller BROLLs in Kanal 4 überträgt.
Auch wenn das Skript auf meine Bedürfnisse ausgelegt ist, möchte ich es Euch nicht vorenthalten. Ich benutze die Kanäle 5 und 6 als Aussperrschutz, das heißt die werden von SWDOs auf 0% oder 100% gesetzt. Bedient werden die Rollos, per Taster, Programm oder TinyMatic, immer über Kanal 4.
Die Kanäle 4, 5 und 6 sind auf OR (höherer Wert gewinnt) gestellt.
Aufgerufen wird das Skript über ein simples Programm
Wenn
Rollo 1 Statuskanal (Kanal 3), Rollade steht, bei Änderung
Oder
Rollo 2 Statuskanal (Kanal 3), Rollade steht, bei Änderung
...
Dann
Skript verzögert um 1 Sekunde
Code: Alles auswählen
! HmIP-BROLL Kanal 4 Soll-Wert auf Kanal 3 Ist-Wert setzen
! -----------------------------------------------------------------------------------
var logging = true;
var log = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Programme_loggen");
object src_dp = dom.GetObject("$src$");
if (src_dp) {
if (logging) { log.State(src_dp.Name() # " = " # src_dp.Value().ToString()); }
string s_dpname = src_dp.Name();
string s_iface = s_dpname.StrValueByIndex(":", 0).StrValueByIndex(".", 0);
string s_dev = s_dpname.StrValueByIndex(":", 0).StrValueByIndex(".", 1);
string s_chan = s_dpname.StrValueByIndex(":", 1).StrValueByIndex(".", 0);
string s_dp = s_dpname.StrValueByIndex(":", 1).StrValueByIndex(".", 1);
if (logging) { log.State("Interface " # s_iface # ", Geraet " # s_dev # ", Kanal " # s_chan # ", Datenpunkt " # s_dp # ", Wert " # src_dp.Value().ToString(0)); }
if ((s_dp == "PROCESS") && (src_dp.Value().ToString(0) == "0")) {
object o_chan3 = dom.GetObject(s_iface # "." # s_dev # ":3.LEVEL");
object o_chan4 = dom.GetObject(s_iface # "." # s_dev # ":4.LEVEL");
object o_chan5 = dom.GetObject(s_iface # "." # s_dev # ":5.LEVEL");
object o_chan6 = dom.GetObject(s_iface # "." # s_dev # ":6.LEVEL");
var ist_level = o_chan3.Value();
var level4 = o_chan4.Value();
var level5 = o_chan5.Value();
var level6 = o_chan6.Value();
if (logging) { log.State("Kanal 3: " # ist_level # ", Kanal 4: " # level4 # ", Kanal 5: " # level5 # ", Kanal 6: " # level6); }
if ( (((level4 - ist_level) > 0.02) || ((ist_level - level4) > 0.02)) && (level4 >= level5) && (level4 >= level6) ) {
if ( (((level5 - ist_level) > 0.02) || ((ist_level - level5) > 0.02)) && (((level6 - ist_level) > 0.02) || ((ist_level - level6) > 0.02)) ) {
if (logging) { log.State("Setze " # s_iface # "." # s_dev # ":4.LEVEL" # " auf " # ist_level); }
o_chan4.State(ist_level);
}
}
}
}