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..
Funksteckdosen

In Baumärkten gibt es eine große Auswahl von Funksteckdosen. In meinem konkreten Fall habe ich mich bei Amazon für das mumbi Funksteckdosen Set entschieden. In dem Paket befinden sich insgesamt sechs Steckdosen und zwei Fernsteuerungen. Das Set kommuniziert in dem 433MHz Band für welches dann ein Sender und Empfänger benötigt wird.

Den Sender und Empfänger gibt es für kleines Geld als 433M receiver module 433MHZ Superregeneration Wireless Transmitter Module. In dem Set sind beide Platinen erhalten inklusive einer kleinen Antenne. Je nach Spannungsversorgung beträgt die Reichweite zwischen 20 und 200m. In meinen Versuchen sind mit den 3,3V des Raspberry Pi aber auch Steckdosen in Nachbarräumen problemlos zu schalten.

pilight Installation

pilight ist ein freies Open Source Projekt welches eine Reihe von Programmen zur Steuerung von unterschiedlichen (Funk)protokollen bereitstellt. Mit Hilfe der Sende- und Empfangsprogramme können die Steckdosen angesteuert werden und die Daten aus den Fernbedienungen erfasst werden. Theoretisch könnten die Fernbedienungen unabhängig von den Steckdosen zur Steuerung des Raspberry Pi oder anderer Funktionen genutzt werden. Der Kreativität sind hier keine Grenzen gesetzt.

Im Folgenden werden die benötigten Programme wie zum Beispiel git installiert. Im Anschluß kann mit git das pilight Repository ausgecheckt und das Setup durchgeführt werden. Die Voreinstellung sind dabei unverändert zu übernehmen.

UPDATE: 27.04.2015: libpcap-dev und libunwind werden nun ebenfalls benötigt. (Quelle)

wget http://mirrordirector.raspbian.org/raspbian/pool/main/libu/libunwind/libunwind-dev_1.1-3.2_armhf.deb
wget http://mirrordirector.raspbian.org/raspbian/pool/main/libu/libunwind/libunwind8_1.1-3.2_armhf.deb
wget http://mirrordirector.raspbian.org/raspbian/pool/main/libu/libunwind/libunwind8-dev_1.1-3.2_armhf.deb
sudo dpkg -i *.deb

sudo apt-get install build-essential dialog cmake git libpcap-dev
git clone --depth 5 -b master https://github.com/pilight/pilight.git
cd pilight
chmod +x setup.sh
sudo ./setup.sh

In der Einstellungsdatei müssen die GPIO Ports für den Raspberry Pi eventuell angepasst werden.

sudo vi /etc/pilight/settings.json

Abschließend wird der Dienst gestartet und in den automatischen Start nach reboots eingetragen.

sudo pilight-daemon
sudo update-rc.d pilight defaults

Empfänger

Das Programm pilight-receive wartet auf Daten von dem Funkempfänger.

sudo pilight-receive

Wird eine Taste auf der Fernbedienung gedrückt sollte pilight-receive diese erkennen und einen entsrepchenden JSON Eintrag ausgeben.

{
        "code": {
                "systemcode": 9,
                "unitcode": 1,
                "state": "on"
        },
        "origin": "receiver",
        "protocol": "sartano",
        "repeats": 3
}
{
        "code": {
                "systemcode": 9,
                "unitcode": 1,
                "state": "off"
        },
        "origin": "receiver",
        "protocol": "sartano",
        "repeats": 2
}
{
        "code": {
                "systemcode": 9,
                "unitcode": 2,
                "state": "on"
        },
        "origin": "receiver",
        "protocol": "sartano",
        "repeats": 2
}

Dort erkennt man als systemcode den Hauscode der auf der Fernbedienung und den Steckdosen vergeben wurde nach dem Binärsystem. In meinem Fall wurden die Jumper 1 und 4 gesetzt. 1 steht dabei für die 2^1=1 und 4 für die 2^4=8. Somit ergibt sich die 9 als systemcode. Der unitcode gibt die Steckdose an und der state ob der Ein- oder Ausknopf gedrückt wurde.

