Hallo,
ich beantworte mir selbst die eigene Frage. Vielleicht hilfts jemandem.
Ich brauchte für meine DashUI View einen Countdown, der beim Umschalten auf Abwesenheit in Sekunden bis zur Scharfschaltung der Alarmanlage zurückzählt. Die Alarmanlage wird durch ein CUxD Timer Event verzögert um die gleiche Dauer scharfgeschaltet. Leider kann man den CUxD Timer Get Datenpunkt nicht in DashUI darstellen (vermutlich ist der Abstand der ReGa Anfragen des CCU.IO bei der CCU zu groß (mehrere Sekunden). Also hab ich nach einem JavaScript Countdown gesucht, der vorerst ohne auslösende Wirkung und nur zur Visualisierung mitläuft.
Hier gab es den richtigen Wink.
- Erste Fassung des Countdowns
- Bildschirmfoto 2015-02-14 um 19.01.54.jpg (31.76 KiB) 2872 mal betrachtet
Ich habe zwei globale Variablen angelegt:
100002 - Timer Alarmscharfschaltung - Verzögerung bis zur Scharfschaltung in s (wird in Yahui eingegeben)
100044 - Timer Countdown - Restzeit während des Runterzählens in s (wird in DashUI angezeit)
Auslöser ist die Umschaltung der Variable 100000 - Anwesenheit (wenn abwesend -> Timerstart, wenn anwesend -> Timerstopp, falls man doch noch mal zurück in die Wohnung muss vor der Scharfschaltung)
Code: Alles auswählen
// Definiere das Object in CCU.IO
setObject(100002, {
Name: "Timer Alarmscharfschaltung",
DPInfo: "alarmscharfschaltung_countdown (r)",
TypeName: "VARDP",
ValueUnit: " s"
});
// setState(100002, 50); // standardmäßig wird der Countdown bei Neustart der Script-Engine auf 50s gesetzt
// JavaScript Timer, nicht CUxD-Timer (wird nur in DashUI angezeigt, hat aber keine Wirkung)
setObject(100044, {
Name: "Timer Countdown",
DPInfo: "Countdown",
TypeName: "VARDP",
ValueUnit: " s"
});
var idTimerAlarmScharf = 100002, // CCU.IO Variable legt die Countdown Dauer ins s fest
idAlarmanlage = 100003, // CCU.IO Variable Alarmanlage ValueList: 'unscharf;scharf'
idAnwesenheit = 100000, // CCU.IO Variable Anwesenheit (abwesend; anwesend)
idJavaScriptTimer = 100044; // CCU.IO Variable mit der Restzeit des Counters in Sekunden aus JavaScript Funktion timer()
// JavaScript Timer zur Anzeige in DashUI
function timer(time,update,complete) {
var start = new Date().getTime();
var interval = setInterval(function() {
var now = time-(new Date().getTime()-start);
setState(idJavaScriptTimer, Math.floor(now/1000));
if( now <= 0) {
clearInterval(interval);
complete();
setState(idJavaScriptTimer, 0);
}
});
}
// Abbruch des Timers bei einsetzender Anwesenheit und Start des Timers bei einsetzender Abwesenheit
subscribe( {
id: idAnwesenheit,
change: 'ne'
}, function (data) {
if (data.newState.value == 1) { // Anwesenheit hergestellt
timer(0,0,
function() { // what to do after
log('Javascript-Timer zur DashUI Anzeige wegen Anwesenheit abgebrochen.');
}
);
setState(idJavaScriptTimer, 0);
setState(idAlarmanlage, 0);
} else if (data.newState.value == 0) { // Abwesenheit hergestellt
var startzeit = 1000 * (Math.floor(getState(idTimerAlarmScharf)));
timer(
startzeit, // Millisekunden
function(timeleft) { // called every step to update the visible countdown
},
function() { // what to do after
log('Javascript-Timer zur DashUI Anzeige bis Alarmscharfschaltung abgelaufen');
}
); // Ende timer()
}
});
Das passende Widget in Dashui ist z.B. das basic val - Red number (eigentlich zu Anzeige von Servicemeldungen). Es erscheint nur, wenn der Datenpunkt größer als 0 ist und hat auch die passende Optik. Das Widget basic val / Hide on 0/False oder das hqWidget On/Off funktionieren auch.
- fertige Anzeige im DashUI-Editmodus (sonst keine Anzeige des Wertes 0)
- Widget Konfig (mit einigem CSS Code)
Nachtrag: Nach dem Update des CUxD von 0.68 auf 0.9 funktiniert mein CUxD Timer nicht mehr korrekt. Deshalb habe ich einfach den oben beschriebenen Timer verwendet, um die Alarmanlage nach Ablauf scharf zu schalten. Das funktioniert auch.
Gruß,
Pix
EDIT: Habe noch ein Fehler im Bereich Contdown-Abbruch beseitigt und den korrigierten Code oben eingestellt (im Detail: clearInterval(interval); "interval" war nicht definiert)