
Defeating ErP2/ERPII, which defeats HDMI-CEC on soundbars
Table of Contents
ErP Ecodesign Directive
is EU’s reasonable attempt to save power consumed by various devices, with the current iteration known in industry as ErP2
or ERPII
. However, with soundbars and other devices using HDMI-CEC (bearing various names on equipment produced by different manufacturers like SimpLink, Bravia Sync, Anynet or Aquos Link) it defats neat HDMI extension. In this post I’ll explain how EU regulations make the experience of watching TV with longer pauses crappy and how to defeat it.
Setup and HDMI-CEC overview #
Usually, we have 3 devices in a problematic setup: TV, soundbar connected using HDMI ARC (Audio Return Channel) and some multimedia device like streaming box (Apple TV in this example) or games console. All modern devices support HDMI-CEC, which enables several nice commands, including System Audio Control and System Standby.
System Audio Control allows using remote of streaming box to send signals directly to soundbar, so it can change output level of speakers, as an input signal is “line-level” PCM.
System Standby allows one device, usually generating video input, to wake up all other HDMI devices, so when starting Apple TV we get video and audio output devices powered up as well. The same works for setting sleep mode.
Problem #
Background #
According to many soundbar manufacturers, there is a 15 mins power off function, one of the ERPII standard requirement for saving power (taken from manual of SHARP HT-SBW160). I wasn’t able to find specific regulation, but all legislations are not human-friendly, so I gave up after 15 minutes. For brave souls, here’s legislation home page.
In principle, this is reasonable. The problem is that soundbars don’t usually have UI, so it can’t be configured.
UX nightmare #
The problem manifests when you use HDMI ARC and pause audio or video. Since the signal is digital, pausing send true silence, triggering standby mode with 100% accuracy. And it doesn’t matter if video is still transmitted. From there, you have soundbar powered off, and you can’t power it back on without pressing the power button - either physical or on IR remote. It can only be power button, so Apple TV or other smart, but not 100% programmable remotes can’t wake it up using Volume Up/Down. If you try to set volume using streaming device remote after soundbar went into standby, you’ll usually start controlling built-in TV speakers.
What doesn’t matter either is HDMI-CEC. Soundbars are perfectly capable of checking status of other devices on the same HDMI bus. However, to completely enforce ErP, they seem to ignore it, even when they were woken up by CEC. What it means, is that there’s no way you can wake them up using CEC, unless other CEC devices provide an option to send specific commands to specific devices (for example Pioneer AVRs, when controlled with mobile app, provide access to virtual remote controls to do so - but it’s more of debugging mode).
What’s funniest, is that soundbars aimed at the average consumer take virtually no power when no signal is amplified, as opposed to TVs that can still shows the image when paused. Or proper AVRs that always come with UI to change auto-standby time.
Solution #
Obvious solution and investigation into better ways #
The solution for an average consumer to this problem with user experience is quite obvious - either don’t make breaks longer than 15 minutes or take two remotes to the couch.
Hackers will usually start to look for ways to disable this feature, change interval or reset timer. The first two options could sound promising, especially with my model that has SERVICE ONLY USB Socket, but I didn’t have any luck with it.
Resetting the timer is very promising, especially when ErP regulation mentions somewhere that those 15 minutes count from last audio signal input or user interaction. So the easiest thing would be to interact with soundbar, and sending effectively pointless IR signals is an ideal candidate.
Previous attempts #
4 years ago, I made SharpRemoteWebGUI, a horrible Python script using LIRC running on Raspberry Pi hidden behind a TV with IR diode pointing to Soundbar. The mini-computer was intended to do more things, like proxy traffic via VPN, but it was abandoned. The interesting part was implemented by periodically sending single volume up and single volume down signals to keep the device alive. The soundbar was used with just Smart TV, but occasionally with Bluetooth transmissions, so having Web GUI was one of project requirements.
Current solution #
Recently, when changing equipment location and after adding a streaming device that generated CEC commands (so it messed up with TV even more after soundbar went into standby), I revisited the problem with the solution having a smaller form-factor.
Full Linux on Raspberry Pi was replaced with Arduino board. Quick and dirty implementation runs on ESP32 dev board, as I have several on hand ready for various IoT projects. Eventually, I’ll replace it with some low-power and energy-efficient solution.
IR sequence was also simplified - every couple of seconds, it sends Input: HDMI command, so it keeps volume intact and ensures the input is always correct. As volume control signals come via HDMI, they are not impacted by potential input signals collision. Moreover, since only POWER IR signal can wake up the soundbar, it is correctly put into sleep when TV receives such command.
Implementation #
For hardware side, I used IR emitting diode connected to screw terminals connected using simple gold pin cable directly to ESP32 dev board (for this quick and dirty implementation, I let MCU drive LED directly). All put into zip-lock bag (0.3L ISTAD from IKEA) to avoid short-circuit as my TV unit shelf is metal. Power taken from USB socket in TV.
I decided to use Arduino-IRremote in my code, as it’s quite popular and well-supported. To obtain IR codes, you can use an IR receiver with the same library.
I had Flipper Zero at hand, so I was able to get it quicker (protocol NECext
from Flipper can be called using sendNECRaw
function in IRremote, signal is obtained by concatenating the value of C with the value of A registers).
The code is trivially simple, but of course it can be infinitely expanded.
#include <IRremote.hpp>
#define IR_SHARP_HDMI 0xED12FF86
#define IR_SHARP_RPT 5
#define IR_SEND_PIN 4
#define SLEEP 4
void setup() {
IrSender.begin(
IR_SEND_PIN,
ENABLE_LED_FEEDBACK,
USE_DEFAULT_FEEDBACK_LED_PIN
);
}
void loop() {
IrSender.sendNECRaw(
IR_SHARP_HDMI,
IR_SHARP_RPT
);
sleep(SLEEP);
}
Once assembled and mounted using sticky tape in such a way, that blaster stays in place and points receiver, all looks quite neat and minimal, even for levels of hacks applied.
Final thoughts #
While I wholeheartedly support energy saving solutions, I also think that making them with bad UX make people hate such solutions. And in the end, people may buy “non-eco” devices while making the pile of e-waste bigger and bigger. Our only hope is reasonable UX design that understands why legislations like ErP were made and how people are using their devices. And in hackers, of course ;)