Wir hatten ja bereits einen Artikel über die Einbindung des RFID Tagreaders verfasst. Jetzt geht es mit neuen Funktionen weiter:
[alert variation="alert-info" dismiss="dismiss"]Wir haben das Script weiterentwickelt, es gibt ein Update. Den Artikel dazu findest du hier: Alarm schalten mit Zipato RFID Tagreader im Fibaro HC2 – UPDATE 2 [/alert]
Nach dem letzten Artikel zu der Einbindung eines RFID Tagreaders (Findet Ihr hier) kamen von der Community ja einige Ideen, wie das Skript noch weiter verbessert werden könnte, beziehungsweise welche zusätzlichen Funktionen Ihr euch wünscht. Resultierend daraus, haben wir ein komplett neues Skript programmiert.
Neue Funktionen des RFID Skriptes:
- Kein virtuelles device mehr benötigt
- Alarm schärfen UND entschärfen über einen (oder mehrere) RFID Tag(s)
- Alarm schärfen über PIN-Code
- Automatische Prüfung offener Fenster/Türen
- Differenzierte Push-Mitteilungen (Push zeigt device und Raum nicht sicherer devices an; Unterscheidung zwischen RFID/PIN-Code)
- Anzeige der RFID IDs beim manuellen Ausführen der Szene
Das Skript findet Ihr am Ende des Artikels, wir möchten euch aber noch kurz erklären, welche Änderungen Ihr in dem Skript vornehmen müsst, damit dies auch bei euch läuft.
Zeile 3-10 im vollständigen Skript:
96 userCodes
%% globals
--]]
-- HIER DIE ARRAYS ANPASSEN (neue IDs können einfach hinzugefügt werden)
local tagReader = 96 -- ID des RFID-Leser (bitte auch in dem Header ändern)
local doorID = {16, 18, 20, 55} -- IDs der Sensoren
local phoneID = {68, 113} -- IDs der Handys, an die eine Push geschickt werden soll
Als erstes müsst Ihr oben in dem Header die ID der userCodes (Zeile 3) ändern. Die userCodes sind eine Tabelle in der Konfiguration eures Tagreaders, in der die Informationen zu euren RFID Tags gespeichert werden. So wird die Szene bei einer Änderung der userCodes-Tabelle, wenn Ihr zum Beispiel einen PIN-Code eingebt, ausgeführt. Die ID, die Ihr dort eintragen müsst, findet Ihr, wenn Ihr euch die Config-Seite des RFID Tagreaders aufruft.
Dann müsst Ihr unter "HIER DIE ARRAYS EINRICHTEN" die einzelnen lokalen Variablen anpassen. Die Variable "tagReader" ist wieder die oben genannte ID des Tagreaders. In das Array "doorID" müssen alle zu schärfende/entschärfende Sensoren, mit einem Komma getrennt, eingetragen werden. Diese könnt Ihr über den oben erläuterten Weg ermitteln. In dem Skript wird bei Ausführung eine Schleife durchlaufen, welche alle devices, welche dort eingetragen sind, nacheinander auf den Status Armed, also geschärft setzt.
Danach folgt dann das Array "phoneID". Hier müssen alle IDs eurer Handys eingetragen sein, welche per Push über den Status der Alarmanlage informiert werden sollen. Um diese IDs ausfindig zu machen (sofern Ihr diese noch nicht kennt), könnt Ihr die device-API des Fibaro HomeCenter 2 nutzen. Ruft dazu in eurem Browser die URL "http://IP-HC2/api/devices" (IP-HC2 ersetzt Ihr durch die lokale IP-Adresse, unter der euer HomeCenter2 im Netzwerk erreichbar ist) auf. Ihr solltet dann eine JSON-Übersicht aller verbundenen devices erhalten. Hier könnt Ihr jetzt die Suchfunktion eures Browser nutzen. Also zum Beispiel nach dem Namen "iPhone 6" (In diesem Fall hat das iPhone die ID 68) suchen:
Zeile 14-16 im vollständigen Skript:
local rfid1 = {143, 80, 84, 84, 42, 0, 1, 4, 0, 0}
local rfid2 = {143, 174, 97, 84, 42, 0, 1, 4, 0, 0}
local code = {52, 49, 52, 50, 0, 0, 0, 0, 0, 0}
Als nächstes sind die Arrays an der Reihe, in denen die Informationen zu euren RFID Tags und eurem PIN-Code gespeichert werden. Beim manuellen Ausführen der Szene haben wir für euch programmiert, dass die derzeit gespeicherten Informationen im debug angezeigt werden. Um diese Information zu hinterlegen, drückt Ihr auf dem RFID Tagreader die "Home" oder "Away"-Taste, wartet eine Sekunde, bis die LED leuchtet und haltet dann das RFID-Tag davor. Es muss einmal kurz piepsen, dann war der Vorgang erfolgreich. Jetzt könnt Ihr mit einem "Klick" auf Start die Szene auslösen. Es erscheint dann folgender debug in der Szene:
Die Zahlenkette (unter RFID-INFO) in den geschweiften Klammern könnt Ihr nun kopieren und in das Array rfid1 oder rfid2 einfügen. Ihr könnt nun mit diesem RFID Tag den Alarm aktivieren oder deaktivieren. Solltet Ihr auch den PIN-Code zum aktivieren des Alarms festlegen wollen, dann müsst Ihr euch das Array "code" näher anschauen. Hier gelten folgende Zuordnungen:
- 49
- 50
- 51
- 52
Solltet Ihr euch also den Code "3412" setzen wollen, dann muss die Zahlenkette so aussehen:
{51, 52, 49, 50, 0, 0, 0, 0, 0, 0}
Variable "rfid_alarm"
Solltet Ihr euch im Zuge der Einrichtung des alten Artikels die Variable "rfid_alarm" noch nicht eingerichtet haben, dann müsst Ihr dies noch nachholen. Geht dazu über "Panels" und "Variables Panel" und erstellt euch da über den Button "Add" eine neue Variabel. Das war's dann auch schon mit den Anpassungen im Skript.
Die Push-Mitteilungen in einer kleinen Übersicht:
Hier haben wir für euch noch 4 Push-Mitteilungen, die das Skript an Handy schickt, zusammengestellt. Wie bereits am Anfang des Artikels erwähnt, werden die Push-Mitteilungen automatisch generiert. Das Skript holt sich die erforderlichen Informationen (wie z.B. Raumname) automatisch.
Das vollständige RFID Skript
Legt euch jetzt über "Scenes, Add Scene, Add Scene in LUA" eine neue Szene an und kopiert den Code in das entsprechende Feld. Passt dann anhand der oben beschriebenen Anleitung das Skript an. Fertig :)
--[[
%% properties
96 userCodes
%% globals
--]]
-- HIER DIE ARRAYS ANPASSEN (neue IDs können einfach hinzugefügt werden)
local tagReader = 96 -- ID des RFID-Leser (bitte auch in dem Header ändern)
local doorID = {16, 18, 20, 55} -- IDs der Sensoren
local phoneID = {68, 113} -- IDs der Handys, an die eine Push geschickt werden soll
local countID = 200 -- Anzahl eurer devices (Muss nicht zwangsläufig geändert werden)
-- 10-stellige Byte-Array's
local rfid1 = {145, 80, 84, 84, 42, 0, 1, 4, 0, 0}
local rfid2 = {148, 174, 97, 84, 42, 0, 1, 4, 0, 0}
local code = {51, 49, 52, 50, 0, 0, 0, 0, 0, 0}
local readerCode = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} -- leeres Byte-Array, in dem die nachher der gelesene Code steht (RFID-Tag oder Zahlencode)
fibaro:debug('RFID-Scene Version 1.0 gestartet');
-- FUNKTIONEN (bitte nicht ändern)
function compareCodes(array1, array2)
if (#array1 ~= 10 or #array2 ~= 10) then
fibaro:debug('Grösse der Arrays ungültig...')
return false
end
for i = 1, #array1 do
if (array1[i] ~= array2[i]) then
return false
end
end
return true
end
function armedcheckSensorID(array)
for j=1, countID do
if doorID[j] ~= nil then
if (tonumber(fibaro:getValue(doorID[j], 'armed')) == 0) then
return false
end
end
end
return true
end
-- ENDE
local startSource = fibaro:getSourceTrigger()
if (startSource['deviceID'] == tagReader) then
-- RFID auslesen
local userCodes = fibaro:get(tagReader, 'userCodes')
jsontbl = json.decode(userCodes)
-- nach dem Code mit der ID 0 suchen
for i = 1, #jsontbl do
if (jsontbl[i].id == 0) then
-- die 10 Zeichen lesen und in das leere Byte-Array abfüllen
for b = 1, string.len(jsontbl[i].code) do
readerCode[b] = string.byte(jsontbl[i].code,b)
end
if (compareCodes(rfid1, readerCode) or compareCodes(rfid2, readerCode)) then
if (fibaro:getGlobal('rfid_alarm') == '0') then
fibaro:debug('RFID-Tag akzeptiert - Haus wurde verlassen')
fibaro:setGlobal('rfid_alarm', '1')
for j=1, countID do
if doorID[j] ~= nil then
if (tonumber(fibaro:getValue(doorID[j], 'value')) == 0) then
fibaro:call(doorID[j], 'setArmed', '1')
else
local sensorname = fibaro:getName(doorID[j])
local sensorroom = fibaro:getRoomNameByDeviceID(doorID[j])
fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher. Sende Push.')
for k=1, countID do
if phoneID[k] ~= nil then
fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
end
end
end
end
end
if (armedcheckSensorID(doorID)) then
fibaro:debug('Alle Sensoren scharf. Sende Push');
for l=1, countID do
if phoneID[l] ~= nil then
fibaro:call(phoneID[l], 'sendPush', 'RFID: Alarmanlage SCHARF')
end
end
else
fibaro:debug('Es konnten nicht alle Sensoren scharf geschaltet werden');
end
elseif (fibaro:getGlobal('rfid_alarm') == '1') then
fibaro:debug('RFID-Tag akzeptiert - Welcome@Home')
fibaro:setGlobal('rfid_alarm', '0')
for m=1, countID do
if doorID[m] ~= nil then
fibaro:call(doorID[m], 'setArmed', '0')
end
end
if (armedcheckSensorID(doorID)) then
fibaro:debug('Es konnten nicht alle Sensoren entschäft werden');
for t=1, countID do
if doorID[t] ~= nil then
if (tonumber(fibaro:getValue(doorID[t], 'armed')) == 1) then
local sensorname = fibaro:getName(doorID[t])
local sensorroom = fibaro:getRoomNameByDeviceID(doorID[t])
fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' konnte nicht entschärft werden. Sende Push.')
for o=1, countID do
if phoneID[o] ~= nil then
fibaro:call(phoneID[o], 'sendPush', 'ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht entschärft.')
end
end
end
end
end
else
fibaro:debug('Alle Sensoren entschärft. Sende Push');
for l=1, countID do
if phoneID[l] ~= nil then
fibaro:call(phoneID[l], 'sendPush', 'RFID: Alarmanlage entschärft')
end
end
end
else
fibaro:debug('RFID-Tag akzeptiert - Variablen nicht korrekt gesetzt')
end
elseif (compareCodes(code, readerCode)) then
fibaro:setGlobal('rfid_alarm', '1')
for z=1, countID do
if doorID[z] ~= nil then
if (tonumber(fibaro:getValue(doorID[z], 'value')) == 0) then
fibaro:call(doorID[z], 'setArmed', '1')
else
local sensorname = fibaro:getName(doorID[z])
local sensorroom = fibaro:getRoomNameByDeviceID(doorID[z])
fibaro:debug('ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher. Sende Push.')
for y=1, countID do
if phoneID[y] ~= nil then
fibaro:call(phoneID[y], 'sendPush', 'ACHTUNG: ' .. sensorname .. ' im Raum: ' .. sensorroom .. ' nicht sicher.')
end
end
end
end
end
if (armedcheckSensorID(doorID)) then
fibaro:debug('PIN-Code erkannt. Alle Sensoren werden scharf geschaltet. Sende Push');
for l=1, countID do
if phoneID[l] ~= nil then
fibaro:call(phoneID[l], 'sendPush', 'PIN-Code: Alarmanlage SCHARF')
end
end
fibaro:debug('Alle Sensoren scharf. Sende Push');
else
fibaro:debug('Es konnten nicht alle Sensoren scharf geschaltet werden');
end
else
fibaro:debug('RFID-Tag/Code wurde abgelehnt. Manipulation? Push versendet')
for r=1, countID do
if phoneID[r] ~= nil then
fibaro:call(phoneID[r], 'sendPush', 'ACHTUNG: Code falsch eingegeben')
end
end
end
end
end
else
fibaro:debug('Szene manuell gestartet. Auslesen der RFID-Infos')
local userCodes = fibaro:get(tagReader, 'userCodes')
jsontbl = json.decode(userCodes)
-- nach dem Code mit der ID 0 suchen
for i = 1, #jsontbl do
if (jsontbl[i].id == 0) then
-- die 10 Zeichen lesen und in das leere Byte-Array abfüllen
for b = 1, string.len(jsontbl[i].code) do
readerCode[b] = string.byte(jsontbl[i].code,b)
end
fibaro:debug('RFID-INFO: {' .. readerCode[1] .. ', ' .. readerCode[2] .. ', ' .. readerCode[3] .. ', ' .. readerCode[4] .. ', ' .. readerCode[5] .. ', ' .. readerCode[6] .. ', ' .. readerCode[7] .. ', ' .. readerCode[8] .. ', ' .. readerCode[9] .. ', ' .. readerCode[10] .. '}')
end
end
fibaro:debug('Diese Info in die lokalen Arrays rfid1,rfid2,code eintragen')
end
Ein passendes Icon für die Szene haben wir euch auch erstellt :)
Bei weiteren Funktionswünsche/Anregungen/Lob lasst doch gerne einen Kommentar da. Wir würden uns freuen, wenn wir das Skript noch erweitern könnten und Ihr berichtet, ob es funktioniert. Danke :)

