Alarm aktiv bei Verlassen des Hauses - bitte Hilfe bei Skript

Hallo Leute,
Ich habe jetzt mit eurer Hilfe PushOver eingerichtet, danke!!

Nun hab ich das Skript, welches ich für den Riegelkontakt verwendet hatte auf Pushover angepasst und versucht es zumindest oberflächlich zu verstehen. Es soll einfach nur wenn der 228 geschlossen wird prüfen ob 3 Fenster offen sind und dann Alarm geben. Wenn alles zu ist diese 3 Fenster alarm aktivieren
Beim öffnen alles wieder retour.

Was funktioniert ist die Prüfung auf offene Fenster!

Leider hab ich noch einige Fehler drinnen, die ich nicht durchschaue!

1.) Ich hab Probleme die Variablenwerte des Kontaktes zu durchschauen und trotz debugging macht das Skript so ziemlich was es will ;-(
2.) Die Bereiche “schärfen” und “entschärfen” werden mehr oder weniger willkürlich angesprungen

Ich habe mich auch hier schon komplett durchgelesen, aber (noch) keine Ahnung wie ich das für mich anpassen kann ;-(

Hat jemand Lust mir etwas unter die Arme zu greifen?
Wär super nett!!

Ja, vergessen!
Hier noch mein Skript, wobei es nicht von mir ist, sondern von euch hier irgendwo aus dem Forum :wink:

--[[
%% properties
228 value
%% globals
--]]

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

local windowID = {30,113,99} -- IDs der Sensoren die ge-/entschärft werden sollen
local countID = 3
local riegel = 228 -- ID Riegelkontakt

--- Arm-Check ---
function armedcheckSensorID(array)
  for j=1, countID do
    if windowID[j] ~= nil then
      if (tonumber(fibaro:getValue(windowID[j], 'armed')) == 1) then
          return false
      end
    end
  end
  return true
end

---Disarm Check ---
function disarmedcheckSensorID(array)
  for j=1, countID do
    if windowID[j] ~= nil then
      if (tonumber(fibaro:getValue(windowID[j], 'armed')) == 0) then
          return false
      end
    end
  end
  return true
end

--- Schärfen ---
if ( (tonumber(fibaro:getValue(riegel, "value")) == 1 ) ) then
	Debug('green','Türe Abgeschlossen')
	for j=1, countID do
		if windowID[j] ~= nil then
			if (tonumber(fibaro:getValue(windowID[j], 'value')) == 0) then
				fibaro:call(windowID[j], 'setArmed', '1')
			else
				local sensorname = fibaro:getName(windowID[j])
				local sensorroom = fibaro:getRoomNameByDeviceID(windowID[j])
				Debug('green','bei Schärfen - UNSICHER: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
				fibaro:setGlobal('PushOver',"Haus unsicher!!,ACHTUNG:".. sensorname .. "im Raum: " .. sensorroom .. "nicht sicher.,1,falling")
			end
		end
	end
if (armedcheckSensorID(windowID)) then
		Debug('green','bei Schärfen: Haustüre abgeschlossen,Alle Sensoren scharf');
		--fibaro:setGlobal('PushOver',"Haustüre abgeschlossen,Alle Sensoren scharf,0,none")
	end
else
	Debug('green','bei Schärfen: Es konnten nicht alle Sensoren scharf geschaltet werden');
end

--- Entschäfen ---
if ( (tonumber(fibaro:getValue(riegel, "value")) == 0 ) ) then
	Debug('green','Türe Aufgeschlossen')
	for j=1, countID do
		if windowID[j] ~= nil then
			if (tonumber(fibaro:getValue(windowID[j], 'value')) == 0) then
				fibaro:call(windowID[j], 'setArmed', '0')
			else
				local sensorname = fibaro:getName(windowID[j])
				local sensorroom = fibaro:getRoomNameByDeviceID(windowID[j])
				Debug('red','bei Entschärfen: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
				---Hier Push einfügen
			end
		end
	end
if (disarmedcheckSensorID(windowID)) then
	Debug('green',"Haustüre geöffnet,Alarm deaktiviert");
	--fibaro:setGlobal('PushOver',"Haustüre geöffnet,Alarm deaktiviert,0,none")
	end
else
	Debug('yellow green','bei Entschärfen: Es konnten nicht alle Sensoren scharf geschaltet werden');
end

Hab heute die ganze Nacht an dem Skript verbracht und herausgefunden dass folgendes funkktioniert:

1.) Die Scharf Schaltung
2.) Das Entschärfen
3.) Auf / Zu Zustand

