Ankündigung

Einklappen
Keine Ankündigung bisher.

Kommunikation via json - Dokumentation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Kommunikation via json - Dokumentation

    Hallo,

    ich betreibe einen selbst entwickelten/geschriebenen (C++) Home-Automationsserver. Angebunden sind WAGO-Knoten via Modbus sowie über ein IP-Interface der KNX-Bus. Die Clients (Visualisierung) sind ebenfalls in C++ geschrieben und kommunizieren via CORBA. Das Teil läuft seit über 10 sehr stabil, ein Umstieg auf eine andere Platform kommt eher nicht in Betracht. Vor kurzem bin ich auf SmartVISU aufmerksam geworden, habe mich ein wenig damit beschäftigt und bin dann dem Gedanken erlegen, es als (Web-)Visualisierung an meinen Server anzubinden. Soweit ich es einschätzen kann, ist wohl die "neutralste" Schnittstelle json. Also habe ich kurzerhand einen kleinen json-Server geschrieben und einer der Beispiel-Seiten geladen. Beim Seitenwechsel oder Betätigen von Buttons kommen im Server auch die entsprechenden (KNX)Gruppenadressen an ... nur was sende ich zurück? Meine Frage lautet also, gibt es irgendwo eine Beschreibung der json-Schnittstelle?

    Vielen Dank und mit besten Grüßen!

    #2
    Die SmartVISU hat für jedes System einen eigenen Treiber den Du einfach ins System einbinden kannst. Also für SmartHomeNG, OpenHAB, direkt KNX etc. gibt es eigene Treiber. Also entweder schreibst Du Dir einen neuen Treiber für SmartVISU mit Javascript (vielleicht auf Basis eines exisitierenden Treibers) oder aber Du schaust Dir das Gegenstück an (z.B. OpenHAB hat Java, SmartHomeNG hat Python als Basis) und schreibst dann Deine Schnittstelle intern neu.

    Gruß,
    Bernd

    Kommentar


      #3
      Der JSON-Treiber wäre wohl schon dafür gedacht/geeignet, leider ist mir aber auch keine Dokumentation bekannt.

      Da du ja offensichtlich programmieren kannst, ist der Programmcode vielleicht Dokumentation genug für dich ;-)
      Die entscheidenden Stelle findest du in driver/io_json.php auf den Zeilen 53 - 106.

      Wenn ich das richtig verstehe, werden von der Antwort auf write() maximal 4 * 128 Bytes gelesen. Wenn das jeweils 128. Byte ein EOT ist, wird geschaut, ob die Antwort eine 1 war.
      Keine Ahnung, was die Idee dahinter ist und ob das überhaupt funktionieren kann.

      Beim read() ist es etwas klarer: Dort wird ein JSON in folgender Form erwartet:
      Code:
      [
      { "Itemname1": Wert1 },
      { "Itemname2": Wert2 }
      ]
      Dort ist zwar auch dieses EOF im 128. Zeichen, das kann aber einfach ignoriert werden, weil dann einfach die ganze Response gelesen wird.

      Kommentar


        #4
        Vielen Dank Euch Beiden schon mal.

        bmx Hmm, das hatte ich natürlich auch schon schnell herausgefunden. Einen neuen Treiber zu schreiben ist auch nicht so sehr das Thema (wenngleich nicht in meiner "angestammten" Sprache - aber man kann nicht Alles haben - es geht vielmehr um eine eher "high-level" Betrachtung der Schnittstelle. Also, was erwartet SmartVISU als Response? Wie schon geschrieben, die Request-Daten (von SmartVISU) sind verstanden, ich könnte damit im Prinzip über meinen Server "Lichter anschalten". Aber die SmartVISU erwartet eine Antwort, was ich auch daran erkenne, dass der Socket (den SmartVISU für jede Aktion öffnet) offen bleibt. Und rein prinzipiell denke ich mir, dass die SV auf ein ACK oder den Status wartet. Ebenso wenn ich auf eine andere Seite umschalte: da kommen etliche Requests, die natürlich dafür da sind, die Seite entsprechend aktuell zu rendern. Aber auch hier: was genau (high-level) erwartet die SV? Und wann man das dann etwas weiter runter bricht, via json werden die Elemente (z.B. Tags oder Gruppenadressen) Komma-separiert übertragen, erwartet die SV dann als Response in genau der Reihenfolge die entsprechenden (aktuellen) Werte dafür? Und wie sehen die Werte aus? Ein 'Aus' oder eine '0' für den entsprechenden Wert?

        smai Danke für den Hinweis auf die Programmstelle - aber leider beantwortet das auch nicht ganz meine Frage, was SV von mir "erwartet". Ich habe einen kleinen Raw-Socket-Server zusammengeworfen (geschrieben wäre hier zu viel gesagt) und SV mit dem JSON-Treiber darauf verwiesen. Ich bekomme als Requests (ich habe das mit mehreren von den beiliegenden Demo-Projekten - also z.B. "Fleischer" getestet) so etwas:

        // Jalousie Auf/Ab/Stop/Abs.Pos:
        Read 25 bytes:
        {OG.living.blind.move:1}.
        Read 25 bytes:
        {OG.living.blind.move:0}.
        Read 25 bytes:
        {OG.living.blind.stop:1}.
        Read 26 bytes:
        {OG.living.blind.pos:235}.

        Das Gleiche in einem anderen Projekt:
        Read 16 bytes:
        {0/2/1/1.001:0}.
        Read 16 bytes:
        {0/2/1/1.001:1}.
        Read 16 bytes:
        {0/2/2/1.001:1}.

        Beim Seiten Umschalten dann so etwas da hier:

        {4/0/4/9.xxx,4/0/3/9.xxx,4/0/8/1.001,4/0/6/1.001,4/0/7/1.001,4/0/2/1.001,4/1/1/1.001,4/1/5/5.xxx,4/1/31/1.001,4/1/35/5.xxx,4/1/11/1.001,4/1/21/1.001,0/0/4/9.xxx,0/1/2/1.001,0/1/12/1.001,0/1/22/1.001,0/1/32/1.001,0/0/2/1.001,1/0/4/9.xxx,1/1/2/1.001,1/1/12/1.001,1/1/22/1.001,1/0/2/1.001,2/0/4/9.xxx,2/1/2/1.001,2/0/2/1.001,3/0/4/9.xxx,3/1/2/1.001,3/0/2/1.001,5/1/2/1.001,4/1/2/1.001,4/1/12/1.001,4/1/22/1.001,6/0/4/9.xxx,6/1/2/1.001,6/0/2/1.001,7/0/4/9.xxx,7/1/2/1.001,7/1/12/1.001,7/0/2/1.001,8/0/4/9.xxx,8/1/2/1.001,8/0/2/1.001,9/0/4/9.xxx,9/1/2/1.001,9/1/12/1.001,9/0/2/1.001,10/0/4/9.xxx,10/1/2/1.001,10/0/2/1.001}

        Damit kann ich gut arbeiten, das sind die Tags aus den Pages, kein Problem die selbst zu parsen oder einen der bekannten JSON-Parser einzusetzten (wobei das hier schon fast ein "overkill" wäre). Aber die Frage bleibt bestehen: was erwartet SV als Antwort.

        Vielen Dank für Eure Zeit!








        Kommentar


          #5
          Ich habe mir den Source-Code driver/io_json.php nochmal genauer angeschaut was wieder etwas "Licht in das Dunkel" gebracht hat. In der Funktion "read()" überträgt SV eine Liste von Items, auf die es anschließend eine Antwort mit "\4" als EOF möchte. Ist die Antwort dann etwa auch einfach nur eine Komma-seprarierte Liste mit Werten in analogie zu den Requests (also "{0,1,235}" für den Request ala "{LichtA, LichtB, JalousiePos}")? Sollte es so einfach sein? Gleich mal meinen Fake-Server erweitern und damit experiementieren

          Kommentar


            #6
            Wie oben geschrieben müsste die Response auf ein Read ein JSON mit Items und entsprechenden Werten sein. Darin sollten natürlich die Items aus dem Request vorhanden sein.
            Auf ein Write einfach nur eine 1 um zu bestätigen, dass der Write angekommen ist. Ich versteh nur das mit den 4*128 Bytes und anschliessendem EOT nicht.

            EDIT: Habe eben festgestellt, dass die Struktur oben wohl nicht ganz stimmt. Es müsste kein Array sein sondern ein einzelnes Object mit den Items als Schlüssel. Also so:
            Code:
            {
            "Itemname1": Wert1,
            "Itemname2": Wert2
            }
            Falls du wissen willst, wo das dann verarbeiter wird: io_json.js, Zeile 187
            Zuletzt geändert von smai; 07.12.2016, 21:31.

            Kommentar


              #7
              Das wirst Du jetzt nicht glauben ... aber ich saß gerade an der "all: function ... " in io_json.js (Kopf leichte Rauchzeichen von sich gebend ..) als ich dachte: "schaus't doch mal, ob jemand im Forum geantwortet hat" ... Wahnsinn, oder?

              Noch eine Verständnisfrage: ein automatisches aktualisieren der Widgets (Lampe, Temperatur) gibt es? Ist das der Schalter "Realtime" beim Treiber? Wen dem so ist (meine Annahme), dann fänd' ich das ziemlich schade, da dies ja über Polling geschieht. Besser wäre hier ein Callback via WebSockets.

              Kommentar


                #8
                Hmm, ich denke mal WS wird wohl schon verwendet, verstehe nur das Prinzip nicht ganz. Anscheinend synchronisieren sich die Sessions auf dem Server nicht untereinander, sodass jede Session ihr eigens Refresh macht (machen muss) und bei Änderung die zur Session gehörige Seite refresht.

                Kommentar


                  #9
                  Der JSON-Treiber scheint mit Polling zu arbeiten. Die me8sten anderen Treiber arbeiten aber tatsächlich mit einem Websocket.
                  Ivh verstehe auch nicht ganz, weshalb es beim JSON-Treiber diesen php "Proxy" gibt, fast alle anderen Treiber bauen die Verbindung zum Backend direkt vom Browser aus per Javascript auf.

                  Kommentar


                    #10
                    Ich glaube mittlerweile, dass der json-Treiber nicht wirklich funktioniert. Ich habe jetzt einfach mal die Lnknx-Schnittstelle verwendet, meinen Server entsprechend der "Spezifikation" (http://linknx.sourceforge.net/files/example-php.txt) angepasst (ein wenig XML bit-bang) und schon funktionierts ... Ich denke es wird auf einen eigenen Treiber hinauslaufen. Danke für Deine Unterstützung!!

                    LG aus Coburg

                    Kommentar


                      #11
                      Falls du dabei auf JSON setzen magst, würde ich eine Neuimplementation eines JSON-Treibers gerne in das Projekt aufnehmen.

                      Kommentar


                        #12
                        Off topic: damit ich mich hier im Forum etwas besser zurecht finde, darf ich fragen was Deine Rolle hier ist? Arbeitest Du an der Entw./Weiterentw. von SmartVISU?

                        Kommentar


                          #13
                          Ja, im Moment betreue ich das leider so ziemlich als einziger richtig aktiv. Martin Gleiß, dessen Projekt das eigentlich ursprünglich ist, hat kaum mehr Zeit.
                          Wenn du also Lust hast, ist Hilfe gerne willkommen.

                          Kommentar


                            #14
                            Hmm, Zeit ist bei mir auch ein Albtraum. Ich bin selbstständig und in meinen Projekten sehr gut ausgelastet. Ich hatte SV ins Auge gefasst, weil ich dachte mir damit bei der Visualisierung Arbeit sparen zu können ... das hat sich bislang als "nicht ganz richtig" erwiesen. Aber wenn ich einen Treiber baue, lass' ich Dir das natürlich gern zukommen.

                            Beste Grüße, bis demnächst!

                            Kommentar


                              #15
                              Ich hole den uralten Thread mal vor, weil gestern auf GitHub ein issue wegen eines fehlenden Beispiels erstellt wurde.

                              Nutzt jemand den JSON-Treiber erfolgreich und kann die erforderlichen Einstellungen und Formate hier näher beschreiben?

                              Gruß
                              Wolfram

                              Kommentar

                              Lädt...
                              X