Sensornetzwerke mit MySensors und pimatic

Wird pimatic (oder FHEM) für die Haussteuerung mit dem Raspberry Pi eingesetzt ergibt sich oft das Problem, dass die Sensoren nicht in direkter Nähe zum Raspberry Pi stehen. Möchte man beispielsweise in der Küche, im Badezimmer und im Schlafzimmer die Temperatur erfassen um damit Heizungen zu steuern sind verteilte Sensoren notwendig. Diese lassen sich mit Hilfe des MySensors Projektes einfach bauen.

MySensors

Bei MySensors handelt es sich um ein Opensource Framework für die Erstellung von IoT (Internet of Things) Anwendungen über Funkstrecken. Das MySensors Projekt stellt Software und Quellcode für viele Anwendungsszenarien zur Verfügung. Die Systeme sind dabei so erstellt, dass die Funkmodule alle Nachrichten in einem Mesh-Netzwerk weiter verteilen. Dadurch ist eine hohe Reichweite möglich.

Grundlegend gibt es in dem Netzwerk Nodes. Dabei ist zwischen Sensor- und Gateway-Nodes zu unterscheiden. Die Gateway-Nodes empfangen Daten und geben diese mittels Seriellem Protokoll oder über W-LAN an ein Steuersystem (Controller) weiter. In unserem Fall wird dies pimatic übernehmen. Die Sensor-Nodes sammeln die Daten der angeschlossenen Sensoren und schicken diese mittels Funkchip an ein Gateway. Die Sensor-Nodes sind dabei Arduinos (Nano, Micro oder selten Uno). Das Gateway ist entweder ein ESP8266 oder in diesem Artikel der Raspberry Pi (entweder mit pimatic Installation oder als eigenes System). Funkchips sind hierbei nRF24L01+ oder RFM69 Module. Beide sind jedoch nicht untereinander kompatibel! Die nRF24L01+ sind einfacher zu konfigurieren und preiswerter. Die RFM69 dementsprechend teurer und aufwändiger zu konfigurieren jedoch auch robuster und mit besserer Reichweite.

In diesem Artikel brauchen wir folgendes.

ACHTUNG: Im Standard ist die Kommunikation unverschlüsselt. Kritische Sensoren und Aktoren sollten daher nicht über die unverschlüsselte Standardkonfiguration laufen.

Raspberry Pi Gateway einrichten

Der Raspberry Pi muss mit dem Funkmodul verbunden werden. Hier gibt es eine ganze Menge an Kombinationsmöglichkeiten, einen Raspberry Pi 1, B, B+, 2, 3, … mit den diversen Modulen. Abhilfe schafft die Wiring Liste von MySensors.

Sind alle Kabel an der richtigen Stelle geht es an die Einrichtung der Software. In der aktuellen Lösung kann der hier beschriebene Code genutzt werden um einen virtuellen seriellen Gateway zu erstellen.

ALTERNATIVE: Sind bereits viele der GPIO Ports belegt oder soll eine eigene Lösung für MySensors gebaut werden dann kann ein Serial Gateway mit einem weiteren Arduino aufgebaut werden. Die Verkabelung erfolgt wie unten bei dem Arduino beschrieben. Danach ist dieser mit dem Code von der MySensors Serial Gateway Seite zu bestücken und mit dem Raspberry Pi über USB zu verbinden.

Arduino und Sensor vorbereiten

Als erstes muss der Arduino mit dem Funkmodul verbunden werden. Hierzu gibt es die Skizze auf der MySensors Seite unter NRF24L01+ & Arduino. Bei dem gewählten Arduino ist zu beachten, dass die reinen 5V Arduinos unbedingt einen Regulator auf 3.3V benötigen damit das Funkmodul nicht gebraten wird! Bei dem Arduino Nano sind 3.3V Ausgänge vorhanden, der Uno hat diese ebenfalls.

Sobald der Arduino angeschlossen ist erfolgt der Anschluss eines Sensors. Der einfach DS18B20 Temperatursensor ist unter den Beispielen auf der Webseite gelistet. Der Anschluss des kombinierten DHT22 ist jedoch auch sehr einfach. Die Skizze dazu findet sich unter dem Eintrag Air Humidity Sensor. Dort ist ebenfalls ein Arduino Sketch abgelegt mit dem das Netzwerk und der Sensor aktiviert werden.

Prüfen

