NEWS
Skript um DPs aufzuräumen
-
Hallo,
eventuell kann mir jemand helfen.
Mit Blockly bin ich ja ganz fit, jedoch kann man es da denke nicht umsetzen.
Ich hatte gerne ein Script, um unter einem bestimmten Pfad (evtl Anfangs als Variable BasePath definieren) alle DPs zu löschen die älter sind als x Sekunden (inklusive Unterordnern).
Danach sollen alle leeren Ordner gelöscht werden.
Entweder in 2er, 3er,...,... Ebene oder oder ggf schon in der obersten Ebene falls darunter liegende order leer sind.Ordner A
-DP1
Ordner B- DP2
--Ordner C
-Ordner D
Hier sollen C und D gelöscht werden.
Falls unterhalb von A nur noch BCD ohne DPs sind auch A löschen.Oder anders gesagt, leere Order dürfen als nicht existent angesehen werden.
- DP2
-
Hallo,
eventuell kann mir jemand helfen.
Mit Blockly bin ich ja ganz fit, jedoch kann man es da denke nicht umsetzen.
Ich hatte gerne ein Script, um unter einem bestimmten Pfad (evtl Anfangs als Variable BasePath definieren) alle DPs zu löschen die älter sind als x Sekunden (inklusive Unterordnern).
Danach sollen alle leeren Ordner gelöscht werden.
Entweder in 2er, 3er,...,... Ebene oder oder ggf schon in der obersten Ebene falls darunter liegende order leer sind.Ordner A
-DP1
Ordner B- DP2
--Ordner C
-Ordner D
Hier sollen C und D gelöscht werden.
Falls unterhalb von A nur noch BCD ohne DPs sind auch A löschen.Oder anders gesagt, leere Order dürfen als nicht existent angesehen werden.
@David-G.
Kannst du bitte den Hintergrund erklären, worum geht es dabei?
Wie entsteht die Situation?Grundsäzlich kann man mit dem Selektor ja nur States auslesen.
-> Man würde die Objekte (Folder) gar nicht in der Liste sehen.
Wenn die Situation durch ein eigenes Script entsteht, sollte man dort ansetzen und eine Verwaltung für die angelegten DPs erstellen. - DP2
-
@David-G.
Kannst du bitte den Hintergrund erklären, worum geht es dabei?
Wie entsteht die Situation?Grundsäzlich kann man mit dem Selektor ja nur States auslesen.
-> Man würde die Objekte (Folder) gar nicht in der Liste sehen.
Wenn die Situation durch ein eigenes Script entsteht, sollte man dort ansetzen und eine Verwaltung für die angelegten DPs erstellen.@MCU sagte in Skript um DPs aufzuräumen:
Man würde die Objekte (Folder) gar nicht in der Liste sehen.
Auch wenn ich nicht weiß wovon ich schreibe 😉
gab's da nicht was von parents und grandparents -
@MCU sagte in Skript um DPs aufzuräumen:
Man würde die Objekte (Folder) gar nicht in der Liste sehen.
Auch wenn ich nicht weiß wovon ich schreibe 😉
gab's da nicht was von parents und grandparents@Homoran Ja, kann man dann nutzen, wenn man die ID hat. In dieser steht dann ja die Herkunft. Aber mit dem Selektor würde man schon leere Ordner nicht erkennen können, da dort nur IDs von den States drin stehen.
Leider gibt es in javascript oder Blockly keine Funktion um generisch Objekte zu ermitteln.
Für States gibt es den Selektor$. Für bekannte IDs kann man mitgetObjectdie zugehörigen Daten holen.
Aber es gibt keinen "Selektor" für Objekte. -
@Homoran Ja, kann man dann nutzen, wenn man die ID hat. In dieser steht dann ja die Herkunft. Aber mit dem Selektor würde man schon leere Ordner nicht erkennen können, da dort nur IDs von den States drin stehen.
Leider gibt es in javascript oder Blockly keine Funktion um generisch Objekte zu ermitteln.
Für States gibt es den Selektor$. Für bekannte IDs kann man mitgetObjectdie zugehörigen Daten holen.
Aber es gibt keinen "Selektor" für Objekte.Feature für Selector für Objekte in javascript gibt es schon seit 2021
https://github.com/ioBroker/ioBroker.javascript/issues/799
Vielleicht hilft ein hochvoten? -
Hallo,
eventuell kann mir jemand helfen.
Mit Blockly bin ich ja ganz fit, jedoch kann man es da denke nicht umsetzen.
Ich hatte gerne ein Script, um unter einem bestimmten Pfad (evtl Anfangs als Variable BasePath definieren) alle DPs zu löschen die älter sind als x Sekunden (inklusive Unterordnern).
Danach sollen alle leeren Ordner gelöscht werden.
Entweder in 2er, 3er,...,... Ebene oder oder ggf schon in der obersten Ebene falls darunter liegende order leer sind.Ordner A
-DP1
Ordner B- DP2
--Ordner C
-Ordner D
Hier sollen C und D gelöscht werden.
Falls unterhalb von A nur noch BCD ohne DPs sind auch A löschen.Oder anders gesagt, leere Order dürfen als nicht existent angesehen werden.
@David-G. sagte in Skript um DPs aufzuräumen:
ch hatte gerne ein Script, um unter einem bestimmten Pfad (evtl Anfangs als Variable BasePath definieren) alle DPs zu löschen die älter sind als x Sekunden (inklusive Unterordnern).
Danach sollen alle leeren Ordner gelöscht werden.
Der Lösungsansatz der sich anbietet:
- du holst dir mit einem Selektor alle Objekte unterhalb deines basispfades
- dann gehst du durch die Objekte durch. Bei jedem Objekt
objzerlegst du den Objektnamen in seine Struktur und trägst es in ein mehrstufiges Objekt ein (Beispiel:0_userdata.0.exampleBase.devicea.ChannelB.state, => du hast ein Objekt nach folgendem Muster:
const myStructure = { exampleBase: { devicea: { channelB: { state: true; } } } }Dabei legst du die
propertystate mit value 'true' nur dann an wenn du das Objekt nicht löscht. Bei Objekten die du löscht legst du nur die Struktur bischannelBan, sofern sie noch nicht existiert.In der Folge kannst du dann rekursiv durch dein Objekt durchgehen. Dazu brauchst du eine Funktion
function recursiveDelete(obj, keys) { const canDelete = true; for const key of Object.keys(obj) { const child = obj[key]; if (typeof child === 'boolean') { candelete = false; continue; } if (typeof child === 'object') canDelete &= recursiveDelete(child, `${keys}.${key}`); } if (canDelete) deleteObject(`${keys}.${key}`) // ich hab den genauen Aufruf nicht da, kann sein das das nicht ganz passt. return canDelete }die würdest du aufrufen mit
recursiveDelete(myStructure, '0_userdata.0');A.
- DP2
-
@David-G. sagte in Skript um DPs aufzuräumen:
ch hatte gerne ein Script, um unter einem bestimmten Pfad (evtl Anfangs als Variable BasePath definieren) alle DPs zu löschen die älter sind als x Sekunden (inklusive Unterordnern).
Danach sollen alle leeren Ordner gelöscht werden.
Der Lösungsansatz der sich anbietet:
- du holst dir mit einem Selektor alle Objekte unterhalb deines basispfades
- dann gehst du durch die Objekte durch. Bei jedem Objekt
objzerlegst du den Objektnamen in seine Struktur und trägst es in ein mehrstufiges Objekt ein (Beispiel:0_userdata.0.exampleBase.devicea.ChannelB.state, => du hast ein Objekt nach folgendem Muster:
const myStructure = { exampleBase: { devicea: { channelB: { state: true; } } } }Dabei legst du die
propertystate mit value 'true' nur dann an wenn du das Objekt nicht löscht. Bei Objekten die du löscht legst du nur die Struktur bischannelBan, sofern sie noch nicht existiert.In der Folge kannst du dann rekursiv durch dein Objekt durchgehen. Dazu brauchst du eine Funktion
function recursiveDelete(obj, keys) { const canDelete = true; for const key of Object.keys(obj) { const child = obj[key]; if (typeof child === 'boolean') { candelete = false; continue; } if (typeof child === 'object') canDelete &= recursiveDelete(child, `${keys}.${key}`); } if (canDelete) deleteObject(`${keys}.${key}`) // ich hab den genauen Aufruf nicht da, kann sein das das nicht ganz passt. return canDelete }die würdest du aufrufen mit
recursiveDelete(myStructure, '0_userdata.0');A.
@MCU sagte in Skript um DPs aufzuräumen:
Kannst du bitte den Hintergrund erklären, worum geht es dabei?
Wie entsteht die Situation?Ich habe ein Script, was mir Statuswerte aus Zabbix holt.
{ "Zabbix server": { "Load average (1m avg)": { "value": "0.625977", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "8.208386000000004", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "17.97281901041667", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Taiscale": { "Load average (1m avg)": { "value": "0.59082", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "6.156540000000007", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "7.7972412109375", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "MariaDB": { "Load average (1m avg)": { "value": "0.625977", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "20.896816", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "21.89483642578125", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Proxmox_Home": { "Load average (1m avg)": { "value": "0.617188", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "52.825473", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "42.42970375298272", "unit": "%", "value_type": "number" }, "Available updates": { "value": "5", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 2, "alerts": { "32944": { "uid": "59747", "triggerid": "32944", "message": "Proxmox VE: VM [pve/PBS (qemu/114)] high memory usage", "priority": "Warning", "time": "01.01.2026 23:20:37" }, "32961": { "uid": "65386", "triggerid": "32961", "message": "Proxmox VE: VM [pve/Docker (qemu/113)]: Not running", "priority": "Average", "time": "02.01.2026 12:08:27" } } } }, "PBS": { "Load average (1m avg)": { "value": "0.029785", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "10.296623999999994", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "54.08080413119932", "unit": "%", "value_type": "number" }, "Available updates": { "value": "7", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Docker": { "Load average (1m avg)": { "value": "0.286621", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "24.302128999999994", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "66.43690581872296", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Not available", "count": 2, "alerts": { "33250": { "uid": "58730", "triggerid": "33250", "message": "Docker: Failed to fetch info data", "priority": "Warning", "time": "01.01.2026 20:58:10" }, "33262": { "uid": "58502", "triggerid": "33262", "message": "Linux: Zabbix agent is not available", "priority": "Average", "time": "01.01.2026 20:31:39" } } } }, "NAS": { "Load average (1m avg)": { "value": "0.59082", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "22.780513999999997", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "74.3475830078125", "unit": "%", "value_type": "number" }, "Available updates": { "value": "1", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "iobroker": { "Load average (1m avg)": { "value": "0.617188", "unit": "", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "71.397829", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "37.839508056640625", "unit": "%", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } } }Auch habe ich es mit gemini geschafft, dass mir die json sauber in DPs samt Ordnern nachgebaut wird (muss nur noch [] rausfiltern).
Auch, alte DPs zu löschen. Einfach die, wo die letzte Änderung Zb älter als 1sek nach dem ausführen sind.@Asgothian
Keine Ahnung ob ich das kapiert habe 🤣
Gebe das einfach mal gemini an die Hand ^^Edit
Was gemini und ChatGPT aus deinem post bauen klappt nicht ^^. -
@MCU sagte in Skript um DPs aufzuräumen:
Kannst du bitte den Hintergrund erklären, worum geht es dabei?
Wie entsteht die Situation?Ich habe ein Script, was mir Statuswerte aus Zabbix holt.
{ "Zabbix server": { "Load average (1m avg)": { "value": "0.625977", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "8.208386000000004", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "17.97281901041667", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Taiscale": { "Load average (1m avg)": { "value": "0.59082", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "6.156540000000007", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "7.7972412109375", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "MariaDB": { "Load average (1m avg)": { "value": "0.625977", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "20.896816", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "21.89483642578125", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Proxmox_Home": { "Load average (1m avg)": { "value": "0.617188", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "52.825473", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "42.42970375298272", "unit": "%", "value_type": "number" }, "Available updates": { "value": "5", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 2, "alerts": { "32944": { "uid": "59747", "triggerid": "32944", "message": "Proxmox VE: VM [pve/PBS (qemu/114)] high memory usage", "priority": "Warning", "time": "01.01.2026 23:20:37" }, "32961": { "uid": "65386", "triggerid": "32961", "message": "Proxmox VE: VM [pve/Docker (qemu/113)]: Not running", "priority": "Average", "time": "02.01.2026 12:08:27" } } } }, "PBS": { "Load average (1m avg)": { "value": "0.029785", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "10.296623999999994", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "54.08080413119932", "unit": "%", "value_type": "number" }, "Available updates": { "value": "7", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Docker": { "Load average (1m avg)": { "value": "0.286621", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "24.302128999999994", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "66.43690581872296", "unit": "%", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Not available", "count": 2, "alerts": { "33250": { "uid": "58730", "triggerid": "33250", "message": "Docker: Failed to fetch info data", "priority": "Warning", "time": "01.01.2026 20:58:10" }, "33262": { "uid": "58502", "triggerid": "33262", "message": "Linux: Zabbix agent is not available", "priority": "Average", "time": "01.01.2026 20:31:39" } } } }, "NAS": { "Load average (1m avg)": { "value": "0.59082", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "22.780513999999997", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "74.3475830078125", "unit": "%", "value_type": "number" }, "Available updates": { "value": "1", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "iobroker": { "Load average (1m avg)": { "value": "0.617188", "unit": "", "value_type": "number" }, "Available updates": { "value": "0", "unit": "", "value_type": "number" }, "Memory utilization": { "value": "71.397829", "unit": "%", "value_type": "number" }, "FS [/]: Space: Used, in %": { "value": "37.839508056640625", "unit": "%", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } } }Auch habe ich es mit gemini geschafft, dass mir die json sauber in DPs samt Ordnern nachgebaut wird (muss nur noch [] rausfiltern).
Auch, alte DPs zu löschen. Einfach die, wo die letzte Änderung Zb älter als 1sek nach dem ausführen sind.@Asgothian
Keine Ahnung ob ich das kapiert habe 🤣
Gebe das einfach mal gemini an die Hand ^^Edit
Was gemini und ChatGPT aus deinem post bauen klappt nicht ^^.@David-G. sagte in Skript um DPs aufzuräumen:
Was gemini und ChatGPT aus deinem post bauen klappt nicht ^^.
Das wundert mich nicht. :)
Zeig doch mal wie du die aus Zabbix geholten Werte im Objektbaum ablegst.
Dann kann ich versuchen dir so ein Skript zu bauen
A.
-
ChatGPT und Gemini sind Assistenten.
Die nehmen dir viel Tipparbeit ab. Die Logik muss trotzdem noch extern gefüttert werden. Wobei Gemini in jedem Fall besser für Android ist. Schon, weil es, da es den Code im Android Studio direkt selbst ändern kann. Aber es macht auch viel Mist. Da muss man dann so genau wie möglich beschreiben, was da nicht wie erwartet funktioniert.
Die Vorschläge sind auch manchmal überflüssig:
