Ankündigung

Einklappen

Hinweis

Die Forenregeln wurden überarbeitet (Stand 7.11.22). Sie sind ab sofort verbindlich. Wir bitten um Beachtung.
Mehr anzeigen
Weniger anzeigen

Neues Plugin: webpush

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

    Neues Plugin: webpush

    Hallo,
    ich würde gerne ein Plugin schreiben, welches es ermöglicht web push Nachrichten via Logik von SmarthomeNG aus an einen Client-Browser (Smartphone, Tablet, PC, …) zu senden. Dadurch ist es für Server zu Client Nachrichten nicht nötig einen Messenger wie Telegram oder einen externen Push service mit App usw. wie Pushover zu verwenden. Es reicht jeder gewöhnliche Browser aus. Ein Benutzer sollte sich dabei zusätzlich zu bestimmten Gruppen von Nachrichten registrieren können, um nicht immer alle Nachrichten zu erhalten.

    Meine bisherigen Überlegungungen sind dazu:

    -Plugin webpush
    Konfiguration:
    -Liste mit möglichen Nachrichten-Gruppen z.B. [Alarme, Infos, Heizung, Geräte]
    Logikmethoden:
    -sendPushNotification(Gruppe, Titel, Nachricht) z.B (Heizung, Überhitzung, „Puffer überhitzt!“)
    Notwendiges:
    -python Bibliothek wie z.B. solidwebpush
    -Datenbank mit web push subscription (id, key, …) und gewählten Nachrichten-Gruppen


    -SmartVisu-Widget webpush.config
    Parameter:
    -PublicServerKey (erhält man vom Plugin, könnte auch über Websocket/Item übertragen werden)
    -Item oder Text mit der gesamten Nachrichten-Gruppen Liste
    Oberfläche:
    -Liste zum Ankreuzen der möglichen Gruppen zu denen Nachrichten empfangen werden sollen
    -Bestätigungs-Button der web push auf dem Gerät aktiviert und Gruppenauswahl übernimmt
    Hintergrund:
    JavaSkript das den web push service worker und die subscription registriert und verwaltet. Dadurch wird auch erkannt ob push Nachrichten auf dem Gerät aktiviert sind. Die getätigte Gruppenauswahl für das Gerät müsste in einem Cookie gespeichert werden.


    Mein Problem an der Sache ist, dass ich nicht weiß, wie ich über den Websocket die Daten, die ich von der web push subscription erhalte und die Gruppenauswahl an das Plugin zurücksende, damit ich diese in die Datenbank schreiben kann und später Nachrichten schicken kann. Normalerweise wird dies über einen Html POST an den Server, wo ein PHP Skript wartet, zurückgesendet. Dies ist aber im Falle mit SmartVisu meiner Meinung nach nicht machbar und auch nicht nötig weil der Websocket ja eh schon offen ist.

    Hat jemand dazu und generell Ideen, die mir weiterhelfen oder Tipps was ich nicht vergessen sollte.


    LG
    Zuletzt geändert von hijacker7; 18.10.2022, 12:39.

    #2
    Naja, Post schreit ja schon nach REST oder?
    gibts da nicht schon ne unterstützung von smarthomeNG dafür? Wäre sogar ganz nett, dann könntest du mit python weiterarbeiten. Ich weiss allerdings nicht, welche daten zum registrieren gebraucht werden.. wahrscheinlich werden die nachrichten ja wieder per JS also smartvisu wieder zum Browser abgesetzt...

    Kommentar


      #3
      Hab mir das grade nochmal angeguckt könnte mans nicht so machen:
      - pushnotification json erstellen - per button als text in item übertragen
      - string aus item in json wandeln
      - in pythonplugin abgreifen und verarbeiten


      Zumindest wäre das analog hierzu
      In the browser, the promise handler for registration.pushManager.subscribe() returns a PushSubscription object. This object has a .toJSON() method that will return a JSON object that contains all the info we need to encrypt and push data.

      As illustration, a subscription_info object may look like:

      Code:
      {
      "endpoint": "https://updates.push.services.mozilla.com/push/v1/gAA...",
      "keys": { "auth": "k8J...", "p256dh": "BOr..." }
      }
      How you send the PushSubscription data to your backend, store it referenced to the user who requested it, and recall it when there's a new push subscription update is left as an exercise for the reader.
      Zuletzt geändert von bmx; 21.10.2022, 20:29.

      Kommentar


        #4
        Genau so hab ichs jetzt auch gemacht ich benutze ein Item als Kommunikations-Item.

        Hab schon eine lauffähige Version bei mir parat: https://github.com/gruberth/plugins/...evelop/webpush hab das Plugin auch hier nochmals als zip angehängt.

        Zum Testen das Plugin ins Verzeichis plugins legen, nach Neustart Plugin im Adminbereich aus Web/Cloud Plugins importieren und konfigurieren (dh. eig nur die Liste an Gruppen anlegen zb. alarm | info), oder direkt die plugin.yaml unter etc bearbeiten z.B.
        Code:
        webpush:
        plugin_name: webpush
        grouplist:
        - alarm
        - info​
        Zusätzlich muss der Item struct webpush.basic​ eingebunden werden, um dann letztendlich das widget in die Visu zu integrieren:
        Code:
        {{ webpush.config('', 'webpush.config.grouplist', 'webpush.config.publickey', 'webpush.comunication.fromclient') }}

        Nach einem Neustart sollte man sich über die Visu zu Nachrichten-Gruppen an- und abmelden können, die Einstellungen werden auf dem Gerät gespeichert.
        Über eine Logik oder einen eval-Befehl können dann Nachrichten versendet werden. zb.
        Code:
        sh.webpush.sendPushNotification("Test Nachricht an die Gruppe Info", "info", "Titel der Nachricht", "https://smarthomeng.de/")
        Es gibt noch viele weitere Parameter die angehängt werden können, z.b. um das Icon der Nachricht zu setzten, ein Bild einzubinden oder ein eigenes Vibrationsmuster anzulegen und noch einiges mehr. Habs noch nicht geschafft alles sauber durchzutesten aber die Basics funktionieren.


        Firefox auf Android hat ein Problem mit dem Empfangen von push Nachrichten, dazu gibt es schon lange ein Issue (https://github.com/mozilla-mobile/fenix/issues/19152) aber anscheinend intressiert es niemanden, dass es nicht funktioniert. Sonst hat es auf allen meinen Geräten und auch Browsern super geklappt, wobei die meiste Funktioalität (Vibration steuern, usw.) hat Chrome sowohl im desktop als auch mobilen Bereich.
        Bei mobilen Geräten muss kein Browser geöffnet sein, bei Desktop Browsern muss der Browser auf einer beliebigen Seite geöffnet sein um Nachrichten zu empfangen. Nachrichten werden auch nachträglich zugestellt, wenn das Gerät zunächst offline war (oder bei Desktop der Browser geschlossen) und dann wieder verfügbar ist.
        Bei sendPushNotification() gibt es den Parameter ttl wo die Zeit eingestellt werden kann wie lange maximal versucht werden soll die Nachricht nachzusenden. ttl=0 bedeutet hierbei kein nachsenden wenn das gerät nicht erreichbar war, jedoch werden Nachrichten mit ttl=0 mit höherer Priorität behandelt. Bei Android wird die Nachricht mit ttl>0 nur bei entsperrtem Bildschirm sofort erhalten, bei Bildschrimsperre dauert es etwas, hingegen bei 0 erscheint die Nachricht auch sofort am Sperrbildschirm. Es gibt für sendPushNotification() den Parameter highPriority der den zusätzlichen Urgency Parameter auf high setzt, somit werden Nachrichten generell aber auch speziell bei Stromsparmodus am mobil Gerät schneller empfangen.

        Webinterface und Doku sind noch nicht vollständig.

        Ideen, Fehlermeldungen und Anregungen sind willkommen.

        Frohes Testen.
        LG

        webpush.zip
        Zuletzt geändert von hijacker7; 22.10.2022, 08:38.

        Kommentar


          #5
          Das Plugin ist soweit fertig entwickelt, ich bräuchte noch ein paar Tester und etwas Feedback.
          Die oben angehägte Zip ist auf dem selben Stand wie mein Fork, ihr könnt euch also das Plugin von beiden Varianten hohlen. Für weitere Infos zur Verwendung und genauere Beschreibung der Parameter usw. schaut euch bitte die vorhergehende Nachricht, die userdoc datei und evtl die plugins.yaml an.

          Falls mir jemand, der in JavaScript fitter ist als ich, kurz über den Code in der sv_widgets/webpush.js schauen könnte, würde mich das auch sehr freuen. Dieser ist eine angepasste Variante von hier https://codelabs.developers.google.c...-notifications

          Würde dann, wenn sich ein paar Tester gemeldet haben, einen PR erstellen.

          Soll ich später einen neuen Thread für den Support aufmachen oder kann dieser umbenannt werden?

          LG
          Zuletzt geändert von hijacker7; 21.10.2022, 18:50.

          Kommentar


            #6
            Zitat von hijacker7 Beitrag anzeigen
            Frohes Testen.
            Hallo,

            ich wollte mir das mal anschauen und testen. Weit gekommen bin ich nicht ;o)
            Code:
            2022-10-21  20:20:51 ERROR    lib.plugin                               Plugin '_priv_webpush' from section 'webpush' exception: unable to open database file
            Traceback (most recent call last):
              File "/usr/local/smarthome/lib/plugin.py", line 162, in __init__
                plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._configfile)
              File "/usr/local/smarthome/lib/plugin.py", line 629, in __init__
                exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
              File "<string>", line 1, in <module>
              File "/usr/local/smarthome/plugins/_priv_webpush/__init__.py", line 89, in __init__
                self.initDatabase()
              File "/usr/local/smarthome/plugins/_priv_webpush/__init__.py", line 249, in initDatabase
                dbConn = sqlite3.connect(self.databasePath)
            sqlite3.OperationalError: unable to open database file
            Wie kann ich dann nur dieses Plugin aus Deinem Repo clonen?

            Danke und Gruß

            Kommentar


              #7
              Hallo,

              genau deshalb brauchts Tester 😅.

              Ein mkdir könnte natürlich nicht schaden, habs gefixt.

              Habe gerade geschaut, ist hier mit git sparse-checkout nicht so einfach und ich will dir dein ausgechecktes orginal plugin Repo nicht abschießen...
              Du kannst dir aber irgendwo (nicht im smarthome Verzeichniss und schon gar nicht bei plugins) mein Repo mit sparse auschecken - wie unten gezeigt- und dann halt immer den Ordner webpush nach plugins kopieren.

              Code:
              cd *irgendwohin wo es sicher ist*
              git clone --filter=blob:none --no-checkout --depth 1 --branch develop --sparse https://github.com/gruberth/plugins.git
              cd plugins
              git sparse-checkout add webpush
              git checkout
              
              cp -r webpush /usr/local/smarthome/plugins/_priv_webpush​
              ​
              Dieses Repo kannst du dann ganz normal mit git pull updaten und den cp Befehl erneut ausführen.
              Zuletzt geändert von hijacker7; 22.10.2022, 09:39.

              Kommentar


                #8
                Zitat von hijacker7 Beitrag anzeigen
                Ein mkdir könnte natürlich nicht schaden, habs gefixt.
                Danke.

                Zitat von hijacker7 Beitrag anzeigen
                Habe gerade geschaut ist hier mit git sparse-checkout nicht so einfach und ich will dir dein ausgechecktes Repo nicht abschießen...
                Du kannst dir aber irgendwo (nicht im Smarthome Verzeichniss und schon gar nicht bei plugins) mein Repo mit sparse auschecken - wie unten gezeigt- und dann halt den Ordner webpush nach plugins kopieren, geht aber whrscheinlich nicht vieel schneller als direkt von Hand.
                Aus diesem Grund lege ich die Plugins, an denen ich entwickle, direkt in mein Repo. So kann man schneller und direkt in der eigenen Installation Updates des "fremden" Pluigns machen.
                Dazu gibt es hier auch schon eine Anleitung, wie man das dann bei sich einbaut.
                Das macht es für dich, zumindest für den PR aufwendiger, für den anderen aber einfacher.
                Nur als Gedankenanstoß.

                Kommentar


                  #9
                  Habe ein neues Repo für das plugin aufgemacht. Somit kann sich jeder das plugin von da hohlen und ins plugins Verzeichniss clonen
                  Code:
                  cd plugins/
                  git clone https://github.com/gruberth/webpush priv_webpush
                  und später auch darin updaten
                  Code:
                  cd plugins/priv_webpush/
                  git pull​
                  Das Einbinden in der etc/plugin.yaml erfolgt dann z.B. mit
                  Code:
                  webpush:
                      plugin_name: priv_webpush
                      grouplist:
                      -   alarm
                      -   info
                  Der item Struct wird wie folgt eingebunden
                  Code:
                  System:
                      webpush:
                          struct: priv_webpush.basic​
                  Das widget lautet dann
                  Code:
                  {{ webpush.config('', 'System.webpush.config.grouplist', 'System.webpush.config.publickey', 'System.webpush.comunication.fromclient') }}
                  und die Logik
                  Code:
                  sh.webpush.sendPushNotification("Test Nachricht an die Gruppe Info", "info", "Titel der Nachricht", "https://smarthomeng.de/")
                  Ich hab zwar noch keine Ahnung wie ich dann den PR so hinbiege, dass mein Repo als Unterverzeichnis von smarthomeng/plugins/ auftaucht und die commits erhalten bleiben, aber alles zu seiner Zeit.

                  LG
                  Zuletzt geändert von hijacker7; 31.10.2022, 20:48. Grund: Renamed Repo

                  Kommentar


                    #10
                    Ach so ne s... Musste gerade feststellen, dass push nur über https funktioniert. Ich habe eine Installation über einen Proxy mit ssl bei dem klappts super und bei der anderen die nur über die lokale Ip und http läuft wird man drauf hingewiesen, dass push nicht unterstützt wird.

                    Mal schauen ob man das irgendwie anders regeln kann.

                    Kommentar


                      #11
                      Habe jetzt ssl über selbst signierte Zertifikate aktiviert. Bei Chrome desktop und mobil wird es unterbunden einen serviceworker auf http zu registrieren, dh da gehts nicht. Aber z.B. Firefox lässt es zu und da funktioniert es sogar mobil und es kommen die auch Nachrichten an leider momentan nur lautlos.

                      Kommentar


                        #12
                        Zitat von hijacker7 Beitrag anzeigen
                        Habe ein neues Repo für das plugin aufgemacht.
                        Danke dafür.

                        Nun kommt folgende Fehlermeldung:
                        Code:
                        2022-10-23  15:55:39 ERROR    lib.plugin                               Plugin '_priv_webpush' from section 'webpush' exception: [Errno 2] Datei oder Verzeichnis nicht gefunden: '/usr/local/smarthome/plugins/var/webpush/'
                        Traceback (most recent call last):
                          File "/usr/local/smarthome/lib/plugin.py", line 162, in __init__
                            plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._configfile)
                          File "/usr/local/smarthome/lib/plugin.py", line 629, in __init__
                            exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
                          File "<string>", line 1, in <module>
                          File "/usr/local/smarthome/plugins/_priv_webpush/__init__.py", line 90, in __init__
                            os.mkdir(self.pluginVarPath)
                        FileNotFoundError: [Errno 2] Datei oder Verzeichnis nicht gefunden: '/usr/local/smarthome/plugins/var/webpush/'​
                        Müsste das nicht in den Ordner: /usr/local/smarthome/var/webpush/'

                        Kommentar


                          #13
                          hijacker7

                          Nach einigen Neustarts ist die Fehlermeldung im Log nicht mehr finden.
                          Der Ordner '/usr/local/smarthome/var/webpush/' wurde auch angelegt und dort die Dateien abgelegt.

                          Dann gab es ein paar Neustarts, bei dem das Plugin auch nicht korrekt geladen wurde und somit das struct nicht gefunden werden konnte.
                          Nun geht es. Vielleicht lag es an der Nachinstallation der requirements.

                          Startet man shNG über die Konsole im "Debug-Modus", gibt es nicht ein paar Meldungen:
                          Code:
                          /usr/local/smarthome/lib/smarthome.py:885: CryptographyDeprecationWarning: Blowfish has been deprecated
                            obj = getattr(module, sym)
                          /usr/local/smarthome/lib/smarthome.py:885: CryptographyDeprecationWarning: CAST5 has been deprecated
                            obj = getattr(module, sym)
                          /usr/local/smarthome/lib/smarthome.py:885: CryptographyDeprecationWarning: IDEA has been deprecated
                            obj = getattr(module, sym)
                          /usr/local/smarthome/lib/smarthome.py:885: CryptographyDeprecationWarning: SEED has been deprecated
                            obj = getattr(module, sym)
                          ​
                          Muss das Modul 'cryptography' auch in die requirements?

                          Kommentar


                            #14
                            Zitat von Sisamiwe Beitrag anzeigen
                            Müsste das nicht in den Ordner: /usr/local/smarthome/var/webpush/'
                            Ja müsste es, ich hole mir den begin des Pfades über os.getcwd() dies sollte eigentlich immer usr/local/smarthome/ sein. Gibt es evtl. einen Befehl um BASE von smarthome.py abzufragen? (https://github.com/smarthomeNG/smart...rthome.py#L101)


                            Muss das Modul 'cryptography' auch in die requirements?
                            Ja cryptography gehört auch in die requirements. Die deprecated warnings werde ich rausfiltern die betreffen mich nicht und kommen nur beim import mit.



                            Sisamiwe Hat bei dir das Versenden und Empfangen geklappt?

                            Kommentar


                              #15
                              Zitat von hijacker7 Beitrag anzeigen
                              Hat bei dir das Versenden und Empfangen geklappt?
                              Um ehrlich zu sein, Nein.

                              In der smartVISU wird das widget angezeigt:
                              image.png

                              Anklicken kann ich die Groups, aber nach F5 ist alles wieder weg.


                              Die Item selbst sehe richtig gefüllt aus. Hatte aber noch keine Zeit, weiter nach dem Fehler zu suchen.

                              Kommentar

                              Lädt...
                              X