Sind beide Arduinos bzw. die Kombination Arduino und Raspberry Pi eingerichtet sollte der Sensor Arduino an den PC angeschlossen werden. Über den „Serial Monitor“ der Arduino Entwicklungsumgebung können die Ausgaben überprüft werden. Da ggf. noch kein Controller angeschlossen ist (pimatic) erhält der Arduino noch keine eindeutige ID. Abhilfe schafft die folgende Definition am Anfang des DHT22 Programms.

#define MY_NODE_ID 14

Hiermit erhält der Arduino testweise die ID 14. Diese ist dann auch im Output zu erkennen. Der Output sollte ungefähr wie folgt sein.

[...]
4186 MCO:BGN:INIT OK,TSP=1
4202 TSF:MSG:SEND,14-14-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:23.9
T: 23.90
4210 TSF:MSG:SEND,14-14-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:47.4
H: 47.40
4217 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255

Wenn das Gateway ebenfalls ein Arduino ist ergibt sich im „Serial Monitor“ der folgende Output.

0;255;3;0;9;TSF:MSG:READ,14-14-0,s=255,c=3,t=26,pt=1,l=1,sg=0:2
0;255;3;0;9;TSF:MSG:SEND,0-0-14-14,s=255,c=3,t=27,pt=1,l=1,sg=0,ft=0,st=OK:1
0;255;3;0;9;TSF:MSG:READ,14-14-0,s=1,c=1,t=0,pt=7,l=5,sg=0:23.9
14;1;1;0;0;23.9
0;255;3;0;9;TSF:MSG:READ,14-14-0,s=0,c=1,t=1,pt=7,l=5,sg=0:47.5
14;0;1;0;1;47.5

Sensor in pimatic einbinden

Die Einbindung in pimatic erfolgt mit dem Plugin „pimatic-plugin-mySensors“.

Probleme

Ich konnte die Verbindung nur zwischen zwei Arduino Uno Varianten herstellen. Mit einem geklonten Mini war leider keine saubere Kommunikation möglich. Bei einem Original sollten hier aber keine Probleme auftreten.

Terrarium steuern mit Raspberry Pi – Teil 2 – pimatic

Nach dem Abschluß der pimatic Installation erfolgt die Montage der Technik und die Konfiguration des Tools. Alle Sensoren und Aktoren sind zu verkabeln und nach erfolgreichem Test anzulegen. Eine sinnvolle Konfiguration und die relevanten Regeln sind im Folgenden vorgestellt.

Hardware vorbereiten

Die eigentliche Steuerung erfolgt über Funksteckdosen. Hierzu muss lediglich ein Sender an den Raspberry Pi angeschlossen sein. Die zur Ansteuerung benötigten Module lassen sich später in pimatic aktivieren. Das Ermitteln der korrekten Konfiguration setzt einen Empfänger voraus oder gute Kenntnisse über die verbauten Funksteckdosen.

Initiale Konfiguration

Zentrale Datei für die Konfiguration von pimatic ist die config.json welche einerseits über die Kommandozeile bearbeitet werden kann, andererseits auch direkt über die Weboberfläche. Initial muss das Passwort des admin Benutzers geändert werden. In der Datei oder über die Menüpunkt Plugins lassen sich weitere Funktionen aktivieren.

Plugins auswählen

In dem Installationsumfang von pimatic sind viele Plugins enthalten. Die von mir genutzten oder für sinnvoll erachteten sind im Folgenden kurz beschrieben.

PluginBeschreibung
DHT SensorsEinbindung der Temperatur- und Feuchtigkeitssensoren DHT11, AM2302 und DHT22.
DS18B20Einbindung der One-Wire Temperatursensoren DS18B20.
HomeduinoSteuerung eines arduino für den Funkempfang.
MailMailversand.
OpenweatherErmittlung des aktuellen Wetters in verschiedenen Ländern. Bei den Terrarien ist das aktuelle Wetter in den Heimatregionen angezeigt.
Pusshbullet, PushoverVersand von Push Nachrichten an Smartphones.
Shell executeAusführen von Skripten auf dem System.

Seiten anlegen

Für die Strukturierung der Terrarienanlage bietet sich das Anlegen von Seiten je Terrarium an. Unter einer Seite können alle Sensoren und Aktoren zu Gruppen vereint werden. Auf einer „Global“ genannten Seite sind die wichtigsten Daten aus allen Bereich erfasst und ein Button für die Notfallabschaltung.

Geräte erstellen

Für jeden Sensor wurde ein entsprechendes Device erfasst. Exemplarisch sind hier die unterschiedlichen Geräte genannt. Grundsätzlich können alle Werte der InputDevices auch mittels Variable intern gespeichert werden ohne ein Input Element. Die Eingabefelder vereinfachen jedoch die manuelle Änderung erheblich.

