Receiver

An A/V receiver that a liken machine plays through. The resource declares the protocol the operator controls it with, the inputs that liken machines are connected to, and the session that uses it now.

spec

How to reach the receiver and how its inputs are wired. The cluster owner writes every field except session. The session belongs in status.session, and spec.session holds the session only for a media operator that still writes it here.

Field Type Required Description
denon object no The receiver accepts the Denon and Marantz control protocol on TCP port 23. Commands such as MV50 and receiver events use the same plain-text form.
wiim object no The receiver answers the WiiM/LinkPlay control protocol over unauthenticated HTTPS on port 443. Every request is a GET to /httpapi.asp?command=, and the device’s own LinkPlay UUID is the identity the operator checks before it drives anything. The operator drives only a WiiM. Network discovery creates a Receiver only for a device whose UPnP description names a modelName that begins with WiiM, and the driver drives only a device whose getStatusEx project begins with WiiM, both in any letter case. Another brand on the LinkPlay platform gets getStatusEx and nothing else.
volume object no The loudest level a press may set and the distance one press moves, both in the receiver’s own scale, and who draws the volume indicator. The media operator reads max and step when it turns a press of a volume key into status.session.volumeAsk. A Denon requires max.
inputs []object no The receiver inputs that liken machines feed. The cluster owner declares this wiring because the operator cannot discover it. A receiver forwards one EDID on every input, so the monitor ID alone cannot distinguish two machines. Each entry therefore names its machine.
session object no The Player that currently uses the receiver, as a media operator that does not write status.session writes it. The operator reads status.session first and uses this block only while status.session is absent. A media operator applies this block with its own field manager while the Player has a screen on this receiver, and removes it afterward. The operator sets the volume only from volumeAsk, and applies powerAsk and inputAsk the same way, once for each ask. Each time active or awake changes to true, the operator waits until it has read the receiver’s own state, and then sends the power, the input, and the input’s sound mode, each only when the receiver reports another value. A session that appears while the operator runs does the same for the flags it starts with. A session that the operator finds in its first pass after a start sends nothing for its flags, because the last operator already acted on them, and only a later change to true sends. The operator does not re-assert those commands, so a person using the receiver’s remote can change them.
power string no The power state the operator drives the receiver to. The operator owns this field: it applies each new value once and never re-asserts it, so a GitOps manifest that omits it leaves the receiver wherever the operator last put it, and a person who turns the receiver on or off by hand is not overruled. An edit of another field, such as a label or the session, sends nothing. The operator acts on a change of this field, including a Receiver created while the operator runs: it waits until it has read the receiver’s own state, and sends the value only when the receiver reports another power. After an operator start it adopts the value it finds and sends nothing, unless the value differs from status.settledPower. Such a value is an edit made while the operator was down, and the operator handles it as a change. A status with no settledPower, such as one an earlier operator wrote, adopts. A status.session.powerAsk rewrites it. The Denon cannot tell Standby from Off, so both mean Standby. A WiiM has no standby, so it always reports On. Quote the values On and Off in YAML, as power: “On”: kubectl reads an unquoted On or Off as a boolean, and the API server refuses it. One of: On, Standby, Off.
zones object no The receiver’s second and third zones. Only zone2 and zone3 are valid keys, so no other key is a valid input and the driver can serve every zone this schema admits. The main zone has no entry here: spec.power and spec.session drive it. The operator sends only a declared control the zone reports at another value, with the same rules as spec.denon.settings: at most 3 sends of one control at one declared value, and a control the zone does not report is sent once for each change of spec.zones, the same way.

spec.denon

The receiver accepts the Denon and Marantz control protocol on TCP port 23. Commands such as MV50 and receiver events use the same plain-text 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.
settings object no The receiver’s settings, one family per block, in display units. The operator compares each declared field with the value the receiver reports and sends only a field that differs, so a restart against a receiver that already holds the declared values sends nothing, and a change made at the receiver is sent back. It sends one field at most 3 times at one declared value; a field the receiver still does not report at the declared value is then named in the SettingsConfirmed condition, and a new declared value, or a report of the declared value, starts the count again. An edit of another field does not start it again. A field the receiver does not report cannot be compared, so the operator sends it once for each change of this block: once when the spec changes the block, and after an operator restart only when the block differs from the one status.settledSettings records. An omitted key leaves the receiver unchanged.

spec.denon.settings

