Getting Ambient Weather Data into Ignition

I wanted to learn how API’s work, so I figured bringing in some of my weather station data to an Inductive Automation’s Ignition project would be a good task to learn on. I wasted a lot of time trying to use the python helper functions that were recommended in the docs at https://ambientweather.docs.apiary.io/. The problem with that route was that Ignition uses it’s own instance of python (actually jython)and it’s an older version. Note: if you do need to import libraries, I finally learned you can use the pip install command which takes care of all the dependencies for you if you follow the directions at https://forum.inductiveautomation.com/t/procedure-for-installing-python-libraries-from-source/26022/2. I almost had it working, but ran into a problem with a codec, which I didn’t understand and didn’t want to figure out.

I wound up using Ignition’s system.net.httpClient() function to make the call to the API. Once I figured out how to format the API call, the hard part was figuring out how to pick through the JSON document it returned and update tag values within Ignition with those values. I couldn’t get any of the built-in functions that are supposed to help with this to work correctly. The documentation is pretty sparse on those functions and it seemed to get hung up on the fact the date values contained colons. My workaround was to convert it to a big string value, then use python’s string commands to find the parts I wanted.

Below is the script I use to do the work. The script runs every 5 seconds. One of the software developers at Ignition had a much more elegant script started, but the get_data() method had a problem and I just went with a simpler solution.

#get data from ambient weather API
client = system.net.httpClient()
response = client.get("https://api.ambientweather.net/v1/devices/00:0E:00:00:00:00", params={"apiKey":"xxx","applicationKey":"yyy","limit":"1" }) 
#comes in as a list
weatherdata = response.json
#convert to a string to deal with problem of time having colons
weatherdataString = ' '.join(map(str, weatherdata)) 

#change searchterm for each element you want
searchterm = "tempf"
offset = len(searchterm)+3
startpoint = weatherdataString.find(searchterm)
endpoint = weatherdataString.find("'",startpoint+offset)
system.tag.write("[default]wxstation/temperature",(weatherdataString[startpoint+offset:endpoint-2]))

#change searchterm for each element you want
searchterm = "yearlyrainin"
offset = len(searchterm)+3
startpoint = weatherdataString.find(searchterm)
endpoint = weatherdataString.find("'",startpoint+offset)
system.tag.write("[default]wxstation/yearlyrain",(weatherdataString[startpoint+offset:endpoint-2]))

#change searchterm for each element you want
searchterm = "dailyrainin"
offset = len(searchterm)+3
startpoint = weatherdataString.find(searchterm)
endpoint = weatherdataString.find("'",startpoint+offset)
system.tag.write("[default]wxstation/dailyrain",(weatherdataString[startpoint+offset:endpoint-2]))

This entry was posted in Industrial Automation and tagged , , . Bookmark the permalink.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.