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 😀