The receiver’s settings, one family per block, in display units. The operator compares each declared field with the value the receiver reports and sends only a field that differs, so a restart against a receiver that already holds the declared values sends nothing, and a change made at the receiver is sent back. It sends one field at most 3 times at one declared value; a field the receiver still does not report at the declared value is then named in the SettingsConfirmed condition, and a new declared value, or a report of the declared value, starts the count again. An edit of another field does not start it again. A field the receiver does not report cannot be compared, so the operator sends it once for each change of this block: once when the spec changes the block, and after an operator restart only when the block differs from the one status.settledSettings records. An omitted key leaves the receiver unchanged.

Field Type Required Description
system object no The unit-wide settings. Power is reported by the driver but not declarable here, because the controller owns it through spec.power.
tone object no The tone control and the two trims, in display units where 0dB is neutral.
audyssey object no The Audyssey room correction settings.
audio object no The audio processing settings.
hdmi object no The HDMI setup, the receiver’s Video > HDMI Setup menu, with its HDMI-CEC switches.
channelVolumes map[string]number no One trim per channel, keyed by the channel’s name, in display units where 0dB is neutral.

spec.denon.settings.system

The unit-wide settings. Power is reported by the driver but not declarable here, because the controller owns it through spec.power.

Field Type Required Description
eco string no The Eco mode the receiver uses: auto, on, or off.
dimmer string no The display dimmer: off, dim, dark, or bright.
autoStandby string no The auto standby timer: off, or 15m, 30m, 60m, 2h, 4h, or 8h.
speakerPreset integer no The speaker preset, 1 through 4.
audioInputMode string no The audio input mode: auto, hdmi, digital, or analog.
videoSelect string no The video source the receiver selects, a name it already knows, or off.
bluetoothTransmitter string no The Bluetooth transmitter: on or off.
bluetoothOutput string no The Bluetooth output: speakers or bluetooth.

spec.denon.settings.tone

The tone control and the two trims, in display units where 0dB is neutral.

Field Type Required Description
control boolean no Whether the tone trims apply. False bypasses them.
bass integer no The bass trim, 12dB on each side of neutral.
treble integer no The treble trim, 12dB on each side of neutral.

spec.denon.settings.audyssey

The Audyssey room correction settings.

Field Type Required Description
multeq string no The MultEQ mode: reference, l/r bypass, flat, manual, or off.
dynamicEq boolean no Whether Dynamic EQ is on.
referenceLevelOffset integer no The reference level offset, in dB, one of 0, 5, 10, or 15. One of: 0, 5, 10, 15.
dynamicVolume string no The Dynamic Volume mode, such as off, light, medium, or heavy.
loudnessManagement boolean no Whether Loudness Management is on.

spec.denon.settings.audio

The audio processing settings.

Field Type Required Description
drc string no The Dynamic Range mode: off, auto, low, mid, or hi.
lfe integer no The LFE level, a cut from 0dB down to 10dB.
effect integer no The effect level.
delay integer no The delay, 0 to 999 milliseconds.
audioDelay integer no The audio delay, 0 to 999 milliseconds.
subwoofer boolean no Whether the subwoofer is on.
restorer string no The Audio Restorer mode: off, low, medium, or high.
graphicEq string no The Graphic EQ: off or on.
headphoneEq string no The Headphone EQ: off or on.
speakerVirtualizer boolean no Whether the Speaker Virtualizer is on.
dialogEnhancer string no The Dialog Enhancer level: off, low, mid, or high.

spec.denon.settings.hdmi

The HDMI setup, the receiver’s Video > HDMI Setup menu, with its HDMI-CEC switches.

Field Type Required Description
audioOut string no Where HDMI audio plays: avr for the receiver’s own amplifier, or tv. One of: avr, tv.
passThrough boolean no Whether HDMI Pass Through sends a source to the TV while the receiver is in standby.
passThroughSource string no The source that passes through in standby: last for the last source selected, or hdmi1 to hdmi7 for one HDMI input jack. The receiver offers only the jacks that have a source assigned. One of: last, hdmi1, hdmi2, hdmi3, hdmi4, hdmi5, hdmi6, hdmi7.
rcSourceSelect string no What a source button on the remote does while the receiver is in standby: powerOnAndSource turns the receiver on and selects the source, and sourceSelectOnly selects the source for pass through and leaves the receiver in standby. One of: powerOnAndSource, sourceSelectOnly.
control boolean no Whether HDMI Control, the receiver’s HDMI-CEC switch, is on.
arc boolean no Whether the Audio Return Channel is on. It needs HDMI Control.
tvAudioSwitching boolean no Whether the receiver selects the TV input when the TV plays its own sound over HDMI Control.
powerOffControl string no Which devices the TV’s power off turns off over HDMI Control: all, video, or off. One of: all, video, off.
powerSaving boolean no Whether HDMI Control’s power saving is on.

