Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. KNX Button / Action und Value über JavaScript Handler

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    KNX Button / Action und Value über JavaScript Handler

    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      peak3d last edited by peak3d

      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 paul53 2 Replies Last reply Reply Quote 0
      • thewhobox
        thewhobox @peak3d last edited by thewhobox

        @peak3d Mach mal statt dem subscribe ein on "on({id: "knx.0.Ne[...]"

        Außerdem reagiert dein Trigger nur, wenn der neue Wert true ist. Ist das so gewollt?

        1 Reply Last reply Reply Quote 0
        • P
          peak3d last edited by

          @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.

          thewhobox 1 Reply Last reply Reply Quote 0
          • thewhobox
            thewhobox @peak3d last edited by

            @peak3d Ohne Javascript Adapter? Wo machst dann deine skripte hin?
            ich würde die zwei Sachen getrennt lassen.

            P 1 Reply Last reply Reply Quote 0
            • P
              peak3d @thewhobox last edited by peak3d

              @thewhobox Im vis editor, Skripte:

              be18a0c6-463f-49cd-9400-4e16f305fc67-image.png

              Edit: Übrigens, dieser registerOnChange Ansatz funktioniert soweit.

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @peak3d last edited by paul53

                @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.

                P 1 Reply Last reply Reply Quote 0
                • P
                  peak3d @paul53 last edited by

                  @paul53

                  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.

                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @peak3d last edited by

                    @peak3d Mit Javascript unter Vis kenne ich mich nicht aus.

                    P 1 Reply Last reply Reply Quote 0
                    • P
                      peak3d @paul53 last edited by

                      @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?

                      thewhobox 1 Reply Last reply Reply Quote 0
                      • thewhobox
                        thewhobox @peak3d last edited by thewhobox

                        @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.

                        P 1 Reply Last reply Reply Quote 0
                        • P
                          peak3d @thewhobox last edited by

                          @thewhobox prima, danke, dann ist das so etwa wie ich mir das vorgestellt habe.
                          Ich denke, damit kann ich erstmal gut weiterforschen

                          1 Reply Last reply Reply Quote 0
                          • P
                            peak3d last edited by

                            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.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            791
                            Online

                            31.9k
                            Users

                            80.1k
                            Topics

                            1.3m
                            Posts

                            3
                            12
                            736
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo