Hallo zusammen,
ich habe das Script für meine Bedürfnisse optimiert und möchte euch das Ergebnis nicht vorenthalten.
Jeder State besteht ja im Grunde genommen aus drei Elementen: KNX-Read, KNX-Write und der kombinierte State im JS. Daher habe ich mir überlegt, dass man das in JavaScript auch per Array lösen kann. Nach der Array-Definition geht man dann in einer Schleife darüber und setzt mit "on(...)" die Subscriptions.
Das Array besteht aus Objekten, die jeweils drei properties haben: "knxread", "knxwrite" und "combined". Wird mit dem Adapter "web.0" der State "combined" verändert, so wird er nach "knxwrite" geschrieben. Wird per KNX (z.B. KNX-Taster) etwas verändert ("knxread" ändert sich), so wird der Wert nach "combined" übertragen.
Damit die Zeilen im Array nicht unnötig lang werden, habe ich das Präfix ausgespart. Es ist ja prinzipiell immer gleich und wird im späteren Verlauf (erste Zeilen in der Schleife) dann einfach hinzugefügt.
Das Script im Ganzen sieht dann so aus (Array ist nur auszugsweise und muss natürlich an die tatsächlichen Gegebenheiten angepasst werden!):
var pairs = [
// Erdgeschoss
{knxread: 'EG.Gästezimmer.Status', knxwrite: 'EG.Gästezimmer.Schalten', combined: 'EG.Gästezimmer.Schalten'},
{knxread: 'EG.Gästezimmer.Wert', knxwrite: 'EG.Gästezimmer.Wert_setzen_Deckenlicht', combined: 'EG.Gästezimmer.Wert'},
{knxread: 'EG.Wohnzimmer.Status', knxwrite: 'EG.Wohnzimmer.Schalten', combined: 'EG.Wohnzimmer.Schalten'},
// Obergeschoss
{knxread: 'OG.Ankleidezimmer.Position_Rolladen', knxwrite: 'OG.Ankleidezimmer.Position_anfahren_Rolladen', combined: 'OG.Ankleidezimmer.Position_Rolladen'},
{knxread: 'OG.Ankleidezimmer.Verfahrstatus_Rolladen', knxwrite: 'OG.Ankleidezimmer.Verfahrstatus_anfahren_Rolladen', combined: 'OG.Ankleidezimmer.Verfahrstatus_Rolladen'},
{knxread: 'OG.Schlafzimmer.Position_Rolladen_Fenster', knxwrite: 'OG.Schlafzimmer.Position_anfahren_Rolladen_Fenster', combined: 'OG.Schlafzimmer.Position_Rolladen_Fenster'},
// Aussenbereich
{knxread: 'Außenbereich.Garten.Status_Licht', knxwrite: 'Außenbereich.Garten.Schalten_Licht', combined: 'Außenbereich.Garten.Schalten_Licht'},
{knxread: 'Außenbereich.Garten.Status_Strom', knxwrite: 'Außenbereich.Garten.Schalten_Strom', combined: 'Außenbereich.Garten.Schalten_Strom'},
{knxread: 'Außenbereich.Balkon.Status_Licht', knxwrite: 'Außenbereich.Balkon.Schalten_Licht', combined: 'Außenbereich.Balkon.Schalten_Licht'},
{knxread: 'Außenbereich.Balkon.Status_Strom', knxwrite: 'Außenbereich.Balkon.Schalten_Strom', combined: 'Außenbereich.Balkon.Schalten_Strom'}
];
pairs.forEach(function(pair) {
pair.knxread = 'knx.0.' + pair.knxread;
pair.knxwrite = 'knx.0.' + pair.knxwrite;
pair.combined = 'javascript.0.KNX.' + pair.combined;
createState(pair.combined);
// Initialen Wert aus KNX in die kombinierten Objekte schreiben:
setState(pair.combined, getState(pair.knxread).val, true);
// Wert wird durch KNX geändert:
on({id: pair.knxread, change: 'ne'}, function(obj) {
setState(pair.combined, (obj.state ? obj.state.val : ''), true);
});
// Wert wird durch ioBroker web.0 geändert:
on({id: pair.combined, change: 'ne'}, function(obj) {
if ((obj.state ? obj.state.from : '') == 'system.adapter.web.0') {
setState(pair.knxwrite, (obj.state ? (obj.state.val === true ? 1 : (obj.state.val === false ? 0 : obj.state.val)) : ''), false);
}
});
});
Ich habe aktuell 138 Subscriptions, d.h. 46 (138/3) Objekte im Array und das Script läuft bei uns seit einigen Tagen völlig problemlos.