spec.wiim

The receiver answers the WiiM/LinkPlay control protocol over unauthenticated HTTPS on port 443. Every request is a GET to /httpapi.asp?command=, and the device’s own LinkPlay UUID is the identity the operator checks before it drives anything. The operator drives only a WiiM. Network discovery creates a Receiver only for a device whose UPnP description names a modelName that begins with WiiM, and the driver drives only a device whose getStatusEx project begins with WiiM, both in any letter case. Another brand on the LinkPlay platform gets getStatusEx and nothing else.

Field Type Required Description
uuid string yes The device’s LinkPlay UUID: twelve bytes of hex, the value getStatusEx returns as uuid and the first twelve bytes of the UUID mDNS and SSDP advertise. It is the identity, stable across a reboot and a DHCP lease change. The operator reads the device’s uuid and compares it before it sends any command, so an address that moved never drives the wrong amp.
address string no The host name or IP address the device answers on, with an optional port. The port is 443 when absent. The address is a hint and never the identity: the operator still matches the uuid. Optional while network discovery is on, because discovery resolves the UUID to an address on its own. With the operator’s EQUIPMENT_NETWORK_DISCOVERY set to off, nothing resolves the UUID, so a WiiM receiver needs this field. With no address from either, the receiver is unreachable.
settings object no The device’s own settings, one family per block. The operator compares each declared field with the value the device reports and sends only a field that differs, so a restart against a device that already holds the declared values sends nothing, and a change made at the device is sent back. It sends one field at most 3 times at one declared value; a field the device still does not report at the declared value is then named in the SettingsConfirmed condition, and a new declared value, or a report of the declared value, starts the count again. An edit of another field does not start it again. A field the device does not report cannot be compared, so the operator sends it once for each change of this block: once when the spec changes the block, and after an operator restart only when the block differs from the one status.settledSettings records. An omitted key leaves the device unchanged. An empty block sends nothing.

spec.wiim.settings

The device’s own settings, one family per block. The operator compares each declared field with the value the device reports and sends only a field that differs, so a restart against a device that already holds the declared values sends nothing, and a change made at the device is sent back. It sends one field at most 3 times at one declared value; a field the device still does not report at the declared value is then named in the SettingsConfirmed condition, and a new declared value, or a report of the declared value, starts the count again. An edit of another field does not start it again. A field the device does not report cannot be compared, so the operator sends it once for each change of this block: once when the spec changes the block, and after an operator restart only when the block differs from the one status.settledSettings records. An omitted key leaves the device unchanged. An empty block sends nothing.

Field Type Required Description
audio object no The level controls the device parses.
device object no The device’s own name and its front-panel controls.

spec.wiim.settings.audio

The level controls the device parses.

Field Type Required Description
balance number no The left-right balance, -1.0 fully left to 1.0 fully right.

spec.wiim.settings.device

The device’s own name and its front-panel controls.

Field Type Required Description
name string no The device’s human label, set over the API. It is not the identity: the LinkPlay uuid is.
led boolean no Whether the status light is on.
buttons boolean no Whether the touch controls are enabled.

spec.volume

The loudest level a press may set and the distance one press moves, both in the receiver’s own scale, and who draws the volume indicator. The media operator reads max and step when it turns a press of a volume key into status.session.volumeAsk. A Denon requires max.

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. The media operator writes no volumeAsk above this value, and divides the volume the receiver reports by it to draw the level on the Player’s screen. 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.
indicator string no Who draws the volume indicator when this receiver sets a unit’s level. Player means the Player’s screens draw their volume bar. Receiver means the receiver shows its own overlay on the TV, so the Player’s screens draw no volume bar while this receiver sets the level. The media operator relays the level to the screens either way. The field applies to every protocol, and the equipment operator does not read it. One of: Player, Receiver. Default: Player.

spec.inputs[]

The receiver inputs that liken machines feed. The cluster owner declares this wiring because the operator cannot discover it. A receiver forwards one EDID on every input, so the monitor ID alone cannot distinguish two machines. Each entry therefore names its 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.
soundMode string no The sound mode the receiver selects with this input, when present. The session selects it in the same one-shot that selects the input, so a Play brings the picture and the mode together.

