[FTUI3] Aufruf von Javascript aus FHEM heraus

Begonnen von andreas_r, 15 November 2022, 08:47:51

Vorheriges Thema - Nächstes Thema

andreas_r

Hallo zusammen,

gibt es eine elegante Möglichkeit, ein Javascript aus FHEM heraus zu starten und damit eine Aktion in FTUI(3) auszulösen?

Viele Grüße,
Andreas

mr_petz

Warum das? Gib mal ein Beispiel...
Geht bestimmt auch anders...

LG

andreas_r

Ich würde aus FHEM heraus z.B. gerne steuern, welches Tab (<ftui-tab>) geöffnet ist. Ich weiß, dass ich dafür eigentlich nur [(value)] an ein Devicereading mit on/off binden müsste. Hier aber habe ich folgendes Problem: FTUI wird auf zwei Tablets im Haus dargestellt. Wenn ich nun auf einem Tablet das Tab per FHEM Befehl wechsle, macht dies logischerweise das zweite Tablet mit.

Ich hatte daher gehofft, dass ich aus FHEM heraus eines der beiden Tablets direkt per Javascript anweisen könnte, auf den gewünschten Tab umzuschalten, ohne dass das zweite Tablet davon etwas mitbekommt.

VG, Andreas

mr_petz

Wenn ich dich richtig verstehe dann setzt du mit (value) ein Devicestatus und mit einem [get] triggerst du dann den Tabsprung oder was anderes?
Wenn dem so ist kannst du doch als einfache Lösung 2 Indexdateien mit gleichen Menü,Inhalt,Content.. was auch immer erstellen und da getrennte (value) und [get] setzen wo du darauf Triggerst...?
Musst da natürlich noch ein 2. Device (z.Bsp.: dummy) anlegen..
An den Tablets rufst du dann die 2 Index z.Bsp. so auf:

http://fhemIP:8083/fhem/ftui3/index1.html


http://fhemIP:8083/fhem/ftui3/index2.html

Hier liegt die index im ftui3 Ordner.

LG

andreas_r

Ja, genau so ist es. Und ja, die Lösung mit zwei Seiten hatte ich auch schon überlegt. Aber am Ende bedeutet das, dass ich damit praktisch alles außer der Includes redundant hätte und auch immer doppelt pflegen müsste.
Zur Not würde ich den Weg gehen, aber ungern. Daher eben die Überlegung mit dem Javascript. Aber dafür gibt es aus Deiner Sicht dann keinen Weg, oder?

VG

yersinia

Wenn du nur eine index.html nutzen willst, woher soll der Browser auf den tablets wissen, dass dieser gemeint ist? Wie unterscheidest du die Tablets Browserseitig?
Wenn du dies nicht (einfach/elegant) gelöst bekommst, dann solltest du mit zwei index.html arbeiten.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mr_petz

#6
Wenn dann so:

<script>
  function myFunction() {
    alert('Test');
  }
</script>


[value]="<Device>:<Reading | ()=>myFunction();"


Ich frage mich nur wie du da die Tablets unterscheiden willst?
Finde da die 2 Index einfacher. Auch wenn man beide doppelt pflegen müsste. So viel Arbeit ist es dann auch nicht...

LG

Edit:
Wenn mit 2 Index dann vergibst du halt einmal value="Device"
und im get dann value="{{value}}"
somit brauchst du nur value umschreiben bei einer Änderung der beiden Indexdateien

andreas_r

#7
ZitatIch frage mich nur wie du da die Tablets unterscheiden willst?
Ich hätte an ein entsprechendes Cookie gedacht, das ich dann abfrage.

Und danke für die Idee mit dem Aufruf der Function. Dass so was funktioniert, hätte ich nicht gedacht. Könnte man dann auch das reading der Funktion als Parameter mitgeben?

VG

mr_petz

#8
Zitat von: andreas_r am 16 November 2022, 09:42:38
...Könnte man dann auch das reading der Funktion als Parameter mitgeben?

VG

Ja

<script>
  function myFunction(v) {
    alert(v);
  }
</script>


v=>myFunction(v)


