better alerts and connected_components
This commit is contained in:
@@ -50,7 +50,7 @@ class DisplayManager:
|
|||||||
|
|
||||||
self.screens[name] = url
|
self.screens[name] = url
|
||||||
if self._on_screens_change_callback:
|
if self._on_screens_change_callback:
|
||||||
self._on_screens_change_callback(self.screens)
|
self._on_screens_change_callback(self.screens, is_removed=False, modified_name=name)
|
||||||
print(f"[DisplayManager] 📺 Screen registered: {name} -> {url}")
|
print(f"[DisplayManager] 📺 Screen registered: {name} -> {url}")
|
||||||
|
|
||||||
elif state_change == ServiceStateChange.Removed:
|
elif state_change == ServiceStateChange.Removed:
|
||||||
@@ -58,7 +58,7 @@ class DisplayManager:
|
|||||||
print(f"[DisplayManager] ❌ Screen disconnected: {name}")
|
print(f"[DisplayManager] ❌ Screen disconnected: {name}")
|
||||||
self.screens.pop(name, None)
|
self.screens.pop(name, None)
|
||||||
if self._on_screens_change_callback:
|
if self._on_screens_change_callback:
|
||||||
self._on_screens_change_callback(self.screens)
|
self._on_screens_change_callback(self.screens, is_removed=True, modified_name=name)
|
||||||
|
|
||||||
def set_on_screens_change_callback(self, callback):
|
def set_on_screens_change_callback(self, callback):
|
||||||
"""Set a callback function to be called when screens are added or removed."""
|
"""Set a callback function to be called when screens are added or removed."""
|
||||||
|
|||||||
+36
-4
@@ -50,6 +50,12 @@ def save_connected_component(component_id: str, component_type: str):
|
|||||||
db.execute(DB_PATH, sql, (str(component_id), str(component_type), current_time))
|
db.execute(DB_PATH, sql, (str(component_id), str(component_type), current_time))
|
||||||
print(f"[DB] Component saved/updated -> ID: {component_id}, Type: {component_type}, Timestamp: {current_time}")
|
print(f"[DB] Component saved/updated -> ID: {component_id}, Type: {component_type}, Timestamp: {current_time}")
|
||||||
|
|
||||||
|
def remove_connected_component(component_id: str):
|
||||||
|
"""Removes a component from the database (blocking sync worker)."""
|
||||||
|
sql = "DELETE FROM connected_components WHERE id = ?;"
|
||||||
|
db.execute(DB_PATH, sql, (str(component_id),))
|
||||||
|
print(f"[DB] Component removed -> ID: {component_id}")
|
||||||
|
|
||||||
def get_connected_components():
|
def get_connected_components():
|
||||||
"""Returns a list of all connected components from the database."""
|
"""Returns a list of all connected components from the database."""
|
||||||
sql = "SELECT id, type, timestamp FROM connected_components;"
|
sql = "SELECT id, type, timestamp FROM connected_components;"
|
||||||
@@ -213,11 +219,21 @@ async def cloud_mqtt_listener_task():
|
|||||||
"data": payload
|
"data": payload
|
||||||
})
|
})
|
||||||
await asyncio.sleep(0.1)
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
# === LCD DISPLAY ===
|
# === LCD DISPLAY ===
|
||||||
def on_screens_change(screens):
|
def on_screens_change(screens, is_removed: bool, modified_name: str):
|
||||||
"""Callback for when screens are added or removed."""
|
"""Callback for when screens are added or removed."""
|
||||||
log(f"[DisplayManager] Screens changed. Current screens: {list(screens.keys())}")
|
log(f"[DisplayManager] Screens changed. Current screens: {list(screens.keys())}")
|
||||||
rgb_lcd_manager.set_external_screen_count(len(screens))
|
rgb_lcd_manager.set_external_screen_count(len(screens))
|
||||||
|
|
||||||
|
# Add Or remove from database of connected components
|
||||||
|
# 1. Extract id from name (assuming format "smartwave-epaper-<id>._displaytcp._tcp.local")
|
||||||
|
display_id = modified_name.split("-")[-1].split(".")[0]
|
||||||
|
if is_removed:
|
||||||
|
remove_connected_component(display_id)
|
||||||
|
else:
|
||||||
|
save_connected_component(display_id, "external_display")
|
||||||
|
|
||||||
display_manager.set_on_screens_change_callback(on_screens_change)
|
display_manager.set_on_screens_change_callback(on_screens_change)
|
||||||
|
|
||||||
def update_lcd_microwave_count():
|
def update_lcd_microwave_count():
|
||||||
@@ -283,11 +299,18 @@ alert_manager = None
|
|||||||
def on_new_alert(alert: Alert):
|
def on_new_alert(alert: Alert):
|
||||||
# Sends to cloud server
|
# Sends to cloud server
|
||||||
alert_dict = alert.to_dict()
|
alert_dict = alert.to_dict()
|
||||||
alert_dict["orchestrator_id"] = DEVICE_ID
|
|
||||||
|
logs_list = get_systemd_logs(lines=200, service_name="smartwave")
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"orchestrator_id": DEVICE_ID,
|
||||||
|
"alert": alert_dict,
|
||||||
|
"logs": logs_list
|
||||||
|
}
|
||||||
|
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
"https://smartwave.matthiasg.dev/alert",
|
"https://smartwave.matthiasg.dev/alert",
|
||||||
json=alert_dict,
|
json=payload,
|
||||||
)
|
)
|
||||||
|
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
@@ -612,10 +635,13 @@ async def handle_telemetry_request(endpoint: str):
|
|||||||
# 2. Unpack temperature and humidity
|
# 2. Unpack temperature and humidity
|
||||||
ambient_temp, ambient_humidity = temp_hum.get_temperature_and_humidity_with_retry()
|
ambient_temp, ambient_humidity = temp_hum.get_temperature_and_humidity_with_retry()
|
||||||
|
|
||||||
|
# Unpack microwave states
|
||||||
|
microwave_states_snapshot = {mw_id: mw_state.to_dict() for mw_id, mw_state in microwave_states.items()}
|
||||||
|
|
||||||
# 3. Build the telemetry payload (returns a JSON string)
|
# 3. Build the telemetry payload (returns a JSON string)
|
||||||
telemetry_payload = payloads.telemetry_payload(
|
telemetry_payload = payloads.telemetry_payload(
|
||||||
device_id=DEVICE_ID,
|
device_id=DEVICE_ID,
|
||||||
microwave_states=microwave_states.to_dict(),
|
microwave_states=microwave_states_snapshot,
|
||||||
button_state=button_state,
|
button_state=button_state,
|
||||||
cloud_alert=cloud_alert,
|
cloud_alert=cloud_alert,
|
||||||
gps_data=gps.get_gps_data(),
|
gps_data=gps.get_gps_data(),
|
||||||
@@ -641,10 +667,14 @@ async def handle_telemetry_request(endpoint: str):
|
|||||||
)
|
)
|
||||||
|
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
|
set_cloud_alert(False) # Clear any previous cloud alert on success
|
||||||
|
|
||||||
print(f"[Telemetry] Successfully dispatched telemetry (HTTP {response.status_code}).")
|
print(f"[Telemetry] Successfully dispatched telemetry (HTTP {response.status_code}).")
|
||||||
|
|
||||||
except requests.exceptions.RequestException as req_err:
|
except requests.exceptions.RequestException as req_err:
|
||||||
print(f"[Telemetry] HTTP Request failed to {endpoint}: {req_err}")
|
print(f"[Telemetry] HTTP Request failed to {endpoint}: {req_err}")
|
||||||
|
set_cloud_alert(True) # Set cloud alert on HTTP failure
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[Telemetry] Error handling telemetry request: {e}")
|
print(f"[Telemetry] Error handling telemetry request: {e}")
|
||||||
|
|
||||||
@@ -730,6 +760,8 @@ async def main():
|
|||||||
# Start mDNS Display discovery
|
# Start mDNS Display discovery
|
||||||
await display_manager.start()
|
await display_manager.start()
|
||||||
|
|
||||||
|
save_connected_component(DEVICE_ID, "orchestrateur")
|
||||||
|
|
||||||
async_event_queue = asyncio.Queue()
|
async_event_queue = asyncio.Queue()
|
||||||
display_update_queue = asyncio.Queue()
|
display_update_queue = asyncio.Queue()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user