forked from rarias/bscpkgs
		
	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)
 |