spec.session

The Player that currently uses the receiver, as a media operator that does not write status.session writes it. The operator reads status.session first and uses this block only while status.session is absent. A media operator applies this block with its own field manager while the Player has a screen on this receiver, and removes it afterward. The operator sets the volume only from volumeAsk, and applies powerAsk and inputAsk the same way, once for each ask. Each time active or awake changes to true, the operator waits until it has read the receiver’s own state, and then sends the power, the input, and the input’s sound mode, each only when the receiver reports another value. A session that appears while the operator runs does the same for the flags it starts with. A session that the operator finds in its first pass after a start sends nothing for its flags, because the last operator already acted on them, and only a later change to true sends. The operator does not re-assert those commands, so a person using the receiver’s remote can change them.

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.
active boolean no Whether a Play is present on the Player. When this changes to true, the receiver is powered on and its input is selected once, each only when the receiver reports another value. Changing this to false does not send a power or input command, and volumeAsk still applies. The awake field can independently trigger those commands. Absent means false.
awake boolean no Whether the room’s screen is awake. A change to true triggers the same one-shot power and input commands as active, whatever active says. A change to false sends no command to the receiver. Absent means asleep.
volumeAsk object no An ask for an absolute volume and mute, which the media operator writes for a press of a volume key. The operator applies each ask once, when at changes: it sends level as the receiver’s own volume command, and sends mute, each only when the receiver reports another value. When asks change faster than the receiver reports the volume it was last sent, the operator sends only the newest one, as soon as the receiver reports the last volume or 1 second after it was sent. An ask that the operator finds in its first pass after a start sends nothing, because a person can have turned the receiver’s knob since the ask was made. The operator does not hold the receiver to the ask, so a person using the receiver’s remote can still change the volume. The operator does not compare level with spec.volume.max; the media operator keeps its asks at or below that ceiling.
powerAsk object no An ask to turn the room on or off, which the media operator writes for a press of a power key. The operator applies each ask once, when at changes. toggle, which the remote’s power button asks, turns a room that is on off and a room that is off on. off and on, which the media operator asks for a TV remote’s Power Off Function and Power On Function, turn the room off or on only when it is not in that state already, because HDMI-CEC 1.3a, CEC 13.13.3, says each keeps the device in the state it names when repeated. When the session’s input names a Display that a Television lists, the TV’s reported power decides: a TV that reports On or ToOn means the ask turns the room off, and a TV in Standby or ToStandby means it turns the room on. No timer asks the TV for its power, so for a Television whose TV an adapter in Control finds, Reachable or not Reachable with the reason NoPower, the ask asks the CEC node workload for one read through status.session.powerReadAt, waits up to 3 seconds for status.powerRead, and decides from the Television’s status.power when no answer arrives. With no such Television, or a TV that does not answer the read and reports no power, the receiver’s power decides. A room that goes off asks the Television for standby through its status.session.standbyAt and puts the receiver in standby. A receiver with no standby command, such as a WiiM, stays on, and the log line says so. A room that comes on wakes the Television and turns the receiver on. A receiver the operator cannot reach gets nothing, and the log line says so; the TV still turns off or on when it reports its power, and the ask is dropped when it does not. The operator updates spec.power to match what the receiver did. An ask that the operator finds in its first pass after a start sends nothing.
inputAsk object no An ask for the session’s input, which the media operator writes for a press of a controller’s key. The operator applies each ask once, when at changes. ensure sends the session’s input, and the sound mode the input names, only when the receiver is on and reports another input. show does the same, and also asks the Television that shows the session’s input to show the session’s Display, through its status.session.showAt; the TV gets Image View On and Active Source only when it reports On and the session holds the room awake. Neither action turns the receiver on. An ask that the operator finds in its first pass after a start sends nothing. The InputSelected condition says whether an ensure has an input to send.

spec.session.volumeAsk

An ask for an absolute volume and mute, which the media operator writes for a press of a volume key. The operator applies each ask once, when at changes: it sends level as the receiver’s own volume command, and sends mute, each only when the receiver reports another value. When asks change faster than the receiver reports the volume it was last sent, the operator sends only the newest one, as soon as the receiver reports the last volume or 1 second after it was sent. An ask that the operator finds in its first pass after a start sends nothing, because a person can have turned the receiver’s knob since the ask was made. The operator does not hold the receiver to the ask, so a person using the receiver’s remote can still change the volume. The operator does not compare level with spec.volume.max; the media operator keeps its asks at or below that ceiling.

