NEWS
Zabbix Daten in ioBroker bekommen
-
Hallo,
eventuell ist das eine ungewöhnliche Anfrage, da es mit JS vermutlich auch geht....
Allerdings werde ich mit JS nicht ganz warm..... Deshalb des Shellscript aus aus der Ki.....Ich habe ein Shell Script geschrieben und über den Admin in userdata abgelegt.
Ich bin den Weg gegangen, damit es mit in den Backups landet.Kann ich das Script über Blockly ausführbar machen (damit nach einem restore auf einem neuen System weiter läuft) und ausführen?
Habe es mal so getestet, das klappt aber nicht.


-
Hallo,
eventuell ist das eine ungewöhnliche Anfrage, da es mit JS vermutlich auch geht....
Allerdings werde ich mit JS nicht ganz warm..... Deshalb des Shellscript aus aus der Ki.....Ich habe ein Shell Script geschrieben und über den Admin in userdata abgelegt.
Ich bin den Weg gegangen, damit es mit in den Backups landet.Kann ich das Script über Blockly ausführbar machen (damit nach einem restore auf einem neuen System weiter läuft) und ausführen?
Habe es mal so getestet, das klappt aber nicht.


chmod musst du eigentlich nur einmal machen,
wenn der iobroker etwas ausführt dann macht er das als der user iobroker
wenn etwas nicht funktioniert liegt es meist daran, das der nutzer iobroker das skript, welches du wahrscheinlich mit deinem normal nutzer erstellt hat
nicht ausführen darf oder sogar nicht sieht.wenn su auf der shell den folgenden befeh eingibst
sudo -u iobroker bashwird eine neue shell als nutzer iobroker geöffnet.
da kann man gut testen und sieht welche fehlermeldungen da kommen. -
chmod musst du eigentlich nur einmal machen,
wenn der iobroker etwas ausführt dann macht er das als der user iobroker
wenn etwas nicht funktioniert liegt es meist daran, das der nutzer iobroker das skript, welches du wahrscheinlich mit deinem normal nutzer erstellt hat
nicht ausführen darf oder sogar nicht sieht.wenn su auf der shell den folgenden befeh eingibst
sudo -u iobroker bashwird eine neue shell als nutzer iobroker geöffnet.
da kann man gut testen und sieht welche fehlermeldungen da kommen.Hab es jetzt "manuell" ausführbar gemacht. Kann ja eine Meldung ins log schreiben, falls keine Daten ankommen für eine Neuinstallation.
Hab die json zumindest jetzt so wie ich es mag.
Die Items die man sehen will, lassen sich easy anpassen.{ "Zabbix server": { "Load average (1m avg)": { "value": "2.232422", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.520996", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.666992", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Taiscale": { "Load average (1m avg)": { "value": "0.37207", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.494141", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.657227", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 1, "alerts": { "32546": { "uid": "36660", "triggerid": "32546", "message": "Tailscale Service down", "priority": "High", "time": "30.12.2025 17:58:44" } } } }, "MariaDB": { "Load average (1m avg)": { "value": "2.078125", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.520996", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.670898", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Proxmox_Home": { "Load average (1m avg)": { "value": "0.540527", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.89209", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.77832", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 1, "alerts": { "32961": { "uid": "37689", "triggerid": "32961", "message": "Proxmox VE: VM [pve/Docker (qemu/113)]: Not running", "priority": "Average", "time": "30.12.2025 20:17:27" } } } }, "PBS": { "Load average (1m avg)": { "value": "0.076172", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.089844", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.086426", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Docker": { "Load average (1m avg)": { "value": "0.750977", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.586914", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.487793", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Not available", "count": 3, "alerts": { "33250": { "uid": "37079", "triggerid": "33250", "message": "Docker: Failed to fetch info data", "priority": "Warning", "time": "30.12.2025 18:47:10" }, "33262": { "uid": "36877", "triggerid": "33262", "message": "Linux: Zabbix agent is not available", "priority": "Average", "time": "30.12.2025 18:21:39" }, "33307": { "uid": "36761", "triggerid": "33307", "message": "Docker: Container /mini-qr: Container has been stopped with error code", "priority": "Average", "time": "30.12.2025 18:11:15" } } } } } -
Hab es jetzt "manuell" ausführbar gemacht. Kann ja eine Meldung ins log schreiben, falls keine Daten ankommen für eine Neuinstallation.
Hab die json zumindest jetzt so wie ich es mag.
Die Items die man sehen will, lassen sich easy anpassen.{ "Zabbix server": { "Load average (1m avg)": { "value": "2.232422", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.520996", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.666992", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Taiscale": { "Load average (1m avg)": { "value": "0.37207", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.494141", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.657227", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 1, "alerts": { "32546": { "uid": "36660", "triggerid": "32546", "message": "Tailscale Service down", "priority": "High", "time": "30.12.2025 17:58:44" } } } }, "MariaDB": { "Load average (1m avg)": { "value": "2.078125", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.520996", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.670898", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Proxmox_Home": { "Load average (1m avg)": { "value": "0.540527", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.89209", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.77832", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 1, "alerts": { "32961": { "uid": "37689", "triggerid": "32961", "message": "Proxmox VE: VM [pve/Docker (qemu/113)]: Not running", "priority": "Average", "time": "30.12.2025 20:17:27" } } } }, "PBS": { "Load average (1m avg)": { "value": "0.076172", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.089844", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.086426", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Available", "count": 0, "alerts": {} } }, "Docker": { "Load average (1m avg)": { "value": "0.750977", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.586914", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.487793", "unit": "", "value_type": "number" }, "warnings": { "online_status": "Not available", "count": 3, "alerts": { "33250": { "uid": "37079", "triggerid": "33250", "message": "Docker: Failed to fetch info data", "priority": "Warning", "time": "30.12.2025 18:47:10" }, "33262": { "uid": "36877", "triggerid": "33262", "message": "Linux: Zabbix agent is not available", "priority": "Average", "time": "30.12.2025 18:21:39" }, "33307": { "uid": "36761", "triggerid": "33307", "message": "Docker: Container /mini-qr: Container has been stopped with error code", "priority": "Average", "time": "30.12.2025 18:11:15" } } } } }Hab jetzt 2-3h mit ChatGPT und Gemini rumprobiert ein Script zu bauen, was die json mit Datenpunkten und Ordnern Nachbaut.
Mal sind ein paar Sachen gekommen mal nicht.Mein Versuch war ein universelles Script, was quasi jede json abbildet/nachbaut .....
Die "unit" und "value_type" aus meinen Daten hab ich erstmal außen vor gelassen.Hast du @paul53 da eine Idee?
Der Hammer wäre natürlich, wenn das Script auch die DPs löscht die nicht mehr im json sind.
Als Variable hab ich immer einen DP mit der json und einen BasePath angegeben.Bei meiner json sollte sowas in der Art raus kommen.

-
Hab jetzt 2-3h mit ChatGPT und Gemini rumprobiert ein Script zu bauen, was die json mit Datenpunkten und Ordnern Nachbaut.
Mal sind ein paar Sachen gekommen mal nicht.Mein Versuch war ein universelles Script, was quasi jede json abbildet/nachbaut .....
Die "unit" und "value_type" aus meinen Daten hab ich erstmal außen vor gelassen.Hast du @paul53 da eine Idee?
Der Hammer wäre natürlich, wenn das Script auch die DPs löscht die nicht mehr im json sind.
Als Variable hab ich immer einen DP mit der json und einen BasePath angegeben.Bei meiner json sollte sowas in der Art raus kommen.

-
Irgendwie geht es jetzt nicht mehr um den Inhalt des ersten Posts, sondern um etwas anderes
-
Die DPs werden jetzt sauber angelegt.
Muss nur noch schauen, wie ich verweiste Meldungen lösche.Verweiste DPs bekomme ich hin. Muss nur noch leere Ordner löschen können (ggf mit leeren Unterordnern)
// --- KONFIGURATION --- const sourceDP = '0_userdata.0.Zabbix.json'; // Korrigierter Pfad (Großes Z) const basePath = '0_userdata.0.Zabbix.Hosts'; // Basis-Pfad für die Host-Struktur // --------------------- async function updateZabbixStates() { if (!existsState(sourceDP)) { log(`Quelldatenpunkt ${sourceDP} existiert nicht!`, 'warn'); return; } const state = getState(sourceDP); if (!state || !state.val || state.val === "" || state.val === "{}") return; try { const data = JSON.parse(state.val); for (const hostName in data) { const host = data[hostName]; const hostPath = `${basePath}.${hostName.replace(/\s/g, '_')}`; // --- Universelles Auslesen aller Keys (außer warnings) --- for (const key in host) { if (key === 'warnings') continue; const item = host[key]; if (item && typeof item === 'object' && item.hasOwnProperty('value')) { const stateName = key.replace(/[()]/g, '').replace(/\s/g, '_'); const val = item.value_type === 'number' ? parseFloat(item.value) : item.value; const type = item.value_type === 'number' ? 'number' : 'string'; await createAndSetState(`${hostPath}.${stateName}`, val, type, 'value', item.unit || ''); } } // --- Warnings Block (Status, Count & Alerts) --- if (host.warnings) { const wPath = `${hostPath}.warnings`; await createAndSetState(`${wPath}.online_status`, host.warnings.online_status, 'string', 'info.status'); await createAndSetState(`${wPath}.count`, host.warnings.count, 'number', 'value.alarm'); if (host.warnings.alerts) { for (const tid in host.warnings.alerts) { const alert = host.warnings.alerts[tid]; const aPath = `${wPath}.alerts.${tid}`; for (const aField in alert) { await createAndSetState(`${aPath}.${aField}`, alert[aField], 'string', 'text'); } } } } } } catch (e) { log('Fehler beim Parsen des Zabbix JSON: ' + e, 'error'); } } /** * Hilfsfunktion: Erstellt State falls nicht vorhanden und setzt Wert */ async function createAndSetState(id, value, type, role, unit = '') { if (!existsState(id)) { await createStateAsync(id, { name: id.split('.').pop(), type: type, role: role, unit: unit, read: true, write: false, def: value }); } setState(id, value, true); } // Trigger on({id: sourceDP, change: "any"}, updateZabbixStates); // Start updateZabbixStates();
