iobroker.poolcontrol 1.2.7 → 1.2.9

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
@@ -196,6 +196,14 @@ New features are added regularly – please refer to the changelog.
196
196
 
197
197
  ## Changelog
198
198
 
199
+ ### 1.2.8
200
+ Release: 19.03.2026
201
+ - fix: correct invalid common object in runtime channel.
202
+
203
+ ### 1.2.8
204
+ Release: 19.03.2026
205
+ - Fixed invalid common object in runtime channel causing admin UI crash.
206
+
199
207
  ### 1.2.7
200
208
  Released: 16.03.2026
201
209
  - Corrected role definitions for writable states according to ioBroker guidelines
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "poolcontrol",
4
- "version": "1.2.7",
4
+ "version": "1.2.9",
5
5
  "news": {
6
+ "1.2.9": {
7
+ "en": "Fixed invalid common definition in runtime states that could crash the admin objects view.",
8
+ "de": "Fehler behoben: Eine ungültige common-Definition in den Runtime-States konnte die Objektansicht im Admin abstürzen lassen.",
9
+ "ru": "Исправлено недопустимое общее определение в состояниях среды выполнения, которое могло привести к сбою представления объектов администратора.",
10
+ "pt": "Corrigida definição comum inválida em estados de tempo de execução que poderiam travar a visualização de objetos administrativos.",
11
+ "nl": "Er is een probleem opgelost met een ongeldige algemene definitie in runtime-statussen die de weergave van beheerdersobjecten konden laten crashen.",
12
+ "fr": "Correction d'une définition commune non valide dans les états d'exécution qui pouvait faire planter la vue des objets d'administration.",
13
+ "it": "Risolta la definizione comune non valida negli stati di runtime che poteva causare l'arresto anomalo della vista degli oggetti di amministrazione.",
14
+ "es": "Se corrigió una definición común no válida en estados de tiempo de ejecución que podían bloquear la vista de objetos de administración.",
15
+ "pl": "Naprawiono nieprawidłową wspólną definicję w stanach wykonawczych, która mogła powodować awarię widoku obiektów administracyjnych.",
16
+ "uk": "Виправлено недійсне загальне визначення в станах виконання, яке могло привести до збою перегляду об’єктів адміністратора.",
17
+ "zh-cn": "修复了运行时状态中无效的通用定义,该定义可能会导致管理对象视图崩溃。"
18
+ },
19
+ "1.2.8": {
20
+ "en": "Fixed invalid common object in runtime channel causing admin UI crash.",
21
+ "de": "Fehler behoben: Ungültiges common-Objekt im runtime-Kanal führte zum Absturz der Admin-Oberfläche.",
22
+ "ru": "Исправлен недопустимый общий объект в канале среды выполнения, приводивший к сбою пользовательского интерфейса администратора.",
23
+ "pt": "Corrigido objeto comum inválido no canal de tempo de execução, causando falha na interface do administrador.",
24
+ "nl": "Een probleem opgelost waarbij een ongeldig gemeenschappelijk object in het runtime-kanaal een crash van de beheerdersinterface veroorzaakte.",
25
+ "fr": "Correction d'un objet commun non valide dans le canal d'exécution provoquant un crash de l'interface utilisateur de l'administrateur.",
26
+ "it": "Risolto il problema con l'oggetto comune non valido nel canale di runtime che causava l'arresto anomalo dell'interfaccia utente di amministrazione.",
27
+ "es": "Se corrigió un objeto común no válido en el canal de tiempo de ejecución que causaba un bloqueo de la interfaz de usuario del administrador.",
28
+ "pl": "Naprawiono nieprawidłowy wspólny obiekt w kanale wykonawczym powodujący awarię interfejsu administratora.",
29
+ "uk": "Виправлено недійсний загальний об’єкт у каналі виконання, що спричиняв збій інтерфейсу адміністратора.",
30
+ "zh-cn": "修复了运行时通道中无效的公共对象导致管理 UI 崩溃的问题。"
31
+ },
6
32
  "1.2.7": {
7
33
  "en": "Corrected role definitions for writable states according to ioBroker guidelines.",
8
34
  "de": "Rollen-Definitionen für beschreibbare States gemäß ioBroker-Richtlinien korrigiert.",
@@ -54,32 +80,6 @@
54
80
  "pl": "Poprawka: aktuatorzyHelper nie synchronizowali konfiguracji instancji ze stanami wewnętrznymi (aktywny/nazwa). Nie można było aktywować dodatkowych siłowników.",
55
81
  "uk": "Виправлення: actuatorsHelper не синхронізував конфігурацію екземпляра з внутрішніми станами (активний/назва). Не вдалося активувати додаткові приводи.",
56
82
  "zh-cn": "修复:actuatorsHelper 未将实例配置与内部状态(活动/名称)同步。无法激活其他执行器。"
57
- },
58
- "1.2.3": {
59
- "en": "Replaced native timers with adapter timers and improved timer cleanup",
60
- "de": "Native Timer durch Adapter-Timer ersetzt und Timer-Cleanup verbessert",
61
- "ru": "Заменены собственные таймеры на таймеры адаптера и улучшена очистка таймера.",
62
- "pt": "Temporizadores nativos substituídos por temporizadores de adaptador e limpeza aprimorada do temporizador",
63
- "nl": "Native timers vervangen door adaptertimers en verbeterde timeropschoning",
64
- "fr": "Remplacement des minuteries natives par des minuteries d'adaptateur et un nettoyage amélioré des minuteries",
65
- "it": "Sostituiti i timer nativi con timer adattatori e migliorata la pulizia dei timer",
66
- "es": "Se reemplazaron los temporizadores nativos con temporizadores adaptadores y se mejoró la limpieza del temporizador.",
67
- "pl": "Zastąpiono liczniki czasu natywnego licznikami adaptera i ulepszono czyszczenie licznika czasu",
68
- "uk": "Вбудовані таймери замінено на адаптерні та покращено очищення таймерів",
69
- "zh-cn": "用适配器计时器替换了本机计时器并改进了计时器清理"
70
- },
71
- "1.2.2": {
72
- "en": "Maintenance update: Raised required admin version to >=7.6.20 and refreshed translations after jsonConfig i18n changes.",
73
- "de": "Wartungsupdate: Mindestversion für admin auf >=7.6.20 erhöht und Übersetzungen nach jsonConfig-i18n-Änderungen aktualisiert.",
74
- "ru": "Обновление обслуживания: требуемая версия администратора повышена до >=7.6.20 и обновлены переводы после изменений jsonConfig i18n.",
75
- "pt": "Atualização de manutenção: versão de administrador necessária aumentada para >=7.6.20 e traduções atualizadas após alterações no jsonConfig i18n.",
76
- "nl": "Onderhoudsupdate: vereiste beheerdersversie verhoogd naar >=7.6.20 en vertalingen vernieuwd na jsonConfig i18n-wijzigingen.",
77
- "fr": "Mise à jour de maintenance : augmentation de la version d'administrateur requise à >=7.6.20 et traductions actualisées après les modifications de jsonConfig i18n.",
78
- "it": "Aggiornamento di manutenzione: versione amministrativa richiesta aumentata a >=7.6.20 e traduzioni aggiornate dopo le modifiche a jsonConfig i18n.",
79
- "es": "Actualización de mantenimiento: se elevó la versión de administrador requerida a >=7.6.20 y se actualizaron las traducciones después de los cambios de jsonConfig i18n.",
80
- "pl": "Aktualizacja konserwacyjna: Podniesiono wymaganą wersję administracyjną do >= 7.6.20 i odświeżono tłumaczenia po zmianach w jsonConfig i18n.",
81
- "uk": "Оновлення обслуговування: підвищено необхідну версію адміністратора до >=7.6.20 і оновлено переклади після змін jsonConfig i18n.",
82
- "zh-cn": "维护更新:将所需的管理版本提高到> = 7.6.20,并在 jsonConfig i18n 更改后刷新翻译。"
83
83
  }
84
84
  },
