NodeRed change JSON object

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • FlyingDutchMen
  • Registratie: Februari 2010
  • Laatst online: 30-06 17:39
Mijn vraag
Ik heb een DSMR logger aan mijn smart meter hangen die elke 10 seconde mijn data uit kan lezen. Nu wil ik deze data graag naar een docker genaamd 'DSMR reader' sturen. Echter is deze data niet 100% identiek, en wil ik NodeRed gebruiken om de data te converten en de versturen.

Mijn idee is om een functie te schrijven die dit aanpast. Helaas krijg ik een "SyntaxError: Unexpected token o in JSON at position 1" melding terug vanuit NodeRed. Ik zie niet echt meer wat ik fout doe 8)7 , hopelijk ziet iemand anders hem wel?

De code in de functie ziet er als volgt uit.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
inputobj = JSON.parse(msg.payload);
outputobj = JSON.parse({"timestamp":"2019-08-24T14:15:22Z","electricity_delivered_1":"string","electricity_returned_1":"string","electricity_delivered_2":"string","electricity_returned_2":"string","electricity_currently_delivered":"string","electricity_currently_returned":"string","phase_currently_delivered_l1":"string","phase_currently_delivered_l2":"string","phase_currently_delivered_l3":"string","extra_device_timestamp":"2019-08-24T14:15:22Z","extra_device_delivered":"string","phase_currently_returned_l1":"string","phase_currently_returned_l2":"string","phase_currently_returned_l3":"string","phase_voltage_l1":"string","phase_voltage_l2":"string","phase_voltage_l3":"string","phase_power_current_l1":0,"phase_power_current_l2":0,"phase_power_current_l3":0});

outputobj.timestamp = "20" + inputobj.Timestamp[0] + inputobj.Timestamp[1] + "-" + inputobj.Timestamp[2] + inputobj.Timestamp[3] + "-" + inputobj.Timestamp[4] + inputobj.Timestamp[5] + "T" + inputobj.Timestamp[6] + inputobj.Timestamp[7] + ":" + inputobj.Timestamp[8] + inputobj.Timestamp[9] + ":" + inputobj.Timestamp[10] + inputobj.Timestamp[11] +"Z";
outputobj.electricity_delivered_1 = inputobj.Energy_Delivered_Tariff1;
outputobj.electricity_returned_1 = inputobj.Energy_Returned_Tariff1;
outputobj.electricity_delivered_2 = inputobj.Energy_Delivered_Tariff2;
outputobj.electricity_returned_2 = inputobj.Energy_Returned_Tariff2;
outputobj.electricity_currently_delivered = inputobj.Energy_Delivered;
outputobj.electricity_currently_returned = inputobj.Energy_Returned;
outputobj.phase_currently_delivered_l1 = inputobj.Power_Delivered_l1;
outputobj.phase_currently_delivered_l2 = inputobj.Power_Delivered_l2;
outputobj.phase_currently_delivered_l3 = inputobj.Power_Delivered_l3;
outputobj.phase_currently_returned_l1 = inputobj.Power_Delivered_l1;
outputobj.phase_currently_returned_l2 = inputobj.Power_Delivered_l2;
outputobj.phase_currently_returned_l3 = inputobj.Power_Delivered_l3;
outputobj.phase_voltage_l1 = inputobj.Voltage_l1;
outputobj.phase_voltage_l2 = inputobj.Voltage_l2;
outputobj.phase_voltage_l3 = inputobj.Voltage_l3;
outputobj.phase_power_current_l1 = inputobj.Current_l1;
outputobj.phase_power_current_l2 = inputobj.Current_l2;
outputobj.phase_power_current_l3 = inputobj.Current_l3;
outputobj.extra_device_timestamp = outputobj.timestamp;
outputobj.extra_device_delivered = inputobj.Gas_Delivered;

msg = outputobj;


Het bericht dat binnenkomt ziet er als volgt uit:

code:
1
{"Timestamp":"201018121201S","Energy_Delivered":"2186.424","Energy_Returned":"0.000","Gas_Delivered":"534.61","Energy_Delivered_Tariff1":"909.531","Energy_Delivered_Tariff2":"1276.893","Energy_Returned_Tariff1":"0.000","Energy_Returned_Tariff2":"0.000","Power_Delivered":"0.300","Power_Returned":"0.000","Voltage_l1":"228.8","Current_l1":"1","Voltage_l2":"0.0","Current_l2":"0","Voltage_l3":"0.0","Current_l3":"0","Power_Delivered_l1":"293","Power_Returned_l1":"0","Power_Delivered_l2":"0","Power_Returned_l2":"0","Power_Delivered_l3":"0","Power_Returned_l3":"0"}


Relevante software en hardware die ik gebruik
DSMR logger https://mrwheel.github.io/DSMRloggerWS/hardware_V3/
DSMR Reader https://github.com/xirixiz/dsmr-reader-docker
NodeRed (docker) als 'converter'

Wat ik al gevonden of geprobeerd heb
Validators welke aangeven dat het correct is.
w3schools.com, deze kan het het als javascript runnen en omzetten.

