#!/usr/bin/env python3 import psutil import time from datetime import datetime from typing import Dict, Any def collect_metrics() -> Dict[str, Any]: """Collect system metrics and return them in the required format.""" # Get system metrics boot_time = datetime.fromtimestamp(psutil.boot_time()) load_avg = psutil.getloadavg() memory = psutil.virtual_memory() swap = psutil.swap_memory() cpu_percent = psutil.cpu_percent(interval=1) # Convert bytes to GB def to_gb(bytes_value: int) -> float: return round(bytes_value / (1024**3), 2) return { "version": "1.0", "entities": [ { "name": "Last Boot", "sensor_id": "last_boot", "state_class": "total", "device_class": "timestamp", "unit_of_measurement": "", "value": boot_time.astimezone().isoformat(), "icon": "mdi:clock-time-four", "attributes": { "friendly_name": "Last Boot Time" } }, { "name": "Load Average (15m)", "sensor_id": "load_15m", "state_class": "measurement", "unit_of_measurement": "", "device_class": "power_factor", "value": str(round(load_avg[2], 1)), "icon": "mdi:gauge", "attributes": { "friendly_name": "System Load (15m)" } }, { "name": "Load Average (5m)", "sensor_id": "load_5m", "state_class": "measurement", "unit_of_measurement": "", "device_class": "power_factor", "value": str(round(load_avg[1], 1)), "icon": "mdi:gauge", "attributes": { "friendly_name": "System Load (5m)" } }, { "name": "Load Average (1m)", "sensor_id": "load_1m", "state_class": "measurement", "unit_of_measurement": "", "device_class": "power_factor", "value": str(round(load_avg[0], 1)), "icon": "mdi:gauge", "attributes": { "friendly_name": "System Load (1m)" } }, { "name": "Memory Free", "sensor_id": "memory_free", "state_class": "measurement", "unit_of_measurement": "GB", "device_class": "data_size", "value": str(to_gb(memory.available)), "icon": "mdi:memory", "attributes": { "friendly_name": "Available Memory" } }, { "name": "Memory Used", "sensor_id": "memory_used", "state_class": "measurement", "unit_of_measurement": "GB", "device_class": "data_size", "value": str(to_gb(memory.used)), "icon": "mdi:memory", "attributes": { "friendly_name": "Used Memory" } }, { "name": "Memory Usage", "sensor_id": "memory_usage", "state_class": "measurement", "unit_of_measurement": "%", "device_class": "power_factor", "value": str(memory.percent), "icon": "mdi:memory", "attributes": { "friendly_name": "Memory Usage" } }, { "name": "CPU Usage", "sensor_id": "cpu_usage", "state_class": "measurement", "unit_of_measurement": "%", "device_class": "power_factor", "value": str(cpu_percent), "icon": "mdi:cpu-64-bit", "attributes": { "friendly_name": "CPU Usage" } }, { "name": "Swap Free", "sensor_id": "swap_free", "state_class": "measurement", "unit_of_measurement": "GB", "device_class": "data_size", "value": str(to_gb(swap.free)), "icon": "mdi:harddisk", "attributes": { "friendly_name": "Free Swap" } }, { "name": "Swap Used", "sensor_id": "swap_used", "state_class": "measurement", "unit_of_measurement": "GB", "device_class": "data_size", "value": str(to_gb(swap.used)), "icon": "mdi:harddisk", "attributes": { "friendly_name": "Used Swap" } }, { "name": "Swap Usage", "sensor_id": "swap_usage", "state_class": "measurement", "unit_of_measurement": "%", "device_class": "power_factor", "value": str(swap.percent), "icon": "mdi:harddisk", "attributes": { "friendly_name": "Swap Usage" } } ] } if __name__ == "__main__": # Example usage metrics = collect_metrics() print(metrics)