55from cachetools .func import ttl_cache
66from fastapi import APIRouter
77
8- from .config import settings
8+ from .models .config import settings
9+ from .models .sensors import SensorSettingsModel
910from .services .homeassistant import get_entity_state
1011from .services .prometheus import get_prometheus_metric
1112from .services .website import get_membership_data
1213
1314spaceapi = APIRouter ()
1415
15- # Home Assistant Sensors to export to the Space API
16- # entity_id, override_name
17- HOMEASSISTANT_SENSORS = (
18- ("sensor.gw_dhcp_leases_online" , "WiFi Clients" ),
19- ("sensor.bluetooth_proxy_temperature" , "Rack 1" ),
20- ("sensor.bluetooth_proxy_humidity" , "Rack 1" ),
21- ("sensor.pi_room_sensor_temperature" , "Pi Room" ),
22- ("sensor.pi_room_sensor_humidity" , "Pi Room" ),
23- ("sensor.pi_room_sensor_pressure" , "Pi Room" ),
24- ("sensor.fabrication_sensor_temperature" , "Fabrication" ),
25- ("sensor.fabrication_sensor_humidity" , "Fabrication" ),
26- ("weather.forecast_leigh_hackspace" , "Outside" ),
27- ("sensor.3d_1_current_state" , "3D-1" ),
28- ("sensor.3d_2_current_state" , "3D-2" ),
29- ("sensor.3d_3_current_state" , "3D-3" ),
30- )
31-
32- # Prometheus queries to export to the Space API
33- # query, name, sensor type
34- PROMETHEUS_SENSORS = (
35- ("gocardless_members_count{}" , "Active Members" , "total_member_count" ),
36- )
37-
3816
3917def get_state () -> dict :
4018 """
@@ -60,12 +38,17 @@ def get_sensors() -> dict:
6038 SpaceAPI response.
6139 """
6240 results = {}
63- for sensor , override_name in HOMEASSISTANT_SENSORS :
64- data = get_entity_state (sensor )
41+
42+ # Load the sensor config if its not initialized
43+ if not settings .sensor_config :
44+ settings .sensor_config = SensorSettingsModel .load_from_yaml (settings .sensor_config_file )
45+
46+ for sensor in settings .sensor_config .homeassistant :
47+ data = get_entity_state (sensor .entity )
6548 if not data :
6649 logging .warning (
6750 "Call for {0} sensor returned an empty result, skipping" .format (
68- override_name
51+ sensor . entity
6952 )
7053 )
7154 continue
@@ -89,8 +72,8 @@ def get_sensors() -> dict:
8972 results ["temperature" ].append (
9073 {
9174 "value" : value ,
92- "unit" : unit_val ,
93- "location" : override_name or data ["attributes" ]["friendly_name" ],
75+ "unit" : sensor . unit or unit_val ,
76+ "location" : sensor . location or data ["attributes" ]["friendly_name" ],
9477 "lastchange" : int (arrow .get (data ["last_changed" ]).timestamp ()),
9578 }
9679 )
@@ -114,8 +97,8 @@ def get_sensors() -> dict:
11497 results ["humidity" ].append (
11598 {
11699 "value" : value ,
117- "unit" : unit_val ,
118- "location" : override_name or data ["attributes" ]["friendly_name" ],
100+ "unit" : sensor . unit or unit_val ,
101+ "location" : sensor . location or data ["attributes" ]["friendly_name" ],
119102 "lastchange" : int (arrow .get (data ["last_changed" ]).timestamp ()),
120103 }
121104 )
@@ -140,9 +123,8 @@ def get_sensors() -> dict:
140123 results ["barometer" ].append (
141124 {
142125 "value" : value ,
143- "unit" : unit_val ,
144- "location" : override_name
145- or data ["attributes" ]["friendly_name" ],
126+ "unit" : sensor .unit or unit_val ,
127+ "location" : sensor .location or data ["attributes" ]["friendly_name" ],
146128 "lastchange" : int (arrow .get (data ["last_changed" ]).timestamp ()),
147129 }
148130 )
@@ -163,7 +145,7 @@ def get_sensors() -> dict:
163145 results ["network_connections" ].append (
164146 {
165147 "value" : state ,
166- "location" : override_name or data ["attributes" ]["friendly_name" ],
148+ "location" : sensor . location or data ["attributes" ]["friendly_name" ],
167149 "lastchange" : int (arrow .get (data ["last_changed" ]).timestamp ()),
168150 }
169151 )
@@ -183,29 +165,29 @@ def get_sensors() -> dict:
183165
184166 results ["ext_3d_printers" ].append (
185167 {
186- "name" : override_name
168+ "name" : sensor . name or sensor . location
187169 or data ["attributes" ]["friendly_name" ].split ()[0 ],
188170 "state" : state ,
189171 "lastchange" : int (arrow .get (data ["last_changed" ]).timestamp ()),
190172 }
191173 )
192174
193- for query , name , sensor_type in PROMETHEUS_SENSORS :
194- data = get_prometheus_metric (query )
175+ for sensor in settings . sensor_config . prometheus :
176+ data = get_prometheus_metric (sensor . query )
195177 if not data or "result" not in data or len (data ["result" ]) == 0 :
196178 logging .warning (
197- "Call for {0} sensor returned an empty result, skipping" .format (name )
179+ "Call for {0} sensor returned an empty result, skipping" .format (sensor . name )
198180 )
199181 continue
200182
201- if sensor_type not in results :
202- results [sensor_type ] = []
183+ if sensor . sensor_type not in results :
184+ results [sensor . sensor_type ] = []
203185
204- if sensor_type == "total_member_count" :
186+ if sensor . sensor_type == "total_member_count" :
205187 results ["total_member_count" ].append (
206188 {
207189 "value" : int (data ["result" ][0 ]["value" ][1 ]),
208- "name" : name ,
190+ "name" : sensor . name ,
209191 "lastchange" : int (data ["result" ][0 ]["value" ][0 ]),
210192 }
211193 )
@@ -287,7 +269,7 @@ async def space_json():
287269 },
288270 "calendar" : {
289271 "type" : "ical" ,
290- "url" : urljoin (settings .base_url , "/events.ics" ),
272+ "url" : urljoin (str ( settings .base_url ) , "/events.ics" ),
291273 },
292274 },
293275 "links" : get_links (),
0 commit comments