Error executing the transformation 'JSONPATH': An error occured while transforming JSON expression

I am working to migrate to OH2, and can’t seem to get JSONPATH to work right. My Rule is:

rule "Outback JSON parsing"
when
        Item Outback_Dev_status changed
then
      logInfo("Testing", "JSON - Locking")
      lock.lock()
      try { 
        var String json = Outback_Dev_status.state.toString
        var Number battery_soc = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].SOC", json))
        var Number battery_voltage = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].Batt_V", json))
        var String battery_temp_string = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].Batt_temp", json))
        var Number battery_temp = new Integer(battery_temp_string.split(" ").get(0))
        var Number shunt_a_amps = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].Shunt_A_I", json))
        var Number shunt_b_amps = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].Shunt_B_I", json))
        var Number shunt_total_amps = shunt_a_amps + shunt_b_amps
        var Number today_in_kwh = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].In_kWh_today", json))
        var Number today_out_kwh = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)][0].Out_kWh_today", json))
        var Number charge_a_amps = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==5)][0].Out_I", json))
        var Number charge_b_amps = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==6)][0].Out_I", json))
        var Number charge_c_amps = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==7)][0].Out_I", json))
        var Number charge_d_amps = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==8)][0].Out_I", json))
        var Number charge_a_kwh = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==5)][0].Out_kWh", json))
        var Number charge_b_kwh = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==6)][0].Out_kWh", json))
        var Number charge_c_kwh = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==7)][0].Out_kWh", json))
        var Number charge_d_kwh = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==8)][0].Out_kWh", json))
        var Number charge_a_watts = charge_a_amps * battery_voltage
        var Number charge_b_watts = charge_b_amps * battery_voltage
        var Number charge_c_watts = charge_c_amps * battery_voltage
        var Number charge_d_watts = charge_d_amps * battery_voltage
        var Number total_watts = charge_a_watts + charge_b_watts + charge_c_watts + charge_d_watts
        var Number today_solar_kwh = charge_a_kwh + charge_b_kwh + charge_c_kwh + charge_d_kwh
        
        postUpdate(Battery_Charge, battery_soc)
        postUpdate(Battery_Voltage, battery_voltage)
        postUpdate(Battery_Temp, battery_temp * 1.8 + 32)
        postUpdate(Solar_Charge_A_Watts, charge_a_watts)
        postUpdate(Solar_Charge_B_Watts, charge_b_watts)
        postUpdate(Solar_Charge_C_Watts, charge_c_watts)
        postUpdate(Solar_Charge_D_Watts, charge_d_watts)
        postUpdate(Solar_Total_Watts, total_watts)
        postUpdate(Shunt_A_Amps, shunt_a_amps)
        postUpdate(Shunt_B_Amps, shunt_b_amps)
        postUpdate(Shunt_Total_Amps, shunt_total_amps)
        postUpdate(Today_In_kWh, today_in_kwh)
        postUpdate(Today_Out_kWh, today_out_kwh)
        postUpdate(Today_Solar_kWh, today_solar_kwh)
        
        // Low Battery voltage generator start
        if (battery_voltage <= 43) {
          sendCommand(Battery_Low, ON)
          if (Generator_Auto.state == OFF && Generator_Failed.state == OFF) {
            sendMail("8323303810@mms.att.net", "Battery", "Battery voltage at " + battery_voltage + " volts!!!," + " load at " +  Inverter_Total_Watts.state + " watts")
              sendCommand(Generator_Auto, ON)
              Thread::sleep(45000) // Let Generator spool up
          }
        }
        
        var Number a_l1_voltage = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].VAC_out_L1", json))
        var Number a_l1_buy_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].Buy_I_L1", json))
        var Number a_l1_sell_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].Sell_I_L1", json))
        var Number a_l1_inv_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].Inv_I_L1", json))
        var Number a_l2_voltage = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].VAC_out_L2", json))
        var Number a_l2_buy_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].Buy_I_L2", json))
        var Number a_l2_sell_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].Sell_I_L2", json))
        var Number a_l2_inv_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].Inv_I_L2", json))
        var String a_ac_mode = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].AC_mode", json))
        var String a_inverter_mode = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)][0].INV_mode", json))
        var Number a_l1_buy_watts = a_l1_voltage * a_l1_buy_amps
        var Number a_l2_buy_watts = a_l1_voltage * a_l2_buy_amps
        var Number buy_a_watts = a_l1_buy_watts + a_l2_buy_watts
        var Number a_l1_sell_watts = a_l1_voltage * a_l1_sell_amps
        var Number a_l2_sell_watts = a_l1_voltage * a_l2_sell_amps
        var Number sell_a_watts = a_l1_sell_watts + a_l2_sell_watts
        var Number a_l1_watts = a_l1_voltage * a_l1_inv_amps
        var Number a_l2_watts = a_l2_voltage * a_l2_inv_amps
        var Number inverter_a_watts = a_l1_watts + a_l2_watts
        
        postUpdate(Buy_A_Watts, buy_a_watts)
        postUpdate(Sell_A_Watts, sell_a_watts)
        postUpdate(Inverter_A_Watts, inverter_a_watts)
        postUpdate(AC_Mode_A, a_ac_mode)
        postUpdate(Inverter_Mode_A, a_inverter_mode)
        
        var Number b_l1_voltage = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].VAC_out_L1", json))
        var Number b_l1_buy_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].Buy_I_L1", json))
        var Number b_l1_sell_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].Sell_I_L1", json))
        var Number b_l1_inv_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].Inv_I_L1", json))
        var Number b_l2_voltage = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].VAC_out_L2", json))
        var Number b_l2_buy_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].Buy_I_L2", json))
        var Number b_l2_sell_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].Sell_I_L2", json))
        var Number b_l2_inv_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].Inv_I_L2", json))
        var String b_ac_mode = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].AC_mode", json))
        var String b_inverter_mode = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==2)][0].INV_mode", json))
        var Number b_l1_buy_watts = b_l1_voltage * b_l1_buy_amps
        var Number b_l2_buy_watts = b_l1_voltage * b_l2_buy_amps
        var Number buy_b_watts = b_l1_buy_watts + b_l2_buy_watts
        var Number b_l1_sell_watts = b_l1_voltage * b_l1_sell_amps
        var Number b_l2_sell_watts = b_l1_voltage * b_l2_sell_amps
        var Number sell_b_watts = b_l1_sell_watts + b_l2_sell_watts
        var Number b_l1_watts = b_l1_voltage * b_l1_inv_amps
        var Number b_l2_watts = b_l2_voltage * b_l2_inv_amps
        var Number inverter_b_watts = b_l1_watts + b_l2_watts
        
        postUpdate(Buy_B_Watts, buy_b_watts)
        postUpdate(Sell_B_Watts, sell_b_watts)
        postUpdate(Inverter_B_Watts, inverter_b_watts)
        postUpdate(AC_Mode_B, b_ac_mode)
        postUpdate(Inverter_Mode_B, b_inverter_mode)
        
        var Number c_l1_voltage = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].VAC_out_L1", json))
        var Number c_l1_buy_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].Buy_I_L1", json))
        var Number c_l1_sell_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].Sell_I_L1", json))
        var Number c_l1_inv_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].Inv_I_L1", json))
        var Number c_l2_voltage = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].VAC_out_L2", json))
        var Number c_l2_buy_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].Buy_I_L2", json))
        var Number c_l2_sell_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].Sell_I_L2", json))
        var Number c_l2_inv_amps = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].Inv_I_L2", json))
        var String c_ac_mode = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].AC_mode", json))
        var String c_inverter_mode = new String(transform("JSONPATH", "$.devstatus.ports[?(@.Port==3)][0].INV_mode", json))
        var Number c_l1_buy_watts = c_l1_voltage * c_l1_buy_amps
        var Number c_l2_buy_watts = c_l1_voltage * c_l2_buy_amps
        var Number buy_c_watts = c_l1_buy_watts + c_l2_buy_watts
        var Number c_l1_sell_watts = c_l1_voltage * c_l1_sell_amps
        var Number c_l2_sell_watts = c_l1_voltage * c_l2_sell_amps
        var Number sell_c_watts = c_l1_sell_watts + c_l2_sell_watts
        var Number c_l1_watts = c_l1_voltage * c_l1_inv_amps
        var Number c_l2_watts = c_l2_voltage * c_l2_inv_amps
        var Number inverter_c_watts = c_l1_watts + c_l2_watts
        
        postUpdate(Buy_C_Watts, buy_c_watts)
        postUpdate(Sell_C_Watts, sell_c_watts)
        postUpdate(Inverter_C_Watts, inverter_c_watts)
        postUpdate(AC_Mode_C, c_ac_mode)
        postUpdate(Inverter_Mode_C, c_inverter_mode)
        
        var Number buy_total = buy_a_watts + buy_b_watts + buy_c_watts
        postUpdate(Buy_Total_Watts, buy_total) 
        var Number sell_total = sell_a_watts + sell_b_watts + sell_c_watts
        postUpdate(Sell_Total_Watts, sell_total)
        var Number inverter_total = inverter_a_watts + inverter_b_watts + inverter_c_watts
        postUpdate(Inverter_Total_Watts, inverter_total)
        
        // LIFX Power Monitor
        var solar_color = (total_watts / 90) + 100
        sendHttpGetRequest("http://localhost:8888/10.88.64.220/" + solar_color + "/100/8/3500")
        logInfo("Power", "Solar: " + total_watts + ", Color: " + solar_color)
      }
      finally {
        logInfo("Testing", "JSON - Ready to Unlock")
        lock.unlock()
        logInfo("Testing", "JSON - Unlocked")
      }
    end

