Helpful Functions
Below are a couple of utility functions that might be useful when developing drivers.
Timezone Conversion
Assuming you have a 'pytz' object called tz in your class that contains the timezone that is considered 'local' for your data source, you can use the following functions…
def utcToLocal(self,dt): if isinstance(dt,str): if '.' in dt: dt = datetime.strptime("%Y-%m-%d %H:%M:%S.%f",pytz.utc) else: dt = datetime.strptime("%Y-%m-%d %H:%M:%S",pytz.utc) if dt.tzinfo is None: dt = dt.replace(tzinfo = pytz.utc) if self.timezone == "utc": return dt lt = dt.astimezone(self.tz) return lt def localToUTC(self,dt): if isinstance(dt,str): if '.' in dt: dt = datetime.strptime("%Y-%m-%d %H:%M:%S.%f") else: dt = datetime.strptime("%Y-%m-%d %H:%M:%S") if dt.tzinfo is None: dt = self.tz.localize(dt) if self.timezone == "utc": return dt lt = dt.astimezone(pytz.utc) return lt
These two functions take the passed datetime (converting it from a string if required) and converts it between either UTC and the data-sources local time, or the data-sources local time and UTC.
Event Cleanup
Most Python objects can't be converted directly into JSON - this code converts each of the values in your dictionary to strings to make sure they can be sent to the ARDI server.
Note that it also does the job of converting Python datetime objects to both local and UTC versions (assuming your class has a 'tz' variable and is using the datetime functions detailed above).
#Convert to strings whevever possible keys = list(dct.keys()) for d in keys: #Convert dates if isinstance(dct[d],datetime.datetime): #Make local and UTC versions of dates. All raw dates should be UTC. if self.timezone != "utc": dct[d + "_local"] = dct[d].strftime("%Y-%m-%d %H:%M:%S") dct[d + "_utc"] = self.localToUTC(dct[d]).strftime("%Y-%m-%d %H:%M:%S") dct[d] = dct[d + "_utc"] else: dct[d] = dct[d].strftime("%Y-%m-%d %H:%M:%S") else: dct[d] = str(dct[d])