DHT22 Sensoren

{
  "type": 22,
  "pin": 3,
  "interval": 300000,
  "xAttributeOptions": [],
  "id": "schlangen-dht22",
  "name": "Schlangen DHT22",
  "class": "DHTSensor"
 }

Alle 5 Minuten die Daten von dem Sensor ermitteln.

DS18B20 Sensor

{
  "hardwareId": "28-0316613cc1ff",
  "id": "schlangen-temperatur-oben",
  "name": "Schlangen Temperatur Oben/Rechts",
  "class": "DS18B20Sensor",
  "interval": 300000
}

Alle 5 Minuten einen der One Wire Sensoren auslesen.

Input für Temperatur

{
  "variable": "ts-temp-tag",
  "type": "number",
  "min": 0,
  "max": 60,
  "id": "schlangen-temperatur-tag",
  "name": "Schlangen Temperatur Tag",
  "class": "VariableInputDevice"
}

Eingabe für den Wert zwischen 0 und 60 Grad.

Input für eine Zeit

{
  "variable": "ts-tag",
  "id": "schlangen-tag",
  "name": "Schlangen Tag",
  "class": "VariableTimeInputDevice"
}

Erfassung des Tagesanfangs.

Schalter für Aktiv, Notaus, …

{
  "id": "schlangen-aktiv",
  "name": "Schlangen Aktiv",
  "class": "DummySwitch"
},
{
  "xConfirm": true,
  "id": "notaus",
  "name": "Notaus",
  "class": "DummySwitch"
}

An- und Ausschalter.

Schalter für die Funksteckdosen

{
  "protocols": [
    {
      "name": "switch2",
      "options": {
        "houseCode": 28,
        "unitCode": 16
      },
      "send": true,
      "receive": true
    }
  ],
  "id": "schlangen-schalter-licht",
  "name": "Schlangen Schalter Licht",
  "class": "HomeduinoRFSwitch"
}

Sonnenaufgang und Sonnenuntergang

{
  "attributes": [
    {
      "name": "sunrise",
      "label": "Sunrise"
    },
    {
      "name": "sunset",
      "label": "Sunset"
    }
  ],
  "id": "sonnenaufgang",
  "name": "Sonnenaufgang",
  "class": "SunriseDevice",
  "latitude": xx.xxxxxxxx,
  "longitude": y.yyyyyyyy
}

Wetter

{
  "location": "",
  "cityId": "2077895",
  "lang": "de",
  "blacklist": [],
  "xAttributeOptions": [],
  "id": "wetter-alicesprings",
  "name": "Wetter Alice Springs",
  "class": "OpenWeatherDevice"
}

Das aktuelle Wetter in Australien.

Regeln definieren

Sind alle Sensoren, Aktoren und Variables definiert kommt das Kernelement von pimatic zum Einsatz. Mit Hilfe der Regeln lassen sich mächtige Schaltungen erzeugen.

Licht steuern

{
  "id": "schlangen-licht-an",
  "name": "Schlangen Licht An",
  "rule": "when its after $ts-tag and its before $ts-nacht and state of schlangen-aktiv is equal to on then turn Schlangen Schalter Licht on after 10 seconds and turn schlangen-schalter-spot on after 15 seconds and turn echsen-schalter-spot on after 25 seconds",
  "active": true,
  "logging": true
}

Schaltet alle Lichtquellen für den Tag ein wenn die manuelle Steuerung nicht aktiv ist. WICHTIG: Es müssen alle Funksteckdosen mit einer Pause nacheinander geschaltet werden. Andernfalls überlagern sich die Funksignale und kein korrektes Signal erreicht die Steckdosen.

Temperatur steuern

{
  "id": "schlangen-temperatur-tag-an",
  "name": "Schlangen Temperatur Tag An",
  "rule": "when its after $ts-tag and its before $ts-nacht and $schlangen-dht22.temperature <= $ts-temp-tag - $global-tempdiff and state of schlangen-aktiv is equal to on then turn Schlangen Schalter Heatpanel on",
  "active": true,
  "logging": true
}

Aktiviert das Heatpanel falls es tagsüber zu kalt ist und die manuelle Steuerung nicht aktiv ist.

Notaus

{
  "id": "notaus",
  "name": "Notaus",
  "rule": "when notaus is turned on then switch off schlangen-aktiv and switch Schlangen Schalter Heatpanel off and switch Schlangen Schalter Licht off and switch Schlangen Schalter Spot off",
  "active": true,
  "logging": true
}

