Ja, das geht. Aber weil ich immer auf Krümel achte: Es gibt kein Number:Item

Es gibt Number Items. Wenn Du den Doppelpunkt anhängst, handelt es sich um ein UoM Item und hinter dem Doppelpunkt steht dann die Messgröße, also z.B. Number:Temperature. Solche Items übergeben nicht nur den Zahlenwert, sondern zusätzlich auch noch die Einheit, in der sie angegeben ist, also z.B. °F oder K. Und der Witz an der Sache: Du kannst für die Ausgabe eine beliebige passende Einheit erzwingen, also der Channel übergibt z.B. 20 °C und Du erzwingst °F, dann gibt das Item 68 °F aus, oder wenn Du K erzwingst, 293,15 K, und das komplett ohne sich mit irgendwelchen Formeln zu beschäftigen, also eigentlich eine sehr coole Funktion. Leider muss man dann in Rules sehr genau aufpassen, wie man diese Werte weiterverarbeitet

aber irgendwas ist ja immer...
Zurück zu Deiner Anforderung: Als Beispiel mag der Code von oben gelten, in leicht abgeänderter Form:
Code: Alles auswählen
var Timer tCountdown = null // globale Variablen vor der ersten Rule einfügen
rule "Count down"
when
Item Countdown received command // Item hat Befehl empfangen
then
if(!(receivedCommand instanceof Number)) { // war Befehl eine Zahl?
logWarn("countdown","Command ist ungültig! ({})",receivedCommand) // Falls nein, Fehlermeldung
return; // und Abbruch
}
if(!(receivedCommand as Number).intValue > 0) { // war Zahl größer 0?
logWarn("countdown","Command ist kleiner 1, Abbruch.!") // Falls nein, Fehlermeldung
return; // und Abbruch
}
tCountdown?.cancel // falls noch ein Timer läuft, abbrechen
tCountdown = createTimer(now.plusSeconds(1), [| // Timer anlegen und nach einer Sekunde ausführen
val iCd = (Countdown..state as Number) - 1 // Wert auslesen und herunterzählen
Countdown.postUpdate(iCd) // Zähleritem aktualisieren
if(iCd > 0) // Falls Zähler größer 0
tCountdown.reschedule(now.plusSeconds(1)) // Timer in einer Sekunde erneut ausführen
])
end
Das Item Countdown wird als Item zum Runterzählen verwendet. Sobald es einen Befehl empfängt, wird dieser auf Gültigkeit geprüft und gegebenenfalls die Rule abgebrochen. Ist es eine gültige Zahl über 0, wird der Timer gestartet und die Rule ist beendet.
Nach einer Sekunde läuft der Timer ab und der Scheduler startet den hinterlegten Code. Dieser liest den aktuellen Wert aus dem Item und zieht gleich 1 ab.
Anschließend wird der neue Wert ins Item geschrieben. Ist der neue Wert größer 0, wird der Timer erneut geplant.
Limitierung in dieser Form: Wenn Du über die UI den Zahlenwert eingibst, geschieht dies in den meisten Fällen über plus/minus. Jeder einzelne Tastendruck führt nun zu einem Befehl. Das bedeutet, um Werte über 1 einstellen zu können, musst Du mehrmals pro Sekunde den Wert erhöhen, sonst fängt der Timer umgehend an zu arbeiten und zieht die von Dir erhöhten Werte gleich wieder ab
Sinnnvoller wäre es also, entweder über Selection vorgegebene Werte in das Item zu laden (also meinetwegen einen Knopf mit dem hinterlegten Wert 120, ein weiterer mit 300 und noch einer mit 600, dann kannst Du auf Knopfdruck den Timer auf 2, 5 oder 10 Minuten setzen und der Countdown startet.
Oder man erstellt ein Start Item, welches den Countdown startet und nutzt das Number Item nur zum Einstellen und Anzeigen des Countdowns, nicht aber zum Start des Countdowns.
Wichtig ist in dem Zusammenhang, den Unterschied zwischen Command und Update zu verstehen. Command sendet einen Befehl (deshalb sendCommand), Update ändert lediglich den Status des Items (das geschieht meist automatisch nach einem Befehl, deshalb postUpdate - nur so als Eselsbrücke) Eingaben in der UI (also über Pages oder die Sitemap) lösen gewöhnlich immer einen Befehl aus, den das betreffende Item empfängt.
In den Rules gibt es Trigger für beide Ereignisse, changed für den Status, received command für einen durch das Item empfangenen Befehl.