iobroker.goodwe-sems 0.1.9 → 0.1.12

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.de.md CHANGED
@@ -9,9 +9,9 @@
9
9
  ![Test and Release](https://github.com/bueste/ioBroker.goodwe-sems/actions/workflows/test-and-release.yml/badge.svg)
10
10
  [![Donate](https://img.shields.io/badge/Spenden-PayPal-00457C?style=flat&logo=paypal&logoColor=white)](https://www.paypal.com/ncp/payment/TT6MTBLXX9L9U)
11
11
 
12
- Liest Wechselrichter-, Batterie- und Energiefluss-Daten aus dem **GoodWe SEMS Portal (Cloud)** – für Anlagen, die (z. B. weil kein LAN-Zugriff auf den Wechselrichter besteht) **nicht** mit dem lokalen [ioBroker.goodwe](https://github.com/FossyTom/ioBroker.goodwe)-Adapter (Modbus/UDP, Port 8899) abgefragt werden können.
12
+ Liest Wechselrichter-, Batterie- und Energiefluss-Daten aus dem **[GoodWe](https://www.goodwe.com) [SEMS Portal](https://www.semsportal.com) (Cloud)** – für Anlagen, die (z. B. weil kein LAN-Zugriff auf den Wechselrichter besteht) **nicht** mit dem lokalen [ioBroker.goodwe](https://github.com/FossyTom/ioBroker.goodwe)-Adapter (Modbus/UDP, Port 8899) abgefragt werden können.
13
13
 
14
- Login erfolgt mit dem **ganz normalen SEMS-Portal-Konto** (dasselbe wie unter semsportal.com / in der SEMS-App). Ein GoodWe-"Organization"/OpenAPI-Konto wird **nicht** benötigt.
14
+ Login erfolgt mit dem **ganz normalen SEMS-Portal-Konto** (dasselbe wie unter semsportal.com / in der SEMS-App). Ein GoodWe-„Organization“/OpenAPI-Konto wird **nicht** benötigt.
15
15
 
16
16
  ## Inhaltsverzeichnis
17
17
 
@@ -29,7 +29,7 @@ Login erfolgt mit dem **ganz normalen SEMS-Portal-Konto** (dasselbe wie unter se
29
29
 
30
30
  ## Warum dieser Adapter?
31
31
 
32
- GoodWe ET/EH/BH/BT-Wechselrichter lassen sich normalerweise lokal per Modbus/UDP auslesen (siehe [ioBroker.goodwe](https://github.com/FossyTom/ioBroker.goodwe)). Steht kein LAN-Zugriff auf den Wechselrichter zur Verfügung (z. B. weil nur ein WLAN/LTE-Stick mit dem SEMS-Portal verbunden ist und das Zielnetz nicht erreichbar ist), bleibt nur der Umweg über die Cloud: das **SEMS Portal** (semsportal.com), über das die Anlage ohnehin schon überwacht wird.
32
+ GoodWe ET/EH/BH/BT-Wechselrichter lassen sich normalerweise lokal per Modbus/UDP auslesen (siehe [ioBroker.goodwe](https://github.com/FossyTom/ioBroker.goodwe)). Steht kein LAN-Zugriff auf den Wechselrichter zur Verfügung (z. B. weil nur ein WLAN/LTE-Stick mit dem SEMS-Portal verbunden ist und das Zielnetz nicht erreichbar ist), bleibt nur der Umweg über die Cloud: das **[SEMS Portal](https://www.semsportal.com)** ([GoodWe](https://www.goodwe.com)), über das die Anlage ohnehin schon überwacht wird.
33
33
 
34
34
  ## API-Herkunft und Grenzen (bitte lesen)
35
35
 
@@ -54,12 +54,12 @@ Für ein **normales** SEMS-Portal-Konto (wie es die meisten Privatanwender haben
54
54
 
55
55
  ## Installation
56
56
 
57
- Solange der Adapter noch nicht im offiziellen ioBroker-Repository gelistet ist:
57
+ Sobald dieser Adapter im offiziellen ioBroker-Adapter-Repository gelistet ist, wird er ganz normal installiert: **Admin -> Adapter -> nach „goodwe-sems“ suchen -> installieren**.
58
+
59
+ Bis dahin kann ein ioBroker-Administrator ihn manuell auf dem ioBroker-Host hinzufügen:
58
60
 
59
61
  ```
60
- cd /opt/iobroker
61
- npm install https://github.com/bueste/ioBroker.goodwe-sems/tarball/main
62
- iobroker add goodwe-sems
62
+ iobroker url iobroker.goodwe-sems
63
63
  ```
64
64
 
65
65
  ## Konfiguration
@@ -106,7 +106,7 @@ Felder, die das Portal liefert, aber dieser Adapter (noch) nicht kennt, gehen ni
106
106
  - **Rate-Limit (`GY0429`)** → sofortige Pause (Default 300 s), `info.rateLimited = true`.
107
107
  - **Login-Fehler** → exponentielles Backoff (bis 1 h Deckel), damit falsche Zugangsdaten das Konto nicht zusätzlich belasten.
108
108
  - **Netzwerk-/Protokollfehler** → moderates Backoff.
109
- - Nach konfigurierbar vielen aufeinanderfolgenden Fehlversuchen (Default 3) gilt die Anlage als "offline" und es wird - falls aktiviert - eine Pushover-Meldung ausgelöst.
109
+ - Nach konfigurierbar vielen aufeinanderfolgenden Fehlversuchen (Default 3) gilt die Anlage als offline und es wird - falls aktiviert - eine Pushover-Meldung ausgelöst.
110
110
  - Alles wird zusätzlich strukturiert ins ioBroker-Log geschrieben (`error`/`warn`/`debug` je nach Schweregrad).
111
111
 
112
112
  ## Pushover-Benachrichtigungen
@@ -121,9 +121,10 @@ Ausgelöst wird bei: SEMS-Login-Fehler, SEMS-Rate-Limit, länger andauerndem Aus
121
121
 
122
122
  ## Sicherheit & Datenschutz
123
123
 
124
- - SEMS-Passwort und Pushover-API-Token sind in `io-package.json` als `encryptedNative`/`protectedNative` markiert und werden von ioBroker verschlüsselt abgelegt, nicht im Klartext geloggt (Kontoname wird in Log-Meldungen maskiert, z. B. `st***@gmail.com`).
124
+ - SEMS-Passwort und Pushover-API-Token sind an der Wurzel von `io-package.json` als `encryptedNative`/`protectedNative` markiert und werden von ioBroker verschlüsselt abgelegt, nicht im Klartext geloggt (Kontoname wird in Log-Meldungen maskiert, z. B. `st***@gmail.com`).
125
125
  - Der Adapter führt **ausschließlich lesende** Zugriffe aus (`GetMonitorDetailByPowerstationId`, `GetPowerStationIdByOwner`). Es gibt bewusst **keine** Fernsteuerungs-/Schreibfunktion (`SaveRemoteControlInverter`) - das wäre ein deutlich größeres Sicherheits- und Haftungsrisiko und war nicht Teil der Anforderung.
126
- - Keine Drittanbieter-Abhängigkeiten für den HTTP-Zugriff: Es wird das in Node.js ≥18 eingebaute `fetch` verwendet statt einer zusätzlichen HTTP-Bibliothek - kleinere Angriffsfläche, weniger Supply-Chain-Risiko.
126
+ - Keine Drittanbieter-Abhängigkeiten für den HTTP-Zugriff: Es wird das in Node.js ≥22 eingebaute `fetch` verwendet statt einer zusätzlichen HTTP-Bibliothek - kleinere Angriffsfläche, weniger Supply-Chain-Risiko.
127
+ - Die vom Login-Server gelieferte API-Basis-URL wird validiert (nur HTTPS auf GoodWe-eigenen Domains), bevor sie für weitere Anfragen genutzt wird - eine manipulierte Login-Antwort kann das Session-Token dadurch nicht an einen fremden Host umleiten.
127
128
  - Alle Netzwerkfehler werden typisiert abgefangen; es werden keine ungeprüften Daten aus der API-Antwort ausgeführt (`eval`, `Function`, o. ä. werden nirgends verwendet).
128
129
 
129
130
  ## Entwicklung
@@ -137,15 +138,65 @@ npm test # Unit-Tests (lib/mapping.js, lib/semsApi.js, lib/notify.js) +
137
138
  Empfehlung vor jedem Release zusätzlich lokal:
138
139
 
139
140
  ```
140
- npx @iobroker/adapter-checker@latest .
141
+ npx @iobroker/repochecker@latest .
141
142
  ```
142
143
 
143
144
  Pull Requests willkommen, insbesondere um zusätzliche, vom Portal gelieferte Felder zu ergänzen (siehe `info.rawResponse` mit aktivierter Debug-Option) oder Übersetzungen zu verbessern.
144
145
 
145
146
  ## Changelog
146
147
 
148
+ <!--
149
+ Platzhalter für die nächste Version (am Zeilenanfang):
150
+ ### **WORK IN PROGRESS**
151
+ -->
147
152
  ### **WORK IN PROGRESS**
148
153
 
154
+ ### 0.1.12 (2026-07-19)
155
+
156
+ Weitere Fixes aus einem Repochecker-Recheck der `ioBroker.repositories`-Listing-PR:
157
+
158
+ - (Stefan Bühler) **[E2004]** Eintrag `0.1.10` aus `common.news` in `io-package.json` entfernt - die CI dieser Version schlug vor dem Deploy-Schritt fehl, sie wurde also nie tatsächlich auf npm veröffentlicht
159
+ - (Stefan Bühler) **[S3014]** `needs: check-and-lint` beim `adapter-tests`-Job ergänzt, damit dieser erst nach erfolgreichem Linting läuft
160
+ - (Stefan Bühler) **[W0066]** `@types/node` auf `^22` fixiert (war das offene `>=22`, das auf eine neuere Major-Version mit unpassenden Typdefinitionen auflösen könnte)
161
+ - (Stefan Bühler) **[W4040]/[W4042]** JSON-Schema-Zuordnungen in `.vscode/settings.json` korrigiert: `fileMatch`-Einträge dürfen keinen führenden Slash haben, und das jsonConfig-Schema muss zusätzlich auf `admin/jsonCustom.json` und `admin/jsonTab.json` passen
162
+ - (Stefan Bühler) **[S8913]** `.github/workflows/automerge-dependabot.yml` (mit `iobroker-bot-orga/action-automerge-dependabot@v1`) und `.github/auto-merge.yml` ergänzt, damit Patch-Updates (und Minor-Updates bei Dev-Dependencies) von Dependabot automatisch gemerged werden
163
+
164
+ ### 0.1.11 (2026-07-19)
165
+
166
+ - (Stefan Bühler) einen echten CI-Fehler aus 0.1.10 behoben: Node.js 20.x aus der `adapter-tests`-Matrix in `.github/workflows/test-and-release.yml` entfernt. Diese Version ist inkompatibel mit `engines.node >=22` (ebenfalls seit 0.1.10), sobald die offizielle `ioBroker/testing-action-adapter@v1`-Action `npm ci` mit aktiviertem `engine-strict` ausführt - das ließ diesen Matrix-Job abstürzen und brach per Fail-Fast alle anderen Jobs ab
167
+
168
+ ### 0.1.10 (2026-07-19)
169
+
170
+ Zweite Runde von Fixes für weitere Befunde eines strengeren automatisierten `@iobroker/repochecker`-Rechecks der `ioBroker.repositories`-Listing-PR:
171
+
172
+ - (Stefan Bühler) **[W0028]** `engines.node` auf `>=22` angehoben
173
+ - (Stefan Bühler) **[W0063]** `chai`, `chai-as-promised`, `mocha`, `sinon` aus devDependencies entfernt (bereits in `@iobroker/testing` enthalten)
174
+ - (Stefan Bühler) **[S0065]/[S0085]/[S0087]** `@types/node`, `@tsconfig/node22` und `/tsconfig.json` für Editor-Typprüfung ergänzt
175
+ - (Stefan Bühler) **[S5026]** Release-Plugin `@alcalzone/release-script-plugin-manual-review` ergänzt
176
+ - (Stefan Bühler) **[W3013]/[W3015]/[W3017]** `.github/workflows/test-and-release.yml` neu geschrieben: nutzt jetzt die offiziellen geteilten Actions `ioBroker/testing-action-check@v1`, `ioBroker/testing-action-adapter@v1` und `ioBroker/testing-action-deploy@v1` statt handgeschriebener Steps
177
+ - (Stefan Bühler) `test/integration.js` ergänzt (Adapter-Start-Smoke-Test über den Integrations-Harness von `@iobroker/testing`), damit `npm run test:integration` erfolgreich läuft
178
+ - (Stefan Bühler) **[E1032]** `common.news` in `io-package.json` auf die vom Repository-Builder verwendeten 7 Einträge gekürzt
179
+ - (Stefan Bühler) **[E5512]** fehlende Pflicht-Eigenschaft `size` beim Pushover-Abschnitts-Header in `admin/jsonConfig.json` ergänzt
180
+ - (Stefan Bühler) **[S5601]** `admin/i18n` vom langen `{lang}/translations.json`-Format auf das kurze `{lang}.json`-Format migriert
181
+ - (Stefan Bühler) **[S4036]** `.vscode/settings.json` mit JSON-Schema-Zuordnungen für `io-package.json` und `admin/jsonConfig.json` ergänzt
182
+ - (Stefan Bühler) **[S8901]** `.github/dependabot.yml` ergänzt (npm + github-actions, wöchentlich, mit Cooldown und einer Ignore-Regel für Major-/Minor-Updates von `@types/node`)
183
+
184
+ ### 0.1.9 (2026-07-19)
185
+
186
+ Behebt die strengeren Befunde des automatisierten `@iobroker/repochecker`, die bei der `ioBroker.repositories`-Listing-PR aufgetreten sind:
187
+
188
+ - (Stefan Bühler) **[E1057]** `encryptedNative`/`protectedNative` von `common` an die Wurzel von `io-package.json` verschoben, entsprechend dem aktuellen Schema
189
+ - (Stefan Bühler) **[E3009]/[E3010]/[E3011]/[E3012]** `engines.node` auf `>=20`, `@iobroker/adapter-core` auf `^3.4.1`, die `js-controller`-Abhängigkeit auf `>=6.0.11`, die `admin`-GlobalDependency auf `>=7.6.20` angehoben
190
+ - (Stefan Bühler) **[E3040]** devDependencies aktualisiert (`@iobroker/adapter-dev`, `@iobroker/testing`, mocha, esbuild u. a.) auf aktuelle Major-Versionen
191
+ - (Stefan Bühler) **[E3000er-Serie]** `.github/workflows/test-and-release.yml` auf das aktuelle offizielle Template umgestellt: Jobs umbenannt (`check-and-lint`, `adapter-tests`, `adapter-check`, `deploy`), volle OS/Node-Testmatrix (ubuntu/windows/macos x 20/22/24), `concurrency`-Gruppe, Deploy-Job auf Node 24 fixiert
192
+ - (Stefan Bühler) **[E5005]** globale `setTimeout`/`clearTimeout` durch adapter-verwaltete Timer (`adapter.setTimeout`/`adapter.clearTimeout`) in `lib/notify.js` und `lib/semsApi.js` ersetzt
193
+ - (Stefan Bühler) **[E5043]** auf `require("node:crypto")` umgestellt
194
+ - (Stefan Bühler) **[E5507]/[E5510]/[E5512]/[E5612]** `admin/jsonConfig.json` korrigiert: fehlende `lg`/`xl`-Responsive-Größen bei allen Items ergänzt, einen literalen Label-String durch einen echten i18n-Key ersetzt (`loginTab`, in allen 11 Übersetzungsdateien ergänzt)
195
+ - (Stefan Bühler) **[E6004]/[E6015]/[W0037]/[W0076]** `README.md` ins Englische übersetzt (Pflichtsprache), bisherigen deutschen Inhalt nach `README.de.md` verschoben, `CHANGELOG_OLD.md` für ältere Einträge ergänzt
196
+ - (Stefan Bühler) **[W9501]** überflüssige `.npmignore` entfernt (durch `files` in package.json ersetzt)
197
+ - (Stefan Bühler) **[E9006]** `.commitinfo` zur `.gitignore` ergänzt
198
+ - (Stefan Bühler) **[S4036]/[S5026]** `prettier.config.mjs` ergänzt, Codebasis neu formatiert, `jsdoc/reject-any-type` für den opaken Node-Timer-Handle-Typ mit begründendem Kommentar deaktiviert
199
+
149
200
  ### 0.1.8 (2026-07-19)
150
201
 
151
202
  ioBroker-Adapter-Check-Befunde behoben:
@@ -153,8 +204,8 @@ ioBroker-Adapter-Check-Befunde behoben:
153
204
  - (Stefan Bühler) **[E254]** News-Einträge für 0.1.1/0.1.2 entfernt - diese Tags wurden zwar gepusht, aber der zugehörige npm-Publish-Job schlug damals fehl (fehlendes NPM_TOKEN bzw. zu alte npm-CLI für OIDC), die Versionen existieren nie auf npm
154
205
  - (Stefan Bühler) **[W132]** dadurch automatisch unter dem 7-Einträge-Limit des Repository-Builders für `common.news`
155
206
  - (Stefan Bühler) **[W184]** veraltetes `common.title` entfernt (durch `common.titleLang` ersetzt) und veraltetes/ignoriertes `common.main` entfernt (Entry-Point kommt aus `package.json`)
156
- - (Stefan Bühler) **[W034]** `@iobroker/adapter-core` von ^3.1.6 auf ^3.2.2 angehoben (installiert 3.4.3)
157
- - (Stefan Bühler) **[W173]/[W174]/[E999]/[W401]**: `password` ist bereits korrekt in `encryptedNative`/`protectedNative` gelistet (per Tarball-Inspektion verifiziert) - diese Meldungen sowie der globale Axios-404-Fehler beim Abruf von `sources-dist-latest.json` sind Nebenwirkungen davon, dass der Adapter noch nicht im offiziellen ioBroker-Repository gelistet ist; sollten nach der Aufnahme verschwinden
207
+ - (Stefan Bühler) **[W034]** `@iobroker/adapter-core` von ^3.1.6 auf ^3.2.2 angehoben
208
+ - (Stefan Bühler) **[W173]/[W174]/[E999]/[W401]**: `password` ist bereits korrekt in `encryptedNative`/`protectedNative` gelistet (per Tarball-Inspektion verifiziert) - diese Meldungen sowie der globale Axios-404-Fehler beim Abruf von `sources-dist-latest.json` sind Nebenwirkungen davon, dass der Adapter noch nicht im offiziellen ioBroker-Repository gelistet war
158
209
 
159
210
  ### 0.1.7 (2026-07-19)
160
211
 
@@ -179,25 +230,7 @@ Sicherheits-/Qualitätsaudit (Security-Tester, Maintainer-Review, Fuzzing der Ma
179
230
 
180
231
  - (Stefan Bühler) fix: PayPal-Spendenlink im README korrigiert (Button-Link statt Donate-Link)
181
232
 
182
- ### 0.1.4 (2026-07-18)
183
-
184
- - (Stefan Bühler) docs: PayPal-Spendenlink im README ergänzt
185
-
186
- ### 0.1.3 (2026-07-18)
187
-
188
- - (Stefan Bühler) CI: OIDC Trusted Publishing repariert - Node 22 Runner bringt npm 10.9.x mit, was unter der für Trusted Publishing benötigten Version (>=11.5.1) liegt. Release-Job aktualisiert npm jetzt explizit vor `npm publish`.
189
-
190
- ### 0.1.2 (2026-07-18)
191
-
192
- - (Stefan Bühler) CI: npm-Publish von langlebigem `NPM_TOKEN` auf OIDC Trusted Publishing umgestellt (kein Secret mehr im Repo nötig)
193
-
194
- ### 0.1.1 (2026-07-18)
195
-
196
- - (Stefan Bühler) fix `repository.url` field format in package.json (removed npm-publish normalization warning)
197
-
198
- ### 0.1.0 (2026-07-18)
199
-
200
- - (Stefan Bühler) initial release: SEMS-Portal-Login (SEMS+ mit Legacy-Fallback), automatische Anlagen-Erkennung, vollständiges Monitoring (Station/KPI/PowerFlow/Battery/EV-Charger/pro Wechselrichter), Rate-Limit-Handling, Backoff, Pushover-Alarmierung, Admin6-JSON-Config, i18n (11 Sprachen), Unit-Tests.
233
+ Ältere Changelog-Einträge stehen in [CHANGELOG_OLD.md](CHANGELOG_OLD.md) (Englisch).
201
234
 
202
235
  ## Lizenz
203
236
 
package/README.md CHANGED
@@ -123,7 +123,7 @@ Triggered on: SEMS login failure, SEMS rate limit, a prolonged outage, unexpecte
123
123
 
124
124
  - The SEMS password and the Pushover API token are marked as `encryptedNative`/`protectedNative` at the root of `io-package.json` and are stored encrypted by ioBroker, never logged in plain text (the account name is masked in log messages, e.g. `st***@gmail.com`).
125
125
  - The adapter performs **read-only** access only (`GetMonitorDetailByPowerstationId`, `GetPowerStationIdByOwner`). There is deliberately **no** remote-control/write function (`SaveRemoteControlInverter`) - that would be a considerably larger security and liability risk and was not part of the requirement.
126
- - No third-party dependency for HTTP access: the built-in `fetch` of Node.js >=20 is used instead of an additional HTTP library - a smaller attack surface, less supply-chain risk.
126
+ - No third-party dependency for HTTP access: the built-in `fetch` of Node.js >=22 is used instead of an additional HTTP library - a smaller attack surface, less supply-chain risk.
127
127
  - The API base URL returned by the login response is validated (HTTPS on GoodWe-owned domains only) before any further request uses it, so a manipulated login response cannot redirect the session token to a foreign host.
128
128
  - All network errors are caught in a typed way; no unchecked data from the API response is ever executed (`eval`, `Function`, and similar are not used anywhere).
129
129
 
@@ -151,6 +151,36 @@ Pull requests are welcome, especially to add further fields delivered by the por
151
151
  -->
152
152
  ### **WORK IN PROGRESS**
153
153
 
154
+ ### 0.1.12 (2026-07-19)
155
+
156
+ Further fixes from a repochecker recheck on the `ioBroker.repositories` listing PR:
157
+
158
+ - (Stefan Bühler) **[E2004]** removed the `0.1.10` entry from `common.news` in `io-package.json` - that version's CI failed before the deploy step, so it was never actually published to npm
159
+ - (Stefan Bühler) **[S3014]** declared `needs: check-and-lint` on the `adapter-tests` job so it only runs after linting succeeds
160
+ - (Stefan Bühler) **[W0066]** pinned `@types/node` to `^22` (was the open-ended `>=22`, which could resolve to a newer major with mismatched typings)
161
+ - (Stefan Bühler) **[W4040]/[W4042]** fixed the JSON schema associations in `.vscode/settings.json`: `fileMatch` entries must not have a leading slash, and the jsonConfig schema must also match `admin/jsonCustom.json` and `admin/jsonTab.json`
162
+ - (Stefan Bühler) **[S8913]** added `.github/workflows/automerge-dependabot.yml` (using `iobroker-bot-orga/action-automerge-dependabot@v1`) and `.github/auto-merge.yml` so patch updates (and minor updates for dev dependencies) from Dependabot are merged automatically
163
+
164
+ ### 0.1.11 (2026-07-19)
165
+
166
+ - (Stefan Bühler) fixed a real CI break introduced in 0.1.10: removed Node.js 20.x from the `adapter-tests` matrix in `.github/workflows/test-and-release.yml`. It is incompatible with `engines.node >=22` (also introduced in 0.1.10) once the official `ioBroker/testing-action-adapter@v1` action runs `npm ci` with `engine-strict` enabled, which crashed that matrix job and cancelled every other job via fail-fast
167
+
168
+ ### 0.1.10 (2026-07-19)
169
+
170
+ Second round of fixes, addressing further findings from a stricter automated `@iobroker/repochecker` recheck on the `ioBroker.repositories` listing PR:
171
+
172
+ - (Stefan Bühler) **[W0028]** raised `engines.node` to `>=22`
173
+ - (Stefan Bühler) **[W0063]** removed `chai`, `chai-as-promised`, `mocha`, `sinon` from devDependencies (already provided by `@iobroker/testing`)
174
+ - (Stefan Bühler) **[S0065]/[S0085]/[S0087]** added `@types/node`, `@tsconfig/node22` and `/tsconfig.json` for editor type-checking support
175
+ - (Stefan Bühler) **[S5026]** added the `@alcalzone/release-script-plugin-manual-review` release plugin
176
+ - (Stefan Bühler) **[W3013]/[W3015]/[W3017]** rewrote `.github/workflows/test-and-release.yml` to use the official shared `ioBroker/testing-action-check@v1`, `ioBroker/testing-action-adapter@v1` and `ioBroker/testing-action-deploy@v1` GitHub Actions instead of hand-written steps
177
+ - (Stefan Bühler) added `test/integration.js` (adapter startup smoke test via `@iobroker/testing`'s integration harness) so `npm run test:integration` succeeds
178
+ - (Stefan Bühler) **[E1032]** trimmed `common.news` in `io-package.json` to the 7 entries kept by the repository builder
179
+ - (Stefan Bühler) **[E5512]** added the required `size` property to the Pushover section header in `admin/jsonConfig.json`
180
+ - (Stefan Bühler) **[S5601]** migrated `admin/i18n` from the long `{lang}/translations.json` format to the short `{lang}.json` format
181
+ - (Stefan Bühler) **[S4036]** added `.vscode/settings.json` with JSON schema associations for `io-package.json` and `admin/jsonConfig.json`
182
+ - (Stefan Bühler) **[S8901]** added `.github/dependabot.yml` (npm + github-actions, weekly, with a cooldown and an `@types/node` major/minor ignore rule)
183
+
154
184
  ### 0.1.9 (2026-07-19)
155
185
 
156
186
  Addressed the stricter automated `@iobroker/repochecker` findings surfaced on the `ioBroker.repositories` listing PR:
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "SEMS-Login-Fehler",
13
13
  "notifyOnRateLimit": "SEMS-Rate-Limit erreicht",
14
14
  "notifyOnStationOffline": "Länger andauerndem Ausfall",
15
- "pollingTab": "Abfrage-Intervall",
16
15
  "pollInterval": "Abfrage-Intervall (Sekunden)",
17
16
  "pollIntervalHelp": "Minimum 60s, empfohlen 300s (5 Min).",
17
+ "pollingTab": "Abfrage-Intervall",
18
18
  "powerStationId": "Anlagen-ID (optional)",
19
19
  "powerStationIdHelp": "Leer lassen für automatische Erkennung der Anlage dieses Kontos. Bei mehreren Anlagen pro Konto: ID explizit setzen (zu finden in der SEMS-Portal-URL nach dem Login, z. B. semsportal.com/powerstation/powerstatussnmin/<ID>).",
20
20
  "priorityEmergency": "Notfall (wiederholt bis Bestätigung)",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "SEMS login failure",
13
13
  "notifyOnRateLimit": "SEMS rate-limit hit",
14
14
  "notifyOnStationOffline": "Prolonged outage",
15
- "pollingTab": "Polling",
16
15
  "pollInterval": "Poll interval (seconds)",
17
16
  "pollIntervalHelp": "Minimum 60s, recommended 300s (5 min).",
17
+ "pollingTab": "Polling",
18
18
  "powerStationId": "Power station ID (optional)",
19
19
  "powerStationIdHelp": "Leave empty to auto-detect the plant owned by this account. Multiple plants on one account: set the ID explicitly (found in the SEMS portal URL after login, e.g. semsportal.com/powerstation/powerstatussnmin/<ID>).",
20
20
  "priorityEmergency": "Emergency (repeated until confirmed)",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Fallo de inicio de sesión SEMS",
13
13
  "notifyOnRateLimit": "Límite de solicitudes SEMS alcanzado",
14
14
  "notifyOnStationOffline": "Interrupción prolongada",
15
- "pollingTab": "Intervalo de consulta",
16
15
  "pollInterval": "Intervalo de consulta (segundos)",
17
16
  "pollIntervalHelp": "Mínimo 60s, recomendado 300s (5 min).",
17
+ "pollingTab": "Intervalo de consulta",
18
18
  "powerStationId": "ID de la planta (opcional)",
19
19
  "powerStationIdHelp": "Déjalo vacío para la detección automática. Con varias plantas, indica el ID manualmente (visible en la URL del portal SEMS tras iniciar sesión).",
20
20
  "priorityEmergency": "Emergencia",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Échec de connexion SEMS",
13
13
  "notifyOnRateLimit": "Limite de requêtes SEMS atteinte",
14
14
  "notifyOnStationOffline": "Panne prolongée",
15
- "pollingTab": "Intervalle d'interrogation",
16
15
  "pollInterval": "Intervalle d'interrogation (secondes)",
17
16
  "pollIntervalHelp": "Minimum 60s, recommandé 300s (5 min).",
17
+ "pollingTab": "Intervalle d'interrogation",
18
18
  "powerStationId": "ID de la centrale (optionnel)",
19
19
  "powerStationIdHelp": "Laisser vide pour la détection automatique. Plusieurs centrales : indiquer l'ID manuellement (visible dans l'URL du portail SEMS après connexion).",
20
20
  "priorityEmergency": "Urgence",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Errore di login SEMS",
13
13
  "notifyOnRateLimit": "Limite richieste SEMS raggiunto",
14
14
  "notifyOnStationOffline": "Guasto prolungato",
15
- "pollingTab": "Intervallo di polling",
16
15
  "pollInterval": "Intervallo di polling (secondi)",
17
16
  "pollIntervalHelp": "Minimo 60s, consigliato 300s (5 min).",
17
+ "pollingTab": "Intervallo di polling",
18
18
  "powerStationId": "ID impianto (opzionale)",
19
19
  "powerStationIdHelp": "Lascia vuoto per il rilevamento automatico. Con più impianti, imposta l'ID manualmente (visibile nell'URL del portale SEMS dopo il login).",
20
20
  "priorityEmergency": "Emergenza",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "SEMS-inlogfout",
13
13
  "notifyOnRateLimit": "SEMS-ratelimit bereikt",
14
14
  "notifyOnStationOffline": "Langdurige storing",
15
- "pollingTab": "Polling-interval",
16
15
  "pollInterval": "Poll-interval (seconden)",
17
16
  "pollIntervalHelp": "Minimaal 60s, aanbevolen 300s (5 min).",
17
+ "pollingTab": "Polling-interval",
18
18
  "powerStationId": "Installatie-ID (optioneel)",
19
19
  "powerStationIdHelp": "Leeg laten voor automatische detectie. Bij meerdere installaties: ID handmatig instellen (te vinden in de SEMS-portal-URL na het inloggen).",
20
20
  "priorityEmergency": "Noodgeval",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Błędzie logowania SEMS",
13
13
  "notifyOnRateLimit": "Osiągnięciu limitu żądań SEMS",
14
14
  "notifyOnStationOffline": "Długotrwałej awarii",
15
- "pollingTab": "Interwał odpytywania",
16
15
  "pollInterval": "Interwał odpytywania (sekundy)",
17
16
  "pollIntervalHelp": "Minimum 60s, zalecane 300s (5 min).",
17
+ "pollingTab": "Interwał odpytywania",
18
18
  "powerStationId": "ID instalacji (opcjonalnie)",
19
19
  "powerStationIdHelp": "Pozostaw puste dla automatycznego wykrywania. Przy kilku instalacjach ustaw ID ręcznie (widoczne w adresie URL portalu SEMS po zalogowaniu).",
20
20
  "priorityEmergency": "Alarmowy",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Falha de login SEMS",
13
13
  "notifyOnRateLimit": "Limite de pedidos SEMS atingido",
14
14
  "notifyOnStationOffline": "Falha prolongada",
15
- "pollingTab": "Intervalo de consulta",
16
15
  "pollInterval": "Intervalo de consulta (segundos)",
17
16
  "pollIntervalHelp": "Mínimo 60s, recomendado 300s (5 min).",
17
+ "pollingTab": "Intervalo de consulta",
18
18
  "powerStationId": "ID da central (opcional)",
19
19
  "powerStationIdHelp": "Deixe em branco para deteção automática. Com várias centrais, defina o ID manualmente (visível na URL do portal SEMS após o login).",
20
20
  "priorityEmergency": "Emergência",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Ошибка входа SEMS",
13
13
  "notifyOnRateLimit": "Достигнут лимит запросов SEMS",
14
14
  "notifyOnStationOffline": "Длительном отключении",
15
- "pollingTab": "Опрос",
16
15
  "pollInterval": "Интервал опроса (секунды)",
17
16
  "pollIntervalHelp": "Минимум 60с, рекомендуется 300с (5 мин).",
17
+ "pollingTab": "Опрос",
18
18
  "powerStationId": "ID электростанции (опционально)",
19
19
  "powerStationIdHelp": "Оставьте пустым для автоматического определения. При нескольких станциях укажите ID вручную (из URL портала SEMS после входа).",
20
20
  "priorityEmergency": "Экстренный",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "Помилка входу SEMS",
13
13
  "notifyOnRateLimit": "Досягнуто ліміту запитів SEMS",
14
14
  "notifyOnStationOffline": "Тривалій відмові",
15
- "pollingTab": "Опитування",
16
15
  "pollInterval": "Інтервал опитування (секунди)",
17
16
  "pollIntervalHelp": "Минимум 60с, рекомендуется 300с (5 мин).",
17
+ "pollingTab": "Опитування",
18
18
  "powerStationId": "ID электростанции (опционально)",
19
19
  "powerStationIdHelp": "Оставьте пустым для автоматического определения. При нескольких станциях укажите ID вручную (из URL портала SEMS после входа).",
20
20
  "priorityEmergency": "Экстренный",
@@ -12,9 +12,9 @@
12
12
  "notifyOnLoginFailure": "SEMS 登录失败",
13
13
  "notifyOnRateLimit": "达到 SEMS 请求限制",
14
14
  "notifyOnStationOffline": "长时间故障",
15
- "pollingTab": "轮询间隔",
16
15
  "pollInterval": "轮询间隔(秒)",
17
16
  "pollIntervalHelp": "最小 60 秒,建议 300 秒(5 分钟)。",
17
+ "pollingTab": "轮询间隔",
18
18
  "powerStationId": "电站 ID(可选)",
19
19
  "powerStationIdHelp": "留空以自动检测。若账户下有多个电站,请手动填写 ID(登录后可在 SEMS 门户网址中找到)。",
20
20
  "priorityEmergency": "紧急",
@@ -213,6 +213,7 @@
213
213
  },
214
214
  "_notifyHeader": {
215
215
  "type": "header",
216
+ "size": 4,
216
217
  "text": "notifyHeader",
217
218
  "newLine": true,
218
219
  "xs": 12,
package/io-package.json CHANGED
@@ -1,47 +1,8 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "goodwe-sems",
4
- "version": "0.1.9",
4
+ "version": "0.1.12",
5
5
  "news": {
6
- "0.1.0": {
7
- "en": "initial release",
8
- "de": "Erstveröffentlichung",
9
- "ru": "первый выпуск",
10
- "pt": "lançamento inicial",
11
- "nl": "eerste release",
12
- "fr": "version initiale",
13
- "it": "versione iniziale",
14
- "es": "versión inicial",
15
- "pl": "pierwsze wydanie",
16
- "uk": "перший випуск",
17
- "zh-cn": "首次发布"
18
- },
19
- "0.1.3": {
20
- "en": "CI: fix OIDC trusted publishing (upgrade bundled npm CLI to >=11.5.1 before publish)",
21
- "de": "CI: OIDC Trusted Publishing behoben (npm-CLI vor dem Publish auf >=11.5.1 aktualisiert)",
22
- "ru": "CI: исправлена доверенная публикация OIDC (обновление npm CLI до >=11.5.1 перед публикацией)",
23
- "pt": "CI: correção da publicação confiável OIDC (atualiza a CLI do npm para >=11.5.1 antes de publicar)",
24
- "nl": "CI: OIDC trusted publishing gerepareerd (npm-CLI bijgewerkt naar >=11.5.1 vóór publiceren)",
25
- "fr": "CI : correction de la publication de confiance OIDC (mise à jour du CLI npm vers >=11.5.1 avant publication)",
26
- "it": "CI: risolta la pubblicazione affidabile OIDC (aggiornamento della CLI npm a >=11.5.1 prima della pubblicazione)",
27
- "es": "CI: se corrige la publicación de confianza OIDC (se actualiza la CLI de npm a >=11.5.1 antes de publicar)",
28
- "pl": "CI: naprawiono zaufaną publikację OIDC (aktualizacja CLI npm do >=11.5.1 przed publikacją)",
29
- "uk": "CI: виправлено довірену публікацію OIDC (оновлення npm CLI до >=11.5.1 перед публікацією)",
30
- "zh-cn": "CI:修复 OIDC 可信发布(发布前将 npm CLI 升级到 >=11.5.1)"
31
- },
32
- "0.1.4": {
33
- "en": "docs: add PayPal donation link to README",
34
- "de": "Doku: PayPal-Spendenlink im README ergänzt",
35
- "ru": "документация: добавлена ссылка для пожертвований PayPal в README",
36
- "pt": "docs: link de doação PayPal adicionado ao README",
37
- "nl": "docs: PayPal-donatielink toegevoegd aan README",
38
- "fr": "docs : ajout du lien de don PayPal dans le README",
39
- "it": "docs: aggiunto link di donazione PayPal al README",
40
- "es": "docs: se agregó el enlace de donación de PayPal al README",
41
- "pl": "docs: dodano link do darowizny PayPal w README",
42
- "uk": "документація: додано посилання для пожертв PayPal у README",
43
- "zh-cn": "文档:在 README 中添加 PayPal 捐赠链接"
44
- },
45
6
  "0.1.5": {
46
7
  "en": "fix: correct PayPal donation link in README",
47
8
  "de": "Fix: PayPal-Spendenlink im README korrigiert",
@@ -106,6 +67,32 @@
106
67
  "pl": "rozwiązano bardziej rygorystyczne kontrole PR ioBroker.repositories: encryptedNative/protectedNative przeniesiono do katalogu głównego io-package.json, zaktualizowano zależności, przepisano CI, README przetłumaczono na angielski (wymagane)",
107
68
  "uk": "усунено суворіші перевірки PR ioBroker.repositories: encryptedNative/protectedNative перенесено в корінь io-package.json, оновлено залежності, переписано CI, README перекладено англійською (обов'язково)",
108
69
  "zh-cn": "解决更严格的 ioBroker.repositories PR 检查:将 encryptedNative/protectedNative 移至 io-package.json 根目录,更新依赖项,重写 CI,将 README 翻译为英文(必需)"
70
+ },
71
+ "0.1.11": {
72
+ "en": "fix broken CI: remove Node.js 20.x from the adapter-tests matrix - it is incompatible with engines.node >=22 (introduced in 0.1.10) under the official action's engine-strict npm ci, which crashed that matrix job and cancelled all others",
73
+ "de": "defekte CI behoben: Node.js 20.x aus der adapter-tests-Matrix entfernt - inkompatibel mit engines.node >=22 (seit 0.1.10) unter dem engine-strict npm ci der offiziellen Action, wodurch dieser Matrix-Job abstürzte und alle anderen abgebrochen wurden",
74
+ "ru": "исправлен неработающий CI: Node.js 20.x удалён из матрицы adapter-tests - несовместим с engines.node >=22 (введено в 0.1.10)",
75
+ "pt": "corrigido o CI quebrado: Node.js 20.x removido da matriz adapter-tests - incompatível com engines.node >=22 (introduzido em 0.1.10)",
76
+ "nl": "defecte CI opgelost: Node.js 20.x verwijderd uit de adapter-tests-matrix - incompatibel met engines.node >=22 (geïntroduceerd in 0.1.10)",
77
+ "fr": "correction du CI cassé : Node.js 20.x retiré de la matrice adapter-tests - incompatible avec engines.node >=22 (introduit en 0.1.10)",
78
+ "it": "risolto il CI non funzionante: rimosso Node.js 20.x dalla matrice adapter-tests - incompatibile con engines.node >=22 (introdotto in 0.1.10)",
79
+ "es": "se corrigió el CI roto: se eliminó Node.js 20.x de la matriz adapter-tests - incompatible con engines.node >=22 (introducido en 0.1.10)",
80
+ "pl": "naprawiono uszkodzone CI: usunięto Node.js 20.x z macierzy adapter-tests - niekompatybilne z engines.node >=22 (wprowadzone w 0.1.10)",
81
+ "uk": "виправлено зламаний CI: видалено Node.js 20.x з матриці adapter-tests - несумісний з engines.node >=22 (введено в 0.1.10)",
82
+ "zh-cn": "修复损坏的 CI:从 adapter-tests 矩阵中移除 Node.js 20.x - 与 engines.node >=22(0.1.10 中引入)不兼容"
83
+ },
84
+ "0.1.12": {
85
+ "en": "further recheck fixes: remove news entry for 0.1.10 (never published to npm - its CI failed before the deploy step), declare \"needs: check-and-lint\" on the adapter-tests job, pin @types/node to \"^22\" (was open-ended \">=22\"), fix .vscode/settings.json schema fileMatch patterns (drop leading slash, add jsonCustom.json/jsonTab.json), add dependabot auto-merge workflow + config",
86
+ "de": "weitere Recheck-Fixes: News-Eintrag fuer 0.1.10 entfernt (nie auf npm veroeffentlicht - CI schlug vor dem Deploy-Schritt fehl), \"needs: check-and-lint\" beim adapter-tests-Job ergaenzt, @types/node auf \"^22\" fixiert (war offenes \">=22\"), Schema-fileMatch in .vscode/settings.json korrigiert (kein fuehrender Slash, jsonCustom.json/jsonTab.json ergaenzt), Dependabot-Automerge-Workflow + Konfiguration ergaenzt",
87
+ "ru": "дальнейшие исправления: удалена запись news для 0.1.10 (никогда не публиковалась в npm), needs: check-and-lint для adapter-tests, @types/node зафиксирован на ^22, исправлены схемы в .vscode/settings.json, добавлен automerge для dependabot",
88
+ "pt": "mais correcoes: removida a entrada de news para 0.1.10 (nunca publicada no npm), needs: check-and-lint no job adapter-tests, @types/node fixado em ^22, esquemas corrigidos em .vscode/settings.json, automerge do dependabot adicionado",
89
+ "nl": "verdere fixes: news-item voor 0.1.10 verwijderd (nooit op npm gepubliceerd), needs: check-and-lint toegevoegd aan adapter-tests, @types/node vastgezet op ^22, schema's in .vscode/settings.json gecorrigeerd, dependabot automerge toegevoegd",
90
+ "fr": "autres corrections : entree news pour 0.1.10 supprimee (jamais publiee sur npm), needs: check-and-lint ajoute au job adapter-tests, @types/node fixe a ^22, schemas corriges dans .vscode/settings.json, automerge dependabot ajoute",
91
+ "it": "ulteriori correzioni: rimossa la voce news per 0.1.10 (mai pubblicata su npm), aggiunto needs: check-and-lint al job adapter-tests, @types/node fissato a ^22, schemi corretti in .vscode/settings.json, aggiunto automerge per dependabot",
92
+ "es": "mas correcciones: se elimino la entrada de news para 0.1.10 (nunca publicada en npm), se agrego needs: check-and-lint al job adapter-tests, @types/node fijado en ^22, esquemas corregidos en .vscode/settings.json, se agrego automerge de dependabot",
93
+ "pl": "kolejne poprawki: usunieto wpis news dla 0.1.10 (nigdy nie opublikowano na npm), dodano needs: check-and-lint do zadania adapter-tests, @types/node ustalono na ^22, poprawiono schematy w .vscode/settings.json, dodano automerge dependabot",
94
+ "uk": "подальші виправлення: видалено запис news для 0.1.10 (ніколи не публікувався на npm), додано needs: check-and-lint для adapter-tests, @types/node зафіксовано на ^22, виправлено схеми в .vscode/settings.json, додано automerge для dependabot",
95
+ "zh-cn": "进一步修复:移除 0.1.10 的 news 条目(从未发布到 npm),为 adapter-tests 任务添加 needs: check-and-lint,将 @types/node 固定为 ^22,修复 .vscode/settings.json 中的 schema 匹配,添加 dependabot 自动合并"
109
96
  }
110
97
  },
111
98
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.goodwe-sems",
3
- "version": "0.1.9",
3
+ "version": "0.1.12",
4
4
  "description": "ioBroker adapter to read GoodWe inverter data from the SEMS Portal cloud API (for installations without local/LAN access to the inverter).",
5
5
  "author": {
6
6
  "name": "bueste",
@@ -26,7 +26,7 @@
26
26
  "url": "https://github.com/bueste/ioBroker.goodwe-sems/issues"
27
27
  },
28
28
  "engines": {
29
- "node": ">=20"
29
+ "node": ">=22"
30
30
  },
31
31
  "os": [
32
32
  "linux",
@@ -48,7 +48,8 @@
48
48
  "test": "npm run test:unit && npm run test:package",
49
49
  "lint": "eslint .",
50
50
  "translate": "translate-adapter",
51
- "release": "release-script"
51
+ "release": "release-script",
52
+ "test:integration": "mocha test/integration --exit"
52
53
  },
53
54
  "dependencies": {
54
55
  "@iobroker/adapter-core": "^3.4.1"
@@ -57,13 +58,14 @@
57
58
  "@alcalzone/release-script": "^5.2.1",
58
59
  "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
59
60
  "@alcalzone/release-script-plugin-license": "^5.2.0",
61
+ "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
60
62
  "@iobroker/adapter-dev": "^1.5.0",
63
+ "@iobroker/db-objects-jsonl": "^7.2.2",
64
+ "@iobroker/db-states-jsonl": "^7.2.2",
61
65
  "@iobroker/eslint-config": "^2.3.4",
62
66
  "@iobroker/testing": "^5.3.0",
63
- "chai": "^4.4.1",
64
- "chai-as-promised": "^7.1.2",
65
- "mocha": "^11.7.6",
66
- "sinon": "^22.0.0"
67
+ "@tsconfig/node22": "^22.0.5",
68
+ "@types/node": "^22"
67
69
  },
68
70
  "overrides": {
69
71
  "adm-zip": "^0.6.0",