def extract_airqo_hourly_data_from_api(start_time: str, end_time: str) -> list: airqo_api = AirQoApi() devices = airqo_api.get_devices(tenant="airqo") devices_list = list(devices) hourly_events = [] if len(devices_list) == 0: print("devices empty") return [] for device in devices_list: try: if "name" not in device.keys(): print(f"name missing in device keys : {device}") continue device_name = device["name"] events = airqo_api.get_events( tenant="airqo", start_time=start_time, frequency="hourly", end_time=end_time, device=device_name, ) if not events: print( f"No measurements for {device_name} : startTime {start_time} : endTime : {end_time}" ) continue hourly_events.extend(events) except Exception as ex: traceback.print_exc() print(ex) device_measurements = pd.json_normalize(hourly_events) column_mappings = { "internalTemperature.value": "internalTemperature", "internalHumidity.value": "internalHumidity", "externalTemperature.value": "temperature", "externalHumidity.value": "humidity", "externalPressure.value": "pressure", "speed.value": "windSpeed", "altitude.value": "altitude", "battery.value": "battery", "satellites.value": "satellites", "hdop.value": "hdop", "pm10.value": "pm10", "s2_pm10.value": "s2_pm10", "s2_pm2_5.value": "s2_pm2_5", "average_pm2_5.calibratedValue": "calibrated_pm2_5", } device_measurements.rename(columns=column_mappings, inplace=True) return device_measurements.to_dict(orient="records")
def get_airqo_data(freq: str, start_time: str = None, end_time: str = None) -> list: airqo_api = AirQoApi() devices = airqo_api.get_devices(tenant="airqo", all_devices=False) measurements = [] start = (str_to_date(start_time) if start_time else datetime.utcnow() - timedelta(days=7)) end = str_to_date(end_time) if end_time else datetime.utcnow() start_time = (date_to_str_days(start) if freq == "daily" else date_to_str_hours(start)) end_time = date_to_str_days(end) if freq == "daily" else date_to_str_hours( end) frequency = get_airqo_api_frequency(freq=freq) dates = pd.date_range(start_time, end_time, freq=frequency) last_date_time = dates.values[len(dates.values) - 1] for device in devices: for date in dates: start = date_to_str(date) end_date_time = date + timedelta(hours=dates.freq.n) if np.datetime64(end_date_time) > last_date_time: end = end_time else: end = date_to_str(end_date_time) try: events = airqo_api.get_events( tenant="airqo", start_time=start, frequency=freq, end_time=end, device=device["name"], ) measurements.extend(events) except Exception as ex: print(ex) traceback.print_exc() insights = format_measurements_to_insights(data=measurements) return insights