This repository was archived by the owner on Jan 5, 2025. It is now read-only.
forked from asantaga/wiserheatingapi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprom.py
More file actions
87 lines (71 loc) · 4.02 KB
/
Copy pathprom.py
File metadata and controls
87 lines (71 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from dotenv import load_dotenv
from prometheus_client import start_http_server, Enum, Gauge, Summary
from wiserHeatingAPI import wiserHub
import datetime
import os
import time
load_dotenv()
if "WISER_HUBHOST" not in os.environ:
raise EnvironmentError("Failed because envvar WISER_HUBHOST is not set.")
if "WISER_HUBSECRET" not in os.environ:
raise EnvironmentError("Failed because envvar WISER_HUBSECRET is not set.")
debugEnabled = os.environ.get("WISER_DEBUG") == '1'
wiserhost = os.environ.get("WISER_HUBHOST")
wiserkey = os.environ.get("WISER_HUBSECRET")
delay = int(os.environ.get("WISER_DELAY", 60))
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
metrics = {
'heating': Enum('wiser_heating_output_state', 'Heating Output State', states = ['Off', 'On'], labelnames = ['hubHost', 'hubName']),
'hotwater': Enum('wiser_hotwater_output_state', 'Hot Water Output State', states = ['Off', 'On'], labelnames = ['hubHost', 'hubName']),
'humidity': Gauge('wiser_room_humidity_percent', 'Room Humidity Percent', labelnames = ['hubHost', 'hubName', 'roomId', 'roomName']),
'outputstate': Enum('wiser_room_output_state', 'Room Output State', states = ['Off', 'On'], labelnames = ['hubHost', 'hubName', 'roomId', 'roomName']),
'setpoint': Gauge('wiser_room_setpoint_celsius', 'Room Set Point Celsius', labelnames = ['hubHost', 'hubName', 'roomId', 'roomName']),
'temprature': Gauge('wiser_room_temperature_celsius', 'Room Temperature Celsius', labelnames = ['hubHost', 'hubName', 'roomId', 'roomName'])
}
@REQUEST_TIME.time()
def process_request():
"""Query the metrics from the Wiser hub."""
wh = wiserHub.wiserHub(wiserhost, wiserkey)
hubName = wh.getWiserHubName()
systemInfo = wh.getSystem()
heatingRelayStatus = wh.getHeatingRelayStatus()
hotwaterRelayState = wh.getHotwaterRelayStatus()
metrics['heating'].labels(hubHost = wiserhost, hubName = hubName).state(heatingRelayStatus)
metrics['hotwater'].labels(hubHost = wiserhost, hubName = hubName).state(hotwaterRelayState)
if debugEnabled:
print('---')
print("Hub: HubHost = {}, HubName = {}, SystemTime = {}".format(wiserhost, hubName, datetime.datetime.fromtimestamp(systemInfo['UnixTime'])))
print("State: Heating = {}, HotWater = {}".format(heatingRelayStatus, hotwaterRelayState))
for room in wh.getRooms():
roomId = room.get("id")
roomName = room.get("Name").strip()
roomLabels = {'hubHost': wiserhost, 'hubName': hubName, 'roomId': roomId, 'roomName': roomName}
roomStatId = room.get("RoomStatId")
roomstat = wh.getRoomStatData(roomStatId) if roomStatId is not None else None
# room heating control output
roomOutputState = room.get("ControlOutputState")
metrics['outputstate'].labels(wiserhost, hubName, roomId, roomName).state(roomOutputState)
# room heating temprature set point
roomSetPoint = room.get("CurrentSetPoint") / 10
metrics['setpoint'].labels(wiserhost, hubName, roomId, roomName).set(roomSetPoint)
# room temprature calculated
roomTemprature = room.get("CalculatedTemperature") / 10
metrics['temprature'].labels(wiserhost, hubName, roomId, roomName).set(roomTemprature)
# humidity only available where a RoomStat is installed
if roomstat is not None:
roomHumidity = roomstat.get("MeasuredHumidity")
metrics['humidity'].labels(wiserhost, hubName, roomId, roomName).set(roomHumidity)
if debugEnabled:
print("Room: Id = {}, Name = {}, CalculatedTemperature = {}, CurrentSetPoint = {}, RoomOutputState = {}, Humidity = {}".format(
roomId,
roomName,
room.get("CalculatedTemperature") / 10,
room.get("CurrentSetPoint") / 10,
roomOutputState,
roomHumidity if roomstat is not None else "No RoomStat"
))
if __name__ == '__main__':
start_http_server(8000)
while True:
process_request()
time.sleep(delay)