Hallo,
wie versprochen hier meine Scripte zur Ansteuerung des Türöffners. Sie sind sicher noch verbesserungswürdig aber es funktioniert.
Prinzipiell besteht meine Lösung aus drei Scripten und zwei Variablen vom Typ Boolean und String sowie eine Register Variable zum lesen vom seriellen Port.
Das Script „RFID Door“ wird durch die Register Variable aufgerufen und schreibt den gelesen Tag in die Variable „RFID Tag“, aktiviert den Türöffner für die Verwendung und setzt einen Time um den Türöffner wieder für die Verwendung zu deaktivieren.
Das Script „Check Door“ wird durch eine Veränderung der Variable „RFID Tag“ aufgerufen und prüft ob der gelesene Tag in der Liste der erlaubten Tags ist und schaltet dann den Türöffner für 2,5 Sekunden ein und dann wieder aus. (Der Türöffner hängt im Augenblick via 1-Wire DS2408 und Relais dran.)
Das Script „enable Door“ stellt einfach sicher, dass nicht öfter als alle 10 Sekunden ein RFID Tag an die Türe gehalten werden kann und der Türöffner nicht unendlich lange ausgelöst wird falls ich den Tag länger als die 2,5 Sekunden an die Türe halte.´
Script RFID Door:
<?php
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($IPS_SENDER == "RegisterVariable")
{
// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
$data = RegVar_GetBuffer($IPS_INSTANCE);
// neu empfangene Daten an $data anhängen
$data .= $IPS_VALUE;
// wenn das Trennzeichen ; in $data gefunden worden ist
if (strpos(strTohex($data), 'da'))
{
// $data in durch ; separierte Datensätze zerlegen
$datasets = explode('da', strtohex($data));
// alle nicht durch ; terminierten Datensätze ausgeben
for ($i = 0; $i < count($datasets) - 1; $i++)
{
If (GetValueBoolean(26159 /*[Haustüre\Door enabled]*/))
{
SetValueString(31753 /*[Haustüre\RFID Tag]*/, $datasets[$i]);
SetValueBoolean(26159 /*[Haustüre\Door enabled]*/, False);
IPS_SetScriptTimer(35997 /*[Haustüre\enable Door]*/, 10);
}
echo "empfangener Datensatz: ".$datasets[$i]."
";
}
// $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
$data = $datasets[count($datasets) - 1];
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($IPS_INSTANCE, $data);
}
function strToHex($string)
{
$hex='';
for ($i=0; $i < strlen($string); $i++)
{
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
Script Check Door:
<?
$allowedKeys = array("xxxxxxxxxxxxxxxxxxxx","xxxxxxxxxxyyyyyyyyyy","yyyyyyyyyyzzzzzzzzzz");
If (in_array(GetValueString(31753 /*[Haustüre\RFID Tag]*/), $allowedKeys))
{
// RFID Tag ist berechtigt die Türe zu öffnen!
SetValueBoolean(11330 /*[Allgemein\Türöffner]*/, True);
TMEX_F29_SetPin(40844 /*[Test\DS2408]*/, 0,True);
IPS_Sleep(2500);
SetValueBoolean(11330 /*[Allgemein\Türöffner]*/, False);
TMEX_F29_SetPin(40844 /*[Test\DS2408]*/, 0,False);
}
Else
{
//Unerlaubter RFID Tag am Leser!
}
?>
Script enable Door:
<?
IPS_SetScriptTimer(35997 /*[Haustüre\enable Door]*/, 0);
SetValueBoolean(26159 /*[Haustüre\Door enabled]*/, True);
?>
ToDo:
- Logging der RFID Tags die an den Leser gehalten werden. (Wer hat wann die Türe geöffnet.)
- Alarmmeldung wenn ein falscher Tag an den Leser gehalten wird.
Habt Ihr weitere Vorschläge?
Viele Grüße
Chris