Field Type Required Description
level number yes The volume, in the receiver’s own scale, the scale of spec.volume.max. A Denon counts 0 to 98 in half steps, and the driver sends a level above the top of the receiver’s scale as the top.
mute boolean no Whether the receiver is muted. Absent means not muted.
at string yes When the ask was made, as an RFC 3339 time with milliseconds. A new value is a new ask.

spec.session.powerAsk

An ask to turn the room on or off, which the media operator writes for a press of a power key. The operator applies each ask once, when at changes. toggle, which the remote’s power button asks, turns a room that is on off and a room that is off on. off and on, which the media operator asks for a TV remote’s Power Off Function and Power On Function, turn the room off or on only when it is not in that state already, because HDMI-CEC 1.3a, CEC 13.13.3, says each keeps the device in the state it names when repeated. When the session’s input names a Display that a Television lists, the TV’s reported power decides: a TV that reports On or ToOn means the ask turns the room off, and a TV in Standby or ToStandby means it turns the room on. No timer asks the TV for its power, so for a Television whose TV an adapter in Control finds, Reachable or not Reachable with the reason NoPower, the ask asks the CEC node workload for one read through status.session.powerReadAt, waits up to 3 seconds for status.powerRead, and decides from the Television’s status.power when no answer arrives. With no such Television, or a TV that does not answer the read and reports no power, the receiver’s power decides. A room that goes off asks the Television for standby through its status.session.standbyAt and puts the receiver in standby. A receiver with no standby command, such as a WiiM, stays on, and the log line says so. A room that comes on wakes the Television and turns the receiver on. A receiver the operator cannot reach gets nothing, and the log line says so; the TV still turns off or on when it reports its power, and the ask is dropped when it does not. The operator updates spec.power to match what the receiver did. An ask that the operator finds in its first pass after a start sends nothing.

Field Type Required Description
action string yes toggle, on, or off. Quote on and off in YAML, as action: “on”: kubectl reads an unquoted on or off as a boolean. One of: toggle, on, off.
at string yes When the ask was made, as an RFC 3339 time with milliseconds. A new value is a new ask.

spec.session.inputAsk

An ask for the session’s input, which the media operator writes for a press of a controller’s key. The operator applies each ask once, when at changes. ensure sends the session’s input, and the sound mode the input names, only when the receiver is on and reports another input. show does the same, and also asks the Television that shows the session’s input to show the session’s Display, through its status.session.showAt; the TV gets Image View On and Active Source only when it reports On and the session holds the room awake. Neither action turns the receiver on. An ask that the operator finds in its first pass after a start sends nothing. The InputSelected condition says whether an ensure has an input to send.

Field Type Required Description
action string yes ensure for any press, and show for a press of the home key. One of: ensure, show.
at string yes When the ask was made, as an RFC 3339 time with milliseconds. A new value is a new ask.

spec.zones

The receiver’s second and third zones. Only zone2 and zone3 are valid keys, so no other key is a valid input and the driver can serve every zone this schema admits. The main zone has no entry here: spec.power and spec.session drive it. The operator sends only a declared control the zone reports at another value, with the same rules as spec.denon.settings: at most 3 sends of one control at one declared value, and a control the zone does not report is sent once for each change of spec.zones, the same way.

Field Type Required Description
zone2 object no The receiver’s second zone. Every field is optional, so a bare key just claims the zone.
zone3 object no The receiver’s third zone. Every field is optional, so a bare key just claims the zone.

spec.zones.zone2

The receiver’s second zone. Every field is optional, so a bare key just claims the zone.

Field Type Required Description
power string no The power state the operator drives this zone to. Quote On and Off in YAML. One of: On, Standby, Off.
input string no The input this zone selects, by its name in spec.inputs.
volume number no The zone’s volume in the receiver’s display units.
mute boolean no Whether this zone is muted.
sleep integer no Minutes until this zone sleeps, and zero means no sleep timer.

spec.zones.zone3

The receiver’s third zone. Every field is optional, so a bare key just claims the zone.

Field Type Required Description
power string no The power state the operator drives this zone to. Quote On and Off in YAML. One of: On, Standby, Off.
input string no The input this zone selects, by its name in spec.inputs.
volume number no The zone’s volume in the receiver’s display units.
mute boolean no Whether this zone is muted.
sleep integer no Minutes until this zone sleeps, and zero means no sleep timer.

status

What the receiver last reported, in its own units, plus the protocol’s own settings. Only the operator writes it.

