https://github.com/blchinezu/cec-client-mqtt-bridge
HDMI CEC-MQTT Bridge using the cec-client binary
https://github.com/blchinezu/cec-client-mqtt-bridge
alpine bridge cec cec-client docker go golang iot mqtt mqtt-broker pipes smarthome
Last synced: 5 months ago
JSON representation
HDMI CEC-MQTT Bridge using the cec-client binary
- Host: GitHub
- URL: https://github.com/blchinezu/cec-client-mqtt-bridge
- Owner: blchinezu
- License: gpl-3.0
- Created: 2019-07-22T09:51:48.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2019-07-22T12:28:11.000Z (almost 7 years ago)
- Last Synced: 2025-06-25T02:26:29.415Z (12 months ago)
- Topics: alpine, bridge, cec, cec-client, docker, go, golang, iot, mqtt, mqtt-broker, pipes, smarthome
- Language: Go
- Homepage:
- Size: 27.3 KB
- Stars: 4
- Watchers: 2
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# cec-client-mqtt-bridge
HDMI CEC-MQTT Bridge using the **cec-client** binary
--------------------------------------------------------------------------------
### Description
This lets you send commands and receive answers from the `cec-client` binary
through MQTT.
- To send commands to `cec-client` you publish into `cec/client/tx`
- To listen for `cec-client` output you subscribe to `cec/client/rx/TRAFFIC`
--------------------------------------------------------------------------------
### Why this exists
All the existing implementations try to connect directly to CEC and interpret
the messages although this is already done in `cec-client` and it's the most
reliable implementation. Everyone checks the CEC functionality and/or their
implementation with `cec-client` anyway.
So this project is creating a bridge between the `cec-client` binary and an MQTT
broker placed on localhost. Basically it's creating a dual-way pipe between the
services.
--------------------------------------------------------------------------------
### How's this working
- The `cec-client-mqtt-bridge` binary connects to the MQTT broker
- It subscribes to `cec/client/tx` on a different thread
- It spills the received messages in `stdout` which is piped to `cec-client`
- It then listens for `stdin` input which is piped from `cec-client` on the
main thread
- When receiving something it publishes the message on `cec/client/rx/TRAFFIC`
--------------------------------------------------------------------------------
### Hardware
Make sure you have HDMI CEC capable hardware
- Raspberry PIs have this by default
- Intel NUCs usually require an [additional hardware module](https://www.pulse-eight.com/p/154/intel-nuc-hdmi-cec-adapter) to be installed
- Other devices can use [this generic adapter](https://www.pulse-eight.com/p/104/usb-hdmi-cec-adapter)
--------------------------------------------------------------------------------
### Build
The build/dependency/run scripts are built for Apline Linux but can be easily
adapted for Debian or something else.
```bash
# Install git, go & musl-dev
ash install-build-dependencies.sh
# Build binary
ash build.sh
# Remove git, go & musl-dev
ash remove-build-dependencies.sh
```
--------------------------------------------------------------------------------
### Runtime dependencies
For this to work you need the `cec-client` binary.
To install it in Alpine Linux just run:
```bash
apk add libcec
```
For Debian based systems this should do the trick:
```bash
apt install cec-utils
```
--------------------------------------------------------------------------------
### Run
Creates two pipes in `/tmp/fifo/` which will facilitate the communication
between processes and then launches the processes.
```bash
bash run.sh
```
Here's how `run.sh` looks like:
```bash
# Create pipes
mkdir -p /tmp/fifo
rm -rf /tmp/fifo/mqtt2cec /tmp/fifo/cec2mqtt
mkfifo /tmp/fifo/mqtt2cec /tmp/fifo/cec2mqtt
# Launch bridge
./cec-client-mqtt-bridge > /tmp/fifo/mqtt2cec < /tmp/fifo/cec2mqtt &
# Launch cec client
cec-client < /tmp/fifo/mqtt2cec > /tmp/fifo/cec2mqtt
```
--------------------------------------------------------------------------------
### Docker
To use this in an Alpine based Docker image you could use this:
```dockerfile
ENV CECCLIENT_MQTT_BRIDGE_PATH "/app/modules/cec-client-mqtt-bridge"
RUN echo -e "\n > INSTALL CEC-CLIENT-MQTT-BRIDGE\n" \
&& apk add --no-cache --virtual=build-dependencies \
git \
\
&& mkdir -p $CECCLIENT_MQTT_BRIDGE_PATH/src \
&& cd $CECCLIENT_MQTT_BRIDGE_PATH \
&& git clone https://github.com/blchinezu/cec-client-mqtt-bridge.git ./src \
&& ash src/install-build-dependencies.sh \
&& ash src/build.sh \
\
&& echo -e "\n > CLEANUP\n" \
&& ash src/remove-build-dependencies.sh \
&& apk del --purge build-dependencies \
&& rm -rf \
./src \
/root/.cache \
/root/go \
/tmp/* \
/var/tmp/*
```