CCU.IO Script für Sekunden-Countdown

WebUIs (DashUI, yahui, ...), Adapter (Hue, IRTrans, Sonos, ...), Logging, Scripting

Moderator: Co-Administratoren

Antworten
pix
Beiträge: 608
Registriert: 23.01.2012, 15:40
Danksagung erhalten: 1 Mal

CCU.IO Script für Sekunden-Countdown

Beitrag von pix » 25.05.2014, 19:39

Hallo,

ich brauche mal Eure Hilfe. Ich möchte auf Knopfdruck einen Sekunden Countdown starten. Der Wert soll in DashUI angezeigt werden. Dafür habe ich eine CCU.IO Variable (100044) erstellt. Der Countdown soll erstmal 30s dauern und auf 0s zählen.

Ich habe schon einiges versucht (u.a. schedule, setInterval, setTimer), aber ich komme irgendwie nicht weiter. Ausserdem hätte ich gern einen Countdown, der den Takt von der Systemzeit (getTime) bezieht und nicht selbst zählt.

Mein letzter Versuch war dieser hier:

Code: Alles auswählen

// Skript erstellt Countdown
// erstellt: 25.05.2014
// letzte Änderung: 25.05.2014

setObject(100044, {
    Name: "Timer Countdown",
    DPInfo: "Countdown",
    TypeName: "VARDP",
    ValueUnit: " s"
});

var idCounter = 100044;
setState(idCounter, 0);

var idButtonKurz = 12722, // Flur Taster rot kurz 
    idButtonLang = 12721; // Flur Taster rot lang

subscribe( {
    id: idButtonLang, 
    val:true
}, function (obj) {
	setState(idCounter, 30);
	countdown_timer(idCounter);
}); 


var counterzeit;
function interval () {
    setInterval(function() {
        counterzeit--;
        setState(idCounter, counterzeit);
        
    }, 1000);
    countdown_timer(idCounter);
}
function countdown_timer(counterzeit) {
    
    interval(counterzeit);
    if(counterzeit <= 0){
        clearInterval(interval);
    }
}
Der funktioniert aber nicht :(
Kann jemand helfen?

Gruß,
Pix
150 Kanäle in 75 Geräten und 103 CUxD-Kanäle in 25 CUxD-Geräten (HomeMatic, FS20), CCU1 FW1.519, AddOns: CUxD 1.0, dropbear, E-Mail 1.2, ftp_server und regaWatchdog.
Logik und Visualisierung mit ioBroker auf Mac OS X Node.js. Eingebundene Systeme: Sonos, Rademacher Homepilot, Roomba, Network-OWL. Danke für das Homematic-Inventur-Skript von EnergyStar

pix
Beiträge: 608
Registriert: 23.01.2012, 15:40
Danksagung erhalten: 1 Mal

Re: CCU.IO Script für Sekunden-Countdown "Use Case"

Beitrag von pix » 26.05.2014, 15:32

Hallo,

da ich gerade in einem anderen Thread gerade etwas von USE CASE gelesen habe, schreibe ich hier auch kurz was ich mir wünsche:

Ein Widget, das eine Boolean-Variable überwacht. Wenn die Variable den Wert ändert, soll das Widget eine vorgegebene Zeit (in Sekunden, meinetwegen zusätzlich auch Minuten) herunterzählen und die Variable dann wieder auf den alten Wert zurücksetzen. Während dieser Zeit, soll der Countdown dargestellt werden, nicht (nur) der Inhalt der Boolean-Variable.

Einsatzgebiet:
Ich drücke beim Verlassen der Wohnung einen Wandtaster und melde mich ab. Ein Countdown soll die Zeit bis zur Scharfschaltung der Alarmanlage anzeigen.


Gruß
Pix
150 Kanäle in 75 Geräten und 103 CUxD-Kanäle in 25 CUxD-Geräten (HomeMatic, FS20), CCU1 FW1.519, AddOns: CUxD 1.0, dropbear, E-Mail 1.2, ftp_server und regaWatchdog.
Logik und Visualisierung mit ioBroker auf Mac OS X Node.js. Eingebundene Systeme: Sonos, Rademacher Homepilot, Roomba, Network-OWL. Danke für das Homematic-Inventur-Skript von EnergyStar

pix
Beiträge: 608
Registriert: 23.01.2012, 15:40
Danksagung erhalten: 1 Mal

Re: CCU.IO Script für Sekunden-Countdown

Beitrag von pix » 15.02.2015, 14:36

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.
Bildschirmfoto 2015-02-14 um 19.01.54.jpg
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.
Bildschirmfoto 2015-02-15 um 14.25.32.jpg
fertige Anzeige im DashUI-Editmodus (sonst keine Anzeige des Wertes 0)
Bildschirmfoto 2015-02-15 um 14.26.21.jpg
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)
150 Kanäle in 75 Geräten und 103 CUxD-Kanäle in 25 CUxD-Geräten (HomeMatic, FS20), CCU1 FW1.519, AddOns: CUxD 1.0, dropbear, E-Mail 1.2, ftp_server und regaWatchdog.
Logik und Visualisierung mit ioBroker auf Mac OS X Node.js. Eingebundene Systeme: Sonos, Rademacher Homepilot, Roomba, Network-OWL. Danke für das Homematic-Inventur-Skript von EnergyStar

JoeD
Beiträge: 1
Registriert: 23.02.2016, 16:55

Re: CCU.IO Script für Sekunden-Countdown

Beitrag von JoeD » 23.02.2016, 17:03

Hallo, ich finde diesen Countdown nicht schlecht und habe versucht ihn auf meine Bedürfnisse zurechtzuschneiden. Er startet Einwandfrei. Ich habe das Problem das er nicht unterbrochen wird wenn sich id Anwesenheit verändert. Kann mir hier jemand weiterhelfen ...?

Gruß JoeD

Benutzeravatar
jmaus
Beiträge: 9819
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1856 Mal
Kontaktdaten:

Re: CCU.IO Script für Sekunden-Countdown

Beitrag von jmaus » 24.02.2016, 09:29

pix hat geschrieben: ich beantworte mir selbst die eigene Frage. Vielleicht hilfts jemandem.
Danke für diese sehr gute Anleitung. So etwas habe ich bereits gesucht und bisher nicht gefunden. Interessieren würde mich auch noch ob es auch eine ähnliche Implementierung für ein Passwort- bzw. Zahlencode-Feld gibt um die Alarmanlage Zahlencode-geschützt auch am Tablet, etc. direkt wieder ausschalten zu können? Das würde ich hier gerne auch implementieren wollen.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Antworten

Zurück zu „CCU.IO“