Field Type Required Description
address string no The address the operator reached the receiver on: a WiiM’s is its declared address, or the address discovery found when it declares none, and a Denon’s is the declared address resolved. Empty until the operator builds the driver.
model string no The receiver’s model in its maker’s words, such as WiiM Amp or AVR-X1700H, so a person can tell which device a Receiver reaches when its name is a discovered UUID. A WiiM driver reads it from the modelName of the amp’s UPnP description on port 49152, once the amp has answered as a WiiM. A Denon driver reads it from the modelName of the receiver’s AIOS description on port 60006, which a receiver of the AVR-X 2016 generation or later serves. Empty until the driver has read it, and for a receiver that serves no description.
manufacturer string no The receiver’s maker as the same UPnP description names it, such as Denon or Marantz. A WiiM reports Linkplay Technology Inc., the platform’s maker, so the model and not this field says whether a device is a WiiM. Empty whenever status.model is empty.
driver string no The protocol driver the receiver’s spec names: denon or wiim. It is the block the operator built the driver from, so a reader sees which protocol the row is driven through. Empty until the operator builds the driver.
zones map[string]object no One entry per zone the receiver reported, keyed by the zone’s protocol name. A single-zone receiver reports main.
denon object no The Denon protocol’s own settings, in the receiver’s units: the system settings, the tone trims, the Audyssey settings, the audio settings, the HDMI setup, and the channel volumes. The driver owns this shape, and denon/AGENTS.md documents it.
wiim object no The WiiM protocol’s own observable status, in the device’s units: identity, network, playback, now-playing, audio, equalizer, timers, Bluetooth, presets, and controls. The driver owns this shape, and wiim/AGENTS.md documents it.
session object no The Player that currently uses the receiver. The media operator applies this block with its own field manager while the Player has a screen on this receiver, and removes it afterward. It is status and not spec, so a change of either flag changes no metadata.generation. The operator reads this block first and falls back to spec.session only while this block is absent, and its own status apply never states this block. The operator sets the volume only from volumeAsk, and applies powerAsk and inputAsk the same way, once for each ask. Each time active or awake changes to true, the operator waits until it has read the receiver’s own state, and then sends the power, the input, and the input’s sound mode, each only when the receiver reports another value. A Denon reports a sound mode in other words than the command that selects its family, so the operator compares the declared mode with the reported one by the command families the driver knows. A session that appears while the operator runs does the same for the flags it starts with. A session that the operator finds in its first pass after a start sends nothing for its flags, because the last operator already acted on them, and only a later change to true sends. The operator does not re-assert those commands, so a person using the receiver’s remote can change them.
settledPower string no The spec.power the operator settled: it sent the value, found the receiver already at it, or adopted the value it found when it started. A restart that finds spec.power at this value sends nothing. One of: On, Standby, Off.
settledSettings map[string]string no A digest of each declared block the operator has sent, including the fields the receiver does not report, keyed by the block’s path in the spec: spec.denon.settings, spec.wiim.settings, and spec.zones. After an operator restart, the operator sends a block’s unreported fields again only when the block’s digest differs from this one, so a restart sends nothing for a block no one changed, whatever metadata.generation says, and a new Receiver or a block edited while the operator was down sends them once.
powerGeneration integer no The record an earlier operator wrote of the metadata.generation whose spec.power it settled. The operator does not read or write it, and its first status apply removes it.
settingsGeneration integer no The record an earlier operator wrote of the metadata.generation whose declared settings it had sent. The operator reads it once, when it starts: a status that holds it and no settledSettings is from that operator, which had sent the declared blocks, so the operator records each declared block as sent and sends nothing for it. The operator does not write it, and its first status apply removes it.
conditions []object no Reachable is True only after a recent answered exchange with the receiver, never on an open socket alone. SettingsConfirmed is False, with reason NotConfirmed, while a declared setting or zone control has had its 3 sends at its declared value and the receiver still reports another value. Its message names each such field by its path in the spec. The condition is absent otherwise. InputSelected exists while a session exists. It is True, with reason SessionInput, while the receiver reports the session’s input. It is False, with reason OtherInput, while the receiver reports another input. It is Unknown, with reason Unreachable or NoInputReported, while the operator cannot reach the receiver or the receiver has reported no input.

status.zones.*

One entry per zone the receiver reported, keyed by the zone’s protocol name. A single-zone receiver reports main.