This rules works fine in openHAB 1.8.3.

Oh, forgot the JSON blob.

{"devstatus": {
"Sys_Time": 1484492098,
"Sys_Batt_V": 52.6,
"ports": [
{ "Port": 1, "Dev": "GS","Type": "60Hz","Inv_I_L1": 5,"Chg_I_L1": 0,"Buy_I_L1": 2,"Sell_I_L1": 0,"VAC1_in_L1": 121,"VAC2_in_L1": 0,"VAC_out_L1": 120,"Inv_I_L2": 5,"Chg_I_L2": 0,"Buy_I_L2": 2,"Sell_I_L2": 0,"VAC1_in_L2": 120,"VAC2_in_L2": 0,"VAC_out_L2": 121,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC USE","INV_mode": "Offsetting","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},
{ "Port": 2, "Dev": "GS","Type": "60Hz","Inv_I_L1": 0,"Chg_I_L1": 0,"Buy_I_L1": 4,"Sell_I_L1": 0,"VAC1_in_L1": 121,"VAC2_in_L1": 0,"VAC_out_L1": 121,"Inv_I_L2": 0,"Chg_I_L2": 0,"Buy_I_L2": 4,"Sell_I_L2": 0,"VAC1_in_L2": 121,"VAC2_in_L2": 0,"VAC_out_L2": 121,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC DROP","INV_mode": "Off","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},
{ "Port": 3, "Dev": "GS","Type": "60Hz","Inv_I_L1": 0,"Chg_I_L1": 0,"Buy_I_L1": 4,"Sell_I_L1": 0,"VAC1_in_L1": 124,"VAC2_in_L1": 0,"VAC_out_L1": 124,"Inv_I_L2": 0,"Chg_I_L2": 0,"Buy_I_L2": 4,"Sell_I_L2": 0,"VAC1_in_L2": 125,"VAC2_in_L2": 0,"VAC_out_L2": 125,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC DROP","INV_mode": "Off","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},
{ "Port": 5, "Dev": "CC","Type": "FM80","Out_I": 6.9,"In_I": 3,"Batt_V": 52.9,"In_V": 107.6,"Out_kWh": 4.6,"Out_AH": 86,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 6, "Dev": "CC","Type": "FM80","Out_I": 7.1,"In_I": 3,"Batt_V": 52.9,"In_V": 108.8,"Out_kWh": 4.2,"Out_AH": 78,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 7, "Dev": "CC","Type": "FM80","Out_I": 7.7,"In_I": 3,"Batt_V": 52.9,"In_V": 108.1,"Out_kWh": 5.9,"Out_AH": 111,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 8, "Dev": "CC","Type": "FM60/80","Out_I": 6.3,"In_I": 3,"Batt_V": 52.8,"In_V": 108.2,"Out_kWh": 4.4,"Out_AH": 82,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 10, "Dev": "FNDC","Enabled": ["A","B"],"Shunt_A_I":  -29.4,"Shunt_A_AH": -36,"Shunt_A_kWh":  -1.850,"Shunt_B_I":  28.6,"Shunt_B_AH": 35,"Shunt_B_kWh":  1.880,"SOC": 99,"Min_SOC": 99,"Days_since_full": 0.2,"CHG_parms_met": false,"In_AH_today": 382,"Out_AH_today": 365,"In_kWh_today":  20.170,"Out_kWh_today":  19.200,"Net_CFC_AH": -3,"Net_CFC_kWh": -0.080,"Batt_V": 52.6,"Batt_temp": "21 C","Aux_mode": "auto","AUX": "disabled"}
]}}

