My setup is: N2 (CE 9.2.5) -> Onkyo TX-NR575 AVR -> Panasonic GX800
Using premium quality HDMI cables. Using eARC for tv, so HDMI2 is used as input on tv.
I keep the N2 on all the time. I don’t really use the AVR that much, so the HDMI Passtrough is activated.
My issues is that CEC works perfectly fine until I switch input on tv other than HDMI2, like TV DVB-C. If I switch back, I loose cec in Kodi. I can do two things:
In Pana TV menu select Viera link app and select the Player (that is N2) and CEC returns.
In Yatse I select Activate CEC -> cec in Kodi start to work immeadiatelly
I also tried to ssh, and issue echo r | cec-client -s -d 1
CEC restarts (quite slowly, compared to above two solutions, which are nearly instant), this takes about 10-15 seconds, but after it works again.
My idea is that somehow cec device is lost and not reconnected on input switch. Any ideas how to fix this?
Btw, anybody knows what command could Yatse send on Activate CEC option? Maybe doing a script, like when resuming from screensaver run the Activate CEC command. That would probably work.
Or what cec-client sommand should I use? Restart ® is slow.
It’s possible using cec-client to switch the input might keep things “connected”, rather than directly with the TV. For instance, I had scripts that ran on my N2, and now on an H2 (running Kodi on a stripped-down Lubuntu), that switch the HDMI input on voice command (via Alexa). It’s a reverse situation than many, where the Odroid controls the TV via CEC rather than the TV control the Odroid. Those scripts are also linked to items in my shutdown menu on Kodi, so I can switch inputs and sleep the display directly from within the Kodi UI. Using a script also allows for the simultaneous on/off toggle of Hyperion. My TV remote collects dust in the corner as a result.
I’m not overly familiar with Yatse (not an Android user), but if Yatse is able to run shell scripts, you can use it as your gateway to HDMI switching. As long as your CE box/Kodi is running, even if it’s not the current input, it should still be able to switch inputs for you.
Apparently the hexadecimal codes can vary dependent on model of TV, but this is pretty common for many TVs:
echo "tx 4F:82:10:00" | cec-client -s -d 1
The third hexadecimal number (in the above case 10) represents input. HDMI-1 = “10”, HDMI-2 = “20”, HDMI-3 = “30”, etc.
Test it out; see if it stays connected. If it does, I can probably help you to set up a script to do it.
I can swithc between HDMI inputs 1-2 by changing 10 and 20. So I have CEC and remote working on Kodi (HDMI2). I swithc using the above command to HDMI1 and back to 2, but sometimes I have remote, sometimes not. More often not.
What keeps working is the Activate CEC command that I can send with Yatse. But I don’t know what command is sent and how by Yatse. And if we figure this out somehow, still need to find a way to kick in the command. But maybe mapping to a not used button on the remote.
Indeed, whatever remote you’re using for Kodi should be able to have a script function mapped to it. Yatse seems to be just using the kodi built-in activate command, rather than addressing cec-client directly. It doesn’t look like Yatse can send SSH commands directly, but can send direct keyboard commands as custom buttons.
So what in theory should work is this:
SSH into your CoreELEC box.
Create a folder (not sure if this is a default folder on CE):
mkdir /storage/scripts
3a) Make a script in that folder:
nano /storage/scripts/changeinput.py
3c) C&P the following:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import sys
if sys.argv[1:]:
arg = sys.argv[1][:1]
if not arg.isdigit():
print("Don't try and be tricky.")
exit()
else:
cecinput = "echo \"tx 4F:82:" + arg + "0:00\" | cec-client -s -d 1"
os.system(cecinput)
else:
print("We need an input [1-9].")
exit()
Make it executable:
chmod a+x /storage/scripts/changeinput.py
5a) Now, create the following file (if it doesn’t already exist):
if keyboard.xml already exists, just add all the stuff inside the < keyboard > tag.
Here’s the part that I can’t really help with, as I don’t have access to Yatse. But using the info here to set it up, create a custom command for each input. They should be sent as keyboard keys. I’ve tried to use some of the more useless key commands for CE, but also ones accessible via a mobile keyboard. Yatse can only send key presses without modifier keys, otherwise they’d be set up as “one”,“two”,“three” with mod=“ctrl” added.
My configuration:
Odroid-N2 -> Denon AVR -> Panasonic OLED TV (HDMI 2)
N2 is configured with CEC Wake-Up enabled so it is back online when I choose HDMI 2 on TV remote.
Sometimes when I power on TV (which automatically power on AVR) and immediately select HDMI 2 then CEC doesn’t work not reacting for TV remote buttons (but N2 is back online - I see it is starting responding for ping) Usually it works if I wait for 10-20 seconds at least and then go from TV source to HDMI 2 source.
In case I select HDMI 2 as the source (so I can see CoreElec) and CEC doesn’t work and I send “CEC Activate” command in Yatse TV is switching to HDMI 1 source where nothing is connected. Why “CEC Activate” command is causing TV to switching to HDMI 1 instead of HDMI 2?
No, I wasn’t using your script.
I’m just reporting weird behavior: using Yatse I’m sending CEC Activate command to KODI which is running on Odroid-N2 connected through Denon AVR to HDMI-2 in TV and TV is switching to HDMI-1 input. Isn’t a weird result?
Regarding your statement “YATSE command is set to HDMI-1” - my assumption is that if I have configured Yatse to control Odroid-N2 via IP address then CEC activate command should be send to this device but is it configurable in Yatse which CEC line/input should be activated?
Why are you curious that I have nothing plugged to HDMI-1? A, OK, maybe you are surprise that I have AVR connected to HDMI-2 instead of HDMI-1? OK, then the answer is easy: because HDMI-2 is ARC but HDMI-1 is not
It might just be that Kodi’s HDMI port number needs to be changed. I believe there’s supposed to be automatic detection there, but automatic redundancies are always a point of failure. Default is 1, but try changing it to 2 and see if that fixes the issue. You’ll find that in Settings -> System -> Input -> Peripherals -> CEC if memory serves correctly.
That all said, with ARC, the TV likes to be the “hub”, so it might be a competition issue between the AVR and the TV as to who’s controlling what. Technically, connecting the N2 to HDMI-1 and keeping the AVR on HDMI-2 should also work for Kodi’s audio, but you will lose any additional video-related functionality the AVR may be having on the N2.
The options changed! Now I am able to set the HDMI port number and it’s set to default 1.
I see on my TV Kodi is now on HDMI1, but in “real” it’s on HDMI3. So I changed the HDMI port to 3 and CEC is working again now, physical address is still 0.
Ok, but now the next issue:
bPAAutoDetected is false, OK m_configuration.baseDevice is NOT CECDEVICE_UNKNOWN -> useless m_configuration.iHDMIPort < CEC_MIN_HDMI_PORTNUMBER -> useless m_configuration.iHDMIPort > CEC_MAX_HDMI_PORTNUMBER -> useless
CEC_MIN_HDMI_PORTNUMBER is 1, CEC_MAX_HDMI_PORTNUMBER is 15
The user is not able to set a number smaller then 1 or higher than 15.
So strPhysicalAddress("0") will be set every time as the condition is never met.
I guess this is wrong:
If iPhysicalAddress is set by user m_configuration.iHDMIPort need to be set to 0 (CEC_HDMI_PORTNUMBER_NONE), then it should work. Then iPhysicalAddress get higher priority over iHDMIPort. libCEC check first by else if HDMI port set, then afterwards by else if physical address is set. So this will never be hit if HDMI port is set to 1 - 15:
Physical addresses are valid from 0x1000 - 0xFFFE.
The TV would be 0000, my device connected to HDMI port 3 should be then: 3000 by this description: https://elinux.org/images/d/d9/Verkuil.pdf
Physical Address
Physical address: Hierarchy placement
Range: 0.0.0.0 - F.F.F.F
Root device: 0.0.0.0: HDMI Sink, typically a TV
First device: 1.0.0.0: Device connected to HDMI port 1 on root device
Second device: 2.0.0.0: Device connected to HDMI port 2 on root device
Third device: 1.1.0.0: Device connected to HDMI port 1 on first device
Or another example: 0x2200 is [TV] -> HDMI 2 -> [AVR] -> HDMI 2 -> [CE DEVICE]
I will need to check it in more detail the next days.
Absolutely amazing troubleshooting action done!
Glad to see our reports that something is wrong with CEC / HDMI were “productive” and delivered kind of input for further investigations.
Looking forward for a solution.
Thanks a lot.
I will test these days a fix to match up the priority again from Kodi to libCEC. This should bring back the priority HDMI port, if set to 0 use physical address, if set to 0 use auto detection like before.
I am not sure, it’s a forward/backwards of config options with auto detection and some other stuff.
I am now able to set a HDMI port 1-15. On next reboot, HDMI port become 0 again and libCEC does set the physical address instead. This looks “ok” for me. My HDMI port 3 on TV become 3000 as physical address. libCEC just convert the HDMI port 3 to 3000 physical address and set HDMI again to 0 as physical address should be used.
But now I changed the physical address to a “wrong” value like 1000 it become the old/correct value 3000 again after a reboot as libCEC does test and auto detect the correct one. Do the setting is useless right now.
It’s completely mixed up and the options are changed on multiple places in Kodi and libCEC…
Maybe it’s better to drop the option HDMI port at all.
For example a physical address like 2200 is not possible to be adjusted. And the physical address do have priority in libCEC as well. It’s just confusing that a user set a HDMI port and on next reboot it’s set to 0 again.