PS3 Bluetooth Remote an XBMC wird auch nach dem Booten wieder erkannt (Raspbmc)

  • Hi,


    ich habe einige Anleitungen im Internet gefunden, damit die Remote unter XBMC funktioniert. Hier musste ich aber immer wieder nach dem Booten die Fernbedienung neu anlernen, was mir nicht wirklich gefallen hat. Nach ein wenig Recherche habe ich aber einige Einträge gefunden, die zusammen dann den reibungslosen Betrieb der Fernbedienung auch nach dem booten ermöglichten. Da ich einige Anfragen bekam, schreibe ich die Installation hier einmal zusammen:


    Bluetooth Stack installieren:


    Code
    sudo update-rc.d -f dbus defaults && sudo apt-get install bluez
    sudo apt-get install xbmc-eventclients-ps3


    Uinput Modul laden


    Code
    modprobe -i uinput


    Damit das Modul auch automatisch nach dem Booten wieder zur Verfügung steht kann man es unter Raspbmc in die Datei /etc/modules eintragen


    Code
    # /etc/modules: kernel modules to load at boot time.
    #
    # This file contains the names of kernel modules that should be loaded
    # at boot time, one per line. Lines beginning with "#" are ignored.
    # Parameters can be specified after the module name.
    
    
    uinput


    Nun die Fernbedienung suchen (Enter + Start gleichzeitig drücken und schnell weitermachen):


    Code
    hcitool scan


    Nun sollte die Remote inkl. MAC-Adresse angezeigt werden. Diese MAC-Adresse (bei mir 00:24:33:98:7D:0A) wird nun dem System bekannt gemacht:


    Zitat


    bluez-test-device create 00:24:33:98:7D:0A
    bluez-test-device trusted 00:24:33:98:7D:0A yes


    Ob die Fernbedienung erkannt wurde, kann man mittels

    Code
    cat /proc/bus/input/devices | grep emot


    anzeigen. Kommt hier eine Ausgabe, ist die Fernbedienung angelernt.


    Nun muss Bluteooth an uinput noch die Tasten weiterleiten, Dazu legt man in /etc/bluetooth eine input.conf ab.
    Wichtig dabei ist, das die MAC-Adresse angepasst wird!



    Nun hatte ich aber das Problem, das ich quasi vor jedem XBMC Start die Fernbedienung erst einmal benutzt haben musst, spricht ein Tastendruck erforderlich war. XBMC hat diese
    sonst nicht erkannt. Hier half mir ein Thread hier aus dem Portal PS3 Remote und /dev/input. Mein besonderer Dank geht hier an seahawk1986, der ein Python Skript erstellt hat, welches dem XBMC das Device vorgaukelt. Dieses benötigt allerdings noch einige Python Pakete die zu
    installieren sind:


    Code
    sudo apt-get install python-pyudev


    Leider wird noch ein Paket python-uinput benötigt für welches ich kein Debian Paket gefunden habe. Deshalb habe ich es von Hand installiert:


    Code
    cd /tmp
    git clone https://github.com/tuomasjjrasanen/python-uinput
    cd python-uinput
    python setup.py install --prefix=/usr/local


    Danach sollte das folgende Script in /usr/sbin/ps3remote.py abgelegt werden:


    Dieses Skript wird in /etc/rc.local eingetragen und das war es dann auch endlich:


    Wer es brauchen kann, viel Spass damit :)


    MfG


    Quacks


    Quellen:


    PS3 Remote an RaspBMC
    PS3 als input Device
    PS3 input.conf
    Installation uinput


    History:


    - Fehler im Python Skript korrigiert.

    "Backups are for whimps. Real men upload their stuff on the Internet
    and let the world mirror it".


    --Linus Torvalds

    Einmal editiert, zuletzt von Quacks ()

  • Hallo, dank des Howto und noch einiger nachinstallierter Pakete läuftb die FB soweit (raspbmc), nur die Sache mit dem


    -->Nun hatte ich aber das Problem, das ich quasi vor jedem XBMC Start die
    Fernbedienung erst einmal benutzt haben musst, spricht ein Tastendruck
    erforderlich war. XBMC hat diese


    sonst nicht erkannt. Hier half mir ein Thread hier aus dem Portal PS3 Remote und /dev/input.
    Mein besonderer Dank geht hier an seahawk1986, der ein Python Skript
    erstellt hat, welches dem XBMC das Device vorgaukelt. Dieses benötigt
    allerdings noch einige Python Pakete die zu


    installieren sind:


    läuft noch nicht, habe alles so gemacht, git installiert, gcc auch und libdev glaube ich, dann lief die Installation durch, aber wenn ich vor dem Start des xbmc keine Taste drücke, geht die FB später auch nicht.


    Wie kann ich vorgehen um den Fehler einzugrenzen?


    benutze soweit putty und winscp.
    Gruß


    TM

  • Hast du die Zeile 65 schon korrigiert und mal geschaut, ob das Skript selbst läuft? Das liefert mit Sicherheit einen Syntax-Fehler...

    Code
    >-------            self.paths[device['DEVNAME']].close()


    Die Funktion sollte eher so aussehen (siehe original-Post [gelöst] PS3 Remote und /dev/input)

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    Einmal editiert, zuletzt von seahawk1986 ()

  • habe den genannten Quellcode komplett rüberkopiert in die ps3remote.py und dann nach Neustart das gleiche, FB nicht erkannt, auf der Konsole siehe unten...




    pi@raspbmc:~$ nohup python2.7 /usr/sbin/ps3remote.py &
    [1] 1402
    pi@raspbmc:~$ nohup: ignoring input and appending output to `nohup.out'


    ist als eigentlicher Linux fast Noob nicht so einfach ;)


    soll ich den Inhalt welcher Dateien posten, was würde helfen?


    wird aber erst morgen Nachmittag, muss noch zur Arbeit jetzt.


    THX bis dahin.


    TM


    PS: häng mal die ps3remote.py ran


    #!/usr/bin/python2
    import sys
    import os
    import codecs
    import fcntl
    import gobject
    import socket
    import string
    import struct
    import datetime
    import pyudev
    import uinput
    from pyudev.glib import GUDevMonitorObserver



    class UdevEventWatchdog():
    '''handle input devices using udev'''
    def __init__(self):
    global gobject
    self.frontend_active = 0
    self.env = os.environ
    self.timer = None
    events = []
    for element in dir(uinput):
    if element.startswith("KEY_") or element.startswith("BTN_") or element.startswith("REL_"):
    events.append(eval("uinput.%s"%(element)))
    self.uinputdev = uinput.Device(events, "ps3-uinput")
    self.context = pyudev.Context()
    self.monitor = pyudev.Monitor.from_netlink(self.context)
    self.monitor.filter_by(subsystem='input')
    self.devices = {}
    self.paths = {}
    # struct for kernel input devices on 64-Bit linux systems
    self.inputEventFormat = 'llHHi'
    self.inputEventSize = 24
    # on 32-Bit systems try
    # self.inputEventFormat = 'iihhi'
    # self.inputEventSize = 16
    # (untested)
    self.get_event_devices()


    def get_event_devices(self):
    '''filter all connected input devices and watch an existing PS3 Remote device'''
    for device in self.context.list_devices(subsystem='input'):
    if device.sys_name.startswith('event') and device.parent['NAME'] == '"PS3 Remote Controller"':
    #print("found PS3")
    self.paths[device['DEVNAME']] = open(device['DEVNAME'],'rb')
    self.devices[device['DEVNAME']] = gobject.io_add_watch(self.paths[device['DEVNAME']], gobject.IO_IN, self.evthandler)
    fcntl.ioctl(self.paths[device['DEVNAME']].fileno(), 0x40044590, 1) #exclusive access to input device - so keypresses do not disturb other programs
    self.observer = GUDevMonitorObserver(self.monitor)
    self.observer.connect('device-event',self.udev_event)
    self.monitor.start()
    print("started udev monitoring of input devices")


    def udev_event(self,observer,action, device):
    '''callback function to add/remove input devices'''
    if action == "add" and 'DEVNAME' in device:
    if device.sys_name.startswith('event') and device.parent['NAME'] == '"PS3 Remote Controller"':
    self.paths[device['DEVNAME']] = open(device['DEVNAME'],'rb')
    if not device['DEVNAME'] in self.devices:
    self.devices[device['DEVNAME']] = gobject.io_add_watch(self.paths[device['DEVNAME']], gobject.IO_IN, self.evthandler)
    fcntl.ioctl(self.paths[device['DEVNAME']].fileno(), 0x40044590, 1) #exclusive access to input device - so keypresses do not disturb other programs
    elif action == "remove" and 'DEVNAME' in device:
    try:
    self.paths[device['DEVNAME']].close()
    except:
    pass
    try:
    gobject.source_remove(self.devices[device['DEVNAME']])
    syslog.syslog("removed %s"%device['DEVNAME'])
    del self.devices[device['DEVNAME']]
    except:
    pass #device already removed from watchlist


    def evthandler(self,path, *args):
    '''callback function to handle keys sent by inputdevices'''
    try:
    event = path.read(self.inputEventSize)
    except:
    #print('can not read from %s'%(path))
    return False
    (time1, time2, typeev, code, value) = struct.unpack(self.inputEventFormat, event)
    if typeev == 0 and code == 0 and value == 0: # sync event
    pass
    else:
    self.uinputdev.emit((typeev,code), value)
    return True


    if __name__ == '__main__':
    devinput = UdevEventWatchdog()
    gobject.MainLoop().run()

  • Naja wild Code Mixen sollst du ja nicht ;)
    Der Raspberry Pi hat einen 32-Bit-Prozessor, daher musst du das Struct für das inputEventFormat schon so definiert lassen, wie es Quacks in der geposteten Datei getan hat...


    Kommentier den Eintrag in der /etc/rc.local mal zum Testen aus und mach einen Neustart:


    Dann als root anmelden und das Skript so aufrufen, dass es nicht in den Hintergrund wechselt:

    Code
    python2.7 /usr/sbin/ps3remote.py


    Dann solltest du z.B. sehen, dass er eine Zeile weiter springt wenn du Enter auf der Fernbedienung drückst.


    Wenn das alles klappt, den Start wieder in der /etc/rc.local erlauben und einen Neustart machen.


    Ich habe RaspXBMC noch nie genutzt, aber ich vermute man könnte das Debian-like noch etwas schöner in einem SysVinit Job verankern, damit es zuverlässig vor XBMC gestartet wird.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    2 Mal editiert, zuletzt von seahawk1986 ()

  • das hätte sogar ich als linux noob sehen können, ob 32 oder 64 bit....


    soweit gemacht, das kommt bei raus:


    root@raspbmc:~# python2.7 /usr/sbin/ps3remote.py
    File "/usr/sbin/ps3remote.py", line 40
    self.get_event_devices()
    ^
    IndentationError: unindent does not match any outer indentation level




    ??need help :(

  • Da fehlt ein weiteres Leerzeichen am Anfang der Zeile (hab ich gestern beim Editieren im Browser im Post von Quack übersehen) - ich hab meinen Post oben editiert.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • so nun scheint es besser zu sein...


    root@raspbmc:~# python2.7 /usr/sbin/ps3remote.py
    started udev monitoring of input devices



    ist das ok so , weil beim ENTER drücken auf der FB passiert nix, oder muss ich die beim Start vor xbmc durch Tastendruck "aktivieren"?


    Nachtrag: wenn ich das script ausführe, wenn die FB durch vor dem XBMC starten Taste drücken bereits aktiv ist, bekomme ich folgende Meldungen:



    root@raspbmc:~# python2.7 /usr/sbin/ps3remote.py
    Traceback (most recent call last):
    File "/usr/sbin/ps3remote.py", line 89, in <module>
    devinput = UdevEventWatchdog()
    File "/usr/sbin/ps3remote.py", line 40, in __init__
    self.get_event_devices()
    File "/usr/sbin/ps3remote.py", line 49, in get_event_devices
    fcntl.ioctl(self.paths[device['DEVNAME']].fileno(), 0x40044590, 1) #exclusive access to input device - so keypresses do not disturb other >
    IOError: [Errno 16] Device or resource busy

  • Da fehlt ein weiteres Leerzeichen am Anfang der Zeile (hab ich gestern beim Editieren im Browser im Post von Quack übersehen) - ich hab meinen Post oben editiert.


    Hi,


    ich habs oben korrigiert (ich hoffe richtig).


    Gruss,


    Quacks

    "Backups are for whimps. Real men upload their stuff on the Internet
    and let the world mirror it".


    --Linus Torvalds

  • yeah, super jetzt läuft es, hab es in der rc.local wieder einkommentiert, und Neustart, dann ging es.


    THX für den hervorragenden Support dafür.


    Zusammenfassend:


    so sieht die ps3remote.py nun aus


    #!/usr/bin/python2.7
    import sys
    import os
    import codecs
    import fcntl
    import gobject
    import socket
    import string
    import struct
    import datetime
    import pyudev
    import uinput
    from pyudev.glib import GUDevMonitorObserver



    class UdevEventWatchdog():
    '''handle input devices using udev'''
    def __init__(self):
    global gobject
    self.frontend_active = 0
    self.env = os.environ
    self.timer = None
    events = []
    for element in dir(uinput):
    if element.startswith("KEY_") or element.startswith("BTN_") or element.startswith("REL_"):
    events.append(eval("uinput.%s"%(element)))
    self.uinputdev = uinput.Device(events, "ps3")
    self.context = pyudev.Context()
    self.monitor = pyudev.Monitor.from_netlink(self.context)
    self.monitor.filter_by(subsystem='input')
    self.devices = {}
    self.paths = {}
    # struct for kernel input devices on 64-Bit linux systems
    #self.inputEventFormat = 'llHHi'
    #self.inputEventSize = 24
    # on 32-Bit systems try
    self.inputEventFormat = 'iihhi'
    self.inputEventSize = 16
    # (untested)
    self.get_event_devices()


    def get_event_devices(self):
    '''filter all connected input devices and watch an existing PS3 Remote device'''
    for device in self.context.list_devices(subsystem='input'):
    if device.sys_name.startswith('event') and device.parent['NAME'] == '"PS3 Remote Controller"':
    #print("found PS3")
    self.paths[device['DEVNAME']] = open(device['DEVNAME'],'rb')
    self.devices[device['DEVNAME']] = gobject.io_add_watch(self.paths[device['DEVNAME']], gobject.IO_IN, self.evthandler)
    fcntl.ioctl(self.paths[device['DEVNAME']].fileno(), 0x40044590, 1) #exclusive access to input device - so keypresses do not disturb other >
    self.observer = GUDevMonitorObserver(self.monitor)
    self.observer.connect('device-event',self.udev_event)
    self.monitor.start()
    print("started udev monitoring of input devices")


    def udev_event(self,observer,action, device):
    '''callback function to add/remove input devices'''
    if action == "add" and 'DEVNAME' in device:
    if device.sys_name.startswith('event') and device.parent['NAME'] == '"PS3 Remote Controller"':
    self.paths[device['DEVNAME']] = open(device['DEVNAME'],'rb')
    if not device['DEVNAME'] in self.devices:
    self.devices[device['DEVNAME']] = gobject.io_add_watch(self.paths[device['DEVNAME']], gobject.IO_IN, self.evthandler)
    fcntl.ioctl(self.paths[device['DEVNAME']].fileno(), 0x40044590, 1) #exclusive access to input device - so keypresses do not disturb ot>
    elif action == "remove" and 'DEVNAME' in device:
    try:
    self.paths[device['DEVNAME']].close()
    except:
    pass
    try:
    gobject.source_remove(self.devices[device['DEVNAME']])
    syslog.syslog("removed %s"%device['DEVNAME'])
    del self.devices[device['DEVNAME']]
    except:
    pass #device already removed from watchlist
    def evthandler(self,path, *args):
    '''callback function to handle keys sent by inputdevices'''
    try:
    event = path.read(self.inputEventSize)
    except:
    #print('can not read from %s'%(path))
    return False
    (time1, time2, typeev, code, value) = struct.unpack(self.inputEventFormat, event)
    if typeev == 0 and code == 0 and value == 0: # sync event
    pass
    else:
    self.uinputdev.emit((typeev,code), value)
    return True


    if __name__ == '__main__':
    devinput = UdevEventWatchdog()
    gobject.MainLoop().run()




    --> ansonsten lt. Anleitung von Quacks wozu noch anzumerken wäre, das ich noch ein paar Pakete installieren musste (oder habe):


    sudo apt-get update
    sudo apt-get install git


    sudo apt-get update && sudo apt-get -y dist-upgrade
    sudo apt-get install gcc


    [font='&quot']sudo apt-get install libdbus-1-dev libudev-dev libssl-dev[/font]


    hoffe diese Anleitung hilft noch anderen auf die Sprünge, von hier erstmal DANKE und schönes WE an alle Forums User.



    TM

  • so sieht die ps3remote.py nun aus


    Das Dumme ist nur, dass bei Python die Leerzeichen eine Funktion haben - wenn du das ohne Codeblock postest nutzt das wenig ;)

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!