Derk Kann DS mit den Werten 1 - 4 arbeiten? Ich dachte bislang, dass DS bloß boolesch kann.
Über die App "Benutzerdefinierte Zustände" kann dS schon auch mit Sensorwerten umgehen.
Derk Mit den 4 virtuellen Eingängen wäre man da recht easy unterwegs, dies zu handhaben.
Stimmt, das ist vermutlich in diesem Fall einfacher.
Derk Ok, klingt smart. Wie geht dies? :-D
Also: hier wäre nochmals das Ganze, in beide Richtungen, etwas aufgeräumt, ein Scripted Device pro Kamera, mit jeweils einem Ausgang (Scharfschalten) sowie 4 Bewegungssensor-Eingängen (für die 4 Bereichsalarme):
Gemeinsame Funktionen und webrequest-handler im mainscript:
(hab' sie neu mit 'instar_' prefixed, damit es ersichtlich ist, wo die dazugehören. und str_rep()
ist weggefallen, weil es das seit 2.6.3.5 eingebaut gibt als strrep()
)
// Globale Funktionen für Instar-Kameras
// week0..week6 generieren
function instar_gen_weeks(enable)
{
var req = ''
var w = 0
while (w<7) {
req = req + format('&-week%d=', w) + strrep(if(enable, 'P', 'N'), 48)
w = w + 1
}
return req
}
// generiere den Scharfstellen/Deaktivieren-Request
function instar_gen_arm_req(enable)
{
var req = "?cmd=setscheduleex&-ename=md"
req = req + instar_gen_weeks(enable)
req = req + "&cmd=setbackupschedule&-ename=md"
req = req + instar_gen_weeks(enable)
return req
}
// - Webrequest-Handler
on(webrequest()) as req {
log(6, "webrequest = %s", req)
try {
var jreq = json(req);
// Instar-Kamera-Alarme checken
// Request hat die Form: { "Kameraname":"<name>", "active":4 }
if (isvalid(jreq.Kameraname)) {
// es ist eine Kamera, zur Auswertung ans Kameradevice weitersenden
globalvars()['signal_'+jreq.Kameraname].send(req)
}
}
catch as e {
log(4, "Kamera-Alarm konnte nicht weitergeleitet werden: %s", e)
}
// in jedem Fall Antwort senden
req.answer({ "status": "ok"})
}
Init-Message für Kamera-Scripted-Devices
(habe hier den inputtype 5 genommen, das ist der Bewegungssensor)
{
'message':'init',
'output':'basic', /* einfacher Ausgang */
'colorclass':8, /* universell verwendbar, Farbe einstellbar, in digitalSTROM: schwarze Joker-Klemme */
'group':8, /* standardmässig in Betriebsart Joker */
/* Kameraaktivitäten als 4 Bewegungsmelder */
'inputs': [
{ 'id':'area1', 'inputtype':5, 'group':6, 'hardwarename':'Bereich 1' },
{ 'id':'area2', 'inputtype':5, 'group':6, 'hardwarename':'Bereich 2' },
{ 'id':'area3', 'inputtype':5, 'group':6, 'hardwarename':'Bereich 3' },
{ 'id':'area4', 'inputtype':5, 'group':6, 'hardwarename':'Bereich 4' }
]
}
Implementation der Scripted Devices
Hier ist zu beachten, dass neben der richtigen URL auch die globale signal()-Variable der Form signal_KameraBezeichnung
pro Kamera angepasst werden muss. Die KameraBezeichnung
muss mit dem Wert übereinstimmen, der in der Instar für den "Parameter1" namens "Kameraname" eingestellt wurde. Darüber werden eingehende Alarmmeldungen vom webrequest()
-Handler im mainscript via send()
ans richtige Kameradevice verteilt.
// hier muss die richtige IP-Adresse mit user:pw der Kamera eingetragen werden
var baseurl = "!https://admin:instar@192.168.1.42"
var alarm_sig = signal()
// hier muss eine globale Variable mit dem Namen signal_<Kameraname> definiert werden
glob signal_Testkamera
signal_Testkamera = alarm_sig
// Meldungen vom System (hier: Änderung des Ausgangswerts) behandeln
on (message()) as m {
// wenn die Meldung den Kanal mit Index 0 (=Standard-Ausgang) betrifft...
if (m.message=="channel" && m.index==0) {
// Kamera scharfschalten wenn Wert > 50, sonst nicht-scharf
try {
var res = geturl(baseurl + format('/param.cgi%s', instar_gen_arm_req(m.value>50)), 5)
if (!isvalid(find(res, '[Succeed]'))) {
throw(format("Unerwartete Kamera-Antwort: %s", res))
}
log("Kamera alarm geändert auf %d", m.value)
}
catch as e {
log(4, "Kamera-Befehl nicht ausgeführt: %s", e)
}
}
}
on (alarm_sig) as alarm {
try {
if (isvalid(alarm.active)) {
if (alarm.active>0) {
// Alarm in einem der Bereiche
var m = { 'message':'input', 'value':1 }
m.index = number(alarm.active)-1; // Alarm1..4 -> input0..3
message(m)
}
else {
// keine Alarme, alle 4 ausschalten
message({ 'message':'input', 'value':0, 'index':0 })
message({ 'message':'input', 'value':0, 'index':1 })
message({ 'message':'input', 'value':0, 'index':2 })
message({ 'message':'input', 'value':0, 'index':3 })
}
}
}
catch {
log(4,"Problem beim Auswerten des alarm-Signals: %s", alarm)
}
}
return true // es ist ok, dass das Script hier endet
Viel Erfolg 😀