Hi, ich hab jetzt seit Monaten endlich geschafft, auch mein Keypad und mein Danalock zusammen in Betrieb zu nehmen. Ich hab die angepasste Version von Guido genutzt, bei mir aber einige Funktionen wie das Alarm-Paneloder auch den Abschnitt User-Funktionen erst einmal rausgenommen. Allerdings bekomme ich im Debug immer einen Fehler “[error] API : Bad request”. Passiert allerdings nur bei Scharf schalten/Away Modus schalten. Bei unscharf schalten gibt es den Fehler nicht. Hab mal einen Screenshot mit angehängt. Leider finde ich den Fehler nach 2 Tagen suchen un hin- und herprobieren nicht!!! Kann mir da einer weiterhelfen?
Mein Script:
--[[
%% properties
%% events
250 AccessControlEvent
%% globals
--]]
---------------------------------------------------
--------- Verwendung ------------------------------
--[[
Das Script soll alle Sensor nach der Scharfschaltung
des Keypads scharf schalten !!!!! Es kann auch
Danalock mit Zipato Keypad öffnen
Achtung : habe die Befehle zu Zeit auskommentiert !
Trigger: AccessControlEvent vom Zipato RFID Pad ID
eintragen !!!!
--]]
---------------------------------------------------
--------- Schleifenschutz -------------------------
if (fibaro:countScenes()>1) then
--fibaro:debug('Kill the second scene!');
fibaro:abort();
end
-----------------------------------
---------- Einstellungen ----------
varDebug = true -- Debug logs true oder false
-- Geräte
danalockID = 298 -- ID des Danalocks
rfidIDs = {250} -- IDs des Zipato RFID Keypads
-- Globale Variablen
gVarPresentState = 'PresentState' -- Name der globalen Variable für den PresentState
gVarAlarmStatus = 'AlarmStatus' -- Name der globalen Variable für den AlarmStatus
-- Benachrichtigungen
pushMessage = true -- Bei offenen Fenstern und Türen per Push benachrichtigen?
pushMessageIds = {231} -- Geräte die per Push benachrichtigt werden sollen
-- Zutrittskontrolle
timebasedKeys = {{key="6",days="1,2,3",from="8:00",till="14:59"}} -- Beispiel: {"1","1,2,3","8:00","14:00"}} -- Der Key im Slot 6 ist an den Tagen 1,2 und 3 (Sonntag, Montag und Dienstag) jeweils von 8:00 bis 15:59 Uhr berechtigt, sonst nicht
deniedKeys = {}
-- Alarm
alarmIds = fibaro:getDevicesId({interfaces ={"fibaroAlarm"}} and {properties = {alarmExclude="false"}}) -- Array mit allen Device IDs die ins Alarmsystem inkludiert sind
-- Misc
version = '1.2'
-- Verzögerung bis scharfstellen
local starttimer = 2 -- Scharfstellung nach gewisser Zeit in Sekunden
-- Achtung : Timer ausgeschaltet ! Nur die Eingangstür
-- hat ein Verzögerung ! Einstellung im Modul
local ignoredev = {36} -- Sensor in dieser Variable werden nie geprüft.
-- Geräte welche bei Scharfschaltung ausgeschaltet werden sollen ----------
offschalten = true -- Abschaltung von verschiedenen Geräten Ja / Nein
local offgeraete = {184, 188, 100, 41, 125, 134, 144, 115} -- Geräte werden bei Scharfschaltung ausgeschaltet
--local offgeraete = fibaro:getDevicesId({baseType = "com.fibaro.actor"})
--------------------------------
---------- Funktionen ----------
---------------------------------------------------
--------- Farbiges Debug --------------------------
function debug(color, message)
if (varDebug) then
--fibaro:debug(message)
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
end
---------------------------------------------------
------------- stime -------------------------------
-- Funktion zum Umrechnen von Uhrzeiten in Sekunden
-- seit 0 Uhr
function stime(s)
local pattern = "(%d+):(%d+)"
local hours, minutes, seconds = string.match(s, pattern)
return (hours*3600)+(minutes*60)
end
---------------------------------------------------
------------- searchTable -------------------------
function searchTableKey(tab, val, key)
for index, value in ipairs(tab) do
if tonumber(value[key]) == tonumber(val) then
dataKey = value[key]
dataDays = value["days"]
dataFrom = value["from"]
dataTill = value["till"]
return true
end
end
return false
end
local function searchTable(tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
---------------------------------------------------
------------- getUserdata -------------------------
-- Auslesen von Benutzerdaten vom Keypad
-- und Berechtigungscheck
function getUserdata()
-- Trigger auslesen
trigger = fibaro:getSourceTrigger()
operatingUser = trigger.event.data["name"]
operatingMedium = trigger.event.data["slotId"]
operatingStatus = trigger.event.data["status"]
operatingKeyPad = trigger.event.data["id"]
-- Berechtigungscheck
if #timebasedKeys ~= 0 or #deniedKeys ~= 0 then
currentDate = os.date("*t")
if searchTable(deniedKeys, trigger.event.data["slotId"]) then
for i = 1, #pushMessageIds do
fibaro:call(pushMessageIds[i], "sendPush", "Gesperrter Key von "..trigger.event.data["name"].." (Key "..trigger.event.data["slotId"]..") am KeyPad abgewiesen. Abbruch!");
end
debug("red","Gesperrter Key von "..trigger.event.data["name"].." (Key "..trigger.event.data["slotId"]..") am KeyPad abgewiesen.")
fibaro:abort()
elseif searchTableKey(timebasedKeys, trigger.event.data["slotId"], "key") then
debug('red','Eingeschränkte Berechtigungen für Key # '..trigger.event.data["slotId"]..' gefunden. Prüfe Berechtigungen')
-- Tage in Array wandeln
dayArray = {}
for match in dataDays:gmatch("([%d%.%+%-]+),?") do
dayArray[#dayArray + 1] = tonumber(match)
end
-- Zeiten in Sekunden wandeln
nowSeconds = stime(currentDate["hour"]..":"..currentDate["min"])
fromSeconds = stime(dataFrom)
tillSeconds = stime(dataTill)
-- Zeitliche Berechtigung prüfen
if searchTable(dayArray, currentDate["wday"]) then
--Uhrzeit im Zeitfenster?
if(nowSeconds >= fromSeconds and nowSeconds <= tillSeconds) then
debug("green","Der Benutzer hat für den jetzigen Zeitpunkt Berechtigungen")
for i = 1, #pushMessageIds do
fibaro:call(pushMessageIds[i], "sendPush", "Aktion "..trigger.event.data["status"].." von "..trigger.event.data["name"].." (Key "..trigger.event.data["slotId"]..") am KeyPad autorisiert.");
-- ERFOLGREICH WEITER GEHTS
end
else
debug("red","Der Benutzer ist zwar berechtigt, aber nicht jetzt.")
for i = 1, #pushMessageIds do
fibaro:call(pushMessageIds[i], "sendPush", "Aktion "..trigger.event.data["status"].." von "..trigger.event.data["name"].." (Key "..trigger.event.data["slotId"]..") am KeyPad abgewiesen. Abbruch!");
fibaro:abort()
end
end
end
end
end
debug('green',"Keypad Aktion von: "..operatingUser)
debug('green',"Keypad Aktion mit: "..operatingMedium)
debug('green',"Aktion: "..operatingStatus)
end
---------------------------------------------------
------------- disarmFunction ----------------------
-- Öffnen des Danalocks nach erfolgreicher Autorisierung
-- am KeyPad
-- bzw. Sensoren werden entschärft
function disarmFunction(username, medium)
debug("green","Der Benutzer "..username.." hat sich am Keypad erfolgreich mit Key Nr. "..medium.." autorisiert.")
debug("green","Danalock wird geöffnet.")
fibaro:call(danalockID, "unsecure")
debug("green","-------------------------------")
debug("green","Alarm aktive Sensoren entschärfen")
--for j = 1,#alarmIds do
--fibaro:call(alarmIds[j],"setArmed", "0")
--end
debug("green","Setze globale Variablen "..gVarPresentState.." und "..gVarAlarmStatus)
fibaro:setGlobal(gVarPresentState,"Home")
fibaro:setGlobal(gVarAlarmStatus,"unarmed")
end
---------------------------------------------------
------------- armFunction -------------------------
-- Schließen des Danalocks nach erfolgreicher Autorisierung
-- am KeyPad
-- bzw. Alarmsensoren werden scharf geschaltet
function armFunction(username, medium)
debug("red","Der Benutzer "..username.." hat sich am Keypad erfolgreich mit Key Nr. "..medium.." autorisiert.")
debug("red","Danalock wird geschlossen.")
fibaro:call(danalockID, "secure")
debug("red","-------------------------------")
debug("red","Alarm aktive Sensoren scharf schalten")
--for j = 1,#alarmIds do
--fibaro:call(alarmIds[j],"setArmed", "1")
--end
debug("red","Setze globale Variablen "..gVarPresentState.." und "..gVarAlarmStatus)
fibaro:setGlobal(gVarPresentState,"Away")
fibaro:setGlobal(gVarAlarmStatus,"armed")
debug("red","-------------------------------")
debug("red","Prüfen auf offene Türen und Fenster")
end
------------- Geräte welche bei Scharfschaltung ausgeschaltet werden ----------
function offschaltung()
if (offschalten) then
for f=1, #offgeraete do
fibaro:call(offgeraete[f],"turnOff")
debug("yellow", "Es wurden "..offgeraete[f].." Geräte ausgeschaltet!")
end
else
debug(" Ausschaltung von Geräten ist nicht aktiviert ! ")
end
end
------------- Fenster/Türen die nicht gescheckt werden sollen ---------
--function checkWinAndDoors()
--function ignorecheck(ignoredev, devid)
--for i=1,#ignoredev do
--if ignoredev[i] == devid then
-- return true
--end
--end --for
--return false
--end
--end
---------------------------------------------------
------------- Offene Fenster/Türen prüfen ---------
function checkWinAndDoors()
local windowIds = fibaro:getDevicesId({baseType = "com.fibaro.doorWindowSensor"})
openwindows = {}
for j = 1,#windowIds do
local excludeAlarm = tonumber(fibaro:getValue(windowIds[j], "alarmExclude"))
if (excludeAlarm ~= 1) then
if tonumber(fibaro:getValue(windowIds[j], "value")) == 1 then
windowName=fibaro:getName(windowIds[j])
roomName=fibaro:getRoomNameByDeviceID(windowIds[j])
if ignorecheck(ignoredev,windowIds[j]) ~= true then
windowId=windowIds[j]
table.insert(openwindows,windowName)
end
end
end
end
end
---------------------------------------------------
------------- Window PopUp senden -----------------
function sendPopUp(openwindows)
local message = ""
for j = 1,#openwindows do
fibaro:debug(openwindows[j].."<br>")
message = message .. "\n" .. openwindows[j]
--fibaro:debug(message)
end
HomeCenter.PopupService.publish({
title = 'Fenster geöffnet',
subtitle = os.date("%I:%M:%S %p | %B %d, %Y"),
contentTitle = 'Fenster geöffnet',
contentBody = message,
img = imgUrl,
type = 'Critical',
})
---------------------------------------------------
------------- Window Push senden ------------------
if pushMessage and #openwindows ~= 0 then
for j = 1, #pushMessageIds do
fibaro:call(pushMessageIds[j], "sendPush", "ACHTUNG: " .. windowName .. " im Raum: " .. roomName .. " Fenster geöffnet !!.")
end
end
end
------------------ USER FUNKTIONEN ------------------
--function userDisarmFunction()
--fibaro:call(180, "turnOff")
--fibaro:call(345, "turnOff")
--fibaro:call(86, "turnOff")
--debug("green","Haus entschärft")
-- Hier eigene Aktionen eingtragen die "Home" ausgeführt werden sollen
--end
--function userArmFunction()
--fibaro:call(180, "turnOn")
--fibaro:call(345, "turnOn")
--debug("green","Haus Scharf")
-- Hier eigene Aktionen eingtragen die "Away" ausgeführt werden sollen
--end
----------Script----------
debug('green','-------------------------------------------------------')
debug('green','Scharfschaltung '..version..'. Sensoren im Haus !!!!')
debug('green','-------------------------------------------------------')
--Benutzerdaten auslesen
getUserdata()
--Aktionsabfrage
if operatingStatus == "Unlock" then
disarmFunction(operatingUser, operatingMedium)
--userDisarmFunction()
elseif operatingStatus == "Lock" then
--userArmFunction()
checkWinAndDoors()
sendPopUp(openwindows)
for k=1, #pushMessageIds do
if pushMessageIds[k] ~= nil then
fibaro:call(pushMessageIds[k], 'sendPush', "Haus wird in "..starttimer.."sec Scharf geschaltet!")
end
end
timer = os.time();
while os.time() - timer < starttimer do
fibaro:sleep(1000);
end
for k=1, #pushMessageIds do
if pushMessageIds[k] ~= nil then
fibaro:call(pushMessageIds[k], 'sendPush', "Das Haus ist nun scharf geschaltet!")
end
end
armFunction(operatingUser, operatingMedium)
offschaltung()
end