diff --git a/app/opensense.py b/app/opensense.py index d034ca1..81fb421 100644 --- a/app/opensense.py +++ b/app/opensense.py @@ -50,9 +50,15 @@ def get_temperature(): } print('Getting data from OpenSenseMap API...') - - response = requests.get("https://api.opensensemap.org/boxes", params=params, timeout=480) - print('Data retrieved successfully!') + try: + response = requests.get("https://api.opensensemap.org/boxes", params=params, timeout=480) + print('Data retrieved successfully!') + except requests.Timeout: + print("API request timed out") + return "Error: API request timed out\n", {"total_sensors": 0, "null_count": 0} + except requests.RequestException as e: + print(f"API request failed: {e}") + return f"Error: API request failed - {e}\n", {"total_sensors": 0, "null_count": 0} _sensor_stats["total_sensors"] = sum( 1 for line in response.text.splitlines() if re.search(r'^\s*"sensors"\s*:\s*\[', line) diff --git a/get-temp.py b/get-temp.py new file mode 100644 index 0000000..d34e013 --- /dev/null +++ b/get-temp.py @@ -0,0 +1,67 @@ +from datetime import datetime, timezone, timedelta +import re +import requests + +_sensor_stats = {"total_sensors": 0, "null_count": 0} + +def classify_temperature(average): + '''Classify temperature based on ranges using dictionary approach''' + # Define temperature ranges and their classifications + temp_classifications = { + "cold": (float('-inf'), 10, "Warning: Too cold"), + "good": (10, 36, "Good"), + "hot": (36, float('inf'), "Warning: Too hot") + } + + # Find the appropriate classification + for _, (min_temp, max_temp, status) in temp_classifications.items(): + if min_temp < average <= max_temp: + return status + + return "Unknown" # Default case + +def get_temperature(): + '''Function to get the average temperature from OpenSenseMap API.''' + + print("Fetching new data from OpenSenseMap API...") + + # Ensuring that data is not older than 1 hour. + time_iso = (datetime.now(timezone.utc) - timedelta(hours=1)).isoformat().replace("+00:00", "Z") + + params = { + "date": time_iso, + "format": "json" + } + + print('Getting data from OpenSenseMap API...') + + response = requests.get("https://api.opensensemap.org/boxes", params=params, timeout=480) + print('Data retrieved successfully!') + + _sensor_stats["total_sensors"] = sum( + 1 for line in response.text.splitlines() if re.search(r'^\s*"sensors"\s*:\s*\[', line) + ) + + res = [d.get('sensors') for d in response.json() if 'sensors' in d] + + temp_list = [] + _sensor_stats["null_count"] = 0 # Initialize counter for null measurements + + for sensor_list in res: + for measure in sensor_list: + if measure.get('unit') == "°C" and 'lastMeasurement' in measure: + last_measurement = measure['lastMeasurement'] + if last_measurement is not None and 'value' in last_measurement: + last_measurement_int = float(last_measurement['value']) + temp_list.append(last_measurement_int) + else: + _sensor_stats["null_count"] += 1 + + average = sum(temp_list) / len(temp_list) if temp_list else 0 + + # Use the dictionary-based classification + status = classify_temperature(average) + result = f'Average temperature: {average:.2f} °C ({status})\n' + + + return result, _sensor_stats \ No newline at end of file