Remotecontrol
Das Modul "remotecontrol" stellt einen weblink bereit, der eine grafische Abbildung einer physischen Fernbedienung anzeigt, siehe Beispiel rechts. Dieser weblink kann in fhem-Frontends wie FHEMWEB oder FLOORPLAN verwendet werden.
Die Tastenbelegung ("Layout") ist frei wählbar. Standard-Layouts sind für unterschiedliche Geräte verfügbar. Das remotecontrol-device wird per notify an das fhem-device gekoppelt, das nach einem Tastendruck den Befehl an das physische Gerät sendet.
Einrichtung
Define
Das define erfolgt nach der üblichen fhem-Syntax:
#Syntax define <name> remotecontrol #Beispiel define rc1 remotecontrol
Damit ist eine leere Fernbedienung (zunächst noch ohne Tasten) angelegt.
Zu Testzwecken kann man sein device zunächst einem Testraum zuordnen, zB
attr rc1 room TestRemote
Weblink erzeugen und einbinden
Der weblink dient zum Anzeigen der grafischen Fernbedienung.
Beim Erzeugen des Weblinks kann man einen Namen angeben. Wird kein Name angegeben, wird der default-Name "weblink_<name>" verwendet.
set rc1 makeweblink # erzeugt Weblink mit dem Namen weblink_rc1 set rc1 makeweblink w_rc1 # erzeugt Weblink mit dem Namen w_rc1
Zu Testzwecken kann man auch den Weblink einem Testraum zuordnen, zB
attr weblink_rc1 room TestRemote attr weblink_rc1 group rc
Durch die Zuordnung zu einer Gruppe wird der Name des weblinks ebenfals angezeigt, was zum Testen sehr praktisch ist.
Während der Einrichtungsphase ist zu empfehlen, ineinem Fenster den Detailscreen des remotecontrol-device anzuzeigen, während man in einem zweiten Fenster den weblink anzeigt. So kann man durch einfaches refresh die Auswirkungen der Konfigurationsänderungen sofort sehen.
Hinweis: Der erzeugte weblink wird erst durch den Befehl save nach fhem.cfg geschrieben. Möchten Sie den Befehl save nicht verwenden, tragen Sie die Konfiguration manuell in fhem.cfg ein. Ein Beispiel befindet sich am Ende dieses Wiki-Artikels.
Standard-Tastaturlayouts nutzen
Jedes fhem-Modul kann Tastaturlayouts für das Modul remotecontrol bereitstellen.
Die Liste der vorhandenen Tastaturlayouts wird angezeigt mit
#Syntax get <name> layout #Beispiel get rc1 layout
Die Liste der vordefinierten Tastaturlayouts wird nun angezeigt.
Ein Tastatur-Layout kann zugeordnet (geladen) werden mit
#Syntax set <name> layout <layoutname> #Beispiel set rc1 layout itunes
Hinweis: Das Laden von Standard-Layouts ändert die Werte der Attribute row00 - row19. Diese werden erst durch den Befehl save nach fhem.cfg geschrieben. Möchten Sie den Befehl save nicht verwenden, tragen Sie die Konfiguration manuell in fhem.cfg ein. Ein Beispiel befindet sich am Ende dieses Wiki-Artikels.
Hinweis: Ein Standard-Tastaturlayout wird erst nach dem Laden eines Moduls bereitgestellt. Wenn Sie also erst zu einem späteren Zeitpunkt ein weiteres Modul (z.B. VIERA für Panasonic-TV) in Ihre Konfiguration aufnehmen, wird ein ggf. vorhandenes remotecontrol-Standard-Layout erst dann angezeigt. Man sollte also auch später ab und zu mit dem o.g. Befehl prüfen, ob für weitere Geräte Standardlayouts vorhanden/hinzugekommen sind.
Im Modul remotecontrol selbst sind die Beispiel-Layouts "itunes" und "samsung" vorhanden.
Eigene Tastaturlayouts einrichten
Die Tastatur der Fernbedienung ist aufgeteilt in bis zu 20 Zeilen. Je Zeile können beliebig viele Tasten definiert werden.
Jede Taste auf der Fernbedienung wird definiert durch
- den Befehl, der nach einem Tastendruck ausgeführt werden soll
- das icon, das als Taste erscheinen soll
Man muss also je Taste diese beiden Werte festlegen.
Mehrere Tasten in einer Zeile werden durch Kommata getrennt.
Vorgehensweise:
Icon-Pfad festlegen
Einmalig ermitteln, in welchem Ordner die icons liegen, die für die Tastatur verwendet werden sollen. Die Standard-icons liegen im Ordner www/images/default/remotecontrol. Um dies nicht bei jeder Taste angeben zu müssen, setzt man
attr <name> rc_iconpath icons/remotecontrol
Icon-Prefix festlegen
Ggf. einmalig einen prefix für Dateinamen festlegen. Die Standard-icons folgen der Namenskonvention black_btn_<Beschreibung>. Um den Teil vor der Beschreibung nicht bei jeder Taste mit angeben zu müssen, setzt man
attr <name> rc_iconprefix black_btn_
Tasten definieren
- ermitteln, welcher Befehl an das ausführende fhem-Gerät gesendet werden soll. Als Beispiel soll der Befehl "play" dienen. Groß/Kleinschreibung ist zu beachten.
- ermitteln, welches icon zur Darstellung der Taste verwendet werden soll. Unter den Standardicons gibt es ein icon mit dem Dateinamen black_btn_PLAY.png
. Der vordere Teil ist bereits als prefix hinterlegt, die Datei-Endung muss nicht angegeben werden. Als icon für die Tastaturdefinition kann man also einfach PLAY angeben. Groß/Kleinschreibung ist zu beachten.
Nachdem nun der Befehl (play) und der icon-Name (PLAY) ermittelt sind, können diese - durch einen Doppelpunkt getrennt- als Definition einer Taste hinterlegt werden.
#Syntax: attr <name> rowXX <command>:<icon><br> #Beispiel: attr rc1 row00 play:PLAY # als Befehl wird play gesendet, als icon wird PLAY verwendet
Sollten weitere Tasten definiert werden, hängt man sie durch Komma getrennt an.
#Syntax: attr <name> rowXX <command>:<icon>[,<command>:<icon>][,....] #Beipiel: attr rc1 row01 play:PLAY,anhalten:STOP
Sollen auf der Tastatur Leer-Räume abgebildet werden, gibt man als Tastendefinition :blank an (also kein Befehl, icon blank). Das icon mit dem Namen 'blank' ist vorhanden, hat ein Drittel der regulären Tastenhöhe und ist 100% transparent.
attr rc1 row02 play:PLAY,:blank,anhalten:STOP
Eine "Trennzeile" lässt sich einfügen durch
attr rc1 row03 :blank,:blank,:blank
Hinweis: Manche Browser stellen in einer Zeile, in der die letzte Tste gar nicht definiert ist, den Rahmen nicht dar. Füllen Sie in diesem Fall die Tastaturzeile mit :blank soweit auf, dass sie dieselbe Anzahl Tasten aufweist wie die längste Tastaturzeile auf Ihrer Fernbedienung.
Für den Fall, dass der Befehl und der icon-Name identisch sind (incl. Groß/Kleinschreibung) besteht zur Vereinfachung die Möglichkeit, nur das Kommando anzugeben. Dieses wird dann auch als icon-Name verwendet.
#Syntax: attr <name> rowXX [<command>:<icon>|<command_icon>][,[<command>:<icon>|<command_icon>]]... #Beispiele: attr rc1 row04 PLAY # als Befehl wird PLAY gesendet, als icon wird PLAY verwendet attr rc1 row05 PLAY,:blank,anhalten:STOP # auch Mischformen sind möglich
Neue Icons für Tasten erstellen und verwenden
Im Ordner www/images/default/remotecontrol liegt das Template für eitere Tasten. Die Datei heisst _black_btn_template.pdn und kann z.B. mit paint.net bearbeitet werden.
Neue Dateien bitte als png erstellen und analog der vorhandenen Namenskonvention erstellen: Prefix black_btn_ , Beschreibung in Grossbuchstaben.
Zur Erweiterung des icon-Vorrats neue Dateien bitte zum Einchecken an den Modulautor mailen.
Hinweis: Neue Dateien werden in fhem erst angezeigt, nachdme das interne icon-Listing aktualisiert wurde. Dies geschieht nach jedem fhem-(re)start oder mit dem Befehl
set WEB rereadicons
Kopplung an das ausführende Gerät
Bei jedem Tastendruck wird der Befehl (command), der der Taste zugeordnet ist, als STATE des remotecontrol-device angezeigt.
Ausserdem wird ein entsprechendes System-Event erzeugt. Dieses kann mit notify geprüft und an das ausführende Gerät weitergegeben werden.
Als Beispiel soll wie oben gezeigt eine Fernbedienung mit dem Namen rc1 bereits erstellt worden sein. Tastendrücke sollen zur Ausführung an das bereits vorhandene fhem-device myTV weitergegeben werden.
Das entsprechende notify kann "manuell" oder per set-Befehl erzeugt werden:
#Syntax: set <name> makenotify <executingDevice> #Beispiel: set rc1 makenotify myTV #erzeugt: define notify_rc1 notify rc1 set myTV $EVENT
Bei jedem Tastendruck löst die Fernbedienung rc1 ein event aus. Darauf reagiert das notify und sendet den entsprechenden set-Befehl an das Gerät myTV zur Ausführung.
Hinweis: Der Befehl makenotify erzeugt ein neues notify-device. Dieses wird erst durch den Befehl save nach fhem.cfg geschrieben. Möchten Sie den Befehl save nicht verwenden, tragen Sie das notify manuell in fhem.cfg ein. Ein weiteres Beispiel befindet sich am Ende dieses Wiki-Artikels.
Es können auch eigene scripts (z.B. in 99_myUtils.pm) aufgerufen werden. Wenn es z.B. dort eine Routine MeineRoutine($) gibt, kann diese mit der Fernbedieung gesteuert werden durch
define n_rc1 notify rc1 {MeineRoutine("$EVENT")}
Troubleshooting
Eine Taste wird nicht angezeigt
- Groß/Kleinschreibung icon-Namens prüfen
- Nach dem Anlegen neuer icons muss ausgeführt werden
set WEB rereadicons
- Mit dem Befehl
get <name> htmlcode
den html-Code der grafischen Fernbedienung anzeigen. Darin suchen nach "<img src" und dann Link und Dateiname prüfen.
Soll: <img src="/fhem/icons/remotecontrol/black_btn_PLAY">
Der rechte Rahmen wird mit Lücken dargestellt
Manche Browser stellen in einer Zeile, in der die letzte Tste gar nicht definiert ist, den Rahmen nicht dar. Füllen Sie in diesem Fall die Tastaturzeile mit :blank soweit auf, dass sie dieselbe Anzahl Tasten aufweist wie die längste Tastaturzeile auf Ihrer Fernbedienung.
Für Entwickler
Entwickler können aus ihren Modulen heraus Tastatur-Standardlayouts hinterlegen. Auch eine eigene Routine für makenotify ist möglich.
Neue Standard-Layouts hinterlegen
Standard-Layouts werden im eigenen Modul in Arrays abgelegt. Die Umwandung von arrays in rowXX-Attribute sowie das rendern zu html übernimmt das Modul 95_remotecontrol.
Vorgehensweise im eigenen Modul:
- Eine Routine hinterlegen, die das array mit dem Standard-Tastaturlayout zurückgibt. Als Vorlage dient aus dem Code von 95_remotecontrol.pm eine der Routinen RC_layout_samsung() oder RC_layout_itunes() .
- Die Routine in der Forward-declaration des eigenen Moduls hinterlegen. Als Vorlage dient ggf. ebenfalls das Modul 95_remotecontrol.pm (siehe "Forward declaration").
- Im eigenen Modul in der initialize-Routine (nicht erst in der define-Routine!) einen Eintrag für $data{RC_layout}{<layoutname>} vornehmen. Wert ist der Name der im Schritt 1 hnterlegten eigenen Layout-Array-Routine.
- Beispiel: Das Layout soll für den user MeinLayout heissen, die eigene Array-Routine heisst Mein_Modul_Layout() . Dafür ist in der eigenen initialize-Routine zu hinterlegen:
$data{RC_layout}{MeinLayout} = "Mein_Modul_Layout";
Als Vorlage kann wiederum das Modul 95_remotecontrol dienen, siehe dort am Ende der initialize-Routine.
- Ich bin nicht sicher, ob die initialize-Routine bei einem reload ausgeführt wird. Ggf. ist ein shutdown reastart erforderlich, um den $data-Eintrag zu platzieren.
- In einer definierten remotecontrol den Befehl
get <name> layout
absetzen. Das eigene Layout sollte nun in der Liste erscheinen.
- Das eigene Layout kann dann mit
set <name> layout <MeinLayout>
geladen werden.
Eigene makenotify-Routine hinterlegen
Beim Aufruf von set <device> makenotify wird ein notify erzeugt der Form
define <name> notify <rc-name> set <ausfuehrendesGeraet> $EVENT
Das sollte in 90% der Fälle passen.
Wenn für das eigene Modul jedoch ein abweichendes Kommando erforderlich ist, z.B.
set <ausfuehrendesGeraet> command <Befehl>
so passt das standardmäßig durch makenotify erzeugt notify nicht. In diesem Fall kann das notify durch eine eigene Routine angelegt werden.
Dazu wird im eigenen Modul eine Routine zur Erzeugung des notify hinterlegt. Der Name der Routine wird wiederum im $data-hash hinterlegt mit:
$data{RC_makenotify}{<TYPE>} = "Mein_Modul_Makenotify"; #Beispiel: $data{RC_makenotify}{VIERA} = "VIERA_makenotify";
Beim Aufruf von
define <rc> makenotify <layoutname> <ausfuehrendesGeraet>
wird nun der TYPE von <ausfuehrendesGeraet> ermittelt und gesucht, ob es einen passenden $data-Eintrag gibt. Ist dieser vorhanden, wird die dort angegebene Routine aufgerufen.
Als Beispiel kann das Modul VIERA dienen.
Beispiel-Layouts mit screenshots
iTunes
rc_iconpath icons/remotecontrol rc_iconprefix black_btn_ row00 play:PLAY,pause:PAUSE,prev:REWIND,next:FF,louder:VOLUP,quieter:VOLDOWN
Samsung
rc_iconpath icons/remotecontrol rc_iconprefix black_btn_ row00 POWEROFF,TV,HDMI row01 :blank,:blank,:blank row02 1,2,3 row03 4,5,6 row04 7,8,9 row05 :blank,0,PRECH row06 :blank,:blank,:blank row07 VOLUP,MUTE,CHUP row08 VOLDOWN,CH_LIST,CHDOWN row09 MENU,:blank,GUIDE row10 :blank,:blank,:blank row11 TOOLS,UP,INFO row12 LEFT,ENTER,RIGHT row13 RETURN,DOWN,EXIT