Abwesenheitssteuerung per Variable

Hi Leute,

Ich habe schon seit einiger Zeit ein Alarmskript mit einem Riegelkontakt laufen.
Sperrt man eine bestimmte Türe zu, dann wird die Alarmsicherung für 3 Türkontakte aktiviert! Beim Aufsperren wird wieder deaktiviert.
Es funktioniert sehr gut!

Nun ist die Herausforderung das Skript so umzubauen, dass es nicht direkt vom Türkontakt gesteuert wird, sondern über eine Variable “ANWESEND”, die der Türkontakt setzt!
Grund dafür ist, dass ich die Variable mit einem Taster IM Haus übersteuern möchte, da meine Frau die Eingangstüre auch manchmal von innen versperren will.
Dann muss man mit dem Schalter “ANWESEND” setzen können.

Ich würde das Skript gerne so lassen wie es ist, da es gut funktioniert, nur den Trigger austauschen. Könnt ihr mir dabei helfen?

Hi pblacky,

poste doch mal Dein Skript, dann lässt sich das besser einschätzen.
Vorweg schon mal: Du brauchst dann immer ein Handy um die vom Türkontakt gesteuere Variable zu überschreiben.

Das Skript habe ich von hier aus dem Forum. Es kann viel mehr als ich brauche, hab mich allerdings noch nicht getraut die für mich unnötigen Teile rauszulöschen. Sollte ich vielleicht gleich mit der Änderung kombinieren, aber ich trau mich nicht wirklich da es gerade so gut läuft :wink:

Hier noch das Skript so wie es jetzt ist:

--[[
%% properties
128 value
%% events
%% globals
--]]
-- Löst bei den eingestellten Kontakten eine Aktivierung der
-- Tür und Fenstersensoren aus (Scharf/Unscharf)

-- notwendige IDs
local sensorID = {30,113,99} -- IDs der Sensoren
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()
  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

