iobroker.eos-admin 7.9.89 → 7.9.93

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.
Files changed (64) hide show
  1. package/INSTALL_TEST_V7.9.93.md +12 -0
  2. package/NEXOWATT_EOS_BUILD_INFO.json +19 -26
  3. package/PUBLISH_STABLE_V7.9.93.md +19 -0
  4. package/README_STABILITY_V7.9.93.md +15 -0
  5. package/RELEASE_ACCEPTANCE_V7.9.93.md +15 -0
  6. package/RELEASE_NOTES_V7.9.93.md +10 -0
  7. package/adminWww/assets/Adapters-B5_jQ7DE-v84.js +1 -1
  8. package/adminWww/assets/Instances-YdaGnS5a-v84.js +1 -1
  9. package/adminWww/css/nexowatt-native-shell.css +304 -13
  10. package/adminWww/index.html +11 -11
  11. package/adminWww/js/eos-account-management.js +1 -1
  12. package/adminWww/js/eos-assistant.js +487 -55
  13. package/adminWww/js/eos-basic-settings.js +1 -1
  14. package/adminWww/js/eos-branding-sanitizer.js +3 -1
  15. package/adminWww/js/eos-native-security.js +1 -1
  16. package/adminWww/js/eos-policy-client.js +1 -1
  17. package/adminWww/js/eos-role-bootstrap.js +180 -46
  18. package/adminWww/js/eos-role-ui.js +156 -23
  19. package/adminWww/js/nexowatt-native-shell.js +1 -1
  20. package/build/lib/chat/assistantKnowledge.js +21 -6
  21. package/build/lib/chat/chatOrchestrator.js +33 -38
  22. package/build/lib/chat/mcpClientManager.js +1 -1
  23. package/build/lib/web.js +39 -0
  24. package/build/main.js +307 -1
  25. package/io-package.json +23 -8
  26. package/package.json +21 -13
  27. package/tools/nexowatt-account-management-selftest.cjs +1 -1
  28. package/tools/nexowatt-ensure-release-defaults.cjs +72 -0
  29. package/tools/nexowatt-internal-reserve-selftest.cjs +4 -1
  30. package/tools/nexowatt-login-layout-selftest.cjs +62 -0
  31. package/tools/nexowatt-modern-ui-selftest.cjs +7 -5
  32. package/tools/nexowatt-release-defaults-selftest.cjs +29 -0
  33. package/tools/nexowatt-validate-package.cjs +18 -8
  34. package/INSTALL_TEST_V7.9.89.md +0 -73
  35. package/PUBLISH_STABLE_V7.9.89.md +0 -33
  36. package/README_STABILITY_V7.9.89.md +0 -26
  37. package/RELEASE_ACCEPTANCE_V7.9.89.md +0 -40
  38. package/admin/img/eos/nexowatt-192-maskable.png +0 -0
  39. package/admin/img/eos/nexowatt-24.png +0 -0
  40. package/admin/img/eos/nexowatt-512-maskable.png +0 -0
  41. package/admin/img/eos/nexowatt-eos-logo.png +0 -0
  42. package/adminWww/admin.png +0 -0
  43. package/adminWww/img/eos/nexowatt-24.png +0 -0
  44. package/adminWww/img/eos/nexowatt-eos-logo.png +0 -0
  45. package/adminWww/img/eos/nexowatt-header-128.png +0 -0
  46. package/adminWww/img/eos/nexowatt-header-192.png +0 -0
  47. package/adminWww/img/eos/nexowatt-header-256.png +0 -0
  48. package/adminWww/img/eos/nexowatt-header-512.png +0 -0
  49. package/adminWww/img/eos/nexowatt-header-64.png +0 -0
  50. package/adminWww/img/logo192.png +0 -0
  51. package/adminWww/js/eos-adapter-surface-cleanup.js +0 -141
  52. package/adminWww/js/eos-toolbar-ghost-cleanup.js +0 -102
  53. package/docs/NEXOWATT_EOS_BRANDING_DE.md +0 -29
  54. package/docs/NEXOWATT_EOS_UI_LOGO_LOGIN_V6_DE.md +0 -9
  55. package/docs/NEXOWATT_EOS_UI_PERFORMANCE_V5_DE.md +0 -25
  56. package/docs/NEXOWATT_EOS_UI_V12_HEADER_LOGO_NAV_CLEANUP_DE.md +0 -16
  57. package/docs/NEXOWATT_EOS_UI_V12_HEADER_NAV_LOGO_FIX_DE.md +0 -16
  58. package/docs/NEXOWATT_EOS_UI_V15_DE.md +0 -8
  59. package/docs/NEXOWATT_EOS_UI_V16_DE.md +0 -9
  60. package/docs/NEXOWATT_EOS_UI_V17_DE.md +0 -24
  61. package/docs/NEXOWATT_EOS_UI_V6_FIXES_DE.md +0 -13
  62. package/docs/NEXOWATT_EOS_UI_V6_LOGIN_LOGO_404_FIX_DE.md +0 -9
  63. package/docs/NEXOWATT_EOS_UI_V6_LOGO_LOGIN_FIX_DE.md +0 -10
  64. package/docs/NEXOWATT_EOS_UI_V7_RESTORE_LOGO_SCOPE_FIX_DE.md +0 -18
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "eos-admin",
4
- "version": "7.9.89",
4
+ "version": "7.9.93",
5
5
  "titleLang": {
6
6
  "en": "NexoWatt EOS Admin",
7
7
  "de": "NexoWatt EOS Admin",
@@ -18,6 +18,21 @@
18
18
  "connectionType": "local",
19
19
  "dataSource": "push",
20
20
  "news": {
21
+ "7.9.93": {
22
+ "de": "Testkandidat 7.9.93 entfernt den unnötigen Scrollbalken aus der kompakten Anmeldung, zeigt in der Modulinstallation NexoWatt als sichtbaren Herausgeber und ersetzt die statischen EOS-Assist-Texte durch einen authentifizierten, rollenabhängigen und schreibgeschützten Systemassistenten. EOS Assist kann – nach einmaliger Konfiguration durch Admin/Service – reale Module, Dienste, Einstellungen, Geräte, Datenpunkte, Struktur, Logs, Historie und Sicherungsstatus über die freigegebenen Systemwerkzeuge prüfen. Technische Paketkennungen bleiben intern kompatibel.",
23
+ "en": "Test candidate 7.9.93 removes the unnecessary scrollbar from the compact login, shows NexoWatt as the visible publisher in module installation, and replaces static EOS Assist texts with an authenticated, role-aware, read-only system assistant. Once configured by Admin/Service, EOS Assist can inspect real modules, services, settings, devices, datapoints, structure, logs, history and backup status through the permitted system tools. Technical package identifiers remain internally compatible.",
24
+ "nl": "Testkandidaat 7.9.93 verwijdert de overbodige schuifbalk uit de compacte aanmelding, toont NexoWatt als zichtbare uitgever bij module-installatie en vervangt statische EOS Assist-teksten door een geauthenticeerde, rolafhankelijke en alleen-lezen systeemassistent. Na eenmalige configuratie door Admin/Service kan EOS Assist echte modules, diensten, instellingen, apparaten, datapunten, structuur, logs, historie en back-upstatus controleren via de toegestane systeemtools. Technische pakket-ID’s blijven intern compatibel."
25
+ },
26
+ "7.9.92": {
27
+ "de": "Stable 7.9.92 korrigiert die Release-Vorbereitung: Vor Paketprüfung und npm-Veröffentlichung werden die verbindlichen Verkaufsstandardwerte für Authentifizierung, Port 8081 sowie die ausschließlich für Admin/Service sichtbaren internen Admin- und BackItUp-Notfallreserven automatisch normalisiert. Dadurch kann ein gemischter lokaler Arbeitsordner die Sicherheitsprüfung nicht mehr durch einen fehlenden Standardwert abbrechen. Rollen-, Login-, Übersichts- und Dienstefilter aus 7.9.91 bleiben unverändert.",
28
+ "en": "Stable 7.9.92 hardens release preparation: before package validation and npm publishing, the mandatory sales defaults for authentication, port 8081 and the Admin/Service-only internal admin and BackItUp emergency reserves are normalized automatically. A mixed local working tree can therefore no longer abort the security check merely because a required default value is missing. Role, login, overview and service filtering from 7.9.91 remain unchanged.",
29
+ "nl": "Stable 7.9.92 verhardt de releasevoorbereiding: vóór pakketcontrole en npm-publicatie worden de verplichte verkoopstandaarden voor authenticatie, poort 8081 en de uitsluitend voor Admin/Service zichtbare interne admin- en BackItUp-noodreserve automatisch genormaliseerd. Een gemengde lokale werkmap kan de veiligheidscontrole daardoor niet meer laten stoppen door een ontbrekende standaardwaarde. Rollen-, login-, overzichts- en dienstenfilters uit 7.9.91 blijven ongewijzigd."
30
+ },
31
+ "7.9.90": {
32
+ "de": "Stable 7.9.90 korrigiert die produktive Rollenoberfläche: Die Übersichtskacheln sind für Installateur und Gast/Endkunde zuverlässig bedienbar. Interner Admin und interne BackItUp-Notfallreserve werden in Dienste auch bei verzögert gerenderten Tabellen ausschließlich für Admin/Service angezeigt. Die Erstanmeldung prüft serverseitig, ob Installer, Guest oder User noch keinen persönlichen Zugang besitzen: Nur dann wird die normale Anmeldeschaltfläche bei leerem Passwort aktiv und öffnet die verpflichtende Passwortvergabe; nach abgeschlossener Aktivierung bleibt sie ohne Passwort gesperrt. NexoWatt Sicherung bleibt für freigegebene Rollen erreichbar, EOS Assist im Header und Standardport 8081 bleiben unverändert.",
33
+ "en": "Stable 7.9.90 fixes the production role interface: overview tiles are reliably clickable for Installer and Guest/End User. The internal admin and internal BackItUp emergency reserve are shown only to Admin/Service, including tables rendered asynchronously. First activation now checks eligibility on the server before enabling empty-password sign-in for Installer, Guest or User. Only an uninitialized/reset account gets an active sign-in button and mandatory password setup; after activation, empty-password sign-in remains disabled. NexoWatt Backup stays available to approved roles, while EOS Assist remains in the header and the default port remains 8081.",
34
+ "nl": "Stable 7.9.90 corrigeert de productie-rolinterface: overzichtstegels zijn betrouwbaar klikbaar voor installateur en gast/eindgebruiker. De interne admin en BackItUp-noodreserve zijn uitsluitend zichtbaar voor Admin/Service, ook in vertraagd gerenderde tabellen. Eerste activering controleert server-side of Installer, Guest of User nog geen persoonlijk wachtwoord heeft. Alleen dan wordt aanmelden met leeg wachtwoord actief en volgt verplichte wachtwoordinstelling; na activering blijft aanmelden zonder wachtwoord geblokkeerd. NexoWatt Backup blijft beschikbaar voor vrijgegeven rollen, EOS Assist blijft in de kop en standaardpoort 8081 blijft behouden."
35
+ },
21
36
  "7.9.89": {
22
37
  "de": "Stable 7.9.89 finalisiert die rollenbasierte NexoWatt-EOS-Verkaufsoberfläche: Admin/Service behält Vollzugriff und Expertenmodus, Installateure erhalten Inbetriebnahme und Fehlersuche, Gast/Endkunde die freigegebene Smart-Home-Bedienung. Die Erstanmeldung ist direkt in die normale Anmeldung integriert: Installer und Guest wählen ihre Ebene und lassen das Passwort einmalig leer, danach wird zwingend ein persönliches Passwort vergeben. EOS Assist sitzt kollisionsfrei im Kopfbereich; Zugangsverwaltung liegt ausschließlich unter „Zugänge & Rechte“. Die aktuelle Übersicht wurde modernisiert, die Easy-Übersicht wird nicht verwendet. Interner Admin und interne BackItUp-Notfallreserve sind nur für Admin/Service sichtbar; die NexoWatt-Sicherung bleibt für die freigegebenen Rollen nutzbar. Standardport ist 8081.",
23
38
  "en": "Stable 7.9.89 finalizes the role-based NexoWatt EOS sales interface: Admin/Service retains full access and expert mode, installers receive commissioning and troubleshooting functions, and Guest/End User receives the approved smart-home controls. First activation is integrated into the normal sign-in card: Installer and Guest select their level and leave the password empty once, then must create a personal password. EOS Assist is positioned safely in the header; account management exists only under “Access & Rights”. The current overview was modernized and the Easy overview is not used. The internal admin and internal BackItUp emergency reserve are visible only to Admin/Service, while NexoWatt Backup remains available to approved roles. Default port is 8081.",
@@ -304,7 +319,7 @@
304
319
  "icon": "admin.svg",
305
320
  "messagebox": true,
306
321
  "enabled": true,
307
- "extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.89/admin/admin.svg",
322
+ "extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.93/admin/admin.svg",
308
323
  "keywords": [
309
324
  "NexoWatt",
310
325
  "EOS",
@@ -315,10 +330,9 @@
315
330
  "licensed"
316
331
  ],
317
332
  "compact": true,
318
- "readme": "https://unpkg.com/iobroker.eos-admin@7.9.89/README.md",
333
+ "readme": "https://unpkg.com/iobroker.eos-admin@7.9.93/README.md",
319
334
  "authors": [
320
- "bluefox <bluefox@ccu.io>",
321
- "hobbyquaker <hq@ccu.io>"
335
+ "NexoWatt"
322
336
  ],
323
337
  "dependencies": [
324
338
  {
@@ -384,9 +398,10 @@
384
398
  "nondeletable": false,
385
399
  "allowAdapterUpdate": true,
386
400
  "allowAdapterDelete": false,
387
- "meta": "https://unpkg.com/iobroker.eos-admin@7.9.89/io-package.json",
401
+ "meta": "https://unpkg.com/iobroker.eos-admin@7.9.93/io-package.json",
388
402
  "npmPackage": "iobroker.eos-admin",
389
- "packetName": "iobroker.eos-admin"
403
+ "packetName": "iobroker.eos-admin",
404
+ "publisher": "NexoWatt"
390
405
  },
391
406
  "native": {
392
407
  "autoUpdate": 24,
@@ -1088,5 +1103,5 @@
1088
1103
  }
1089
1104
  }
1090
1105
  },
1091
- "version": "7.9.89"
1106
+ "version": "7.9.93"
1092
1107
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iobroker.eos-admin",
3
- "description": "NexoWatt EOS Admin stable product release with integrated role login, modern overview and protected service reserves",
4
- "version": "7.9.89",
3
+ "description": "NexoWatt EOS Admin test candidate with compact login, visible NexoWatt publisher and live role-aware EOS Assist",
4
+ "version": "7.9.93",
5
5
  "contributors": [
6
6
  "bluefox <dogafox@gmail.com>",
7
7
  "apollon77",
@@ -110,11 +110,15 @@
110
110
  "tools/nexowatt-runtime-cleanup-selftest.cjs",
111
111
  "tools/nexowatt-account-management-selftest.cjs",
112
112
  "tools/nexowatt-modern-ui-selftest.cjs",
113
- "README_STABILITY_V7.9.89.md",
114
- "PUBLISH_STABLE_V7.9.89.md",
115
- "INSTALL_TEST_V7.9.89.md",
116
- "RELEASE_ACCEPTANCE_V7.9.89.md",
117
- "tools/nexowatt-internal-reserve-selftest.cjs"
113
+ "tools/nexowatt-login-layout-selftest.cjs",
114
+ "tools/nexowatt-internal-reserve-selftest.cjs",
115
+ "tools/nexowatt-ensure-release-defaults.cjs",
116
+ "tools/nexowatt-release-defaults-selftest.cjs",
117
+ "README_STABILITY_V7.9.93.md",
118
+ "RELEASE_NOTES_V7.9.93.md",
119
+ "PUBLISH_STABLE_V7.9.93.md",
120
+ "INSTALL_TEST_V7.9.93.md",
121
+ "RELEASE_ACCEPTANCE_V7.9.93.md"
118
122
  ],
119
123
  "scripts": {
120
124
  "npm": "npm i -f && cd src-admin && npm i -f",
@@ -125,7 +129,7 @@
125
129
  "test:integration": "mocha test/integration --exit && npm run test:gui && npm run test:rule && npm run test:unit",
126
130
  "test:rule": "mocha test/rule --exit",
127
131
  "test:gui": "mocha test/*.gui.js --exit",
128
- "prepublishOnly": "npm run check:eos-publish-channel && npm run check:eos-package && npm run check:eos-stability",
132
+ "prepublishOnly": "npm run prepare:eos-release-defaults && npm run check:eos-publish-channel && npm run check:eos-package && npm run check:eos-stability",
129
133
  "build": "npm run build:frontend && npm run build:backend && npm run clean:eos-runtime",
130
134
  "build:backend": "tsc -p tsconfig.build.json && tsx tasks.mts --backend-i18n",
131
135
  "build:frontend": "tsx tasks.mts",
@@ -149,11 +153,11 @@
149
153
  "nexowatt:repo-entry": "node tools/nexowatt-generate-repo-entry.cjs",
150
154
  "nexowatt:patch-repo": "node tools/nexowatt-patch-repo.cjs",
151
155
  "nexowatt:repair-update": "node tools/nexowatt-repair-eos-admin-update.cjs",
152
- "check:eos-stability": "node tools/nexowatt-stability-check.cjs && node tools/nexowatt-esm-syntax-selftest.cjs && node tools/nexowatt-import-integrity-selftest.cjs && node tools/nexowatt-entrypoint-smoke-selftest.cjs && node tools/nexowatt-frontend-graph-check.cjs && node tools/nexowatt-policy-selftest.cjs && node tools/nexowatt-publish-channel-selftest.cjs && node tools/nexowatt-role-access-selftest.cjs && node tools/nexowatt-internal-reserve-selftest.cjs && node tools/nexowatt-first-login-selftest.cjs && node tools/nexowatt-account-management-selftest.cjs && node tools/nexowatt-modern-ui-selftest.cjs && node tools/nexowatt-branding-selftest.cjs && node tools/nexowatt-default-port-selftest.cjs && node tools/nexowatt-module-popup-selftest.cjs && node tools/nexowatt-datapoint-selftest.cjs && node tools/nexowatt-update-selftest.cjs && node tools/nexowatt-datapoint-interaction-selftest.cjs && node tools/nexowatt-manual-write-policy-selftest.cjs && node tools/nexowatt-value-column-selftest.cjs && node tools/nexowatt-native-shell-selftest.cjs && node tools/nexowatt-assistant-separation-selftest.cjs && node tools/nexowatt-runtime-cleanup-selftest.cjs",
156
+ "check:eos-stability": "node tools/nexowatt-stability-check.cjs && node tools/nexowatt-esm-syntax-selftest.cjs && node tools/nexowatt-import-integrity-selftest.cjs && node tools/nexowatt-entrypoint-smoke-selftest.cjs && node tools/nexowatt-frontend-graph-check.cjs && node tools/nexowatt-policy-selftest.cjs && node tools/nexowatt-publish-channel-selftest.cjs && node tools/nexowatt-release-defaults-selftest.cjs && node tools/nexowatt-role-access-selftest.cjs && node tools/nexowatt-internal-reserve-selftest.cjs && node tools/nexowatt-first-login-selftest.cjs && node tools/nexowatt-account-management-selftest.cjs && node tools/nexowatt-modern-ui-selftest.cjs && node tools/nexowatt-login-layout-selftest.cjs && node tools/nexowatt-branding-selftest.cjs && node tools/nexowatt-default-port-selftest.cjs && node tools/nexowatt-module-popup-selftest.cjs && node tools/nexowatt-datapoint-selftest.cjs && node tools/nexowatt-update-selftest.cjs && node tools/nexowatt-datapoint-interaction-selftest.cjs && node tools/nexowatt-manual-write-policy-selftest.cjs && node tools/nexowatt-value-column-selftest.cjs && node tools/nexowatt-native-shell-selftest.cjs && node tools/nexowatt-assistant-separation-selftest.cjs && node tools/nexowatt-runtime-cleanup-selftest.cjs",
153
157
  "nexowatt:patch-built-frontend": "node tools/nexowatt-patch-built-frontend.cjs",
154
158
  "clean:eos-runtime": "node tools/nexowatt-clean-legacy-runtime.cjs",
155
- "precheck:eos-package": "npm run clean:eos-runtime",
156
- "precheck:eos-stability": "npm run clean:eos-runtime",
159
+ "precheck:eos-package": "npm run prepare:eos-release-defaults && npm run clean:eos-runtime",
160
+ "precheck:eos-stability": "npm run prepare:eos-release-defaults && npm run clean:eos-runtime",
157
161
  "prepack": "node tools/nexowatt-clean-legacy-runtime.cjs --quiet",
158
162
  "check:eos-esm": "node tools/nexowatt-esm-syntax-selftest.cjs",
159
163
  "check:eos-imports": "node tools/nexowatt-import-integrity-selftest.cjs",
@@ -165,7 +169,11 @@
165
169
  "test:eos-default-port": "node tools/nexowatt-default-port-selftest.cjs",
166
170
  "test:eos-account-management": "node tools/nexowatt-account-management-selftest.cjs",
167
171
  "test:eos-modern-ui": "node tools/nexowatt-modern-ui-selftest.cjs",
168
- "test:eos-internal-reserve": "node tools/nexowatt-internal-reserve-selftest.cjs"
172
+ "test:eos-internal-reserve": "node tools/nexowatt-internal-reserve-selftest.cjs",
173
+ "test:eos-login-layout": "node tools/nexowatt-login-layout-selftest.cjs",
174
+ "test:eos-release-defaults": "node tools/nexowatt-release-defaults-selftest.cjs",
175
+ "prepare:eos-release-defaults": "node tools/nexowatt-ensure-release-defaults.cjs",
176
+ "normalize:eos-release": "npm run prepare:eos-release-defaults"
169
177
  },
170
178
  "author": "NexoWatt",
171
179
  "private": false,
@@ -176,6 +184,6 @@
176
184
  },
177
185
  "nexowattReleasePolicy": {
178
186
  "distTag": "latest",
179
- "purpose": "accepted stable NexoWatt EOS sales-product release 7.9.89"
187
+ "purpose": "test candidate for accepted stable NexoWatt EOS sales-product release 7.9.93"
180
188
  }
181
189
  }
