📡 Javascript-Befehl an alle gerade offenen Browser senden, FW_directNotify()

Begonnen von Torxgewinde, 08 Juli 2023, 12:16:57

Vorheriges Thema - Nächstes Thema

Torxgewinde

Will man an die gerade offenen Browserfenster einen Javascript Befehl senden, gelingt dies mit der Funktion "FW_directNotify()".

Hier ein Dummy-device, dass diese Funktion per userReadings ausführt wenn man den wert "hello" setzt. Setzt man den Wert auf "Broadcast: bla" wird in allen offenen Browsern "Broadcast bla" eingeblendet. Man kann natürlich beliebige andere JS Befehle ausführen.

defmod webtest dummy
attr webtest readingList wert
attr webtest setList wert
attr webtest userReadings FHEMWEB_Variablen {\
return "\
\$FW_ME........: $FW_ME\t(URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist)\
\$FW_dir.......: $FW_dir\t(Das Basisverzeichnis auf dem lokalen Filesystem des FHEMWEB-Servers)\
\$FW_CSRF......: $FW_CSRF\t(Enthält das aktuell gültige CSRF-Token als HTTP URL-Parameter für die aktuelle Verbindung oder bleibt leer)\
\$FW_detail....: $FW_detail\t(Enthält den Definitionsnamen der aktuell erzeugten Detailansicht)\
\$FW_room:.....: $FW_room\t(Enthält den Raumnamen der aktuell erzeugten Raumansicht)\
\$FW_wname.....: $FW_wname\t(Enthält den Definitionsnamen der aktuellen FHEMWEB-Instanz)\
\$FW_cname.....: $FW_cname\t(Enthält den Definitionsnamen der aktuellen Verbindung (Connection-Name))\
\$FW_userAgent.:\t$FW_userAgent\t(Enthält den User-Agent, welcher für den aktuellen Aufruf übermittelt wurde)";;\
},\
FHEMWEB_JS_AN_ALLE_BROWSER:wert.* {\
    #https://wiki.fhem.de/wiki/DevelopmentFHEMWEB-API\
    \
    my $val = ReadingsVal($name, "wert", "???");;\
    \
    #wenn der Wert "hello" ist, dann führe das JS aus, sonst nichts machen\
    return "NOK" if ($val ne "hello");;\
    \
    #iteriere über alle FHEMWEBs\
    map {\
            #Nur ein bestimmter Raum:\
            #FW_directNotify("FILTER=room=Experimente", "#FHEMWEB:$_", "FW_okDialog('Hello world!')", "");;\
            \
            #Alle Räume:\
            FW_directNotify("#FHEMWEB:$_", "FW_okDialog('Hello world!')", "");;\
        } devspec2array("WEB.*");;\
        \
    return "OK";;\
},\
FHEMWEB_Broadcast:wert.* {\
    my $val = ReadingsVal($name, "wert", "???");;\
    \
    #wenn der Wert mit "Broadcast: " beginnt, dann führe das JS aus, sonst raus\
    return "NOK" unless ($val =~ /^Broadcast: /);;\
    \
    map {\
            FW_directNotify("#FHEMWEB:$_", "alert('$val')", "");;\
        } devspec2array("WEB.*");;\
        \
    return "OK";;\
}

GIF Animation dazu:
Du darfst diesen Dateianhang nicht ansehen.

Torxgewinde

Hier ein Dummydevice, bei dem man den mehrzeiligen Javascript-Code in ein Attribut eingeben kann.

defmod directNotifyTest dummy
attr directNotifyTest userattr js
attr directNotifyTest js console.log("dies ist ein Test aus dem UserAttribut heraus");;\
\
let uuid = crypto.randomUUID();;\
console.warn("Ich habe mir was ausgedacht, das ist eine UUID: " + uuid);;
attr directNotifyTest readingList cmd
attr directNotifyTest setList cmd
attr directNotifyTest userReadings status:cmd:.cmd1 {\
  #an alle Seiten und Webinstanzen senden\
  map { FW_directNotify("#FHEMWEB:$_", "console.log('guten Tag aus cmd1');;", "") } devspec2array("WEB.*");;\
  return "cmd1";;\
},\
status:cmd:.cmd2 {\
  #nur an die gerade offene, auch vom Absender genutzte Webinstanz, senden:\
  return FW_directNotify("#FHEMWEB:$FW_wname", "console.log('guten Tag aus cmd2');;", "");;\
},\
status:cmd:.cmd3 {\
  my $js = AttrVal($name, 'js', '');;\
\
  #an alle Seiten und Webinstanzen senden\
  map { FW_directNotify("#FHEMWEB:$_", $js, "") } devspec2array("WEB.*");;\
  return "cmd3";;\
},\
status:cmd:.cmd4 {\
  my $js = AttrVal($name, 'js', '');;\
  $js =  MIME::Base64::encode_base64($js, '');;\
  $js = "eval(atob('$js'));;";;\
\
  #an alle Seiten und Webinstanzen senden\
  map { FW_directNotify("#FHEMWEB:$_", $js, "") } devspec2array("WEB.*");;\
  return "cmd4";;\
}
attr directNotifyTest webCmd cmd cmd1:cmd cmd2:cmd cmd3:cmd cmd4
attr directNotifyTest widgetOverride js:textField-long,87

Ausführen kann man das JS aus dem Attribut mit dem FHEM Befehl:
set directNotifyTest cmd cmd4