This guide installs equipment-operator on a
liken cluster and declares a Receiver.
At the end, the operator runs in liken-system and reports the
receiver’s power, input, and volume.
You need:
- A
likencluster with themedia-operatorinstalled. The operator reads a session’s level from the media bus thatmedia-operatorruns. - A receiver that speaks the Denon and Marantz control protocol on the network, with network control enabled in its own menu.
kubectlwith cluster-admin access, because the install creates a CRD and aClusterRole.
Apply the manifests
This site serves the repository’s
deploy/ directory as raw YAML, so
the install needs no clone:
kubectl apply -n liken-system \
-f https://equipment.liken.sh/deploy/receivers-crd.yaml \
-f https://equipment.liken.sh/deploy/rbac.yaml \
-f https://equipment.liken.sh/deploy/operator.yaml
For GitOps, point a Kustomization at the base and pin <ref> to a
release tag:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: liken-system
resources:
- https://github.com/liken-sh/equipment-operator//deploy?ref=<ref>
Declare the receiver
A Receiver names the protocol, the address, and the wiring. The
wiring is the fact nothing can discover: which machine’s HDMI output
lands on which input. A receiver forwards one EDID on every input,
so every entry names the machine as well as the monitor id.
apiVersion: equipment.liken.sh/v1alpha1
kind: Receiver
metadata:
name: living-room
spec:
denon:
address: receiver.example
inputs:
- name: MPLAY
machine: node-1
monitor: don-0070-denon-avr
volume:
max: 72
step: 0.5
The input name is the receiver’s own spelling. The monitor id is the
one the display-operator publishes for
that cable. The volume block is in the receiver’s own scale. max is
the loudest a press may take the room, and a Denon requires it,
because the limit a Denon reports moves with the volume. step is
how far one press moves, and half steps are allowed. kubectl get receivers shows what the receiver last said:
NAME POWER INPUT VOLUME REACHABLE AGE
living-room on MPLAY 50.0 True 2m
Put it under a Player
Nothing more is declared. The media-operator resolves each
Player’s screen to a machine and a monitor id, finds the input
that matches both, and applies spec.session for as long as the
Player has that screen, at the idle screen included. The session
takes the level from the Player’s volume topic the whole time, so
the remote’s volume keys turn the receiver whether a film plays or
not. When a Play starts, the session powers the receiver on and
selects the input, once. An idle screen never wakes the receiver.
A person at the receiver’s own remote outranks the cluster. If they
select another input, the status records it and nothing switches
back until the next Play starts. If they turn the knob, the new
level is written back to the bus, so the next press steps from
there.