Field Type Required Description
power string no The power state the zone last reported: On, Standby, or Off. A WiiM has no standby, so it always reports On.
input string no The input the zone last reported as selected, whether liken selected it or a person did.
soundMode string no The sound mode the zone last reported, such as STEREO or MULTI CH IN.
mute boolean no Whether the zone last reported itself muted.
volume string no The zone’s volume in the receiver’s own scale. A Denon counts 0 to 98 in half steps.
volumeMax string no The last volume limit the receiver sent for this zone, 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.
sleep integer no Minutes until the zone sleeps, and zero when no sleep timer is set.

status.session

The Player that currently uses the receiver. The media operator applies this block with its own field manager while the Player has a screen on this receiver, and removes it afterward. It is status and not spec, so a change of either flag changes no metadata.generation. The operator reads this block first and falls back to spec.session only while this block is absent, and its own status apply never states this block. The operator sets the volume only from volumeAsk, and applies powerAsk and inputAsk the same way, once for each ask. Each time active or awake changes to true, the operator waits until it has read the receiver’s own state, and then sends the power, the input, and the input’s sound mode, each only when the receiver reports another value. A Denon reports a sound mode in other words than the command that selects its family, so the operator compares the declared mode with the reported one by the command families the driver knows. A session that appears while the operator runs does the same for the flags it starts with. A session that the operator finds in its first pass after a start sends nothing for its flags, because the last operator already acted on them, and only a later change to true sends. The operator does not re-assert those commands, so a person using the receiver’s remote can change them.

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.
active boolean no Whether a Play is present on the Player. When this changes to true, the receiver is powered on and its input is selected once, each only when the receiver reports another value. Changing this to false does not send a power or input command, and volumeAsk still applies. The awake field can independently trigger those commands. Absent means false.
awake boolean no Whether the room’s screen is awake. A change to true triggers the same one-shot power and input commands as active, whatever active says. A change to false sends no command to the receiver. Absent means asleep.
volumeAsk object no An ask for an absolute volume and mute, which the media operator writes for a press of a volume key. The operator applies each ask once, when at changes: it sends level as the receiver’s own volume command, and sends mute, each only when the receiver reports another value. When asks change faster than the receiver reports the volume it was last sent, the operator sends only the newest one, as soon as the receiver reports the last volume or 1 second after it was sent. An ask that the operator finds in its first pass after a start sends nothing, because a person can have turned the receiver’s knob since the ask was made. The operator does not hold the receiver to the ask, so a person using the receiver’s remote can still change the volume. The operator does not compare level with spec.volume.max; the media operator keeps its asks at or below that ceiling.
powerAsk object no An ask to turn the room on or off, which the media operator writes for a press of a power key. The operator applies each ask once, when at changes. toggle, which the remote’s power button asks, turns a room that is on off and a room that is off on. off and on, which the media operator asks for a TV remote’s Power Off Function and Power On Function, turn the room off or on only when it is not in that state already, because HDMI-CEC 1.3a, CEC 13.13.3, says each keeps the device in the state it names when repeated. When the session’s input names a Display that a Television lists, the TV’s reported power decides: a TV that reports On or ToOn means the ask turns the room off, and a TV in Standby or ToStandby means it turns the room on. No timer asks the TV for its power, so for a Television whose TV an adapter in Control finds, Reachable or not Reachable with the reason NoPower, the ask asks the CEC node workload for one read through status.session.powerReadAt, waits up to 3 seconds for status.powerRead, and decides from the Television’s status.power when no answer arrives. With no such Television, or a TV that does not answer the read and reports no power, the receiver’s power decides. A room that goes off asks the Television for standby through its status.session.standbyAt and puts the receiver in standby. A receiver with no standby command, such as a WiiM, stays on, and the log line says so. A room that comes on wakes the Television and turns the receiver on. A receiver the operator cannot reach gets nothing, and the log line says so; the TV still turns off or on when it reports its power, and the ask is dropped when it does not. The operator updates spec.power to match what the receiver did. An ask that the operator finds in its first pass after a start sends nothing.
inputAsk object no An ask for the session’s input, which the media operator writes for a press of a controller’s key. The operator applies each ask once, when at changes. ensure sends the session’s input, and the sound mode the input names, only when the receiver is on and reports another input. show does the same, and also asks the Television that shows the session’s input to show the session’s Display, through its status.session.showAt; the TV gets Image View On and Active Source only when it reports On and the session holds the room awake. Neither action turns the receiver on. An ask that the operator finds in its first pass after a start sends nothing. The InputSelected condition says whether an ensure has an input to send.