I am new to debug on OH2, is there a way to get more info as to why this is an error on OH2 and not OH1?

The JsonPath implementaton has changed. Try it without [0] in the expression. It might come back as [120] instead of 120, in which case you could strip off the [ and ].

ssh openhab@localhost -p 8101
(might take some time on first run to generate key)
openhab> log:set DEBUG org.eclipse.smarthome
openhab> log:tail
(Control-C to stop tailing)
openhab> log:set DEFAULT org.eclipse.smarthome
openhab> (Control-D to exit Karaf shell)

Thanks for the debug!! I changed to:

var String json = Outback_Dev_status.state.toString
  logInfo("Testing", "JSON - JSONPATH 1")
var Number battery_soc = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].SOC", json))
  logInfo("Testing", "JSON - JSONPATH 2")
var Number battery_voltage = new Double(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].Batt_V", json))

I get a result now, but it does not go to the 2nd line, my guess is because of [ ] in the result not being a number.

2017-01-16 09:31:09.300 [INFO ] [lipse.smarthome.model.script.Testing] - JSON - JSONPATH 1
2017-01-16 09:31:09.300 [DEBUG] [ternal.JSonPathTransformationService] - about to transform '{"devstatus": {
"Sys_Time": 1484559110,
"Sys_Batt_V": 52.6,
"ports": [
{ "Port": 1, "Dev": "GS","Type": "60Hz","Inv_I_L1": 3,"Chg_I_L1": 0,"Buy_I_L1": 5,"Sell_I_L1": 0,"VAC1_in_L1": 121,"VAC2_in_L1": 0,"VAC_out_L1": 120,"Inv_I_L2": 3,"Chg_I_L2": 0,"Buy_I_L2": 6,"Sell_I_L2": 0,"VAC1_in_L2": 120,"VAC2_in_L2": 0,"VAC_out_L2": 120,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC USE","INV_mode": "Offsetting","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},
{ "Port": 2, "Dev": "GS","Type": "60Hz","Inv_I_L1": 0,"Chg_I_L1": 0,"Buy_I_L1": 6,"Sell_I_L1": 0,"VAC1_in_L1": 121,"VAC2_in_L1": 0,"VAC_out_L1": 121,"Inv_I_L2": 0,"Chg_I_L2": 0,"Buy_I_L2": 8,"Sell_I_L2": 0,"VAC1_in_L2": 121,"VAC2_in_L2": 0,"VAC_out_L2": 121,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC DROP","INV_mode": "Off","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},
{ "Port": 3, "Dev": "GS","Type": "60Hz","Inv_I_L1": 0,"Chg_I_L1": 0,"Buy_I_L1": 7,"Sell_I_L1": 0,"VAC1_in_L1": 124,"VAC2_in_L1": 0,"VAC_out_L1": 124,"Inv_I_L2": 0,"Chg_I_L2": 0,"Buy_I_L2": 9,"Sell_I_L2": 0,"VAC1_in_L2": 124,"VAC2_in_L2": 0,"VAC_out_L2": 124,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC DROP","INV_mode": "Off","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},
{ "Port": 5, "Dev": "CC","Type": "FM80","Out_I": 5.4,"In_I": 2,"Batt_V": 52.9,"In_V": 110.6,"Out_kWh": 0.2,"Out_AH": 4,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 6, "Dev": "CC","Type": "FM80","Out_I": 5.4,"In_I": 2,"Batt_V": 52.9,"In_V": 108.0,"Out_kWh": 0.2,"Out_AH": 4,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 7, "Dev": "CC","Type": "FM80","Out_I": 5.1,"In_I": 2,"Batt_V": 52.9,"In_V": 107.1,"Out_kWh": 0.2,"Out_AH": 4,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 8, "Dev": "CC","Type": "FM60/80","Out_I": 3.8,"In_I": 1,"Batt_V": 52.8,"In_V": 108.0,"Out_kWh": 0.1,"Out_AH": 3,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},
{ "Port": 10, "Dev": "FNDC","Enabled": ["A","B"],"Shunt_A_I":  -18.2,"Shunt_A_AH": -7,"Shunt_A_kWh": -0.370,"Shunt_B_I":  19.3,"Shunt_B_AH": 6,"Shunt_B_kWh":  0.370,"SOC": 99,"Min_SOC": 99,"Days_since_full": 0.0,"CHG_parms_met": false,"In_AH_today": 27,"Out_AH_today": 13,"In_kWh_today":  1.570,"Out_kWh_today":  0.640,"Net_CFC_AH": -1,"Net_CFC_kWh": -0.020,"Batt_V": 52.6,"Batt_temp": "22 C","Aux_mode": "auto","AUX": "disabled"}
]}}' by the function '$.devstatus.ports[?(@.Port==10)].SOC'
2017-01-16 09:31:09.301 [DEBUG] [ternal.JSonPathTransformationService] - transformation resulted in '[99]'

