iobroker.e3oncan 0.11.0 → 0.11.1
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 +5 -0
- package/io-package.json +14 -1
- package/lib/canUds.js +26 -7
- package/lib/codecs.test.js +18 -3
- package/lib/storage.js +1 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -264,6 +264,11 @@ If you enjoyed this project — or just feeling generous, consider buying me a b
|
|
|
264
264
|
Placeholder for the next version (at the beginning of the line):
|
|
265
265
|
### **WORK IN PROGRESS**
|
|
266
266
|
-->
|
|
267
|
+
### 0.11.1 (2026-04-23)
|
|
268
|
+
* (MyHomeMyData) Improved robustness: Receiving a data point of length zero is treated as a "negative response"
|
|
269
|
+
* (MyHomeMyData) The metadata is now also restored after a data point is deleted
|
|
270
|
+
* (MyHomeMyData) Aligned test cases for German system language
|
|
271
|
+
|
|
267
272
|
### 0.11.0 (2026-04-14)
|
|
268
273
|
* (MyHomeMyData) To take full advantage of the variant data points and metadata, please perform a device scan followed by a data point scan
|
|
269
274
|
* (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,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "e3oncan",
|
|
4
|
-
"version": "0.11.
|
|
4
|
+
"version": "0.11.1",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.11.1": {
|
|
7
|
+
"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",
|
|
8
|
+
"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",
|
|
9
|
+
"ru": "Повышение надежности: получение нулевой точки данных рассматривается как «отрицательный ответ»\nМетаданные также восстанавливаются после удаления точки данных\nВыровненные тесты для немецкого системного языка",
|
|
10
|
+
"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",
|
|
11
|
+
"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",
|
|
12
|
+
"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",
|
|
13
|
+
"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",
|
|
14
|
+
"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",
|
|
15
|
+
"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",
|
|
16
|
+
"uk": "Покращена надійність: Отримання точки даних довжини нульового обробляється як \"негативна відповідь\"\nМетадані також відновлюються після видалення даних\nВизначені тестові випадки для німецької мови системи",
|
|
17
|
+
"zh-cn": "增强强性:接收长度为0的数据点作为\"负反应\"处理\n在删除一个数据点后, 元数据现在也被恢复\n德语系统语言的对齐测试例"
|
|
18
|
+
},
|
|
6
19
|
"0.11.0": {
|
|
7
20
|
"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
21
|
"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)",
|
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
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
this
|
|
1064
|
-
|
|
1065
|
-
|
|
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 {
|
package/lib/codecs.test.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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