RFID-Lesegerät in OpenHAB einbinden

openhabnfcKürzlich stelle ich eine Möglichkeit vor, ein günstiges RFID-Lesegerät an den Raspberry anzuschließen. In diesem Beitrag, der als Fortsetzung gedacht ist, geht es um die Integration in OpenHAB. Wir erstellen entsprechende Items, binden diese in die Sitemap ein und erstellen die ein oder andere Regel.

Verfügbare Artikel zu openHAB

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

Items definieren

Wir beginnen direkt mit der Definition unserer neuen Items. Dazu nutze ich die bereits vorhandene Datei “/etc/openhab/configurations/praesenz.items” und ergänze diese mit folgenden Zeilen:

//RFID
Switch RFID_DANIEL
Switch RFID_DANIEL_SWITCH
Switch RFID_TINA
Switch RFID_TINA_SWITCH
Switch RFID_GRUPPE
Switch RFID_GRUPPE_SWITCH
DateTime DANIEL_ABWESEND "Daniel abwesend seit [%1$tA, %1$td.%1$tm.%1$tY %1$tT]" <calendar>
DateTime DANIEL_ANWESEND "Daniel anwesend seit [%1$tA, %1$td.%1$tm.%1$tY %1$tT]" <calendar>
DateTime TINA_ABWESEND "Tina abwesend seit [%1$tA, %1$td.%1$tm.%1$tY %1$tT]" <calendar>
DateTime TINA_ANWESEND "Tina anwesend seit [%1$tA, %1$td.%1$tm.%1$tY %1$tT]" <calendar>
Switch RFID_MANUELL_DANIEL { exec=">[ON:/scripts/rfid_manuell.sh DANIEL] >[OFF:/scripts/rfid_manuell.sh DANIEL]" }
Switch RFID_MANUELL_TINA { exec=">[ON:/scripts/rfid_manuell.sh TINA] >[OFF:/scripts/rfid_manuell.sh TINA]" }

 

Hier haben wir zunächst für jeden Benutzer ein Item, dass vom Script auf unserer Himbeere befüllt wird. Zudem habe ich einen weiteren Schalter definiert, um den Anwesenheitszustand manuell in der Sitemap zu übersteuern. Schlussendlich kommen noch Items dazu, die die Zeit der letzten Statusänderung speichern.

 

Einbindung in die Sitemap

Nun binden wir unsere neuen Items an gewünschter Stelle in die Sitemap ein. Ich habe dies so realisiert, dass für jeden Nutzer in Frame dargestellt wird. Zudem wird angezeigt, seit wann der jeweilige Nutzer an- bzw. abwesend ist. Das Icon “present” ist bereits bei der Installation von OpenHAB dabei.

Text item=RFID_GRUPPE label="Gesamtpräsenz  [MAP(praesenz.map):%s]" icon="present" {
    Frame label="Daniel" {
        Text item=RFID_DANIEL label="Daniel RFID  [MAP(praesenz.map):%s]" icon="present"
        Text item=DANIEL_ABWESEND visibility=[RFID_DANIEL==OFF]
        Text item=DANIEL_ANWESEND visibility=[RFID_DANIEL==ON]
        Switch item=RFID_MANUELL_DANIEL label="Daniel manuell schalten  [MAP(praesenz.map):%s]" icon="present"
    }
    Frame label="Tina" {
        Text item=RFID_TINA label="Tina RFID  [MAP(praesenz.map):%s]" icon="present"
        Text item=TINA_ABWESEND visibility=[RFID_TINA==OFF]
        Text item=TINA_ANWESEND visibility=[RFID_TINA==ON]
        Switch item=RFID_MANUELL_TINA label="Tina manuell schalten  [MAP(praesenz.map):%s]" icon="present"
    }
}

 

Übersetzungsdatei erstellen

Damit uns die Zustände der Präsenzen in der Sitemap nicht als “ON” oder “OFF” dargestellt werden, erstellen wir die Datei “/ect/openhab/configurations/transform/praesenz.map” mit folgendem Inhalt:

ON=Anwesend
OFF=Abwesend
undefined=unbekannt
-=unbekannt

 

Script für manuelles Schalten

Falls ein Bewohner vergessen hat, sich beim Verlassen der Wohnung “auszustempeln”, habe ich in die Sitemap Schalter für das manuelle Übersteuern integriert. Da die Intelligenz jedoch diesmal nicht bei OpenHAB sondern bei der Himbeere liegt, an der das RFID-Lesegerät angeschlossen ist, müssen wir die Himbeere zum Schalten anweisen und dies nicht selbst durchführen. Dazu erstellen wir auf dem OpenHAB-Server ein neues Scripts “/scripts/rfid_manuell.sh” mit folgendem Inhalt:

#!/bin/bash
/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.1.238 "/scripts/rfid/rfid.sh $1"

 

Dem Script erlauben wir die Ausführung mit

chmod +x /scripts/rfid_manuell.sh

und übertragen den Besitz an OpenHAB mit