85
85
  "titleLang": {
@@ -146,7 +146,8 @@
146
146
  {
147
147
  "admin": ">=7.6.20"
148
148
  }
149
- ]
149
+ ],
150
+ "installedFrom": "file:///opt/iobroker/ioBroker.poolcontrol"
150
151
  },
151
152
  "native": {
152
153
  "option1": true,
@@ -28,7 +28,7 @@ async function createActuatorsStates(adapter) {
28
28
  await adapter.setObjectNotExistsAsync('actuators', {
29
29
  type: 'channel',
30
30
  common: {
31
- name: { de: 'Zusatz-Aktoren', en: 'Additional actuators' },
31
+ name: 'Additional actuators',
32
32
  },
33
33
  native: {},
34
34
  });
@@ -39,7 +39,7 @@ async function createActuatorsStates(adapter) {
39
39
  await adapter.setObjectNotExistsAsync('actuators.lighting', {
40
40
  type: 'channel',
41
41
  common: {
42
- name: { de: 'Beleuchtung', en: 'Lighting' },
42
+ name: 'Lighting',
43
43
  },
44
44
  native: {},
45
45
  });
@@ -50,7 +50,7 @@ async function createActuatorsStates(adapter) {
50
50
  await adapter.setObjectNotExistsAsync(base, {
51
51
  type: 'channel',
52
52
  common: {
53
- name: { de: `Beleuchtung ${i}`, en: `Lighting ${i}` },
53
+ name: `Lighting ${i}`,
54
54
  },
55
55
  native: {},
56
56
  });
@@ -58,7 +58,7 @@ async function createActuatorsStates(adapter) {
58
58
  await adapter.setObjectNotExistsAsync(`${base}.switch`, {
59
59
  type: 'state',
60
60
  common: {
61
- name: { de: 'Schalten (Ein/Aus)', en: 'Switch (On/Off)' },
61
+ name: 'Switch (On/Off)',
62
62
  type: 'boolean',
63
63
  role: 'switch',
64
64
  read: true,
@@ -72,7 +72,7 @@ async function createActuatorsStates(adapter) {
72
72
  await adapter.setObjectNotExistsAsync(`${base}.active`, {
73
73
  type: 'state',
74
74
  common: {
75
- name: { de: 'Aktiv', en: 'Active' },
75
+ name: 'Active',
76
76
  type: 'boolean',
77
77
  role: 'indicator',
78
78
  read: true,
@@ -87,7 +87,7 @@ async function createActuatorsStates(adapter) {
87
87
  await adapter.setObjectNotExistsAsync(`${base}.name`, {
88
88
  type: 'state',
89
89
  common: {
90
- name: { de: 'Name', en: 'Name' },
90
+ name: 'Name',
91
91
  type: 'string',
92
92
  role: 'text',
93
93
  read: true,
@@ -102,7 +102,7 @@ async function createActuatorsStates(adapter) {
102
102
  await adapter.setObjectNotExistsAsync(`${base}.permanent`, {
103
103
  type: 'state',
104
104
  common: {
105
- name: { de: 'Dauerbetrieb', en: 'Continuous operation' },
105
+ name: 'Continuous operation',
106
106
  type: 'boolean',
107
107
  role: 'switch',
108
108
  read: true,
@@ -117,7 +117,7 @@ async function createActuatorsStates(adapter) {
117
117
  await adapter.setObjectNotExistsAsync(`${base}.runtime_minutes`, {
118
118
  type: 'state',
119
119
  common: {
120
- name: { de: 'Laufzeit (Minuten)', en: 'Runtime (minutes)' },
120
+ name: 'Runtime (minutes)',
121
121
  type: 'number',
122
122
  role: 'level',
123
123
  read: true,
@@ -133,7 +133,7 @@ async function createActuatorsStates(adapter) {
133
133
  await adapter.setObjectNotExistsAsync(`${base}.remaining_minutes`, {
134
134
  type: 'state',
135
135
  common: {
136
- name: { de: 'Restlaufzeit', en: 'Remaining runtime' },
136
+ name: 'Remaining runtime',
137
137
  type: 'number',
138
138
  role: 'value',
139
139
  read: true,
@@ -147,7 +147,7 @@ async function createActuatorsStates(adapter) {
147
147
  await adapter.setObjectNotExistsAsync(`${base}.status`, {
148
148
  type: 'state',
149
149
  common: {
150
- name: { de: 'Status', en: 'Status' },
150
+ name: 'Status',
151
151
  type: 'string',
152
152
  role: 'text',
153
153
  read: true,
@@ -164,7 +164,7 @@ async function createActuatorsStates(adapter) {
164
164
  await adapter.setObjectNotExistsAsync('actuators.extrapumps', {
165
165
  type: 'channel',
166
166
  common: {
167
- name: { de: 'Zusatzpumpen & Attraktionen', en: 'Auxiliary pumps & attractions' },
167
+ name: 'Auxiliary pumps & attractions',
168
168
  },
169
169
  native: {},
170
170
  });
@@ -175,7 +175,7 @@ async function createActuatorsStates(adapter) {
175
175
  await adapter.setObjectNotExistsAsync(base, {
176
176
  type: 'channel',
177
177
  common: {
178
- name: { de: `Zusatzpumpe / Attraktion ${i}`, en: `Auxiliary pump / attraction ${i}` },
178
+ name: `Auxiliary pump / attraction ${i}`,
179
179
  },
180
180
  native: {},
181
181
  });
@@ -183,7 +183,7 @@ async function createActuatorsStates(adapter) {
183
183
  await adapter.setObjectNotExistsAsync(`${base}.switch`, {
184
184
  type: 'state',
185
185
  common: {
186
- name: { de: 'Schalten (Ein/Aus)', en: 'Switch (On/Off)' },
186
+ name: 'Switch (On/Off)',
187
187
  type: 'boolean',
188
188
  role: 'switch',
189
189
  read: true,
@@ -197,7 +197,7 @@ async function createActuatorsStates(adapter) {
197
197
  await adapter.setObjectNotExistsAsync(`${base}.active`, {
198
198
  type: 'state',
199
199
  common: {
200
- name: { de: 'Aktiv', en: 'Active' },
200
+ name: 'Active',
201
201
  type: 'boolean',
202
202
  role: 'indicator',
203
203
  read: true,
@@ -212,7 +212,7 @@ async function createActuatorsStates(adapter) {
212
212
  await adapter.setObjectNotExistsAsync(`${base}.name`, {
213
213
  type: 'state',
214
214
  common: {
215
- name: { de: 'Name', en: 'Name' },
215
+ name: 'Name',
216
216
  type: 'string',
217
217
  role: 'text',
218
218
  read: true,
@@ -227,7 +227,7 @@ async function createActuatorsStates(adapter) {
227
227
  await adapter.setObjectNotExistsAsync(`${base}.permanent`, {
228
228
  type: 'state',
229
229
  common: {
230
- name: { de: 'Dauerbetrieb', en: 'Continuous operation' },
230
+ name: 'Continuous operation',
231
231
  type: 'boolean',
232
232
  role: 'switch',
233
233
  read: true,
@@ -242,7 +242,7 @@ async function createActuatorsStates(adapter) {
242
242
  await adapter.setObjectNotExistsAsync(`${base}.runtime_minutes`, {
243
243
  type: 'state',
244
244
  common: {
245
- name: { de: 'Laufzeit (Minuten)', en: 'Runtime (minutes)' },
245
+ name: 'Runtime (minutes)',
246
246
  type: 'number',
247
247
  role: 'level',
248
248
  read: true,
@@ -258,7 +258,7 @@ async function createActuatorsStates(adapter) {
258
258
  await adapter.setObjectNotExistsAsync(`${base}.remaining_minutes`, {
259
259
  type: 'state',
260
260
  common: {
261
- name: { de: 'Restlaufzeit', en: 'Remaining runtime' },
261
+ name: 'Remaining runtime',
262
262
  type: 'number',
263
263
  role: 'value',
264
264
  read: true,
@@ -272,7 +272,7 @@ async function createActuatorsStates(adapter) {
272
272
  await adapter.setObjectNotExistsAsync(`${base}.status`, {
273
273
  type: 'state',
274
274
  common: {
275
- name: { de: 'Status', en: 'Status' },
275
+ name: 'Status',
276
276
  type: 'string',
277
277
  role: 'text',
278
278
  read: true,
@@ -33,11 +33,7 @@ async function createAiChemistryHelpStates(adapter) {
33
33
  await adapter.setObjectNotExistsAsync('ai.chemistry_help', {
34
34
  type: 'channel',
35
35
  common: {
36
- // FIX: i18n for name
37
- name: {
38
- de: 'Chemie-Hilfe (Erklärungen & Ursachen)',
39
- en: 'Chemistry help (explanations & causes)',
40
- },
36
+ name: 'Chemistry help (explanations & causes)',
41
37
  },
42
38
  native: {},
43
39
  });
@@ -48,22 +44,13 @@ async function createAiChemistryHelpStates(adapter) {
48
44
  await adapter.setObjectNotExistsAsync('ai.chemistry_help.issue', {
49
45
  type: 'state',
50
46
  common: {
51
- // FIX: i18n for name
52
- name: {
53
- de: 'Chemie-Hilfe: Problem auswählen',
54
- en: 'Chemistry help: select issue',
55
- },
56
- // FIX: i18n for desc
57
- desc: {
58
- de: 'Manuelle Auswahl eines beobachteten Pool-Problems zur Anzeige allgemeiner Erklärungen.',
59
- en: 'Manual selection of an observed pool issue to display general explanations.',
60
- },
47
+ name: 'Chemistry help: select issue',
48
+ desc: 'Manual selection of an observed pool issue to display general explanations.',
61
49
  type: 'string',
62
50
  role: 'level',
63
51
  read: true,
64
52
  write: true,
65
53
  def: 'none',
66
- // FIX: common.states is NOT i18n-capable -> set to English only
67
54
  states: {
68
55
  none: 'No issue selected',
69
56
 
@@ -101,15 +88,9 @@ async function createAiChemistryHelpStates(adapter) {
101
88
  type: 'state',
102
89
  common: {
103
90
  // FIX: i18n for name
104
- name: {
105
- de: 'Chemie-Hilfe: Erklärung',
106
- en: 'Chemistry help: explanation',
107
- },
91
+ name: 'Chemistry help: explanation',
108
92
  // FIX: i18n for desc
109
- desc: {
110
- de: 'Erklärender Text zu Ursachen und allgemeinen Lösungsansätzen (keine Dosierung, keine Steuerung).',
111
- en: 'Explanatory text about causes and general approaches (no dosing, no control).',
112
- },
93
+ desc: 'Explanatory text about causes and general approaches (no dosing, no control).',
113
94
  type: 'string',
114
95
  role: 'text',
115
96
  read: true,
@@ -126,15 +107,9 @@ async function createAiChemistryHelpStates(adapter) {
126
107
  type: 'state',
127
108
  common: {
128
109
  // FIX: i18n for name
129
- name: {
130
- de: 'Chemie-Hilfe: Letzte Auswahl',
131
- en: 'Chemistry help: last selection',
132
- },
110
+ name: 'Chemistry help: last selection',
133
111
  // FIX: i18n for desc
134
- desc: {
135
- de: 'Zeitpunkt der letzten Auswahl eines Chemie-Hilfe-Problems.',
136
- en: 'Timestamp of the last selected chemistry help issue.',
137
- },
112
+ desc: 'Timestamp of the last selected chemistry help issue.',
138
113
  type: 'number',
139
114
  role: 'value.time',
140
115
  read: true,
@@ -31,11 +31,7 @@ async function createAiStates(adapter) {
31
31
  await adapter.setObjectNotExistsAsync('ai', {
32
32
  type: 'channel',
33
33
  common: {
34
- // FIX: i18n
35
- name: {
36
- de: 'KI / AI-Funktionen',
37
- en: 'AI functions',
38
- },
34
+ name: 'AI functions',
39
35
  },
40
36
  native: {},
41
37
  });
@@ -47,16 +43,8 @@ async function createAiStates(adapter) {
47
43
  await adapter.setObjectNotExistsAsync('ai.enabled', {
48
44
  type: 'state',
49
45
  common: {
50
- // FIX: i18n
51
- name: {
52
- de: 'KI aktivieren',
53
- en: 'Enable AI',
54
- },
55
- // FIX: i18n
56
- desc: {
57
- de: 'Globaler Hauptschalter für alle KI-Funktionen',
58
- en: 'Global master switch for all AI functions',
59
- },
46
+ name: 'Enable AI',
47
+ desc: 'Global master switch for all AI functions',
60
48
  type: 'boolean',
61
49
  role: 'switch',
62
50
  read: true,
@@ -73,16 +61,8 @@ async function createAiStates(adapter) {
73
61
  await adapter.setObjectNotExistsAsync('ai.weather', {
74
62
  type: 'channel',
75
63
  common: {
76
- // FIX: i18n
77
- name: {
78
- de: 'Wetterbezogene KI-Funktionen',
79
- en: 'Weather-related AI functions',
80
- },
81
- // FIX: i18n
82
- desc: {
83
- de: 'Alle KI-Funktionen rund um Wetter, Vorhersagen und Pooltipps',
84
- en: 'All AI functions about weather, forecasts and pool tips',
85
- },
64
+ name: 'Weather-related AI functions',
65
+ desc: 'All AI functions about weather, forecasts and pool tips',
86
66
  },
87
67
  native: {},
88
68
  });
@@ -93,16 +73,8 @@ async function createAiStates(adapter) {
93
73
  await adapter.setObjectNotExistsAsync('ai.weather.switches', {
94
74
  type: 'channel',
95
75
  common: {
96
- // FIX: i18n
97
- name: {
98
- de: 'Schalter (Wetter-KI)',
99
- en: 'Switches (weather AI)',
100
- },
101
- // FIX: i18n
102
- desc: {
103
- de: 'Einzelne Schalter für wetterbezogene KI-Funktionen',
104
- en: 'Individual switches for weather-related AI functions',
105
- },
76
+ name: 'Switches (weather AI)',
77
+ desc: 'Individual switches for weather-related AI functions',
106
78
  },
107
79
  native: {},
108
80
  });
@@ -113,33 +85,33 @@ async function createAiStates(adapter) {
113
85
  // Steuerung & Debug für Wetter-KI
114
86
  {
115
87
  id: 'allow_speech',
116
- name: { de: 'Sprachausgabe für Wetter-KI erlauben', en: 'Allow speech output for weather AI' },
88
+ name: 'Allow speech output for weather AI',
117
89
  def: false,
118
90
  }, // GEÄNDERT: von ai.switches → ai.weather.switches
119
- { id: 'debug_mode', name: { de: 'Debugmodus für Wetter-KI', en: 'Debug mode for weather AI' }, def: false }, // GEÄNDERT: von ai.switches → ai.weather.switches
91
+ { id: 'debug_mode', name: 'Debug mode for weather AI', def: false }, // GEÄNDERT: von ai.switches → ai.weather.switches
120
92
 
121
93
  // Modulspezifische Schalter
122
94
  {
123
95
  id: 'daily_summary_enabled',
124
- name: { de: 'Tägliche Zusammenfassung aktiv', en: 'Enable daily summary' },
96
+ name: 'Enable daily summary',
125
97
  def: false,
126
98
  },
127
99
  {
128
100
  id: 'daily_pool_tips_enabled',
129
- name: { de: 'Tägliche Pool-Tipps aktiv', en: 'Enable daily pool tips' },
101
+ name: 'Enable daily pool tips',
130
102
  def: false,
131
103
  },
132
- { id: 'weather_advice_enabled', name: { de: 'Wetterhinweise aktiv', en: 'Enable weather advice' }, def: false },
104
+ { id: 'weather_advice_enabled', name: 'Enable weather advice', def: false },
133
105
  {
134
106
  id: 'weekend_summary_enabled',
135
- name: { de: 'Wochenende-Zusammenfassung aktiv', en: 'Enable weekend summary' },
107
+ name: 'Enable weekend summary',
136
108
  def: false,
137
109
  },
138
110
 
139
111
  // NEU: Schalter für "Vorhersage für morgen"
140
112
  {
141
113
  id: 'tomorrow_forecast_enabled',
142
- name: { de: 'Vorhersage für morgen aktiv', en: 'Enable tomorrow forecast' },
114
+ name: 'Enable tomorrow forecast',
143
115
  def: false,
144
116
  }, // NEU
145
117
  ];
@@ -167,15 +139,9 @@ async function createAiStates(adapter) {
167
139
  type: 'channel',
168
140
  common: {
169
141
  // FIX: i18n
170
- name: {
171
- de: 'Zeitpläne (Wetter-KI)',
172
- en: 'Schedules (weather AI)',
173
- },
142
+ name: 'Schedules (weather AI)',
174
143
  // FIX: i18n
175
- desc: {
176
- de: 'Zeitsteuerung für wetterbezogene KI-Ausgaben',
177
- en: 'Time control for weather-related AI outputs',
178
- },
144
+ desc: 'Time control for weather-related AI outputs',
179
145
  },
180
146
  native: {},
181
147
  });
@@ -185,29 +151,29 @@ async function createAiStates(adapter) {
185
151
  const weatherSchedule = [
186
152
  {
187
153
  id: 'daily_summary_time',
188
- name: { de: 'Zeit für tägliche Zusammenfassung', en: 'Time for daily summary' },
154
+ name: 'Time for daily summary',
189
155
  def: '09:00',
190
156
  },
191
157
  {
192
158
  id: 'daily_pool_tips_time',
193
- name: { de: 'Zeit für tägliche Pool-Tipps', en: 'Time for daily pool tips' },
159
+ name: 'Time for daily pool tips',
194
160
  def: '10:00',
195
161
  },
196
162
  {
197
163
  id: 'weather_advice_time',
198
- name: { de: 'Zeit für Wetterhinweise', en: 'Time for weather advice' },
164
+ name: 'Time for weather advice',
199
165
  def: '08:00',
200
166
  },
201
167
  {
202
168
  id: 'weekend_summary_time',
203
- name: { de: 'Zeit für Wochenend-Zusammenfassung', en: 'Time for weekend summary' },
169
+ name: 'Time for weekend summary',
204
170
  def: '18:00',
205
171
  },
206
172
 
207
173
  // NEU: Zeitplan für "Vorhersage für morgen"
208
174
  {
209
175
  id: 'tomorrow_forecast_time',
210
- name: { de: 'Zeit für morgige Vorhersage', en: 'Time for tomorrow forecast' },
176
+ name: 'Time for tomorrow forecast',
211
177
  def: '19:00',
212
178
  }, // NEU
213
179
  ];
@@ -234,16 +200,8 @@ async function createAiStates(adapter) {
234
200
  await adapter.setObjectNotExistsAsync('ai.weather.outputs', {
235
201
  type: 'channel',
236
202
  common: {
237
- // FIX: i18n
238
- name: {
239
- de: 'KI-Ausgaben (Wetter-Texte)',
240
- en: 'AI outputs (weather texts)',
241
- },
242
- // FIX: i18n
243
- desc: {
244
- de: 'Textausgaben der Wetter-KI (Hinweise, Tipps, Zusammenfassungen)',
245
- en: 'Text outputs of the weather AI (advice, tips, summaries)',
246
- },
203
+ name: 'AI outputs (weather texts)',
204
+ desc: 'Text outputs of the weather AI (advice, tips, summaries)',
247
205
  },
248
206
  native: {},
249
207
  });
@@ -251,16 +209,16 @@ async function createAiStates(adapter) {
251
209
  // NEU / GEÄNDERT:
252
210
  // Alle bisherigen Ausgaben + neue Vorhersage + last_message unter ai.weather.outputs.*
253
211
  const weatherOutputs = [
254
- { id: 'daily_summary', name: { de: 'Tägliche Zusammenfassung', en: 'Daily summary' } },
255
- { id: 'pool_tips', name: { de: 'Pool-Tipps', en: 'Pool tips' } },
256
- { id: 'weather_advice', name: { de: 'Wetterhinweise', en: 'Weather advice' } },
257
- { id: 'weekend_summary', name: { de: 'Wochenende-Zusammenfassung', en: 'Weekend summary' } },
212
+ { id: 'daily_summary', name: 'Daily summary' },
213
+ { id: 'pool_tips', name: 'Pool tips' },
214
+ { id: 'weather_advice', name: 'Weather advice' },
215
+ { id: 'weekend_summary', name: 'Weekend summary' },
258
216
 
259
217
  // NEU: Ausgabefeld für die Vorhersage für morgen
260
- { id: 'tomorrow_forecast', name: { de: 'Vorhersage für morgen', en: 'Tomorrow forecast' } }, // NEU
218
+ { id: 'tomorrow_forecast', name: 'Tomorrow forecast' }, // NEU
261
219
 
262
220
  // GEÄNDERT: last_message gehört aktuell zur Wetter-KI
263
- { id: 'last_message', name: { de: 'Letzte Wetter-KI-Meldung', en: 'Last weather AI message' } }, // GEÄNDERT: von ai.outputs → ai.weather.outputs
221
+ { id: 'last_message', name: 'Last weather AI message' }, // GEÄNDERT: von ai.outputs → ai.weather.outputs
264
222
  ];
265
223
 
266
224
  for (const o of weatherOutputs) {
@@ -17,22 +17,22 @@ async function createConsumptionStates(adapter) {
17
17
  // --- Kanal consumption ---
18
18
  await adapter.setObjectNotExistsAsync('consumption', {
19
19
  type: 'channel',
20
- common: { name: { de: 'Stromverbrauch', en: 'Power consumption' } },
20
+ common: { name: 'Power consumption' },
21
21
  native: {},
22
22
  });
23
23
 
24
24
  const consumptionStates = {
25
- total_kwh: { name: { de: 'Gesamtverbrauch', en: 'Total consumption' }, unit: 'kWh' },
26
- day_kwh: { name: { de: 'Verbrauch heute', en: 'Consumption today' }, unit: 'kWh' },
27
- week_kwh: { name: { de: 'Verbrauch diese Woche', en: 'Consumption this week' }, unit: 'kWh' },
28
- month_kwh: { name: { de: 'Verbrauch dieser Monat', en: 'Consumption this month' }, unit: 'kWh' },
29
- year_kwh: { name: { de: 'Verbrauch dieses Jahr', en: 'Consumption this year' }, unit: 'kWh' },
25
+ total_kwh: { name: 'Total consumption', unit: 'kWh' },
26
+ day_kwh: { name: 'Consumption today', unit: 'kWh' },
27
+ week_kwh: { name: 'Consumption this week', unit: 'kWh' },
28
+ month_kwh: { name: 'Consumption this month', unit: 'kWh' },
29
+ year_kwh: { name: 'Consumption this year', unit: 'kWh' },
30
30
  last_total_kwh: {
31
- name: { de: 'Letzter Zählerstand (Baseline)', en: 'Last meter reading (baseline)' },
31
+ name: 'Last meter reading (baseline)',
32
32
  unit: 'kWh',
33
33
  },
34
34
  offset_kwh: {
35
- name: { de: 'Offset kWh (interner Zählerausgleich)', en: 'Offset kWh (internal counter adjustment)' },
35
+ name: 'Offset kWh (internal counter adjustment)',
36
36
  unit: 'kWh',
37
37
  },
38
38
  };
@@ -61,16 +61,16 @@ async function createConsumptionStates(adapter) {
61
61
  // --- Kanal costs ---
62
62
  await adapter.setObjectNotExistsAsync('costs', {
63
63
  type: 'channel',
64
- common: { name: { de: 'Kosten', en: 'Costs' } },
64
+ common: { name: 'Costs' },
65
65
  native: {},
66
66
  });
67
67
 
68
68
  const costStates = {
69
- total_eur: { name: { de: 'Gesamtkosten', en: 'Total costs' }, unit: '€' },
70
- day_eur: { name: { de: 'Kosten heute', en: 'Costs today' }, unit: '€' },
71
- week_eur: { name: { de: 'Kosten diese Woche', en: 'Costs this week' }, unit: '€' },
72
- month_eur: { name: { de: 'Kosten dieser Monat', en: 'Costs this month' }, unit: '€' },
73
- year_eur: { name: { de: 'Kosten dieses Jahr', en: 'Costs this year' }, unit: '€' },
69
+ total_eur: { name: 'Total costs', unit: '€' },
70
+ day_eur: { name: 'Costs today', unit: '€' },
71
+ week_eur: { name: 'Costs this week', unit: '€' },
72
+ month_eur: { name: 'Costs this month', unit: '€' },
73
+ year_eur: { name: 'Costs this year', unit: '€' },
74
74
  };
75
75
 
76
76
  for (const [id, cfg] of Object.entries(costStates)) {