bestimmten TabletUI seite wechseln/JS ausführen

Begonnen von sn0000py, 06 Januar 2022, 11:16:48

Vorheriges Thema - Nächstes Thema

sn0000py

Frage
Was ist der einfachste Weg auf einem bestimmten TabletUI (es gibt 3 Tablets) ich möchte ein bestimmtest ansprechen und dort dann auf eine bestimmte Seite wechseln?

Thorsten Pferdekaemper

Hi,
ich weiß darauf zwar auch keine Antwort, aber ich finde die Frage interessant. Folgendes könnte bei der Beantwortung helfen:

FHEMWEB weiß im Prinzip, welche Clients gerade angebunden sind. Der angehängte Screenshot zeigt die FHEMWEB-Instanzen, wenn ich einmal über einen Laptop (...55) direkt über FHEMWEB in FHEM bin und einmal über mein Handy (...45) über FTUI (also genau genommen über FUIP, aber das ist in dem Fall egal).
D.h. irgendwo im Backend hat man die Information, welche Clients angebunden sind.

Wie würdest Du es denn lösen, wenn Du auf allen Tablets auf die bestimmte Seite wechseln wolltest?

Gruß,
   Thorsten

FUIP

sn0000py

ursprünglich dachte ich das es mit dem trigger WEB JS funktioniert, aber die werden bei mir nur bei den FHEM instanzen und nicht den TabletUI ausgeführt ... sonst würde es damit schon gehen.
Daher würde ich es dann so machen
https://wiki.fhem.de/wiki/Browsersteuerung,_Seiten_per_JS_autom._aufrufen

... Ausser irgendwer weiss wie man das trigger WEB JS#IP:location.reload() auch auf den TabletUI Devices zum laufen bringt?


Thorsten Pferdekaemper

Hi,

Zu trigger WEB JS: Ich vermute mal, dass FHEMWEB sozusagen ein Widget hat, das sich auf das entsprechende Event registriert und dann einfach das Script ausführt. Das hat FTUI halt nicht.

...und die andere Lösung sieht mir auch ziemlich FHEMWEB-spezifisch aus.

Man bräuchte da sowas wie das Reload-Widget (https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload), bei dem man auch noch eine URL mitgeben kann.
...und dann halt noch irgendwie die Sache mit der Auswahl des Clients.

Gruß,
   Thorsten
FUIP

sn0000py

ich habs im moment mal so gemacht das ich das reload widget kopiert habe und abgewandelt habe.
und dann einfach zwei mal index.html gemacht einmal für das tablet das mit dem widget und einmal ohne widget.

ist zwar sehr wild west aber funktioniert für mich mal so vorerst

Thorsten Pferdekaemper