Der Notaus Schalter deaktiviert die automatisch Steuerung und schaltet alle Aktoren aus.

Nachrichten

{
  "id": "nachricht-schlangen-temperatur-nacht-zu-kalt",
  "name": "Nachricht Schlangen Temperatur Nacht Zu Kalt",
  "rule": "when [its before $ts-tag or its after $ts-nacht] and $schlangen-dht22.temperature <= $ts-temp-nacht - $global-alarmdelta then log "Schlangen - Es ist ZU KALT: $schlangen-dht22.temperature ist unter $ts-temp-nacht - $global-alarmdelta"",
  "active": true,
  "logging": true
}

Nachrichten für Sonderfälle (Zu warm/kalt, …) können in das Log geschrieben, per Mail versendet oder als Push Nachricht verschickt werden.

Arduino Anzeige
Arduino Anzeige
Weboberfläche von TerraPiPy
Weboberfläche von TerraPiPy
Pimatic
Pimatic

Universalfernbedienung (Raspberry Pi)

In meinem letzten Eintrag zum Thema Universalfernbedienung wurde das Thema mit dem Arduino umgesetzt. Eine Einbindung in Fhem zur Haussteuerung wird dadurch erschwert, dass eine Kommunikation zwischen den Geräten stattfinden muss. Anstelle eines umfangreichen Protokolls für die Datenkommunikation wird die Universalfernbedienung direkt mit dem Raspberry Pi umgesetzt. Im Gegensatz zum Arduino werden die GPIO Ports leider nur mit 3,3V betrieben anstelle von 5V.

Hardware

Die Hardware wird ähnlich wie bei dem Arduino direkt an die GPIO Ports angeschlossen. Hierbei ist die unterschiedliche Belegung der Ports bei den Raspberry Pi Modelle zu beachten. In diesem Artikel ist der Anschluss GPIO PIN 22 für den IR Empfänger und der GPIO PIN 23 für den IR Sender vorgesehen.

LIRC

Anstelle einer kleinen Bibliothek für die IR Erkennung und das Senden wird LIRC eingesetzt. _„LIRC ist die Abkürzung für Linux Infrared Remote Control. Es handelt sich dabei um ein Programm für Linux, mit dessen Hilfe man Befehle von IR-Fernbedienungen in Programmbefehle umsetzen kann. Nötig ist dafür lediglich ein Infrarot-Empfänger. […] Um die Signale von Fernbedienungen korrekt zu decodieren, benötigt man eine Konfigurationsdatei, die auf die jeweilige Fernbedienung abgestimmt ist. Man kann diese entweder selbst erzeugen, oder eine passende Datei aus dem Internet herunterladen.“ (Quelle: Wikipedia)_

Zur Installation und Einrichtung auf dem Raspberry Pi gibt es einen interessanten Artikel der für die folgenden Aufrufe als Basis dient. Die Installation von LIRC erfolgt dabei einfach mittels apt-get.

$ sudo apt-get install lirc

Um die benötigten Module per Hand zu laden und diese zu testen gibt es den Befehl modprobe. Bei dem lirc_rpi ist die korrekte Belegung der GPIO Ports zu beachten!

$ sudo modprobe lirc_dev
$ sudo modprobe lirc_rpi gpio_in_pin=22 gpio_out_pin=23

UPDATE: 27.04.2015: Ab sofort wird das Modul nicht mehr über /etc/modules gelanden sondern über /boot/config.txt

$ sudo vi /boot/config.txt
dtoverlay=lirc-rpi,gpio_out_pin=23,gpio_in_pin=22

Damit die Module beim Start geladen werden, müssen diese in die modules Datei eingetragen werden.

$ sudo vi /etc/modules
lirc_dev
lirc_rpi gpio_in_pin=22 gpio_out_pin=23

Das lirc Device kann mittels ls im dev Verzeichnis ermittelt werden.

$ ls -l /dev/lir*
crw-rw---T 1 root video 248, 0 Jan  5 12:16 /dev/lirc0

In der Config Datei von LIRC müssen das Device und die Module eingetragen werden.

$ sudo vi /etc/lirc/hardware.conf
# -u --uinput            generate Linux input events
LIRCD_ARGS="--uinput"
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Neustarten des Daemon.

$ sudo /etc/init.d/lirc restart

Empfänger testen

