Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions app/opensense.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
67 changes: 67 additions & 0 deletions get-temp.py
Original file line number Diff line number Diff line change
@@ -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
Loading