JsonPath in OH 1.x was easier in this regard but incorrect.

So that means there is no way to strip [ ] easily and get a Number?

java.lang.String.substring should work.

Could you help with:

var Number battery_soc = new Integer(transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].SOC", json))

Once I get that to work I should be able to fix all the others.

Maybe

var String result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].SOC", json)
var Number battery_soc = new Integer(result.substring(1,result.indexOf(']')))
1 Like

You rock my world.

Is there a way I can use a var such as “result” more then once? Or do I need to have a different var name for every single transform?

That works for battery_soc, but not battery_voltage [52.5] as an example.

var String json = Outback_Dev_status.state.toString
  logInfo("Testing", "JSON - JSONPATH 1")
var String battery_string_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].SOC", json)
var Number battery_soc = new Integer(battery_string_result.substring(1,battery_string_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 2 " + battery_soc)
var String battery_voltage_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].Batt_V", json)
var Number battery_voltage = new Integer(battery_voltage_result.substring(1,battery_voltage_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 3 " + battery_voltage)
var String battery_temp_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].Batt_temp", json)
var Number battery_temp = new Integer(battery_temp_result.substring(1,battey_temp_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 4 " + battery_temp)

“52.5” can’t be used to make an Integer. Maybe new Double instead for any possible non-integer (whole number)?

Sorry that was a lame copy mistake. :frowning:

Now I am getting stuck on battery_temp transformation resulted in ‘[“22 C”]’ I strip the ] the way you suggested and getting the value of 22 number the old OH1 way, but that is not working (or causing an error).

var String json = Outback_Dev_status.state.toString
  logInfo("Testing", "JSON - JSONPATH 1")
var String battery_string_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].SOC", json)
var Number battery_soc = new Integer(battery_string_result.substring(1,battery_string_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 2 " + battery_soc)
var String battery_voltage_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].Batt_V", json)
var Number battery_voltage = new Double(battery_voltage_result.substring(1,battery_voltage_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 3 " + battery_voltage)
var String battery_temp_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].Batt_temp", json)
var String battery_temp_string = new String(battery_temp_result.substring(1,battery_temp_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 4 " + battery_temp_string)
var Number battery_temp = new Integer(battery_temp_string.split(" ").get(0))
  logInfo("Testing", "JSON - JSONPATH 4.5 " + battery_temp)
var String shunt_a_amps_result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==10)].Shunt_A_I", json)
var Number shunt_a_amps = new Double(shunt_a_amps_result.substring(1,shunt_a_amps_result.indexOf(']')))
  logInfo("Testing", "JSON - JSONPATH 5 " + shunt_a_amps)

And the logs:

2017-01-16 12:21:35.227 [DEBUG] [ternal.JSonPathTransformationService] - about to transform '{"devstatus": {^M
"Sys_Time": 1484569356,^M
"Sys_Batt_V": 52.4,^M
"ports": [^M
{ "Port": 1, "Dev": "GS","Type": "60Hz","Inv_I_L1": 4,"Chg_I_L1": 0,"Buy_I_L1": 2,"Sell_I_L1": 0,"VAC1_in_L1": 120,"VAC2_in_L1": 0,"VAC_out_L1": 120,"Inv_I_L2": 4,"Chg_I_L2": 0,"Buy_I_L2": 3,"Sell_I_L2": 0,"VAC1_in_L2": 120,"VAC2_in_L2": 0,"VAC_out_L2": 120,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC USE","INV_mode": "Offsetting","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},^M
{ "Port": 2, "Dev": "GS","Type": "60Hz","Inv_I_L1": 0,"Chg_I_L1": 0,"Buy_I_L1": 4,"Sell_I_L1": 0,"VAC1_in_L1": 121,"VAC2_in_L1": 0,"VAC_out_L1": 121,"Inv_I_L2": 0,"Chg_I_L2": 0,"Buy_I_L2": 5,"Sell_I_L2": 0,"VAC1_in_L2": 120,"VAC2_in_L2": 0,"VAC_out_L2": 120,"AC_Input": "Grid","Batt_V": 51.6,"AC_mode": "AC DROP","INV_mode": "Off","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},^M
{ "Port": 3, "Dev": "GS","Type": "60Hz","Inv_I_L1": 0,"Chg_I_L1": 0,"Buy_I_L1": 5,"Sell_I_L1": 0,"VAC1_in_L1": 124,"VAC2_in_L1": 0,"VAC_out_L1": 123,"Inv_I_L2": 0,"Chg_I_L2": 0,"Buy_I_L2": 5,"Sell_I_L2": 0,"VAC1_in_L2": 124,"VAC2_in_L2": 0,"VAC_out_L2": 123,"AC_Input": "Grid","Batt_V": 52.0,"AC_mode": "AC DROP","INV_mode": "Off","Warn": ["none"],"Error": ["none"],"AUX": "disabled","RELAY": "disabled"},^M
{ "Port": 5, "Dev": "CC","Type": "FM80","Out_I": 5.8,"In_I": 2,"Batt_V": 52.7,"In_V": 106.3,"Out_kWh": 1.3,"Out_AH": 24,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},^M
{ "Port": 6, "Dev": "CC","Type": "FM80","Out_I": 5.7,"In_I": 2,"Batt_V": 52.8,"In_V": 109.6,"Out_kWh": 1.2,"Out_AH": 24,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},^M
{ "Port": 7, "Dev": "CC","Type": "FM80","Out_I": 5.4,"In_I": 2,"Batt_V": 52.8,"In_V": 106.0,"Out_kWh": 1.2,"Out_AH": 22,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},^M
{ "Port": 8, "Dev": "CC","Type": "FM60/80","Out_I": 4.4,"In_I": 2,"Batt_V": 52.6,"In_V": 106.5,"Out_kWh": 0.9,"Out_AH": 17,"CC_mode": "Bulk  ","Error": ["none"],"Aux_mode": "Manual","AUX": "disabled"},^M
{ "Port": 10, "Dev": "FNDC","Enabled": ["A","B"],"Shunt_A_I":  -24.7,"Shunt_A_AH": -63,"Shunt_A_kWh":  -3.260,"Shunt_B_I":  21.7,"Shunt_B_AH": 62,"Shunt_B_kWh":  3.310,"SOC": 99,"Min_SOC": 99,"Days_since_full": 0.1,"CHG_parms_met": false,"In_AH_today": 101,"Out_AH_today": 86,"In_kWh_today":  5.460,"Out_kWh_today":  4.470,"Net_CFC_AH": -4,"Net_CFC_kWh": -0.150,"Batt_V": 52.4,"Batt_temp": "22 C","Aux_mode": "auto","AUX": "disabled"}^M
]}}' by the function '$.devstatus.ports[?(@.Port==10)].Batt_temp'
2017-01-16 12:21:35.227 [DEBUG] [ternal.JSonPathTransformationService] - transformation resulted in '["22 C"]'
2017-01-16 12:21:35.227 [INFO ] [lipse.smarthome.model.script.Testing] - JSON - JSONPATH 4 "22 C"
2017-01-16 12:21:35.228 [INFO ] [lipse.smarthome.model.script.Testing] - JSON - Ready to Unlock
2017-01-16 12:21:35.228 [INFO ] [lipse.smarthome.model.script.Testing] - JSON - JSONPATH 1

.indexOf(' ') instead of .indexOf(']') for that one I guess.

A more general solution for all of these would be .replaceAll("[^\\d.-]", "") instead of .subString(...), meaning, any non digit, decimal or minus sign? Throw it away.

You can reuse vars.

var String result = transform(“JSONPATH”, “$.devstatus.ports[?(@.Port==1)].VAC_out_L1”, json)
var Number a_l1_voltage = new Integer(result.substring(1,result.indexOf(’]’)))
var String result = transform(“JSONPATH”, “$.devstatus.ports[?(@.Port==1)].Buy_I_L1”, json)
var Number a_l1_buy_amps = new Integer(result.substring(1,result.indexOf(’]’)))

openhab.log:2017-01-17 17:58:10.236 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Outback JSON parsing': An error occured during the script execution: Cannot create a duplicate value 'result'.

Oops.

You don’t use the var String part after the first use.

var String result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)].VAC_out_L1", json)
var Number a_l1_voltage = new Integer(result.substring(1,result.indexOf(']')))
result = transform("JSONPATH", "$.devstatus.ports[?(@.Port==1)].Buy_I_L1", json)
var Number a_l1_buy_amps = new Integer(result.substring(1,result.indexOf(']')))

Can you explain more how OH 1.x was incorrect? I am running into more JSONPATH errors even with expressions that don’t have [0] such as:

val Number current_tank = new Double(transform("JSONPATH", "$device.lastReading.tank", json))

and:

var Number pm2 = new Integer(transform("JSONPATH", "$current.p2", json))

Is there anywhere documented that shows how to convert from OH1.x to OH2.x JSONPATH?