NEWS
Hilfe beim parsen / JSON / Landroid
-
Moin ihr Lieben,
vorweg, natürlich gibt es für den Robby einen funktionierenden Adapter. Der spuckt aber nicht alle verfügbaren Daten aus. Und außerdem siegt der Basteltrieb
Ich versuche mich schon den ganzen Tag an einem Script um alle Daten des Rasensklaven auszulesen.
Unter dem URL http://admin:XXXX@192.168.178.64/jsonDebug.cgi erhält man den folgenden Output:
! ````
{"landroid":{"state":"idle","boardTemperature":26.9,"distance":0,"wheelLeftDistance":0,"wheelRightDistance":0,"angle":0,"rainSensor":3888,"aree":{"index":0,"vet":[1,1,1,1,1,1,1,1,1,1]},"battery":{"percentage":91,"voltage":26.23,"temperature":24.5,"ntcResistance":10244},"batteryCharger":{"state":"idle","chargeCurrent":45.12},"accelerometer":{"gravity":[-0.016,0.017,1.023],"angle":[0.000000,0.000000,0.000000]},"gyroscope":{"angularSpeed":[-0.202,-0.166,-0.021],"angle":[-970.226562,-128.893326,6.766565]},"motor":[{"speed":0,"maxSpeed":51,"speedReduction":0,"rpm":0,"feedbackError":0,"acceleration":100,"deceleration":220,"fault":false},{"speed":0,"maxSpeed":51,"speedReduction":0,"rpm":0,"feedbackError":0,"acceleration":100,"deceleration":220,"fault":false},{"speed":0,"maxSpeed":92,"speedReduction":0,"rpm":0,"feedbackError":0,"acceleration":100,"deceleration":250,"fault":false}],"guide":{"straightSpeed":0,"turningSpeed":0,"measuredWheelDeltaDistance":0,"requiredWheelDeltaDistance":0,"deltaSpeedCorrection":0}},"id":{"stop1":false,"stop2":false,"lift1":false,"lift2":false,"trappedLeft":false,"trappedRight":false,"door1":true,"door2":true},"dipSw":{"sw1":false,"sw2":false,"sw3":false,"sw4":false},"wireSensor":{"fwVer":0.70,"left":"no wire","right":"no wire"}}Ich habe nun versucht mich an verschiedenen Scriptteilen aus dem Forum vorwärts zu hangeln, scheitere aber an mangelden Java-Script-Skills. Die zurückgelieferten Daten sind ja ein verschachteltes Gemisch aus Daten und Arrays. Mir geht es aber schon ab, aus den Daten einen bestimmten Datensatz herauszuziehen. Habt ihr Starthilfe? Das habe ich bereits. Schreibt den Body ins Log, sonst nix. >! ``` `var request = require('request'); >! Intervall = setInterval(SendRequest,5000); >! function SendRequest(){ >! var options = { url: 'http://admin:xxxx@192.168.178.64/jsonDebug.cgi' }; request(options,function (error, response, body){ if (!error){ CreateDevices(JSON.parse(body)); console.log(body); var test = JSON.parse(body); console.log(test); } else{ console.error(error);} }); >! }//End of Function SendRequest >! function CreateDevices(data){ if ("undefined" !== typeof data.id){ var Group_by='name'; //console.log(landroid.state); for (i = 0; i < data.id.length; i++) { for (var ObjName in data.id[i]) { if (!getObject('javascript.0.tests.Devices.'+data.id[i][Group_by].toString().replace(/\s+/g, '_')+'.'+ObjName)){ createState('javascript.0.tests.Devices.'+data.id[i][Group_by].toString().replace(/\s+/g, '_')+'.'+ObjName,data.id[i][ObjName],{type: typeof data.id[i][ObjName], role: ObjName}); console.log('ERSTELLT'); } else{setState('javascript.0.tests.Devices.'+data.id[i][Group_by].toString().replace(/\s+/g, '_')+'.'+ObjName,data.id[i][ObjName],akt=true)} } } } else{console.warn('id in JSON nicht gefunden ! ')} >! }//End of Function CreateDevices` >! Gruß und Danke! >! Matze[/i][/i][/i][/i][/i][/i][/i] ```
-
Hallo,
was du da zurück bekommst ist ein Objekt mit Objekten als Inhalt. Kein Array!
Aber es steht ein Array im Objekt drin.. Und zwar z.B. hier:
"aree":{"index":0,"vet":[1,1,1,1,1,1,1,1,1,1]},
[1,1,1,1….] ist ein Array. ;)````
var objectdp = getState("landroid.0.datenpunkt").val;
log(objectdp.landroid.state);(Weiß nicht genau wie die Landroid Datenpunkte aussehen, deswegen nur die von dir geforderte Starthilfe..) ;) Objects sind immer nach dem Schema "name":"wert" aufgebaut. So kann man sich da immer weiter durch hangeln. :) Hier ein Anhaltspunkt wie ich Objekte immer Aufteile um diese besser lesen zu können. Nach jedem }, welcher einem eindeutigen Namen zugehört mache ich zwei Zeilenumbrüche, wenn das Objekt ein Array beinhaltet mache ich nur einen Zeilenumbruch.
{
"landroid":{"state":"idle","boardTemperature":26.9,"distance":0,"wheelLeftDistance":0,"wheelRightDistance":0,"angle":0,"rainSensor":3888,"aree":{"index":0,"vet":[1,1,1,1,1,1,1,1,1,1]},"battery":{"percentage":91,"voltage":26.23,"temperature":24.5,"ntcResistance":10244},
"batteryCharger":{"state":"idle","chargeCurrent":45.12},
"accelerometer":{"gravity":[-0.016,0.017,1.023],"angle":[0.000000,0.000000,0.000000]},
"gyroscope":{"angularSpeed":[-0.202,-0.166,-0.021],"angle":[-970.226562,-128.893326,6.766565]},
"motor":[{"speed":0,"maxSpeed":51,"speedReduction":0,"rpm":0,"feedbackError":0,"acceleration":100,"deceleration":220,"fault":false},
{"speed":0,"maxSpeed":51,"speedReduction":0,"rpm":0,"feedbackError":0,"acceleration":100,"deceleration":220,"fault":false},
{"speed":0,"maxSpeed":92,"speedReduction":0,"rpm":0,"feedbackError":0,"acceleration":100,"deceleration":250,"fault":false}],"guide":{"straightSpeed":0,"turningSpeed":0,"measuredWheelDeltaDistance":0,"requiredWheelDeltaDistance":0,"deltaSpeedCorrection":0}},
"id":{"stop1":false,"stop2":false,"lift1":false,"lift2":false,"trappedLeft":false,"trappedRight":false,"door1":true,"door2":true},
"dipSw":{"sw1":false,"sw2":false,"sw3":false,"sw4":false},
"wireSensor":{"fwVer":0.70,"left":"no wire","right":"no wire"}
}Du siehst also, es gibt die "Haupt-Unterobjekte" "landroid", "battery", "batteryCharger", "accelerometer", "gyroscope", "motor", "guide", "id", "dipSw", "wireSensor".. Und da drunter dann noch Objekte.. datenpunkt.battery.percentage = 91.. datenpunkt.guide.straightSpeed = 0… etc. etc.. Gruß
-
Moin,
danke für deine Antwort. Ich habe hier ja aber noch gar keine Datenpunkte? Oder nennt sich das im JSON-Format auch so?
Ich würde den Output gerne zerlegen und in Datenpunkte einfügen.
Matze
-
Dann musst du den Inhalt den http://admin:XXXX@192.168.178.64/jsonDebug.cgi ausgibt in eine Variable in deinem Script laden..
Danach im Script weiter verarbeiten und alle Daten die du brauchst in ioBroker-Datenpunkte schreiben lassen.
P.s.: Eventuell bringt dich der Parser Adapter aber hier auch weiter.. Habe diesen jedoch selber nicht im Einsatz, deswegen kann ich dir zu den Funktionen des Adapters nichts sagen.. :oops:
Gruß
-
Hi,
soweit war ich ja auch schon. Schau dir mal den Anfang an. Ich scheitere daran, einen Teilinhalt im Log auszugeben. Im Log tauch nur der komplette Body auf. Soweit richtig.
Und dann: javascript.1 script.js.Funktionen.Skript2: [object Object]
Entweder funktioniert hier JSON.parse nicht richtig oder ich schaffe es nicht, den Teilbereich anzusprechen.
var request = require('request'); Intervall = setInterval(SendRequest,5000); function SendRequest(){ var options = { url: 'http://admin:xxxx@192.168.178.64/jsonDebug.cgi' }; request(options,function (error, response, body){ if (!error){ CreateDevices(JSON.parse(body)); console.log(body); var test = JSON.parse(body); console.warn(test.id); } else{ console.error(error);} }); }//End of Function SendRequest
Gruß und danke
Matze
EDIT: Au man. Es muss natürlich console.warn(test.id.stop1); lauten. Mal schauen, ob ich so weiter komme.
javascript.1 script.js.Funktionen.Skript2: false
-
Ich hab jetzt noch nicht alles drin, aber so sieht es aus und funktioniert. Ist natürlich sehr hemdsärmelig. Schöner wäre es, den Inhalt des JSON auch zum anlegen und aktualisieren der DP zu nutzen ( über Schleifen ).
Dafür bräuchte ich von den Pro's tatsächlich noch mal Hilfe.
! ````
//Datenpunkte ezeugen
! createState('worxx.landroid_state', {name: 'Roboter Status', desc: 'Roboter Status', type: 'string', unit: '', role: 'state'});
createState('worxx.landroid_boardTemperature', {name: 'Temperatur Mainboard', desc: 'Temperatur Mainboard', type: 'number', unit: '°C', role: 'value'});
createState('worxx.landroid_distance', {name: 'Wegstrecke', desc: 'Wegstrecke', type: 'number', unit: 'm', role: 'value'});
createState('worxx.landroid_wheelLeftDistance', {name: 'Wegstrecke Rad Links', desc: 'Wegstrecke Rad Links', type: 'number', unit: 'm', role: 'value'});
createState('worxx.landroid_wheelRightDistance', {name: 'Wegstrecke Rad Rechts', desc: 'Wegstrecke Rad Rechts', type: 'number', unit: 'm', role: 'value'});
createState('worxx.landroid_angle', {name: 'Winkel', desc: 'Winkel', type: 'number', unit: '°', role: 'value'});
createState('worxx.landroid_rainSensor', {name: 'Regensensor', desc: 'Regensensor', type: 'number', unit: '', role: 'value'});
createState('worxx.battery_percentage', {name: 'Batterielevel', desc: 'Batterielevel', type: 'number', unit: '%', role: 'value'});
createState('worxx.battery_voltage', {name: 'Batteriespannung', desc: 'Batteriespannung', type: 'number', unit: 'V', role: 'value'});
createState('worxx.battery_temperature', {name: 'Batterietemperatur', desc: 'Batterietemperatur', type: 'number', unit: '°C', role: 'value'});
createState('worxx.battery_ntcResistance', {name: 'Widerstandswert NTC', desc: 'Widerstandswert NTC', type: 'number', unit: 'Ohm', role: 'value'});
createState('worxx.batterycharger_state', {name: 'Ladegerät Status', desc: 'Ladegerät Status', type: 'string', unit: '', role: 'value'});
createState('worxx.batterycharger_chargeCurrent', {name: 'Ladegerät Ladestrom', desc: 'Ladegerät Ladestrom', type: 'number', unit: 'mA', role: 'value'});
! createState('worxx.motor1_Speed', {name: 'Geschwindigket Motor1', desc: 'Geschwindigket Motor1', type: 'number', unit: '', role: 'value'});
createState('worxx.motor1_maxSpeed', {name: 'max Geschwindigket Motor1', desc: 'max Geschwindigket Motor1', type: 'number', unit: '', role: 'value'});
createState('worxx.motor1_SpeedReduction', {name: 'Reduzierung Motor1', desc: 'Reduzierung Motor1', type: 'number', unit: '', role: 'value'});
createState('worxx.motor1_rpm', {name: 'RPM Motor1', desc: 'RPM Motor1', type: 'number', unit: 'U/Min', role: 'value'});
createState('worxx.motor1_feedbackError', {name: 'Feedbackerror Motor1', desc: 'Feedbackerror Motor1', type: 'number', unit: '', role: 'value'});
createState('worxx.motor1_acceleration', {name: 'Beschleunigung Motor1', desc: 'Beschleunigung Motor1', type: 'number', unit: '', role: 'value'});
createState('worxx.motor1_deceleration', {name: 'Verzögerung Motor1', desc: 'Verzögerung Motor1', type: 'number', unit: '', role: 'value'});
createState('worxx.motor1_fault', {name: 'Fehler Motor1', desc: 'Fehler Motor1', type: 'boolean', unit: '', role: 'value'});
! createState('worxx.motor2_Speed', {name: 'Geschwindigket Motor2', desc: 'Geschwindigket Motor2', type: 'number', unit: '', role: 'value'});
createState('worxx.motor2_maxSpeed', {name: 'max Geschwindigket Motor2', desc: 'max Geschwindigket Motor2', type: 'number', unit: '', role: 'value'});
createState('worxx.motor2_SpeedReduction', {name: 'Reduzierung Motor2', desc: 'Reduzierung Motor2', type: 'number', unit: '', role: 'value'});
createState('worxx.motor2_rpm', {name: 'RPM Motor2', desc: 'RPM Motor2', type: 'number', unit: 'U/Min', role: 'value'});
createState('worxx.motor2_feedbackError', {name: 'Feedbackerror Motor2', desc: 'Feedbackerror Motor2', type: 'number', unit: '', role: 'value'});
createState('worxx.motor2_acceleration', {name: 'Beschleunigung Motor2', desc: 'Beschleunigung Motor2', type: 'number', unit: '', role: 'value'});
createState('worxx.motor2_deceleration', {name: 'Verzögerung Motor2', desc: 'Verzögerung Motor2', type: 'number', unit: '', role: 'value'});
createState('worxx.motor2_fault', {name: 'Fehler Motor2', desc: 'Fehler Motor2', type: 'boolean', unit: '', role: 'value'});
! createState('worxx.motor3_Speed', {name: 'Geschwindigket Motor3', desc: 'Geschwindigket Motor3', type: 'number', unit: '', role: 'value'});
createState('worxx.motor3_maxSpeed', {name: 'max Geschwindigket Motor3', desc: 'max Geschwindigket Motor3', type: 'number', unit: '', role: 'value'});
createState('worxx.motor3_SpeedReduction', {name: 'Reduzierung Motor3', desc: 'Reduzierung Motor3', type: 'number', unit: '', role: 'value'});
createState('worxx.motor3_rpm', {name: 'RPM Motor3', desc: 'RPM Motor3', type: 'number', unit: 'U/Min', role: 'value'});
createState('worxx.motor3_feedbackError', {name: 'Feedbackerror Motor3', desc: 'Feedbackerror Motor3', type: 'number', unit: '', role: 'value'});
createState('worxx.motor3_acceleration', {name: 'Beschleunigung Motor3', desc: 'Beschleunigung Motor3', type: 'number', unit: '', role: 'value'});
createState('worxx.motor3_deceleration', {name: 'Verzögerung Motor3', desc: 'Verzögerung Motor3', type: 'number', unit: '', role: 'value'});
createState('worxx.motor3_fault', {name: 'Fehler Motor3', desc: 'Fehler Motor3', type: 'boolean', unit: '', role: 'value'});
! const landroid_state = 'worxx.landroid_state';
const landroid_boardTemperature = 'worxx.landroid_boardTemperature';
const landroid_distance = 'worxx.landroid_distance';
const landroid_wheelLeftDistance = 'worxx.landroid_wheelLeftDistance';
const landroid_wheelRightDistance = 'worxx.landroid_wheelRightDistance';
const landroid_angle = 'worxx.landroid_angle';
const landroid_rainSensor = 'worxx.landroid_rainSensor';
const battery_percentage = 'worxx.battery_percentage';
const battery_voltage = 'worxx.battery_voltage';
const battery_temperature = 'worxx.battery_temperature';
const battery_ntcResistance = 'worxx.battery_ntcResistance';
const batterycharger_state = 'worxx.batterycharger_state';
const batterycharger_chargeCurrent = 'worxx.batterycharger_chargeCurrent';
! const motor1_Speed = 'worxx.motor1_Speed';
const motor1_maxSpeed = 'worxx.motor1_maxSpeed';
const motor1_SpeedReduction = 'worxx.motor1_SpeedReduction';
const motor1_rpm = 'worxx.motor1_rpm';
const motor1_feedbackError = 'worxx.motor1_feedbackError';
const motor1_acceleration = 'worxx.motor1_acceleration';
const motor1_deceleration = 'worxx.motor1_deceleration';
const motor1_fault = 'worxx.motor1_fault';
! const motor2_Speed = 'worxx.motor2_Speed';
const motor2_maxSpeed = 'worxx.motor2_maxSpeed';
const motor2_SpeedReduction = 'worxx.motor2_SpeedReduction';
const motor2_rpm = 'worxx.motor2_rpm';
const motor2_feedbackError = 'worxx.motor2_feedbackError';
const motor2_acceleration = 'worxx.motor2_acceleration';
const motor2_deceleration = 'worxx.motor2_deceleration';
const motor2_fault = 'worxx.motor2_fault';
! const motor3_Speed = 'worxx.motor3_Speed';
const motor3_maxSpeed = 'worxx.motor3_maxSpeed';
const motor3_SpeedReduction = 'worxx.motor3_SpeedReduction';
const motor3_rpm = 'worxx.motor3_rpm';
const motor3_feedbackError = 'worxx.motor3_feedbackError';
const motor3_acceleration = 'worxx.motor3_acceleration';
const motor3_deceleration = 'worxx.motor3_deceleration';
const motor3_fault = 'worxx.motor3_fault';
! //Funktion aufrufen
! var request = require('request');
! Intervall = setInterval(SendRequest,10000);
! function SendRequest(){
! var options = {
url: 'http://admin:xxxx@192.168.178.64/jsonDebug.cgi'
};request(options,function (error, response, body){ if (!error){ //console.log(body); var data = JSON.parse(body); var arr_motor = data.landroid.motor; var arr_accell_gravity = data.landroid.accelerometer.gravity; var arr_accell_angle = data.landroid.accelerometer.angle; var arr_gyro_angularSpeed = data.landroid.gyroscope.angularSpeed; var arr_gyro_angle = data.landroid.gyroscope.angle; //console.warn(arr_gravity[0]); //console.warn(data.landroid.accelerometer.gravity);
//Datenpunkte setzen
! setState(landroid_state,(data.landroid.state));
setState(landroid_boardTemperature,(data.landroid.boardTemperature));
setState(landroid_distance,(data.landroid.distance));
setState(landroid_wheelLeftDistance,(data.landroid.wheelLeftDistance));
setState(landroid_wheelRightDistance,(data.landroid.wheelRightDistance));
setState(landroid_angle,(data.landroid.angle));
setState(landroid_rainSensor,(data.landroid.rainSensor));
setState(battery_percentage,(data.landroid.battery.percentage));
setState(battery_voltage,(data.landroid.battery.voltage));
setState(battery_temperature,(data.landroid.battery.temperature));
setState(battery_ntcResistance,(data.landroid.battery.ntcResistance));
setState(batterycharger_state,(data.landroid.batteryCharger.state));
setState(batterycharger_chargeCurrent,(data.landroid.batteryCharger.chargeCurrent));setState(motor1_Speed,(arr_motor[0].speed)); setState(motor1_maxSpeed,(arr_motor[0].maxSpeed)); setState(motor1_SpeedReduction,(arr_motor[0].speedReduction)); setState(motor1_rpm,(arr_motor[0].rpm)); setState(motor1_feedbackError,(arr_motor[0].feedbackError)); setState(motor1_acceleration,(arr_motor[0].acceleration)); setState(motor1_deceleration,(arr_motor[0].deceleration)); setState(motor1_fault,(arr_motor[0].fault)); setState(motor2_Speed,(arr_motor[1].speed)); setState(motor2_maxSpeed,(arr_motor[1].maxSpeed)); setState(motor2_SpeedReduction,(arr_motor[1].speedReduction)); setState(motor2_rpm,(arr_motor[1].rpm)); setState(motor2_feedbackError,(arr_motor[1].feedbackError)); setState(motor2_acceleration,(arr_motor[1].acceleration)); setState(motor2_deceleration,(arr_motor[1].deceleration)); setState(motor2_fault,(arr_motor[1].fault)); setState(motor3_Speed,(arr_motor[2].speed)); setState(motor3_maxSpeed,(arr_motor[2].maxSpeed)); setState(motor3_SpeedReduction,(arr_motor[2].speedReduction)); setState(motor3_rpm,(arr_motor[2].rpm)); setState(motor3_feedbackError,(arr_motor[2].feedbackError)); setState(motor3_acceleration,(arr_motor[2].acceleration)); setState(motor3_deceleration,(arr_motor[2].deceleration)); setState(motor3_fault,(arr_motor[2].fault)); } else{ console.error(error);} });
! }//Ende
! ````
Gruß
Matze