iobroker.sonoff 3.3.0 → 4.2.0

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 (46) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +96 -170
  3. package/admin/i18n/{de/translations.json → de.json} +37 -12
  4. package/admin/i18n/{en/translations.json → en.json} +37 -12
  5. package/admin/i18n/{es/translations.json → es.json} +37 -12
  6. package/admin/i18n/{fr/translations.json → fr.json} +37 -12
  7. package/admin/i18n/{it/translations.json → it.json} +37 -12
  8. package/admin/i18n/{nl/translations.json → nl.json} +37 -12
  9. package/admin/i18n/{pl/translations.json → pl.json} +37 -12
  10. package/admin/i18n/{pt/translations.json → pt.json} +37 -12
  11. package/admin/i18n/{ru/translations.json → ru.json} +37 -12
  12. package/admin/i18n/{uk/translations.json → uk.json} +37 -12
  13. package/admin/i18n/{zh-cn/translations.json → zh-cn.json} +37 -12
  14. package/admin/jsonConfig.json +427 -228
  15. package/build/lib/bridge.js +512 -0
  16. package/build/lib/bridge.js.map +1 -0
  17. package/build/lib/checkStates.js +68 -0
  18. package/build/lib/checkStates.js.map +1 -0
  19. package/{lib → build/lib}/datapoints.js +61 -1
  20. package/build/lib/datapoints.js.map +1 -0
  21. package/build/lib/deviceManager.js +898 -0
  22. package/build/lib/deviceManager.js.map +1 -0
  23. package/build/lib/i18n/de.json +61 -0
  24. package/build/lib/i18n/en.json +61 -0
  25. package/build/lib/i18n/es.json +61 -0
  26. package/build/lib/i18n/fr.json +61 -0
  27. package/build/lib/i18n/it.json +61 -0
  28. package/build/lib/i18n/nl.json +61 -0
  29. package/build/lib/i18n/pl.json +61 -0
  30. package/build/lib/i18n/pt.json +61 -0
  31. package/build/lib/i18n/ru.json +61 -0
  32. package/build/lib/i18n/uk.json +61 -0
  33. package/build/lib/i18n/zh-cn.json +61 -0
  34. package/build/lib/mqttBase.js +1308 -0
  35. package/build/lib/mqttBase.js.map +1 -0
  36. package/build/lib/server.js +485 -0
  37. package/build/lib/server.js.map +1 -0
  38. package/build/main.js +110 -0
  39. package/build/main.js.map +1 -0
  40. package/io-package.json +47 -30
  41. package/package.json +26 -21
  42. package/admin/index.html +0 -177
  43. package/admin/index_m.html +0 -218
  44. package/admin/words.js +0 -75
  45. package/lib/server.js +0 -2086
  46. package/main.js +0 -104
