Grundsätzlich sind Timing-Sachen in scripted devices einfach umzusetzen, sei es im einfachsten Fall mit delay()
oder delayuntil()
, möglicherweise nebenläufig mit concurrent { ... }
, oder auch auch das on (...) { ... }
-Konstrukt mit Auslösebedingungen wie every()
, is_time()
etc.
Wenn aber das auslösende Signal aus dS kommt und das Resultat in dS benötigt wird, dann wird der Umweg über die P44 doch ziemlich aufwendig. Da ist die Lösung von @Fex015 oben doch einfacher und bequemer umzusetzen.
Ich habe in meiner Installation z.B. eine Kaffeemaschine (an einer schwarzen Klemme SW-KL200) die nach dem Einschalten von Hand oder aufgrund anderer Bedingungen nach 15min wieder ausschaltet. Das habe ich, obwohl meine Installation zu 90% aus P44-"Klemmen" besteht, im dSS gemacht.
Der Vollständigkeit halber: mit scripted devices bräuchte man ein device, das einerseits einen Ausgang hat (damit man es vom dSS über einen Szenenaufruf ansteuern kann), und andererseits einen Eingang, der beim Einschalten des Ausgangs aktiv wird, und nach einer bestimmten Zeit wieder zurückgesetzt wird.
Das könnte etwa so aussehen:
init-Message:
{
'message':'init',
'name':'timer',
'output':'basic',
'colorclass':8,
'dimmable':false,
'inputs':[
{ 'inputtype':0, 'hardwarename':'timer', 'group':8 }
]
}
Implementation:
var ontime = 0:03 // Timer-Einstellung
var timer;
// Schaltaktionen (Kanal-Änderungen) verabreiten
on (message()) as m {
if (m.message=='channel' && m.index==0) {
if (m.value>50) {
// Ausgang wurde auf > 50% gesetzt:
// - Eingang für dS setzen
message({'message':'input', 'index':0, 'value':1 })
// allfällig noch laufenden timer abbrechen
abort(timer)
// Timer (neu)starten
concurrent as timer {
// Zeit abwarten
delay(ontime)
// - Eingang für dS rücksetzen
message({'message':'input', 'index':0, 'value':0 })
}
}
}
}
return true // es ist ok, dass das Script hier endet