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)
 |