status.session.volumeAsk

An ask for an absolute volume and mute, which the media operator writes for a press of a volume key. The operator applies each ask once, when at changes: it sends level as the receiver’s own volume command, and sends mute, each only when the receiver reports another value. When asks change faster than the receiver reports the volume it was last sent, the operator sends only the newest one, as soon as the receiver reports the last volume or 1 second after it was sent. An ask that the operator finds in its first pass after a start sends nothing, because a person can have turned the receiver’s knob since the ask was made. The operator does not hold the receiver to the ask, so a person using the receiver’s remote can still change the volume. The operator does not compare level with spec.volume.max; the media operator keeps its asks at or below that ceiling.

Field Type Required Description
level number yes The volume, in the receiver’s own scale, the scale of spec.volume.max. A Denon counts 0 to 98 in half steps, and the driver sends a level above the top of the receiver’s scale as the top.
mute boolean no Whether the receiver is muted. Absent means not muted.
at string yes When the ask was made, as an RFC 3339 time with milliseconds. A new value is a new ask.

status.session.powerAsk

An ask to turn the room on or off, which the media operator writes for a press of a power key. The operator applies each ask once, when at changes. toggle, which the remote’s power button asks, turns a room that is on off and a room that is off on. off and on, which the media operator asks for a TV remote’s Power Off Function and Power On Function, turn the room off or on only when it is not in that state already, because HDMI-CEC 1.3a, CEC 13.13.3, says each keeps the device in the state it names when repeated. When the session’s input names a Display that a Television lists, the TV’s reported power decides: a TV that reports On or ToOn means the ask turns the room off, and a TV in Standby or ToStandby means it turns the room on. No timer asks the TV for its power, so for a Television whose TV an adapter in Control finds, Reachable or not Reachable with the reason NoPower, the ask asks the CEC node workload for one read through status.session.powerReadAt, waits up to 3 seconds for status.powerRead, and decides from the Television’s status.power when no answer arrives. With no such Television, or a TV that does not answer the read and reports no power, the receiver’s power decides. A room that goes off asks the Television for standby through its status.session.standbyAt and puts the receiver in standby. A receiver with no standby command, such as a WiiM, stays on, and the log line says so. A room that comes on wakes the Television and turns the receiver on. A receiver the operator cannot reach gets nothing, and the log line says so; the TV still turns off or on when it reports its power, and the ask is dropped when it does not. The operator updates spec.power to match what the receiver did. An ask that the operator finds in its first pass after a start sends nothing.

Field Type Required Description
action string yes toggle, on, or off. Quote on and off in YAML, as action: “on”: kubectl reads an unquoted on or off as a boolean. One of: toggle, on, off.
at string yes When the ask was made, as an RFC 3339 time with milliseconds. A new value is a new ask.

status.session.inputAsk

An ask for the session’s input, which the media operator writes for a press of a controller’s key. The operator applies each ask once, when at changes. ensure sends the session’s input, and the sound mode the input names, only when the receiver is on and reports another input. show does the same, and also asks the Television that shows the session’s input to show the session’s Display, through its status.session.showAt; the TV gets Image View On and Active Source only when it reports On and the session holds the room awake. Neither action turns the receiver on. An ask that the operator finds in its first pass after a start sends nothing. The InputSelected condition says whether an ensure has an input to send.

Field Type Required Description
action string yes ensure for any press, and show for a press of the home key. One of: ensure, show.
at string yes When the ask was made, as an RFC 3339 time with milliseconds. A new value is a new ask.

status.conditions[]

Reachable is True only after a recent answered exchange with the receiver, never on an open socket alone. SettingsConfirmed is False, with reason NotConfirmed, while a declared setting or zone control has had its 3 sends at its declared value and the receiver still reports another value. Its message names each such field by its path in the spec. The condition is absent otherwise. InputSelected exists while a session exists. It is True, with reason SessionInput, while the receiver reports the session’s input. It is False, with reason OtherInput, while the receiver reports another input. It is Unknown, with reason Unreachable or NoInputReported, while the operator cannot reach the receiver or the receiver has reported no input.

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 condition’s status. True is the healthy status, and Unknown means the operator cannot tell yet. One of: True, False, Unknown.
observedGeneration integer no The metadata.generation that this condition reflects.
reason string no One CamelCase word for why the condition has this status, for a program to match on. Pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$.
message string no The same reason, as a sentence for a person to read.
lastTransitionTime string yes When the status last changed. A change of the reason or the message alone does not move it.