1 2 3 4 5 Hauscode
1 2 4 8 16 x^2
1 0 0 1 0 = 9

Sender

Zum Senden wird das Programm pilight-send genutzt. In dem pilight-Wiki gibt es einen Eintrag zum sartano Protokoll.

-s --systemcode=systemcode     control a device with this systemcode
-u --unitcode=unitcode         control a device with this unitcode
-t --on                        send an on signal
-f --off                       send an off signal

Das sartano Protokoll wird bei pilight als elro angesprochen. Zum einschalten der ersten Steckdose (-u 1) für unseren systemcode ergibt sich daher der folgende Aufruf.

UPDATE: 27.04.2015: Das Protokoll elro heißt nun elro_800_switch.

sudo pilight-send -p elro_800_switch -s 9 -u 1 -t

FHEM Einbindung

Damit die Steckdosen künftig über FHEM gesteuert werden können muss in der fhem.cfg für jede Steckdose ein dummy angelegt werden. Mit dem dummy kann das pilight-send aufgerufen werden.

UPDATE: 27.04.2015: Die Binaries liegen nicht mehr in sbin sondern in bin.

    define Steckdose_Wohnzimmer_Schrank dummy
    attr Steckdose_Wohnzimmer_Schrank eventMap on:on off:off
    attr Steckdose_Wohnzimmer_Schrank room Wohnzimmer
    define NSteckdose_Wohnzimmer_Schrank notify Steckdose_Wohnzimmer_Schrank {\
     if ("%" ne "off") {\
      system("sudo /usr/local/bin/pilight-send -p elro_800_switch -s 9 -u 4 -t")\
     }\
     else {\
      system("sudo /usr/local/bin/pilight-send -p elro_800_switch -s 9 -u 4 -f")\
     }\
    }

Leider muss pilight-send als root aufgerufen werden. Um fhem zu ermöglichen das sudo Kommando zu nutzen muss der fhem Benutzer daher mit sudo Rechten ausgestattet werden!

    sudo visudo
    fhem ALL=(ALL) NOPASSWD: ALL

Übersicht Funkmodule und Raspberry Pi
Übersicht Funkmodule und Raspberry Pi
Funkmodule 433 MHZ (rechts) und IR Emitter/Empfänger (links)
Funkmodule 433 MHZ (rechts) und IR Emitter/Empfänger (links)

Sprachsteuerung

Die fertige Lösung Jasper übernimmt die Sprachsteuerung aus dem Raspberry Pi bzw. Linux Betriebssystemen. Der „Artikel“ im folgenden sind Aufzeichnungen mit einigen Versuchen die ich selber ausprobiert haben und dient nur als Referenz!

UPDATE: Nach einigen Versuchen bin ich der Meinung, dass die Sprachqualität dem Aufwand der Einrichtung in keiner Weise gerecht wird. Bessere Lösungen sind Systeme wie Watson und Co.

Sound testen

