74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
import os
|
|
import time
|
|
import requests
|
|
import paho.mqtt.client as mqtt
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
API_URL = os.getenv("API_URL")
|
|
MQTT_HOST = os.getenv("MQTT_HOST")
|
|
MQTT_PORT = int(os.getenv("MQTT_PORT", 1883))
|
|
|
|
def get_data_from_api(request):
|
|
links = {
|
|
'battery': '/battery_voltage_events/',
|
|
'devices': '/devices/',
|
|
'parEvents': '/par_events/',
|
|
'humidity': '/relative_humidity_events/',
|
|
'soilConductifity': '/soil_electric_conductivity_events/',
|
|
'soilPermittivity' : '/soil_relative_permittivity_events/',
|
|
'soilTemperature': '/soil_temperature_events/'
|
|
}
|
|
headers = {
|
|
'accept': 'application/json',
|
|
'Authorization': f'Token {os.getenv("API_TOKEN")}'
|
|
}
|
|
url = API_URL + links[request]
|
|
try:
|
|
response = requests.get(url, headers=headers)
|
|
response.raise_for_status()
|
|
except requests.exceptions.HTTPError as errh:
|
|
print ("HTTP Error:",errh)
|
|
return None
|
|
except requests.exceptions.ConnectionError as errc:
|
|
print ("Error Connecting:",errc)
|
|
return None
|
|
except requests.exceptions.Timeout as errt:
|
|
print ("Timeout Error:",errt)
|
|
return None
|
|
except requests.exceptions.RequestException as err:
|
|
print ("Something went wrong",err)
|
|
return None
|
|
|
|
data = response.json()
|
|
return data['results']
|
|
|
|
def publish_to_mqtt(topic, message):
|
|
client = mqtt.Client()
|
|
client.connect(MQTT_HOST, MQTT_PORT, 60)
|
|
try:
|
|
client.publish(topic, message)
|
|
except mqtt.MQTTException as e:
|
|
print(f"Failed to publish message: {e}")
|
|
finally:
|
|
client.disconnect()
|
|
|
|
def process_results(link, results):
|
|
for result in results:
|
|
if 'timestamp' in result and 'gateway_receive_time' in result and 'device' in result and 'value' in result:
|
|
message = f"Timestamp: {result['timestamp']}, Gateway Receive Time: {result['gateway_receive_time']}, Device: {result['device']}, Value: {result['value']}"
|
|
print(message)
|
|
publish_to_mqtt(link, message)
|
|
|
|
def main():
|
|
links = ['battery', 'devices', 'parEvents', 'humidity', 'soilConductifity', 'soilPermittivity', 'soilTemperature']
|
|
while True:
|
|
for link in links:
|
|
results = get_data_from_api(link)
|
|
if results is not None:
|
|
process_results(link, results)
|
|
time.sleep(5)
|
|
|
|
if __name__ == "__main__":
|
|
main() |