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 +4 -0
- package/io-package.json +14 -1
- package/lib/device-management.js +8 -8
- package/lib/device.js +3 -1
- package/lib/fields.js +48 -44
- package/package.json +1 -1
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.
|
|
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",
|
package/lib/device-management.js
CHANGED
|
@@ -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.
|
|
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 = {
|
|
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
|
|