Der Empfänger kann auf seine Grundlegende Funktionalität geprüft werden indem der LIRC Daemon gestommt wird und mittels mode2 die RAW Ausgabe von dem Device angeschaut wird. Beim Drücken von beliebigen Tasten auf einer IR Fernbedienung sollten abwechselnd space und pule Einträge erscheinen.

$ sudo /etc/init.d/lirc stop
$ mode2 -d /dev/lirc0
space 1622
pulse 667
space 1573
pulse 675

Sender testen

Die initiale lircd.conf ist leer. Es können entweder bestehende Konfigurationsdateien genutzt werden, sofern es welche für die Fernbedienung gibt, oder eigene aufgenommen werden.

$ cat /etc/lirc/lircd.conf

Bestehende Konfigurationsdatei

In dem Sourceforce Remote Projekt sind viele Fernbedienungen bereits erfasst. Außerdem liefert LIRC eigene Dateien mit.

$ ls /usr/share/lirc/remotes/

Bei der YAMAHA RAX9 Fernbedienung gibt es bereits eine Datei in dem Projekt.

$ mkdir lirc
$ cd lirc
$ wget http://lirc.sourceforge.net/remotes/yamaha/RAX9
$ sudo cp RAX9 /etc/lirc/lircd.conf

Mit dem Programm irw können die Eingaben der Fernbedienung gelesen werden.

$ irw
000000005ea158a7 03 vol+ rax9
000000005ea1e817 00 aux rax9

Sollte dort keine Ausgabe erscheinen kann der Daemon testweise im Vordergrund gestartet werden. Eventuell werden hier Fehler oder Warnungen angezeigt.

$ sudo /etc/init.d/lirc stop
$ sudo lircd --nodaemon -H devinput

Das Senden erfolgt mittels irsend.

$ irsend SEND_ONCE rax9 aux

Eigene Konfigurationsdatei erstellen

Der Daemon wird gestoppt und mit den Programm irrecord wird eine eigene Datei pro Fernbedienung aufgenommen.

$ sudo /etc/init.d/lirc stop

Für die SAMSUNG – AA59-00743A Fernbedienung wäre ein möglicher Aufruf wie folgt.

$ sudo irrecord -H default -d /dev/lirc0 AA59-00743A

Das Programm führt den Benutzer durch den Prozess der Aufnahme. Die Liste der Keycodes hilft bei der korrekt Zuordnung. Nach dem Aufnehmen wird die generierte Datei als neue /etc/lirc/lircd.conf kopiert und der Daemon neugestartet. Mittels irw können wie oben beschrieben die gedrückten Tasten ermittelt werden.

$ sudo cp AA59-00743A.conf /etc/lirc/lircd.conf
$ sudo /etc/init.d/lirc restart
$ irw
00000000e0e040bf 00 KEY_POWER Samsung_AA59-00743A
$ irsend SEND_ONCE Samsung_AA59-00743A KEY_POWER

Das gleiche wird für alle anderen Fernbedienung durchgeführt (Hier die LG – AKB73615701).

sudo irrecord -H default -d /dev/lirc0 AKB73615701

Am Ende werden alle Konfigurationsdateien in einer Datei zusammengefasst und als neue lircd.conf genutzt.

$ cat *.conf > lircd.conf
$ sudo cp lircd.conf /etc/lirc/lircd.conf

oder

cat AKB73615701.conf AA59-00743A.conf RAX9 > lircd.conf
sudo cp lircd.conf /etc/lirc/lircd.conf

FHEM Einbindung

Mit dem Modul Remotcontrol kann ein Floorplan erstellt werden. Auf dem Floorplan werden alle Tasten hinterlegt. Die Samsung Fernbedienung könnte wie folgt definiert werden.

define RC_TV remotecontrol
attr RC_TV rc_iconpath icons/remotecontrol
attr RC_TV rc_iconprefix black_btn_
attr RC_TV room 1.0_Wohnzimmer
attr RC_TV row00 KEY_POWER:POWEROFF,:blank,KEY_SELECT:SOURCE
attr RC_TV row02 :blank,:blank,:blank
attr RC_TV row03 KEY_1:1,KEY_2:2,KEY_3:3
attr RC_TV row04 KEY_4:4,KEY_5:5,KEY_6:6
attr RC_TV row05 KEY_7:7,KEY_8:8,KEY_9:9
attr RC_TV row06 :blank,KEY_0:0,KEY_REWIND:PRECH
attr RC_TV row07 :blank,:blank,:blank
attr RC_TV row08 KEY_VOLUMEUP:UP,KEY_MUTE:MUTE,KEY_CHANNELUP:CHUP
attr RC_TV row09 KEY_VOLUMEDOWN:DOWN,:blank,KEY_CHANNELDOWN:CHDOWN
attr RC_TV row10 KEY_MENU:MENU,:blank,KEY_PROGRAM:GUIDE
attr RC_TV row11 :blank,:blank,:blank
attr RC_TV row12 :blank,KEY_UP:UP,KEY_INFO:INFO
attr RC_TV row13 KEY_LEFT:LEFT,KEY_ENTER:ENTER,KEY_RIGHT:RIGHT
attr RC_TV row14 :blank,KEY_DOWN:DOWN,KEY_EXIT:EXIT
define NRC_TV notify RC_TV {system("irsend SEND_ONCE Samsung_AA59-00743A $EVENT")}

