🌐 Reading wenn FHEMWEB aktiv, FHEM Seite gerade in Browsern geöffnet?

Begonnen von Torxgewinde, 11 September 2023, 19:20:00

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hallo,
Ich wollte gerne ein Reading haben, dass anzeigt ob ein FHEMWEB Device "WEB" gerade Daten austauscht, oder nicht. Das Reading soll auch Events generieren wenn sich der Zustand ändert. Die Internals "BYTES_WRITTEN", "BYTES_READ" und "CONNECTS" vom FHEMWEB erzeugen keine Events, deswegen gibt es einen Timer der diese Infos pollt:

defmod WEB.BusyIndicator.at at +*00:00:01 ##
attr WEB.BusyIndicator.at alias WEB Traffic
attr WEB.BusyIndicator.at alignTime 00:00:00
attr WEB.BusyIndicator.at event-min-interval state:60
attr WEB.BusyIndicator.at event-on-change-reading WEB\.Busy
attr WEB.BusyIndicator.at icon it_network
attr WEB.BusyIndicator.at stateFormat Busy: WEB.Busy
attr WEB.BusyIndicator.at userReadings WEB.BusyDetection {\
my $this = ReadingsVal($name, $reading, "0,0,0");;\
\
my $wr = InternalVal("WEB", "BYTES_WRITTEN", 0);;\
my $rd = InternalVal("WEB", "BYTES_READ", 0);;\
my $cn = InternalVal("WEB", "CONNECTS", 0);;\
\
my ($wr_old, $rd_old, $cn_old) = ($this =~ /^(\d+),(\d+),(\d+)/);;\
\
if ( "$wr,$rd,$cn" ne "$wr_old,$rd_old,$cn_old" ) {\
fhem("sleep 0.1;; setreading $name WEB.Busy on");;\
fhem("cancel $name.timer quiet;; sleep 10 $name.timer quiet;; setreading $name WEB.Busy off");;\
}\
\
return "$wr,$rd,$cn";;\
}

Will man das Reading beobachten, sollte man über Telnet in seine Installation reinschauen und "inform on WEB\..*" ausführen, sonst ist das Reading ja praktisch so gut wie immer auf "busy".

betateilchen

#1
Ich würde ja einfach die Anzahl der existierenden FHEMWEB Instanzen zählen und davon die Anzahl der in meinem FHEM definierten devices abziehen.

count TYPE=FHEMWEB raw
4

list TYPE=FHEMWEB
web
web2
web_longpoll
web_longpoll_192.168.123.161_57941

die ersten drei Instanzen sind devices, die in meiner Konfiguration vorhanden sind.

Wenn also der Wert aus count (4) größer ist als die Zahl meiner definierten devices (3) dann ist gerade irgendwo eine FHEMWEB Instanz "in Gebrauch".

Ansonsten kommt beim count 3 raus:

count TYPE=FHEMWEB raw
3

Edit: das count funktioniert übrigens auch mit TYPE=telnet, falls man wissen möchte, ob gerade eine telnet Instanz benutzt wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Torxgewinde

#2
@betateilchen: Das ist auch eine Möglichkeit, aber doch auch nur zum Pollen, oder? Auch müsste man hier bei "Connection-Closed" Verbindungen noch schneller pollen um Zugriffe zuverlässig zu detektieren.

Eine weitere Möglichkeit ohne Timer, wenn man nur Browseraktivität mitkriegen möchte, ist ein "stummer weblink" in jedem Raum der beim Besuch triggern soll:
defmod WEB.WebHook.weblink weblink htmlCode {\
    fhem("setreading WEB.WebHook.weblink bla $today $hms");;\
    return;\
}
attr WEB.WebHook.weblink room Raum1,Raum2,Raum3

Allerdings habe ich auch die App FhemNative ausprobiert und das öffnet gerne auch mal NUR einen websocket und würde damit nicht detektiert.

Weitere Möglichkeiten ohne Timer, die aber auch bei reinen Websocket-Clients nicht triggern:
  • Bei FHEMWEB die Zugriffe loggen und mit einem Logvorgang was ausführen
  • Bei einem Allowed Device die Events abfragen

Deswegen war ich dann bei der Lösung wie im obigem Post #1, die triggert bei reinen Websockets und natürlich auch bei regulären Browsern.