NEWS
(Erledigt) http post request für CodeProject.AI calls
-
Ich möchte per JavaScript request calls meines AI Servers absetzen.
CodeProject.AI liefert dieses Besipiel auf ihrer Webseite:
function detectScene(fileChooser) { var formData = new FormData(); formData.append('image', fileChooser.files[0]); fetch('http://localhost:5000/v1/vision/detect/scene', { method: "POST", body: formData }) .then(response => { if (response.ok) response.json().then(data => { console.log(`Scene is ${data.label}, ${data.confidence} confidence`) }); }); }Kann mir jemand weiterhelfen wie ich dies in den iobroker bekomme?
Es müsste ja in dieser Richtung gehen oder hat jemand bereits eine solche Anbindung an den AI Server gemacht und kann mir ein Beispiel zukommen lassen?
var request = require('request'); // Assume we have a HTML INPUT type=file control with ID=fileChooser var formData = new FormData(); formData.append('image', "TODO_LOAD_IMAGE_FROM_KAMERA"); //formData.append("min_confidence", 0.4); request.post({ url: 'http://192.168.178.124:32168/v1/vision/custom/licence-plates', form: formData }, function(error, response, body) { if (error) log(error, 'error'); });Insbesondere das FormData muss ja umgebaut werden.
-
Ich möchte per JavaScript request calls meines AI Servers absetzen.
CodeProject.AI liefert dieses Besipiel auf ihrer Webseite:
function detectScene(fileChooser) { var formData = new FormData(); formData.append('image', fileChooser.files[0]); fetch('http://localhost:5000/v1/vision/detect/scene', { method: "POST", body: formData }) .then(response => { if (response.ok) response.json().then(data => { console.log(`Scene is ${data.label}, ${data.confidence} confidence`) }); }); }Kann mir jemand weiterhelfen wie ich dies in den iobroker bekomme?
Es müsste ja in dieser Richtung gehen oder hat jemand bereits eine solche Anbindung an den AI Server gemacht und kann mir ein Beispiel zukommen lassen?
var request = require('request'); // Assume we have a HTML INPUT type=file control with ID=fileChooser var formData = new FormData(); formData.append('image', "TODO_LOAD_IMAGE_FROM_KAMERA"); //formData.append("min_confidence", 0.4); request.post({ url: 'http://192.168.178.124:32168/v1/vision/custom/licence-plates', form: formData }, function(error, response, body) { if (error) log(error, 'error'); });Insbesondere das FormData muss ja umgebaut werden.
@uwe72 vermutlich sollte ich eher das NPM Module "node-fetch" verwenden...?!
Update: node-fetch funktioniert auch nicht, siehe:
https://forum.iobroker.net/topic/47726/gelöst-npm-modul-node-fetch-in-der-javascript-instanz/12Ich versuche es nun mal mit dem npm module: axios
-
Ich möchte per JavaScript request calls meines AI Servers absetzen.
CodeProject.AI liefert dieses Besipiel auf ihrer Webseite:
function detectScene(fileChooser) { var formData = new FormData(); formData.append('image', fileChooser.files[0]); fetch('http://localhost:5000/v1/vision/detect/scene', { method: "POST", body: formData }) .then(response => { if (response.ok) response.json().then(data => { console.log(`Scene is ${data.label}, ${data.confidence} confidence`) }); }); }Kann mir jemand weiterhelfen wie ich dies in den iobroker bekomme?
Es müsste ja in dieser Richtung gehen oder hat jemand bereits eine solche Anbindung an den AI Server gemacht und kann mir ein Beispiel zukommen lassen?
var request = require('request'); // Assume we have a HTML INPUT type=file control with ID=fileChooser var formData = new FormData(); formData.append('image', "TODO_LOAD_IMAGE_FROM_KAMERA"); //formData.append("min_confidence", 0.4); request.post({ url: 'http://192.168.178.124:32168/v1/vision/custom/licence-plates', form: formData }, function(error, response, body) { if (error) log(error, 'error'); });Insbesondere das FormData muss ja umgebaut werden.
@uwe72 sagte in http post request für CodeProject.AI calls:
hat jemand bereits eine solche Anbindung an den AI Server gemacht
Noch nie gemacht, aber ziemlich interessiert. Wie muss ich mir das vorstellen? Du schickst dem Server ein Bild einer Überwachungskamera und bekommst ein Kennzeichen (wenn denn eins drauf ist) zurück?
-
@uwe72 sagte in http post request für CodeProject.AI calls:
hat jemand bereits eine solche Anbindung an den AI Server gemacht
Noch nie gemacht, aber ziemlich interessiert. Wie muss ich mir das vorstellen? Du schickst dem Server ein Bild einer Überwachungskamera und bekommst ein Kennzeichen (wenn denn eins drauf ist) zurück?
Ja. Unterschiedliche Usecases denkbar. Zum Beispiel:
- Man schickt dem AI Server ein Bilder der Kamera und bekommt dann ein json zurück mit dem erkannten KFZ-Kennzeichen. Öffnet dann beispielsweise die Garage wenn das gewünschte Kennzeichen gefunden wurde
- Schickt ein Bild von einer Person. AI Server antwortet, ob es eine Person ist oder sogar um, es sich um eine - zuvor antrainierte - spezifische Person handelt
Das ganze Thema rund um KI, d.h. um den AI Server ist sehr einfach. Ist mit docker in ein paar Minuten erstellt. Aber auch ohne docker müsste dies relativ schnell gehen. Den AI Server kann man über die lokale Weboberfläche ausprobieren. Das funktioniert schon alles.
Es handelt sich grundsätzlich um dieses Thema:
https://www.codeproject.com/Articles/5322557/CodeProject-AI-Server-AI-the-easy-wayFür HomeAssistent gibt es eine Anbindung. Für ioBroker habe ich nichts gefunden. Denke sollte aber möglich sein. Ich kämpfe aktuell damit wie ich den Service über JavaScript aufrufe. Was grundsätzlich sogar schon funktioniert. Weiß aber gerade noch nicht wie ich das Bild übergeben kann. Es müssten aber alles NPM Standardfunktionalitäten sein und nicht AI Server spezifisch.
-
@uwe72 vermutlich sollte ich eher das NPM Module "node-fetch" verwenden...?!
Update: node-fetch funktioniert auch nicht, siehe:
https://forum.iobroker.net/topic/47726/gelöst-npm-modul-node-fetch-in-der-javascript-instanz/12Ich versuche es nun mal mit dem npm module: axios
@uwe72 sagte in http post request für CodeProject.AI calls:
Update: node-fetch funktioniert auch nicht
node-fetch funktioniert bei mir einwandfrei mit node-fetch@2 in der Javascript-Instanz unter „Zusätzliche NPM-Module“ eingetragen.
Das @2 ist wesentlich - siehe hierzu auch https://github.com/node-fetch/node-fetch#loading-and-configuring-the-module -
Ja. Unterschiedliche Usecases denkbar. Zum Beispiel:
- Man schickt dem AI Server ein Bilder der Kamera und bekommt dann ein json zurück mit dem erkannten KFZ-Kennzeichen. Öffnet dann beispielsweise die Garage wenn das gewünschte Kennzeichen gefunden wurde
- Schickt ein Bild von einer Person. AI Server antwortet, ob es eine Person ist oder sogar um, es sich um eine - zuvor antrainierte - spezifische Person handelt
Das ganze Thema rund um KI, d.h. um den AI Server ist sehr einfach. Ist mit docker in ein paar Minuten erstellt. Aber auch ohne docker müsste dies relativ schnell gehen. Den AI Server kann man über die lokale Weboberfläche ausprobieren. Das funktioniert schon alles.
Es handelt sich grundsätzlich um dieses Thema:
https://www.codeproject.com/Articles/5322557/CodeProject-AI-Server-AI-the-easy-wayFür HomeAssistent gibt es eine Anbindung. Für ioBroker habe ich nichts gefunden. Denke sollte aber möglich sein. Ich kämpfe aktuell damit wie ich den Service über JavaScript aufrufe. Was grundsätzlich sogar schon funktioniert. Weiß aber gerade noch nicht wie ich das Bild übergeben kann. Es müssten aber alles NPM Standardfunktionalitäten sein und nicht AI Server spezifisch.
@uwe72 sagte in http post request für CodeProject.AI calls:
Das ganze Thema rund um KI, d.h. um den AI Server ist sehr einfach. Ist mit docker in ein paar Minuten erstellt.
Vielen Dank, sehr interessant! Docker Image lädt schon, mal sehen wie weit ich mit meiner Hardware komme ...
-
@uwe72 sagte in http post request für CodeProject.AI calls:
Das ganze Thema rund um KI, d.h. um den AI Server ist sehr einfach. Ist mit docker in ein paar Minuten erstellt.
Vielen Dank, sehr interessant! Docker Image lädt schon, mal sehen wie weit ich mit meiner Hardware komme ...
@marc-berg Kommt auch stark auf die Bildgröße darauf an. Je nach Größe/Auflösung schwankt die Erkennungszeit bei mir zwischen 250ms und 5s.
-
@uwe72 sagte in http post request für CodeProject.AI calls:
Update: node-fetch funktioniert auch nicht
node-fetch funktioniert bei mir einwandfrei mit node-fetch@2 in der Javascript-Instanz unter „Zusätzliche NPM-Module“ eingetragen.
Das @2 ist wesentlich - siehe hierzu auch https://github.com/node-fetch/node-fetch#loading-and-configuring-the-module@ofri2607 Danke dir.
Habe es nun mal über den Weg probiert. Funktioniert noch nicht auf Anhieb. Irgendwas mache ich noch falsch.
unter /opt/iobroker/
npm install node-fetch@2?!
Dann in der JS-Instanz habe ich
node-fetch@2
als Module ergänzt.Dann im Script:
const fetch2 = require('node-fetch@2');?
Bringt den Fehler:
script.js.common.Automatisierungen.KI_node_fetch: Error: Cannot find module 'node-fetch@2' -
@ofri2607 Danke dir.
Habe es nun mal über den Weg probiert. Funktioniert noch nicht auf Anhieb. Irgendwas mache ich noch falsch.
unter /opt/iobroker/
npm install node-fetch@2?!
Dann in der JS-Instanz habe ich
node-fetch@2
als Module ergänzt.Dann im Script:
const fetch2 = require('node-fetch@2');?
Bringt den Fehler:
script.js.common.Automatisierungen.KI_node_fetch: Error: Cannot find module 'node-fetch@2' -
@marc-berg Kommt auch stark auf die Bildgröße darauf an. Je nach Größe/Auflösung schwankt die Erkennungszeit bei mir zwischen 250ms und 5s.
@uwe72 sagte in http post request für CodeProject.AI calls:
Kommt auch stark auf die Bildgröße darauf an. Je nach Größe/Auflösung schwankt die Erkennungszeit bei mir zwischen 250ms und 5s.
Ich finde das schon richtig cool. Eine halbe Sekunde für einen älteren i3 ist okay.