Die Werte rc_iconpath und rc_iconprefix definieren den Pfad für die Bilder. Mittels rowXX werden die Zeilen mit den Buttons definiert. Jeder Button wird dabei hinterlegt mittels EVENT:IMAGE. Das notify behandelt das anklicken der Buttons und sendet den EVENT an irsend.

Beispiele der generierten Dateien

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Sun Jan  5 13:37:55 2014
#
# contributed by
#
# brand:                       Samsung_AA59-00743A
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

    name  Samsung_AA59-00743A
    bits           16
    flags SPACE_ENC|CONST_LENGTH
    eps            30
    aeps          100

    header       4532  4449
    one           595  1635
    zero          595   520
    ptrail        597
    pre_data_bits   16
    pre_data       0xE0E0
    gap          107492
    toggle_bit_mask 0x0

        begin codes
            KEY_NEXT                 0x12ED
            KEY_POWER                0x40BF
            KEY_1                    0x20DF
            KEY_2                    0xA05F
            KEY_3                    0x609F
            KEY_4                    0x10EF
            KEY_5                    0x906F
            KEY_6                    0x50AF
            KEY_7                    0x30CF
            KEY_8                    0xB04F
            KEY_9                    0x708F
            KEY_0                    0x8877
            KEY_SELECT               0x807F
            KEY_VOLUMEDOWN           0xD02F
            KEY_VOLUMEUP             0xE01F
            KEY_CHANNELDOWN          0x08F7
            KEY_CHANNELUP            0x48B7
            KEY_MENU                 0x58A7
            KEY_PROGRAM              0xF20D
            KEY_INFO                 0xF807
            KEY_ENTER                0x16E9
            KEY_EXIT                 0xB44B
            KEY_REWIND               0x1AE5
            KEY_MUTE                 0xF00F
            KEY_LEFT                 0xA659
            KEY_RIGHT                0x46B9
            KEY_UP                   0x06F9
            KEY_DOWN                 0x8679
        end codes

end remote

VORLÄUFIGE LG Datei! (Keys fehlen!)

    # Please make this file available to others
    # by sending it to <lirc@bartelmus.de>
    #
    # this config file was automatically generated
    # using lirc-0.9.0-pre1(default) on Sun Jan  5 14:24:26 2014
    #
    # contributed by
    # Sebastian Pech - www.spech.de
    # brand:                      LG
    # model no. of remote control: AKB73615701
    # devices being controlled by this remote:
    #

    begin remote

      name LG_AKB73615701
      bits           16
      flags SPACE_ENC|CONST_LENGTH|REPEAT_HEADER
      eps            30
      aeps          100

      header       4525  4429
      one           605  1625
      zero          605   509
      ptrail        604
      repeat        600   511
      pre_data_bits   16
      pre_data       0xB4B4
      gap          107515
      toggle_bit_mask 0x0

          begin codes
              KEY_POWER                0x0CF3
              KEY_1                    0xDC23
              KEY_FASTFORWARD          0x2CD3
              KEY_FORWARD              0xCC33
              KEY_REWIND               0xAC53
              KEY_PREVIOUS             0x4CB3
              KEY_NEXT                 0xCC33
              KEY_TITLE                0x52AD
              KEY_MENU                 0x5CA3
              KEY_HOME                 0xE619
              KEY_UP                   0xE21D
              KEY_DOWN                 0x12ED
              KEY_LEFT                 0x9A65
              KEY_RIGHT                0x5AA5
              KEY_ENTER                0x1AE5
              KEY_BACK                 0xA25D
              KEY_SUBTITLE             0x0AF5
              KEY_TITLE                0xD22D
          end codes

    end remote

Probleme