package/build/main.js ADDED
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SonoffAdapter = void 0;
7
+ /**
8
+ * ioBroker sonoff Adapter
9
+ *
10
+ * (c) 2017-2026 bluefox
11
+ *
12
+ * MIT License
13
+ */
14
+ const adapter_core_1 = require("@iobroker/adapter-core"); // Get common this utils
15
+ const server_1 = __importDefault(require("./lib/server"));
16
+ const bridge_1 = __importDefault(require("./lib/bridge"));
17
+ const checkStates_1 = require("./lib/checkStates");
18
+ const deviceManager_1 = __importDefault(require("./lib/deviceManager"));
19
+ /** How many shortened states are written into the log */
20
+ const MAX_REPORTED_STATES = 20;
21
+ class SonoffAdapter extends adapter_core_1.Adapter {
22
+ server = null;
23
+ deviceManagement = null;
24
+ constructor(options = {}) {
25
+ super({
26
+ ...options,
27
+ name: 'sonoff',
28
+ ready: () => this.main(),
29
+ unload: async (cb) => {
30
+ if (this.server) {
31
+ await this.server.destroy();
32
+ this.server = null;
33
+ }
34
+ if (typeof cb === 'function') {
35
+ cb();
36
+ }
37
+ },
38
+ objectChange: (id, obj) => {
39
+ this.deviceManagement?.onObjectChange(id, obj);
40
+ },
41
+ stateChange: (id, state) => {
42
+ this.log.debug(`stateChange ${id}: ${JSON.stringify(state)}`);
43
+ this.deviceManagement?.onStateChange(id, state ?? null);
44
+ // you can use the ack flag to detect if state is desired or acknowledged
45
+ if (state && !state.ack) {
46
+ this.server
47
+ ?.onStateChange(id, state)
48
+ .catch(err => this.log.error(`Cannot process state change: ${err.message}`));
49
+ }
50
+ },
51
+ });
52
+ }
53
+ async main() {
54
+ this.deviceManagement = new deviceManager_1.default(this);
55
+ // subscribe for all own variables
56
+ this.subscribeStates('*');
57
+ // read all states and set alive to false
58
+ const states = await this.getStatesOfAsync('', '');
59
+ if (states?.length) {
60
+ for (const state of states) {
61
+ if (state._id.match(/\.alive$/)) {
62
+ await this.setForeignStateAsync(state._id, false, true);
63
+ }
64
+ }
65
+ }
66
+ await this.reportShortenedStates();
67
+ if (this.config.useExternalBroker && this.config.externalBrokerUrl) {
68
+ this.server = new bridge_1.default(this);
69
+ }
70
+ else {
71
+ if (this.config.useExternalBroker) {
72
+ this.log.warn('No external broker URL configured. Starting the built-in MQTT server');
73
+ }
74
+ this.server = new server_1.default(this);
75
+ }
76
+ }
77
+ /**
78
+ * The versions 3.3.x created states inside a group with a shortened name (issue #489),
79
+ * e.g. "SML_in" instead of "SML_Total_in". They are not updated anymore, so the user is
80
+ * informed about them. They are not deleted, because they can contain the history.
81
+ */
82
+ async reportShortenedStates() {
83
+ try {
84
+ const states = await (0, checkStates_1.findShortenedStates)(this);
85
+ if (!states.length) {
86
+ return;
87
+ }
88
+ this.log.warn(`${states.length} state(s) were created with a shortened name by the versions 3.3.x and are not updated anymore. Check them and delete them if they are not required:`);
89
+ for (const state of states.slice(0, MAX_REPORTED_STATES)) {
90
+ this.log.warn(` ${state.id} => is now ${state.expected}`);
91
+ }
92
+ if (states.length > MAX_REPORTED_STATES) {
93
+ this.log.warn(` ... and ${states.length - MAX_REPORTED_STATES} more`);
94
+ }
95
+ }
96
+ catch (err) {
97
+ this.log.debug(`Cannot check the names of the states: ${err.message}`);
98
+ }
99
+ }
100
+ }
101
+ exports.SonoffAdapter = SonoffAdapter;
102
+ if (require.main !== module) {
103
+ // Export the constructor in compact mode
104
+ module.exports = (options) => new SonoffAdapter(options);
105
+ }
106
+ else {
107
+ // otherwise start the instance directly
108
+ (() => new SonoffAdapter())();
109
+ }
110
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ioBroker sonoff Adapter\n *\n * (c) 2017-2026 bluefox\n *\n * MIT License\n */\nimport { Adapter, type AdapterOptions } from '@iobroker/adapter-core'; // Get common this utils\nimport MQTTServer from './lib/server';\nimport MQTTBridge from './lib/bridge';\nimport type MQTTBase from './lib/mqttBase';\nimport { findShortenedStates } from './lib/checkStates';\nimport SonoffDeviceManagement from './lib/deviceManager';\nimport type { SonoffAdapterConfig } from './types';\n\n/** How many shortened states are written into the log */\nconst MAX_REPORTED_STATES = 20;\n\nexport class SonoffAdapter extends Adapter {\n declare config: SonoffAdapterConfig;\n server: MQTTBase | null = null;\n deviceManagement: SonoffDeviceManagement | null = null;\n\n public constructor(options: Partial<AdapterOptions> = {}) {\n super({\n ...options,\n name: 'sonoff',\n ready: () => this.main(),\n unload: async (cb?: () => void): Promise<void> => {\n if (this.server) {\n await this.server.destroy();\n this.server = null;\n }\n if (typeof cb === 'function') {\n cb();\n }\n },\n objectChange: (id: string, obj: ioBroker.Object | null | undefined): void => {\n this.deviceManagement?.onObjectChange(id, obj as ioBroker.ChannelObject | ioBroker.StateObject | null);\n },\n stateChange: (id: string, state: ioBroker.State | null | undefined): void => {\n this.log.debug(`stateChange ${id}: ${JSON.stringify(state)}`);\n this.deviceManagement?.onStateChange(id, state ?? null);\n // you can use the ack flag to detect if state is desired or acknowledged\n if (state && !state.ack) {\n this.server\n ?.onStateChange(id, state)\n .catch(err => this.log.error(`Cannot process state change: ${err.message}`));\n }\n },\n });\n }\n\n private async main(): Promise<void> {\n this.deviceManagement = new SonoffDeviceManagement(this);\n\n // subscribe for all own variables\n this.subscribeStates('*');\n\n // read all states and set alive to false\n const states = await this.getStatesOfAsync('', '');\n if (states?.length) {\n for (const state of states) {\n if (state._id.match(/\\.alive$/)) {\n await this.setForeignStateAsync(state._id, false, true);\n }\n }\n }\n\n await this.reportShortenedStates();\n\n if (this.config.useExternalBroker && this.config.externalBrokerUrl) {\n this.server = new MQTTBridge(this);\n } else {\n if (this.config.useExternalBroker) {\n this.log.warn('No external broker URL configured. Starting the built-in MQTT server');\n }\n this.server = new MQTTServer(this);\n }\n }\n\n /**\n * The versions 3.3.x created states inside a group with a shortened name (issue #489),\n * e.g. \"SML_in\" instead of \"SML_Total_in\". They are not updated anymore, so the user is\n * informed about them. They are not deleted, because they can contain the history.\n */\n private async reportShortenedStates(): Promise<void> {\n try {\n const states = await findShortenedStates(this);\n if (!states.length) {\n return;\n }\n\n this.log.warn(\n `${states.length} state(s) were created with a shortened name by the versions 3.3.x and are not updated anymore. Check them and delete them if they are not required:`,\n );\n for (const state of states.slice(0, MAX_REPORTED_STATES)) {\n this.log.warn(` ${state.id} => is now ${state.expected}`);\n }\n if (states.length > MAX_REPORTED_STATES) {\n this.log.warn(` ... and ${states.length - MAX_REPORTED_STATES} more`);\n }\n } catch (err: unknown) {\n this.log.debug(`Cannot check the names of the states: ${(err as Error).message}`);\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<AdapterOptions> | undefined) => new SonoffAdapter(options);\n} else {\n // otherwise start the instance directly\n (() => new SonoffAdapter())();\n}\n"]}
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "sonoff",
4
- "version": "3.3.0",
4
+ "version": "4.2.0",
5
5
  "news": {
6
+ "4.2.0": {
7
+ "en": "Added Device Manager for existing devices",
8
+ "de": "Gerätemanager für alte Geräte hinzugefügt",
9
+ "ru": "Добавлен диспетчер устройств для существующих устройств",
10
+ "pt": "Adição do Device Manager para dispositivos atuais",
11
+ "nl": "Apparaatbeheer toegevoegd voor bestaande apparaten",
12
+ "fr": "Device Manager ajouté aux appareils existants",
13
+ "it": "Aggiunto Device Manager per i device esistenti",
14
+ "es": "Se ha añadido Device Manager para los ya existentes",
15
+ "pl": "Dodano Menedżera urządzeń dla istniejących urządzeń",
16
+ "uk": "Додано диспетчер пристроїв для існуючих пристроїв",
17
+ "zh-cn": "为现有设备添加了设备管理器"
18
+ },
19
+ "4.0.0": {
20
+ "en": "Adapter requires js-controller >= 6.0.11 now.\nAdd bridge mode to connect to an external MQTT broker instead of running a built-in broker\nFix alive state object not being created (warning \"has no existing object\")\nFixed the names of data points inside a group: since 3.3.0 e.g. `SML_Total_in` was created as `SML_in` (#489)\nThe MAC address and the other network and firmware information of a device are stored as data points (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nServer mode: the adapter requests `Status 5` and `Status 2` from a device with its first message, so the INFO states are filled even if the device did not reboot\nThe states which were created with a shortened name by 3.3.x are listed in the log on start, so they can be deleted (#489)\nBridge mode: the topics to subscribe are configurable now and nested full topics as well as OpenBeken topics are supported\nBridge mode: devices are named after their MQTT client ID like with the built-in broker and are no longer renamed by less reliable sources\nBridge mode: the `alive` state is set from the last will topic (LWT), so devices are recognized as offline\nCommands for auto-created states are sent to `cmnd/...` again, also for nested full topics\n`info.connection` contains the list of the connected clients again (server mode), in bridge mode the URL of the broker\nBridge mode: support for the full topic structure `%topic%/%prefix%/` (device first), detected automatically per device\nBridge mode: encrypted connections with CA/client certificates and optional certificate check, configurable client ID, keepalive and clean session\nBridge mode: a fix prefix in front of the full topic (e.g. `gateway/tele/device/STATE`) is recognized and used for the commands\nAdd support for OpenBeken LED datapoints (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) - enables control of OpenBeken LED devices with automatic topic mapping for /get and /set suffixes\nAdd PulseTime1-PulseTime16 datapoint support - users can now read and set PulseTime values directly from ioBroker to control relay auto-off timers\nBreaking: minimal supported Node.js version is now 22",
21
+ "de": "Der Adapter benötigt jetzt js-controller >= 6.0.11.\nFügen Sie den Bridge-Modus hinzu, um eine Verbindung zu einem externen MQTT-Broker herzustellen, anstatt einen integrierten Broker zu verwenden.\nBeheben Sie das Problem, dass das Objekt mit dem Status „lebendig“ nicht erstellt wird (Warnung: „Es existiert kein Objekt“).\nDie Namen der Datenpunkte innerhalb einer Gruppe wurden korrigiert: Seit Version 3.3.0 wurde beispielsweise `SML_Total_in` als `SML_in` erstellt (#489).\nDie MAC-Adresse und die übrigen Netzwerk- und Firmware-Informationen eines Geräts werden als Datenpunkte gespeichert (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nServermodus: Der Adapter fordert mit seiner ersten Nachricht die Statuscodes „5“ und „2“ von einem Gerät an, sodass die INFO-Statuscodes auch dann gefüllt werden, wenn das Gerät nicht neu gestartet wurde.\nDie von Version 3.3.x mit einem Kurznamen erstellten Zustände werden beim Start im Protokoll aufgelistet und können daher gelöscht werden (#489).\nBridge-Modus: Die zu abonnierenden Themen sind jetzt konfigurierbar, und sowohl verschachtelte vollständige Themen als auch OpenBeken-Themen werden unterstützt.\nBridge-Modus: Geräte werden wie beim integrierten Broker nach ihrer MQTT-Client-ID benannt und nicht mehr von weniger zuverlässigen Quellen umbenannt.\nBridge-Modus: Der Status „aktiv“ wird anhand des letzten Will-Topics (LWT) gesetzt, daher werden Geräte als offline erkannt.\nBefehle für automatisch erstellte Zustände werden erneut an `cmnd/...` gesendet, auch für verschachtelte vollständige Themen.\n`info.connection` enthält im Servermodus die Liste der verbundenen Clients, im Bridge-Modus die URL des Brokers.\nBridge-Modus: Unterstützung für die vollständige Themenstruktur `%topic%/%prefix%/` (Gerät zuerst), automatische Erkennung pro Gerät\nBridge-Modus: Verschlüsselte Verbindungen mit CA-/Client-Zertifikaten und optionaler Zertifikatsprüfung, konfigurierbare Client-ID, Keepalive und Clean Session\nBridge-Modus: Ein festes Präfix vor dem vollständigen Thema (z. B. `gateway/tele/device/STATE`) wird erkannt und für die Befehle verwendet.\nUnterstützung für OpenBeken-LED-Datenpunkte (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) hinzugefügt – ermöglicht die Steuerung von OpenBeken-LED-Geräten mit automatischer Themenzuordnung für die Suffixe /get und /set.\nUnterstützung für die Datenpunkte PulseTime1-PulseTime16 hinzugefügt – Benutzer können nun PulseTime-Werte direkt von ioBroker lesen und festlegen, um die automatischen Abschalttimer von Relais zu steuern.\nWichtiger Hinweis: Die minimal unterstützte Node.js-Version ist jetzt 22.",
22
+ "ru": "Для работы адаптера теперь требуется js-controller версии не ниже 6.0.11.\nДобавить режим моста для подключения к внешнему MQTT-брокеру вместо использования встроенного брокера.\nИсправлена ошибка, из-за которой объект состояния \"alive\" не создавался (предупреждение \"объект не существует\").\nИсправлены имена точек данных внутри группы: начиная с версии 3.3.0, например, `SML_Total_in` создавался как `SML_in` (#489)\nMAC-адрес и другая сетевая и микропрограммная информация устройства хранятся в виде точек данных (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nСерверный режим: адаптер запрашивает у устройства статусы `Status 5` и `Status 2` в своем первом сообщении, поэтому состояния INFO заполняются, даже если устройство не перезагружалось.\nСостояния, созданные с сокращенным именем в версии 3.3.x, отображаются в журнале при запуске, поэтому их можно удалить (#489)\nРежим моста: теперь можно настраивать темы для подписки, поддерживаются как вложенные полные темы, так и темы OpenBeken.\nРежим моста: устройствам присваиваются имена в соответствии с их идентификатором MQTT-клиента, как и во встроенном брокере, и они больше не переименовываются менее надежными источниками.\nРежим моста: состояние «включено» устанавливается из темы последнего завещания (LWT), поэтому устройства распознаются как находящиеся в автономном режиме.\nКоманды для автоматически создаваемых состояний снова отправляются в `cmnd/...`, в том числе и для вложенных полных тем.\n`info.connection` снова содержит список подключенных клиентов (в режиме сервера), а в режиме моста — URL брокера.\nРежим моста: поддержка полной структуры темы `%topic%/%prefix%/` (сначала устройство), определяемой автоматически для каждого устройства.\nРежим моста: зашифрованные соединения с использованием сертификатов центра сертификации/клиента и опциональной проверки сертификата, настраиваемый идентификатор клиента, поддержание соединения и очистка сессии.\nРежим моста: фиксированный префикс перед полным названием темы (например, `gateway/tele/device/STATE`) распознается и используется для команд.\nДобавлена поддержка точек данных OpenBeken LED (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) — это позволяет управлять устройствами OpenBeken LED с автоматическим сопоставлением тем для суффиксов /get и /set.\nДобавлена поддержка точек данных PulseTime1-PulseTime16 — теперь пользователи могут считывать и устанавливать значения PulseTime непосредственно из ioBroker для управления таймерами автоматического отключения реле.\nВнимание: минимальная поддерживаемая версия Node.js теперь 22.",
23
+ "pt": "O adaptador agora requer js-controller >= 6.0.11.\nAdicione o modo bridge para conectar-se a um broker MQTT externo em vez de executar um broker integrado.\nCorrigido o problema em que o objeto de estado ativo não estava sendo criado (aviso \"não existe objeto\").\nCorrigidos os nomes dos pontos de dados dentro de um grupo: desde a versão 3.3.0, por exemplo, `SML_Total_in` foi criado como `SML_in` (#489)\nO endereço MAC e as outras informações de rede e firmware de um dispositivo são armazenadas como pontos de dados (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nModo servidor: o adaptador solicita os status 5 e 2 de um dispositivo em sua primeira mensagem, portanto, os estados INFO são preenchidos mesmo que o dispositivo não tenha sido reiniciado.\nOs estados que foram criados com um nome abreviado pela versão 3.3.x são listados no log na inicialização, para que possam ser excluídos (#489)\nModo Bridge: agora é possível configurar os tópicos aos quais se inscrever e há suporte para tópicos completos aninhados e tópicos OpenBeken.\nModo Bridge: os dispositivos são nomeados de acordo com seu ID de cliente MQTT, assim como no broker integrado, e não são mais renomeados por fontes menos confiáveis.\nModo Bridge: o estado \"ativo\" é definido a partir do tópico de última vontade (LWT), portanto, os dispositivos são reconhecidos como offline.\nOs comandos para estados criados automaticamente são enviados novamente para `cmnd/...`, inclusive para tópicos completos aninhados.\n`info.connection` contém novamente a lista de clientes conectados (modo servidor), e no modo bridge, a URL do broker.\nModo Bridge: suporte para a estrutura completa de tópicos `%topic%/%prefix%/` (dispositivo primeiro), detectada automaticamente por dispositivo.\nModo Bridge: conexões criptografadas com certificados CA/cliente e verificação de certificado opcional, ID do cliente configurável, keepalive e sessão limpa.\nModo Bridge: um prefixo fixo antes do tópico completo (por exemplo, `gateway/tele/device/STATE`) é reconhecido e usado para os comandos.\nAdiciona suporte para pontos de dados de LED OpenBeken (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) - permite o controle de dispositivos LED OpenBeken com mapeamento automático de tópicos para os sufixos /get e /set.\nAdicionado suporte aos pontos de dados PulseTime1 a PulseTime16 - agora os usuários podem ler e definir valores de PulseTime diretamente do ioBroker para controlar os temporizadores de desligamento automático de relés.\nAtenção: a versão mínima suportada do Node.js agora é a 22.",
24
+ "nl": "De adapter vereist nu js-controller >= 6.0.11.\nVoeg de bridge-modus toe om verbinding te maken met een externe MQTT-broker in plaats van de ingebouwde broker te gebruiken.\nHet probleem is opgelost dat het object voor de 'alive'-status niet wordt aangemaakt (waarschuwing: \"bestaat niet\").\nDe namen van datapunten binnen een groep zijn gecorrigeerd: sinds versie 3.3.0 werd bijvoorbeeld `SML_Total_in` aangemaakt als `SML_in` (#489)\nHet MAC-adres en de overige netwerk- en firmware-informatie van een apparaat worden opgeslagen als datapunten (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nServermodus: de adapter vraagt met het eerste bericht van het apparaat om `Status 5` en `Status 2`, zodat de INFO-statussen worden ingevuld, zelfs als het apparaat niet opnieuw is opgestart.\nDe statussen die door 3.3.x met een verkorte naam zijn aangemaakt, worden bij het opstarten in het logboek vermeld, zodat ze kunnen worden verwijderd (#489)\nBrugmodus: de onderwerpen waarop u zich wilt abonneren, zijn nu configureerbaar en zowel geneste volledige onderwerpen als OpenBeken-onderwerpen worden ondersteund.\nBrugmodus: apparaten worden benoemd naar hun MQTT-client-ID, net als bij de ingebouwde broker, en worden niet langer hernoemd door minder betrouwbare bronnen.\nBrugmodus: de 'alive'-status wordt ingesteld op basis van het laatst ontvangen onderwerp (LWT), waardoor apparaten als offline worden herkend.\nCommando's voor automatisch aangemaakte statussen worden opnieuw naar `cmnd/...` gestuurd, ook voor geneste volledige onderwerpen.\n`info.connection` bevat de lijst met verbonden clients (servermodus), in bridgemodus de URL van de broker.\nBrugmodus: ondersteuning voor de volledige topicstructuur `%topic%/%prefix%/` (apparaat eerst), automatisch gedetecteerd per apparaat.\nBrugmodus: versleutelde verbindingen met CA-/clientcertificaten en optionele certificaatcontrole, configureerbare client-ID, keepalive en clean session.\nBrugmodus: een vast voorvoegsel vóór het volledige onderwerp (bijv. `gateway/tele/device/STATE`) wordt herkend en gebruikt voor de commando's.\nOndersteuning toegevoegd voor OpenBeken LED-datapoints (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) - maakt het mogelijk om OpenBeken LED-apparaten te besturen met automatische topic-mapping voor de achtervoegsels /get en /set.\nOndersteuning voor PulseTime1-PulseTime16-datapunten toegevoegd - gebruikers kunnen nu PulseTime-waarden rechtstreeks vanuit ioBroker uitlezen en instellen om de automatische uitschakeltimers van relais te beheren.\nBreaking news: de minimaal ondersteunde Node.js-versie is nu 22.",
25
+ "fr": "L'adaptateur requiert désormais js-controller >= 6.0.11.\nAjoutez le mode pont pour vous connecter à un courtier MQTT externe au lieu d'utiliser le courtier intégré.\nCorrection du problème de création de l'objet d'état vivant (avertissement « objet inexistant »)\nCorrection des noms des points de données au sein d'un groupe : depuis la version 3.3.0, par exemple, `SML_Total_in` a été créé en tant que `SML_in` (#489)\nL'adresse MAC et les autres informations réseau et micrologicielles d'un appareil sont stockées sous forme de points de données (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nMode serveur : l’adaptateur demande les états « Statut 5 » et « Statut 2 » à un périphérique dès son premier message, de sorte que les états INFO sont renseignés même si le périphérique n’a pas redémarré.\nLes états créés avec un nom abrégé par la version 3.3.x sont répertoriés dans le journal au démarrage, ils peuvent donc être supprimés (#489).\nMode pont : les sujets auxquels s’abonner sont désormais configurables et les sujets complets imbriqués ainsi que les sujets OpenBeken sont pris en charge.\nMode pont : les appareils sont nommés d’après leur identifiant client MQTT, comme avec le courtier intégré, et ne sont plus renommés par des sources moins fiables.\nMode pont : l'état « actif » est défini à partir du dernier sujet de volonté (LWT), les appareils sont donc reconnus comme hors ligne.\nLes commandes pour les états créés automatiquement sont à nouveau envoyées à `cmnd/...`, y compris pour les sujets complets imbriqués.\n`info.connection` contient à nouveau la liste des clients connectés (mode serveur), et en mode pont l'URL du broker.\nMode pont : prise en charge de la structure de sujet complète `%topic%/%prefix%/` (appareil en premier), détectée automatiquement par appareil\nMode pont : connexions chiffrées avec certificats CA/client et vérification de certificat optionnelle, ID client configurable, maintien de la connexion et session propre\nMode pont : un préfixe fixe placé devant le sujet complet (par exemple, `gateway/tele/device/STATE`) est reconnu et utilisé pour les commandes.\nAjout de la prise en charge des points de données LED OpenBeken (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) - permet le contrôle des périphériques LED OpenBeken avec un mappage automatique des sujets pour les suffixes /get et /set\nAjout de la prise en charge des points de données PulseTime1 à PulseTime16 : les utilisateurs peuvent désormais lire et définir les valeurs PulseTime directement depuis ioBroker pour contrôler les temporisateurs d’arrêt automatique des relais.\nInformation importante : la version minimale de Node.js requise est désormais la 22.",
26
+ "it": "L'adattatore ora richiede js-controller >= 6.0.11.\nAggiungi la modalità bridge per connetterti a un broker MQTT esterno invece di utilizzare il broker integrato.\nRisolto il problema relativo alla mancata creazione dell'oggetto di stato attivo (avviso \"non esiste alcun oggetto\").\nCorretti i nomi dei punti dati all'interno di un gruppo: dalla versione 3.3.0, ad esempio `SML_Total_in` è stato creato come `SML_in` (#489)\nL'indirizzo MAC e le altre informazioni di rete e firmware di un dispositivo vengono memorizzate come punti dati (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nModalità server: l'adattatore richiede `Status 5` e `Status 2` a un dispositivo con il suo primo messaggio, quindi gli stati INFO vengono compilati anche se il dispositivo non è stato riavviato.\nGli stati creati con un nome abbreviato dalla versione 3.3.x sono elencati nel registro all'avvio, quindi possono essere eliminati (#489)\nModalità bridge: gli argomenti a cui iscriversi sono ora configurabili e sono supportati sia argomenti completi annidati che argomenti OpenBeken.\nModalità bridge: i dispositivi vengono denominati in base al loro ID client MQTT, come con il broker integrato, e non vengono più rinominati da fonti meno affidabili.\nModalità bridge: lo stato \"attivo\" viene impostato dall'ultimo argomento di volontà (LWT), quindi i dispositivi vengono riconosciuti come offline\nI comandi per gli stati creati automaticamente vengono inviati nuovamente a `cmnd/...`, anche per argomenti completi annidati.\n`info.connection` contiene nuovamente l'elenco dei client connessi (modalità server), in modalità bridge l'URL del broker\nModalità bridge: supporto per la struttura completa dell'argomento `%topic%/%prefix%/` (dispositivo prima), rilevato automaticamente per dispositivo\nModalità bridge: connessioni crittografate con certificati CA/client e verifica opzionale del certificato, ID client configurabile, keepalive e sessione pulita.\nModalità bridge: un prefisso fisso davanti all'argomento completo (ad esempio `gateway/tele/device/STATE`) viene riconosciuto e utilizzato per i comandi\nAggiunto supporto per i punti dati LED di OpenBeken (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) - consente il controllo dei dispositivi LED di OpenBeken con mappatura automatica degli argomenti per i suffissi /get e /set\nAggiunto il supporto per i punti dati PulseTime1-PulseTime16: gli utenti possono ora leggere e impostare i valori di PulseTime direttamente da ioBroker per controllare i timer di spegnimento automatico dei relè.\nAggiornamento: la versione minima di Node.js supportata è ora la 22",
27
+ "es": "El adaptador ahora requiere js-controller >= 6.0.11.\nAgregue el modo puente para conectarse a un broker MQTT externo en lugar de ejecutar un broker integrado.\nSolucionar el problema por el que no se crea el objeto de estado activo (advertencia: \"no existe ningún objeto\").\nSe corrigieron los nombres de los puntos de datos dentro de un grupo: desde la versión 3.3.0, por ejemplo, `SML_Total_in` se creaba como `SML_in` (#489).\nLa dirección MAC y otra información de red y firmware de un dispositivo se almacenan como puntos de datos (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nModo servidor: el adaptador solicita los estados `Status 5` y `Status 2` a un dispositivo con su primer mensaje, por lo que los estados INFO se completan incluso si el dispositivo no se reinició.\nLos estados que fueron creados con un nombre abreviado por 3.3.x se enumeran en el registro al inicio, por lo que pueden ser eliminados (#489)\nModo puente: ahora se pueden configurar los temas a los que suscribirse y se admiten temas completos anidados, así como temas OpenBeken.\nModo puente: los dispositivos se nombran según su ID de cliente MQTT, al igual que con el broker integrado, y ya no se les cambia el nombre por fuentes menos fiables.\nModo puente: el estado `alive` se establece a partir del último tema de voluntad (LWT), por lo que los dispositivos se reconocen como desconectados.\nLos comandos para los estados creados automáticamente se envían de nuevo a `cmnd/...`, también para los temas completos anidados.\n`info.connection` contiene la lista de clientes conectados (modo servidor), en modo puente la URL del broker\nModo puente: admite la estructura de tema completa `%topic%/%prefix%/` (dispositivo primero), detectada automáticamente por dispositivo.\nModo puente: conexiones cifradas con certificados CA/cliente y verificación de certificado opcional, ID de cliente configurable, keepalive y sesión limpia.\nModo puente: se reconoce y utiliza un prefijo fijo delante del tema completo (por ejemplo, `gateway/tele/device/STATE`) para los comandos.\nSe añade compatibilidad con los puntos de datos LED de OpenBeken (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_hue, led_saturation): permite el control de dispositivos LED de OpenBeken con asignación automática de temas para los sufijos /get y /set.\nSe ha añadido compatibilidad con los puntos de datos PulseTime1-PulseTime16: ahora los usuarios pueden leer y configurar los valores de PulseTime directamente desde ioBroker para controlar los temporizadores de apagado automático de los relés.\nÚltima actualización: la versión mínima compatible de Node.js ahora es la 22.",
28
+ "pl": "Adapter wymaga teraz js-controller w wersji >= 6.0.11.\nDodaj tryb mostu, aby połączyć się z zewnętrznym brokerem MQTT zamiast uruchamiać wbudowanego brokera\nNaprawiono błąd powodujący, że obiekt stanu aktywnego nie był tworzony (ostrzeżenie „obiekt nie istnieje”)\nNaprawiono nazwy punktów danych wewnątrz grupy: od wersji 3.3.0 np. `SML_Total_in` zostało utworzone jako `SML_in` (#489)\nAdres MAC i inne informacje o sieci i oprogramowaniu sprzętowym urządzenia są przechowywane jako punkty danych (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nTryb serwera: adapter żąda od urządzenia statusu „Status 5” i „Status 2” w swojej pierwszej wiadomości, dzięki czemu stany INFO są wypełniane nawet jeśli urządzenie nie zostało ponownie uruchomione\nStany utworzone ze skróconą nazwą przez wersję 3.3.x są wymienione na liście startowej logowania, więc można je usunąć (#489)\nTryb pomostowy: tematy do subskrybowania są teraz konfigurowalne, a zagnieżdżone pełne tematy, jak również tematy OpenBeken są obsługiwane\nTryb mostu: urządzenia są nazywane według identyfikatora klienta MQTT, podobnie jak w przypadku wbudowanego brokera, i nie są już zmieniane przez mniej wiarygodne źródła\nTryb mostu: stan „aktywny” jest ustawiany na podstawie ostatniego tematu (LWT), więc urządzenia są rozpoznawane jako offline\nPolecenia dotyczące automatycznie tworzonych stanów są ponownie wysyłane do `cmnd/...`, także w przypadku zagnieżdżonych pełnych tematów\n`info.connection` zawiera ponownie listę połączonych klientów (tryb serwera), w trybie mostu adres URL brokera\nTryb mostu: obsługa pełnej struktury tematu `%topic%/%prefix%/` (najpierw urządzenie), wykrywana automatycznie dla każdego urządzenia\nTryb mostu: szyfrowane połączenia z certyfikatami CA/klienta i opcjonalną kontrolą certyfikatu, konfigurowalnym identyfikatorem klienta, utrzymywaniem aktywności i czystą sesją\nTryb mostu: rozpoznawany jest stały prefiks przed pełnym tematem (np. `gateway/tele/device/STATE`) i używany w poleceniach\nDodano obsługę punktów danych LED OpenBeken (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) — umożliwia sterowanie urządzeniami LED OpenBeken z automatycznym mapowaniem tematów dla sufiksów /get i /set\nDodano obsługę punktów danych PulseTime1-PulseTime16 — użytkownicy mogą teraz odczytywać i ustawiać wartości PulseTime bezpośrednio z ioBroker, aby sterować timerami automatycznego wyłączania przekaźnika\nNajnowsze informacje: minimalna obsługiwana wersja Node.js to obecnie 22",
29
+ "uk": "Адаптер тепер вимагає js-controller >= 6.0.11.\nДодано режим мосту для підключення до зовнішнього брокера MQTT замість запуску вбудованого брокера\nВиправлено помилку, через яку об'єкт у стані активності не створювався (попередження \"не має існуючого об'єкта\")\nВиправлено назви точок даних усередині групи: починаючи з версії 3.3.0, наприклад, `SML_Total_in` було створено як `SML_in` (#489)\nMAC-адреса та інша мережева інформація й інформація про прошивку пристрою зберігаються як точки даних (`INFO.Mac`, `INFO.Gateway`, `INFO.Hardware`, ...) (#513)\nРежим сервера: адаптер запитує `Status 5` та `Status 2` від пристрою своїм першим повідомленням, тому стани INFO заповнюються, навіть якщо пристрій не перезавантажився.\nСтани, створені зі скороченою назвою у версії 3.3.x, перелічені у вікні запуску входу, тому їх можна видалити (#489).\nРежим мосту: теми для підписки тепер налаштовуються, підтримуються вкладені повні теми, а також теми OpenBeken.\nРежим мосту: пристрої називаються за їхнім ідентифікатором клієнта MQTT, як і у випадку з вбудованим брокером, і більше не перейменовуються менш надійними джерелами.\nРежим мосту: стан «живий» встановлюється з теми останньої волі (LWT), тому пристрої розпізнаються як офлайн.\nКоманди для автоматично створених станів знову надсилаються до `cmnd/...`, також для вкладених повних тем\n`info.connection` знову містить список підключених клієнтів (режим сервера), у режимі моста — URL-адресу брокера.\nРежим мосту: підтримка повної структури теми `%topic%/%prefix%/` (спочатку пристрій), автоматично визначається для кожного пристрою\nРежим мосту: зашифровані з'єднання з сертифікатами CA/клієнта та додатковою перевіркою сертифікатів, налаштовуваний ідентифікатор клієнта, підтримка активності та чистий сеанс\nРежим мосту: для команд розпізнається та використовується фіксований префікс перед повним назвою теми (наприклад, `gateway/tele/device/STATE`).\nДодано підтримку точок даних світлодіодів OpenBeken (led_enableAll, led_dimmer, led_temperature, led_basecolor_rgb, led_finalcolor_rgbcw, led_basecolor_rgbcw, led_hue, led_saturation) – дозволяє керувати світлодіодними пристроями OpenBeken з автоматичним зіставленням тем для суфіксів /get та /set.\nДодано підтримку точок даних PulseTime1-PulseTime16 — користувачі тепер можуть зчитувати та встановлювати значення PulseTime безпосередньо з ioBroker для керування таймерами автоматичного вимкнення реле.\nВажливо: мінімальна підтримувана версія Node.js тепер 22.",
30
+ "zh-cn": "适配器现在需要 js-controller >= 6.0.11。\n添加桥接模式,以连接到外部 MQTT 代理,而不是运行内置代理。\n修复“存活状态对象未创建”的问题(警告“没有现有对象”)。\n修复了组内数据点的名称:例如,自 3.3.0 版本起,`SML_Total_in` 被创建为 `SML_in` (#489)\n设备的 MAC 地址以及其他网络和固件信息以数据点(`INFO.Mac`、`INFO.Gateway`、`INFO.Hardware` 等)的形式存储(#513)\n服务器模式:适配器会在其第一条消息中向设备请求“状态 5”和“状态 2”,因此即使设备没有重启,INFO 状态也会被填充。\n3.3.x 版本创建的使用缩短名称的状态会在启动时记录在日志中,因此可以将其删除(#489)\n桥接模式:现在可以配置要订阅的主题,并且支持嵌套的完整主题以及 OpenBeken 主题。\n桥接模式:设备名称与其 MQTT 客户端 ID 相同,就像内置代理一样,并且不再会被不太可靠的来源重命名。\n桥接模式:设备状态由最后遗嘱主题 (LWT) 设置,因此设备会被识别为离线状态。\n自动创建状态的命令会再次发送到 `cmnd/...`,嵌套的完整主题也是如此。\n`info.connection` 包含已连接客户端的列表(服务器模式),在桥接模式下则包含代理的 URL。\n桥接模式:支持完整的主题结构 `%topic%/%prefix%/`(设备优先),每个设备自动检测。\n桥接模式:使用 CA/客户端证书进行加密连接,并可选择进行证书检查、配置客户端 ID、保持连接和清理会话。\n桥接模式:系统会识别并使用该固定前缀作为完整主题(例如 `gateway/tele/device/STATE`)来执行命令。\n新增对 OpenBeken LED 数据点(led_enableAll、led_dimmer、led_temperature、led_basecolor_rgb、led_finalcolor_rgbcw、led_basecolor_rgbcw、led_hue、led_saturation)的支持——实现对 OpenBeken LED 设备的控制,并自动映射 /get 和 /set 后缀的主题。\n新增对PulseTime1-PulseTime16数据点的支持——用户现在可以直接从ioBroker读取和设置PulseTime值,以控制继电器自动关闭定时器。\n重要通知:目前支持的最低 Node.js 版本为 22。"
31
+ },
6
32
  "3.3.0": {
7
33
  "en": "**IMPORTANT**: Commands now correctly use cmnd/ prefix instead of tele/ prefix\nAdded configuration for advanced MQTT settings\nEnhanced, Added and Optimized various datapoint definitions and roles, see Changelog",
8
34
  "de": "**WICHTIG**: Befehle verwenden jetzt korrekterweise das Präfix cmnd/ anstelle von tele/\nErweiterte Konfiguration für MQTT-Einstellungen hinzugefügt.\nVerbesserte, hinzugefügte und optimierte verschiedene Datenpunktdefinitionen und Rollen, siehe Changelog.",
@@ -67,32 +93,6 @@
67
93
  "pl": "Ważne: Node.js 18.x i sterownik js- 5.0.19 + jest potrzebny co najmniej\nzaktualizowane stany dla Tasmota 13.4.0.3 20240402\npoprawiła niektóre komunikaty dziennika\nDodano PWM Pozycje\nNaprawiono obsługę QoS, aby zapobiec niepoprawnym ponownym uruchomieniom\nZapobieganie tworzeniu magazynu Map właściwość wspólne i sprzątanie",
68
94
  "uk": "Важливо: Node.js 18.x і js-controller 5.0.19+ необхідний мінімум\nоновлені стани для Тасмота 13.4.0.3 20240402\nрозширено деяких повідомлень журналу\nДодано PWM Товари\nВиправлена обробка QoS для запобігання недійсних відповідей\nПрофілактика створення магазину Карта нерухомості в загальному і чистому вигляді",
69
95
  "zh-cn": "重要:节点.js 18.x和js控制器 5.0.19+至少需要\n塔斯莫塔州升级\n增强一些日志消息\n已添加的 PWM 项目\n防止重新提交无效的固定QoS处理\n防止创建仓库 共同和清理的映射属性"
70
- },
71
- "3.0.3": {
72
- "en": "Added migration of password on JSON Config",
73
- "de": "Migration von Passwort auf JSON Config hinzugefügt",
74
- "ru": "Добавлена миграция пароля на JSON Config",
75
- "pt": "Adicionado migração de senha em JSON Config",
76
- "nl": "Vermelding van wachtwoord op JSON Config",
77
- "fr": "Ajout de la migration de mot de passe sur JSON Config",
78
- "it": "Aggiunta migrazione di password su JSON Config",
79
- "es": "Migración agregada de contraseña en JSON Config",
80
- "pl": "Dostęp do migracji haseł JSON Config",
81
- "uk": "Додано міграції пароля на JSON Config",
82
- "zh-cn": "A. 增加联索行动密码的移徙"
83
- },
84
- "2.5.7": {
85
- "en": "Disabled the logging of username and password during connection errors\nadded json config",
86
- "de": "Deaktiviert die Protokollierung von Benutzername und Passwort während der Verbindungsfehler\nadd json config",
87
- "ru": "Отключение логина имени пользователя и пароля во время ошибок соединения\nдобавлено json config",
88
- "pt": "Desativado o registro de nome de usuário e senha durante erros de conexão\nadicionado json config",
89
- "nl": "De logeerkamer van gebruikers en wachtwoord tijdens de verbindingsfouten\nvoegde json config",
90
- "fr": "Handicapés l'enregistrement du nom d'utilisateur et du mot de passe lors des erreurs de connexion\najouté json config",
91
- "it": "Disattivare la registrazione di nome utente e password durante gli errori di connessione\naggiunto json config",
92
- "es": "Desactivar el registro de nombre de usuario y contraseña durante errores de conexión\njson config",
93
- "pl": "Dysponował logowaniem nazwy użytkownika i hasła podczas błędów połączenia\ndodał json configig",
94
- "uk": "Вимкнено логування імені користувача та пароля під час помилок підключення\nдодано json config",
95
- "zh-cn": "残疾人在联系错误期间的用户名称和密码\nj的额外活动"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -146,12 +146,15 @@
146
146
  ],
147
147
  "connectionType": "local",
148
148
  "dataSource": "push",
149
+ "supportedMessages": {
150
+ "deviceManager": true
151
+ },
149
152
  "tier": 2,
150
153
  "extIcon": "https://raw.githubusercontent.com/ioBroker/ioBroker.sonoff/master/admin/sonoff.png",
151
154
  "type": "lighting",
152
155
  "dependencies": [
153
156
  {
154
- "js-controller": ">=5.0.19"
157
+ "js-controller": ">=6.0.11"
155
158
  }
156
159
  ],
157
160
  "globalDependencies": [
@@ -166,16 +169,30 @@
166
169
  }
167
170
  },
