From 8be19de0c611b1dc15a59db8ac5086b53ac633d0 Mon Sep 17 00:00:00 2001 From: hender Date: Sun, 14 Jul 2019 15:10:41 -0400 Subject: Originales --- RaspberryPITVHDMI | 1606 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1606 insertions(+) create mode 100644 RaspberryPITVHDMI (limited to 'RaspberryPITVHDMI') diff --git a/RaspberryPITVHDMI b/RaspberryPITVHDMI new file mode 100644 index 0000000..0bd659a --- /dev/null +++ b/RaspberryPITVHDMI @@ -0,0 +1,1606 @@ + + + + +Controlling Raspberry PI with TV Remote, using HDMI CEC - Tips, Tricks and Tutorials / Raspberry Pi - Ubuntu MATE Community + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + +
+ +
+
+
+
+ + +
+
+
+
+
+ + + + + + +
+ + +
+
4 / 4
Apr 2018
+ +
+
+
+ +
+
+
+ + + +

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 99 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:

+
  • created

    Mar '16
  • last reply

    Apr '18
  • 3

    replies

  • 16.7k

    views

  • 4

    users

  • 3

    likes

  • 3

    links

8 months later

You should submit this to https://github.com/raspberrypi/linux/pulls 84 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