Alarm-Script Problem

Ich habe folgendes Script zum Starten:


--[[
%% properties
131 value
%% events
%% globals
--]]

-- notwendige IDs
local sensorID = {44, 40, 42, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64} -- IDs der Sensoren
local phoneID = {6, 36} -- IDs der Handys
local doorlockID = {} -- IDs der doorlocks

-- zusätzliche Optionen
local own_action = false -- eigene Aktionen ausführen; Funktionen müssen befüllt werden
local disarmed_bug = false -- Firmware Bug umgehen

-- eigene Funktionen
function actionsafterArmed()
  fibaro:debug('Führe eigene Funktionen nach dem Schärfen aus')
end

function actionsafterDisarmed()
  fibaro:debug('Führe eigene Funktionen nach dem Entschärfen aus')
end

-- AB HIER NICHTS MEHR ÄNDERN
local trigger = fibaro:getSourceTrigger()
local rfid_value_status = ''

Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"))
end

function armedcheckSensorID(array)
  for j=1, #sensorID do
    if sensorID[j] ~= nil then
      if (tonumber(fibaro:getValue(sensorID[j], 'armed')) ~= 0) then
          return false
      end
    end
  end
  return true
end

-- Funktion für die Öffnung der Tür
function openDoor()
    if (doorlockID[0] ~= nil) then
    fibaro:debug('Türschlösser werden geöffnet.')
    for j=0, #doorlockID do
     if doorlockID[j] ~= nil then
       fibaro:call(doorlockID[j],'unsecure')
     end
    end
  end
 end
 
-- Funktion zum Versenden der Push
function sendPush(text)
 if (phoneID[1] ~= nil) then
  for i=1, #phoneID do
     if phoneID[i] ~= nil then
       fibaro:debug('Versende Push an ID ' ..phoneID[i])
       fibaro:call(phoneID[i],'sendPush', text, 'alarm')
     end
  end
 end
end

function setArmedStatus(set_status)
  if set_status then
    fibaro:debug('Sensoren werden scharf geschaltet.')
    for k=1, #sensorID do
     if sensorID[k] ~= nil then
      if (tonumber(fibaro:getValue(sensorID[k], 'value')) == 0) then
       fibaro:call(sensorID[k], 'setArmed', '1')
      else
       local sensorname = fibaro:getName(sensorID[k])
       local sensorroom = fibaro:getRoomNameByDeviceID(sensorID[k])
       fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher. Sende Push.')
       sendPush('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
      end
     end
     end
  else
    fibaro:debug('Sensoren werden entschärft.')
    for j=1, #sensorID do
     if sensorID[j] ~= nil then
      if (disarmed_bug) then
       setArmed(sensorID[j])
      else
       fibaro:call(sensorID[j], 'setArmed', '0')
      end
     end
    end
  end
end

function setArmed(deviceId)
  local dev = api.get('/devices/' .. deviceId)
  dev.properties.armed = false
  api.put('/devices/' .. deviceId, dev)
end

-- Funktion zum Anlegen einer Globalen Variablen
function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end

if (trigger['type'] == 'property') then
 fibaro:debug('RFID-Szene 3.1 (Official) gestartet.')
 local rfid_ID = tonumber(trigger['deviceID'])
 local rfid_value = tonumber(fibaro:getValue(rfid_ID, 'value'))
  if (rfid_value == 1) then
    rfid_value_status = 'Away'
    Debug('red', 'Status ' ..rfid_value_status.. ' gesetzt.')
    setArmedStatus(true)
    if (fibaro:getGlobal('PresentState') ~= nil) then
     fibaro:debug('Benötigte Variable PresentState erkannt.')
     fibaro:setGlobal('PresentState', 'Away')
    else
     fibaro:debug('Benötigte Variable PresentState NICHT erkannt. Wird erstellt.')
     globalVar('PresentState', 'Away')
    end
    local delay = tonumber(fibaro:getValue(sensorID[1], "armDelay"))
      if (delay ~= 0) then
       fibaro:debug('Arm-Delay erkannt. Arm-Delay: ' ..delay)
       delay = delay + 1
       fibaro:sleep(delay*1000)
      end
    if (not armedcheckSensorID(sensorID)) then
      if (own_action) then
        actionsafterArmed()
      end
      sendPush('ALARMANLAGE aktiv!')
    end
  elseif (rfid_value == 0) then
    rfid_value_status = 'Home'
    Debug('green', 'Status ' ..rfid_value_status.. ' gesetzt.')
    setArmedStatus(false)
    if (fibaro:getGlobal('PresentState') ~= nil) then
     fibaro:debug('Benötigte Variable PresentState erkannt.')
     fibaro:setGlobal('PresentState', 'Home')
    else
     fibaro:debug('Benötigte Variable PresentState NICHT erkannt. Wird erstellt.')
     globalVar('PresentState', 'Home')
    end
    if (armedcheckSensorID(sensorID)) then
     if (own_action) then
       actionsafterDisarmed()
     end
     sendPush('ALARMANLAGE inaktiv!')
     openDoor()
    end
  end
else
    fibaro:debug('Szene manuell gestartet. Widget-Support deaktiviert.')
    fibaro:debug('Hier werden noch weitere Funktionen folgen.')
end 

Leider wird die Eingangstür nur scharf gestellt, wenn ich den Alarm bei geschlossener Tür scharfstelle. Wenn die Tür offen ist, dann scharf gestellt wird, läuft der Arm-Delay nicht herunter, wenn die Tür geschlossen wird. Alle anderen Sensoren klappen.

Es ist auch nur diese eine Tür mit einem Arm-Delay gesetzt.

Leider finde ich keine Lösung für das Problem.

Hi,

wenn nur ein Sensor mit Arm-Delay vorhanden ist, dann muss dieser an die erste Stelle des Arrays gesetzt werden. Ansonsten wird dies nicht erkannt. In den Kommentaren zu diesem Artikel findest du auch noch weitere Anregungen, sofern dies nicht funktioniert.

Gruß

ID44 ist an erster Stelle. es klappt aber leider nicht…

Hi,

eine offene Tür kann technisch nicht scharf gestellt werden… Hier müsste der Alarm geforced werden. Derzeit besteht allerdings meinerseits kein Interesse dran dies umzusetzen, da dann die Prüfung der offenen Sensoren nicht mehr funktionieren würde.

Gruß