Gibt es in der Zeile 1 der lircd.conf den Eintrag #UNCONFIGURED muss dieser gelöscht werden. Andernfalls erscheint die folgende Meldung beim Start.

$ sudo /etc/init.d/lirc restart
[ ok ] Reconfigure LIRC or manually replace /etc/lirc/lircd.conf to enable..
Universalfernbedienung

Der erste Teil aus dem Bereich Home automation umfasst meine Entwicklung einer Universalfernbedienung. Im Handel gibt es diese Geräte in einer großen Anzahl als Fernsteuerungen. Mein Ziel in diesem Projekt besteht darin die Fernbedienungen komplett überflüssig zu machen. Mittels eines einfachen Befehls per Handy, Tablet oder Sprache sollen alle beteiligten Geräte automatisch eingeschaltet und richtig eingestellt werden. Beispielsweise würde der Befehl „Kino an“ dafür sorgen das mein Verstärker, TV und Blu-ray-Player eingeschaltet wird. Beim TV und dem Verstärker wird dann der Player als Quelle eingestellt. Zusätzlich muss die Beleuchtung im Raum gedimmt werden. Mittels „Kino aus“ werden dann wieder alle Geräte ausgeschaltet.

Grundidee

Grundlage für die Steuerung der Geräte per Infrarot ist der Arduino Uno. _Die Arduino-Plattform ist eine aus Soft- und Hardware bestehende Physical-Computing-Plattform. Beide Komponenten sind im Sinne von Open Source quelloffen. Die Hardware besteht aus einem einfachen I/O-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen. Die Entwicklungsumgebung verwendet die Programmiersprache Processing, die auch technisch weniger Versierten den Zugang zur Programmierung und zu Mikrocontrollern erleichtern soll. Arduino kann verwendet werden, um eigenständige interaktive Objekte zu steuern oder um mit Softwareanwendungen auf Computern zu interagieren (z. B. Adobe Flash, Processing, Max/MSP, Pure Data, SuperCollider, diversen Skriptsprachen, Terminal, vvvv etc.). (Quelle: Wikipedia)_

Die Infrarotprotokolle unterscheiden sich nicht nur von Hersteller zu Hersteller sondern zum Teil auch von Gerät zu Gerät. Um die korrekten Signale senden zu können müssen die richtigen Signale ermittelt werden. Infrarotsender funktionieren nach dem Prinzip einer LED, welche in einem bestimmten Intervall ein- und ausgeschaltet wird. Typischerweise umfasst die Modulation der Frequenz (also das ein- und ausschalten) 36, 38 oder 40KHz. Der aktive Zustand der LED wird dabei „mark“ genannt und der inaktive Zustand „space“. Für jede Taste einer Fernbedienung gibt es ein eigenen Code der die Schaltzeiten bestimmt. Eine detaillierte Erklärung ist auf der Webseite von Ken Shirriff zu finden.

IR Empfänger

Für den Empfang von Infrarot Signalen habe ich mir das IR-Empfänger-Modul TSOP 4838 bei Conrad bestellt. Das Modul lässt sich einfach an den Arduino anschließen. Da der Empfänger für den Spannungsbereich -0.3 – 6.0 V ausgelegt ist kann dieser direkt an den 5V Anschluss des Arduino angeschlossen werden. Die Vgrnd werden ebenfalls an den Ground (GND) vom Arduino angeschlossen. Die Datenleitung kommt an einen der freien PWM Steckplätze (Bsp. 11 – Siehe Abbildung)

Zur Abfrage der Daten kommt die, aus dem oben erwähnten Artikel, erstellt IRremote Library zum Einsatz. Standardmäßig werden von der Bibliothek die Formate NEC, SONY, RC5, RC6, DISH, SHARP, PANASONIC, JVC, SANYO und MITSUBISHI unterstützt. Die Bibliothek gibt es auf Github Das Beispielprogramm IRrecord wird auf dem Arduino übertragen und danach die Fernsteuerung des Gerätes auf den Empfänger ausgerichtet. Dabei sollte auf dem Serial Monitor der korrekte Code erscheinen.

