String vom seriell Port lesen (RFID Reader Pollin)

Hallo zusammen,

ich habe mir folgenden Bausatz bei Pollin gekauft und in meine Türsprechanlage eingebaut.
Der Bausatz funktioniert und schickt via RS232 die ID des Tags.
Halte ich den Tag an die Spule, so wird ca. sekündlich der Tag geschickt.
Wenn ich mich via Putty mit dem Reader verbinde, dann erhalte ich beigefügte Ausgabe. Die Verarbeitung in IPS funktioniert soweit, dass ich die Daten via RegisterVariable lesen kann.
Leider schaffe ich es nicht immer nur einen Tag zu lesen.
Ich habe die beiden Scripte aus der Doku zur RegisterVariable (RegisterVariable: IP-Symcon :: Automatisierungssoftware) schon probiert. Jedoch ist ja nicht gesagt das der Puffer immer beim ersten Zeichen des Tags beginnt und beim zweiten Script haben ich „;“ durch "
" ausgetauscht, leider ebenfalls ohne erfolgt. Auch ein „\r“ hat nichts geholfen. Werden diese Zeichen beim einlesen in die RegisterVariable entfern? In Putty hab ich ja nen Zeilenumbruch.
Hat jemand eine Idee wie ich das anstellen könnte? Der Tag ist immer 10 stellig.

Vielen Dank und viele Grüße
Chris

RFID.JPG

mach doch in der RegVar ein Debug, da siehst Du doch wie die Daten rein kommen.

Hallo,

anbei mal die Debug Ausgabe sowohl der Seriell Port Instanz als auch der RegisterVariable.
Auf dem seriellen Port sieht es so aus als kommen dort zwei Leerzeichen an. Daher auch meine Vermutung mit
oder \r oder sogar beides.

Auf der RegisterVariable sind diese Zeichen dann weg.

Ich habe eben auch schonmal versucht einen anderen Microcontroller mit modifizierter Pollin Software einzusetzen. Der mir dann immer ein ; hinter jeden Tag macht, aber mit der Pollin Software die es zum Download gibt, egal ob modifziert oder nicht, funktioniert der Reader nicht mehr. Auch steht im bascom file was von 8Mhz Frequenz obwohl ein 16Mhz Quarz drin ist.

Vielen Dank und viele Grüße
Chris

Instanz.JPG

RegisterVariable.JPG

In der RegVar kommen doch 12 Stellen an. 10mal Daten 2mal ?

Stell mal um auf Hex.

Zeich mal bitte den Teil des Scripts wo du nach den Zeichen suchst

Hi!

Ich verwende genau das Script aus der Doku.

<?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 \r; in $data gefunden worden ist
  if (strpos($data, '\r'))
  {
      // $data in durch ; separierte Datensätze zerlegen
      $datasets = explode('\r', $data);
     
      // alle nicht durch \r terminierten Datensätze ausgeben
      for ($i = 0; $i < count($datasets) - 1; $i++)
      {
         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);
}
?>

Vielen Dank und viele Grüße
Chris

Hi,

ist es denn zu einem Ergebnis gekommen?
Habe gestern den Bausatz fertig gestellt und wollt ihn die Tage mal an IPS testen.

Gruß

Jan

Hi,

ja, ist es. Im Augenblick öffne ich damit zwar noch nicht meine Tür, weil der Türsummer noch nicht angeschlossen ist. Ich werde aber heute Abend mal meine Scripts dafür posten. (Von der Arbeit leider keinen Zugriff auf die Maschine.)

Sind zwar noch nicht schön dokumentiert und legen auch keine Variablen automatisert an usw… Das kann ich aber noch einbauen.
Alles in allem tun sie was sie sollen. Beim halten der Karte an meine Türglocke (da hab ich die Spule eingebaut), den Türsummer für 3 Sekunden betätigen.
Sabotageerkennung ist noch nicht eingebaut, wäre aber auch kein Problem (Wird eine falsche Karte an den Leser gehalten, dann erhalte ich eine E-Mail usw.)

Noch eine Anmerkung: Im Internet findet man an vielen Stellen Hinweise darauf, einen 470 Ohm Widerstand in Reihe zur Spule zu schalten um die Reichweite zu erhöhen. (Steht auch im Datenblatt des Controllers.) Ich habe das gemacht und erhalte so ca. 3-4cm, was mir super reicht, wenn ich meine Geldbörse mit der Karte an den Leser halte.

Viele Grüße
Chris

Super,

danke auch für den Tip mit dem Widerstand. Soll bei mir auch zur Klingel, aber nur eine Alarm scharf/unscharf Schaltung vornehmen. Obwohl Summer:rolleyes: …mal sehn.

Jan

Die Pollin Spule passt perfekt in die große Doorline-Taste. (T-Com oder Telegärtner) Hab die Spule und Drähte mit Heißkleber fixiert. Das hält super und man sieht es nicht.
Von dort gehen bei mir zwei Drähte zur Platine (ca. 2m Kabel) und es funktioniert gut.
Die Spannungsversorgung habe ich auf den SUB-D 9 pol. Stecker der Platine mit aufgelegt und versorge die Schaltung damit zentral vom IPS Server aus.

Viele Grüße
Chris

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

Danke, auch für die Ausführlichen Erläuterungen welche Aufgaben die Skripte haben.

Gruß

Jan

Nur so ein Gedanke, der mir gerade beim lesen Deiner Scripte kommt … ungetestet und vielleicht falsch, aber vielleicht doch mal testenswert / überprüfenswert:

Hast Du mal getestet, wieviele Script Events belegt werden, wenn Du einen (berechtigten und dann auch noch unberechtigten) RFID Chip permament an den Reader hälst?

Mit anderen Worten: was bleibt in diesem möglichen Fall der Sabotage noch an IPS Leistung für andere Dinge übrig?

Bin gespannt …
jwka

Habe mal eine Karte auf die Antenne gelegt. Es wird etwa 4-5 mal kurz hinter einander gelesen, dann gibt es eine Pause von ca. 1 Sekunde (Anzeige Display am µC). Danach gehts von vorne los. Ich probiere es in Kürze mal mit IPS aus (gerade alles auseinander genommen).

Gruß

deshalb deaktiviere ich „das Lesen“ für 10
Sekunden nach dem ersten Tag via Script.
Angst vor Performanceproblmen hab ich nicht.