Web Push notification

Begonnen von mani, 15 Februar 2021, 22:53:06

Vorheriges Thema - Nächstes Thema

mani

Hallo hat schon jemand versucht web push notification im Ftui einzubauen?
Soweit ich das verstehe könnte man dan auch bei geschlossener Website Benachrichtigungen vom Server empfangen
Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

Thorsten Pferdekaemper

Hi,
ich habe jetzt angefangen, mich damit zu befassen. (Für FUIP, aber wenn das mal funktioniert, dann könnte das auch auf "reines" FTUI übertragbar sein.) Ich glaube, dass das ganze mal wieder nicht ganz so einfach ist:

  • Man braucht wohl zwingend SSL (HTTPS).
  • Es muss ein "Service Worker" auf dem Client registriert werden. Auf manchen Devices muss das "installiert" werden, d.h. als PWA.
  • Der Server (also wahrscheinlich die FHEM-Instanz) braucht eine VAPID, also zusätzlich zum SSL-Zertifikat noch ein bisschen mehr Security-Zeugs. Das lässt sich wahrscheinlich nicht automatisieren.
  • Das ganze ist dann auf einem zusätzlichen Server (Push Notification Service) registriert. Dieser Service ist Browser-abhängig.
  • Die Payload (also das, was man anzeigen will) muss nochmal verschlüsselt werden. Das ist insbesondere deshalb wichtig, weil man im Voraus nicht sicher sagen kann, wie sicher der Push Notification Service tatsächlich ist.
  • Apple scheint mal wieder Probleme zu haben, den Standard zu implementieren. Es kann also sein, dass man das für i*-Zeugs nicht hinbekommt.
  • Man muss dafür auch auf dem Server ein bisschen was machen. Das geht nicht mit FTUI alleine, da muss auch ein bisschen in Perl gebastelt werden, denke ich.
Es könnte aber gut sein, dass es das ganze tatsächlich Wert ist. Im Prinzip kann man beliebige Daten übertragen und es kann sein, dass das sogar aus dem lokalen Netzwerk funktioniert. Theoretisch müsste man dem Service-Worker beibringen können, die empfangenen Daten auf dem Client zu speichern und als Cache zu verwenden...
Ich habe vor, mich damit ein bisschen weiter zu befassen, kann aber nicht versprechen, dass dabei etwas brauchbares rauskommt.
Gruß,
   Thorsten
FUIP

mani

Hi,
freut mich das es bei dir auch auf Interesse stößt. :)... Ich habe aus mein Ftui als PWA über Apache laufen, dieses tutorial habe ich dazu gefunden
https://felixgerschau.com/web-push-notifications-tutorial/
Bin auch der Meinung das es funktionieren sollte bin leider noch nicht dazu gekommen mich mehr damit auseinander zu setzen... Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

Thorsten Pferdekaemper

Hi,

also bis zur Subscription bin ich gekommen. D.h. man kann jetzt die ganzen Keys, die man z.B. von Google bekommt im FHEM-Backend empfangen und theoretisch dort abspeichern.
Allerdings scheint der größere Aufwand im korrekten Aufbau der Push-Message selbst zu stecken. Das ganze Encryption-Zeugs ist schon ziemlich komplex. Die meisten Tutorials und Beschreibungen gehen von NodeJS oder PHP im Backend aus. Entsprechende Perl-Libs habe ich bisher nicht gefunden. Das muss man dann wohl selbst machen.
Das ist natürlich nicht so toll, aber andererseits macht es die Sache auch interessanter.

Momentan sieht es für mich auch so aus, dass das erst einmal weniger Frontend-Thema ist, sondern das meiste im Backend gemacht werden muss.

Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
ich habe mir jetzt mal auf einem RasPi das hier aufgesetzt:
https://www.phpclasses.org/blog/package/11632/post/1-How-to-Use-PHP-to-Send-Web-Push-Notifications-for-Your-Web-Site-in-2020.html
...und so gegen Mitternacht hat das dann sogar funktioniert, zumindest auf Chrome und Firefox auf dem Desktop.

