Closed Arcticon closed 3 months ago
@Arcticon
Hmmm. Diese Änderung hat leider ein fettes Problem in den Adapter eingeschleust: [#278]
Das Problem liegt darin, dass das alte Array aus zwei Richtungen abgefragt wurde:
Analyse: gekürzter Beispielcode
const datapoints = new Map([
[
'channel',
{
name: 'WIFIchannel',
description: 'Number of the used WIFI channel.',
type: 'number',
writeable: false,
role: 'value',
unit: ''
}
],
[
'ercd',
{
name: 'LastErrorCode',
description: 'Error code of the last error occurred on this device',
type: 'string',
writeable: false,
role: 'text',
unit: ''
}
]
]);
console.log( datapoints.get("LastErrorCode") );
console.log( datapoints.get("ercd") );
Ergebnis:
Node.js v20.12.2
PS C:\Users\xxx\WebstormProjects\ioBroker.dysonairpurifier> node ..\test.js
undefined // <- "LastErrorCode" kann nicht aufgelöst werden
// Ergebnis der Suche nach ERCD
{
name: 'LastErrorCode',
description: 'Error code of the last error occurred on this device',
type: 'string',
writeable: false,
role: 'text',
unit: ''
}
Wie bekommen wir es jetzt wieder hin auch nach "LastErrorCode" etc suchen zu können, ohne die Map (oder Teile davon) doppeln zu müssen?
@Grizzelbee ich habe noch eine lookup map hinzugefuegt. damit funktioniert wieder alles
Habe ich gerade schon gesehen - mag die Lösung aber nicht, weil sie jeden einzelnen dyson-code und den zugehörigenb Obejektbaum-Namen doppelt - was bei künftigen Änderungen mit Sicherheit vergessen wird und zu Problemen führt. Redundanz ist immer Mist.
Kann man diese Liste nicht dynamisch aus den Keys der Map und dem zugehörigen *.Name" bilden? Da würde ich zugunsten der Objekt-Update-Performanz mitspielen.
Man koennte das hier machen:
new Map(
Array.from(datapoints.entries()).map(([key, { name }]) => [name, key])
);
wie findest du das?
Yapp - finde ich gut.
@Grizzelbee habe noch tests hinzugefuegt.
Die function
getDatapoint
in main.js kann optimiert werden, weil immer nach einem unique key gesucht wird. Wenn eine Map anstatt einem Array benutzt wird kann man konstante zugriffszeiten bekommen.Ich habe das mal implementiert und einen benchmark laufen lassen:
best
sucht nachchannel
(erstes element im array)worst
sucht nachste1
(letztes element im array)Code (bench.mjs):