FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: JorEl am 02 August 2015, 16:10:01

Titel: Zutrittskontrolle mit FHEM realisieren
Beitrag von: JorEl am 02 August 2015, 16:10:01
Hi,

das passt vermutlich nicht ganz in diesen Bereich, aber andererseits wüsste ich nicht, wohin sonst damit. :-)

Ich habe mir Hardwarekomponenten gebaut die RFID Tags lesen können und die in der Lage sind über eine TCP Verbindung dann bei einer zentralen Stelle zu erfragen, ob dieser Chip für das entsprechende Terminal (an diesem Tag/zu dieser Uhrzeit) berechtigt ist und dementsprechend die Tür/das Tor geöffnet werden soll oder nicht.

Diese zentrale Stelle würde ich nun gerne über ein FHEM Modul realisieren - wobei ich absolut kein Perl Experte bin. Gleich zu Beginn bin ich schon auf ein erstes Problem gestoßen, nämlich dass mir noch nicht ganz klar ist wie man ohne eigenen thread ständig einen lsitener aktiv haben soll der auf Anfragen reagiert.

Ich habe testweise folgendes gemacht:


sub AccessControl_Define($$) {
    my ($hash, $def) = @_;
    my @param = split('[ \t]+', $def);
   
    if(int(@param) < 3) {
        return "too few parameters: define <name> AccessControl <port>";
    }
   
    $hash->{NAME}  = $param[0];
    $hash->{PORT} = $param[2];
   
# creating a listening socket
    my $socket = new IO::Socket::INET (
    LocalHost => '0.0.0.0',
    LocalPort => $param[2],
    Proto => 'tcp',
    Listen => 5,
    Reuse => 1);

my $client_socket = $socket->accept();

    return undef;
}


das $socket->accept() gehört natürlich nicht wirklich an diese Stelle, ich hätte es am ehesten in einem internen Timer untergebracht - aber die Stelle im Code zeigt auch durchaus das Problem auf... das Modul wird mit dem DEFINE nicht fertig, solange es keine eingehende Verbindung gibt.

Habt ihr dazu irgendwelche Tipps wie man das realisieren könnte? Ist es überhaupt machbar oder sollte man sowas aus FHEM besser auslagern?

Vielen Dank für eure Unterstützung!
Titel: Antw:Zutrittskontrolle mit FHEM realisieren
Beitrag von: Jogile am 03 August 2015, 09:48:47
Ich würde vorschagen, die ganze Verarbeitungslogik sowie die Kommunikation mit dem Türöffnersystem über einen Websocket-Server, wie z.B. nodejs abzufackeln. Den als Dienst neben FHEM starten und warten bis der Türöffner Daten sendet. Danach diese im nodejs (dort wird mit Javascript gearbeitet) auswerten und  bei Bedarf die Tür öffnen. Damit kannst dann die Logik für ID und Zeitabfrage locker in Javascript abbilden. Weiterer Vorteil ist, dass es sich hier um ein Push-System handelt. Also kein Pollen der Werte aus dem RFID Leser, sondern wenn Werte anstehen, werden diese sofort an den Websocket-Server weitergeleitet, der dann die Aktion im fhem auslöst.

Auch websocketd (auch ein Websocket Server) könnte man verwenden. Da wäre die Zugangs-Logik dann in ein bash-Script auszulagern.

Ich hoffe, ich konnte weiterhelfen.