Aber wie gesagt so ist es einfacher:
Wenn mit 2 Index dann vergibst du halt einmal value="Device" im grid z.Bsp.
und im get dann [value]="{{value}}"
somit brauchst du nur einmal value im grid umschreiben bei einer Änderung der beiden Indexdateien

andreas_r

Noch zwei Fragen dazu, sorry:

1) an welches Element könnte man diese Function am besten anhängen? Soweit ich verstehe, ist das dann ja nur ein Platzhalter, um die Function von FHEM aus aufzurufen? Ein Label ohne Text?

2) Wann wird die Function dann getriggert? Sollte doch der Fall sein, wenn sich der Wert des Readings ändert, oder? Weil in meinem schnell erstellten Test wird die Function immer wiederholt aufgerufen, auch wenn sich der Wert des Readings nicht ändert.

VG, Andreas

mr_petz

#10
Zitat von: andreas_r am 16 November 2022, 10:01:14
Noch zwei Fragen dazu, sorry:

1) an welches Element könnte man diese Function am besten anhängen? Soweit ich verstehe, ist das dann ja nur ein Platzhalter, um die Function von FHEM aus aufzurufen? Ein Label ohne Text?

2) Wann wird die Function dann getriggert? Sollte doch der Fall sein, wenn sich der Wert des Readings ändert, oder? Weil in meinem schnell erstellten Test wird die Function immer wiederholt aufgerufen, auch wenn sich der Wert des Readings nicht ändert.

VG, Andreas

1) Ohne dein genaues Vorhaben/Gedankengänge zu kennen ist das suchen nach der Nadel im Heuhaufen... Da musst du mal Beispiele zeigen...

2) Dann zeige mal deinen schnell erstellten Test.
Bei mir wird nur die Function bei Änderung ausgeführt.
Wenn du natürlich bei jeden ftui-tab das drin hast, wird es auch immer ausgeführt, weil das (set) ja eine Änderung/Event im Reading erzeugt...
Da muss im Device only event-on-change-reading an sein...
Zur Not noch eine Bedingung mit einbauen in die Arrowfunction...

LG

andreas_r

Ich konnte das Thema mit den mehrfachen Aufrufen nachvollziehen, aber mir nicht erklären: Ich habe auf meiner Seite ein Element drin, was mir den Inhalt einer ReadingsGroup (battStatus) zeigt:

<ftui-grid-tile row="1" col="5" height="4" width="3">
        <ftui-content [content]="battStatus | getHTML('battStatus')"></ftui-content>
</ftui-grid-tile>


Sobald ich das auskommentiere, wird die Function wie erwartet nur einmal aufgerufen.

VG, Andreas

mr_petz

Schau mal in den HTML-Code der Readingsgroup, da verstecken sich fhem functions. nicht das deine function gleich benannt ist...

andreas_r

Sieht nicht so aus. Ich habe extra nochmal die Funktion umbenannt, aber es bleibt dabei: Trotzdem wird die Funktion mehrfach aufgerufen, wenn die RG aktiv ist. Scheinbar wird da irgendwas nochmal (meistens mehrfach) aktualisiert.
INteressant ist auch, dass das bei verschiedenen Aufrufen der Seite unterschiedlich oft passiert. Sehr merkwürdig.

Aber bitte mach Dir da keinen Kopf. Das ist etwas, was ich umgehen kann. Für mich ist die initiale Frage damit mehr als ausreichend beantwortet. Danke nochmal für Deine Mühen.

VG

OdfFhem

#14
@andreas_r

Angenommen, Du hast schon Deine finale Lösung erstellt ... dann im Zweifel nicht weiterlesen.

***

Ich würde eher den Overhead (versuchen zu) vermeiden, der mit (fast) gleichen Dateien entsteht.

Würde ein Mix aus URL-Parameter und JavaScript nicht für klare Verhältnisse an einer zentralen Stelle sorgen ?
(angelehnt an Startseite und Test-/Produktiv-Version)

Statt für jede neue Einstellmöglichkeit die URL an X Geräten nachjustieren zu müssen, könnte ich mir auch vorstellen, dass man die individuellen Parameter je Gerät in FHEM vorgibt.