Blöderweise war zumindest für Chrome das hier notwendig:
https://forum.fhem.de/index.php/topic,86421.0.html
bzw.
https://wiki.fhem.de/wiki/FHEM_mit_HTTPS_SSL-Zertifikat_und_eine_eigene_Zertifizierungsstelle
Bei Firefox reicht es, wenn der Benutzer das selbstsignierte Zertifikat akzeptiert. Chrome braucht das Root-Zertifikat. Man kann zwar HTTPS-Seiten unter Chrome auch abrufen mit selbstsignierten Zertifikaten, die kein weiteres Root-Zertifikat haben, aber der Service-Worker startet dann nicht. Das geht wohl nur mit installiertem Root-Zertifikat.

Ich sehe hier im Prinzip zwei Möglichkeiten, wie man jetzt sinnvoll weitermachen kann:

  • Das Backend (also FHEM) muss mit HTTPS laufen und zwar inklusive eigener Certificate Authority, um das Root-Level Zertifikat zu haben. Das muss man dann manuell auf alle Endgeräte (also Browser-Installationen) installieren.
  • Man schaltet einen weiteren "öffentlichen" Server dazwischen, der sich um das "Pushen" kümmert. D.h. man holt sich eine Domain mit Webspace, wo man sowas wie im ersten Link installiert. Die Domain muss mit HTTPS ansprechbar sein. Das sollte bei einem normalen Provider aber kein Problem sein. D.h. FHEM ruft dann (sinnvollerweise über HTTPS, aber so herum sollte das kein Problem sein) den eigenen Push-Provider auf, der das ganze dann an die Endgeräte ausliefert.
Ich weiß im Moment nicht, was mir besser gefällt. Die erste Möglichkeit klingt zwar ein bisschen blöd, da man auf jedem Handy etc. rumbasteln muss und es nicht ganz sicher ist, dass das auch in Zukunft so funktioniert. Allerdings ist FHEM meistens auf einen Haushalt beschränkt und nicht jeder hat 10 Tablets, 5 PCs und 8 Handys.
Die zweite Möglichkeit klingt auch erst einmal kompliziert, aber auch hier könnte recht viel automatisieren. Es dürfte auch rein technisch nichts dagegen sprechen, dass mehrere FHEM-Installationen sich so einen Push-Server teilen. ...hey, ich vermiete Euch einen Slot auf meinem FHEM-Push-Server. ;-)

Gibt es Meinungen dazu?

Gruß,
   Thorsten
FUIP

mani

Hallo das hört sich ja schon gut an.
Mein Ftui läuft schon verschlüsselt und als php Jedoch fhem selbst nicht.. Wäre das notwendig fhem selbst auch zu verschlüsseln? Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

Thorsten Pferdekaemper

Zitat von: mani am 06 April 2021, 09:21:45
Hallo das hört sich ja schon gut an.
Naja, ich habe eigentlich beschrieben, warum das nicht einfach wird. "Gut" ist anders.

Zitat
Mein Ftui läuft schon verschlüsselt und als php Jedoch fhem selbst nicht.. Wäre das notwendig fhem selbst auch zu verschlüsseln?
Wahrscheinlich meinst Du mit "verschlüsselt", dass es per https aufgerufen wird. Was Du mit "als PHP" meinst ist mir nicht so ganz klar. Mit "fhem selbst verschlüsseln" meinst Du wahrscheinlich eine FHEMWEB-Instanz, der per https aufgerufen wird.

Ich weiß jetzt nicht so ganz, wo ich mit den Erklärungen anfangen soll...
Der Punkt ist nicht unbedingt die Verschlüsselung, sondern dass man den Browser überzeugen muss, dass der Server auch der ist, der er behauptet zu sein. Das ist relativ einfach, wenn man eine "öffentliche" Webseite hat. Dann kann man sich in der Regel ein Zertifikat bei Letsencrypt besorgen, welches von praktisch allen Browsern akzeptiert wird. Das liegt daran, dass das (oder ein) zugehörige(s) Root-Level-Zertifikat (z.B. "DST Root CA X3") normalerweise bereits installiert ist.
Allerdings kann eine solche Zertifizierungsstelle keine lokalen IPs zertifizieren. Wie auch? Sowas wie 192.168.178.42 gibt es ja zig Millionen mal und jedesmal steckt ein anderer Server dahinter. (Ja, da gibt es auch Umgehungslösungen dafür...) Normalerweise legt man sich deswegen ein selbstsigniertes Zertifikat an, damit man zumindest mal so ein bisschen SSL machen kann. Das Zertifikat installiert man dann manuell oder sagt dem Browser beim Aufruf, dass es ok ist. Blöderweise reicht das manchen Browsern nicht wirklich. Spätestens beim Versuch, ein Service-Worker zu starten, wird es blöd. Details dazu gibt es z.B. hier: https://forum.fhem.de/index.php/topic,86421.0.html. ...und den Service-Worker braucht man halt, um eine Push-Notification zu empfangen.

