One piece of A/V equipment on the far end of a machine’s cable: the protocol that reaches it, the inputs liken machines feed, and the session a Player holds on it.

spec

How to reach the receiver and how it is wired. The cluster owner writes every field but session, which the media operator applies.

Field Type Required Description
denon object no The receiver speaks the Denon and Marantz control protocol on TCP port 23: plain commands such as MV50, and events in the same form.
volume object no How loud this receiver may be driven and how far one press moves it, both in the receiver’s own scale. Required for a Denon.
inputs []object no The receiver’s inputs that liken machines feed. Nothing can discover this wiring, so the cluster owner declares it. A receiver forwards one EDID on every input, so the monitor id alone cannot tell two machines apart, and every entry names the machine.
session object no The Player that holds the receiver now. The media operator applies this block under its own field manager for as long as the Player has a screen on this receiver, and lifts it after. The session owns the level from the volume topic the whole time. Power and input go out once, each time active or awake turns on. Nothing here is re-asserted: a person at the receiver’s own remote outranks the cluster.

spec.denon

The receiver speaks the Denon and Marantz control protocol on TCP port 23: plain commands such as MV50, and events in the same form.

Field Type Required Description
address string yes The host name or IP address the receiver answers on, with an optional port. The port is 23 when absent.

spec.volume

How loud this receiver may be driven and how far one press moves it, both in the receiver’s own scale. Required for a Denon.

Field Type Required Description
max number no The loudest a press may drive this receiver, in its own scale. A Denon counts 0 to 98 and this is capped there. 100 on the bus means this value. A hand on the receiver’s own remote can still go past it.
step number no How far one press moves the receiver, in its own scale. Half steps are allowed. Absent means one whole unit.

spec.inputs[]

The receiver’s inputs that liken machines feed. Nothing can discover this wiring, so the cluster owner declares it. A receiver forwards one EDID on every input, so the monitor id alone cannot tell two machines apart, and every entry names the machine.

Field Type Required Description
name string yes The input’s name on the receiver, as its protocol spells it: MPLAY, GAME, TV, CBL/SAT.
machine string yes The liken machine whose HDMI output lands on this input, by node name.
monitor string yes The monitor id the display and audio operators publish for this cable, such as don-0070-denon-avr. It is the check that the wire is really there.

spec.session

The Player that holds the receiver now. The media operator applies this block under its own field manager for as long as the Player has a screen on this receiver, and lifts it after. The session owns the level from the volume topic the whole time. Power and input go out once, each time active or awake turns on. Nothing here is re-asserted: a person at the receiver’s own remote outranks the cluster.

Field Type Required Description
player string yes The Player, as namespace/name. Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?/[a-z0-9]([-a-z0-9]*[a-z0-9])?$.
input string yes The input the Player plays through, by its name in spec.inputs.
volumeTopic string yes The Player’s volume topic on the media bus. The operator follows it, owns the level while the session stands, and writes the receiver’s own knob back to it.
active boolean no Whether a Play stands on the Player. When it turns on, the receiver is powered on and its input selected, once. While it is off, the session owns the level and sends the receiver nothing, so an idle screen never wakes the room. Absent means off.
awake boolean no Whether the room’s screen is awake. It is the second trigger for the same one-shots as active: each time it turns on, the receiver is powered on and its input selected, once, whatever active says. Turning off sends the receiver nothing. Absent means asleep.

status

What the receiver last said, in its own units. Only the operator writes it.

Field Type Required Description
power string no The power state the receiver last reported: on or standby.
input string no The input the receiver last reported as selected, whether liken selected it or a person did.
volume string no The master volume the receiver last reported, in its own scale. A Denon counts 0 to 98 in half steps.
volumeMax string no The last MVMAX line the receiver sent, in the same scale. It is what the receiver said and nothing the operator acts on: on a Denon the number moves with the volume.
mute boolean no Whether the receiver last reported itself muted.
soundMode string no The sound mode the receiver last reported, such as MULTI CH IN or STEREO.
service string no The Service that stands in for the receiver on the cluster network, once the operator makes one. Empty until then.
conditions []object no Reachable is True only after a recent answered exchange with the receiver, never on an open socket alone.

status.conditions[]

Reachable is True only after a recent answered exchange with the receiver, never on an open socket alone.

Field Type Required Description
type string yes The check this entry reports, in CamelCase. It is the key of this list. Pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$.
status string yes The verdict. True is the good verdict, and Unknown means the operator cannot tell yet. One of: True, False, Unknown.
observedGeneration integer no The metadata.generation this condition judged.
reason string no One CamelCase word for why the condition holds this verdict, meant for a program to match on. Pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$.
message string no The same answer in a sentence a person reads.
lastTransitionTime string yes When the verdict last changed. It moves only when the status flips.