iobroker.arylic 0.1.0 → 0.1.1

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.
package/README.md CHANGED
@@ -94,6 +94,10 @@ every power cut.
94
94
  Placeholder for the next version (at the beginning of the line):
95
95
  ### **WORK IN PROGRESS**
96
96
  -->
97
+ ### 0.1.1 (2026-10-14)
98
+
99
+ - (Timo Schneider) readable names (English, German) for all states and channels; buttons start with a value
100
+
97
101
  ### 0.1.0 (2026-10-14)
98
102
 
99
103
  - (Timo Schneider) sound (balance, EQ, virtual bass, crossover), settings, playback buttons, network status
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "arylic",
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "news": {
6
+ "0.1.1": {
7
+ "en": "readable names (English, German) for all states and channels; buttons start with a value",
8
+ "de": "lesbare Namen (DE, EN) für alle Staaten und Kanäle; Buttons beginnen mit einem Wert",
9
+ "ru": "читаемые названия (английский, немецкий) для всех штатов и каналов; кнопки начинаются со значения",
10
+ "pt": "nomes legíveis (inglês, alemão) de todos os estados e canais; botões começam com um valor",
11
+ "nl": "leesbare namen (Engels, Duits) voor alle staten en kanalen; knoppen beginnen met een waarde",
12
+ "fr": "noms lisibles (anglais, allemand) pour tous les états et chaînes ; boutons commençant par une valeur",
13
+ "it": "nomi leggibili (inglese, tedesco) per tutti gli stati e canali; i tasti iniziano con un valore",
14
+ "es": "nombres legibles (inglés, alemán) para todos los estados y canales; los botones empiezan por un valor",
15
+ "pl": "czytelne nazwy (angielski, niemiecki) dla wszystkich stanów i kanałów; przyciski zaczynają się od wartości",
16
+ "uk": "читаються назви (англійська, німецька) для всіх штатів і каналів; кнопки починаються зі значення",
17
+ "zh-cn": "所有州和频道的可读名称(英语、德语);按钮以值开头"
18
+ },
6
19
  "0.1.0": {
7
20
  "en": "sound (balance, EQ, virtual bass, crossover), settings, playback buttons, network status\nstates grouped into `sound`, `settings`, `info`; outdated states are removed — **state ids changed**\nchoices for input and EQ preset come from the device\ndevice manager: found devices with status, details, refresh and a link to the web interface (admin 7.8.1 or newer)\nwritten values are checked: `\"false\"`/`\"0\"` count as false, numbers are limited to their range, text must not contain `;`\na device that stops answering is reconnected; an address change is picked up within 5 minutes\nthe device name comes from the device; quick button presses are no longer merged",
8
21
  "de": "Ton (Balance, EQ, Virtual Bass, Crossover), Einstellungen, Abspieltasten, Netzwerkstatus\nStatus gruppiert nach „Sound“, „Settings“, „Info“; veraltete Status werden entfernt — **Status-IDs geändert**\nEingabe und EQ-Preset wählen Sie vom Gerät\nGerätemanager: Geräte mit Status, Details, Refresh und Webinterface gefunden (Admin 7.8.1 oder neuer)\nWerte werden geprüft: `\"false\"`/`\"0\"` gelten als falsch, Zahlen sind begrenzt, Text darf nicht `;`\nGerät, das nicht mehr reagiert, wird neu verbunden; Adressänderung innerhalb von 5 Minuten\nDer Gerätename stammt vom Gerät; Schnelltasten sind nicht mehr vereint",
@@ -4,14 +4,14 @@ const { DeviceManagement } = require('@iobroker/dm-utils');
4
4
 
5
5
  // Shown below an expanded device, live from its states.
6
6
  const DETAILS = [
7
- ['IP address', 'info.ip'],
8
- ['Model', 'info.model'],
9
- ['Serial number', 'info.serial'],
10
- ['Firmware', 'info.firmware'],
11
- ['Amplifier chip', 'info.mcuVersion'],
12
- ['Input', 'source'],
13
- ['Volume', 'volume'],
14
- ['Maximum volume', 'maxVolume'],
7
+ [{ en: 'IP address', de: 'IP-Adresse' }, 'info.ip'],
8
+ [{ en: 'Model', de: 'Modell' }, 'info.model'],
9
+ [{ en: 'Serial number', de: 'Seriennummer' }, 'info.serial'],
10
+ [{ en: 'Firmware', de: 'Firmware' }, 'info.firmware'],
11
+ [{ en: 'Amplifier chip', de: 'Verstärker-Chip' }, 'info.mcuVersion'],
12
+ [{ en: 'Input', de: 'Eingang' }, 'source'],
13
+ [{ en: 'Volume', de: 'Lautstärke' }, 'volume'],
14
+ [{ en: 'Maximum volume', de: 'Höchstlautstärke' }, 'maxVolume'],
15
15
  ];
16
16
 
17
17
  const ICON =
package/lib/device.js CHANGED
@@ -108,7 +108,7 @@ class ArylicDevice {
108
108
  return this.adapter.extendObjectAsync(`${this.id}.${field.id}`, {
109
109
  type: 'state',
110
110
  common: {
111
- name: field.code || field.id.split('.').pop(),
111
+ name: field.name,
112
112
  type: kind.type,
113
113
  def: kind.def,
114
114
  read: field.kind !== 'button',
@@ -120,6 +120,8 @@ class ArylicDevice {
120
120
  }),
121
121
  );
122
122
  await this.removeLeftovers();
123
+ // Buttons are never read; without a value they look unfinished in the admin.
124
+ STATES.filter(f => f.kind === 'button').forEach(f => this.adapter.setState(`${this.id}.${f.id}`, false, true));
123
125
  // Not connected yet — whatever an earlier run left there is stale.
124
126
  this.setValue('info.connected', false);
125
127
  this.setInfo(this.info);
package/lib/fields.js CHANGED
@@ -90,63 +90,67 @@ const TEXT = { role: 'text' };
90
90
  // change at runtime. statesOf: the value is the list of choices for that field.
91
91
  // prettier-ignore
92
92
  const FIELDS = [
93
- { code: 'VOL', id: 'volume', kind: 'int', write: true, common: { role: 'level.volume', min: 0, max: 100 } },
94
- { code: 'MXV', id: 'maxVolume', kind: 'int', write: true, common: { role: 'level.volume.max', min: 30, max: 100 } },
95
- { code: 'MUT', id: 'mute', kind: 'bool', write: true, common: { role: 'media.mute' } },
96
- { code: 'SRC', id: 'source', kind: 'text', write: true, common: { role: 'media.input' } },
97
- { code: 'LST', id: 'sources', kind: 'text', write: false, once: true, statesOf: 'source', common: TEXT },
98
- { code: 'PLA', id: 'playing', kind: 'bool', write: false, common: { role: 'media.state' } },
99
- { code: 'POP', id: 'playPause', kind: 'button', write: true, common: { role: 'button' } },
100
- { code: 'STP', id: 'stop', kind: 'button', write: true, common: { role: 'button.stop' } },
101
- { code: 'NXT', id: 'next', kind: 'button', write: true, common: { role: 'button.next' } },
102
- { code: 'PRE', id: 'previous', kind: 'button', write: true, common: { role: 'button.prev' } },
103
-
104
- { code: 'BAS', id: 'sound.bass', kind: 'int', write: true, common: TONE },
105
- { code: 'MID', id: 'sound.mid', kind: 'int', write: true, common: TONE },
106
- { code: 'TRE', id: 'sound.treble', kind: 'int', write: true, common: TONE },
107
- { code: 'BAL', id: 'sound.balance', kind: 'int', write: true, common: { role: 'level', min: -100, max: 100 } },
108
- { code: 'VBS', id: 'sound.virtualBass', kind: 'bool', write: true, common: SWITCH },
109
- { code: 'EQE', id: 'sound.eqEnabled', kind: 'bool', write: true, common: SWITCH },
110
- { code: 'EQS', id: 'sound.eqPreset', kind: 'int', write: true, common: { role: 'level' } },
111
- { code: 'PEQ', id: 'sound.eqPresets', kind: 'text', write: false, once: true, statesOf: 'sound.eqPreset', common: TEXT },
112
- { code: 'CFE', id: 'sound.crossover', kind: 'bool', write: true, common: SWITCH },
113
- { code: 'CFF', id: 'sound.crossoverFrequency', kind: 'int', write: true, common: { role: 'level', min: 50, max: 300, unit: 'Hz' } },
114
-
115
- { code: 'LED', id: 'settings.led', kind: 'bool', write: true, common: SWITCH },
116
- { code: 'BEP', id: 'settings.beep', kind: 'bool', write: true, common: SWITCH },
117
- { code: 'NAM', id: 'settings.name', kind: 'hex', write: true, common: { role: 'info.name' } },
118
- { code: 'DLY', id: 'settings.muteDelay', kind: 'int', write: true, common: { role: 'level', min: 0, max: 32767, unit: 's' } },
119
- { code: 'POM', id: 'settings.powerOnSource', kind: 'text', write: true, common: TEXT },
120
- { code: 'ASW', id: 'settings.autoSwitch', kind: 'bool', write: true, common: SWITCH },
121
- { code: 'VST', id: 'settings.volumeStep', kind: 'int', write: true, common: { role: 'level', min: 0, max: 10 } },
122
- { code: 'VOF', id: 'settings.fixedVolume', kind: 'int', write: true, common: { role: 'level.volume', min: 0, max: 100 } },
123
- { code: 'SOP', id: 'settings.standbyOnPower', kind: 'bool', write: true, common: SWITCH },
124
-
125
- { code: 'IPA', id: 'info.ip', kind: 'text', write: false, common: { role: 'info.ip' } },
126
- { code: 'ETH', id: 'info.ethernet', kind: 'bool', write: false, common: { role: 'indicator.connected' } },
127
- { code: 'WIF', id: 'info.wifi', kind: 'bool', write: false, common: { role: 'indicator.connected' } },
128
- { code: 'CHN', id: 'info.multiroomChannel', kind: 'text', write: false, common: TEXT },
129
- { code: 'MRM', id: 'info.multiroomMode', kind: 'text', write: false, common: TEXT },
130
- { code: 'VER', id: 'info.mcuVersion', kind: 'text', write: false, once: true, common: { role: 'info.firmware' } },
93
+ { code: 'VOL', id: 'volume', name: { en: 'Volume', de: 'Lautstärke' }, kind: 'int', write: true, common: { role: 'level.volume', min: 0, max: 100 } },
94
+ { code: 'MXV', id: 'maxVolume', name: { en: 'Maximum volume', de: 'Höchstlautstärke' }, kind: 'int', write: true, common: { role: 'level.volume.max', min: 30, max: 100 } },
95
+ { code: 'MUT', id: 'mute', name: { en: 'Mute', de: 'Stumm' }, kind: 'bool', write: true, common: { role: 'media.mute' } },
96
+ { code: 'SRC', id: 'source', name: { en: 'Input', de: 'Eingang' }, kind: 'text', write: true, common: { role: 'media.input' } },
97
+ { code: 'LST', id: 'sources', name: { en: 'Available inputs', de: 'Verfügbare Eingänge' }, kind: 'text', write: false, once: true, statesOf: 'source', common: TEXT },
98
+ { code: 'PLA', id: 'playing', name: { en: 'Playing', de: 'Wiedergabe läuft' }, kind: 'bool', write: false, common: { role: 'media.state' } },
99
+ { code: 'POP', id: 'playPause', name: { en: 'Play/pause', de: 'Wiedergabe/Pause' }, kind: 'button', write: true, common: { role: 'button' } },
100
+ { code: 'STP', id: 'stop', name: { en: 'Stop', de: 'Stopp' }, kind: 'button', write: true, common: { role: 'button.stop' } },
101
+ { code: 'NXT', id: 'next', name: { en: 'Next track', de: 'Nächster Titel' }, kind: 'button', write: true, common: { role: 'button.next' } },
102
+ { code: 'PRE', id: 'previous', name: { en: 'Previous track', de: 'Vorheriger Titel' }, kind: 'button', write: true, common: { role: 'button.prev' } },
103
+
104
+ { code: 'BAS', id: 'sound.bass', name: { en: 'Bass', de: 'Bass' }, kind: 'int', write: true, common: TONE },
105
+ { code: 'MID', id: 'sound.mid', name: { en: 'Mid', de: 'Mitten' }, kind: 'int', write: true, common: TONE },
106
+ { code: 'TRE', id: 'sound.treble', name: { en: 'Treble', de: 'Höhen' }, kind: 'int', write: true, common: TONE },
107
+ { code: 'BAL', id: 'sound.balance', name: { en: 'Balance', de: 'Balance' }, kind: 'int', write: true, common: { role: 'level', min: -100, max: 100 } },
108
+ { code: 'VBS', id: 'sound.virtualBass', name: { en: 'Virtual bass', de: 'Virtueller Bass' }, kind: 'bool', write: true, common: SWITCH },
109
+ { code: 'EQE', id: 'sound.eqEnabled', name: { en: 'Equalizer on', de: 'Equalizer an' }, kind: 'bool', write: true, common: SWITCH },
110
+ { code: 'EQS', id: 'sound.eqPreset', name: { en: 'Equalizer preset', de: 'Equalizer-Voreinstellung' }, kind: 'int', write: true, common: { role: 'level' } },
111
+ { code: 'PEQ', id: 'sound.eqPresets', name: { en: 'Available equalizer presets', de: 'Verfügbare Equalizer-Voreinstellungen' }, kind: 'text', write: false, once: true, statesOf: 'sound.eqPreset', common: TEXT },
112
+ { code: 'CFE', id: 'sound.crossover', name: { en: 'Crossover on', de: 'Frequenzweiche an' }, kind: 'bool', write: true, common: SWITCH },
113
+ { code: 'CFF', id: 'sound.crossoverFrequency', name: { en: 'Crossover frequency', de: 'Übergangsfrequenz' }, kind: 'int', write: true, common: { role: 'level', min: 50, max: 300, unit: 'Hz' } },
114
+
115
+ { code: 'LED', id: 'settings.led', name: { en: 'LED', de: 'LED' }, kind: 'bool', write: true, common: SWITCH },
116
+ { code: 'BEP', id: 'settings.beep', name: { en: 'Confirmation tone', de: 'Bestätigungston' }, kind: 'bool', write: true, common: SWITCH },
117
+ { code: 'NAM', id: 'settings.name', name: { en: 'Device name', de: 'Gerätename' }, kind: 'hex', write: true, common: { role: 'info.name' } },
118
+ { code: 'DLY', id: 'settings.muteDelay', name: { en: 'Mute after silence', de: 'Stumm nach Stille' }, kind: 'int', write: true, common: { role: 'level', min: 0, max: 32767, unit: 's' } },
119
+ { code: 'POM', id: 'settings.powerOnSource', name: { en: 'Input after power-on', de: 'Eingang nach dem Einschalten' }, kind: 'text', write: true, common: TEXT },
120
+ { code: 'ASW', id: 'settings.autoSwitch', name: { en: 'Switch back to previous input', de: 'Zurück zum vorherigen Eingang' }, kind: 'bool', write: true, common: SWITCH },
121
+ { code: 'VST', id: 'settings.volumeStep', name: { en: 'Volume step', de: 'Lautstärke-Schrittweite' }, kind: 'int', write: true, common: { role: 'level', min: 0, max: 10 } },
122
+ { code: 'VOF', id: 'settings.fixedVolume', name: { en: 'Fixed output level', de: 'Fester Ausgangspegel' }, kind: 'int', write: true, common: { role: 'level.volume', min: 0, max: 100 } },
123
+ { code: 'SOP', id: 'settings.standbyOnPower', name: { en: 'Start in standby', de: 'Im Standby starten' }, kind: 'bool', write: true, common: SWITCH },
124
+
125
+ { code: 'IPA', id: 'info.ip', name: { en: 'IP address', de: 'IP-Adresse' }, kind: 'text', write: false, common: { role: 'info.ip' } },
126
+ { code: 'ETH', id: 'info.ethernet', name: { en: 'Ethernet connected', de: 'LAN verbunden' }, kind: 'bool', write: false, common: { role: 'indicator.connected' } },
127
+ { code: 'WIF', id: 'info.wifi', name: { en: 'Wi-Fi connected', de: 'WLAN verbunden' }, kind: 'bool', write: false, common: { role: 'indicator.connected' } },
128
+ { code: 'CHN', id: 'info.multiroomChannel', name: { en: 'Multiroom channel', de: 'Multiroom-Kanal' }, kind: 'text', write: false, common: TEXT },
129
+ { code: 'MRM', id: 'info.multiroomMode', name: { en: 'Multiroom mode', de: 'Multiroom-Modus' }, kind: 'text', write: false, common: TEXT },
130
+ { code: 'VER', id: 'info.mcuVersion', name: { en: 'Amplifier chip firmware', de: 'Firmware Verstärker-Chip' }, kind: 'text', write: false, once: true, common: { role: 'info.firmware' } },
131
131
 
132
132
  // ⚠️ Nothing over the network wakes the LA50 up again (no web UI, no command) — only the IR remote.
133
- { code: 'SYS', id: 'standby', kind: 'button', value: 'STANDBY', write: true, common: { role: 'button' } },
133
+ { code: 'SYS', id: 'standby', name: { en: 'Standby', de: 'Standby' }, kind: 'button', value: 'STANDBY', write: true, common: { role: 'button' } },
134
134
  ];
135
135
 
136
136
  // States that do not come from a UART command: the connection, and what the device
137
137
  // announces via mDNS.
138
138
  // prettier-ignore
139
139
  const EXTRA = [
140
- { id: 'info.connected', kind: 'bool', common: { role: 'indicator.reachable' } },
141
- { id: 'info.model', kind: 'text', common: TEXT },
142
- { id: 'info.serial', kind: 'text', common: TEXT },
143
- { id: 'info.firmware', kind: 'text', common: { role: 'info.firmware' } },
140
+ { id: 'info.connected', name: { en: 'Connected', de: 'Verbunden' }, kind: 'bool', common: { role: 'indicator.reachable' } },
141
+ { id: 'info.model', name: { en: 'Model', de: 'Modell' }, kind: 'text', common: TEXT },
142
+ { id: 'info.serial', name: { en: 'Serial number', de: 'Seriennummer' }, kind: 'text', common: TEXT },
143
+ { id: 'info.firmware', name: { en: 'Firmware', de: 'Firmware' }, kind: 'text', common: { role: 'info.firmware' } },
144
144
  ];
145
145
 
146
146
  /** Every state below a device; anything else there is a leftover of an older version. */
147
147
  const STATES = [...FIELDS, ...EXTRA];
148
148
 
149
- const CHANNEL_NAMES = { sound: 'Sound', settings: 'Settings', info: 'Information' };
149
+ const CHANNEL_NAMES = {
150
+ sound: { en: 'Sound', de: 'Klang' },
151
+ settings: { en: 'Settings', de: 'Einstellungen' },
152
+ info: { en: 'Information', de: 'Information' },
153
+ };
150
154
  /** Channels below the device: the first segment of every dotted state id. */
151
155
  const CHANNELS = [...new Set(STATES.filter(f => f.id.includes('.')).map(f => f.id.split('.')[0]))];
152
156
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.arylic",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Control Arylic amplifiers (LA50) over the network: volume limit, tone, input, standby",
5
5
  "author": {
6
6
  "name": "Timo Schneider",