NEWS
[gelöst] Statusdisplay - wechselnde Werteanzeige
-
Hallo,
ich habe mir ein Statusdisplay gebaut und möchte darin verschiedene Werte anzeigen. Diese sollen z.B. alle 20 Sekunden wechseln. Z.B. 20 Sekunden aktueller Verbrauch, 20 Sekunden Gesamtverbrauch oder eben der aktuelle Anruf.
Gibt es da schon eine Funktion?
Viele Grüße
Marco
P.S. Ich wünsche allen einen guten Rutsch ins neue Jahr.
-
Das geht über die View in Widget-Widgets.
Du baust für jede dieser Anzeigen eine kleine immer gleich große View. In die Hauptview packst du DANACH ein Stateful container View in Widget 8. Stelle die Wertezahl auf die Menge der Views (in deinem o.g. Fall 3) und fülle darunter unter "Views" die Namen der drei Views ein.
Dann kommt ein Javascript ins Spiel. Für den Wechsel der Viewanzeige wird in einem Javascript mit ceateState eine Steuervariable (typ number) erstellt. Die wechselt nun alle 20s ihren Wert von 0 auf 1, 1 auf 2, 2 auf 3, 3 auf 0.
Je nach Wert wird die entsprechende View angezeigt, wenn du im Stateful container View in Widget 8 die OID der Variable einträgst.
Brauchst du Hilfe beim Skript? Mann kann das mit schedule oder mit einer Schleife machen.
Gruß
Pix
-
Hallo Pix,
ich habe schonmal ein Script angefangen und wenns funktionieren würde, wäre dieser Beitrag jetzt nicht da.
Angelegt habe ich die "Variable" Displayzaehler und Displayanzeige.
Leider geht bei schedule keine Sekundentaktung ala 15 Sekunden oder so.
Wenn der Zähler auf 1 steht, möchte ich die Livewerte z.B. vom Modbus.PVleistung anzeigen. D.h. ich müsste im Script auch auf Änderungen der jeweiligen Werte reagieren und diese in die Variable Displayanzeige schreiben.
schedule("*/1 * * * *", function () { // jede Minute setState("Displayzaehler", getState("Displayzaehler").val + 1); }); // end of schedule if (getState("Displayzaehler").val > 2) setState("Displayzaehler",0); if (getState("Displayzaehler").val === 0) setState("Displayanzeige", "Test0"); if (getState("Displayzaehler").val == 1) setState("Displayanzeige", "Test1"); if (getState("Displayzaehler").val == 2) setState("Displayanzeige", "Test2");
P.S. Hab mir vom Weihnachtsmann ein Java-Buch gewünscht, hab es auch bekommen….
-
Statt schedule würde ich eine endlosschleife bauen in der alle werte nacheinder gelesen und in ein Objekt geschreiben werden. Und die schleife mit wait für 20 sekunden anhalten. So wechselt alle 20 Sekunden der inhalt vom Objekt. Dann ein widget das den inhalt des Objekts in vis anzeigt und fertig ist die wechselnde anzeige.
Gesendet von meinem Jolla mit Tapatalk
-
Hallo Marcolotti,
du solltest lieber eine Schleife mit Intervall (sekundengenau) verwenden. Ich schlage einfach nur die Variante "Zähler" und "View in Widget 8" vor.
Skript:
// Rolle createState("VIS.View_Zaehler", {name: 'VIS View Nummer (rotierend)'}); var x = 0, delay = 15, // hier Sekunden bis Wechsel eintragen max = 3; // maximaler Zähler, Zahl der verschiedenen Views setInterval(function () { setState("javascript.0.VIS.View_Zaehler", x); x++; if (x == max+1) { // wenn Maximum erreicht, zurücksetzen x = 0; } }, parseInt(delay,10) * 1000; // in Millisekunden
Das passende Widget:
[{"tpl":"tplStatefulContainerView8","data":{"oid":"javascript.0.VIS.View_Zaehler","visibility-cond":"==","visibility-val":1,"count":"5","name":"Viewwechsel Anzeige","comment":"Views eintragen"},"style":{"left":"128px","top":"891px","z-index":"20"},"widgetSet":"basic"}]
Das sollte dir helfen
–----
Ich habe sowas ähnliches im Einsatz, um in einem Fenster alle paar Sekunden ein wechselndes Webcambild zu zeigen.
! Dazu werden ein paar Variablen angelegt. Webcam_Nummer zählt hoch, Webcam_URL ist ein Array, das die URL der verschiedenen Webcams und DIagramme vorhält, Webcam ist dann schließlich der komplette HTTP-Befehl zum Einbinden. Damit übernimmt das Skript einige Funktionen des o.g. Widgets "View in Widget 8". Es werden vom Skript die Inhalte gewechselt, nicht vom Widget auf die Nummer reagiert.
! In VIS wird dann ein HTML Widget angelegt und die Quelle über ein Binding mit geschweiften Klammern definiert.[{"tpl":"tplHtmlNav","data":{"visibility-cond":"==","visibility-val":1,"html":"![]({javascript.0.VIS.Webcam_URL})","nav_view":"Kamera","sync":false,"name":"Navigation zu Kameras"},"style":{"left":"743px","top":"590px","width":"268px","height":"124px","z-index":"20"},"widgetSet":"basic"}]
! Mein Skript mit Berücksichtigung der Anwesenheit:
/* ******************************************* * VIS Webcam Anzeige: Alternatives Vorgehen mit Bindings und einer Variable ******************************************* */ createState("VIS.Webcam", {name: 'VIS Webcam (rotierend)'}); createState("VIS.Webcam_URL", {name: 'VIS Webcam URL (rotierend)'}); createState("VIS.Webcam_Nummer", {name: 'VIS Webcam Nummer (rotierend)'}); >! var webcam = []; >! webcam[0] = 'http://XXXXXXX'; webcam[1] = 'http://XXXXXXX'; webcam[2] = 'http://www.boerse-frankfurt.de/daxcam/parkettcam_big.m'; webcam[3] = 'http://XXXXXXX'; webcam[4] = 'http://XXXXXXX'; webcam[5] = 'http://XXXXXXX.jpg'; webcam[6] = 'http://XXXXXXX.jpg'; webcam[7] = 'http://www.niederschlagsradar.de/image.ashx?type=regioloop®io=XXXXXXX&j=-3&m=&d=&mi=&uhr=&bliksem=0&voor=&srt=loop1stunde'; // beliebig viele Weitere möglich >! // Rolle var x = 0; setInterval(function () { setState("javascript.0.VIS.Webcam_URL", webcam[x]); // URL aus Array einfügen und in globale Variable schreiben. setState("javascript.0.VIS.Webcam", "![](" + webcam[x] + ")"); setState("javascript.0.VIS.Webcam_Nummer", x+1); if (getState(idAnwesenheit).val == 1) { // Nur bei Anwesenheit wird rotiert (spart Power) x++; } else { // bei Abwesenheit Wetterradar x = 7; } if (x == webcam.length) { x = 0; } }, 10000; >! ```` Gruß, Pix
-
Sehe gerade, JeyCee war schneller :lol: Er empfiehlt die zweite Methode. Schleife mit wechselndem Inhalt (beides in Javascript definiert).
Nimm für den Anfang dennoch lieber nur die Schleife (in Javascript) und definiere den Inhalt in VIS.
Du kannst diese Schleife natürlich auch an anderen Stellen verwenden. Die läuft ja endlos.
Gruß,
Pix