Gruß,
   Thorsten

FUIP

Thorsten Pferdekaemper

Hi,
damit das nicht wieder so ewig lang wird habe ich meine Antwort mal gesplittet...

Ich habe jetzt so eine Art Prototyp einrichten können. Das PHP-Dingens aus https://www.phpclasses.org/blog/package/11632/post/1-How-to-Use-PHP-to-Send-Web-Push-Notifications-for-Your-Web-Site-in-2020.html habe ich mal auf meinem eigenen Webspace installiert und zum Laufen gebracht. Zusätzlich habe ich ein bisschen PHP gebaut, welches von außen mit einer Nachricht als Parameter aufgerufen werden kann, die dann an das ganze Push-Gedöns weitergeleitet wird. Das wird dann wiederum von einer Perl-Routine in FHEM aufgerufen. Diese Routine kann man dann z.B. in einem Notify verwenden.
Das funktioniert im Prinzip.

Allerdings hat man dann wieder etwas im öffentlichen Web, was man absichern muss. SSL ist sowieso klar, aber das, was FHEM dann aufruft (also das neue PHP) muss Passwort- oder sonstwie geschützt sein (ist es bei mir auch), weil das sonst jeder aufrufen kann.
Außerdem weiß ich nicht, ob das ganze nicht Overkill ist...

Gruß,
   Thorsten
FUIP

mani

ZitatMit "fhem selbst verschlüsseln" meinst Du wahrscheinlich eine FHEMWEB-Instanz, der per https aufgerufen wird.
genau👍
Also mein Https funktioniert soweit und auch Service worker
für die Pwa lässt sich starten es kommt nur die Meldung das fhem unverschlüsselt eingebunden ist... aber es funktioniert alles soweit. Werde es mal versuchen wie weit ich komm mit deiner ersten Variante. Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

Thorsten Pferdekaemper

Zitat von: mani am 06 April 2021, 10:46:13
Also mein Https funktioniert soweit und auch Service worker
Welchen Browser benutzt Du und was für ein Zertifikat liefert Dein Server?
Gruß,
   Thorsten
FUIP

mani

Ich nutze Chrome ich habe mit openssl eine eigene Zertifizierungsstelle erstellt und ein Zertifikat damit erstellt und danach das Zertifikat auf den Endgeräten installiert... Win 10 und Android funktioniert. Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

Thorsten Pferdekaemper

Hi,
ok, das hatte bei mir auch funktioniert. Ich fand das mit den Zertifikaten nur etwas umständlich.
Soweit ich verstehe, ist das aber nicht so ganz meine "Variante 1". Dafür müsste nämlich FHEM selbst mit HTTPS angesprochen werden, selbst die Endpoint-URL speichern (also die vom Push-Service) und es müsste auch selbst die Nachricht an diese URL(s) schicken. Dafür müsste man aber den ganzen Push-Krams, also das was im phpclasses-Link in PHP implementiert ist, nach Perl übersetzen. Ansonsten hat man ja im Prinzip nur eine lokale "Variante 2". So richtig cool wäre das erst, wenn man gar kein Apache/PHP-Gedöns mehr bräuchte, sondern FHEM das alles alleine kann.
Gruß,
   Thorsten
FUIP

mani

Wow... Scheint doch einiges an Arbeit zu sein
Einen Server von aussen zu nutzen find ich auch nicht gut... Ich müsste als erstes mal meine fhem Instanz so einrichten das sie nur bei https erreichbar ist..
ZitatSo richtig cool wäre das erst, wenn man gar kein Apache/PHP-Gedöns mehr bräuchte, sondern FHEM das alles alleine kann..

Das wäre genial 👍
Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

Thorsten Pferdekaemper

Zitat von: mani am 06 April 2021, 12:20:15
Einen Server von aussen zu nutzen find ich auch nicht gut... Ich müsste als erstes mal meine fhem Instanz so einrichten das sie nur bei https erreichbar ist..
Nein, es ist andersrum. FHEM ruft nach draußen und muss selbst gar nicht von außen erreichbar sein.
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi Mani,
bist Du weitergekommen?
Gruß,
   Thorsten
FUIP