chown openhab: /scripts/rfid_manuell.sh

 

Regeln erstellen

Nun erstellen wir die benötigten Regeln für die Präsenzerkennung.

//Externe Schalter
rule "Gruppenpraesenz umschalten an"
    when
        Item RFID_GRUPPE_SWITCH received command ON
    then
        postUpdate(RFID_GRUPPE, ON)
end

rule "Gruppenpraesenz umschalten aus"
    when
        Item RFID_GRUPPE_SWITCH received command OFF
    then
        postUpdate(RFID_GRUPPE, OFF)
end


rule "Daniel umschalten an"
    when
        Item RFID_DANIEL_SWITCH received command ON
    then
        postUpdate(RFID_DANIEL, ON)
end

rule "Daniel umschalten aus"
    when
        Item RFID_DANIEL_SWITCH received command OFF
    then
        postUpdate(RFID_DANIEL, OFF)
end


rule "Tina umschalten an"
    when
        Item RFID_TINA_SWITCH received command ON
    then
        postUpdate(RFID_TINA, ON)
end

rule "Tina umschalten aus"
    when
        Item RFID_TINA_SWITCH received command OFF
    then
        postUpdate(RFID_TINA, OFF)
end

 

Zudem erstellen wir Regeln, damit die Uhrzeit der Aktion festgehalten wird:

//############### Abwesend seit ########################
rule "Daniel verlaesst die Wohnung"
    when
        Item RFID_DANIEL changed from ON to OFF
    then
        var local_time  = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))
        postUpdate(DANIEL_ABWESEND, new DateTimeType(local_time))
        postUpdate(RFID_MANUELL_DANIEL, OFF)
end


rule "Tina verlaesst die Wohnung"
    when
        Item RFID_TINA changed from ON to OFF
    then
        var local_time  = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))
        postUpdate(TINA_ABWESEND, new DateTimeType(local_time))
        postUpdate(RFID_MANUELL_TINA, OFF)
end

//############### Anwesend seit ########################
rule "Daniel betritt die Wohnung"
    when
        Item RFID_DANIEL changed from OFF to ON
    then
        var local_time  = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))
        postUpdate(DANIEL_ANWESEND, new DateTimeType(local_time))
        postUpdate(RFID_MANUELL_DANIEL, ON)
end

rule "Tina betritt die Wohnung"
    when
        Item RFID_TINA changed from OFF to ON
    then
        var local_time  = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))
        postUpdate(TINA_ANWESEND, new DateTimeType(local_time))
        postUpdate(RFID_MANUELL_TINA, ON)
end
//######################################################

 

Hier können zudem benutzerdefinierte Aktionen hinzugefügt werden. Beispielsweise schalten meine Monitor ab, wenn ich gehe und wieder ein, wenn ich nach Hause komme. Ein elektrischer Duftspender ist nur aktiv, wenn irgendjemand zuhause ist. Diese Gruppenschaltungen habe ich in der gleichen Datei so realisiert:

//#########################
//Gruppenschaltungen

rule "Niemand ist zuhause"
    when
        Item RFID_GRUPPE changed from ON to OFF
    then
        sendMail("alle@example.net", "Wohnung ist verlassen", "In der Wohnung konnte keine Praesenz festgestellt werden. Ueberwachung wird aktiviert.")
		
        createTimer(now.plusSeconds(30)) [|
            for (Switch : grp_AUSBEIABWESEND.members) {
                sendCommand(Switch, OFF)
                Thread::sleep(2000)
            }
			
            for (Switch : grp_ANBEIABWESEND.members) {
                sendCommand(Switch, ON)
                Thread::sleep(2000)
            }
			
        ]
end


rule "Irgendjemand ist zuhause"
    when
        Item RFID_GRUPPE changed from OFF to ON
    then
        sendMail("alle@example.net", "Präsenz erkannt", "Eine Praesenz wurde erkannt. Ueberwachung wird deaktiviert.")
		
        for (Switch : grp_AUSBEIANWESEND.members) {
            sendCommand(Switch, OFF)
            Thread::sleep(2000)
        }
		
        for (Switch : grp_ANBEIANWESEND.members) {
            sendCommand(Switch, ON)
            Thread::sleep(2000)
        }
end

 

Wenn alle Bewohner das Haus verlassen, wird für Mitglied der Gruppe “grp_ANBEIABWESEND” eingeschaltet. Zwischen den Schaltungen wird eine 2-sekündige Pause eingelegt. Für die Gruppen

  • grp_AUSBEIABWESEND
  • grp_ANBEIANWESEND
  • grp_AUSBEIANWESEND

verhält es sich natürlich entsprechend des Gruppennamens. Zudem wird jeweils eine Mail gesendet, wenn niemand mehr anwesend und wenn jemand aus der Gruppe anwesend ist.

 

Abschluss

Wenn wir alles richtig konfiguriert haben, zeigt die Sitemap nun wie folgt die Präsenzen an:

rfid-openhab2