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 +8 -0
- package/io-package.json +29 -28
- package/lib/stateDefinitions/actuatorsStates.js +19 -19
- package/lib/stateDefinitions/aiChemistryHelpStates.js +7 -32
- package/lib/stateDefinitions/aiStates.js +29 -71
- package/lib/stateDefinitions/consumptionStates.js +14 -14
- package/lib/stateDefinitions/controlStates.js +35 -86
- package/lib/stateDefinitions/debugLogStates.js +10 -25
- package/lib/stateDefinitions/generalStates.js +4 -4
- package/lib/stateDefinitions/heatStates.js +21 -21
- package/lib/stateDefinitions/infoStates.js +5 -11
- package/lib/stateDefinitions/photovoltaicStates.js +19 -49
- package/lib/stateDefinitions/pumpSpeedStates.js +11 -11
- package/lib/stateDefinitions/pumpStates.js +15 -24
- package/lib/stateDefinitions/pumpStates2.js +9 -21
- package/lib/stateDefinitions/pumpStates3.js +23 -62
- package/lib/stateDefinitions/pumpStates4.js +30 -60
- package/lib/stateDefinitions/runtimeStates.js +12 -10
- package/lib/stateDefinitions/solarStates.js +9 -9
- package/lib/stateDefinitions/speechStates.js +18 -21
- package/lib/stateDefinitions/statisticsStates.js +27 -57
- package/lib/stateDefinitions/statusStates.js +12 -12
- package/lib/stateDefinitions/temperatureStates.js +12 -12
- package/lib/stateDefinitions/timeStates.js +5 -5
- package/package.json +1 -1
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
96
|
+
name: 'Enable daily summary',
|
|
125
97
|
def: false,
|
|
126
98
|
},
|
|
127
99
|
{
|
|
128
100
|
id: 'daily_pool_tips_enabled',
|
|
129
|
-
name:
|
|
101
|
+
name: 'Enable daily pool tips',
|
|
130
102
|
def: false,
|
|
131
103
|
},
|
|
132
|
-
{ id: 'weather_advice_enabled', name:
|
|
104
|
+
{ id: 'weather_advice_enabled', name: 'Enable weather advice', def: false },
|
|
133
105
|
{
|
|
134
106
|
id: 'weekend_summary_enabled',
|
|
135
|
-
name:
|
|
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:
|
|
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:
|
|
154
|
+
name: 'Time for daily summary',
|
|
189
155
|
def: '09:00',
|
|
190
156
|
},
|
|
191
157
|
{
|
|
192
158
|
id: 'daily_pool_tips_time',
|
|
193
|
-
name:
|
|
159
|
+
name: 'Time for daily pool tips',
|
|
194
160
|
def: '10:00',
|
|
195
161
|
},
|
|
196
162
|
{
|
|
197
163
|
id: 'weather_advice_time',
|
|
198
|
-
name:
|
|
164
|
+
name: 'Time for weather advice',
|
|
199
165
|
def: '08:00',
|
|
200
166
|
},
|
|
201
167
|
{
|
|
202
168
|
id: 'weekend_summary_time',
|
|
203
|
-
name:
|
|
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:
|
|
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
|
-
|
|
238
|
-
|
|
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:
|
|
255
|
-
{ id: 'pool_tips', name:
|
|
256
|
-
{ id: 'weather_advice', name:
|
|
257
|
-
{ id: 'weekend_summary', name:
|
|
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:
|
|
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:
|
|
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:
|
|
20
|
+
common: { name: 'Power consumption' },
|
|
21
21
|
native: {},
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
const consumptionStates = {
|
|
25
|
-
total_kwh: { name:
|
|
26
|
-
day_kwh: { name:
|
|
27
|
-
week_kwh: { name:
|
|
28
|
-
month_kwh: { name:
|
|
29
|
-
year_kwh: { name:
|
|
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:
|
|
31
|
+
name: 'Last meter reading (baseline)',
|
|
32
32
|
unit: 'kWh',
|
|
33
33
|
},
|
|
34
34
|
offset_kwh: {
|
|
35
|
-
name:
|
|
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:
|
|
64
|
+
common: { name: 'Costs' },
|
|
65
65
|
native: {},
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
const costStates = {
|
|
69
|
-
total_eur: { name:
|
|
70
|
-
day_eur: { name:
|
|
71
|
-
week_eur: { name:
|
|
72
|
-
month_eur: { name:
|
|
73
|
-
year_eur: { name:
|
|
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)) {
|