Controlling Raspberry PI with TV Remote, using HDMI CEC

Hello everyone.

Description:
I wrote a script that connects to HDMI CEC ( cec-client needed ) and listens for TV Remote key presses. Based on the keys pressed / released (or auto-released; holding down certain keys for too long makes them auto-release) different actions are executed. Some examples:

  • write letters and numbers using 0-9 keys (simulating 3x4 keypad phones - key "2" switches between a-b-c-2, key 9 switches between w-x-y-z-9) ( xdotool needed )
  • move mouse cursor using up/down/left/right (the longer you hold the key down, the faster it goes) and click (enter = left click; channels list = right click) ( xdotool needed )
  • opening web sites in chomium (red key for YouTube, green for Google, blue for incognito window)

If you want to use firefox instead of chromium, replace "chromium" with "firefox" in the script below.
Alternatively, you can just install chromium:

sudo apt-get install chromium-browser

See all the available keys below:

These are the keys supported by my TV Remote. You can modify the script for your TV Remote, see Modification below.

Installation:
First you need to install cec-client and xdotool; using terminal:

sudo apt-get install cec-client xdotool

Test if you can receive TV Remote button presses with cec-client; using terminal:

cec-client

You should see some diagnostic messages. Press numeric keys (as they are most likely to be supported) on your TV Remote. Watch out for new lines, especially of this form:

something something **key pressed: 8** something something

If you see this kind of messages, then this should work for you.
If not, make sure you've got CEC enabled on your TV (see this WIKI for more info).
For my TV, pressing the Source button a couple of times helped (so it kind-of flips trough all the sources and circles back to the Raspberry Pi, detects CEC and connects to it).

So, on to the script / installation:
Create the file cecremote.sh and mark it as executable; using terminal:

touch cecremote.sh
chmod +x cecremote.sh

Then open it; using terminal:

nano cecremote.sh

Copy - paste this in the file:

#!/bin/bash
function keychar {
    parin1=$1 #first param; abc1
    parin2=$2 #second param; 0=a, 1=b, 2=c, 3=1, 4=a, ...
    parin2=$((parin2)) #convert to numeric
    parin1len=${#parin1} #length of parin1
    parin2pos=$((parin2 % parin1len)) #position mod
    char=${parin1:parin2pos:1} #char key to simulate
    if [ "$parin2" -gt 0 ]; then #if same key pressed multiple times, delete previous char; write a, delete a write b, delete b write c, ...
        xdotool key "BackSpace"
    fi
    #special cases for xdotool ( X Keysyms )
    if [ "$char" = " " ]; then char="space"; fi
    if [ "$char" = "." ]; then char="period"; fi
    if [ "$char" = "-" ]; then char="minus"; fi
    xdotool key $char
}
datlastkey=$(date +%s%N)
strlastkey=""
intkeychar=0
intmsbetweenkeys=2000 #two presses of a key sooner that this makes it delete previous key and write the next one (a->b->c->1->a->...)
intmousestartspeed=10 #mouse starts moving at this speed (pixels per key press)
intmouseacc=10 #added to the mouse speed for each key press (while holding down key, more key presses are sent from the remote)
intmousespeed=10

while read oneline
do
    keyline=$(echo $oneline | grep " key ")
    #echo $keyline --- debugAllLines
    if [ -n "$keyline" ]; then
        datnow=$(date +%s%N)
        datdiff=$((($datnow - $datlastkey) / 1000000)) #bla bla key pressed: previous channel (123)
        strkey=$(grep -oP '(?<=sed: ).*?(?= \()' <<< "$keyline") #bla bla key pres-->sed: >>previous channel<< (<--123)
        strstat=$(grep -oP '(?<=key ).*?(?=:)' <<< "$keyline") #bla bla -->key >>pressed<<:<-- previous channel (123)
        strpressed=$(echo $strstat | grep "pressed")
        strreleased=$(echo $strstat | grep "released")
        if [ -n "$strpressed" ]; then
            #echo $keyline --- debug
            if [ "$strkey" = "$strlastkey" ] && [ "$datdiff" -lt "$intmsbetweenkeys" ]; then
                intkeychar=$((intkeychar + 1)) #same key pressed for a different char
            else
                intkeychar=0 #different key / too far apart
            fi
            datlastkey=$datnow
            strlastkey=$strkey
            case "$strkey" in
                "1")
                    xdotool key "BackSpace"
                    ;;
                "2")
                    keychar "abc2" intkeychar
                    ;;
                "3")
                    keychar "def3" intkeychar
                    ;;
                "4")
                    keychar "ghi4" intkeychar
                    ;;
                "5")
                    keychar "jkl5" intkeychar
                    ;;
                "6")
                    keychar "mno6" intkeychar
                    ;;
                "7")
                    keychar "pqrs7" intkeychar
                    ;;
                "8")
                    keychar "tuv8" intkeychar
                    ;;
                "9")
                    keychar "wxyz9" intkeychar
                    ;;
                "0")
                    keychar " 0.-" intkeychar
                    ;;
                "previous channel")
                    xdotool key "Return" #Enter
                    ;;
                "channel up")
                    xdotool click 4 #mouse scroll up
                    ;;
                "channel down")
                    xdotool click 5 #mouse scroll down
                    ;;
                "channels list")
                    xdotool click 3 #right mouse button click"
                    ;;
                "up")
                    intpixels=$((-1 * intmousespeed))
                    xdotool mousemove_relative -- 0 $intpixels #move mouse up
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    ;;
                "down")
                    intpixels=$(( 1 * intmousespeed))
                    xdotool mousemove_relative -- 0 $intpixels #move mouse down
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    ;;
                "left")
                    intpixels=$((-1 * intmousespeed))
                    xdotool mousemove_relative -- $intpixels 0 #move mouse left
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    ;;
                "right")
                    intpixels=$(( 1 * intmousespeed))
                    xdotool mousemove_relative -- $intpixels 0 #move mouse right
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    ;;
                "select")
                    xdotool click 1 #left mouse button click
                    ;;
                "return")
                    xdotool key "Alt_L+Left" #WWW-Back
                    ;;
                "exit")
                    echo Key Pressed: EXIT
                    ;;
                "F2")
                    chromium-browser "https://www.youtube.com" &
                    ;;
                "F3")
                    chromium-browser "https://www.google.com" &
                    ;;
                "F4")
                    echo Key Pressed: YELLOW C
                    ;;
                "F1")
                    chromium-browser --incognito "https://www.google.com" &
                    ;;
                "rewind")
                    echo Key Pressed: REWIND
                    ;;
                "pause")
                    echo Key Pressed: PAUSE
                    ;;
                "Fast forward")
                    echo Key Pressed: FAST FORWARD
                    ;;
                "play")
                    echo Key Pressed: PLAY
                    ;;
                "stop")
                    ## with my remote I only got "STOP" as key released (auto-released), not as key pressed; see below
                    echo Key Pressed: STOP
                    ;;
                *)
                    echo Unrecognized Key Pressed: $strkey ; CEC Line: $keyline
                    ;;
                    
            esac
        fi
        if [ -n "$strreleased" ]; then
            #echo $keyline --- debug
            case "$strkey" in
                "stop")
                    echo Key Released: STOP
                    ;;
                "up")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "down")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "left")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "right")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
            esac
        fi
    fi
done

Finally, save it; using nano in terminal:
press "Ctrl+X" to close the file, then "Y" to confirm saving, then "Enter" to save the file under the right file name

Try executing it, using terminal:

cec-client | ./cecremote.sh

At this point it should be working.
Point the TV Remote at the TV, press up/down/left/right and check if the mouse pointer is moving.
Press 9 44 2 8 7777 0 88 7 and it should write "whats up".

The script doesn't output anything, except when it encounters a button press that it doesn't recognize, or it doesn't have a function set up for that button yet (play button being one of them).
If you want it to output all the messages it receives, find the line and uncomment it by deleting the # : #echo $keyline --- debugAllLines

So, if everything works, exit the script in terminal: Press Ctrl+C

Run at startup:
If you want to start this script every time the Raspberry starts, create a new file called cecremotestart.sh and mark it as executable; using terminal:

touch cecremotestart.sh
chmod +x cecremotestart.sh

Then open it; using terminal:

nano cecremotestart.sh

Copy - paste this in the file:

#!/bin/bash
cec-client | /home/raspberry/cecremote.sh #<-- change this according to your username / path to the script

Finally, save it; using nano in terminal:
press "Ctrl+X" to close the file, then "Y" to confirm saving, then "Enter" to save the file under the right file name

Then add this in the Startup Programs (Menu - System - Control Center - Startup Programs; Add; Give it a name, and enter the path (or press Browse) of the script in the filesystem).

