Search code examples
pythonjsonazureazure-iot-hubazure-stream-analytics

Python to Json DeserializerError


I am trying to read values from PLC using the IOTHub telemetry and stream them to PowerBI using azure.

I was able to connect to the PLC and read the values when I run the code and am able to see the hub receive the messages. However, the stream gives me an error that says 'InputDeserializerError.InvalidData'. I am not sure where I went wrong. Please have a look at the below code and suggest how I could serialize it. When I remove the string values and only run integers & float, the stream picks it up.

# Define the JSON message to send to IoT Hub.
MSG_TXT = "{\"Bin1Load\": %s,\"Bin1Grower\": %s,\"Bin1Variety\": %s,\"Bin1StatedTn\": %.2f,\"Bin1S\": %.3f,\"Bin1CalcV\": %.2f}"

def send_confirmation_callback(message, result, user_context):
    print ( "IoT Hub responded to message with status: %s" % (result) )

def iothub_client_init():
    # Create an IoT Hub client
    client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
    return client

def iothub_client_telemetry_sample_run():

    try:
        client = iothub_client_init()
        print ( "IoT Hub device sending periodic messages, press Ctrl-C to exit" )

   
        while True:
            # Build the message with simulated telemetry values.    
            b1load =  comm.Read('Bin01.Content.Load')
            b1grower =  comm.Read('Bin01.Content.Grower')
            b1variety =  comm.Read('Bin01.Content.Variety')
            b1statedton =  comm.Read('Bin01.Content.Stated_Tn')            
            b1s =  comm.Read('Bin01.Content.SG')
            b1calcvol =  comm.Read('Bin01.Content.Calc_Vol')
            msg_txt_formatted = MSG_TXT % (b1loads, b1growers, b1varietys, b1statedton, b1s, b1calcvol)
            message = IoTHubMessage(msg_txt_formatted)``` 

Solution

  • Solution:

    Don't try to build JSON with string formatting. Create a dictionary and use json.dumps().