Hallo,
ich lese ein Directory ein, sortiere es und schreibe eine HTML-Datei, in der mit select eine dieser Dateien ausgewählt werden kann. Dazu wird bei jedem neuen Einlesen des Directories die ganze Datei neu geschrieben wobei nur "data-items" immer wieder aktualisiert wird. Eine bessere Lösung ist mir nicht eingefallen.
Problem ist, dass die neue Datei immer nur dann in der Oberfläche angezeigt wird, wenn man mit F12 den Buffer des Browsers Chrome gelöscht hat. Ich weiß nicht worauf ich hier triggern soll, damit ein Update ausgelöst wird, denn es gibt erst einmal kein neues Reading.
<div data-type="select"
data-device="logDir"
class="top-space orange"
data-items='["tracking-2019-10-20.log","tracking-2019-10-21.log","tracking-2019-10-22.log"]'>
</div>
Mit dieser Include-Anweisung wird das Select angezeigt.
<div data-type="include" data-url="dir_select.html" data-parameter='{}'></div>
Geht allles tadellos, nur erfolgt keine Aktualisierung, was mir auch klar ist, aber ich weiß nicht, wie ich das hin bekommen kann.
Vielen Dank schon mal.
Hi,
der "übliche" Trick bei solchen Sachen ist glaube ich, die URL eindeutig zu machen. Also in etwa
div data-type="include" data-url="dir_select.html?time=<aktuelle Uhrzeit>" data-parameter='{}'></div>
...oder sowas.
Dummerweise musst Du dann halt auch die übergeordnete Datei generieren. ...und dann kannst Du das mit dem Include auch gleich sein lassen.
...oder Du machst Dir Deine eigene Version des include-Widgets, das per Ajax mit "cache: false" den Cache abschaltet.
...oder Du schaltest den Cache komplett ab mit
$.ajaxSetup({ cache: false });
...irgendwo am Anfang. Dann könnte aber alles etwas langsam werden.
Gruß,
Thorsten
@ Thorsten Pferdekaemper
Vielen Dank, aber ich kann alles außer C++ nur rudimentär und bin aus dem Stand nicht in der Lage mir irgendwelche Widgets zu bauen. Wenn ich das könnte, dann würde ich mir ein eigenes Widget "select" bauen, das beim Druck auf den Auswahlbutton die Funktion aufruft, die das Directory liest, ordnet, sortiert und das html-File schreibt und dann das ganze zur Auswahl anbieten. Aber das kann ich nicht und muss Klimmzüge machen.
Vielleicht fällt Dir noch mehr ein.
Einen Erfolg habe ich schon mal, der zwar das Grundproblem nicht löst, aber step to step ...
Damit die Änderung des html-files ohne "Zutun" erfolgt, nutze ich inotify, das das Verzeichnis überwacht und bei jeder Änderung dort das Verzeichnis neu einliest.
Internals:
CFGFN
DEF /opt/fhem/log tracking.*
FD 36
FILES tracking.*
MID inotify_optfhemlogtracking
NAME tracking_inotify
NOTIFYDEV global
NR 143809
NTFY_ORDER 81-inotify
PATH /opt/fhem/log
STATE active
TYPE inotify
VERSION 0.6.1
READINGS:
2019-10-22 17:38:30 lastEventFile /opt/fhem/log/tracking-2019-10-17.log
2019-10-22 17:38:30 lastEventMask IN_CREATE
2019-10-22 15:32:20 state active
helper:
dirs:
/opt/fhem/log
events:
0:
file /opt/fhem/log/tracking-2019-10-17.log
mask IN_CREATE
time 2019-10-22 17:38:30
1:
file /opt/fhem/log/tracking-2019-10-17.log
mask IN_DELETE
time 2019-10-22 17:37:18
2:
3:
4:
5:
6:
7:
8:
masks:
IN_CREATE
IN_DELETE
Attributes:
DbLogExclude .*
mask IN_CREATE,IN_DELETE
room Presence,System
In einem DOIF wird dann auf lastEventFile getriggert und das Verzeichnis neu eingelesen und die html-Datei geschrieben, die leider (noch) nicht in FTUI aktualisiert wird.
Hi,
Dir geht's doch eigentlich nur um die Auswahloptionen, oder? Dann könntest Du auch mit data-list arbeiten und die Optionen in ein Reading schreiben.
Gruß,
Thorsten
@ Thorsten Pferdekaemper
Vielen Dank Thorsten, das mit "data-list" hatte ich einfach überlesen. Funktioniert nun genau so, wie ich mir das dachte und ist etwas einfacher.