Website-Icon Dein Smart Home Blog

Alarm schalten mit Zipato RFID Tagreader im Fibaro HC2 - UPDATE

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:

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.

So wird die benötigte device-ID ermittelt (siehe Markierung)

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:

Ermitteln der Phone-ID

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:

Nach dem Klick auf Start findet Ihr die Informationen zu eurem RFID-Tag im debug-Fenster

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:

  1. 49
  2. 50
  3. 51
  4. 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 :)

ICON

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 :)

Die mobile Version verlassen