These sensors are part of their air quality measurements, which just happen to be very close to our server room. Reviewed-by: Aleix Boné <abonerib@bsc.es>
75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import time
|
|
from prometheus_client import start_http_server, Gauge
|
|
import requests, json
|
|
from datetime import datetime, timedelta
|
|
|
|
# Configuration -------------------------------------------
|
|
listening_port = 9928
|
|
update_period = 60 * 5 # Each 5 min
|
|
# ---------------------------------------------------------
|
|
|
|
metric_temp = Gauge('upc_c6_s302_temp', 'UPC C6 S302 temperature sensor')
|
|
|
|
def genparams():
|
|
d = {}
|
|
d['topic'] = 'TEMPERATURE'
|
|
d['shift_dates_to'] = ''
|
|
d['datapoints'] = 301
|
|
d['devicesAndColors'] = '1148418@@@#40ACB6'
|
|
|
|
now = datetime.now()
|
|
|
|
d['fromDate'] = now.strftime('%d/%m/%Y')
|
|
d['toDate'] = now.strftime('%d/%m/%Y')
|
|
d['serviceFrequency'] = 'NONE'
|
|
|
|
# WTF!
|
|
for i in range(7):
|
|
for j in range(48):
|
|
key = 'week.days[{}].hours[{}].value'.format(i, j)
|
|
d[key] = 'OPEN'
|
|
|
|
return d
|
|
|
|
def measure():
|
|
# First we need to load session
|
|
s = requests.Session()
|
|
r = s.get("https://upc.edu/sirena")
|
|
if r.status_code != 200:
|
|
print("bad HTTP status code on new session: {}".format(r.status_code))
|
|
return
|
|
|
|
if s.cookies.get("JSESSIONID") is None:
|
|
print("cannot get JSESSIONID")
|
|
return
|
|
|
|
# Now we can pull the data
|
|
url = "https://upcsirena.app.dexma.com/l_12535/analysis/by_datapoints/data.json"
|
|
r = s.post(url, data=genparams())
|
|
|
|
if r.status_code != 200:
|
|
print("bad HTTP status code on data: {}".format(r.status_code))
|
|
return
|
|
|
|
#print(r.text)
|
|
j = json.loads(r.content)
|
|
|
|
# Just take the last one
|
|
last = j['data']['chartElementList'][-1]
|
|
temp = last['values']['1148418-Temperatura']
|
|
|
|
return temp
|
|
|
|
if __name__ == '__main__':
|
|
start_http_server(port=listening_port, addr="localhost")
|
|
while True:
|
|
try:
|
|
metric_temp.set(measure())
|
|
except:
|
|
print("measure failed")
|
|
metric_temp.set(float("nan"))
|
|
|
|
time.sleep(update_period)
|