FTUI3: Daten manuell aktualisieren [Erledigt]

Begonnen von Det20, 29 September 2022, 08:13:46

Vorheriges Thema - Nächstes Thema

Det20

Hallo,

ich habe hin und wieder das Problem, dass einige Controls wie "ftui-switch" auf dem Tab nicht korrekt aktualisiert werden. Ich muss dann die Seite mehrmals neu laden, damit die Controls korrekt aktualisiert und die Daten angezeigt werden. Das Phänomen ist, dass es nicht alles betrifft, Labels sind oftmals korrekt, aber auch nicht immer. Das alles passiert nur sporadisch, aber immerhin 3-4 mal die Woche.

Kann ich die aktualisierung irgendwie händisch aufrufen? Wie ein Refresh Button, der dann die Daten nochmals abruft und die Controls aktualisiert oder ein (JavaScript) Timer, der das sicherheitshalber alle 15 Minuten macht?

PS: Bitte nicht wieder eine 'dann läuft was in deinem Netzwerk falsch' Diskussion.

mr_petz

Würdet ihr die Suchfunktion im Haupthread benutzen, dann brauch man auch nicht immer gleich ein neues Thema erstellen.
Erster Treffer in der Sufu mit Refresh:
https://forum.fhem.de/index.php/topic,115259.msg1233412/topicseen.html#msg1233412

Anders wird es nicht gehen...
LG

Det20

Also tatsächlich nur durch Refresh der Seite? Schade, aber trotzdem vielen Dank

mr_petz

#3
Es geht sicherlich auch mit einem Interval (timer)...
Aber wieder nur auf ein Device und mit extra js. Wird aber dabei wieder sehr Ressourcenlastig (soviel javascript)...
Ich denke, wenn die einzelnen Seiten überladen sind mit Komponenten, kommt es zu solchen Fehlern.
Einfach mal das entsprechende Device:Reading separat (irgendwo anders) laufen lassen und beobachten.
Oder das entsprechende Device mal beobachten ob es Readings/Events bekommt:

<script>
  setInterval(
    () => myout.innerText =
      ftuiApp.fhemService.getReadingItem('AussenTemp:temperature').data.time,
      //ftuiApp.fhemService.getReadingItem('AussenTemp:temperature').data.update,
    6000
  );
</script>
<div id="myout">Timestamp von Fhem</div>

AussenTemp:temperature durch dein Device ersetzen...

stammt von hier:
https://forum.fhem.de/index.php/topic,115259.msg1190823.html#msg1190823

Edit. OK mit:

ftuiApp.fhemService.getReadingItem('Device').data.value

holst du das value...

LG

Det20

Hierüber werden Controls, die nicht aktualisiert wurden, nachträglich aktualisiert.
Rufe einfach die function main aus der ftui.js auf; funktioniert :)


<ftui-icon class="size-1" name="refresh" @click="javascript:main();"></ftui-icon>

mr_petz

Ok, ich würde trotzdem eine Ursachenforschung betreiben an deiner Stelle. Irgendeinen Grund muss es ja bei dir geben???

Det20

Habe schon recht viele controls, teilweise für dieselben Devices, nur halt einmal visible, einmal invisible. Dazu jede Menge popups und Charts. Denke, die startup Zeit reicht reicht manchmal nicht aus.

setstate


      <ftui-view-toolbar>My Home
        <ftui-row slot="end" width="6em">
          <ftui-label [text]="ftui:lastEvent:time | toDate() | format('hh:mm:ss')" color="primary" size="1">
          </ftui-label>
          <ftui-icon name="refresh" color="primary" size="-2" @click="forceRefresh()"></ftui-icon>
        </ftui-row>
      </ftui-view-toolbar>

Det20

#8
Danke dir. Laut Label wird regelmäßig aktualisiert, die switches sind trotzdem nicht aktuell. Muss mal schauen, ob die Event-Handler von main() und "readystatechange" korrekt gesetzt werden, das wäre noch eine Idee.

Hinterher bekomme ich sie mit "forceRefresh" nicht aktualisiert, nur mit "javascript:main()". Ich denke ich mache einen Timer, der 10 Sekunden nach Seitenaufbau die "main()" nochmal aufruft. Oder alle 30 Minuten. Schaden kann es, wenn ich mir die main() so anschaue, ja eigentlich nicht, oder was meinst du?

mr_petz

#9
Bei mir geht es nur so mit vorangesetzten fhemService:

<ftui-icon name="refresh" color="primary" size="-2" @click="fhemService.forceRefresh()"></ftui-icon>

oder:

<ftui-icon name="refresh" color="primary" size="-2" @click="ftuiApp.fhemService.forceRefresh()"></ftui-icon>


Edit:
Zur Kontrolle kannst du für dein Device auch mal ein label mit der UpdateTime anzeigen lassen:

<ftui-label [text]="Device | ()=>fhemService.getReadingItem('Device').data.update | toDate() | format('DD.MM. - hh:mm:ss')" color="primary" size="1">

2xDevice durch deins ersetzen...

LG

Det20

Ja, mit refresforce klappt es, sieht mir eleganter aus als die interne Main  :)

mr_petz

Zitat von: Det20 am 30 September 2022, 07:43:45
Danke dir. Laut Label wird regelmäßig aktualisiert, die switches sind trotzdem nicht aktuell.
.....
Zeige mal eine Definition vom switch und was für Readingvalues kommen sollen...

Det20

#12
Nix wildes an sich, nur halt jede Menge davon:


<ftui-view-item [disabled]="Wallbox.Modus | isNot('Manuell')">
  <div class="cell">
   <ftui-label size=3>Wallbox</ftui-label>
   <ftui-label [text]="Wallbox.Modus | replace('_', ' ')" unit=")">(</ftui-label>
  </div>
  <ftui-switch [value]="Wallbox:reportedState" (value)="set Wallbox $value"></ftui-switch>
</ftui-view-item>


Wallbox.Modus ist


defmod Wallbox.Modus dummy
attr Wallbox.Modus readingList state
attr Wallbox.Modus setList state:Manuell,Immer_An,Immer_Aus,wenn_PV-Strom,wenn_1KW
attr Wallbox.Modus webCmd state


Habe im Header der index.html direkt testhalber geschrieben, damit es in jedem Fall aufgerufen wird:


  function refreshData()
{
  fhemService.forceRefresh();
}

  setTimeout(refreshData, 10000);


Klappt leider nicht, wird nicht ausgeführt, über einen Button aber schon. Hast du eine Idee, wieso?

mr_petz

Zitat von: Det20 am 01 Oktober 2022, 22:18:41
Nix wildes an sich, nur halt jede Menge davon:


<ftui-view-item [disabled]="Wallbox.Modus | isNot('Manuell')">
  <div class="cell">
   <ftui-label size=3>Wallbox</ftui-label>
   <ftui-label [text]="Wallbox.Modus | replace('_', ' ')" unit=")">(</ftui-label>
  </div>
  <ftui-switch [value]="Wallbox:reportedState" (value)="set Wallbox $value"></ftui-switch>
</ftui-view-item>


Hier muss von deinem Wallbox:reportedState ausschließlich on oder off kommen (alles andere wird vom switch ignoriert). Ansonsten states angeben.
Was ich hier nicht verstehe ist, du liest von Wallbox:reportedState das value und schreibst in den state von Wallbox dieses value.?
Des Weiteren ist

(value)="set Wallbox $value"

das gleiche wie:

(value)="Wallbox"

Zumindest wenn on und/oder off kommen. Ich denke bei dir soll was anderes kommen? Und /oder ein anderes Device drin stehen??? Ansonsten musst du die states mit angeben, da sonst der switch nicht weis welchen Zustand er hat.
Hier passt was nicht???


Zitat
...

Habe im Header der index.html direkt testhalber geschrieben, damit es in jedem Fall aufgerufen wird:


  function refreshData()
{
  fhemService.forceRefresh();
}

  setTimeout(refreshData, 10000);


Klappt leider nicht, wird nicht ausgeführt, über einen Button aber schon. Hast du eine Idee, wieso?

Hier wie oben gezeigt für header so:

<script>
  setInterval(
    () => ftuiApp.fhemService.forceRefresh(),
    10000
  );
</script>

Du möchtest ja einen interval statt timeout.

LG mr_petz

Det20

Hi,

Zitat von: mr_petz
Hier muss von deinem Wallbox:reportedState ausschließlich on oder off kommen (alles andere wird vom switch ignoriert). Ansonsten states angeben.
Was ich hier nicht verstehe ist, du liest von Wallbox:reportedState das value und schreibst in den state von Wallbox dieses value.?

Yap. Weil state manchmal nicht den wirklichen Wert enthält, der ist in reportedState enthalten. On/Off geht jedoch über state und nicht reportedState.
Position (on/off) basiert auf reportedState, gesetzt wird aber state.

Zitat von: mr_petz
Des Weiteren ist

(value)="set Wallbox $value"

das gleiche wie:

(value)="Wallbox"


Ok, habe ich angepasst.

Zitat von: mr_petz
Hier wie oben gezeigt für header so:

<script>
  setInterval(
    () => ftuiApp.fhemService.forceRefresh(),
    10000
  );
</script>

Du möchtest ja einen interval statt timeout.

LG mr_petz

Funktioniert leider nicht. Da es aber über den Refresh-Button funktioniert (der letztendlich dieselbe Funktion aufruft), passt das für mich.

VG