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:
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 |
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 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
--[[ %% 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 :)