NEWS
HttpPost Block korrekt aufbauen
-
Hallo,
Ich habe einen HttpPist Befehl den ich mit curl am laufen habe.
Würde das nun gerne mit Blockly erledigen.Wie muss ich das aufbauen? Meine versuche scheitern bisher....
curl -s -X POST http://192.168.99.199/zabbix/api_jsonrpc.php \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 12345" \ -d '{ "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["host"], "selectItems":["name","lastvalue","units","value_type"] }, "id":1 }' | jq ' .result | map({ (.host): ( .items | map({ (.name): { value: .lastvalue, unit: .units, value_type: ( if .value_type=="0" then "number" elif .value_type=="3" then "number" else "string" end ) } }) | add ) }) | add ' -
Hallo,
Ich habe einen HttpPist Befehl den ich mit curl am laufen habe.
Würde das nun gerne mit Blockly erledigen.Wie muss ich das aufbauen? Meine versuche scheitern bisher....
curl -s -X POST http://192.168.99.199/zabbix/api_jsonrpc.php \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 12345" \ -d '{ "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["host"], "selectItems":["name","lastvalue","units","value_type"] }, "id":1 }' | jq ' .result | map({ (.host): ( .items | map({ (.name): { value: .lastvalue, unit: .units, value_type: ( if .value_type=="0" then "number" elif .value_type=="3" then "number" else "string" end ) } }) | add ) }) | add '@David-G. sagte in HttpPost Block korrekt aufbauen:
Würde das nun gerne mit Blockly erledigen.
Geht nicht mit Blockly alleine.
Mit JS kein Problem:
function sendZabbix(itemId, content) { const payload = { "jsonrpc": "2.0", "method": "history.push", "params": [{ "itemid": itemId, "value": content }], "id": 1 }; const options = { headers: { 'Content-Type': 'application/json-rpc', 'Authorization': `Bearer ${apiKey}` }, 'timeout': 10000 }; httpPost(zabbixUrl, payload, options, function(error) { if (error) console.error(error); }); }; -
Danke, werde ich testen.
So eine Post Anfrage ist ja nichts ungewöhnliches.
Auch wenn ich mittlerweile zu einem Shell Script gewechselt bin, da es für einen Aufruf zu viel wurde.Da mache ich jetzt auch ein Topic zu auf ^^.
@David-G. sagte in HttpPost Block korrekt aufbauen:
Auch wenn ich mittlerweile zu einem Shell Script gewechselt bin, da es für einen Aufruf zu viel wurde.
Das kann man prima in eine JS-Funktion packen und die dann im Blockly aufrufen.
Was willst Du denn damit machen?
Du liest Werte aus Zabbix. Warum nicht andersrum? Werte kann man auch aus Zabbix an ioBroker senden.
Wenn die Werte in Zabbix erhoben werden, wäre dieser Weg logischer. -
Was ich mit den Daten machen möchte weiß ich noch nicht genau.
Erstmal in den iobroker bekommen.
Werden vermutlich in die Visu landen.Die json aus meinem Befehl hab ich noch erweitert.
Im Moment die avg Werte der cpu.Wenn ich das result im iobroker habe, mal sehen wie ich die DPs ordentlich anlege.
#!/bin/bash ZABBIX_URL="http://192.168.99.199/zabbix/api_jsonrpc.php" TOKEN="abc" # Hosts abrufen (nur aktive Hosts) hosts_json=$(curl -s -X POST "$ZABBIX_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["hostid","host"], "filter":{"status":0} }, "id":1 }') curl -s -X POST "$ZABBIX_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "jsonrpc":"2.0", "method":"item.get", "params":{ "output":["hostid","name","key_","lastvalue","units","value_type"], "filter":{ "key_":[ "system.cpu.load[all,avg1]", "system.cpu.load[all,avg5]", "system.cpu.load[all,avg15]" ] } }, "id":1 }' \ | jq --argjson hosts "$hosts_json" ' ($hosts.result | map({(.hostid): .host}) | add) as $hostnames | .result | group_by(.hostid) | map(select($hostnames[.[0].hostid] != null) | { ($hostnames[.[0].hostid]): ( map({ (.name): { value: .lastvalue, unit: .units, value_type: (if .value_type=="0" or .value_type=="3" then "number" elif .value_type=="1" then "string" else "unknown" end) } }) | add ) } ) | add ' > zabbix.jsonErgibt
{ "Zabbix server": { "Load average (1m avg)": { "value": "0.897461", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.961426", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.078125", "unit": "", "value_type": "number" } }, "Taiscale": { "Load average (1m avg)": { "value": "0.70459", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.916504", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.06543", "unit": "", "value_type": "number" } }, "MariaDB": { "Load average (1m avg)": { "value": "0.976074", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.961426", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.083984", "unit": "", "value_type": "number" } }, "Proxmox_Home": { "Load average (1m avg)": { "value": "0.805664", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.993652", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.090332", "unit": "", "value_type": "number" } }, "PBS": { "Load average (1m avg)": { "value": "0.033691", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.05957", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.077637", "unit": "", "value_type": "number" } }, "Docker": { "Load average (1m avg)": { "value": "0.131836", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.342285", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.470703", "unit": "", "value_type": "number" } } } -
Was ich mit den Daten machen möchte weiß ich noch nicht genau.
Erstmal in den iobroker bekommen.
Werden vermutlich in die Visu landen.Die json aus meinem Befehl hab ich noch erweitert.
Im Moment die avg Werte der cpu.Wenn ich das result im iobroker habe, mal sehen wie ich die DPs ordentlich anlege.
#!/bin/bash ZABBIX_URL="http://192.168.99.199/zabbix/api_jsonrpc.php" TOKEN="abc" # Hosts abrufen (nur aktive Hosts) hosts_json=$(curl -s -X POST "$ZABBIX_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["hostid","host"], "filter":{"status":0} }, "id":1 }') curl -s -X POST "$ZABBIX_URL" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "jsonrpc":"2.0", "method":"item.get", "params":{ "output":["hostid","name","key_","lastvalue","units","value_type"], "filter":{ "key_":[ "system.cpu.load[all,avg1]", "system.cpu.load[all,avg5]", "system.cpu.load[all,avg15]" ] } }, "id":1 }' \ | jq --argjson hosts "$hosts_json" ' ($hosts.result | map({(.hostid): .host}) | add) as $hostnames | .result | group_by(.hostid) | map(select($hostnames[.[0].hostid] != null) | { ($hostnames[.[0].hostid]): ( map({ (.name): { value: .lastvalue, unit: .units, value_type: (if .value_type=="0" or .value_type=="3" then "number" elif .value_type=="1" then "string" else "unknown" end) } }) | add ) } ) | add ' > zabbix.jsonErgibt
{ "Zabbix server": { "Load average (1m avg)": { "value": "0.897461", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.961426", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.078125", "unit": "", "value_type": "number" } }, "Taiscale": { "Load average (1m avg)": { "value": "0.70459", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.916504", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.06543", "unit": "", "value_type": "number" } }, "MariaDB": { "Load average (1m avg)": { "value": "0.976074", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.961426", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.083984", "unit": "", "value_type": "number" } }, "Proxmox_Home": { "Load average (1m avg)": { "value": "0.805664", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.993652", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "1.090332", "unit": "", "value_type": "number" } }, "PBS": { "Load average (1m avg)": { "value": "0.033691", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.05957", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.077637", "unit": "", "value_type": "number" } }, "Docker": { "Load average (1m avg)": { "value": "0.131836", "unit": "", "value_type": "number" }, "Load average (5m avg)": { "value": "0.342285", "unit": "", "value_type": "number" }, "Load average (15m avg)": { "value": "0.470703", "unit": "", "value_type": "number" } } }@David-G. sagte in HttpPost Block korrekt aufbauen:
Was ich mit den Daten machen möchte weiß ich noch nicht genau.
Welche Daten willst Du denn im ioBroker haben?
Dein API-Aufruf liefert alle Hosts mit allen Items.
Willst Du da einzelne Werte visualisieren? Dann würde es ja Sinn machen, nur diese (und zwar nur bei Änderung) an ioBroker zu übertragen. Sonst müsste man ja in ioBroker zyklisch (alle x Sekunden?) lesen ... sowas ist in der Regel ziemlicher Käse.
Man könnte z.B. in Zabbix einen Trigger auf "Change" setzen und den Wert dann per Trigger-Action übertragen.
Oder auch ohne Trigger. Im Preprocessing ein Script aufrufen und den Wert an ioBroker senden.
Da gibt's viele mögliche Wege. -
@David-G. sagte in HttpPost Block korrekt aufbauen:
Was ich mit den Daten machen möchte weiß ich noch nicht genau.
Welche Daten willst Du denn im ioBroker haben?
Dein API-Aufruf liefert alle Hosts mit allen Items.
Willst Du da einzelne Werte visualisieren? Dann würde es ja Sinn machen, nur diese (und zwar nur bei Änderung) an ioBroker zu übertragen. Sonst müsste man ja in ioBroker zyklisch (alle x Sekunden?) lesen ... sowas ist in der Regel ziemlicher Käse.
Man könnte z.B. in Zabbix einen Trigger auf "Change" setzen und den Wert dann per Trigger-Action übertragen.
Oder auch ohne Trigger. Im Preprocessing ein Script aufrufen und den Wert an ioBroker senden.
Da gibt's viele mögliche Wege.Im Post hier drüber ist meine überarbeitete Version.
Da kommt nur was ich brauche.
Mal mit 3 avg Testwerten.Mit nur einer api Abfrage hab ich die Hostnamen nicht hinbekommen.
-
Hier mal ein Beispiel:
Das Item liefert "CPU Utilization" eines bestimmten Host.
Bei jeder Ausführung wird im Preprocessing der gelesene Wert auch an ioBroker übertragen.

-
Hier mal ein Beispiel:
Das Item liefert "CPU Utilization" eines bestimmten Host.
Bei jeder Ausführung wird im Preprocessing der gelesene Wert auch an ioBroker übertragen.

Das bedarf natürlich einiges an "Pflege" und Ersteinrichtung.
Die überwachten Rechner steigen doch langsam an, auch die überwachten Docker Container.
Hatte/hab die Hoffnung das etwas automatisiert hinzubekommen wenn neue Rechner überwacht werden.
Die Tabellen lassen sich dann ja recht easy mit den DPs generieren wenn sie wie in der json Strukturiert sind.
-
Das bedarf natürlich einiges an "Pflege" und Ersteinrichtung.
Die überwachten Rechner steigen doch langsam an, auch die überwachten Docker Container.
Hatte/hab die Hoffnung das etwas automatisiert hinzubekommen wenn neue Rechner überwacht werden.
Die Tabellen lassen sich dann ja recht easy mit den DPs generieren wenn sie wie in der json Strukturiert sind.
@David-G. sagte in HttpPost Block korrekt aufbauen:
Hatte/hab die Hoffnung das etwas automatisiert hinzubekommen wenn neue Rechner überwacht werden.
Stichworte "Dicovery" und "Templates".
"Discovery" entdeckt - wie der Name es vermuten lässt - automatisch neue Hosts.
Mit passenden "Discovery-Actions" werden daraus automatisch Hosts im Sinne von Zabbix.
Denen verpasst man dann passende Templates, die dann schon die entsprechenden Items inkl. Preprocessing enthalten.
Oder man lässt sich von Zabbix informieren - z.B. per Pushover - dass da ein neuer Host aufgetaucht ist und macht den Rest "von Hand". Im einfachsten Fall nur noch ein passendes Template zuordnen. Mit ein bisschen mehr Aufwand ließe sich der korrespondierende DP im ioBroker auch gleich automatisch anlegen. -
@David-G. sagte in HttpPost Block korrekt aufbauen:
Hatte/hab die Hoffnung das etwas automatisiert hinzubekommen wenn neue Rechner überwacht werden.
Stichworte "Dicovery" und "Templates".
"Discovery" entdeckt - wie der Name es vermuten lässt - automatisch neue Hosts.
Mit passenden "Discovery-Actions" werden daraus automatisch Hosts im Sinne von Zabbix.
Denen verpasst man dann passende Templates, die dann schon die entsprechenden Items inkl. Preprocessing enthalten.
Oder man lässt sich von Zabbix informieren - z.B. per Pushover - dass da ein neuer Host aufgetaucht ist und macht den Rest "von Hand". Im einfachsten Fall nur noch ein passendes Template zuordnen. Mit ein bisschen mehr Aufwand ließe sich der korrespondierende DP im ioBroker auch gleich automatisch anlegen.@Codierknecht sagte in HttpPost Block korrekt aufbauen:
Stichworte "Dicovery" und "Templates".
"Discovery" entdeckt - wie der Name es vermuten lässt - automatisch neue Hosts.Die Pflege ich mal noch manuell ein und weise das Standart Linux Template (ggf noch andere) zu (und ggf noch manuell anderes)
@Codierknecht sagte in HttpPost Block korrekt aufbauen:
Denen verpasst man dann passende Templates, die dann schon die entsprechenden Items inkl. Preprocessing enthalten.
Da habe ich mich noch nicht so mit beschäftigt. Hab das gtad eine Woche am laufen und bin täglich überrascht was man noch findet......
Mal überlegen, ob ich weiter mit der json im iobroker arbeite (hab sie mittlerweile in den iob bekommen) oder deinen Ansatz über zabbix.
-
@Codierknecht sagte in HttpPost Block korrekt aufbauen:
Stichworte "Dicovery" und "Templates".
"Discovery" entdeckt - wie der Name es vermuten lässt - automatisch neue Hosts.Die Pflege ich mal noch manuell ein und weise das Standart Linux Template (ggf noch andere) zu (und ggf noch manuell anderes)
@Codierknecht sagte in HttpPost Block korrekt aufbauen:
Denen verpasst man dann passende Templates, die dann schon die entsprechenden Items inkl. Preprocessing enthalten.
Da habe ich mich noch nicht so mit beschäftigt. Hab das gtad eine Woche am laufen und bin täglich überrascht was man noch findet......
Mal überlegen, ob ich weiter mit der json im iobroker arbeite (hab sie mittlerweile in den iob bekommen) oder deinen Ansatz über zabbix.
@David-G. sagte in HttpPost Block korrekt aufbauen:
Da habe ich mich noch nicht so mit beschäftigt. Hab das gtad eine Woche am laufen und bin täglich überrascht was man noch findet......
Ist fast eine eierlegende Wollmilchsau.
Wer einen Hammer hat, sieht eine Welt voller Nägel :-D :-D -
@David-G. sagte in HttpPost Block korrekt aufbauen:
Da habe ich mich noch nicht so mit beschäftigt. Hab das gtad eine Woche am laufen und bin täglich überrascht was man noch findet......
Ist fast eine eierlegende Wollmilchsau.
Wer einen Hammer hat, sieht eine Welt voller Nägel :-D :-DHab es jetzt fast.
Am JS muss mir jmd helfen.
Da komme ich nicht weiter.
Die Ordner bekommen null Werte und beim Namen sämtlicher Ordner und DOs hätte ich gerne das selbe wie beim Pfad vom DP die kurze Variante ohne den Pfad vorher.
const SOURCE_DP = '0_userdata.0.zabbix.json'; const TARGET_ROOT = '0_userdata.0.zabbix.hosts'; // Hilfsfunktion: sichere ID function normalize(name) { return name .toString() .replace(/[^\w]/g, '_') .replace(/_+/g, '_') .replace(/^_|_$/g, ''); } // JSON einlesen const raw = getState(SOURCE_DP)?.val; if (!raw) { log('Zabbix JSON ist leer oder nicht vorhanden', 'warn'); return; } let data; try { data = JSON.parse(raw); } catch (e) { log('JSON Parsing fehlgeschlagen: ' + e, 'error'); return; } // Hosts durchlaufen Object.keys(data).forEach(host => { const hostId = `${TARGET_ROOT}.${normalize(host)}`; // Host-Ordner anlegen (falls nicht vorhanden) if (!existsObject(hostId)) { createState(hostId, null, { type: 'folder', common: { name: host }, native: {} }); } const metrics = data[host]; Object.keys(metrics).forEach(metric => { const m = metrics[metric]; const dpId = `${hostId}.${normalize(metric)}`; const valueType = m.value_type === 'number' ? 'number' : 'string'; const value = valueType === 'number' ? Number(m.value) : String(m.value); // Datenpunkt neu anlegen if (!existsObject(dpId)) { createState(dpId, value, { type: valueType, common: { name: metric, role: 'value', unit: m.unit || '', read: true, write: false }, native: {} }); log(`DP angelegt: ${dpId}`); } // oder nur aktualisieren else { setState(dpId, value, true); } }); });