NEWS
KNX Button / Action und Value über JavaScript Handler
-
Hallo Zusammen,
vorerst: Ich bin js UND iobroker Neuling, denke aber recht flott reinzukommen, wenn mir die Grundlagen klar sind.
Mein Thema ist hier bereits bekannt
KNX hat getrennt Aktion und Status, was über die bestehenden vis Elemente nicht abbildbar ist.Beispiel: Bulb On/Off an KNX Schalter.
Plan ist nun, einen js handler (mit subscribe) zu schreiben, der Status behandelt und dem vis objekt, welches schaltet, den aktuellen status mitzuteilen.
Was ich nun versucht habe ist ( nach Durchforsten der Threads hier zu diesem Thema):
subscribe({id: "knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status" , val: true}, function (obj) { console.log("XXX","status changed"); });
in meinen vis Editor / Reiter Scripte einzufügen.
In der runtime Umgebung sagt mir die js Console jedoch:
Uncaught ReferenceError: subscribe is not defined
Kann mir hier jemand auf die Sprünge helfen? Danke!
Edit:
Einen pragmatischen Ansatz sehe ich:
vis.subscribing.IDs.push("knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status"); vis.subscribing.byViews.Bedienen.push("knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status");
Und dann kann ich mit dem vis.registerOnChange arbeiten, um auf die Statusmeldungen zu reagieren.
Macht das Sinn? -
-
@thewhobox danke fürs schnelle feedback!
- on(...) hatte ich auch versucht, gleiches Ergebnis: Uncaught ReferenceError: on is not defined
- Danke für den Hinweis mit Trigger / true, das hätte ich dann als nächste Nuss zu knacken gehabt, wenn subscribe / on wenigstens schon mal läuft.
Hinweis. Ich habe den JavaScript Adapter nicht installiert, da ich der Auffassung bin, dass ein Trigger auch ohne dieses Engine registriert werden können sollte (ist das noch deutsch ???), die vis macht das ja schon erfolgreich in vis.js.
-
@peak3d Ohne Javascript Adapter? Wo machst dann deine skripte hin?
ich würde die zwei Sachen getrennt lassen. -
@thewhobox Im vis editor, Skripte:
Edit: Übrigens, dieser registerOnChange Ansatz funktioniert soweit.
-
@peak3d sagte:
KNX hat getrennt Aktion und Status, was über die bestehenden vis Elemente nicht abbildbar ist.
Deshalb benötigt man einen weiteren Datenpunkt für Vis, der duch ein Javascript bedient und ausgewertet werden muss. Ohne Javascript-Adapter geht es (wahrscheinlich) nicht.
-
Dies ist meine derzeitige (hacky) Implementierung in vis::Scripte, ohne den JS Adapter
function status_callback(arg, id, val, ack) { console.log('Status', 'Id:' + id+', Val:'+val); } vis.registerOnChange(status_callback); vis.subscribing.IDs.push("knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status"); vis.subscribing.byViews.Bedienen.push("knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status") ;
Und für den DP knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status (aber auch _Schalten) wird fleissig die callback aufgerufen.
Aber: damit ich das verstehe mit dem js adapter: Wird der JS code, den ich in der Adapter-Instanz anlege, auf dem Server ausgeführt? Mein Beispiel oben wird ja komplett client-seitig ausgeführt.
-
@peak3d Mit Javascript unter Vis kenne ich mich nicht aus.
-
@paul53 Danke trotzdem für die Antworten, mal sehen, vlt. kommt ja noch was....
Den workflow über die adapter - js - engine verstehe ich leider nicht wirklich, also wie der code dann in die vis kommt.
Muss man in der vis irgendeine .js datei includen, die vorher in der Adapter Instanz generiert wurde? -
@peak3d Der Javascript Adapter führt den Code unabhängig von der Vis aus.
Deswegen brauchst du dann noch einen zusätzlichen Datenpunkt, den du dann in der Vis anzeigen und steuern kannst.
Die Javascripte im JS-Adatper werden dann auf dem Server ausgeführt. -
@thewhobox prima, danke, dann ist das so etwa wie ich mir das vorgestellt habe.
Ich denke, damit kann ich erstmal gut weiterforschen -
Habe das nun soweit hinbekommen, schön ist anders, aber was ich gesehen habe bietet mir iobroker kein wirklich brauchbares Verfahren, um das KNX Problem zu lösen:
vis.setValueOld = vis.setValue; var StatusActionMap= { 'knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Status':'knx.0.Neue_Hauptgruppe.Neue_Mittelgruppe.Haus_Anbau_EG_Licht_Links_Schalten' } function mySetValue(id, val) { if (StatusActionMap[id]) { console.log('Map: ' + id + ' -> ' + StatusActionMap[id]); id = StatusActionMap[id]; } vis.setValueOld(id, val); } vis.setValue = mySetValue;
Im iobroker.vis Editor / Skripte eingefügt überläd es die setValue vom vis Objekt.
Im Bulb On/Off have ich die ObjektId vom Status angegeben, wodurch der Schalter immer den korrekten KNX Status anzeigt, auch wenn der Zustand am Aktor über Timer geändert wird.
Sobald auf die Birne geklickt wird, wird die überladene mySetValue funktion aufgerufen, welche dann die originale setValue funktion vom vis Objekt mit dem DP für schalten aufruft.
Vielleicht hilft das ja dem Einen oder Anderen, ich kann das nun auch gut für meine Dimmer verwenden.