Restart, try, report :slightly_smiling:

Modification:
If you want, you can edit the script to change or add the commands executed on certain button presses.
You can detect the additional buttons that CEC on your TV supports. Kill the running cec-client, run the cec-client in the terminal, and watch for the output while you're pressing all the keys on your TV Remote; using terminal:

killall cec-client
cec-client
Ctrl+C when you're ready to stop

Edit the script, then execute the modified script by manually executing cecremotestart.sh; using terminal:

./cecremotescript.sh
Ctrl+C to stop

When you're satisfied, just restart your Raspberry PI.

That's it from me - a simple and crude way to control your Raspberry PI with the TV Remote, for when you don't have the keyboard/mouse connected and VNC-ing is too much of a bother.

Try it and report :slightly_smiling:

4 Likes

You should submit this to https://github.com/raspberrypi/linux/pulls it should be always with a raspberry

Look at this one

#!/bin/bash
function keychar {
    parin1=$1 #first param; abc1
    parin2=$2 #second param; 0=a, 1=b, 2=c, 3=1, 4=a, ...
    parin2=$((parin2)) #convert to numeric
    parin1len=${#parin1} #length of parin1
    parin2pos=$((parin2 % parin1len)) #position mod
    char=${parin1:parin2pos:1} #char key to simulate
    if [ "$parin2" -gt 0 ]; then #if same key pressed multiple times, delete previous char; write a, delete a write b, delete b write c, ...
        xdotool key "BackSpace"
    fi
    #special cases for xdotool ( X Keysyms )
    if [ "$char" = " " ]; then char="space"; fi
    if [ "$char" = "." ]; then char="period"; fi
    if [ "$char" = "-" ]; then char="minus"; fi
    xdotool key $char
}
datlastkey=$(date +%s%N)
strlastkey=""
intkeychar=0
intmsbetweenkeys=500 #two presses of a key sooner that this makes it delete previous key and write the next one (a->b->c->1->a->...)
intmousestartspeed=15 #mouse starts moving at this speed (pixels per key press)
intmouseacc=0 #added to the mouse speed for each key press (while holding down key, more key presses are sent from the remote)
intmousespeed=15
switch=0
browser=/etc/alternatives/x-www-browser
test -e /usr/bin/firefox && browser=firefox
test -e /usr/bin/chromium-browser && browser=chromium-browser


while read oneline
do
    keyline=$(echo $oneline | grep " key ")
    #echo $keyline --- debugAllLines
    if [ -n "$keyline" ]; then
        datnow=$(date +%s%N)
        datdiff=$((($datnow - $datlastkey) / 1000000)) #bla bla key pressed: previous channel (123)
        strkey=$(grep -oP '(?<=sed: ).*?(?= \()' <<< "$keyline") #bla bla key pres-->sed: >>previous channel<< (<--123)
        strstat=$(grep -oP '(?<=key ).*?(?=:)' <<< "$keyline") #bla bla -->key >>pressed<<:<-- previous channel (123)
        strpressed=$(echo $strstat | grep "pressed")
        strreleased=$(echo $strstat | grep "released")
        if [ -n "$strpressed" ]; then
            #echo $keyline --- debug
            if [ "$strkey" = "$strlastkey" ] && [ "$datdiff" -lt "$intmsbetweenkeys" ]; then
                intkeychar=$((intkeychar + 1)) #same key pressed for a different char
                intmousespeed=100
            else
                intkeychar=0 #different key / too far apart
            fi
            datlastkey=$datnow
            strlastkey=$strkey
            case "$strkey" in
                "1")
                    xdotool mousemove 270 154
                    ;;
                "2")
                    xdotool mousemove 679 154
                    ;;
                "3")
                    xdotool mousemove 1090 154
                    ;;
                "4")
                    xdotool mousemove 270 382
                    ;;
                "5")
                    xdotool mousemove 679 382
                    ;;
                "6")
                    xdotool mousemove 1090 382 
                    ;;
                "7")
                    xdotool mousemove 270 604 
                    ;;
                "8")
                    xdotool mousemove 679 604
                    ;;
                "9")
                    xdotool mousemove 1090 604 
                    ;;
                "0")
                    xdotool key Prior
                    ;;
                "previous channel")
                    xdotool key Space #Enter
                    ;;
                "channel up")
                    xdotool click 4 #mouse scroll up
                    ;;
                "channel down")
                    xdotool click 5 #mouse scroll down
                    ;;
                "channels list")
                    xdotool click 3 #right mouse button click"
                    ;;
                "up")
                    xgm=$(xdotool getmouselocation   --shell | grep Y | sed -e s/^..// ) 
                    intpixels=$((-1 * intmousespeed * 2))
                    test $switch -eq 1 && xdotool key Up || xdotool mousemove_relative -- 0 $intpixels #move mouse up
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    test $xgm$(xdotool getmouselocation   --shell | grep Y | sed -e 's/^..//' ) -eq 00 && xdotool mousemove_relative -- 0 768
                    ;;
                "down")
                    xgm=$(xdotool getmouselocation   --shell | grep Y | sed -e s/^..// ) 
                    intpixels=$(( 1 * intmousespeed))
                    test $switch -eq 1 && xdotool key Down || xdotool mousemove_relative -- 0 $intpixels #move mouse down
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    test $xgm$(xdotool getmouselocation   --shell | grep Y | sed -e 's/^..//' ) -eq 767767 &&  xdotool mousemove_relative -- 0 -768
                    ;;
                "left")
                    xgm=$(xdotool getmouselocation   --shell | grep X | sed -e s/^..// ) 
                    intpixels=$((-1 * intmousespeed * 2 ))
                    test $switch -eq     1 && xdotool key Left || xdotool mousemove_relative -- $intpixels 0 #move mouse left
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    test $xgm$(xdotool getmouselocation   --shell | grep X | sed -e 's/^..//' ) -eq 00 &&  xdotool mousemove_relative -- 1359 0
                    ;;
                "right")
                    xgm=$(xdotool getmouselocation   --shell | grep X | sed -e s/^..// ) 
                    intpixels=$(( 1 * intmousespeed))
                    test $switch -eq 1 &&  xdotool key Right || xdotool mousemove_relative -- $intpixels 0 #move mouse right
                    intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                    test $xgm$(xdotool getmouselocation   --shell | grep X | sed -e 's/^..//' ) -eq 13591359 && xdotool mousemove_relative -- -1359 0
                    ;;
                "select")
                    test $switch -eq 1 && xdotool key Return ||  xdotool click 1 #left mouse button click
                    ;;
                "return")
                    #xdotool key "Alt_L+Left" #WWW-Back
                    ((switch++))
                    test $switch -eq 2 && switch=0 
                    ;;
                "exit")
                    ((switch++))
                    test $switch -eq 2 && switch=0
                    ;;
                "F2")
                    ((menu++))
                    xdotool key  Escape
                    test $menu -eq 1 &&  xdotool click 3 || xdotool key Super_L
                    test $menu -eq 2 && menu=0
                    switch=1
                    ;;
                "F3")
                    $browser &
                    ;;
                "F4")
                    ((xvkbd++))
                    switch=0
                    xdotool mousemove 1100 750 
                    xvkbd -no-keypad  -geometry +905+560  &
                    test $xvkbd -eq 2 && killall xvkbd && xvkbd=0 
                    ;;
                "F1")
                    #chromium-browser --incognito "https://www.google.com" &
                    /etc/alternatives/x-terminal-emulator & 
                    ((xvkbd++))
                    switch=0
                    xdotool mousemove 1170 760 
                    xvkbd -no-keypad  -geometry +905+560  &
                    test $xvkbd -eq 2 && killall xvkbd && xvkbd=0

                    ;;
                "rewind")
                    $browser &
                    ;;
                "pause")
                    ((menu++))
                    xdotool key  Escape
                    test $menu -eq 1 &&  xdotool click 3 || xdotool key Super_L
                    test $menu -eq 2 && menu=0
                    switch=1
                    ;;
                "Fast forward")
                    /etc/alternatives/x-terminal-emulator & 
                    ((xvkbd++))
                    switch=0
                    xdotool mousemove 1170 660 
                    xvkbd -no-keypad  -geometry +905+560  &
                    test $xvkbd -eq 2 && killall xvkbd && xvkbd=0
                    ;;
                "play")
                    ((xvkbd++))
                    switch=0
                    xdotool mousemove 1100 750 
                    xvkbd -no-keypad  -geometry +905+560  &
                    test $xvkbd -eq 2 && killall xvkbd && xvkbd=0 

                    ;;
                "stop")
                    ## with my remote I only got "STOP" as key released (auto-released), not as key pressed; see below
                    echo Key Pressed: STOP
                    ;;
                *)
                    echo Unrecognized Key Pressed: $strkey ; CEC Line: $keyline
                    ;;
                    
            esac
        fi
        if [ -n "$strreleased" ]; then
            #echo $keyline --- debug
            case "$strkey" in
                "stop")
                    xdotool key q
                    xdotool key Control_L+Next
                    ;;
                "up")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "down")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "left")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "right")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
            esac
        fi
    fi
