NEWS
Liste vom Device-Watcher sortieren
-
Hallo Zusammen,
ich bin mit meiner VIS beschäftig und habe eine View in der vom Device-Watcher Adapter die HomeMatic Geräte von Datenpunkt "device-watcher.0.devices.hmrpc.listAll" als Tabelle angezeigt werden. Das funktioniert auch alles, allerdings wird die Tabelle nicht sortiert und bei etwa 40 Geräten sucht man da schon. Was muss ich tun um diese JSON Liste alphabetisch zu sortieren?
Ich habe hier im Forum einen Beitrag gefunden JSON Liste sortieren (Funktion) doch damit komme ich nicht weiter.
Ich müßte die Daten vom bestehenden DP auslesen, sortieren und dann in einen neuen DP schreiben. Oder geht so etwas direkt in VIS?
Ich habe leider keine Ahnung von JS, sonst wäre es wahrscheinlich kein Problem.Vielen Dank schon mal.
Gruß Johannes
-
Ich habe mir einiges im Netz zusammengesucht und hier mal der aktuelle Status:
Mache ich es so:
const sourceObject = 'device-watcher.0.devices.hmrpc.listAll'; const targetObject = '0_userdata.0.Datenpunkte_VIS.HM_ListAll_Sortiert'; // JSON-Objekt mit den Geräteinformationen const deviceListe = [ { "Device": "SD-06-Drucker", "Adapter": "Homematic RPC", "Battery": " - ", "Signal strength": "86%", "Last contact": "11 Tagen", "Status": "Online" }, { "Device": "SD-07-Wohnzimmer-Ecktisch", "Adapter": "Homematic RPC", "Battery": " - ", "Signal strength": "42%", "Last contact": "11 Tagen", "Status": "Online" }, { "Device": "SD-01-Trockner", "Adapter": "Homematic RPC", "Battery": " - ", "Signal strength": " - ", "Last contact": "11 Tagen", "Status": "Online" } ]; // Nach dem "Device"-Namen sortieren deviceListe.sort((a, b) => { const deviceA = a.Device.toUpperCase(); const deviceB = b.Device.toUpperCase(); if (deviceA < deviceB) { return -1; } if (deviceA > deviceB) { return 1; } return 0; }); // Sortierte Geräteliste in das Zielobjekt schreiben setState(targetObject, JSON.stringify(deviceListe)); console.log('Sortierte Geräteliste wurde in ' + targetObject + ' geschrieben.');
ist alles gut. Die Datensätze werden sortiert und in den neuen Datenpunkt geschrieben.
Dann habe ich die Datensätze durch die Variable ersetzt:
Da bekomme ich Fehler zurück, also das Script angepasst und Fehler ausspucken lassen.Dann bekomme ich den Fehler zurück, das er das nicht parsen kann.
Fehlermeldung:06:14:32.944 error javascript.0 (2196) script.js.Test_Scripte.HM_Script_sortieren_3: Fehler beim Parsen des JSON-Objekts: 06:14:32.944 info javascript.0 (2196) script.js.Test_Scripte.HM_Script_sortieren_3: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 06:14:54.361 info javascript.0 (2196) Stop script script.js.Test_Scripte.HM_Script_sortieren_3
Wie schon gesagt, ich hab keine Ahnung vom Srcipten und alles was ich gemacht habe, ist aus dem Netz. Laut Netzt soll ich überprüfen ob das zu lesende Objekt ein gültiges JSON Format ist. Aus meiner Sicht ist das so, aber ich hab keine Ahnung wie ich das jetzt prüfen soll und wo ich suchen soll
Weiß einer von euch weiter?
Gruß Johannes
-
@jojo58 versuche es so:
const sourceObject = 'device-watcher.0.devices.hmrpc.listAll'; const targetObject = '0_userdata.0.Datenpunkte_VIS.HM_ListAll_Sortiert'; // JSON-Objekt mit den Geräteinformationen let deviceListe; try { deviceListe = getState(sourceObject).val; } catch (error) { console.error('Fehler beim Parsen des JSON-Objekts:', error); return; } // Nach dem "Device"-Namen sortieren deviceListe.sort((a, b) => { const deviceA = a.Device.toUpperCase(); const deviceB = b.Device.toUpperCase(); if (deviceA < deviceB) { return -1; } if (deviceA > deviceB) { return 1; } return 0; }); // Sortierte Geräteliste in das Zielobjekt schreiben setState(targetObject, JSON.stringify(deviceListe)); console.log('Sortierte Geräteliste wurde in ' + targetObject + ' geschrieben.');
Json parse in Zeile 7 aus deinem letzen Beispiel ist hier nicht nötig. Zusätzlich hast du beim letzten Beispiel bei getstate nicht das source object eingetragen. Würde das alles aber dann in ein trigger packen da es sonst nur einmalig bei Skriptstart ausgeführt wird. Was mich aber allgemein stutzig macht: bei mir sind die Listen standardmäßig nach abc sortiert.
-
@ciddi89 Moin und Danke, das war's!
Ich habe mehrere Listen vom Devicewatcher und keine davon ist sortiert. Hatte gehofft das in VIS einstellen zu können, aber da habe ich nichts gefunden.
Und hast recht, ich packe das in ein Blockly und Triggere das auf Aktualisierung vom ListAll Datenpunkt.
Vielen Dank für deine Hilfe.
Gruß Johannes
-
@jojo58 super
Ja bei den meisten Visualisierungen kann man eigentlich die Spalte auswählen und wonach dann sortiert werden soll. Wie genau das bei VIS ist weiß ich aber leider auch nicht. Vielleicht kann da ein anderer User helfen dann kann man sich das Skript nämlich sparen. Ich meine das es irgendwie möglich ist.
-
@ciddi89 Ich muss mich entschuldigen. Ich bin mal wieder ein echter Honk und seh den Wald vor lauter Bäumen nicht.
Du hast mich mit dem Spaltenkopf auf eine Idee gebracht. Hab in der View, in der die Liste ist, einfach mal den Spaltenkopf angetippt und siehe da, es wird sortiert Ich kann nach jeder Spalte sortieren. Oh man eh...
Okay, ich hab einiges gelernt und wer weiß, eventuell kann ich das Script später mal gebrauchen, aber es ist echt viel Zeit dafür draufgegangen.
Johannes
-
@jojo58 haha ja manchmal denkt man zu kompliziert passiert mir auch oft genug Hauptsache es funktioniert jetzt doch wie erwartet.
-
@jojo58
Sorry, bei mir funktioniert Selbiges nicht.
Tabelle in VIS als Widget "json Events" - json aus device-watcher.
Welche Widget benutzt du? -
Inventwo Widgets - jsontable
Eine Sortierung funktioniert nur bei aktivierten Tabellenkopf!
-
-
@sigi234 Super danke
hat geklappt