Wo ich nicht dahinterkomme ist:
1.)
Die Prüfung if (disarmedcheckSensorID(windowID)) then gibt einen falschen Wert zurück!
Die Alarmkontakte sind in der Anlage alle ativiert und trotzdem kommt die Meldung in Zeile 60, dass nicht alle scharf geschaltet werden können!

2.)
Das selbe auch bei der Deaktivierung bei if (armedcheckSensorID(windowID)) then. DOrt kommt auch die Meldung dass nicht alle deaktiviert wurden obwohl sie das sind.

Hat jemand eine Idee was da noch falsch läuft??

Bei armedCheckSensorID musst
if (tonumber(fibaro:getValue(windowID[j], ‘armed’)) == 0) then

und disarmedCheckSensorID musst
if (tonumber(fibaro:getValue(windowID[j], ‘armed’)) == 1) then

eintragen, dann sollte es passen.
Armed sollte false zurückgeben wenn ein Aktor nicht geschärft ist.
Disarmed gibt false wenn ein Sensor noch armed ist

Hallo mdietinger,

Danke für deine Antwort!
Ich habe inzwischen das halbe Forum durchsucht und eine andere Lösung gefunden, die ich sehr rasch für mich umschreiben konnte!!
https://www.siio.de/board/thema/alarm-script-problem
Ich hab es zwar derzeit nur Ansatzweise verstanden, aber es läuft inzwischen hervorragend!!
Ich habe mir auch erlaubt, deine Tipps der PushOver Funktionalität einzubauen!
Ist also vorerst GELÖST, bis ich wieder unqualifiziert dran rumbastle :wink:

Hier das fertige Skript, falls es dich interessiert. (228 ist der Riegelkontakt)

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

-- notwendige IDs
local sensorID = {30,113,99} -- IDs der Sensoren

-- 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()
  Debug('green','Führe eigene Funktionen nach dem Schärfen aus')
end

function actionsafterDisarmed()
  Debug('green','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

function setArmedStatus(set_status)
  if set_status then
    Debug('green','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])
       Debug('red','ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher. Sende Push.')
       fibaro:setGlobal('PushOver',"HC2-Alarm,ACHTUNG: "  .. sensorname .. " im Raum: " .. sensorroom .. " nicht sicher.",1,siren)
      end
     end
     end
  else
    Debug('green','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
              Debug('green','Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              Debug('red','Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          Debug('red','[ERROR] ' .. err)
          end
  })
end

if (trigger['type'] == 'property') then
 Debug("grey",(os.date("%A %d %B %Y - Riegelkontakt Szene gestartet...")))
 local rfid_ID = tonumber(trigger['deviceID'])
 local rfid_value = tonumber(fibaro:getValue(rfid_ID, 'value'))
  if (rfid_value == 0) then
    rfid_value_status = 'Away'
    Debug('green', 'Türe zugesperrt - Status ' ..rfid_value_status.. ' gesetzt.')
    setArmedStatus(true)
    if (fibaro:getGlobal('PresentState') ~= nil) then
     --Debug('green','Benötigte Variable PresentState erkannt.')
     fibaro:setGlobal('PresentState', 'Away')
    else
     Debug('yellow','Benötigte Variable PresentState NICHT erkannt. Wird erstellt.')
     globalVar('PresentState', 'Away')
    end
    local delay = tonumber(fibaro:getValue(sensorID[1], "armDelay"))
      if (delay ~= 0) then
       Debug('green','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
  fibaro:setGlobal('PushOver',"Haustüre abgeschlossen,Alle Sensoren scharf,-1,none")
    end
  elseif (rfid_value == 1) then
    rfid_value_status = 'Home'
    Debug('green', 'Türe aufgesperrt - Status ' ..rfid_value_status.. ' gesetzt.')
    setArmedStatus(false)
    if (fibaro:getGlobal('PresentState') ~= nil) then
     --Debug('green','Benötigte Variable PresentState erkannt.')
     fibaro:setGlobal('PresentState', 'Home')
    else
     Debug('yellow','Benötigte Variable PresentState NICHT erkannt. Wird erstellt.')
     globalVar('PresentState', 'Home')
    end
    if (armedcheckSensorID(sensorID)) then
     if (own_action) then
       actionsafterDisarmed()
     end
    fibaro:setGlobal('PushOver',"Haustüre geöffnet,Alarm deaktiviert,-1,none")
    end
  end
else
    Debug('green','Szene manuell gestartet. Widget-Support deaktiviert.')
    Debug('green','Hier werden noch weitere Funktionen folgen.')
end