dia data access from Python app

I’m new to iDigi and trying to do a few evaluation tasks. I have data channels from an X4 w/ Zigbee modules populating data streams that I can access through the iDigi web UI. I am trying to write/modify some basic Python scripts to pull the data from the iDigi servers. Although I can access certain high level data with the Python app, I am getting various errors trying to get channel data. I have tried to base the Python scripts on examples I have found on the Digi web site and latest Idigi Web Services Programming Guide. Input into my mistakes would be apprecaited. Here is the Python code I am using with various commands I have been trying (one at a time). Where applicable, I included the section where I got the syntax from the programming guide.

import httplib
import base64

create HTTP basic authentication string, this consists of

“username:password” base64 encoded

auth = base64.encodestring(“%s:%s” % (username, password))[:-1]

webservice = httplib.HTTP(“my.idigi.com”, 80)

to what URL to send the request with a given HTTP method

webservice.putrequest(“GET”, “/ws/DiaChannelDataHistoryFull?condition=dcdUpdateTime>‘2013-01-16T21:34:18.000Z’”)

webservice.putrequest(“GET”, “/ws/DiaChannelDataFull”)

webservice.putrequest(“GET”, “/ws/DeviceCore”) # lists all gateways registered with iDigi account

webservice.putrequest(“GET”, “/ws/XbeeCore”) # lists all XBee resources registered with iDigi account

webservice.putrequest(“GET”, “/ws/ResourcePath”) # lists of resources - error 403

returns 403, Forbidden, same error from browser

webservice.putrequest(“GET”, “/ws/dia/channel/00000000-00000000-00409DFF-FF4BDB8A/sensor0/light/”)

returns 400, Bad Request (from section 17.3)

webservice.putrequest(“GET”, “/ws/DataPoint/dia/Channel/00000000-00000000-00409DFF-FF4BDB8A/sensor0/light”)

webservice.putrequest(“GET”, “/ws/DataStream”) # works

returns 505, HTTP Version Not Supported, works from browser URL bar (from section 4.3)

webservice.putrequest(“GET”, “/ws/DiaChannelDataFull/?condition=devConnectwareId=‘00000000-00000000-00409DFF-FF4BDB8A’ and dcChannelName=‘humidity’”)

add the authorization string into the HTTP header

webservice.putheader(“Authorization”, “Basic %s”%auth)
webservice.putheader(“Content-type”, “text/xml; charset="UTF-8"”)
webservice.endheaders()

get the response

statuscode, statusmessage, header = webservice.getreply()
response_body = webservice.getfile().read()

print the output to standard out

print (statuscode, statusmessage)
print response_body

webservice.putrequest("GET", "/ws/ResourcePath") # lists of resources - error 403

ResourcePath is just an example in the guide I believe as a placeholder for various supported resources like DeviceCore or XbeeCore.

webservice.putrequest("GET", "/ws/dia/channel/00000000-00000000-00409DFF-FF4BDB8A/sensor0/light/")

I’m not sure where this example came from, but it is wrong. The appropriate query would look like:
/ws/DiaChannelData/00000000-00000000-00409DFF-FF4BDB8A/sensor0/light

webservice.putrequest("GET", "/ws/DataPoint/dia/Channel/00000000-00000000-00409DFF-FF4BDB8A/sensor0/light")

This one should have a lower case c, like: /ws/DataStream/dia/channel/00000000-00000000-00409DFF-FF4BDB8A/sensor0/light

webservice.putrequest("GET", "/ws/DiaChannelDataFull/?condition=devConnectwareId='00000000-00000000-00409DFF-FF4BDB8A' and dcChannelName='humidity'")

I think the problem here is that you need to appropriately URL encode special characters like spaces in the url. There are better ways to do it in python (which I don’t know without searching the APIs), but I’ve hand encoded the spaces so you can try this: /ws/DiaChannelDataFull/?condition=devConnectwareId=‘00000000-00000000-00409DFF-FF4BDB8A’%20and%20dcChannelName=‘humidity’

Chris

Chris,

Thanks for the help and corrections. Commands are working as expected now. Assume that DiaChannelData example you gave was supposed to be DiaChannelDataFull.

Dave

I’m using this example to build a webapp, but I cannot understand why I am getting only one value (the most recent) from the request I’m doing.

My query starts with /ws/DataStream/ + all the address + ?rollupMethod=sum&rollupInterval=week

(200, ‘OK’)

1
1000

But my DataStream is size = 1. How I can get the rest of the values?