168
171
  "encryptedNative": [
169
- "password"
172
+ "password",
173
+ "externalBrokerPassword"
170
174
  ],
171
175
  "protectedNative": [
172
- "password"
176
+ "password",
177
+ "externalBrokerPassword"
173
178
  ],
174
179
  "native": {
175
180
  "port": 1883,
176
181
  "bind": "0.0.0.0",
177
182
  "user": "",
178
183
  "password": "",
184
+ "useExternalBroker": false,
185
+ "externalBrokerUrl": "",
186
+ "externalBrokerUser": "",
187
+ "externalBrokerPassword": "",
188
+ "externalBrokerTopics": "tele/#, stat/#, +/tele/+, +/stat/+",
189
+ "externalBrokerClientId": "",
190
+ "externalBrokerKeepalive": 60,
191
+ "externalBrokerCleanSession": true,
192
+ "externalBrokerRejectUnauthorized": true,
193
+ "externalBrokerCaPath": "",
194
+ "externalBrokerCertPath": "",
195
+ "externalBrokerKeyPath": "",
179
196
  "timeout": 300,
180
197
  "TELE_SENSOR": true,
181
198
  "TELE_MARGINS": false,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iobroker.sonoff",
3
3
  "description": "The adapter allows to send and receive MQTT messages from ioBroker and to be a broker.",
4
- "version": "3.3.0",
4
+ "version": "4.2.0",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "homepage": "https://github.com/ioBroker/ioBroker.sonoff",
7
7
  "repository": {
@@ -16,45 +16,50 @@
16
16
  "esp"
17
17
  ],
18
18
  "dependencies": {
19
- "@iobroker/adapter-core": "^3.3.2",
19
+ "@iobroker/adapter-core": "^3.4.3",
20
+ "@iobroker/dm-utils": "^3.2.0",
21
+ "mqtt": "^5.15.2",
20
22
  "mqtt-connection": "^4.1.0"
21
23
  },
22
24
  "devDependencies": {
23
- "@alcalzone/release-script": "^3.8.0",
24
- "@alcalzone/release-script-plugin-iobroker": "^3.7.2",
25
- "@alcalzone/release-script-plugin-license": "^3.7.0",
26
- "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
27
- "@iobroker/adapter-dev": "^1.4.0",
28
- "@iobroker/eslint-config": "^2.1.0",
29
- "@iobroker/legacy-testing": "^2.0.2",
30
- "@iobroker/testing": "^5.1.1",
31
- "chai": "^4.5.0",
32
- "mocha": "^11.7.2",
33
- "mqtt": "^5.14.0"
25
+ "@alcalzone/release-script": "^5.2.1",
26
+ "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
27
+ "@alcalzone/release-script-plugin-license": "^5.2.2",
28
+ "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
29
+ "@iobroker/adapter-dev": "^1.5.0",
30
+ "@iobroker/build-tools": "^3.0.3",
31
+ "@iobroker/eslint-config": "^2.3.4",
32
+ "@iobroker/testing": "^6.1.0",
33
+ "@iobroker/types": "^7.2.2",
34
+ "@tsconfig/node22": "^22.0.6",
35
+ "typescript": "~6.0.3"
34
36
  },
35
37
  "bugs": {
36
38
  "url": "https://github.com/ioBroker/ioBroker.sonoff/issues"
37
39
  },
38
- "main": "main.js",
40
+ "main": "build/main.js",
39
41
  "files": [
40
- "main.js",
41
42
  "admin/",
42
- "lib/",
43
+ "build/",
43
44
  "io-package.json",
44
45
  "LICENSE"
45
46
  ],
46
47
  "scripts": {
47
- "test": "node node_modules/mocha/bin/mocha --exit",
48
- "lint": "eslint -c eslint.config.mjs .",
48
+ "test:unit": "mocha test/bridge.js test/checkStates.js test/deviceManager.js --exit",
49
+ "test:integration": "mocha test/integration.js --exit",
50
+ "test:package": "mocha test/testPackageFiles.js --exit",
51
+ "test": "npm run test:unit && npm run test:integration",
52
+ "lint": "eslint -c eslint.config.mjs",
53
+ "build": "node tasks.js && npm run build:tsc",
54
+ "build:tsc": "tsc -p tsconfig.build.json",
49
55
  "release": "release-script",
50
56
  "release-patch": "release-script patch --yes",
51
57
  "release-minor": "release-script minor --yes",
52
58
  "release-major": "release-script major --yes",
53
- "update-packages": "ncu --upgrade",
54
- "translate": "translate-adapter"
59
+ "update-packages": "npx -y npm-check-updates --upgrade"
55
60
  },
56
61
  "engines": {
57
- "node": ">=18.0.0"
62
+ "node": ">=22.19.0"
58
63
  },
59
64
  "license": "MIT"
60
65
  }