Sound testen (http://www.aonsquared.co.uk/raspi_voice_control)

arecord -d 10 -D plughw:1,0 test.wav
aplay test.wav

Möglichkeiten der Sprachsteuerung

Google API

Das Problem besteht darin, dass Google immer alle gesprochenen Informationen bekommt. Das möchte man nicht wirklich.

Julius

CMUSphinx / pocketsphinx

http://www.moop.org.uk/index.php/2013/08/10/voice-controlled-lights/

http://stackoverflow.com/questions/17778532/raspberrypi-pocketsphinx-ps3eye-error-failed-to-open-audio-device

    sudo apt-get install autoconf libtool automake bison
    sudo apt-get install gstreamer0.10-pulseaudio libao4 libasound2-plugins libgconfmm-2.6-1c2 libglademm-2.4-1c2a libpulse-dev libpulse-mainloop-glib0 libpulse-mainloop-glib0-dbg libpulse0 libpulse0-dbg libsox-fmt-pulse paman paprefs pavucontrol pavumeter pulseaudio pulseaudio-dbg pulseaudio-esound-compat pulseaudio-esound-compat-dbg pulseaudio-module-bluetooth pulseaudio-module-gconf pulseaudio-module-jack pulseaudio-module-lirc pulseaudio-module-lirc-dbg pulseaudio-module-x11 pulseaudio-module-zeroconf pulseaudio-module-zeroconf-dbg pulseaudio-utils oss-compat
    sudo cp -pf /etc/asound.conf /etc/asound.conf.ORIG 
    echo 'pcm.pulse {
        type pulse
    }
    
    ctl.pulse {
        type pulse
    }
    
    pcm.!default {
        type pulse
    }
    
    ctl.!default {
        type pulse
    }' | sudo tee /etc/asound.conf
    
    
    #Change default sound driver from alsa to pulseaudio
    #######################################################
    sudo cp -fvp /etc/libao.conf /etc/libao.conf.ORIG
    sudo sed -i "s,default_driver=alsa,default_driver=pulse,g" /etc/libao.conf 
    
    # daemon settings according to Pi-Musicbox ( https://github.com/woutervanwijk/Pi-MusicBox )
    sudo cp -fvp /etc/pulse/daemon.conf /etc/pulse/daemon.conf.ORIG
    
    echo "
    # ScarlettPi added this
    high-priority = yes
    nice-level = 5
    exit-idle-time = -1
    resample-method = src-sinc-medium-quality
    default-sample-format = s16le
    default-sample-rate = 48000
    default-sample-channels = 2" | sudo tee -a /etc/pulse/daemon.conf
    
    # Add pi user to the pulse access group
    #######################################################
    sudo adduser pi pulse-access
    sudo shutdown -r now

    mkdir cmusphinx
    cd cmusphinx
    wget sphinxbase-0.8 und pocketsphinx-0.8 (<a href="http://cmusphinx.sourceforge.net/wiki/download" target="_blank" rel="noopener noreferrer">CMUSphinx Download Seite</a>)
    tar -xvzf pocketsphinx-0.8.tar.gz
    tar -xvzf sphinxbase-0.8.tar.gz
    
    cd sphinxbase-0.8
    ./autogen.sh
    ./configure
    make
    sudo make install
    cd -
    
    cd pocketsphinx-0.8
    export LD_LIBRARY_PATH=/usr/local/lib
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    ./configure
    make
    sudo make install

Test

pocketsphinx_continuous

http://www.speech.cs.cmu.edu/tools/lmtool.html

    $ cat voice.txt
    ALFRED LIGHT ONE ON
    ALFRED TV ON
    ALFRED TV OFF
    ALFRED SLEEP
    JAMES HELLO
    ALFRED HELLO
    $ wget YOUR FILE
    $ tar -xvzf TAR1354.tar.gz
    1354.corpus
    1354.dic
    1354.lm
    1354.sent
    1354.sent.arpabo
    1354.token
    1354.vocab
    $ pocketsphinx_continuous -lm 1354.lm -dict 1354.dic  -silprob  0.1 -wip 1e-4 -bestpath 0
    READY....
    Listening...
    Stopped listening, please wait...
    000000000: ALFRED LIGHT ONE ON
    READY....

