Ankündigung

Einklappen
Keine Ankündigung bisher.

http-module -> ws4py erweiterung?

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

    http-module -> ws4py erweiterung?

    Hallo,

    ich würde gerne mein Webinterface für Z-wave so erweitern, dass es realtime die Änderungen anzeigt. Am besten/einfachsten geht das wohl über Websocket. Problem ist, dass das http-module das im aktuellen Zustand nicht kann. Ich habe mich mal umgesehen und ws4py entdeckt, das als Add-on zu cherrypy benutzt werden kann, was ja im http-module zu tragen kommt.

    https://ws4py.readthedocs.io/en/late...rial/#cherrypy

    Ich habe mir das mal angesehen, aber es scheint nicht ganz so simple zu implementieren zu sein, da es ja so sein muss, dass jedes Plugin seinen eigenen Namespace dort registieren muss.

    Frage ist, ob das generell eine gute Idee ist?

    #2
    Aktuell kannst Du das Plugin visu_websocket nutzen. Das tut z.B. Das Admin Interface auch um die Daten für die Ressource Graphen zu ermitteln.

    Für kommende Erweiterungen des Admin Interfaces haben wir ein neues Websocket Interface in Planung.
    Viele Grüße
    Martin

    Stay away from negative people. They have a problem for every solution.

    Kommentar


      #3
      hmm.. es wäre halt super, wenn man nicht einen extra Port benötigen würde.
      Und das visu_websocket bringt mir in meinem Fall leider nichts, da dass ja nicht auf die Interna meines Plugins zugreifen kann.

      Gibt es da schon konkrete Pläne?

      Kommentar


        #4
        Zitat von TCr82 Beitrag anzeigen
        Und das visu_websocket bringt mir in meinem Fall leider nichts, da dass ja nicht auf die Interna meines Plugins zugreifen kann.
        Auf die Interna des Plugins musst Du doch gar nicht zugreifen. Du greifst aus dem WebInterface Deines Plugins über Websockets auf das Plugin zu (Javascript Implementierung kannst Du in der smartVISU oder im Souce Code vom Admin Interface sehen).

        Das über Websockets implementierte Protokoll ist in der Developer Doku von SmartHomeNG beschrieben.

        Viele Grüße
        Martin

        Stay away from negative people. They have a problem for every solution.

        Kommentar


          #5
          Hallo TCr82 ,

          ich habe das für das neue Indego-Plugin (ist noch nicht public) mit einem Java-Script und einer Funktion im Plugin gelöst. Das Javascript wird im Web-Interface mittels "SetIntervall" im Intervall von 5 Sekunden aufgerufen. Das Javascript setzt einen Get auf das Plugin ab, das Plugin liefert die aktualisierten Daten als Json an das Javascript und das Javscript aktualisiert die Seite des Web-Interfaces. Ist zwar nicht ganz Realtime funktioniert aber für meine Zwecke gut. Ich kenne Dein Web-Interface nicht,
          denke es handelt sich um Werte in einer Tabelle. Man müsste dann beim Rendern der Web-Interface Tabelle entsprechend ID vergeben damit man die korrekten Einträge nach Erhalt der Daten vom Plugin entsprechend updaten kann oder die Tabelle komplett neu aufbauen.

          Funktion für den Get ans Plugin :
          =========================
          Code:
          function UpdateProto(proto_Name)
          {
              $.ajax({
                  url: "get_proto.html",
                  type: "GET",
                  data: { proto_Name : proto_Name
                        },
                  contentType: "application/json; charset=utf-8",
                  success: function (response) {
                          actProto(response,proto_Name);
                  },
                  error: function () {
                      console.log("Error - while updating Protocol :"+proto_Name)
                  }
              });
          };
          Funktion im Plugin :
          =========================
          Code:
              @cherrypy.expose
              def get_proto_html(self, proto_Name= None):
                  if proto_Name == 'Com_log_file':
                      return json.dumps(self.plugin._get_childitem('webif.communication_protocoll'))
                  if proto_Name == 'state_log_file':
                      return json.dumps(self.plugin._get_childitem('webif.state_protocoll'))
          Funktion zum aktualisieren im Web-Interface :
          =================================
          Code:
          function actProto(response,proto_Name)
          {
              myProto = document.getElementById(proto_Name)
              myProto.value = ""
              myText = ""
              var objResponse = JSON.parse(response)
              for (x in objResponse)
                  {
                   myText += objResponse[x]+"\n"
                  }
              myProto.value = myText
              if (proto_Name == 'Com_log_file')
              {
                  logCodeMirror.setValue(myText)
              }
              if (proto_Name == 'state_log_file')
              {
                  statelogCodeMirror.setValue(myText)
              }
          }
          Vielleicht hilft Dir das Deine Aufgabenstellung zu lösen.
          Gruss Andre

          Kommentar


            #6
            eigentlich reagiert das zwave-Protokoll auf events (man kann callbacks definieren).. diese Ereignisse könnte man natürlich zwischen puffern, bis diese per JS abgeholt werden. Aber richtig elegant ist das nicht.... Ich bin aber ehrlich gesagt noch nicht so weit weil mir momentan noch nicht die nötige Zeit übrig war, mich da tief genug einzugraben.

            Zudem es ja auch das http-modul schon gibt, was ja schon eine super Lösung bzgl. Webinterfaces für Plugins darstellt. Da ist der wurf zu Websockets im http-modul nicht so weit.

            Speziell würde ich eine Lösung bevorzugen, die nicht nochmal extra einen weiteren Port benötigt. Evtl. auch eine Anmeldung ermöglicht, die dann auch wiederum in den Websockets abgefragt werden kann.

            Das soll keinen Ersatz für die SmartVISU darstellen, sondern wirklich nur zur Administration dienen.....

            Aber evtl. schreibt ja auch msinn noch was dazu, was geplant ist...
            Zuletzt geändert von TCr82; 29.11.2019, 00:14.

            Kommentar


              #7
              Um das Thema ein wenig zu sortieren: Für eine Websocket Kommunikation (bei der der Server Aktualisierungen an den Client pushen kann) benötigt man folgende Bestandteile:
              • Websocket Server (der auf Anforderung Daten bereitstellt und Aktualisierungen sendet)
              • Websocket Client (der Daten anfordert und eingehende Aktualisierungen verarbeitet)
              • Protokoll-Definition, welche Payload der Websocket Requests und Websocket Answers berschreibt

              Für die Implementierung in Webinterfaces der Plugins von SmartHomeNG sieht die Sache folgendermaßen aus:
              • Ein Websocket Server für SmartHomeNG der Daten bereitstellt ist sinnvollerweise in Python programmiert. Ein solcher Websocket Server steht in Form eines Plugins bereits seit smarthome.py v1.0 zur Verfügung.
              • Websocket Clients müssen in der Sprache/für die Umgebung implementiert werden, in der sie genutzt werden. Bei Webseiten (wie es auch die Webinterfaces der SmartHomeNG Plugins sind) bietet sich eine Implementierung in Javascript an.
              • Die Templates für die Webinterfaces sehen bisher eine Websocket Kommunikation nicht vor. Diese lässt sich aber mit überschaubarem Aufwand nachrüsten. Als Vorlage dazu kann z.B. der Treiber io_smarthome.py.js der smartVISU dienen. Dieser Treiber implementiert sowohl die grundlegende Websocket Kommunikation mit SmartHomeNG, als auch das Daten-Protokoll der Payload, wobei vermutlich nur das Handling für das monitor Command benötigt wird.
              • Die Protokoll Definition, welche den Funktionsumfang des visu_websocket Plugins, als auch die Datenformate der Payloads beschreibt ist in der Developer Documentation beschrieben.

              Eine Neuimplementierung des Websocket Servers steht zwar auf der Roadmap, ist jedoch niedrig priorisiert. Alle bisherigen Anforderungen (auch für kommende Features im Admin Interface) können mit dem bisherigen Plugin realisert werden. Wenn neue Anforderungen auf die Agenda kommen, die eine Erweiterung des Websocket Servers für SmartHomeNG notwendig machen, so würde dieser nicht erweitert sondern neu implementiert. Dieses würde dann als ein Module erfolgen und nicht mehr als Plugin.
              Zuletzt geändert von Msinn; 29.11.2019, 08:47.
              Viele Grüße
              Martin

              Stay away from negative people. They have a problem for every solution.

              Kommentar

              Lädt...
              X