Das Programm gibt für meinen YAMAHA auf Anhieb den NEC Code 0x5EA1E817 für einen der Kanäle aus. Ernüchterung trat bei der Fernsteuerung für meinen neuen Samsung UE40F6170 3D-LED-Backlight-Fernseher auf, ebenso wie dem LG Blu-ray-Player. Beide Fernbedienungen erzeugen im IRrecvDump nur eine Ausgabe eines unbekannten Protokolls und dem RAW Output. Auf der Mikrocontroller Webseite konnte ich jedoch ermitteln, dass SAMSUNG für seine Fernbedienungen das Format „1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit “ nutzt. Da das Startbit hier aus zwei 4500µs Pulsen besteht und die anderen Format in der Regel nur ein High und einen Low Pulse nutzen musste ich eine eigene Routine schreiben. Diese funktionierte danach interessanterweise auch mit der LG Fernbedienung. Im Folgenden meine Anpassungen als Vervollständigung.

IRemote.h

#define SAMSUNG32 11

class IRrecv
{
[...]
long decodeSamsung32(decode_results *results);
[...]

IRemoteInt.h

#define SAMSUNG32_HDR_MARK  4500
#define SAMSUNG32_HDR_SPACE 550
#define SAMSUNG32_BIT_MARK  550
#define SAMSUNG32_ONE_SPACE 1650
#define SAMSUNG32_ZERO_SPACE  560

#define SAMSUNG32_BITS 32

IRemote.cpp

int IRrecv::decode(decode_results *results) {
[...]
#ifdef DEBUG
    Serial.println("Attempting SAMSUNG32 decode");
#endif
    if (decodeSamsung32(results)) {
        return DECODED;
    }
[...]
}

long IRrecv::decodeSamsung32(decode_results *results) {
    unsigned long long data = 0;
    int offset = 1;

    if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG32_HDR_MARK)) {
        return ERR;
    }
    offset++;
    if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG32_HDR_MARK)) {
        return ERR;
    }
    offset++;

    // decode address
    for (int i = 0; i < SAMSUNG32_BITS; i++) {
        if (!MATCH_MARK(results->rawbuf[offset++], SAMSUNG32_BIT_MARK)) {
            return ERR;
        }
        if (MATCH_SPACE(results->rawbuf[offset],SAMSUNG32_ONE_SPACE)) {
            data = (data << 1) | 1;
        } else if (MATCH_SPACE(results->rawbuf[offset],SAMSUNG32_ZERO_SPACE)) {
            data <<= 1;
        } else {
            return ERR;
        }
        offset++;
    }

    if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG32_HDR_SPACE)) {
        return ERR;
    }

    results->value = data;
    results->decode_type = SAMSUNG32;
    results->bits = SAMSUNG32_BITS;
    return DECODED;
}

Beispiel: IRrecvDump

Hier muss der if/else Block noch um den neuen Type ergänzt werden.

else if (results->decode_type == SAMSUNG32) {
    Serial.print("Decoded SAMSUNG32: ");
}

IR Sender

Für das Senden nutze ich die IR-Sendediode TSAL 6200 (5 mm, Wellen-Länge 940 nm). Da die Betriebsspannung geringer ist als die Ausgangsspannung des Arduino muss die Diode mit einem Vorwiderstand betrieben werden (siehe vorherige Abbildung). Standardmäßig nutzt die Bibliothek den PWM PIN 3 für das Senden (im Header hinterlegt). Mit dem Aufruf sendNEC konnte der YAMAHA Verstärker sofort angesteuert werden.

irsend.sendNEC(0x5EA1E817, 32);

Für den SAMSUNG TV und den LG Blu-ray-Player fehlt jetzt noch das Gegenstück zum Senden der Codes. Hierzu musste ich wieder die Bibliothek erweitern.

IRemote.h

class IRsend
{
[...]
    void sendSamsung32(unsigned long data);
[...]

IRemote.cpp

void IRsend::sendSamsung32(unsigned long data) {
    enableIROut(38);
    mark(SAMSUNG32_HDR_MARK);
    space(SAMSUNG32_HDR_MARK);
    for (int i=0; i < 32; i++) {
        mark(SAMSUNG32_BIT_MARK);
        if (data & TOPBIT) {
            space(SAMSUNG32_ONE_SPACE);
        } else {
            space(SAMSUNG32_ZERO_SPACE);
        }
        data <<= 1;
    }
    mark(SAMSUNG32_HDR_SPACE);
    space(0);
}

Nächste Schritte

Mit den Anpassungen konnte ich die vorhandenen Fernbedienungen abfragen und die Codes an die Geräte senden. Zur vollständigen Integration muss der Arduino in Zukunft in die Haussteuerung integriert werden. Außerdem müssen alle Befehle der verschiedenen Fernbedienungen einmal ermittelt werden. Letzteres ist eine reine Fleißarbeit. Ersteres werde ich in den kommenden Tagen und Wochen beschreiben.