## pocketsphinx_continous zu alfred

    mkdir alfred
    cd alfred
    cp ./pocketsphinx-0.8/src/programs/continuous.c alfred.c
    gcc -g -O2 -Wall -I/usr/local/include/sphinxbase -I/usr/local/include/pocketsphinx -lsphinxad -lsphinxbase -lpocketsphinx alfred.c -o alfred
    
    ./alfred -lm ../1354.lm -dict ../1354.dic -silprob 0.1 -wip 1e-4 -bestpath 0
    
    static void
    sayfestival(const char* text)
    {
    	// No command processor
    	if (system(NULL) == 0)
    		return;
    	
    	printf("%sn", text);
    	
    	const char* festivalcmdstart = "echo '";
    	const char* festivalcmdend = "' | festival -b --tts";
    	char* command = malloc(strlen(festivalcmdstart) + strlen(text) + strlen(festivalcmdend) + 2);
    	if (command)
        {	
    		if (sprintf(command, "%s %s %s", festivalcmdstart, text, festivalcmdend) > 0)
            {
    			system(command);
    		}
    		free(command);
    	}
    }
    	
    static void
    fhemparse(const char* hyp)
    {	
    	if (!hyp)
    		return;
    
    	char word[256];
    	
    	sscanf(hyp, "%s", word);
    	if (strcmp(word, "ALFRED") != 0) {
    		printf("Not for alfred :(n");
    		return;
    	}
    	
    	if (strcmp(hyp, "ALFRED TV ON") == 0) {
    		sayfestival("Turning TV on!");
    	}
    }

    READY....
    Listening...
    Stopped listening, please wait...
    TEXT:000000000:HUGO HELLO
    Not for alfred :(
    READY....
    Listening...
    Stopped listening, please wait...
    TEXT:000000001:ALFRED TV ON
    Turning TV on!

Julius

http://julius.sourceforge.jp/en_index.php?q=index-en.html

http://www.raspiprojects.com/raspberry-pi-voice-recognition-julius.html

    sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
    cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
    export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
    cd julius4
    ./configure --with-mictype=alsa
    make
    sudo make install

    export ALSADEV="plughw:1,0"

    julius --help

http://bloc.eurion.net/archives/2008/writing-a-command-and-control-application-with-voice-recognition/ VOCA UND GRAMMAR FILES http://www.voxforge.org/home/dev/acousticmodels/linux/adapt/htkjulius/live-testing

    mkdfa.pl alfred
    alfred.grammar has 1 rules
    alfred.voca    has 4 categories and 11 words
    ---
    Now parsing grammar file
    Now modifying grammar to minimize states[-1]
    Now parsing vocabulary file
    Now making nondeterministic finite automaton[5/5]
    Now making deterministic finite automaton[5/5]
    Now making triplet list[5/5]
    4 categories, 5 nodes, 4 arcs
    -> minimized: 5 nodes, 4 arcs
    ---
    generated: alfred.dfa alfred.term alfred.dict

    julius -quiet -input mic -C julian.jconf 2>/dev/null | ./command.py
Raspberry Pi Dashboard mit Dashing

Dashing bietet ein Framework um Raspberry Pi Dashboards einfach zu erstellen. Wenige Handgriffe reichen zum Anzeigen des Dashboards im Kioskmodus. Dadurch lassen sich wichtige Daten im Büro oder zuhause in seiner gesamten Größe darstellen.

Smashing Dashing installieren

_Mit einem aktuellen Ruby kann mittels gem direkt aufgerufen werden um Dashing zu installieren._

$ sudo apt-get install ruby-dev
$ sudo apt-get install nodejs
$ sudo /usr/bin/gem install dashing
$ sudo /usr/bin/gem install bundler
$ dashing new sweet_dashboard_project
$ cd sweet_dashboard_project
$ bundle
$ dashing start

Das Dashboard ist nun erreichbar unter der Adresse localhost:3030.

UPDATE 20.09.2017: Dashing ist eingestellt und der Nachfolger heißt Smashing. Die Installation ist aber ähnlich wie folgt.

$ sudo apt-get install ruby-dev
$ sudo apt-get install nodejs
$ sudo gem install bundler
$ sudo gem install smashing
$ smashing new dashboard_project
$ cd dashboard_project
$ bundle
$ smashing start

Falls Fehler aufgrund einer zu kleinen Ruby Version auftreten gibt es hier ein Skript für die Installation von Ruby 2.4. Danach die folgenden Kommandos ausführen und wieder mit der Installation von oben weitermachen.

$ gem install rubygems-update
$ sudo update_rubygems
$ sudo gem install rack-test -v 0.7.0

Chromium und Mauszeiger verstecken

Durch unclutter kann der Mauszeiger versteckt werden. Chromium bietet einen einfachen Webbrowser mit Kioskmodus und X11VNC ist ein schlanker XServer. Ist der Raspberry Pi mit einer grafischen Oberfläche installiert kann auch der dort vorhandene XServer genutzt werden.

$ sudo apt-get install unclutter x11vnc chromium-browser

Erster Test

Jetzt ist es an der Zeit für den Test des Raspberry Pi Dashboards.

$ startx &
$ export DISPLAY=:0.0
$ chromium-browser --kiosk --ignore-certificate-errors --disable-sync
--disable-restore-session-state http://localhost:3030

Der Fehler „Failed to load NSS libraries“ wird durch den folgenden Aufruf behoben.

$ sudo ln -s /usr/lib/arm-linux-gnueabihf/nss/ /usr/lib/nss

Autostart

Damit das Raspberry Pi Dashboard immer beim Start erscheint ist eine Anpassung der Konfiguration notwendig (Referenz).

$ cd ~/.config
$ mkdir autostart
$ cd autostart

Im Anschluss wird der Autostart für Chromium angelegt.

$ vi chromium.desktop
[Desktop Entry]
Type=Application
Name=chromium
Exec=chromium --kiosk  localhost:3030
StartupNotify=false
Terminal=false
Hidden=false

Danach erfolgt der Autostart für X11VNC.

$ vi x11vnc.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Exec=x11vnc -forever -shared -usepw -display :0 -ultrafilexfer
StartupNotify=false
Terminal=false
Hidden=false

Powersave verhindern

Möglichkeit 1: Konfiguration

Eine Konfigurationsänderung verhindert das Abschalten des Monitors (Referenz).

$ sudo vi /etc/lightdm/lightdm.conf
xserver-command=X -s 0 –dpms

Möglichkeit 2: Bewegungserkennung

Mittels Bewegung lässt sich der Monitor aktivieren. (Bewegungserkennung einrichtenReferenz)

$ sudo chmod u+s /bin/chvt
motion.conf
# Den Monitor für 1 Minute aktiv schalten
gap 60
# Monitor bei Bewegung einschalten
on_event_start /opt/vc/bin/tvservice -p ; chvt 6; chvt 7
# Nach der gap Zeit wieder ausschalten
on_event_end /opt/vc/bin/tvservice -p; /opt/vc/bin/tvservice -o

# OPTIONAL: speichern von Bildern deaktivieren
ffmpeg_cap_new off
ffmpeg_cap_motion off
output_normal off
output_motion off

Weitere Widgets

Eine Liste von Widgets gibt es auf dem Smashing Wiki der Github Webseite. Hier ist eine Auswahl der Plugins die ich ausprobiert habe. Die Installation ist leider bei jedem Add-On individuell außer es sind GIST Datien, dann hilftsmashing install GIST_ID.

Bestimmte Plugins benötigen weitere Gems. Diese sind in die Gemfile Datei einzubinden!

Nicht funktionierende Widgets.

  • Daily Dilbert – Dilbert Comics (benötigt gem ‚chronic‘ ) – Verzögert den Start erheblich?!
  • RSS – Zeigt nur von wenigen Webseiten die RSS/Atom Feeds an.

Nicht getestet.

Raspberry Pi Bewegungserkennung

Neben der Sprachsteuerung lässt sich der Raspberry Pi auch für die Bewegungserkennung und Raumüberwachung nutzen. Mit dem „motion“ Paket lässt sich der Pi in ein Motion Detection Device verwandeln.

Motion

Die PS3 EyeToy Kamera besitzt neben dem Mikrofon auch eine brauchbare Kamera. Mitels lsusb kann die korrekte Erkennung der Kamera ermittelt werden.

$ lsusb
Bus 001 Device 005: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc. Sony Playstation Eye

Das motion Paket wird benötigt.

$ sudo apt-get install motion

Nach der Installation muss die Konfiguration angepasst werden. Die Datei motion.conf enthält die notwendingen Informationen.

$ sudo vi /etc/motion/motion.conf
daemon on
width 640
height 480

Damit ist der Hintergrunddienst aktiv und die Auflösung angepasst. Um die Kamera testen zu können, kann motion per Kommandozeile aufgerufen werden. Ein normales Starten, im Hintergrund, ist ohne den -n Parameter möglich.

$ sudo motion -n

Events

Die Events On_motion_detected, on_event_start und on_event_end können mit Skripten belegt werden. Bilder können beispielsweise auch mittels FTP hochgeladen werden (Referenz).

on_picture_save wput –B ftp://username:password@yourftpserver %f