Learn from yesterday, Live for today, Hope for tomorrow

Beste antwoord (via FlyingDutchMen op 18-10-2020 13:05)


  • Mijzelf
  • Registratie: September 2004
  • Niet online
De input van JSON.parse() op regel 2 is geen string, maar een object. Die kun je dus niet parsen.

Dat moet òf
code:
1
outputobj = JSON.parse(JSON.stringify( {"timestamp": ...

zijn, wat nogal suf is, òf
code:
1
outputobj = {"timestamp": ...

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
De input van JSON.parse() op regel 2 is geen string, maar een object. Die kun je dus niet parsen.

Dat moet òf
code:
1
outputobj = JSON.parse(JSON.stringify( {"timestamp": ...

zijn, wat nogal suf is, òf
code:
1
outputobj = {"timestamp": ...

Acties:
  • 0 Henk 'm!

  • FlyingDutchMen
  • Registratie: Februari 2010
  • Laatst online: 30-06 17:39
Mijzelf schreef op zondag 18 oktober 2020 @ 12:52:
De input van JSON.parse() op regel 2 is geen string, maar een object. Die kun je dus niet parsen.

Dat moet òf
code:
1
outputobj = JSON.parse(JSON.stringify( {"timestamp": ...

zijn, wat nogal suf is, òf
code:
1
outputobj = {"timestamp": ...
Beide geven nog steeds dezelfde fout. Ook met single quotes erbij gaat dit fout.

code:
1
outputobj = outputobj = '{"timestamp": ...

Learn from yesterday, Live for today, Hope for tomorrow


Acties:
  • 0 Henk 'm!

  • FlyingDutchMen
  • Registratie: Februari 2010
  • Laatst online: 30-06 17:39
Tjah blijkbaar heb ik nog niet genoeg koffie op vandaag :X
code:
1
JSON.parse(msg.payload);

had niet geparsed moeten worden. Ook had ik deze natuurlijk nog even in de payload moet zetten als return. Het werkt nu wel :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
inputobj = msg.payload;
outputobj = {"timestamp":"2019-08-24T14:15:22Z","electricity_delivered_1":"string","electricity_returned_1":"string","electricity_delivered_2":"string","electricity_returned_2":"string","electricity_currently_delivered":"string","electricity_currently_returned":"string","phase_currently_delivered_l1":"string","phase_currently_delivered_l2":"string","phase_currently_delivered_l3":"string","extra_device_timestamp":"2019-08-24T14:15:22Z","extra_device_delivered":"string","phase_currently_returned_l1":"string","phase_currently_returned_l2":"string","phase_currently_returned_l3":"string","phase_voltage_l1":"string","phase_voltage_l2":"string","phase_voltage_l3":"string","phase_power_current_l1":0,"phase_power_current_l2":0,"phase_power_current_l3":0};

outputobj.timestamp = "20" + inputobj.Timestamp[0] + inputobj.Timestamp[1] + "-" + inputobj.Timestamp[2] + inputobj.Timestamp[3] + "-" + inputobj.Timestamp[4] + inputobj.Timestamp[5] + "T" + inputobj.Timestamp[6] + inputobj.Timestamp[7] + ":" + inputobj.Timestamp[8] + inputobj.Timestamp[9] + ":" + inputobj.Timestamp[10] + inputobj.Timestamp[11] +"Z";
outputobj.electricity_delivered_1 = inputobj.Energy_Delivered_Tariff1;
outputobj.electricity_returned_1 = inputobj.Energy_Returned_Tariff1;
outputobj.electricity_delivered_2 = inputobj.Energy_Delivered_Tariff2;
outputobj.electricity_returned_2 = inputobj.Energy_Returned_Tariff2;
outputobj.electricity_currently_delivered = inputobj.Energy_Delivered;
outputobj.electricity_currently_returned = inputobj.Energy_Returned;
outputobj.phase_currently_delivered_l1 = inputobj.Power_Delivered_l1;
outputobj.phase_currently_delivered_l2 = inputobj.Power_Delivered_l2;
outputobj.phase_currently_delivered_l3 = inputobj.Power_Delivered_l3;
outputobj.phase_currently_returned_l1 = inputobj.Power_Delivered_l1;
outputobj.phase_currently_returned_l2 = inputobj.Power_Delivered_l2;
outputobj.phase_currently_returned_l3 = inputobj.Power_Delivered_l3;
outputobj.phase_voltage_l1 = inputobj.Voltage_l1;
outputobj.phase_voltage_l2 = inputobj.Voltage_l2;
outputobj.phase_voltage_l3 = inputobj.Voltage_l3;
outputobj.phase_power_current_l1 = inputobj.Current_l1;
outputobj.phase_power_current_l2 = inputobj.Current_l2;
outputobj.phase_power_current_l3 = inputobj.Current_l3;
outputobj.extra_device_timestamp = outputobj.timestamp;
outputobj.extra_device_delivered = inputobj.Gas_Delivered;

msg.payload = outputobj;
return msg

Learn from yesterday, Live for today, Hope for tomorrow