mirror of
https://github.com/ferdzo/iotDashboard.git
synced 2026-04-05 09:06:26 +00:00
Refactored and updated tasks.py
This commit is contained in:
@@ -1,59 +1,63 @@
|
|||||||
|
import json
|
||||||
import redis
|
import redis
|
||||||
from huey import crontab
|
import requests
|
||||||
from huey.contrib.djhuey import periodic_task
|
|
||||||
import psycopg2
|
import psycopg2
|
||||||
import datetime
|
import datetime
|
||||||
import requests
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from huey import crontab
|
||||||
|
from huey.contrib.djhuey import periodic_task
|
||||||
from .models import Device
|
from .models import Device
|
||||||
import json
|
|
||||||
|
|
||||||
|
# Initialize Redis client
|
||||||
redis_client = redis.StrictRedis(host='10.10.0.1', port=6379, db=0)
|
redis_client = redis.StrictRedis(host='10.10.0.1', port=6379, db=0)
|
||||||
|
|
||||||
def devices_to_redis():
|
|
||||||
devices = Device.objects.all()
|
|
||||||
|
|
||||||
# Convert devices to a list of dictionaries
|
def devices_to_redis():
|
||||||
devices_list = []
|
"""Fetch all devices from Django and store them in Redis."""
|
||||||
for device in devices:
|
devices = Device.objects.all()
|
||||||
devices_list.append({
|
devices_list = [
|
||||||
|
{
|
||||||
'id': device.id,
|
'id': device.id,
|
||||||
'name': device.name,
|
'name': device.name,
|
||||||
'protocol': device.protocol,
|
'protocol': device.protocol,
|
||||||
'ip': device.ip,
|
'ip': device.ip,
|
||||||
})
|
}
|
||||||
|
for device in devices
|
||||||
# Store in Redis
|
]
|
||||||
redis_client.set('devices', json.dumps(devices_list))
|
redis_client.set('devices', json.dumps(devices_list))
|
||||||
|
|
||||||
devices_to_redis()
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_data_http(device):
|
def fetch_data_http(device):
|
||||||
|
"""Fetch temperature and humidity data from an HTTP sensor."""
|
||||||
data = {
|
data = {
|
||||||
"time": datetime.datetime.now(),
|
"time": datetime.datetime.now().isoformat(),
|
||||||
"device": device.name,
|
"device": device.name,
|
||||||
}
|
}
|
||||||
r = requests.get(f"http://{device.ip}/sensor/tempreature")
|
try:
|
||||||
data["temperature"] = r.json()['value']
|
temperature_response = requests.get(f"http://{device.ip}/sensor/temperature")
|
||||||
r = requests.get(f"http://{device.ip}/sensor/humidity")
|
humidity_response = requests.get(f"http://{device.ip}/sensor/humidity")
|
||||||
data["humidity"] = r.json()['value']
|
data["temperature"] = temperature_response.json().get('value')
|
||||||
|
data["humidity"] = humidity_response.json().get('value')
|
||||||
|
except requests.RequestException as e:
|
||||||
|
print(f"HTTP request failed: {e}")
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def fetch_data_mqtt(device):
|
|
||||||
data = redis_client.get(device).decode('utf-8')
|
|
||||||
data = json.loads(data).get(device)
|
|
||||||
|
|
||||||
|
def fetch_data_mqtt(device_name):
|
||||||
|
"""Fetch data from Redis for a specific MQTT device."""
|
||||||
|
data = redis_client.get(device_name)
|
||||||
if data:
|
if data:
|
||||||
print(data)
|
data = json.loads(data.decode('utf-8')).get(device_name)
|
||||||
mqtt_data = data
|
if data and datetime.datetime.fromisoformat(data["time"]) > datetime.datetime.now() - datetime.timedelta(
|
||||||
# Ensure the data is recent
|
minutes=2):
|
||||||
if datetime.datetime.fromisoformat(mqtt_data["time"]) > datetime.datetime.now() - datetime.timedelta(minutes=2):
|
return data
|
||||||
return mqtt_data
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def insert_data(data):
|
def insert_data(data):
|
||||||
|
"""Insert data into the PostgreSQL database."""
|
||||||
with psycopg2.connect(settings.CONNECTION_STRING) as conn:
|
with psycopg2.connect(settings.CONNECTION_STRING) as conn:
|
||||||
cursor = conn.cursor()
|
with conn.cursor() as cursor:
|
||||||
insert_query = """
|
insert_query = """
|
||||||
INSERT INTO conditions (time, device, temperature, humidity)
|
INSERT INTO conditions (time, device, temperature, humidity)
|
||||||
VALUES (%s, %s, %s, %s)
|
VALUES (%s, %s, %s, %s)
|
||||||
@@ -61,18 +65,27 @@ def insert_data(data):
|
|||||||
cursor.execute(insert_query, (data["time"], data["device"], data["temperature"], data["humidity"]))
|
cursor.execute(insert_query, (data["time"], data["device"], data["temperature"], data["humidity"]))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
|
|
||||||
@periodic_task(crontab(minute='*/1'))
|
@periodic_task(crontab(minute='*/1'))
|
||||||
def fetch_data_from_all_devices():
|
def fetch_data_from_all_devices():
|
||||||
|
"""Fetch and insert data for all devices based on their protocol."""
|
||||||
devices = Device.objects.all()
|
devices = Device.objects.all()
|
||||||
for device in devices:
|
for device in devices:
|
||||||
|
data = None
|
||||||
if device.protocol == 'http':
|
if device.protocol == 'http':
|
||||||
data = fetch_data_http(device)
|
data = fetch_data_http(device)
|
||||||
insert_data(data)
|
|
||||||
elif device.protocol == 'mqtt':
|
elif device.protocol == 'mqtt':
|
||||||
# Assume data is already in mqtt_data dictionary
|
|
||||||
data = fetch_data_mqtt(device.name)
|
data = fetch_data_mqtt(device.name)
|
||||||
print(data)
|
|
||||||
if data and datetime.datetime.strptime(data["time"],"%Y-%m-%d %H:%M:%S.%f") > datetime.datetime.now() - datetime.timedelta(minutes=1):
|
if data:
|
||||||
|
data_time = datetime.datetime.fromisoformat(data["time"])
|
||||||
|
if data_time > datetime.datetime.now() - datetime.timedelta(minutes=1):
|
||||||
insert_data(data)
|
insert_data(data)
|
||||||
else:
|
else:
|
||||||
print(f"No complete data available for {device.name}. Skipping insertion.")
|
print(f"No recent data available for {device.name}. Skipping insertion.")
|
||||||
|
else:
|
||||||
|
print(f"No data available for {device.name}. Skipping insertion.")
|
||||||
|
|
||||||
|
|
||||||
|
# Initialize device data in Redis
|
||||||
|
devices_to_redis()
|
||||||
|
|||||||
Reference in New Issue
Block a user