@@ -41,7 +41,7 @@ for (const code of [webSource, webBuilt]) {
41
41
  }
42
42
 
43
43
  for (const marker of [
44
- 'v89-account-management-under-access-rights', "['admin', 'installer']", 'nexowatt/account/manage',
44
+ 'v93-account-management-under-access-rights', "['admin', 'installer']", 'nexowatt/account/manage',
45
45
  'nexowatt/account/reset', 'X-NexoWatt-EOS-Account-Reset', 'data.canResetInstaller === true',
46
46
  "account.role === 'enduser'", 'Admin/Service', 'Installateure', 'NEXOWATT_EOS_ACCOUNT_MANAGEMENT',
47
47
  'ensureEntrySurface', "currentRoute() !== 'tab-users'", 'eos-account-management-entry',
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+
7
+ const CANONICAL_NATIVE_DEFAULTS = Object.freeze({
8
+ auth: true,
9
+ port: 8081,
10
+ eosLockLegacyAdmin: true,
11
+ eosHideLegacyAdminFromNonAdmins: true,
12
+ eosHideLegacyBackupFromNonAdmins: true,
13
+ nexowattHideLegacyBackupFromNonAdmins: true,
14
+ eosRequireFirstLoginPassword: true,
15
+ });
16
+
17
+ /**
18
+ * Enforce mandatory source defaults for every NexoWatt EOS sales release.
19
+ * This normalizes the repository io-package.json only. Existing installed
20
+ * instance configuration is not overwritten during adapter startup.
21
+ */
22
+ function ensureReleaseDefaults(ioPackage) {
23
+ if (!ioPackage || typeof ioPackage !== 'object' || Array.isArray(ioPackage)) {
24
+ throw new TypeError('io-package.json must contain a JSON object');
25
+ }
26
+ const native = ioPackage.native && typeof ioPackage.native === 'object' && !Array.isArray(ioPackage.native)
27
+ ? ioPackage.native
28
+ : (ioPackage.native = {});
29
+ const changes = [];
30
+ for (const [key, value] of Object.entries(CANONICAL_NATIVE_DEFAULTS)) {
31
+ if (native[key] !== value) {
32
+ changes.push({ key, previous: native[key], value });
33
+ native[key] = value;
34
+ }
35
+ }
36
+ return {
37
+ ioPackage,
38
+ changed: changes.length > 0,
39
+ fields: changes.map(change => `native.${change.key}`),
40
+ changes,
41
+ };
42
+ }
43
+
44
+ function ensureFile(filePath) {
45
+ const absolute = path.resolve(filePath);
46
+ const parsed = JSON.parse(fs.readFileSync(absolute, 'utf8'));
47
+ const result = ensureReleaseDefaults(parsed);
48
+ if (result.changed) {
49
+ fs.writeFileSync(absolute, `${JSON.stringify(result.ioPackage, null, 2)}\n`, 'utf8');
50
+ }
51
+ return { file: absolute, ...result };
52
+ }
53
+
54
+ if (require.main === module) {
55
+ const root = path.resolve(__dirname, '..');
56
+ const target = process.argv[2] || path.join(root, 'io-package.json');
57
+ try {
58
+ const result = ensureFile(target);
59
+ if (result.changed) {
60
+ console.log(
61
+ `[NexoWatt EOS release defaults] repaired ${result.changes.length} canonical value(s): ${result.changes.map(change => change.key).join(', ')}`,
62
+ );
63
+ } else {
64
+ console.log('[NexoWatt EOS release defaults] OK (canonical sales defaults already present)');
65
+ }
66
+ } catch (error) {
67
+ console.error(`[NexoWatt EOS release defaults] ${error instanceof Error ? error.message : String(error)}`);
68
+ process.exit(1);
69
+ }
70
+ }
71
+
72
+ module.exports = { CANONICAL_NATIVE_DEFAULTS, ensureReleaseDefaults, ensureFile };
@@ -16,6 +16,7 @@ const role = read('adminWww/js/eos-role-ui.js');
16
16
  const boot = read('adminWww/js/eos-role-bootstrap.js');
17
17
  const drawer = read('src-admin/src/components/Drawer.tsx');
18
18
  const assist = read('adminWww/js/eos-assistant.js');
19
+ const knowledge = read('src/lib/chat/assistantKnowledge.ts');
19
20
  const io = json('io-package.json');
20
21
 
21
22
  for (const code of [mainSource, mainBuilt]) {
@@ -36,6 +37,7 @@ for (const code of [webSource, webBuilt]) {
36
37
  for (const marker of [
37
38
  'isOfficialAdminTab', 'isOfficialBackupTab', 'isOfficialReserveTab', 'isCustomerBackupTab',
38
39
  'system.adapter.backitup', 'tab-backitup', 'nexowatt-backup', 'eos-backup',
40
+ 'exact visible instance ID', 'data-eos-official-reserve-hidden', 'Reused virtual rows must be unhidden',
39
41
  ]) if (!role.includes(marker)) fail(`role UI reserve marker missing: ${marker}`);
40
42
  for (const marker of ['isOfficialReserveTab', 'isCustomerBackupTab', 'backitup', 'nexowatt-backup']) {
41
43
  if (!boot.includes(marker)) fail(`bootstrap reserve marker missing: ${marker}`);
@@ -43,7 +45,8 @@ for (const marker of ['isOfficialReserveTab', 'isCustomerBackupTab', 'backitup',
43
45
  for (const marker of ['System-Notfallsicherung', 'NexoWatt Sicherung', '^tab-backitup', 'nexowatt-backup|eos-backup']) {
44
46
  if (!drawer.includes(marker)) fail(`Drawer reserve marker missing: ${marker}`);
45
47
  }
46
- if (!assist.includes('NexoWatt Sicherung') || !assist.includes('System-Notfallsicherung')) fail('EOS Assist backup explanation is incomplete');
48
+ if (!assist.includes('NexoWatt Backup') && !assist.includes('Sicherungsstatus')) fail('EOS Assist runtime lacks backup-system context');
49
+ if (!knowledge.includes('NexoWatt Backup') || !knowledge.includes('Admin/Service')) fail('EOS Assist knowledge lacks role-aware backup context');
47
50
  if (io.native?.eosHideLegacyBackupFromNonAdmins !== true) fail('eosHideLegacyBackupFromNonAdmins must default to true');
48
51
  if (io.native?.nexowattHideLegacyBackupFromNonAdmins !== true) fail('nexowattHideLegacyBackupFromNonAdmins must default to true');
49
52
  const reserve = (io.native?.eosProtectedAdapters || []).find(entry => entry.adapter === 'backitup');
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ const root = path.resolve(__dirname, '..');
8
+ const read = rel => fs.readFileSync(path.join(root, rel), 'utf8');
9
+ let bad = false;
10
+ const fail = message => {
11
+ console.error(`[NexoWatt EOS login layout] ${message}`);
12
+ bad = true;
13
+ };
14
+
15
+ const css = read('adminWww/css/nexowatt-native-shell.css');
16
+ const sourceCss = read('src-admin/public/css/nexowatt-native-shell.css');
17
+ const login = read('src-admin/src/login/Login.tsx');
18
+ const bootstrap = read('adminWww/js/eos-role-bootstrap.js');
19
+ const index = read('adminWww/index.html');
20
+ const buildInfo = JSON.parse(read('NEXOWATT_EOS_BUILD_INFO.json'));
21
+ const shellTag = String(buildInfo.shellCacheTag || buildInfo.shellCacheVersion || '');
22
+
23
+ if (css !== sourceCss) fail('login CSS source/build drift');
24
+ if (!css.includes('outer frame is decorative only')) fail('decorative compact-frame contract is missing');
25
+ if (css.includes('html.eos-login .MuiPaper-root:has(#username)')) fail('broad :has selector still styles the outer login Paper');
26
+
27
+ const outer = css.match(/html\.eos-login main\.MuiPaper-root\s*\{([\s\S]*?)\n\}/)?.[1] || '';
28
+ for (const marker of ['position: relative', 'width: 100%', 'min-height: 100vh', 'place-items: center', 'background: transparent !important', 'box-shadow: none !important']) {
29
+ if (!outer.includes(marker)) fail(`transparent viewport host rule missing: ${marker}`);
30
+ }
31
+ const decorative = css.match(/html\.eos-login main\.MuiPaper-root::before\s*\{([\s\S]*?)\n\}/)?.[1] || '';
32
+ for (const marker of ["content: ''", 'width: min(390px, calc(100vw - 24px))', 'height: min(480px, calc(100vh - 24px))', 'transform: translate(-50%, -50%)', 'pointer-events: none']) {
33
+ if (!decorative.includes(marker)) fail(`decorative rear frame rule missing: ${marker}`);
34
+ }
35
+ const compactBlocks = [...css.matchAll(/html\.eos-login[^\{]*eos-login-card-modern[^\{]*\{([\s\S]*?)\n\}/g)].map(match => match[1]);
36
+ if (!compactBlocks.length) fail('compact login card CSS block missing');
37
+ for (const block of compactBlocks) {
38
+ if (/overflow\s*:\s*auto\s*!important/.test(block) || /overflow-y\s*:\s*(?:auto|scroll)/.test(block)) {
39
+ fail('compact login card still creates an internal scrollbar');
40
+ }
41
+ }
42
+ for (const marker of [
43
+ 'html.eos-login main.MuiPaper-root > .eos-login-card-modern',
44
+ 'html.eos-login main.MuiPaper-root > .MuiPaper-root:has(#username)',
45
+ 'html.eos-login main.MuiPaper-root > .MuiPaper-root:has(#password)',
46
+ 'width: min(334px, calc(100vw - 56px)) !important',
47
+ 'height: min(424px, calc(100vh - 56px)) !important',
48
+ 'max-height: none !important',
49
+ 'overflow: hidden !important',
50
+ 'scrollbar-width: none !important',
51
+ '::-webkit-scrollbar',
52
+ ]) if (!css.includes(marker)) fail(`inner compact card rule missing: ${marker}`);
53
+ if (!css.includes('.eos-login-first-status:empty { display: none; min-height: 0; margin: 0; }')) fail('empty first-login status still reserves vertical space');
54
+ if (!login.includes('Keep the familiar compact login page')) fail('native Login source lacks compact-page contract');
55
+ if (!login.includes("overflowY: 'hidden'")) fail('native Login paper still enables vertical scrolling');
56
+ if (login.includes('eos-login-role-selector-native') || login.includes('data-eos-account=')) fail('native Login source still renders role-selector buttons');
57
+ if (!bootstrap.includes('compact normal-login first activation')) fail('runtime compact first-login contract missing');
58
+ if (!bootstrap.includes("card.querySelectorAll('.eos-login-role-selector').forEach(element => element.remove())")) fail('runtime does not remove stale role-selector surfaces');
59
+ if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('runtime still injects a second role-selector panel');
60
+ if (!shellTag || !index.includes(`nexowatt-native-shell.css?v=${shellTag}`)) fail('login CSS cache key is not aligned with build information');
61
+ if (bad) process.exit(1);
62
+ console.log('[NexoWatt EOS login layout] OK');
@@ -19,8 +19,8 @@ for (const marker of [
19
19
  '--nx-shadow-soft', '--nx-shadow-float', 'backdrop-filter: blur', '#app-paper', '.MuiDialog-paper',
20
20
  '.MuiButton-root', '.MuiTableRow-root', ':focus-visible', 'border-radius: 24px', 'linear-gradient',
21
21
  '@media (max-width: 720px)', '.eos-activation-steps', '.eos-account-row:hover',
22
- '.eos-login-role-selector', '.eos-assist-header-root', '.eos-overview-hero', '.eos-overview-grid',
23
- '.eos-account-management-entry', 'overflow: visible',
22
+ 'main.MuiPaper-root::before', 'width: min(334px, calc(100vw - 56px)) !important', '.eos-assist-header-root', '.eos-overview-hero', '.eos-overview-grid',
23
+ '.eos-account-management-entry', 'pointer-events: auto !important', 'touch-action: manipulation', 'overflow: visible',
24
24
  ]) if (!css.includes(marker)) fail(`modern styling marker missing: ${marker}`);
25
25
  if (sourceCss !== css) fail('modern CSS source/build drift');
26
26
  for (const marker of ['eos-account-management.js','nexowatt-native-shell.css','eos-role-bootstrap.js','eos-assistant.js']) {
@@ -29,12 +29,14 @@ for (const marker of ['eos-account-management.js','nexowatt-native-shell.css','e
29
29
  for (const marker of ['NexoWatt EOS', 'Zugänge & Rollen', 'Endkunden-Zugänge', 'ensureEntrySurface']) {
30
30
  if (!accountUi.includes(marker)) fail(`modern account surface missing label: ${marker}`);
31
31
  }
32
- for (const marker of ['installIntegratedFirstLogin','eos-login-role-selector','eos-login-role-buttons','eos-passwordless-card']) {
32
+ for (const marker of ['installIntegratedFirstLogin','v93 compact normal-login first activation','eos-passwordless-card','Idempotent writes are essential here']) {
33
33
  if (!bootstrap.includes(marker)) fail(`integrated first-activation surface missing: ${marker}`);
34
34
  }
35
+ if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('compact login still injects role buttons or a second panel');
35
36
  if (bootstrap.includes("launcher.className = 'eos-passwordless-launcher'")) fail('old bottom first-login launcher is still rendered');
36
37
  if (!shell.includes('ensureModernOverview') || !shell.includes("currentTab() !== 'tab-intro'")) fail('current overview is not modernized');
37
- if (!role.includes('eos-role-safe-overview') || !role.includes("currentRoute() !== 'tab-intro'")) fail('role-safe current overview is missing');
38
+ if (!role.includes('eos-role-safe-overview') || !role.includes("currentRoute() !== 'tab-intro'") || !role.includes('navigateToTab') || !role.includes("overview.querySelectorAll('a[data-eos-role-tab]')")) fail('role-safe current overview is missing or not directly clickable');
39
+ if (!role.includes('ensureReserveObserver') || !role.includes('state.reserveObserver.observe(paper')) fail('scoped delayed-row reserve filter is missing');
38
40
  if (!assist.includes('eos-assist-header-root') || !assist.includes('insertBefore(root, userAnchor)')) fail('EOS Assist is not integrated in the header');
39
41
  if (assist.includes('position:fixed;bottom') || assist.includes('bottom:')) fail('EOS Assist still uses a bottom floating position');
40
42
 
@@ -42,7 +44,7 @@ const observerCount = [
42
44
  'eos-policy-client.js', 'eos-branding-sanitizer.js', 'nexowatt-native-shell.js', 'eos-native-security.js',
43
45
  'eos-basic-settings.js', 'eos-role-ui.js', 'eos-account-management.js', 'eos-assistant.js',
44
46
  ].reduce((count, file) => count + (read(`adminWww/js/${file}`).match(/new MutationObserver/g) || []).length, 0);
45
- if (observerCount !== 1) fail(`expected exactly one shared broad MutationObserver, found ${observerCount}`);
47
+ if (observerCount !== 2) fail(`expected one shared observer plus one scoped reserve-row observer, found ${observerCount}`);
46
48
 
47
49
  if (bad) process.exit(1);
48
50
  console.log('[NexoWatt EOS modern UI] OK');
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const assert = require('node:assert/strict');
5
+ const { CANONICAL_NATIVE_DEFAULTS, ensureReleaseDefaults } = require('./nexowatt-ensure-release-defaults.cjs');
6
+
7
+ const unsafe = {
8
+ common: { name: 'eos-admin' },
9
+ native: {
10
+ auth: false,
11
+ port: 8091,
12
+ eosLockLegacyAdmin: false,
13
+ eosHideLegacyAdminFromNonAdmins: false,
14
+ eosHideLegacyBackupFromNonAdmins: false,
15
+ nexowattHideLegacyBackupFromNonAdmins: false,
16
+ eosRequireFirstLoginPassword: false,
17
+ },
18
+ };
19
+ const repaired = ensureReleaseDefaults(unsafe);
20
+ assert.ok(repaired.changes.length >= 7, 'unsafe defaults must be repaired');
21
+ for (const [key, expected] of Object.entries(CANONICAL_NATIVE_DEFAULTS)) {
22
+ assert.equal(repaired.ioPackage.native[key], expected, `${key} must be normalized`);
23
+ }
24
+
25
+ const canonical = { native: { ...CANONICAL_NATIVE_DEFAULTS } };
26
+ const unchanged = ensureReleaseDefaults(canonical);
27
+ assert.equal(unchanged.changes.length, 0, 'canonical defaults must remain unchanged');
28
+
29
+ console.log('[NexoWatt EOS release defaults selftest] OK');
@@ -32,10 +32,15 @@ if (prerelease) {
32
32
  } else if (pkg.nexowattReleasePolicy?.acceptedPrerelease) {
33
33
  fail(`stable package must remove stale acceptedPrerelease ${pkg.nexowattReleasePolicy.acceptedPrerelease}`);
34
34
  }
35
+ if (pkg.scripts['prepare:eos-release-defaults'] !== 'node tools/nexowatt-ensure-release-defaults.cjs') fail('release-default preparation script is missing');
36
+ if (pkg.scripts['test:eos-release-defaults'] !== 'node tools/nexowatt-release-defaults-selftest.cjs') fail('release-default selftest script is missing');
35
37
  if (pkg.scripts['check:eos-publish-channel'] !== 'node tools/nexowatt-publish-channel-guard.cjs') fail('publish channel guard script is missing');
36
- if (!pkg.scripts.prepublishOnly?.startsWith('npm run check:eos-publish-channel')) fail('prepublishOnly must execute the publish channel guard first');
38
+ if (!pkg.scripts.prepublishOnly?.startsWith('npm run prepare:eos-release-defaults && npm run check:eos-publish-channel')) fail('prepublishOnly must normalize release defaults before the publish channel guard');
39
+ if (pkg.scripts['precheck:eos-package'] !== 'npm run prepare:eos-release-defaults && npm run clean:eos-runtime') fail('precheck:eos-package must normalize release defaults and clean stale runtime files');
40
+ if (pkg.scripts['precheck:eos-stability'] !== 'npm run prepare:eos-release-defaults && npm run clean:eos-runtime') fail('precheck:eos-stability must normalize release defaults and clean stale runtime files');
37
41
  if (pkg.scripts['test:eos-publish-channel'] !== 'node tools/nexowatt-publish-channel-selftest.cjs') fail('publish channel selftest script is missing');
38
42
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-publish-channel-selftest.cjs')) fail('stability check must execute the publish channel selftest');
43
+ if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-release-defaults-selftest.cjs')) fail('stability check must execute the release-default selftest');
39
44
  if (io.native?.auth !== true) fail('fresh sales installations must default to authenticated access');
40
45
  if (io.native?.eosHideLegacyBackupFromNonAdmins !== true) fail('internal BackItUp reserve must default to Admin/Service visibility');
41
46
  if (io.native?.nexowattHideLegacyBackupFromNonAdmins !== true) fail('NexoWatt backup visibility compatibility flag must default to true');
@@ -98,10 +103,10 @@ for (const file of [
98
103
  'LICENSE',
99
104
  'NEXOWATT_PROPRIETARY_LICENSE.md',
100
105
  'THIRD_PARTY_NOTICES.md',
101
- 'README_STABILITY_V7.9.89.md',
102
- 'PUBLISH_STABLE_V7.9.89.md',
103
- 'INSTALL_TEST_V7.9.89.md',
104
- 'RELEASE_ACCEPTANCE_V7.9.89.md',
106
+ 'README_STABILITY_V7.9.93.md',
107
+ 'PUBLISH_STABLE_V7.9.93.md',
108
+ 'INSTALL_TEST_V7.9.93.md',
109
+ 'RELEASE_ACCEPTANCE_V7.9.93.md',
105
110
  'tools/nexowatt-patch-built-frontend.cjs',
106
111
  'tools/nexowatt-native-shell-selftest.cjs',
107
112
  'tools/nexowatt-clean-legacy-runtime.cjs',
@@ -113,10 +118,13 @@ for (const file of [
113
118
  'tools/nexowatt-first-login-selftest.cjs',
114
119
  'tools/nexowatt-account-management-selftest.cjs',
115
120
  'tools/nexowatt-modern-ui-selftest.cjs',
121
+ 'tools/nexowatt-login-layout-selftest.cjs',
116
122
  'tools/nexowatt-internal-reserve-selftest.cjs',
117
123
  'tools/nexowatt-branding-selftest.cjs',
118
124
  'tools/nexowatt-publish-channel-guard.cjs',
119
125
  'tools/nexowatt-publish-channel-selftest.cjs',
126
+ 'tools/nexowatt-ensure-release-defaults.cjs',
127
+ 'tools/nexowatt-release-defaults-selftest.cjs',
120
128
  'tools/nexowatt-default-port-selftest.cjs',
121
129
  '.npmrc',
122
130
  repositoryEntryFile,
@@ -195,7 +203,9 @@ if (accountManagement.includes("launcher.className = 'eos-account-management-lau
195
203
  if (accountManagement.includes('new MutationObserver')) fail('account-management runtime adds a second broad DOM observer');
196
204
  if (read('src-admin/public/js/eos-account-management.js') !== accountManagement) fail('account-management source/build drift');
197
205
  const roleBootstrap = read('adminWww/js/eos-role-bootstrap.js');
198
- if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('eos-login-role-selector')) fail('integrated first-login is incomplete');
206
+ if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('v93 compact normal-login first activation')) fail('compact integrated first-login is incomplete');
207
+ if (/data-eos-account=|selector\.innerHTML/.test(roleBootstrap)) fail('login role buttons must not enlarge the normal login card');
208
+ if (!roleBootstrap.includes('nexowatt/account/passwordless-status') || !roleBootstrap.includes('eligibility.allowed')) fail('server-checked first-login eligibility is incomplete');
199
209
  if (roleBootstrap.includes('installPasswordlessFirstLoginLauncher')) fail('old first-login launcher remains active');
200
210
  const assistant = read('adminWww/js/eos-assistant.js');
201
211
  if (!assistant.includes('eos-assist-header-root') || !assistant.includes('insertBefore(root, userAnchor)')) fail('EOS Assist is not header-integrated');
@@ -217,14 +227,14 @@ if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-esm-syntax-selftest.
217
227
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-import-integrity-selftest.cjs')) fail('import integrity selftest is not part of check:eos-stability');
218
228
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-entrypoint-smoke-selftest.cjs')) fail('entrypoint smoke selftest is not part of check:eos-stability');
219
229
  if (pkg.scripts['clean:eos-runtime'] !== 'node tools/nexowatt-clean-legacy-runtime.cjs') fail('clean:eos-runtime script is missing or incorrect');
220
- if (pkg.scripts['precheck:eos-package'] !== 'npm run clean:eos-runtime') fail('precheck:eos-package must clean stale runtime files');
221
- if (pkg.scripts['precheck:eos-stability'] !== 'npm run clean:eos-runtime') fail('precheck:eos-stability must clean stale runtime files');
222
230
  if (pkg.scripts.prepack !== 'node tools/nexowatt-clean-legacy-runtime.cjs --quiet') fail('prepack must silently clean stale runtime files');
223
231
  if (!pkg.scripts.build?.includes('npm run clean:eos-runtime')) fail('build must finish with runtime cleanup');
224
232
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-role-access-selftest.cjs')) fail('role access selftest is not part of check:eos-stability');
225
233
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-first-login-selftest.cjs')) fail('first-login selftest is not part of check:eos-stability');
226
234
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-account-management-selftest.cjs')) fail('account-management selftest is not part of check:eos-stability');
227
235
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-modern-ui-selftest.cjs')) fail('modern-UI selftest is not part of check:eos-stability');
236
+ if (pkg.scripts['test:eos-login-layout'] !== 'node tools/nexowatt-login-layout-selftest.cjs') fail('login-layout selftest script is missing or incorrect');
237
+ if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-login-layout-selftest.cjs')) fail('login-layout selftest is not part of check:eos-stability');
228
238
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-internal-reserve-selftest.cjs')) fail('internal reserve selftest is not part of check:eos-stability');
229
239
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-branding-selftest.cjs')) fail('branding selftest is not part of check:eos-stability');
230
240
  if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-native-shell-selftest.cjs')) fail('native shell selftest is not part of check:eos-stability');
@@ -1,73 +0,0 @@
1
- # Installation und Abnahme – NexoWatt EOS Admin 7.9.89
2
-
3
- ## Installation aus npm
4
-
5
- ```bash
6
- cd /opt/iobroker
7
- iobroker backup
8
- iobroker stop eos-admin.0
9
- npm install --no-save --omit=dev iobroker.eos-admin@7.9.89
10
- iobroker upload eos-admin
11
- iobroker restart eos-admin.0
12
- ```
13
-
14
- ## Portbelegung
15
-
16
- ```bash
17
- iobroker set admin.0 --port 18081 --ip 127.0.0.1 --enabled false
18
- iobroker set eos-admin.0 --port 8081 --ip 0.0.0.0 --enabled true
19
- iobroker restart eos-admin.0
20
- ```
21
-
22
- Aufruf:
23
-
24
- ```text
25
- http://SYSTEM-IP:8081
26
- ```
27
-
28
- ## Pflichtabnahme
29
-
30
- ### Admin / Service
31
-
32
- - Anmeldung mit dem fest eingerichteten Passwort.
33
- - Kein erzwungener Erstkennwortdialog.
34
- - Expertenmodus verfügbar.
35
- - Interner Admin und System-Notfallsicherung sichtbar.
36
- - Vollständige Zugangs- und Rechteverwaltung.
37
-
38
- ### Installateur
39
-
40
- - Erste Aktivierung: Ebene **Installateur**, Benutzer `installer`, Passwort leer, danach persönliches Passwort setzen.
41
- - Kein Expertenmodus.
42
- - Inbetriebnahme, Module, Dienste, Datenpunkte und Diagnose erreichbar.
43
- - **Zugänge & Rechte** erreichbar; nur Endkunden-Reset möglich.
44
- - Interner Admin und interne BackItUp-Notfallreserve nicht sichtbar.
45
- - NexoWatt Sicherung nutzbar, sofern installiert und freigegeben.
46
-
47
- ### Gast / Endkunde
48
-
49
- - Erste Aktivierung: Ebene **Gast / Endkunde**, Benutzer `guest`, Passwort leer, danach persönliches Passwort setzen.
50
- - Kein Expertenmodus.
51
- - Freigegebenes Smart Home, Räume, Funktionen und Bedienoberflächen erreichbar.
52
- - Keine technischen System-, Repository-, Zertifikats- oder Rohdiagnosebereiche.
53
- - Interner Admin und interne BackItUp-Notfallreserve nicht sichtbar.
54
- - NexoWatt Sicherung nutzbar, sofern freigegeben.
55
-
56
- ### Bedienoberfläche
57
-
58
- - EOS Assist sitzt im Kopfbereich und überlappt keine Inhalte.
59
- - Zugangsverwaltung erscheint nur unter **Zugänge & Rechte**.
60
- - Startseite ist **Übersicht**, nicht Easy.
61
- - Keine `permissionError`-Leerseite.
62
- - Dialoge, Popups und Schließen-Schaltflächen funktionieren.
63
- - Schreibbare Datenpunkte sind entsprechend Rolle bedienbar.
64
-
65
- ## Rückfall auf 7.9.86
66
-
67
- ```bash
68
- cd /opt/iobroker
69
- iobroker stop eos-admin.0
70
- npm install --no-save --omit=dev iobroker.eos-admin@7.9.86
71
- iobroker upload eos-admin
72
- iobroker restart eos-admin.0
73
- ```
@@ -1,33 +0,0 @@
1
- # npm-Veröffentlichung – NexoWatt EOS Admin 7.9.89 Stable
2
-
3
- ## Vorprüfung
4
-
5
- ```powershell
6
- npm run check:eos-publish-channel
7
- npm run check:eos-package
8
- npm run check:eos-stability
9
- npm publish --dry-run --tag latest
10
- ```
11
-
12
- ## Veröffentlichung
13
-
14
- ```powershell
15
- npm login
16
- npm whoami
17
- npm publish --tag latest
18
- ```
19
-
20
- ## Kontrolle
21
-
22
- ```powershell
23
- npm view iobroker.eos-admin@latest version
24
- npm dist-tag ls iobroker.eos-admin
25
- ```
26
-
27
- Erwartet:
28
-
29
- ```text
30
- latest: 7.9.89
31
- ```
32
-
33
- Bereits veröffentlichte Paketversionen dürfen nicht mit verändertem Inhalt erneut veröffentlicht werden. Jede spätere Änderung benötigt eine höhere Versionsnummer.
@@ -1,26 +0,0 @@
1
- # NexoWatt EOS Admin 7.9.89 – Stable
2
-
3
- Version 7.9.89 ist die freigegebene Produktlinie für NexoWatt-EOS-Verkaufssysteme auf Basis der bewährten Admin-7-Laufzeit.
4
-
5
- ## Produktfunktionen
6
-
7
- - Rollenmodell **Admin / Service**, **Installateur** und **Gast / Endkunde**.
8
- - Expertenmodus ausschließlich für Admin / Service.
9
- - Installateurzugriff für Inbetriebnahme, Konfiguration und Fehlersuche.
10
- - Endkundenzugriff für freigegebenes Smart Home, Räume, Funktionen und NexoWatt-Bedienbereiche.
11
- - Erstanmeldung von `installer` und `guest` direkt in der normalen Anmeldekarte: Benutzerstufe wählen, Passwort einmalig leer lassen und anschließend zwingend ein persönliches Passwort vergeben.
12
- - Passwort-Reset: Admin / Service darf Installateur und Endkunde zurücksetzen; Installateur ausschließlich Endkunde.
13
- - EOS Assist im Kopfbereich ohne Überlagerung der Inhaltsfläche.
14
- - Zugangsverwaltung ausschließlich unter **Zugänge & Rechte**.
15
- - Moderne aktuelle **Übersicht**; die Easy-Übersicht wird nicht als Produktstartseite verwendet.
16
- - Interner System-Admin und interne BackItUp-Notfallreserve nur für Admin / Service sichtbar.
17
- - NexoWatt Sicherung für die dafür freigegebenen Rollen nutzbar.
18
- - Standardport 8081; interne Admin-Reserve auf 127.0.0.1:18081.
19
-
20
- ## Sicherheitsprinzip
21
-
22
- Ausgeblendete Bedienelemente sind nicht die einzige Schutzschicht. Kritische Aktionen werden zusätzlich über Rollenprüfung, Socket-Guard und Objekt-ACLs abgesichert. Fehlende oder unbekannte Rollen fallen auf die geringsten Endkundenrechte zurück.
23
-
24
- ## Rückfallstand
25
-
26
- Die vorherige Stable 7.9.86 bleibt als dokumentierter Rückfallstand erhalten. Vor einem Produktupdate ist ein vollständiges Backup vorgeschrieben.