done

On my philips don’t work numbers or colors, so I got a virtual keyboard and made some changes

sudo apt-get install xvkbd

The mouse

up,down, left, right are the same

but if you hit Return (Samsung) or back (philips ) they switch to arrows , hit again and you will get the mouse

If you go off limits with the cursor , you will go to the other side

Up and Left are 2x faster than Down and Right , on mouse

OK means click on mouse mode , and enter with arrows

To get right click, on Samsung hit “channels list” or pause , on philips hit pause .

Colours and Controls

Red or Pause = one hit means Right Click, another hit means Menu
Green or Rewind = Browser
Yellow or Play = Virtual Keyboard, hit again to close
Blue or Forward = terminal

Stop = Always means q , always stop video. And a bonus, on your browser hit Stop moves to the next tab. Stop send both things every time

Pause = one hit means right click , another means Menu

To pause a video, hit play and OK , that opens xvkbd and hits space. To unpause hit OK.

To scroll down on your browser, you could hit play and OK too, and then keep hitting OK to browse the site

Also a nice url to browse twitter https://mobile.twitter.com

Samsung, not philips

Channel up = mouse scroll up
Channel Down = mouse scroll down

1 2 3
4 5 6
7 8 9
numbers from 1 to 9 move the cursor to diferent places

0 = means space, could pause video and browse pages
Previous Channel= means Prior, moves backwards