Hi,
ich habe mal ein bisschen damit rumexperimentiert und ein paar Sachen mit FUIP ausprobiert, aber folgendermaßen müsste das auch mit FTUI funktionieren.
Zuerst bastelt man sich das hier in die fhem-tablet-ui.js:

  handleUpdates: function (data) {

    var lines = data.split(/\n/);
    for (var i = ftui.poll.long.currLine, len = lines.length; i < len; i++) {
      ftui.log(5, lines[i]);
      ftui.poll.long.lastLine = lines[i];
      var lastChar = lines[i].slice(-1);
      if (ftui.isValid(lines[i]) && lines[i] !== '' && lastChar === ']') {
        try {
          var dataJSON = JSON.parse(lines[i]);

          // ***** hier geht's los
  // is this a "trigger WEB JS:" command?
  if( dataJSON[0].match(/^#FHEMWEB:/) ) {
      eval(dataJSON[1]);
      continue;
          };
          // ***** und das war's auch schon

          var params = null;
          var param = null;


Damit sollten die FTUI-Seiten (wenn sie fhem-tablet-ui.js und nicht fhem-tablet-ui.min.js verwenden) den FHEMWEB-trigger mitbekommen und auch das Javascript darin ausführen. (Die richtige FHEMWEB-Instanz ist die mit dem Port, über den man FTUI aufruft.)

Es funktioniert dann auch der Filter über die IP-Adresse, also sowas wie

trigger WEB JS#192.168.178.55:ftui.toast("Hello")

Dabei ist zu beachten, dass das Javascript auch in FTUI sinnvoll sein muss. Sowas geht zum Beispiel nicht:

trigger WEB JS:FW_okDialog("Hello")

...weil es FW_okDialog halt nur in FHEMWEB gibt.
Blöderweise ergibt sowas wie ftui.toast eine Fehlermeldung, wenn man auch per FHEMWEB (mit demselben Port wie FTUI) in FHEM ist. Das kann man so vermeiden:

trigger WEB JS:if(typeof ftui !== 'undefined'){window.location="/fhem/uilocal/page/dotmatrix"}

Das zeigt auch gleich, wie man auf diese Weise die Seite wechseln kann.

Vielleicht werde ich sowas demnächst in FUIP einbauen. Für FTUI müsste das jemand anders tun, wobei ich das nicht genau so einbauen würde, da es zu Probleme führen könnte, wenn jemand den trigger für FHEMWEB verwendet und das Javascript in FTUI dann irgendwas Blödes bewirkt. 

Gruß,
   Thorsten

FUIP

sn0000py

Also prinzipiell funktioniert das mal, allerdings werden die toasts bei mir doppelt angezeigt

Habe "trigger WEB JS#10.0.4.188:ftui.toast("Hello")"
Bie mir sind aber auch 6 instanzen mit 10.0.4.188 vorhanden (FHEM selber meldet dann den fehler weils ftui nicht gibt aber das ist ja nur zum testen - auf dem tablet wo es dann zum einsatz kommt gibts nur TabletUI dann)

Thorsten Pferdekaemper

Hi,
kann es sein, dass auf Deiner Seite sozusagen zwei FTUIs laufen? Ich denke, dass das passiert, wenn man sich ein Menu nach dem pagetab-Beispiel gebastelt hat (https://wiki.fhem.de/wiki/FTUI_Widget_Pagetab#Navigationsleiste).
Dann hat man wahrscheinlich die Longpoll-Hauptschleife zweimal laufen und bekommt so auch zweimal das Javascript ausgeführt. Ich kann mir vorstellen, dass man das verhindern kann, indem man sich da, wo es tatsächlich ankommen soll, irgend eine Variable definiert und die dann im Javascript abfragt. ...also so ähnlich wie man die Verarbeitung auf der FHEMWEB-Instanz verhindern kann.
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,

ich habe jetzt mal versucht, so etwas in FUIP zu implementieren (sinngemäß könnte man das wahrscheinlich mit Einschränkungen dann auch in FTUI machen). Ich hatte sogar schon verschiedene Varianten am Laufen, aber es gab immer wieder etwas, was mir dann doch nicht so gepasst hat. Ich glaube, dass mir das Anwendungsszenario doch nicht so ganz klar ist.

Mal angenommen, es gäbe etwas, mit dem man aus dem Backend heraus was feuern könnte wie z.B. das "trigger"-Teil, welches dann irgendein Skript auf dem Frontend ausführt. Das funktioniert dann natürlich nur, wenn in dem Moment die FTUI-Seite auch offen (und sichtbar) ist und der Browser nicht gerade eingeschlafen. Ansonsten kann das Event verloren gehen (bzw. es wird sogar meistens verloren gehen).
D.h. man braucht eher etwas, was dem Benutzer in jedem Fall das anscheinend Wichtige anzeigt. Das würde aber mit einem ganz normalen Reading besser funktionieren. Also so ungefähr: Etwas wichtiges ist passiert und ich will, dass man das auch auf jeden Fall sieht. Dann trägt man (per notify oder so) die anzuzeigende Seite in ein Reading ein ("setreading global diewichtigeftuiseite /fhem/attention" oder man macht sich dafür ein dummy oder...). Dieses Reading wird dann von FTUI über den üblichen Mechanismus (oder so) gelesen und entsprechend behandelt. (Z.B. durch ein neues Widget, welches genau das macht.) Auf der Zielseite hat man dann noch einen Button ("Ja, ich hab's kapiert"), der das Reading zurücksetzt.

D.h. es ist egal, ob man gerade sein Tablet/Handy einschaltet, ob der Browser eingeschlafen ist oder ob man die Seite die ganze Zeit offen hat. Die "wichtige" Seite wird immer angezeigt, bis etwas anderes wichtig wird oder man den "ich hab's kapiert"-Button drückt.

Ich glaube, dass das sinnvoller wäre, als nur einen Event-Handler zu haben.

Gruß,
   Thorsten
FUIP

sn0000py

hallo ja im normalfall wird das schon der fall sein und auch so gehen.

Ich habe mir hier halt ein spezielles Szenario gemacht.

Ich habe ein Tablet (wobei eigentlich kein Tablet sondern, ein Touchmonitor auf nem Win 10 System) das 24/7 läuft mit TabletUI
In dem tablet UI habe ich dann einen iframe mit der KameraSoftware blue Iris.

per Alexa steuere ich dann "Alexa schalte Kamera ein/aus" "Alexa schalte Kamera auf Kanal 1" (Namen gehen leider nicht bei Alexa) und somit wird per javascript das iframe dann eingeblendet und oder auf eine andere url gewechselt.

Ausgeführt wird es meistens aus der Küche beim kochen, da hat man das Tablet im Blickwinkel.
Da wären in dem Fall der Trigger ganz passend