package/admin/index.html DELETED
@@ -1,177 +0,0 @@
1
- <html>
2
- <head>
3
- <!-- these 4 files always have to be included -->
4
- <link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
5
- <script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
6
- <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
7
- <script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
8
-
9
- <!-- these three files have to be always included -->
10
- <link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
11
- <script type="text/javascript" src="../../js/translate.js"></script>
12
- <script type="text/javascript" src="../../js/adapter-settings.js"></script>
13
- <script type="text/javascript" src="words.js"></script>
14
- <!-- you have to define 2 functions in the global scope: -->
15
- <script type="text/javascript">
16
- var onChange;
17
- var secret;
18
-
19
- function encrypt(key, value) {
20
- var result = '';
21
- for(var i = 0; i < value.length; ++i) {
22
- result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
23
- }
24
- return result;
25
- }
26
-
27
- function decrypt(key, value) {
28
- var result = '';
29
- for(var i = 0; i < value.length; ++i) {
30
- result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
31
- }
32
- return result;
33
- }
34
-
35
- function setValue(id, value) {
36
- var $value = $('#' + id + '.value');
37
- if ($value.attr('type') === 'checkbox') {
38
- $value.prop('checked', value).change(function() {
39
- onChange();
40
- });
41
- } else {
42
- $value.val(value).change(function() {
43
- onChange();
44
- }).keyup(function() {
45
- onChange();
46
- });
47
- }
48
- }
49
-
50
- function loadHelper(settings, param, subparam) {
51
- if (!settings) return;
52
-
53
- if (settings.useChunkPatch === undefined) settings.useChunkPatch = false;
54
- if (settings.timeout === undefined) settings.timeout = 300;
55
-
56
- if (subparam && param) {
57
- for (var key in settings[param][subparam]) {
58
- if (typeof settings[param][subparam][key] !== 'object') {
59
- setValue(param + '_' + subparam + '_' + key, settings[param][subparam][key]);
60
- } else {
61
- alert('4th level is not supported');
62
- }
63
- }
64
- } else if (param) {
65
- for (var key in settings[param]) {
66
- if (typeof settings[param][key] !== 'object') {
67
- setValue(param + '_' + key, settings[param][key]);
68
- } else {
69
- loadHelper(settings, param, key);
70
- }
71
- }
72
- } else {
73
- for (var key in settings) {
74
- if (typeof settings[key] !== 'object') {
75
- if (key === 'pass') {
76
- settings[key] = decrypt(secret, settings[key]);
77
- }
78
- setValue(key, settings[key]);
79
- } else {
80
- loadHelper(settings, key);
81
- }
82
- }
83
- }
84
- }
85
-
86
- // the function loadSettings has to exist ...
87
- function load(settings, _onChange) {
88
- $('#tabs').tabs();
89
- onChange = _onChange;
90
- socket.emit('getObject', 'system.config', function (err, obj) {
91
- secret = (obj.native ? obj.native.secret : '') || 'Zgfr56gFe87jJOM';
92
- loadHelper(settings);
93
- });
94
-
95
- onChange(false);
96
- }
97
-
98
- function saveHelper(obj, id, value) {
99
- var ids = id.split('_');
100
-
101
- if (ids.length === 1) {
102
- if (ids[0] === 'pass') value = encrypt(secret, value);
103
- obj[id] = value;
104
- } else if (ids.length === 2) {
105
- if (!obj[ids[0]]) obj[ids[0]] = {};
106
- obj[ids[0]][ids[1]] = value;
107
- } else if (ids.length === 3) {
108
- if (!obj[ids[0]]) obj[ids[0]] = {};
109
- if (!obj[ids[0]][ids[1]]) obj[ids[0]][ids[1]] = {};
110
- obj[ids[0]][ids[1]][ids[2]] = value;
111
- }
112
- return obj;
113
- }
114
-
115
- function getSettings() {
116
- var obj = {};
117
- $('.value').each(function () {
118
- var $this = $(this);
119
- var id = $this.attr('id');
120
-
121
- if ($this.attr('type') === 'checkbox') {
122
- obj = saveHelper(obj, id, $this.prop('checked'))
123
- } else {
124
- obj = saveHelper(obj, id, $this.val())
125
- }
126
- });
127
- return obj;
128
- }
129
-
130
- function save(callback) {
131
- if ($('#pass').val() !== $('#pass_confirm').val()) {
132
- showMessage(_('Password confirmation is not equal with password'));
133
- return;
134
- }
135
-
136
- callback(getSettings());
137
- }
138
- </script>
139
- </head>
140
- <body>
141
- <!-- you have to put your config page in a div with id adapter-container -->
142
- <div id="adapter-container">
143
- <table><tr>
144
- <td><img src="sonoff.png"></td>
145
- <td style="padding-top: 20px;padding-left: 10px"><h3 class="translate">Sonoff adapter settings</h3></td>
146
- </tr></table>
147
- <table>
148
- <tr>
149
- <td colspan='2'><h4 class="translate">Connection settings</h4></td>
150
- </tr>
151
- <tr>
152
- <td><label class="translate" for="port">Port:</label></td>
153
- <td><input id="port" type="number" min="1" max="65565" class="value"/></td>
154
- </tr>
155
- <tr>
156
- <td><label class="translate" for="timeout">Client timeout (sec):</label></td>
157
- <td><input id="timeout" type="number" min="1" max="65565" class="value"/></td>
158
- </tr>
159
- <tr>
160
- <td colspan='2'><h4 class="translate">Authentication settings</h4></td>
161
- </tr>
162
- <tr>
163
- <td><label class="translate" for="user">User:</label></td>
164
- <td><input id="user" size="17" class="value"/></td>
165
- </tr>
166
- <tr>
167
- <td><label class="translate" for="pass">Password:</label></td>
168
- <td><input id="pass" type="password" size="17" class="value"/></td>
169
- </tr>
170
- <tr>
171
- <td><label class="translate" for="pass_confirm">Password confirmation:</label></td>
172
- <td><input id="pass_confirm" type="password" size="17"/></td>
173
- </tr>
174
- </table>
175
- </div>
176
- </body>
177
- </html>