iobroker.yamaha 2.3.2 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/yxc/object-mapper.ts"],
4
- "sourcesContent": ["import { CHANNEL_NAME_KEYS, type ObjectDef } from \"../catalog/types\";\nimport { tName, type I18nKey } from \"../i18n\";\nimport { YXC_ZONE_IDS, zonePrefix } from \"./zones\";\nimport type { YxcCapabilities } from \"./capability\";\nimport { YXC_AMP_CATALOG } from \"./catalog\";\nimport { ALARM_DAYS, DAB_FIELDS } from \"./command-mapper\";\n\n/**\n * Build a value \u2192 label dropdown map from a device-reported value list.\n *\n * @param values the allowed values\n * @returns the states map\n */\nfunction selfMap(values: readonly string[]): Record<string, string> {\n return Object.fromEntries(values.map(value => [value, value]));\n}\n\n/** The zones the adapter maps: main flat, zone2-4 each under multiroom. */\nconst ZONES: Array<{ id: string; prefix: string }> = YXC_ZONE_IDS.map(id => ({ id, prefix: zonePrefix(id) }));\n\n/** The \"now playing\" block's states (v2.0.0, one per zone): read metadata + transport buttons. */\nconst PLAYER_STATES: Array<{\n state: string;\n common: Omit<ObjectDef[\"common\"], \"name\"> & { nameKey: I18nKey; descKey?: I18nKey };\n}> = [\n {\n // What the zone is playing (the netusb source name, or `cd`) \u2014 read-only display;\n // switching happens over the zone's `input` state.\n state: \"source\",\n common: { nameKey: \"playingSource\", type: \"string\", role: \"text\", read: true, write: false },\n },\n {\n state: \"playback\",\n common: {\n // media.state is a number in the type-detector; the same 0/1/2 coding as the YNCA player.\n nameKey: \"playback\",\n type: \"number\",\n role: \"media.state\",\n read: true,\n write: false,\n states: { 0: \"Play\", 1: \"Stop\", 2: \"Pause\" },\n },\n },\n { state: \"artist\", common: { nameKey: \"artist\", type: \"string\", role: \"media.artist\", read: true, write: false } },\n { state: \"album\", common: { nameKey: \"album\", type: \"string\", role: \"media.album\", read: true, write: false } },\n { state: \"track\", common: { nameKey: \"track\", type: \"string\", role: \"media.title\", read: true, write: false } },\n // Read-only playback metadata, typed exactly like the YNCA sources so both players\n // present the same shape on one device: repeat as the media.mode.repeat number code\n // (wire off/one/all, captures-verified), shuffle as a media.mode.shuffle boolean\n // (wire knows only off/on). Writing stays with the toggle buttons \u2014 YXC has no setter.\n {\n state: \"repeat\",\n common: {\n nameKey: \"repeat\",\n type: \"number\",\n role: \"media.mode.repeat\",\n read: true,\n write: false,\n states: { 0: \"Off\", 1: \"Single\", 2: \"All\" },\n },\n },\n {\n state: \"shuffle\",\n common: { nameKey: \"shuffle\", type: \"boolean\", role: \"media.mode.shuffle\", read: true, write: false },\n },\n // Both forms of each time, from the one value the device reports: the seconds fill the\n // type detector's media-player slot (it takes nothing else), the text is what a\n // visualisation shows. The YNCA side publishes exactly the same pair, converted the other\n // way round \u2014 so the datapoints mean the same thing on every device.\n {\n state: \"elapsedTime\",\n common: {\n nameKey: \"elapsedTime\",\n descKey: \"descElapsedTime\",\n type: \"number\",\n unit: \"s\",\n role: \"media.elapsed\",\n read: true,\n write: false,\n },\n },\n {\n state: \"elapsedTimeText\",\n common: {\n nameKey: \"elapsedTimeReadable\",\n descKey: \"descElapsedTimeReadable\",\n type: \"string\",\n role: \"media.elapsed.text\",\n read: true,\n write: false,\n },\n },\n {\n state: \"totalTime\",\n common: {\n nameKey: \"totalTime\",\n descKey: \"descTotalTime\",\n type: \"number\",\n unit: \"s\",\n role: \"media.duration\",\n read: true,\n write: false,\n },\n },\n {\n state: \"totalTimeText\",\n common: {\n nameKey: \"totalTimeReadable\",\n descKey: \"descTotalTimeReadable\",\n type: \"string\",\n role: \"media.duration.text\",\n read: true,\n write: false,\n },\n },\n {\n state: \"albumArt\",\n common: { nameKey: \"albumArt\", type: \"string\", role: \"media.cover\", read: true, write: false },\n },\n // Transport buttons carry the type-detector media-player roles so a MusicCast player's\n // controls are recognised as play/pause/stop/next/prev, not generic buttons.\n { state: \"play\", common: { nameKey: \"play\", type: \"boolean\", role: \"button.play\", read: false, write: true } },\n { state: \"pause\", common: { nameKey: \"pause\", type: \"boolean\", role: \"button.pause\", read: false, write: true } },\n { state: \"stop\", common: { nameKey: \"stop\", type: \"boolean\", role: \"button.stop\", read: false, write: true } },\n { state: \"next\", common: { nameKey: \"next\", type: \"boolean\", role: \"button.next\", read: false, write: true } },\n { state: \"prev\", common: { nameKey: \"previous\", type: \"boolean\", role: \"button.prev\", read: false, write: true } },\n {\n state: \"repeatToggle\",\n common: { nameKey: \"toggleRepeat\", type: \"boolean\", role: \"button\", read: false, write: true },\n },\n {\n state: \"shuffleToggle\",\n common: { nameKey: \"toggleShuffle\", type: \"boolean\", role: \"button\", read: false, write: true },\n },\n];\n\n/**\n * Append a media-player block (channel + the shared player states) under a\n * dotted prefix. Used for every player source the device reports.\n *\n * @param objects the object list to append to\n * @param prefix the channel/state prefix (e.g. `netPlayer`, `cd`)\n * @param channelName the human-readable channel name\n */\nfunction pushPlayerBlock(objects: ObjectDef[], prefix: string, channelName: ioBroker.StringOrTranslated): void {\n objects.push({ id: prefix, type: \"channel\", common: { name: channelName } });\n for (const player of PLAYER_STATES) {\n const { nameKey: playerNameKey, descKey: playerDescKey, ...playerCommon } = player.common;\n objects.push({\n id: `${prefix}.${player.state}`,\n type: \"state\",\n common: {\n ...playerCommon,\n name: tName(playerNameKey),\n ...(playerDescKey ? { desc: tName(playerDescKey) } : {}),\n },\n });\n }\n}\n\n/**\n * Turn YXC capabilities into the unified object tree: main's functions as\n * top-level states, each additional zone as a channel with its own states. An\n * input state is added when the zone offers inputs. Player sources (netusb, cd)\n * and the tuner get their own channel. Only reported functions are created,\n * parents before children. States and their common come from {@link YXC_AMP_CATALOG}.\n *\n * @param capabilities the parsed YXC capabilities\n * @returns the object definitions to create\n */\nexport function mapYxcToObjects(capabilities: YxcCapabilities): ObjectDef[] {\n const objects: ObjectDef[] = [];\n const channels = new Set<string>();\n for (const zoneDef of ZONES) {\n const zone = capabilities.zones.find(z => z.id === zoneDef.id);\n if (!zone) {\n continue;\n }\n const hasInput = zone.inputs.length > 0;\n const entries = YXC_AMP_CATALOG.filter(entry => {\n // Device-global entries (id under multiroom.) exist once \u2014 never as a per-zone copy.\n if (zoneDef.id !== \"main\" && entry.state.startsWith(\"multiroom.\")) {\n return false;\n }\n if (entry.create.kind === \"always\") {\n return true;\n }\n if (entry.create.kind === \"input\") {\n return hasInput;\n }\n return zone.funcs.includes(entry.create.func);\n });\n // A zone needs an advertised function or an input to exist \u2014 the \"always\" status\n // fields alone (which every entry set contains) do not create a zone.\n if (!entries.some(entry => entry.create.kind !== \"always\")) {\n continue;\n }\n // Every parent \u2014 the zone channel included \u2014 is created by the per-state loop and\n // named from the shared CHANNEL_NAMES table (a zone exists only with an entry).\n for (const entry of entries) {\n const fullId = `${zoneDef.prefix}${entry.state}`;\n const segments = fullId.split(\".\");\n for (let i = 1; i < segments.length; i++) {\n const channelId = segments.slice(0, i).join(\".\");\n if (!channels.has(channelId)) {\n channels.add(channelId);\n const segment = segments[i - 1];\n objects.push({\n id: channelId,\n type: \"channel\",\n common: {\n name: CHANNEL_NAME_KEYS[segment]\n ? tName(CHANNEL_NAME_KEYS[segment])\n : segment.charAt(0).toUpperCase() + segment.slice(1),\n },\n });\n }\n }\n const { nameKey: entryNameKey, descKey: entryDescKey, ...entryRest } = entry.common;\n const common: ObjectDef[\"common\"] = {\n ...entryRest,\n name: tName(entryNameKey),\n ...(entryDescKey ? { desc: tName(entryDescKey) } : {}),\n };\n if (entry.state === \"volume\" && zone.volumeRange) {\n common.min = zone.volumeRange.min;\n common.max = zone.volumeRange.max;\n common.step = zone.volumeRange.step;\n }\n // The device's own allowed-value lists (getFeatures) become dropdowns: the zone's\n // inputs on the input state, sound_program_list & co on their states. On a device\n // that also speaks YNCA the YNCA-owned dropdown wins via the owner policy \u2014 these\n // matter on MusicCast-only devices, where the raw string was the old poverty.\n if (entry.state === \"input\" && zone.inputs.length > 0) {\n common.states = selfMap(zone.inputs);\n }\n const valueList = zone.valueLists?.[entry.state];\n if (valueList) {\n common.states = selfMap(valueList);\n }\n objects.push({ id: fullId, type: \"state\", common });\n }\n const zoneChannelHelper = (id: string, name: ioBroker.StringOrTranslated): void => {\n if (!channels.has(id)) {\n channels.add(id);\n objects.push({ id, type: \"channel\", common: { name } });\n }\n };\n // Scene recall (#615): the zone declares `scene` + scene_num \u2014 per zone, so a\n // Zone-2 scene is first-class (the RX-V6A declares 8 for main AND zone2).\n if (zone.funcs.includes(\"scene\") && zone.sceneNum && zone.sceneNum > 0) {\n zoneChannelHelper(`${zoneDef.prefix}scene`, tName(CHANNEL_NAME_KEYS.scene ?? \"Scenes\"));\n objects.push({\n id: `${zoneDef.prefix}scene.recall`,\n type: \"state\",\n common: {\n name: tName(\"recallScene\"),\n desc: tName(\"descRecallScene\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 1,\n max: zone.sceneNum,\n step: 1,\n },\n });\n }\n // The on-screen remote (cursor pad + menu keys) \u2014 declared as zone functions\n // `cursor`/`menu`; the endpoints and their vocabulary are device-verified.\n if (zone.funcs.includes(\"cursor\") || zone.funcs.includes(\"menu\")) {\n zoneChannelHelper(`${zoneDef.prefix}remote`, tName(CHANNEL_NAME_KEYS.remote ?? \"Remote control\"));\n if (zone.funcs.includes(\"cursor\")) {\n objects.push({\n id: `${zoneDef.prefix}remote.cursor`,\n type: \"state\",\n common: {\n name: tName(\"cursorPad\"),\n type: \"string\",\n role: \"state\",\n read: false,\n write: true,\n states: selfMap([\"up\", \"down\", \"left\", \"right\", \"select\", \"return\"]),\n },\n });\n }\n if (zone.funcs.includes(\"menu\")) {\n objects.push({\n id: `${zoneDef.prefix}remote.menu`,\n type: \"state\",\n common: {\n name: tName(\"menuKey\"),\n type: \"string\",\n role: \"state\",\n read: false,\n write: true,\n states: selfMap([\"on_screen\", \"top_menu\", \"menu\", \"option\", \"display\", \"home\"]),\n },\n });\n }\n }\n // The audio-signal info (own endpoint, declared as `signal_info`): what the zone\n // currently decodes \u2014 format, sampling rate, bit depth, bitrate.\n if (zone.funcs.includes(\"signal_info\")) {\n zoneChannelHelper(`${zoneDef.prefix}sound`, tName(CHANNEL_NAME_KEYS.sound ?? \"Sound\"));\n zoneChannelHelper(`${zoneDef.prefix}sound.signal`, tName(CHANNEL_NAME_KEYS.signal ?? \"Audio signal\"));\n const signal = (\n id: string,\n name: ioBroker.StringOrTranslated,\n type: \"string\" | \"number\",\n role: \"text\" | \"value\",\n ): void => {\n objects.push({\n id: `${zoneDef.prefix}sound.signal.${id}`,\n type: \"state\",\n common: { name, type, role, read: true, write: false },\n });\n };\n signal(\"format\", tName(\"audioSignalFormat\"), \"string\", \"text\");\n signal(\"sampling\", tName(\"audioSamplingRate\"), \"string\", \"text\");\n signal(\"bits\", tName(\"audioBitDepth\"), \"string\", \"text\");\n signal(\"bitrate\", tName(\"audioBitrate\"), \"number\", \"value\");\n }\n }\n if (capabilities.media.includes(\"netusb\") || capabilities.media.includes(\"cd\")) {\n // ONE \"now playing\" block per zone (v2.0.0): the controller feeds it from\n // whichever source the zone is listening to (netusb or cd) and clears it on a\n // source switch. The source folders below keep only their genuinely own states.\n pushPlayerBlock(objects, \"player\", tName(\"mediaPlayer\"));\n for (const zone of capabilities.zones) {\n if (zone.id !== \"main\") {\n pushPlayerBlock(objects, `${zonePrefix(zone.id)}player`, tName(\"mediaPlayer\"));\n }\n }\n }\n if (capabilities.media.includes(\"netusb\")) {\n objects.push({ id: \"player.netPlayer\", type: \"channel\", common: { name: tName(\"networkPlayer\") } });\n objects.push({\n id: \"player.netPlayer.preset\",\n type: \"state\",\n common: {\n name: tName(\"recallPreset\"),\n desc: tName(\"descRecallPreset\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 1,\n },\n });\n // The favourites and recently-played lists (names included) plus the recall-by-number\n // for recents \u2014 the musiccast adapter's selection surface, on our tree.\n objects.push({\n id: \"player.netPlayer.presets\",\n type: \"state\",\n common: { name: tName(\"favouritesStoredPresets\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n objects.push({\n id: \"player.netPlayer.recent\",\n type: \"state\",\n common: { name: tName(\"recentlyPlayed\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n objects.push({\n id: \"player.netPlayer.recallRecent\",\n type: \"state\",\n common: {\n name: tName(\"recallRecentlyPlayedNumber\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 1,\n },\n });\n // MusicCast playlists and the play queue \u2014 declared in the netusb func_list.\n // Read-only surfaces: no write path for them is documented anywhere, and blind\n // writes are exactly what this adapter no longer does.\n if (capabilities.netusbFuncs?.includes(\"mc_playlist\")) {\n objects.push({\n id: \"player.netPlayer.playlists\",\n type: \"state\",\n common: { name: tName(\"musiccastPlaylists\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n }\n if (capabilities.netusbFuncs?.includes(\"play_queue\")) {\n objects.push({\n id: \"player.netPlayer.queue\",\n type: \"state\",\n common: { name: tName(\"playQueue\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n }\n }\n if (capabilities.media.includes(\"cd\")) {\n // Drive-own states only \u2014 what the disc is PLAYING shows in the flat block above.\n objects.push({ id: \"player.cd\", type: \"channel\", common: { name: tName(\"cd\") } });\n objects.push({\n id: \"player.cd.tray\",\n type: \"state\",\n common: { name: tName(\"toggleTray\"), type: \"boolean\", role: \"button\", read: false, write: true },\n });\n objects.push({\n id: \"player.cd.trackNumber\",\n type: \"state\",\n common: { name: tName(\"trackNumber\"), type: \"number\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"player.cd.totalTracks\",\n type: \"state\",\n common: { name: tName(\"totalTracks\"), type: \"number\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"player.cd.discTime\",\n type: \"state\",\n common: { name: tName(\"discTime\"), type: \"number\", unit: \"s\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"player.cd.deviceStatus\",\n type: \"state\",\n common: { name: tName(\"driveStatus\"), type: \"string\", role: \"state\", read: true, write: false },\n });\n }\n if (capabilities.media.includes(\"tuner\")) {\n objects.push({ id: \"tuner\", type: \"channel\", common: { name: tName(\"tuner\") } });\n const bandCommon: ObjectDef[\"common\"] = {\n name: tName(\"band\"),\n type: \"string\",\n role: \"state\",\n read: true,\n write: true,\n };\n const bands = capabilities.tuner?.bands ?? [];\n if (bands.length > 0) {\n bandCommon.states = selfMap(bands);\n }\n objects.push({ id: \"tuner.band\", type: \"state\", common: bandCommon });\n // Frequency in kHz \u2014 FM/AM/DAB all report kHz in getPlayInfo (FM 100900 =\n // 100.9 MHz, AM 1080, DAB 180064), verified against real device captures.\n objects.push({\n id: \"tuner.frequency\",\n type: \"state\",\n common: { name: tName(\"frequency\"), type: \"number\", unit: \"kHz\", role: \"level\", read: true, write: true },\n });\n objects.push({\n id: \"tuner.rdsText\",\n type: \"state\",\n common: {\n name: tName(\"rdsText\"),\n desc: tName(\"descRdsText\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.rdsTextB\",\n type: \"state\",\n common: {\n name: tName(\"rdsTextB\"),\n desc: tName(\"descRdsTextB\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.rdsService\",\n type: \"state\",\n common: {\n name: tName(\"rdsStation\"),\n desc: tName(\"descRdsStation\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.rdsProgramType\",\n type: \"state\",\n common: { name: tName(\"rdsProgrammeType\"), type: \"string\", role: \"text\", read: true, write: false },\n });\n // The stored-station surface: recall by number (writable), the active slot read back\n // from play info, up/down stepping, and the stored lists (with what the device knows\n // about each slot) as JSON \u2014 the selection surface the musiccast adapter offered.\n const presetCommon: ObjectDef[\"common\"] = {\n name: tName(\"presetRecallByNumber\"),\n desc: tName(\"descPresetRecallByNumber\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 0,\n };\n if (capabilities.tuner?.presetNum) {\n presetCommon.max = capabilities.tuner.presetNum;\n }\n objects.push({ id: \"tuner.preset\", type: \"state\", common: presetCommon });\n objects.push({\n id: \"tuner.presetUp\",\n type: \"state\",\n common: { name: tName(\"nextPreset\"), type: \"boolean\", role: \"button\", read: false, write: true },\n });\n objects.push({\n id: \"tuner.presetDown\",\n type: \"state\",\n common: { name: tName(\"previousPreset\"), type: \"boolean\", role: \"button\", read: false, write: true },\n });\n objects.push({\n id: \"tuner.presets\",\n type: \"state\",\n common: { name: tName(\"storedPresets\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n objects.push({\n id: \"tuner.tuned\",\n type: \"state\",\n common: { name: tName(\"tuned\"), type: \"boolean\", role: \"indicator\", read: true, write: false },\n });\n objects.push({\n id: \"tuner.audioMode\",\n type: \"state\",\n common: {\n name: tName(\"audioMode\"),\n desc: tName(\"descAudioMode\"),\n type: \"string\",\n role: \"state\",\n read: true,\n write: false,\n },\n });\n if (bands.includes(\"dab\")) {\n objects.push({ id: \"tuner.dab\", type: \"channel\", common: { name: tName(\"dab\") } });\n for (const field of DAB_FIELDS) {\n objects.push({\n id: field.id,\n type: \"state\",\n common: {\n name: tName(field.nameKey),\n ...(field.descKey ? { desc: tName(field.descKey) } : {}),\n type: field.type,\n role: field.type === \"boolean\" ? \"indicator\" : field.type === \"number\" ? \"value\" : \"text\",\n read: true,\n write: false,\n },\n });\n }\n }\n }\n if (capabilities.clock) {\n // The clock/alarm block, as the musiccast adapter showed it \u2014 read-only display\n // (the predecessor's clock datapoints had no working write path either); the\n // devices that report it are the desk-audio/clock models.\n objects.push({ id: \"clock\", type: \"channel\", common: { name: tName(\"clockAlarm\") } });\n objects.push({\n id: \"clock.autoSync\",\n type: \"state\",\n common: { name: tName(\"automaticTimeSync\"), type: \"boolean\", role: \"indicator\", read: true, write: false },\n });\n objects.push({\n id: \"clock.format\",\n type: \"state\",\n common: { name: tName(\"clockFormat\"), type: \"string\", role: \"state\", read: true, write: false },\n });\n objects.push({ id: \"clock.alarm\", type: \"channel\", common: { name: tName(\"alarm\") } });\n objects.push({\n id: \"clock.alarm.on\",\n type: \"state\",\n common: { name: tName(\"alarmArmed\"), type: \"boolean\", role: \"indicator\", read: true, write: false },\n });\n const volumeCommon: ObjectDef[\"common\"] = {\n name: tName(\"alarmVolume\"),\n type: \"number\",\n role: \"value\",\n read: true,\n write: false,\n };\n if (capabilities.clock.alarmVolumeRange) {\n volumeCommon.min = capabilities.clock.alarmVolumeRange.min;\n volumeCommon.max = capabilities.clock.alarmVolumeRange.max;\n }\n objects.push({ id: \"clock.alarm.volume\", type: \"state\", common: volumeCommon });\n objects.push({\n id: \"clock.alarm.fadeInterval\",\n type: \"state\",\n common: { name: tName(\"fadeInTime\"), type: \"number\", unit: \"s\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"clock.alarm.fadeType\",\n type: \"state\",\n common: { name: tName(\"fadeType\"), type: \"number\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"clock.alarm.mode\",\n type: \"state\",\n common: { name: tName(\"alarmMode\"), type: \"string\", role: \"state\", read: true, write: false },\n });\n objects.push({\n id: \"clock.alarm.repeat\",\n type: \"state\",\n common: { name: tName(\"repeatSnooze\"), type: \"boolean\", role: \"indicator\", read: true, write: false },\n });\n const detailChannels = [\"oneday\", ...(capabilities.clock.alarmModes.includes(\"weekly\") ? ALARM_DAYS : [])];\n for (const channel of detailChannels) {\n // The weekday channels are named by the device; only the fixed one-day channel translates.\n const label: ioBroker.StringOrTranslated =\n channel === \"oneday\" ? tName(\"oneDayAlarm\") : channel.charAt(0).toUpperCase() + channel.slice(1);\n objects.push({ id: `clock.alarm.${channel}`, type: \"channel\", common: { name: label } });\n const detail = (\n id: string,\n name: ioBroker.StringOrTranslated,\n type: \"boolean\" | \"number\" | \"string\",\n role: string,\n ): void => {\n objects.push({\n id: `clock.alarm.${channel}.${id}`,\n type: \"state\",\n common: { name, type, role, read: true, write: false },\n });\n };\n detail(\"enable\", tName(\"enabled\"), \"boolean\", \"indicator\");\n detail(\"time\", tName(\"alarmTime\"), \"string\", \"text\");\n detail(\"beep\", tName(\"beep\"), \"boolean\", \"indicator\");\n detail(\"playbackType\", tName(\"playbackType\"), \"string\", \"state\");\n detail(\"resumeInput\", tName(\"resumeInput\"), \"string\", \"state\");\n detail(\"presetType\", tName(\"presetType\"), \"string\", \"state\");\n detail(\"presetNumber\", tName(\"presetNumber\"), \"number\", \"value\");\n detail(\"presetInput\", tName(\"presetSource\"), \"string\", \"state\");\n }\n }\n if (capabilities.hasDistribution) {\n // The MusicCast-Link states live in their own folder so the tree itself tells the\n // scope: directly under multiroom = all zones of this device, group = linked devices.\n // Both channels already exist: the main zone's always-created\n // multiroom.group.streamingEnabled state brought them in through the parent loop.\n const distState = (id: string, name: ioBroker.StringOrTranslated, role: string): void => {\n objects.push({\n id: `multiroom.group.${id}`,\n type: \"state\",\n common: { name, type: \"string\", role, read: true, write: false },\n });\n };\n distState(\"role\", tName(\"roleServerClient\"), \"state\");\n distState(\"id\", tName(\"groupID\"), \"text\");\n distState(\"name\", tName(\"groupName\"), \"text\");\n distState(\"serverZone\", tName(\"serverZoneFeedsTheGroup\"), \"text\");\n distState(\"linkedDevices\", tName(\"linkedDevices\"), \"json\");\n objects.push({\n id: \"multiroom.group.leave\",\n type: \"state\",\n common: { name: tName(\"leaveGroup\"), type: \"boolean\", role: \"button\", read: false, write: true },\n });\n objects.push({\n id: \"multiroom.group.linkDevice\",\n type: \"state\",\n common: { name: tName(\"linkADeviceItsIP\"), type: \"string\", role: \"text\", read: false, write: true },\n });\n }\n return objects;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { CHANNEL_NAME_KEYS, type ObjectDef } from \"../catalog/types\";\nimport { tName, type I18nKey } from \"../i18n\";\nimport { YXC_ZONE_IDS, zonePrefix } from \"./zones\";\nimport type { YxcCapabilities } from \"./capability\";\nimport { YXC_AMP_CATALOG } from \"./catalog\";\nimport { ALARM_DAYS, DAB_FIELDS } from \"./command-mapper\";\n\n/**\n * Build a value \u2192 label dropdown map from a device-reported value list.\n *\n * @param values the allowed values\n * @returns the states map\n */\nfunction selfMap(values: readonly string[]): Record<string, string> {\n return Object.fromEntries(values.map(value => [value, value]));\n}\n\n/** The zones the adapter maps: main flat, zone2-4 each under multiroom. */\nconst ZONES: Array<{ id: string; prefix: string }> = YXC_ZONE_IDS.map(id => ({ id, prefix: zonePrefix(id) }));\n\n/** The \"now playing\" block's states (v2.0.0, one per zone): read metadata + transport buttons. */\nconst PLAYER_STATES: Array<{\n state: string;\n common: Omit<ObjectDef[\"common\"], \"name\"> & { nameKey: I18nKey; descKey?: I18nKey };\n}> = [\n {\n // What the zone is playing (the netusb source name, or `cd`) \u2014 read-only display;\n // switching happens over the zone's `input` state.\n state: \"source\",\n common: {\n nameKey: \"playingSource\",\n descKey: \"descPlayingSource\",\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n },\n {\n state: \"playback\",\n common: {\n // media.state is a number in the type-detector; the same 0/1/2 coding as the YNCA player.\n nameKey: \"playback\",\n type: \"number\",\n role: \"media.state\",\n read: true,\n write: false,\n states: { 0: \"Play\", 1: \"Stop\", 2: \"Pause\" },\n },\n },\n { state: \"artist\", common: { nameKey: \"artist\", type: \"string\", role: \"media.artist\", read: true, write: false } },\n { state: \"album\", common: { nameKey: \"album\", type: \"string\", role: \"media.album\", read: true, write: false } },\n { state: \"track\", common: { nameKey: \"track\", type: \"string\", role: \"media.title\", read: true, write: false } },\n // Read-only playback metadata, typed exactly like the YNCA sources so both players\n // present the same shape on one device: repeat as the media.mode.repeat number code\n // (wire off/one/all, captures-verified), shuffle as a media.mode.shuffle boolean\n // (wire knows only off/on). Writing stays with the toggle buttons \u2014 YXC has no setter.\n {\n state: \"repeat\",\n common: {\n nameKey: \"repeat\",\n type: \"number\",\n role: \"media.mode.repeat\",\n read: true,\n write: false,\n states: { 0: \"Off\", 1: \"Single\", 2: \"All\" },\n },\n },\n {\n state: \"shuffle\",\n common: { nameKey: \"shuffle\", type: \"boolean\", role: \"media.mode.shuffle\", read: true, write: false },\n },\n // Both forms of each time, from the one value the device reports: the seconds fill the\n // type detector's media-player slot (it takes nothing else), the text is what a\n // visualisation shows. The YNCA side publishes exactly the same pair, converted the other\n // way round \u2014 so the datapoints mean the same thing on every device.\n {\n state: \"elapsedTime\",\n common: {\n nameKey: \"elapsedTime\",\n descKey: \"descElapsedTime\",\n type: \"number\",\n unit: \"s\",\n role: \"media.elapsed\",\n read: true,\n write: false,\n },\n },\n {\n state: \"elapsedTimeText\",\n common: {\n nameKey: \"elapsedTimeReadable\",\n descKey: \"descElapsedTimeReadable\",\n type: \"string\",\n role: \"media.elapsed.text\",\n read: true,\n write: false,\n },\n },\n {\n state: \"totalTime\",\n common: {\n nameKey: \"totalTime\",\n descKey: \"descTotalTime\",\n type: \"number\",\n unit: \"s\",\n role: \"media.duration\",\n read: true,\n write: false,\n },\n },\n {\n state: \"totalTimeText\",\n common: {\n nameKey: \"totalTimeReadable\",\n descKey: \"descTotalTimeReadable\",\n type: \"string\",\n role: \"media.duration.text\",\n read: true,\n write: false,\n },\n },\n {\n state: \"albumArt\",\n common: { nameKey: \"albumArt\", type: \"string\", role: \"media.cover\", read: true, write: false },\n },\n // Transport buttons carry the type-detector media-player roles so a MusicCast player's\n // controls are recognised as play/pause/stop/next/prev, not generic buttons.\n { state: \"play\", common: { nameKey: \"play\", type: \"boolean\", role: \"button.play\", read: false, write: true } },\n { state: \"pause\", common: { nameKey: \"pause\", type: \"boolean\", role: \"button.pause\", read: false, write: true } },\n { state: \"stop\", common: { nameKey: \"stop\", type: \"boolean\", role: \"button.stop\", read: false, write: true } },\n { state: \"next\", common: { nameKey: \"next\", type: \"boolean\", role: \"button.next\", read: false, write: true } },\n { state: \"prev\", common: { nameKey: \"previous\", type: \"boolean\", role: \"button.prev\", read: false, write: true } },\n {\n state: \"repeatToggle\",\n common: { nameKey: \"toggleRepeat\", type: \"boolean\", role: \"button\", read: false, write: true },\n },\n {\n state: \"shuffleToggle\",\n common: { nameKey: \"toggleShuffle\", type: \"boolean\", role: \"button\", read: false, write: true },\n },\n];\n\n/**\n * Append a media-player block (channel + the shared player states) under a\n * dotted prefix. Used for every player source the device reports.\n *\n * @param objects the object list to append to\n * @param prefix the channel/state prefix (e.g. `netPlayer`, `cd`)\n * @param channelName the human-readable channel name\n */\nfunction pushPlayerBlock(objects: ObjectDef[], prefix: string, channelName: ioBroker.StringOrTranslated): void {\n objects.push({ id: prefix, type: \"channel\", common: { name: channelName } });\n for (const player of PLAYER_STATES) {\n const { nameKey: playerNameKey, descKey: playerDescKey, ...playerCommon } = player.common;\n objects.push({\n id: `${prefix}.${player.state}`,\n type: \"state\",\n common: {\n ...playerCommon,\n name: tName(playerNameKey),\n ...(playerDescKey ? { desc: tName(playerDescKey) } : {}),\n },\n });\n }\n}\n\n/**\n * Turn YXC capabilities into the unified object tree: main's functions as\n * top-level states, each additional zone as a channel with its own states. An\n * input state is added when the zone offers inputs. Player sources (netusb, cd)\n * and the tuner get their own channel. Only reported functions are created,\n * parents before children. States and their common come from {@link YXC_AMP_CATALOG}.\n *\n * @param capabilities the parsed YXC capabilities\n * @returns the object definitions to create\n */\nexport function mapYxcToObjects(capabilities: YxcCapabilities): ObjectDef[] {\n const objects: ObjectDef[] = [];\n const channels = new Set<string>();\n for (const zoneDef of ZONES) {\n const zone = capabilities.zones.find(z => z.id === zoneDef.id);\n if (!zone) {\n continue;\n }\n const hasInput = zone.inputs.length > 0;\n const entries = YXC_AMP_CATALOG.filter(entry => {\n // Device-global entries (id under multiroom.) exist once \u2014 never as a per-zone copy.\n if (zoneDef.id !== \"main\" && entry.state.startsWith(\"multiroom.\")) {\n return false;\n }\n if (entry.create.kind === \"always\") {\n return true;\n }\n if (entry.create.kind === \"input\") {\n return hasInput;\n }\n return zone.funcs.includes(entry.create.func);\n });\n // A zone needs an advertised function or an input to exist \u2014 the \"always\" status\n // fields alone (which every entry set contains) do not create a zone.\n if (!entries.some(entry => entry.create.kind !== \"always\")) {\n continue;\n }\n // Every parent \u2014 the zone channel included \u2014 is created by the per-state loop and\n // named from the shared CHANNEL_NAMES table (a zone exists only with an entry).\n for (const entry of entries) {\n const fullId = `${zoneDef.prefix}${entry.state}`;\n const segments = fullId.split(\".\");\n for (let i = 1; i < segments.length; i++) {\n const channelId = segments.slice(0, i).join(\".\");\n if (!channels.has(channelId)) {\n channels.add(channelId);\n const segment = segments[i - 1];\n objects.push({\n id: channelId,\n type: \"channel\",\n common: {\n name: CHANNEL_NAME_KEYS[segment]\n ? tName(CHANNEL_NAME_KEYS[segment])\n : segment.charAt(0).toUpperCase() + segment.slice(1),\n },\n });\n }\n }\n const { nameKey: entryNameKey, descKey: entryDescKey, ...entryRest } = entry.common;\n const common: ObjectDef[\"common\"] = {\n ...entryRest,\n name: tName(entryNameKey),\n ...(entryDescKey ? { desc: tName(entryDescKey) } : {}),\n };\n if (entry.state === \"volume\" && zone.volumeRange) {\n common.min = zone.volumeRange.min;\n common.max = zone.volumeRange.max;\n common.step = zone.volumeRange.step;\n }\n // The device's own allowed-value lists (getFeatures) become dropdowns: the zone's\n // inputs on the input state, sound_program_list & co on their states. On a device\n // that also speaks YNCA the YNCA-owned dropdown wins via the owner policy \u2014 these\n // matter on MusicCast-only devices, where the raw string was the old poverty.\n if (entry.state === \"input\" && zone.inputs.length > 0) {\n common.states = selfMap(zone.inputs);\n }\n const valueList = zone.valueLists?.[entry.state];\n if (valueList) {\n common.states = selfMap(valueList);\n }\n objects.push({ id: fullId, type: \"state\", common });\n }\n const zoneChannelHelper = (id: string, name: ioBroker.StringOrTranslated): void => {\n if (!channels.has(id)) {\n channels.add(id);\n objects.push({ id, type: \"channel\", common: { name } });\n }\n };\n // Scene recall (#615): the zone declares `scene` + scene_num \u2014 per zone, so a\n // Zone-2 scene is first-class (the RX-V6A declares 8 for main AND zone2).\n if (zone.funcs.includes(\"scene\") && zone.sceneNum && zone.sceneNum > 0) {\n zoneChannelHelper(`${zoneDef.prefix}scene`, tName(CHANNEL_NAME_KEYS.scene ?? \"Scenes\"));\n objects.push({\n id: `${zoneDef.prefix}scene.recall`,\n type: \"state\",\n common: {\n name: tName(\"recallScene\"),\n desc: tName(\"descRecallScene\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 1,\n max: zone.sceneNum,\n step: 1,\n },\n });\n }\n // The on-screen remote (cursor pad + menu keys) \u2014 declared as zone functions\n // `cursor`/`menu`; the endpoints and their vocabulary are device-verified.\n if (zone.funcs.includes(\"cursor\") || zone.funcs.includes(\"menu\")) {\n zoneChannelHelper(`${zoneDef.prefix}remote`, tName(CHANNEL_NAME_KEYS.remote ?? \"Remote control\"));\n if (zone.funcs.includes(\"cursor\")) {\n objects.push({\n id: `${zoneDef.prefix}remote.cursor`,\n type: \"state\",\n common: {\n name: tName(\"cursorPad\"),\n desc: tName(\"descCursorPad\"),\n type: \"string\",\n role: \"state\",\n read: false,\n write: true,\n states: selfMap([\"up\", \"down\", \"left\", \"right\", \"select\", \"return\"]),\n },\n });\n }\n if (zone.funcs.includes(\"menu\")) {\n objects.push({\n id: `${zoneDef.prefix}remote.menu`,\n type: \"state\",\n common: {\n name: tName(\"menuKey\"),\n desc: tName(\"descMenuKey\"),\n type: \"string\",\n role: \"state\",\n read: false,\n write: true,\n states: selfMap([\"on_screen\", \"top_menu\", \"menu\", \"option\", \"display\", \"home\"]),\n },\n });\n }\n }\n // The audio-signal info (own endpoint, declared as `signal_info`): what the zone\n // currently decodes \u2014 format, sampling rate, bit depth, bitrate.\n if (zone.funcs.includes(\"signal_info\")) {\n zoneChannelHelper(`${zoneDef.prefix}sound`, tName(CHANNEL_NAME_KEYS.sound ?? \"Sound\"));\n zoneChannelHelper(`${zoneDef.prefix}sound.signal`, tName(CHANNEL_NAME_KEYS.signal ?? \"Audio signal\"));\n const signal = (\n id: string,\n name: ioBroker.StringOrTranslated,\n type: \"string\" | \"number\",\n role: \"text\" | \"value\",\n ): void => {\n objects.push({\n id: `${zoneDef.prefix}sound.signal.${id}`,\n type: \"state\",\n common: { name, type, role, read: true, write: false },\n });\n };\n signal(\"format\", tName(\"audioSignalFormat\"), \"string\", \"text\");\n signal(\"sampling\", tName(\"audioSamplingRate\"), \"string\", \"text\");\n signal(\"bits\", tName(\"audioBitDepth\"), \"string\", \"text\");\n signal(\"bitrate\", tName(\"audioBitrate\"), \"number\", \"value\");\n }\n }\n if (capabilities.media.includes(\"netusb\") || capabilities.media.includes(\"cd\")) {\n // ONE \"now playing\" block per zone (v2.0.0): the controller feeds it from\n // whichever source the zone is listening to (netusb or cd) and clears it on a\n // source switch. The source folders below keep only their genuinely own states.\n pushPlayerBlock(objects, \"player\", tName(\"mediaPlayer\"));\n for (const zone of capabilities.zones) {\n if (zone.id !== \"main\") {\n pushPlayerBlock(objects, `${zonePrefix(zone.id)}player`, tName(\"mediaPlayer\"));\n }\n }\n }\n if (capabilities.media.includes(\"netusb\")) {\n objects.push({ id: \"player.netPlayer\", type: \"channel\", common: { name: tName(\"networkPlayer\") } });\n objects.push({\n id: \"player.netPlayer.preset\",\n type: \"state\",\n common: {\n name: tName(\"recallPreset\"),\n desc: tName(\"descRecallPreset\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 1,\n },\n });\n // The favourites and recently-played lists (names included) plus the recall-by-number\n // for recents \u2014 the musiccast adapter's selection surface, on our tree.\n objects.push({\n id: \"player.netPlayer.presets\",\n type: \"state\",\n common: { name: tName(\"favouritesStoredPresets\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n objects.push({\n id: \"player.netPlayer.recent\",\n type: \"state\",\n common: { name: tName(\"recentlyPlayed\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n objects.push({\n id: \"player.netPlayer.recallRecent\",\n type: \"state\",\n common: {\n name: tName(\"recallRecentlyPlayedNumber\"),\n desc: tName(\"descRecallRecentlyPlayedNumber\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 1,\n },\n });\n // MusicCast playlists and the play queue \u2014 declared in the netusb func_list.\n // Read-only surfaces: no write path for them is documented anywhere, and blind\n // writes are exactly what this adapter no longer does.\n if (capabilities.netusbFuncs?.includes(\"mc_playlist\")) {\n objects.push({\n id: \"player.netPlayer.playlists\",\n type: \"state\",\n common: { name: tName(\"musiccastPlaylists\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n }\n if (capabilities.netusbFuncs?.includes(\"play_queue\")) {\n objects.push({\n id: \"player.netPlayer.queue\",\n type: \"state\",\n common: { name: tName(\"playQueue\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n }\n }\n if (capabilities.media.includes(\"cd\")) {\n // Drive-own states only \u2014 what the disc is PLAYING shows in the flat block above.\n objects.push({ id: \"player.cd\", type: \"channel\", common: { name: tName(\"cd\") } });\n objects.push({\n id: \"player.cd.tray\",\n type: \"state\",\n common: {\n name: tName(\"toggleTray\"),\n desc: tName(\"descToggleTray\"),\n type: \"boolean\",\n role: \"button\",\n read: false,\n write: true,\n },\n });\n objects.push({\n id: \"player.cd.trackNumber\",\n type: \"state\",\n common: { name: tName(\"trackNumber\"), type: \"number\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"player.cd.totalTracks\",\n type: \"state\",\n common: { name: tName(\"totalTracks\"), type: \"number\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"player.cd.discTime\",\n type: \"state\",\n common: { name: tName(\"discTime\"), type: \"number\", unit: \"s\", role: \"value\", read: true, write: false },\n });\n objects.push({\n id: \"player.cd.deviceStatus\",\n type: \"state\",\n common: {\n name: tName(\"driveStatus\"),\n desc: tName(\"descDriveStatus\"),\n type: \"string\",\n role: \"state\",\n read: true,\n write: false,\n },\n });\n }\n if (capabilities.media.includes(\"tuner\")) {\n objects.push({ id: \"tuner\", type: \"channel\", common: { name: tName(\"tuner\") } });\n const bandCommon: ObjectDef[\"common\"] = {\n name: tName(\"band\"),\n type: \"string\",\n role: \"state\",\n read: true,\n write: true,\n };\n const bands = capabilities.tuner?.bands ?? [];\n if (bands.length > 0) {\n bandCommon.states = selfMap(bands);\n }\n objects.push({ id: \"tuner.band\", type: \"state\", common: bandCommon });\n // Frequency in kHz \u2014 FM/AM/DAB all report kHz in getPlayInfo (FM 100900 =\n // 100.9 MHz, AM 1080, DAB 180064), verified against real device captures.\n objects.push({\n id: \"tuner.frequency\",\n type: \"state\",\n common: { name: tName(\"frequency\"), type: \"number\", unit: \"kHz\", role: \"level\", read: true, write: true },\n });\n objects.push({\n id: \"tuner.rdsText\",\n type: \"state\",\n common: {\n name: tName(\"rdsText\"),\n desc: tName(\"descRdsText\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.rdsTextB\",\n type: \"state\",\n common: {\n name: tName(\"rdsTextB\"),\n desc: tName(\"descRdsTextB\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.rdsService\",\n type: \"state\",\n common: {\n name: tName(\"rdsStation\"),\n desc: tName(\"descRdsStation\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.rdsProgramType\",\n type: \"state\",\n common: {\n name: tName(\"rdsProgrammeType\"),\n desc: tName(\"descRdsProgramType\"),\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n });\n // The stored-station surface: recall by number (writable), the active slot read back\n // from play info, up/down stepping, and the stored lists (with what the device knows\n // about each slot) as JSON \u2014 the selection surface the musiccast adapter offered.\n const presetCommon: ObjectDef[\"common\"] = {\n name: tName(\"presetRecallByNumber\"),\n desc: tName(\"descPresetRecallByNumber\"),\n type: \"number\",\n role: \"level\",\n read: true,\n write: true,\n min: 0,\n };\n if (capabilities.tuner?.presetNum) {\n presetCommon.max = capabilities.tuner.presetNum;\n }\n objects.push({ id: \"tuner.preset\", type: \"state\", common: presetCommon });\n objects.push({\n id: \"tuner.presetUp\",\n type: \"state\",\n common: { name: tName(\"nextPreset\"), type: \"boolean\", role: \"button\", read: false, write: true },\n });\n objects.push({\n id: \"tuner.presetDown\",\n type: \"state\",\n common: { name: tName(\"previousPreset\"), type: \"boolean\", role: \"button\", read: false, write: true },\n });\n objects.push({\n id: \"tuner.presets\",\n type: \"state\",\n common: { name: tName(\"storedPresets\"), type: \"string\", role: \"json\", read: true, write: false },\n });\n objects.push({\n id: \"tuner.tuned\",\n type: \"state\",\n common: {\n name: tName(\"tuned\"),\n desc: tName(\"descTunedToAStation\"),\n type: \"boolean\",\n role: \"indicator\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"tuner.audioMode\",\n type: \"state\",\n common: {\n name: tName(\"audioMode\"),\n desc: tName(\"descAudioMode\"),\n type: \"string\",\n role: \"state\",\n read: true,\n write: false,\n },\n });\n if (bands.includes(\"dab\")) {\n objects.push({ id: \"tuner.dab\", type: \"channel\", common: { name: tName(\"dab\") } });\n for (const field of DAB_FIELDS) {\n objects.push({\n id: field.id,\n type: \"state\",\n common: {\n name: tName(field.nameKey),\n ...(field.descKey ? { desc: tName(field.descKey) } : {}),\n type: field.type,\n role: field.type === \"boolean\" ? \"indicator\" : field.type === \"number\" ? \"value\" : \"text\",\n read: true,\n write: false,\n },\n });\n }\n }\n }\n if (capabilities.clock) {\n // The clock/alarm block, as the musiccast adapter showed it \u2014 read-only display\n // (the predecessor's clock datapoints had no working write path either); the\n // devices that report it are the desk-audio/clock models.\n objects.push({\n id: \"clock\",\n type: \"channel\",\n common: { name: tName(\"clockAlarm\"), desc: tName(\"descClockAlarm\") },\n });\n objects.push({\n id: \"clock.autoSync\",\n type: \"state\",\n common: {\n name: tName(\"automaticTimeSync\"),\n desc: tName(\"descAutomaticTimeSync\"),\n type: \"boolean\",\n role: \"indicator\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"clock.format\",\n type: \"state\",\n common: {\n name: tName(\"clockFormat\"),\n desc: tName(\"descClockFormat\"),\n type: \"string\",\n role: \"state\",\n read: true,\n write: false,\n },\n });\n objects.push({ id: \"clock.alarm\", type: \"channel\", common: { name: tName(\"alarm\") } });\n objects.push({\n id: \"clock.alarm.on\",\n type: \"state\",\n common: { name: tName(\"alarmArmed\"), type: \"boolean\", role: \"indicator\", read: true, write: false },\n });\n const volumeCommon: ObjectDef[\"common\"] = {\n name: tName(\"alarmVolume\"),\n type: \"number\",\n role: \"value\",\n read: true,\n write: false,\n };\n if (capabilities.clock.alarmVolumeRange) {\n volumeCommon.min = capabilities.clock.alarmVolumeRange.min;\n volumeCommon.max = capabilities.clock.alarmVolumeRange.max;\n }\n objects.push({ id: \"clock.alarm.volume\", type: \"state\", common: volumeCommon });\n objects.push({\n id: \"clock.alarm.fadeInterval\",\n type: \"state\",\n common: {\n name: tName(\"fadeInTime\"),\n desc: tName(\"descFadeInTime\"),\n type: \"number\",\n unit: \"s\",\n role: \"value\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"clock.alarm.fadeType\",\n type: \"state\",\n common: {\n name: tName(\"fadeType\"),\n desc: tName(\"descFadeType\"),\n type: \"number\",\n role: \"value\",\n read: true,\n write: false,\n },\n });\n objects.push({\n id: \"clock.alarm.mode\",\n type: \"state\",\n common: { name: tName(\"alarmMode\"), type: \"string\", role: \"state\", read: true, write: false },\n });\n objects.push({\n id: \"clock.alarm.repeat\",\n type: \"state\",\n common: {\n name: tName(\"repeatSnooze\"),\n desc: tName(\"descRepeatSnooze\"),\n type: \"boolean\",\n role: \"indicator\",\n read: true,\n write: false,\n },\n });\n const detailChannels = [\"oneday\", ...(capabilities.clock.alarmModes.includes(\"weekly\") ? ALARM_DAYS : [])];\n for (const channel of detailChannels) {\n // The weekday channels are named by the device; only the fixed one-day channel translates.\n const label: ioBroker.StringOrTranslated =\n channel === \"oneday\" ? tName(\"oneDayAlarm\") : channel.charAt(0).toUpperCase() + channel.slice(1);\n objects.push({ id: `clock.alarm.${channel}`, type: \"channel\", common: { name: label } });\n const detail = (\n id: string,\n name: ioBroker.StringOrTranslated,\n type: \"boolean\" | \"number\" | \"string\",\n role: string,\n ): void => {\n objects.push({\n id: `clock.alarm.${channel}.${id}`,\n type: \"state\",\n common: { name, type, role, read: true, write: false },\n });\n };\n detail(\"enable\", tName(\"enabled\"), \"boolean\", \"indicator\");\n detail(\"time\", tName(\"alarmTime\"), \"string\", \"text\");\n detail(\"beep\", tName(\"beep\"), \"boolean\", \"indicator\");\n detail(\"playbackType\", tName(\"playbackType\"), \"string\", \"state\");\n detail(\"resumeInput\", tName(\"resumeInput\"), \"string\", \"state\");\n detail(\"presetType\", tName(\"presetType\"), \"string\", \"state\");\n detail(\"presetNumber\", tName(\"presetNumber\"), \"number\", \"value\");\n detail(\"presetInput\", tName(\"presetSource\"), \"string\", \"state\");\n }\n }\n if (capabilities.hasDistribution) {\n // The MusicCast-Link states live in their own folder so the tree itself tells the\n // scope: directly under multiroom = all zones of this device, group = linked devices.\n // Both channels already exist: the main zone's always-created\n // multiroom.group.streamingEnabled state brought them in through the parent loop.\n const distState = (id: string, name: ioBroker.StringOrTranslated, role: string): void => {\n objects.push({\n id: `multiroom.group.${id}`,\n type: \"state\",\n common: { name, type: \"string\", role, read: true, write: false },\n });\n };\n distState(\"role\", tName(\"roleServerClient\"), \"state\");\n distState(\"id\", tName(\"groupID\"), \"text\");\n distState(\"name\", tName(\"groupName\"), \"text\");\n distState(\"serverZone\", tName(\"serverZoneFeedsTheGroup\"), \"text\");\n distState(\"linkedDevices\", tName(\"linkedDevices\"), \"json\");\n objects.push({\n id: \"multiroom.group.leave\",\n type: \"state\",\n common: {\n name: tName(\"leaveGroup\"),\n desc: tName(\"descLeaveGroup\"),\n type: \"boolean\",\n role: \"button\",\n read: false,\n write: true,\n },\n });\n objects.push({\n id: \"multiroom.group.linkDevice\",\n type: \"state\",\n common: {\n name: tName(\"linkADeviceItsIP\"),\n desc: tName(\"descLinkADeviceItsIP\"),\n type: \"string\",\n role: \"text\",\n read: false,\n write: true,\n },\n });\n }\n return objects;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/build/main.js CHANGED
@@ -737,7 +737,7 @@ class Yamaha extends utils.Adapter {
737
737
  await this.setState(`${deviceId}.info.ip`, { val: ip, ack: true });
738
738
  await this.extendObject(`${deviceId}.info.transports`, {
739
739
  type: "channel",
740
- common: { name: (0, import_i18n.tName)("transports") },
740
+ common: { name: (0, import_i18n.tName)("transports"), desc: (0, import_i18n.tName)("descTransports") },
741
741
  native: {}
742
742
  });
743
743
  for (const proto of TRANSPORT_IDS) {