Hallo,
hier mein Skript (Stand 1.10.2015 14:19h)
! ````
/* Bus Countdown 1
Startet einen Countdown bei Erreichen einer Uhrzeit
! 30.09.2015 erstellt von Pix nach Vorgabe aus dem Forum http://forum.iobroker.net/viewtopic.php?f=21&t=972&p=7615
*/
! createState('Countdown.1.countdown', 0, {name: 'Countdown 1 - Restzeit in Minuten', unit: 'min'});
createState('Countdown.1.afterCount', false, {name: 'Countdown 1 - Countdown abgelaufen'});
createState('Countdown.1.countTrigger', false, {name: 'Countdown 1 - Countdown ausloesen'});
createState('Countdown.1.schlussspurt', false, {name: 'Countdown 1 - Schlussspurt letzte 5min'});
! var interval = null;
var countdown = 30; // Zeit in minuten
! function count() {
// remove trigger
if (getState('javascript.0.Countdown.1.countTrigger').val) {
setState('javascript.0.Countdown.1.countTrigger', false);
}
// Runterzählen
if (countdown > 1) {
if (countdown < 6) setState('javascript.0.Countdown.1.schlussspurt', true);
setState('javascript.0.Countdown.1.countdown', --countdown);
} else {
clearInterval(interval);
interval = null;
setState('javascript.0.Countdown.1.countdown', countdown);
setState('javascript.0.Countdown.1.afterCount', true);
}
}
! // Start des Countdown
on( {
id:'javascript.0.Countdown.1.countTrigger',
change: 'ne'
}, function (obj) {
if (obj.newState.val === true || obj.newState.val === 'true' || obj.newState.val == 1) {
log('Count Trigger gestartet');
setState('javascript.0.Countdown.1.countdown', countdown);
setState('javascript.0.Countdown.1.afterCount', false);
setState('javascript.0.Countdown.1.schlussspurt', false);
if (!interval) {
count();
interval = setInterval(count, 60000); //1000 wäre ein Sekunde, 60s = 1min
}
}
});
! // Auslösung des Starts durch Uhrzeit
// Mo-Fr 06:48Uhr von Mo(Tag1) bis Fr(Tag 5)
schedule("48 6 * * 1-5", function () {
setState('javascript.0.Countdown.1.countTrigger', true);
log('Countdown 1 gestartet');
});
! // Aktionen nach Ablauf des Countdown
on( 'javascript.0.Countdown.1.afterCount', function (obj) {
if (obj.newState.val === true || obj.newState.val === 'true') { // wenn Countdown abgelaufen
log('Countdown 30min abgelaufen', 'info');
setState('javascript.0.Countdown.1.afterCount', false);
setState('javascript.0.Countdown.1.schlussspurt', false);
setState('javascript.0.Countdown.1.countTrigger', 0);
setState('javascript.0.Countdown.1.countdown', 0);
// hier können noch anderen Befehl eingetragen werden
}
});
! // Schlussspurt
on( 'javascript.0.Countdown.1.schlussspurt', function (obj) {
if (obj.newState.val === true || obj.newState.val === 'true') { // wenn nur noch 5min bis Bus fährt
log('Countdown 5min vor Ablauf -> Schlussspurt', 'info');
// Sayit einbauen?
! // hier können noch anderen Befehl eingetragen werden
}
});
! // Bei Scriptstart
setState('Countdown.1.countdown',0);
setState('Countdown.1.schlussspurt',false);
! ````
Es basiert auf einem Skript, das wir http://forum.iobroker.net/viewtopic.php?f=21&t=972&p=7615 schon mal hatten. Damals ging es um Sekunden, heute habe ich es auf Minuten gestellt (Zeile 12). Die Uhrzeit ist in Zeile 49 nach Cron eingestellt.
Wenn du das ganze zweimal brauchst, bitte einfach das Skript duplizieren und (ganz wichtig) alle "Countdown.1." durch "Countdown.2." ersetzen und die Uhrzeit anpassen.
<u>Anleitung zum Einbauen des Skriptes in ioBroker</u> <list type="decimal">4. Reiter Adapter: Javascript Adapter installieren
-
Reiter Instanzen: Javascript Adapter aktivieren
-
neuer Reiter Skripte: * (links unten) drücken und neues Skript erstellen. Obiges Skript einfügen und speichern (rechts unten). Skript aktivieren. Sollte jetzt im Log zB *schlussspurt not found stehen, dann im Reiter Instanzen den Javascript-Adapter neu starten (zwei Pfeile).
-
Im Reiter Objekte unter ID mal "count" eintippen. Sollte dann so aussehen:

Das Skript berechnet nur die Restzeit in Minuten und setzt zusätzlich eine Variable "http://www.duden.de/rechtschreibung/Schlussspurt" auf true, wenn die letzten 5min laufen. Die Ausgabe in VIS machen wir in einem Basic Bool Widget. Da wird dann Schlussspurt (false;true) berücksichtigt und entsprechend die Farbe des Textes geändert. Der Wert aus dem Counter kommt über ein https://github.com/ioBroker/ioBroker.vis/blob/master/README.md in den Text.
VIS Editor öffnen und dieses Widget importieren:
[{"tpl":"tplValueBool","data":{"oid":"javascript.0.Countdown.1.schlussspurt","visibility-cond":"==","visibility-val":1,"html_prepend":"","html_append":"","html_false":"Bus kommt in {javascript.0.Countdown.1.countdown} Minuten","html_true":"Bus kommt in {javascript.0.Countdown.1.countdown} Minuten"},"style":{"left":"227px","top":"768px","z-index":"20","font-size":"25px","width":"318px","height":"108px"},"widgetSet":"basic"}]

Wenn du das für den zweiten Countdown auch einbaust, musst du auch entsprechen ".1." durch ".2." austauschen.
Hoffe, das ist verständlich und hilft dir!
Gruß,
Pix
Edit: Natürlich kannst du über die "Sichtbarkeit" in VIS den ganzen Text ausblenden, wenn der Countdown 0 ist. Dann steht da nicht den ganzen Tag "Bus kommt in 0 Minuten".````
[{"tpl":"tplValueBool","data":{"oid":"javascript.0.Countdown.1.schlussspurt","visibility-cond":"!=","visibility-val":"0","html_prepend":"","html_append":"","html_false":"Bus kommt in {javascript.0.Countdown.1.countdown} Minuten","html_true":"Bus kommt in {javascript.0.Countdown.1.countdown} Minuten","visibility-oid":"javascript.0.Countdown.1.countdown"},"style":{"left":"1082px","top":"327px","z-index":"20","font-size":"25px","width":"318px","height":"108px"},"widgetSet":"basic"}]
****Edit2****: Nach [http://forum.iobroker.org/viewtopic.php?f=21&t=1455&p=12591#p12591](http://forum.iobroker.org/viewtopic.php?f=21&t=1455&p=12591#p12591) das Skript entsprechend korrigiert