iobroker.e3oncan 0.11.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,7 @@
15
15
  ## Table of contents
16
16
 
17
17
  - [Overview](#overview)
18
+ - [What's new in v0.11.x](#whats-new-in-v011x)
18
19
  - [Quick start](#quick-start)
19
20
  - [Configuration guide](#configuration-guide)
20
21
  - [Step 1 – CAN adapter](#step-1--can-adapter)
@@ -51,6 +52,24 @@ Which modes are available depends on your device topology. See the [device topol
51
52
 
52
53
  ---
53
54
 
55
+ ## What's new in v0.11.x
56
+
57
+ ### Updated data point structures (action required when upgrading)
58
+
59
+ Version 0.11.0 introduced updated definitions for many data points — new variant types, additional metadata (description, unit, links), and revised data format handling. **If you are upgrading from v0.10.x, please perform a device scan followed by a full data point scan** to apply the new definitions and metadata to your ioBroker object tree.
60
+
61
+ For a detailed list of changed data points see the [data point changelog](lib/data-points.md#changelog-of-data-point-definitions).
62
+
63
+ ### Variant data points and device format configuration
64
+
65
+ The adapter now handles variant data points — data points whose structure depends on the device's configuration (e.g. temperature unit °C/°F, date/time format). During the device scan, the relevant format configuration (data point 382) is read and stored. The data point scan then applies the correct codec for each device automatically.
66
+
67
+ ### Metadata on data point objects
68
+
69
+ Data point objects in the ioBroker object tree now carry metadata: description, physical unit, read/write access flag, and links to further information where available. Metadata for existing objects is updated during each data point scan and is also restored if a data point object is deleted and re-created (added in v0.11.1).
70
+
71
+ ---
72
+
54
73
  ## Quick start
55
74
 
56
75
  **Prerequisites**
@@ -264,6 +283,14 @@ If you enjoyed this project — or just feeling generous, consider buying me a b
264
283
  Placeholder for the next version (at the beginning of the line):
265
284
  ### **WORK IN PROGRESS**
266
285
  -->
286
+ ### 0.11.2 (2026-05-02)
287
+ * (MyHomeMyData) Added "What's new in v0.11.x" section to Readme with upgrade notes for data point structure changes
288
+
289
+ ### 0.11.1 (2026-04-23)
290
+ * (MyHomeMyData) Improved robustness: Receiving a data point of length zero is treated as a "negative response"
291
+ * (MyHomeMyData) The metadata is now also restored after a data point is deleted
292
+ * (MyHomeMyData) Aligned test cases for German system language
293
+
267
294
  ### 0.11.0 (2026-04-14)
268
295
  * (MyHomeMyData) To take full advantage of the variant data points and metadata, please perform a device scan followed by a data point scan
269
296
  * (MyHomeMyData) Added handling for variant data points and for device's data format configuration, refer to https://github.com/MyHomeMyData/ioBroker.e3oncan/lib/data-points.md for details
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "e3oncan",
4
- "version": "0.11.0",
4
+ "version": "0.11.2",
5
5
  "news": {
6
+ "0.11.2": {
7
+ "en": "Added \"What's new in v0.11.x\" section to Readme with upgrade notes for data point structure changes",
8
+ "de": "Hinzugefügt \"Was ist neu in v0.11.x\" Abschnitt zu Readme mit Upgrade-Notizen für Datenpunkt Strukturänderungen",
9
+ "ru": "Добавлен раздел «Что нового в v0.11.x» в Readme с примечаниями об обновлении для изменения структуры точек данных",
10
+ "pt": "Adicionado \"O que há de novo na seção v0.11.x\" para Readme com notas de atualização para mudanças na estrutura de pontos de dados",
11
+ "nl": "Toegevoegd \"Wat is nieuw in v0.11.x\" sectie aan Readme met upgrade notities voor gegevenspunt structuur wijzigingen",
12
+ "fr": "Ajout de la section « Quoi de neuf dans v0.11.x » à Readme avec des notes de mise à jour pour les changements de structure des points de données",
13
+ "it": "Aggiunto \"What's new in v0.11.x\" sezione a Readme con le note di aggiornamento per le modifiche della struttura del punto di dati",
14
+ "es": "Añadido \"Lo nuevo en v0.11.x\" sección a Readme con notas de actualización para cambios de estructura de puntos de datos",
15
+ "pl": "Dodano \"Co nowego w sekcji v0.11.x\" do Readme z notatkami aktualizacji zmian struktury punktów danych",
16
+ "uk": "Додано розділ \"Що нового в v0.11.x\" для читання з оновленнями нот для зміни структури даних",
17
+ "zh-cn": "添加“ v0. 11. x. 中的新内容” 部分至 Readme, 并附有数据点结构变化的升级注释"
18
+ },
19
+ "0.11.1": {
20
+ "en": "Improved robustness: Receiving a data point of length zero is treated as a \"negative response\"\nThe metadata is now also restored after a data point is deleted \nAligned test cases for German system language",
21
+ "de": "Verbesserte Robustheit: Der Empfang eines Datenpunktes der Länge Null wird als \"negative Antwort\" behandelt\nDie Metadaten werden nun auch wiederhergestellt, nachdem ein Datenpunkt gelöscht wurde\nTestfälle für deutsche Systemsprache angepasst",
22
+ "ru": "Повышение надежности: получение нулевой точки данных рассматривается как «отрицательный ответ»\nМетаданные также восстанавливаются после удаления точки данных\nВыровненные тесты для немецкого системного языка",
23
+ "pt": "Maior robustez: Receber um ponto de dados de comprimento zero é tratado como uma \"resposta negativa\"\nOs metadados também são restaurados depois de um ponto de dados ser apagado\nCasos de teste alinhados para a língua do sistema alemão",
24
+ "nl": "Verbeterde robuustheid: Het ontvangen van een datapunt van lengte nul wordt behandeld als een \"negatieve respons\"\nDe metagegevens worden nu ook hersteld nadat een datapunt is verwijderd\nUitgelijnde testcases voor de Duitse systeemtaal",
25
+ "fr": "Amélioration de la robustesse : la réception d'un point de données de longueur zéro est traitée comme une \"réponse négative\"\nLes métadonnées sont maintenant également restaurées après la suppression d'un point de données\nCas d'essai alignés pour la langue du système allemand",
26
+ "it": "Maggiore robustezza: la ricezione di un data point di lunghezza zero viene trattata come una \"risposta negativa\"\nI metadati vengono ora ripristinati anche dopo la cancellazione di un data point\nCasi di prova allineati per la lingua del sistema tedesco",
27
+ "es": "Mayor robustez: Recibir un punto de datos de la longitud cero es tratado como una \"respuesta negativa\"\nLos metadatos ahora también se restauran después de que se elimina un punto de datos\nCasos de prueba de los Alineados para el lenguaje del sistema alemán",
28
+ "pl": "Lepsza odporność: Otrzymanie punktu danych o długości zero jest traktowane jako \"odpowiedź negatywna\"\nMetadane są teraz również przywrócone po usunięciu punktu danych\nDopasowanie przypadków testowych dla języka niemieckiego",
29
+ "uk": "Покращена надійність: Отримання точки даних довжини нульового обробляється як \"негативна відповідь\"\nМетадані також відновлюються після видалення даних\nВизначені тестові випадки для німецької мови системи",
30
+ "zh-cn": "增强强性:接收长度为0的数据点作为\"负反应\"处理\n在删除一个数据点后, 元数据现在也被恢复\n德语系统语言的对齐测试例"
31
+ },
6
32
  "0.11.0": {
7
33
  "en": "To take full advantage of the variant data points and metadata, please perform a device scan followed by a data point scan\nAdded handling for variant data points and for device's data format configuration, refer to https://github.com/MyHomeMyData/ioBroker.e3oncan/lib/data-points.md for details\nAdded metadata to several data points, e.g. description, unit, link to further info\nDuring scan of data points now metadata are added to data point objects\nChanged handling of writable data points; this info now also is available within definition of data point; however, there is no change to handling of the whitelist of writables\nDuring device scan the information about used data formats (data point 382) is evaluated\nUpdated structure of many data points; for details see this [changelog](lib/data-points.md#changelog-of-data-point-definitions)",
8
34
  "de": "Um das Konzept der varianten Datenpunkte und der Metadaten voll auszunutzen, führen Sie bitte einen Gerätescan an, gefolgt von einem Datenpunktscan durch\nNeues Konzept für variante Datenpunkte und für die Konfiguration des Datenformats des Geräts finden Sie unter https://github.com/MyHomeMyData/ioBroker.e3oncan/lib/data-points.md für Details\nMetadaten zu vielen Datenpunkten hinzugefügt, z.B. Beschreibung, Einheit, Link zu weiteren Informationen\nBeim Scannen von Datenpunkten werden nun Metadaten zu Datenpunktobjekten hinzugefügt\nGeänderte Handhabung von schreibbaren Datenpunkten; diese Informationen sind nun auch innerhalb der Definition von Datenpunkt verfügbar; es gibt jedoch keine Änderung der Handhabung der Whitelist\nBeim Gerätescannen werden die Informationen über verwendete Datenformate (Datenpunkt 382) ausgewertet\nAktualisierte Struktur vieler Datenpunkte; für Details siehe diese [changelog](lib/data-points.md#changelog-of-data-point-definitions)",
@@ -67,32 +93,6 @@
67
93
  "pl": "Poprawiono dla wydania # 152 (sprawdzacz repozytorium) i # 126 (node.js 24)\nDodano podpowiedź do odczytu działania użytkownika po aktualizacji wersji węzła. js\nAktualizacja listy punktów danych dla urządzeń E3 do wersji 20250903",
68
94
  "uk": "Виправлення для випуску #152 (репозиторійний чекер) та #126 (node.js 24)\nДодана підказка для читання про дію користувача після оновлення версії вузла. свінгери\nОновлення списку точок даних для пристроїв E3 до версії 20250903",
69
95
  "zh-cn": "修复第152期(仓库检查器)和第126期(节点24)\n在节点升级版本后添加了读取关于用户动作的提示 。 页:1\nE3设备数据点列表更新至版本20250903"
70
- },
71
- "0.10.10": {
72
- "en": "Fix for issue #142 (WriteByDid not working in case of specific UDS control frame)\nUpdate of list of data points for E3 devices to version 20250729\nAdded codec for 64-bit integers. Remark: Encoding (for writing of data) is limited to values < 2^52 (4.503.599.627.370.496).",
73
- "de": "Fix für Issue #142 (WriteByDid funktioniert nicht bei bestimmten UDS-Frames)\nAktualisierung der Liste der Datenpunkte für E3 Geräte auf Version 20250729\nCodec für 64-Bit-Integer hinzugefügt. Anmerkung: Die Enkodierung (zum Schreiben von Daten) ist auf Werte < 2^52 (4.503.599.627.370.496) beschränkt.",
74
- "ru": "Исправление проблемы #142 (WriteByDid не работает в случае конкретной системы управления UDS)\nОбновление списка точек данных для устройств E3 до версии 20250729\nДобавлен кодек для 64-битных целых чисел. Замечание: Кодирование (для записи данных) ограничено значениями < 2^52 (4.503.599.627.370.496).",
75
- "pt": "Corrigir para o problema #142 (WriteByNão funcionou no caso de um quadro de controle UDS específico)\nActualização da lista de pontos de dados para os dispositivos E3 na versão 20250729\nAdicionado codec para números inteiros de 64 bits. Observação: A codificação (para escrita de dados) é limitada a valores < 2^52 (4.503.599.627.370.496).",
76
- "nl": "Fix voor probleem #142 (WriteByHeb niet gewerkt in het geval van specifieke UDS control frame)\nUpdate van de lijst van gegevenspunten voor E3-apparaten naar versie 20250729\nToegevoegd codec voor 64-bit gehele getallen. Opmerking: Codering (voor het schrijven van gegevens) is beperkt tot waarden < 2^52 (4503,599.627.370,496).",
77
- "fr": "Correction pour le numéro #142 (WriteByNe fonctionne pas dans le cas d'un cadre de contrôle UDS spécifique)\nMise à jour de la liste des points de données pour les appareils E3 vers la version 20250729\nAjout du codec pour les entiers 64 bits. Remarque: Le codage (pour l'écriture des données) est limité à des valeurs < 2^52 (4.503.599.627.370.496).",
78
- "it": "Risolvere per numero #142 (WriteByDid non funziona in caso di specifiche strutture di controllo UDS)\nAggiornamento dell'elenco dei punti di dati per i dispositivi E3 alla versione 20250729\nAggiunto codec per i interi a 64 bit. Nota: La codifica (per la scrittura dei dati) è limitata ai valori < 2^52 (4.503.599.627.370.496).",
79
- "es": "Fijación para el número #142 (WriteByDid no funciona en caso de marco de control UDS específico)\nActualización de la lista de puntos de datos para dispositivos E3 a la versión 20250729\nSe agregó codec para enteros de 64 bits. Observación: La codificación (para la escritura de los datos) se limita a los valores . 2^52 (4.503.599.627.370.496).",
80
- "pl": "Fix for issue # 142 (WriteByDid not working in case of specific UDS control frame)\nAktualizacja wykazu punktów danych dla urządzeń E3 do wersji 20250729\nDodano kodek dla 64- bitowych liczb całkowitych. Uwaga: Kodowanie (do zapisu danych) jest ograniczone do wartości < 2 ^ 52 (4.503.599.627.370.496).",
81
- "uk": "Виправлення проблеми #142 (WriteByDid не працює в разі конкретної рамки керування UDS)\nОновлення списку точок даних для пристроїв E3 до версії 20250729\nДодано кодеку для 64-бітних цілих чисел. Примітка: Конкодування (для написання даних) обмежується значеннями < 2^52 (4.503.599.627.370.496).",
82
- "zh-cn": "修复第142期( WriteBy 在特定UDS 控制框架情况下没有工作)\nE3设备数据点列表更新至20250729版本\n为64位整数添加编码器. 注:编码(用于写入数据)仅限于 < 2^52(4.503.599.627.370.496)的值."
83
- },
84
- "0.10.9": {
85
- "en": "Update of list of data points for E3 devices to version 20250422\nFixed version number of enum info\nFix for issue #125 (findings of repository checker)",
86
- "de": "Aktualisierung der Liste der Datenpunkte für E3 Geräte auf Version 20250422\nVersionsnummer der enum info korrigiert\nFix für Issue #125 (Ergebnisse des Repository-Checkers)",
87
- "ru": "Обновление списка точек данных для устройств E3 до версии 20250422\nФиксированный номер версии enum info\nИсправление для выпуска #125 (находки проверки хранилища)",
88
- "pt": "Atualização da lista de pontos de dados para dispositivos E3 para a versão 20250422\nNúmero de versão fixa de enum info\nCorrigir para o número #125 (conjuntos de verificador de repositório)",
89
- "nl": "Update van de lijst van gegevenspunten voor E3-apparaten naar versie 20250422\nFixed version number of enum info\nFix voor uitgave #125 (bevindingen van repository checker)",
90
- "fr": "Mise à jour de la liste des points de données pour les appareils E3 vers la version 20250422\nNuméro de version fixe d'enum info\nCorrection pour le numéro #125 (recherches du vérificateur du dépôt)",
91
- "it": "Aggiornamento dell'elenco dei punti di dati per i dispositivi E3 alla versione 20250422\nNumero di versione fisso di enum info\nRisolvere per numero #125 (finanze di repository checker)",
92
- "es": "Actualización de la lista de puntos de datos para dispositivos E3 a la versión 20250422\nNúmero de versión fija de enum info\nFijación para el número #125 (definiciones de repositorio)",
93
- "pl": "Aktualizacja wykazu punktów danych dla urządzeń E3 do wersji 20250422\nPoprawiony numer wersji enum info\nFix for issue # 125 (wyniki weryfikacji repozytorium)",
94
- "uk": "Оновлення списку точок даних для пристроїв E3 до версії 20250422\nФіксована версія номеру енму\nВиправлення для випуску #125 (фінінги репозиторійного чекера)",
95
- "zh-cn": "E3设备数据点列表更新至20250422版本\nEnum信息的固定版本编号\n修复第125期(查找仓库检查器)"
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/lib/canUds.js CHANGED
@@ -130,6 +130,7 @@ class uds {
130
130
  cntCommTotal: 0, // Number of startes communications
131
131
  cntCommOk: 0, // Number of succesfull communications
132
132
  cntCommNR: 0, // Number of communications ending in negative response
133
+ cntCommZL: 0, // Number of dids received having a length of zero
133
134
  cntCommTimeout: 0, // Number of communications ending in timeout
134
135
  cntCommBadProtocol: 0, // Number of bad communications, e.g. bad frame
135
136
  cntCommFailedPerDid: {}, // Number of communications failed (timeout or bad protocol) for specific did
@@ -1057,13 +1058,31 @@ class uds {
1057
1058
  );
1058
1059
  await this.calcStat();
1059
1060
  this.data.len = candata[0] - 3;
1060
- this.data.databytes = candata.slice(4, 4 + this.data.len);
1061
- this.storage.decodeDataCAN(
1062
- ctx,
1063
- this,
1064
- String(this.data.did),
1065
- this.data.databytes.slice(0, this.data.len),
1066
- );
1061
+ if (this.data.len > 0) {
1062
+ // Only non-zero length is valid response
1063
+ this.data.databytes = candata.slice(4, 4 + this.data.len);
1064
+ this.storage.decodeDataCAN(
1065
+ ctx,
1066
+ this,
1067
+ String(this.data.did),
1068
+ this.data.databytes.slice(0, this.data.len),
1069
+ );
1070
+ } else {
1071
+ // Treat zero length did as negative response
1072
+ this.stat.cntCommZL += 1;
1073
+ if (this.callback) {
1074
+ this.callback(ctx, this, [
1075
+ 'negative response',
1076
+ { did: this.data.did, didInfo: { id: '', len: 0 }, val: '' },
1077
+ ]);
1078
+ } else {
1079
+ ctx.log.warn(
1080
+ `UDS worker error on ${this.config.stateBase}: Got did with a length of zero. Ignoring. Did=${String(
1081
+ this.data.did,
1082
+ )}`,
1083
+ );
1084
+ }
1085
+ }
1067
1086
  await this.setDidDone(ctx, 0);
1068
1087
  break;
1069
1088
  } else {
@@ -277,7 +277,12 @@ describe('codecs.js => O3EComplexType()', () => {
277
277
  describe('codecs.js => O3EList()', () => {
278
278
  const raw_hex = '0a00b001f30314170b12050e3a313602f30314170b12050e390c3602f30314170b12050e2f273602f30314170b12050d2b063602f30314170b12050d2a233602f30314170b12050d27383602f30314170b12050d26033602f30314170b12050d242d3602f30314170b12050d1f043602f30314170b12050d1e133602';
279
279
  const raw_arr = toByteArray(raw_hex);
280
- const js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
280
+ let js = {}
281
+ if (Intl.DateTimeFormat().resolvedOptions().locale.startsWith('de')) {
282
+ js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
283
+ } else {
284
+ js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
285
+ }
281
286
  const cdi = E3DidsDict[266];
282
287
  codecDecode('Decoding did 266 ', js, E3.O3Ecodecs[cdi.codec], cdi.len, cdi.id, cdi.args, raw_arr, 'Metric / DayMonthYear / TwentyFourHours');
283
288
  // Encoding makes no sense for this did in real life, but testing helps to improve codec robustness
@@ -287,7 +292,12 @@ describe('codecs.js => O3EList()', () => {
287
292
  describe('codecs.js => O3EList()', () => {
288
293
  const raw_hex = '0a00b001f3031417120b050e3a313602f3031417120b050e390c3602f3031417120b050e2f273602f3031417120b050d2b063602f3031417120b050d2a233602f3031417120b050d27383602f3031417120b050d26033602f3031417120b050d242d3602f3031417120b050d1f043602f3031417120b050d1e133602';
289
294
  const raw_arr = toByteArray(raw_hex);
290
- const js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
295
+ let js = {}
296
+ if (Intl.DateTimeFormat().resolvedOptions().locale.startsWith('de')) {
297
+ js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
298
+ } else {
299
+ js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
300
+ }
291
301
  const cdi = E3DidsDict[266];
292
302
  codecDecode('Decoding did 266 using format MonthDayYear ', js, E3.O3Ecodecs[cdi.codec], cdi.len, cdi.id, cdi.args, raw_arr, 'Metric / MonthDayYear / TwentyFourHours');
293
303
  // Encoding makes no sense for this did in real life, but testing helps to improve codec robustness
@@ -297,7 +307,12 @@ describe('codecs.js => O3EList()', () => {
297
307
  describe('codecs.js => O3EList()', () => {
298
308
  const raw_hex = '0a00b001f303120b1417050e3a313602f303120b1417050e390c3602f303120b1417050e2f273602f303120b1417050d2b063602f303120b1417050d2a233602f303120b1417050d27383602f303120b1417050d26033602f303120b1417050d242d3602f303120b1417050d1f043602f303120b1417050d1e133602';
299
309
  const raw_arr = toByteArray(raw_hex);
300
- const js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
310
+ let js = {}
311
+ if (Intl.DateTimeFormat().resolvedOptions().locale.startsWith('de')) {
312
+ js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18.11.2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
313
+ } else {
314
+ js = {'Count':10,'GrandTotal':432,'ListEntries':[{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:58:49','Timestamp':1700315929000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:57:12','Timestamp':1700315832000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 14:47:39','Timestamp':1700315259000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:43:06','Timestamp':1700311386000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:42:35','Timestamp':1700311355000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:39:56','Timestamp':1700311196000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:38:03','Timestamp':1700311083000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:36:45','Timestamp':1700311005000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:31:04','Timestamp':1700310664000},'Unknown':566},{'Error':{'ID':1011,'Text':'FailureCompressorOutletPressureSensor'},'DateTime':{'DateTime':'18/11/2023, 13:30:19','Timestamp':1700310619000},'Unknown':566}]};
315
+ }
301
316
  const cdi = E3DidsDict[266];
302
317
  codecDecode('Decoding did 266 using format YearMonthDay ', js, E3.O3Ecodecs[cdi.codec], cdi.len, cdi.id, cdi.args, raw_arr, 'Metric / YearMonthDay / TwentyFourHours');
303
318
  // Encoding makes no sense for this did in real life, but testing helps to improve codec robustness
package/lib/storage.js CHANGED
@@ -384,7 +384,7 @@ class storageDids {
384
384
  */
385
385
  async storeObject(ctx, did, idStr, stateId, obj, type, role, forceExtendObject = false) {
386
386
  try {
387
- if (forceExtendObject) {
387
+ if (forceExtendObject || !(await ctx.objectExists(stateId))) {
388
388
  // Override object properties, e.g. data type
389
389
  let metaData = { desc: '', unit: '' };
390
390
  metaData = await this.getMetaData(this.didsMetaDict, stateId);
@@ -401,18 +401,6 @@ class storageDids {
401
401
  },
402
402
  native: {},
403
403
  });
404
- } else {
405
- await ctx.setObjectNotExistsAsync(stateId, {
406
- type: 'state',
407
- common: {
408
- name: idStr,
409
- type: type,
410
- role: role,
411
- read: true,
412
- write: true,
413
- },
414
- native: {},
415
- });
416
404
  }
417
405
  if (type == 'number') {
418
406
  await ctx.setStateAsync(stateId, obj, true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.e3oncan",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "Collect data on CAN bus for Viessmann E3 devices, e.g. Vitocal, Vitocharge, Energy Meters E380CA and E3100CB",
5
5
  "author": {
6
6
  "name": "Juergen",