-- Funktion für die Öffnung der Tür
function openDoor()
    if (doorlockID[0] ~= nil) then
    Debug('yellow','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
 
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")))
 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 

Hallo Bastian,
Unsere Beiträge haben sich überschnitten :wink:

Wieso brauche ich ein Handy??
Ich würde die Funktion auf einen NodOn Taster im Haus legen, geht das nicht ?

Hallo pblacky,

der Begriff Handy war ein bisschen irreführend gewählt. Du brauchst ein “Gerät” mit dem Du den Status der Variable änderst.
Auf den ersten Blick ist die Szene deutlich umfangreicher, als sie für das gewünschte Szenario sein müsste.

Nochmal zum Verständnis: Du hast einen Riegelkontakt. Wird dieser geschlossen, sollen 3 weitere Sensoren scharf geschaltet werden. Beim öffnen genau umgekehrt. Nun möchtest Du, dass der Türkontakt eine globale Variable setzt. Durch das setzen der Variable sollen die 3 Türen auf “armed” gesetzt werden, so dass Du durch ändern der Variable die Tür verschließen kannst, ohne dass die 3 Sensoren scharf geschaltet werden. Richtig?

Hi,

da hier ja anscheinend mein RFID-Skript missbraucht wurde, kann ich dir die Zeile nennen :wink:

Du musst Zeile 120 ändern und danach noch eine if/else-Abfrage in der deine Variable anhand deines gewählten Inhalts auf 0 (Away) und 1 (Home) gesetzt wird, hinzufügen.

Würd aber eher den Weg gehen und die Szene neu coden.

Gruß

@boomx: Ja, ich habe dankenswerter Weise einige deiner Skripte als Basis verwendet (“missbraucht” ist so ein böses Wort :wink:
Ich denke du hast recht, ich werde versuchen es neu zu schreiben, mit eurer Hilfe klappt das sicher …

@bastian:Nein, gemau umgekehrt!
Ich möchte dass die Tür beim versperren einen bestimmten Status “ABWESEND” setzt und ein weiteres Skript über die gesetzte Variable die 3 Alarme bei den Türkontakte aktiviert!
Dadurch wird es mir möglich über einen Handschalter die Variable zu übersteuern und wieder auf “ANWESEND” zu setzen und die 3 Türkontakte zu deaktivieren.
Im Prinzip soll der Vorgang des zusperrens erhalten bleiben, aber der Alarm trotzdem deaktiviert werden können!

Ich bin gerade am Arbeiten an dem “neuen” Skript.
Frage an dich boox:
Was hat es mit dem Code:

if (disarmed_bug) then
       setArmed(sensorID[j])
      else
       fibaro:call(sensorID[j], 'setArmed', '0')
      end

Auf sich?
Ist das ein Bug, der Fibaro Komponenten betrifft?
Brauche ich den Code in meinem Riegelkontakt Skript ?

Hi,

das war ein Bug der Firmware 4.091 Beta. Dort konnten die Sensoren nicht über fibaro:call… gearmed werden. Dieser Bug existiert nicht mehr. Demzufolge brauchst du den Part nicht mehr in der Form. Hier reicht der normale fibaro:call-Aufruf.

Gruß

PS: Auch ein Grund das Skript neu aufzubauen…

Hi pblacky,

das Ändern einer globalen Variable über den Riegelkontakt geht folgendermaßen:

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

local doorContactID = 128 -- IDs des Kontaktes
local contactState = tonumber(fibaro:getValue(doorContactID, 'value'))
local gPresentState = fibaro:getGlobal("PresentState")

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

if contactState == 0 then 
  fibaro:setGlobal('PresentState','Home')
  Debug("green","Die globale Variable PresentState wurde auf HOME gesetzt")
elseif contactState == 1 then 
  fibaro:setGlobal('PresentState','Away')
  Debug("green","Die globale Variable PresentState wurde auf AWAY gesetzt")
end

Durch die oben durchgeführte Änderung der Variable “PresentState” wird die nachfolgende Szene gestartet. Die Sensoren werden geschärft wenn PresentState = AWAY und entscherft, wenn PresentState = HOME.

--[[
%% properties
%% events
%% globals
PresentState
--]]

local sensorID = {83,86} -- IDs der Sensoren
local gPresentState = fibaro:getGlobal("PresentState")

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

if gPresentState == "Away" then -- Wenn die Tür verschlossen wurde bzw. der Status der globalen Variable auf 1 gesetzt wurde
  for i = 1,#sensorID do 
		fibaro:call(sensorID[i],"setArmed", "1")
    sensorname = fibaro:getName(sensorID[i])
    Debug("red","Sensor "..sensorID[i].." - "..sensorname.." geschärft")
	end
  Debug("red","Es wurden "..#sensorID.." Sensoren geschärft")
elseif gPresentState == "Home" then -- Wenn die Tür aufgeschlossen wurde bzw. der Status der globalen Variable auf 0 gesetzt wurde
  for i = 1,#sensorID do 
		fibaro:call(sensorID[i],"setArmed", "0")
    sensorname = fibaro:getName(sensorID[i])
    Debug("green","Sensor "..sensorID[i].." - "..sensorname.." entschärft")
	end
  Debug("green","Es wurden "..#sensorID.." Sensoren entschärft")
end

Probiere es mal aus. Ich konnte es natürlich nicht testen.

WOW, das ist ja eine komplett fertige Lösung!
Ich werde das so bald wie möglich testen…

Bin gerade mal wieder begeistert von der tollen Unterstützung von dir und den Anderen hier im Forum!
Es hilft mir sehr, die vielen Möglichkeiten immer besser zu verstehen und zu lernen :wink:
Danke dafür!!

Hallo Bastian,
Das Skript läuft schon, sieht auf den ersten Blick sehr gut aus!

Jetzt muss ich nur noch die Prüfung der Sensoren aus dem Skript von Boomx übernehmen.
Ich möchte dass eine Pushover Nachricht kommt, wenn beim Schärfen irgendeine Türe offen ist und der Alarm für diesen Kontakt somit nicht geschärft werden kann…

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

Das ist die Funktion. Die kannst du bei dir im Skript anstatt

for i = 1,#sensorID do 
		fibaro:call(sensorID[i],"setArmed", "1")
    sensorname = fibaro:getName(sensorID[i])
    Debug("red","Sensor "..sensorID[i].." - "..sensorname.." geschärft")
	end
  Debug("red","Es wurden "..#sensorID.." Sensoren geschärft")

mit true (Sensoren werden geschärft) oder false (Sensoren werden entschärft) aufrufen. Für den Status Home gilt natürlich das gleiche.

Gruß

Es ist vollbracht!
Die Umstellung auf Variablen Steuerung meines Riegelkontaktes ist schon mal fertig.
Habe folgendes eingebaut:

  • Hab die Funktion von boomx inkl Prüfung der Sensoren
  • Ausstieg aus dem Skript, wenn Alarmkontakte NICHT scharfgeschaltet werden können.
  • Debug Meldungen in Farbe,
  • die Benachrichtigung über Pushover

Danke Bastian und boomx für eure Hilfe!!
Nun beginne ich mir die Übersteuerung via NodOn Taste zu überlegen :wink:

Hier das fertige und getestete Skript, falls es euch interessiert.

--[[
%% properties
%% events
%% globals
PresentState
--]]

if (fibaro:countScenes()>1) then 
 fibaro:abort()
end

local sensorID = {47,112,221} -- IDs der Sensoren
local gPresentState = fibaro:getGlobal("PresentState")

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

function setArmedStatus(set_status)
  if set_status then
    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')
       local sensorname = fibaro:getName(sensorID[k])
       Debug("yellow","Sensor "..sensorID[k].." - "..sensorname.." geschärft")
      else
       local sensorname = fibaro:getName(sensorID[k])
       local sensorroom = fibaro:getRoomNameByDeviceID(sensorID[k])
       Debug('red','ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher!')
	   fibaro:setGlobal('PushOver',"HC2-SENSOR-Alarm,ACHTUNG: "  .. sensorname .. " im Raum: " .. sensorroom .. " nicht sicher!,1,siren")
	   Debug('red','beende das Skript!')
       fibaro:abort()
      end
     end
    end
    Debug("green","Es wurden "..#sensorID.." Sensoren geschärft")
    fibaro:setGlobal('PushOver',"Status AWAY gesetzt,Alle "..#sensorID.." Sensoren scharf,-1,none")
  else
    for j=1, #sensorID do
     if sensorID[j] ~= nil then
      fibaro:call(sensorID[j], 'setArmed', '0')
      sensorname = fibaro:getName(sensorID[j])
      Debug("green","Sensor "..sensorID[j].." - "..sensorname.." entschärft")
      end
     end
     Debug("green","Es wurden "..#sensorID.." Sensoren entschärft")
     fibaro:setGlobal('PushOver',"Status HOME gesetzt,Alarm für "..#sensorID.." Sensoren deaktiviert,-1,none")
  end
 end

if gPresentState == "Away" then -- PresentState = 0
	setArmedStatus(true)
elseif gPresentState == "Home" then -- PresentState = 1
	setArmedStatus(false)
end