Jetzt fehlt mir nur noch ein Anwendungsfall. :-)
-
im Skript das @2 weglassen (das ist nur für den Installer, dass er die v2 installiert und nicht die v3), d.h.
const fetch2 = require('node-fetch'); -
@ofri2607 Funktioniert jetzt, danke!! Nun habe ich 2 Optionen. D.h. mit node-fetch oder axios
Hab nun diesen Zwischenstand. Der aber leider nicht funktioniert.
var fetch = require('node-fetch'); const FormData = require('form-data'); doDetection(); function doDetection() { request.get({url: "http://192.168.178.124/kennzeichen.png", encoding: null}, async function (err, response, body) { if (err) { throw err; } var formData = new FormData(); formData.append('image', body); const response2 = await fetch('http://192.168.178.124:32168/v1/vision/custom/licence-plates', {method: 'POST', body: formData}); const result = await response2.json(); log("Result: " + JSON.stringify(result)) }); }Fehlermeldung:
javascript.1 (25773) script.js.common.Automatisierungen.KI5_works_better: Result: {"success":false,"error":"Unable to create YOLO detector for model licence-plates","code":500,"command":"custom","moduleId":"ObjectDetectionYolo","executionProvider":"CPU","canUseGPU":false,"analysisRoundTripMs":28} -
Hab nun diesen Zwischenstand. Der aber leider nicht funktioniert.
var fetch = require('node-fetch'); const FormData = require('form-data'); doDetection(); function doDetection() { request.get({url: "http://192.168.178.124/kennzeichen.png", encoding: null}, async function (err, response, body) { if (err) { throw err; } var formData = new FormData(); formData.append('image', body); const response2 = await fetch('http://192.168.178.124:32168/v1/vision/custom/licence-plates', {method: 'POST', body: formData}); const result = await response2.json(); log("Result: " + JSON.stringify(result)) }); }Fehlermeldung:
javascript.1 (25773) script.js.common.Automatisierungen.KI5_works_better: Result: {"success":false,"error":"Unable to create YOLO detector for model licence-plates","code":500,"command":"custom","moduleId":"ObjectDetectionYolo","executionProvider":"CPU","canUseGPU":false,"analysisRoundTripMs":28} -
Hab nun diesen Zwischenstand. Der aber leider nicht funktioniert.
var fetch = require('node-fetch'); const FormData = require('form-data'); doDetection(); function doDetection() { request.get({url: "http://192.168.178.124/kennzeichen.png", encoding: null}, async function (err, response, body) { if (err) { throw err; } var formData = new FormData(); formData.append('image', body); const response2 = await fetch('http://192.168.178.124:32168/v1/vision/custom/licence-plates', {method: 'POST', body: formData}); const result = await response2.json(); log("Result: " + JSON.stringify(result)) }); }Fehlermeldung:
javascript.1 (25773) script.js.common.Automatisierungen.KI5_works_better: Result: {"success":false,"error":"Unable to create YOLO detector for model licence-plates","code":500,"command":"custom","moduleId":"ObjectDetectionYolo","executionProvider":"CPU","canUseGPU":false,"analysisRoundTripMs":28}@uwe72 sagte in http post request für CodeProject.AI calls:
Fehlermeldung:
Nach einigen Fehlversuchen beim korrekten Parametrieren des POST Requests habe ich es jetzt in NodeRed hinbekommen. Es gibt einen "Deepstack" Node, die die Anfrage offensichtlich korrekt formatiert:

Der Aufruf erfolgt mit
v1/vision/alpr -
@uwe72 sagte in http post request für CodeProject.AI calls:
Fehlermeldung:
Nach einigen Fehlversuchen beim korrekten Parametrieren des POST Requests habe ich es jetzt in NodeRed hinbekommen. Es gibt einen "Deepstack" Node, die die Anfrage offensichtlich korrekt formatiert:

Der Aufruf erfolgt mit
v1/vision/alpr@marc-berg ich schau mir dies heute abend an, wenn ich "zuhause" bin. Danke dafür! Kenne mich mit nodered nicht aus. Kannst du zeigen wie der post request nun bei dir konfiguriert ist oder alternativ fällt dir bei meinem request noch was auf? Vielen Dank und Gruß aus Brasilien
-
@marc-berg ich schau mir dies heute abend an, wenn ich "zuhause" bin. Danke dafür! Kenne mich mit nodered nicht aus. Kannst du zeigen wie der post request nun bei dir konfiguriert ist oder alternativ fällt dir bei meinem request noch was auf? Vielen Dank und Gruß aus Brasilien
@uwe72 sagte in http post request für CodeProject.AI calls:
fällt dir bei meinem request noch was auf?
Probiere es erstmal mit
/v1/image/alproder
/v1/vision/alprDann kommt mindestens mal eine andere Fehlermeldung, denn deine Meldung bekomme ich auch, wenn ich diese URL (...license-plates) benutze.
-
@uwe72 sagte in http post request für CodeProject.AI calls:
fällt dir bei meinem request noch was auf?
Probiere es erstmal mit
/v1/image/alproder
/v1/vision/alprDann kommt mindestens mal eine andere Fehlermeldung, denn deine Meldung bekomme ich auch, wenn ich diese URL (...license-plates) benutze.
@marc-berg Du hattest recht, es kommt eine andere Fehlermeldung ;-)
Das Bild existiert. Habe auch eine Version wo ich das Bild zuerst auf der Festplatte zwischenspeichere. Gleiches Verhalten.
Kann kein Unterschied mehr erkennen zu:
https://www.codeproject.com/AI/docs/api/api_reference.htmlhttp://192.168.178.124:32168/v1/image/alpr --> Funktioniert bei mir nicht.
Hast Du mir noch einen Tipp?
var fetch = require('node-fetch'); const FormData = require('form-data'); doDetection(); function doDetection() { request.get({url: "http://192.168.178.124/kennzeichen.png", encoding: null}, async function (err, response, body) { if (err) { throw err; } var formData = new FormData(); formData.append('upload', body); var url = 'http://192.168.178.124:32168/v1/vision/alpr'; const response2 = await fetch(url, {method: 'POST', body: formData}); const result = await response2.json(); log("Result: " + JSON.stringify(result)); }); }Neue Fehlermeldung:
javascript.1 (30020) script.js.common.Automatisierungen.KI5_works_better: Result: {"type":"https://tools.ietf.org/html/rfc7231#section-6.5.4","title":"Not Found","status":404,"traceId":"00-7635e33346ec49308c1960652c3a9519-6f9794d0678c038f-00"} -
@uwe72 sagte in http post request für CodeProject.AI calls:
fällt dir bei meinem request noch was auf?
Probiere es erstmal mit
/v1/image/alproder
/v1/vision/alprDann kommt mindestens mal eine andere Fehlermeldung, denn deine Meldung bekomme ich auch, wenn ich diese URL (...license-plates) benutze.
@marc-berg Darf ich fragen. welche AI-Server Version du verwendest? Über docker/docker-compose? Falls ja, welches tag? Danke&Grüße
-
@marc-berg Darf ich fragen. welche AI-Server Version du verwendest? Über docker/docker-compose? Falls ja, welches tag? Danke&Grüße
@uwe72 sagte in http post request für CodeProject.AI calls:
Falls ja, welches tag?
Ich habe einfach die aktuellste Version mit dem CPU Tag genommen, da ist das Image etwas kleiner. Ich kann mir aber nicht vorstellen, dass es daran liegt. Welche Module sind bei dir installiert?
codeproject: container_name: codeproject image: codeproject/ai-server:cpu-2.4.7 hostname: codeproject restart: unless-stopped networks: test: volumes: - /opt/docker/codeproject/data:/etc/codeproject/ai - /opt/docker/codeproject/modules:/app/modules - /etc/localtime:/etc/localtime:ro ports: - "32168:32168"EDIT: habe das mal im Javascript Adapter nachgestellt. Dieser Code läuft bei mir, musst du nur noch mit dem Abfragen des Bildes per http ergänzen:
let imageUrl = '/opt/iobroker/1600-1200-max.jpg'; let apiURL = 'http://nuc.fritz.box:32168/v1/vision/alpr'; var request = require('request'); var fs = require('fs'); var options = { method: 'POST', url: apiURL, headers: { 'Content-Type': 'multipart/form-data' }, formData: { image: fs.createReadStream(imageUrl) } }; request(options, function (error, response) { if (error) throw new Error(error); log("Result: "+response.body); });