I’m not coding, I’m just playing with code

Hi,

this is an awesome script. It function perfectly, but every button will be recognized twice (except up down left right and selecet/ok).

is there an option to avoid this? - like an delay

hope you can help me

Dschogo

Hi you probably have answered this already but actually i had the same problem. This was due to the fact that for every keypress there were two cec-client debug lines with the same data causing the script to detect two keypress for each button press. To get around this I added a grep for the ID of the debug line (the timestamp I assume). If the id is the same for both key persses I ignored the second.

Here is the modified script:

#!/bin/bash
function keychar {
    parin1=$1 #first param; abc1
    parin2=$2 #second param; 0=a, 1=b, 2=c, 3=1, 4=a, ...
    parin2=$((parin2)) #convert to numeric
    parin1len=${#parin1} #length of parin1
    parin2pos=$((parin2 % parin1len)) #position mod
    char=${parin1:parin2pos:1} #char key to simulate
    if [ "$parin2" -gt 0 ]; then #if same key pressed multiple times, delete previous char; write a, delete a write b, delete b write c, ...
        xdotool key "BackSpace"
    fi
    #special cases for xdotool ( X Keysyms )
    if [ "$char" = " " ]; then char="space"; fi
    if [ "$char" = "." ]; then char="period"; fi
    if [ "$char" = "-" ]; then char="minus"; fi
    xdotool key $char
}
datlastkey=$(date +%s%N)
strlastkey=""
strlastid=""
intkeychar=0
intmsbetweenkeys=2000 #two presses of a key sooner that this makes it delete previous key and write the next one (a->b->c->1->a->...)
intmousestartspeed=10 #mouse starts moving at this speed (pixels per key press)
intmouseacc=10 #added to the mouse speed for each key press (while holding down key, more key presses are sent from the remote)
intmousespeed=10

while read oneline
do
    keyline=$(echo $oneline | grep " key ")
    echo $keyline --- debugAllLines
    if [ -n "$keyline" ]; then
        datnow=$(date +%s%N)
        datdiff=$((($datnow - $datlastkey) / 1000000)) #bla bla key pressed: previous channel (123)
        strkey=$(grep -oP '(?<=sed: ).*?(?= \()' <<< "$keyline") #bla bla key pres-->sed: >>previous channel<< (<--123)
        strstat=$(grep -oP '(?<=key ).*?(?=:)' <<< "$keyline") #bla bla -->key >>pressed<<:<-- previous channel (123)
        strpressed=$(echo $strstat | grep "pressed")
        strreleased=$(echo $strstat | grep "released")
        if [ -n "$strpressed" ]; then
            strid=$(grep -oP '(\[ ).*?(\])' <<< "$keyline") # get the id from the debug line to ingnore dupe detection.
            #echo $keyline --- debug
            if [ "$strkey" = "$strlastkey" ] && [ "$datdiff" -lt "$intmsbetweenkeys" ]; then
                intkeychar=$((intkeychar + 1)) #same key pressed for a different char
            else
                intkeychar=0 #different key / too far apart
            fi
            datlastkey=$datnow
            strlastkey=$strkey
            if [ "$strid" != "$strlastid" ]; then
                case "$strkey" in
                    "1")
                        xdotool key "BackSpace"
                        ;;
                    "2")
                        keychar "abc2" intkeychar
                        ;;
                    "3")
                        keychar "def3" intkeychar
                        ;;
                    "4")
                        keychar "ghi4" intkeychar
                        ;;
                    "5")
                        keychar "jkl5" intkeychar
                        ;;
                    "6")
                        keychar "mno6" intkeychar
                        ;;
                    "7")
                        keychar "pqrs7" intkeychar
                        ;;
                    "8")
                        keychar "tuv8" intkeychar
                        ;;
                    "9")
                        keychar "wxyz9" intkeychar
                        ;;
                    "0")
                        keychar " 0.-" intkeychar
                        ;;
                    "previous channel")
                        xdotool key "Return" #Enter
                        ;;
                    "channel up")
                        xdotool click 4 #mouse scroll up
                        ;;
                    "channel down")
                        xdotool click 5 #mouse scroll down
                        ;;
                    "channels list")
                        xdotool click 3 #right mouse button click
                        ;;
                    "up")
                        intpixels=$((-1 * intmousespeed))
                        xdotool mousemove_relative -- 0 $intpixels #move mouse up
                        intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                        ;;
                    "down")
                        intpixels=$(( 1 * intmousespeed))
                        xdotool mousemove_relative -- 0 $intpixels #move mouse down
                        intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                        ;;
                    "left")
                        intpixels=$((-1 * intmousespeed))
                        xdotool mousemove_relative -- $intpixels 0 #move mouse left
                        intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                        ;;
                    "right")
                        intpixels=$(( 1 * intmousespeed))
                        xdotool mousemove_relative -- $intpixels 0 #move mouse right
                        intmousespeed=$((intmousespeed + intmouseacc)) #speed up
                        ;;
                    "select")
                        xdotool click 1 #left mouse button click
                        ;;
                    "return")
                        xdotool key "Alt_L+Left" #WWW-Back
                        ;;
                    "exit")
                        echo Key Pressed: EXIT
                        ;;
                    "F2")
                        chromium-browser "https://www.youtube.com" &
                        ;;
                    "F3")
                        chromium-browser "https://www.google.com" &
                        ;;
                    "F4")
                        echo Key Pressed: YELLOW C
                        sync;sync;shutdown -h now
                        ;;
                    "F1")
                        chromium-browser --incognito "https://www.google.com" &
                        ;;
                    "rewind")
                        echo Key Pressed: REWIND
                        ;;
                    "pause")
                        echo Key Pressed: PAUSE
                        ;;
                    "Fast forward")
                        echo Key Pressed: FAST FORWARD
                        ;;
                    "play")
                        echo Key Pressed: PLAY
                        ;;
                    "stop")
                        ## with my remote I only got "STOP" as key released (auto-released), not as key pressed; see below
                        echo Key Pressed: STOP
                        ;;
                    *)
                        echo Unrecognized Key Pressed: $strkey ; CEC Line: $keyline
                        ;;

                esac
            else
                echo Ignoring key $strkey with duplicate id $strid
            fi
            # store the id of the keypress to check for duplicate press count.
            strlastid=$strid
        fi
        if [ -n "$strreleased" ]; then
            #echo $keyline --- debug
            case "$strkey" in
                "stop")
                    echo Key Released: STOP
                    ;;
                "up")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "down")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "left")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
                "right")
                    intmousespeed=$intmousestartspeed #reset mouse speed
                    ;;
            esac
        fi
    fi
done
1 Like

I tried it and it works perfectly. However, I would like to support the usage of TV without CEC using a flirc usb. How would I do that?

Hi guys,
I'm having a little problem with this fantastic trick.
It seems my Raspi senses the command from the remote if the the button is pressed AND it's released.

E.G: I associated to button 6 the chars "mno6" .
If I press once the button I write "mm".

Any idea how to correct this behaviour?

Thanks a lot