mirror of
https://github.com/blackboxprogramming/BlackRoad-Operating-System.git
synced 2026-03-17 03:57:13 -05:00
112 lines
3.7 KiB
Python
112 lines
3.7 KiB
Python
"""Device management models for IoT/Raspberry Pi integration."""
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Float, JSON, ForeignKey, Text
|
|
from sqlalchemy.orm import relationship
|
|
from app.database import Base
|
|
from app.utils import utc_now
|
|
|
|
|
|
class Device(Base):
|
|
"""IoT Device model - Raspberry Pi, Jetson, etc."""
|
|
|
|
__tablename__ = "devices"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
device_id = Column(String(100), unique=True, index=True, nullable=False) # Unique device identifier
|
|
name = Column(String(200), nullable=False) # User-friendly name
|
|
device_type = Column(String(50), nullable=False) # pi5, pi400, jetson, etc.
|
|
|
|
# Connection info
|
|
ip_address = Column(String(45)) # IPv4 or IPv6
|
|
hostname = Column(String(255))
|
|
mac_address = Column(String(17))
|
|
|
|
# Status
|
|
is_online = Column(Boolean, default=False)
|
|
status = Column(String(50), default="offline") # online, offline, error, maintenance
|
|
last_seen = Column(DateTime)
|
|
|
|
# System info
|
|
os_version = Column(String(100))
|
|
kernel_version = Column(String(100))
|
|
uptime_seconds = Column(Integer, default=0)
|
|
|
|
# Hardware specs
|
|
cpu_model = Column(String(200))
|
|
cpu_cores = Column(Integer)
|
|
ram_total_mb = Column(Integer)
|
|
disk_total_gb = Column(Integer)
|
|
|
|
# Current metrics
|
|
cpu_usage_percent = Column(Float, default=0.0)
|
|
ram_usage_percent = Column(Float, default=0.0)
|
|
disk_usage_percent = Column(Float, default=0.0)
|
|
temperature_celsius = Column(Float)
|
|
|
|
# Services running
|
|
services = Column(JSON, default=list) # List of active services
|
|
|
|
# Capabilities
|
|
capabilities = Column(JSON, default=list) # mining, sensor, camera, etc.
|
|
|
|
# Metadata
|
|
location = Column(String(200)) # Physical location
|
|
description = Column(Text)
|
|
tags = Column(JSON, default=list)
|
|
|
|
# Ownership
|
|
owner_id = Column(Integer, ForeignKey("users.id"))
|
|
owner = relationship("User", back_populates="devices")
|
|
|
|
# Timestamps
|
|
created_at = Column(DateTime, default=utc_now)
|
|
updated_at = Column(DateTime, default=utc_now, onupdate=utc_now)
|
|
|
|
# Relations
|
|
metrics = relationship("DeviceMetric", back_populates="device", cascade="all, delete-orphan")
|
|
logs = relationship("DeviceLog", back_populates="device", cascade="all, delete-orphan")
|
|
|
|
|
|
class DeviceMetric(Base):
|
|
"""Time-series metrics for devices."""
|
|
|
|
__tablename__ = "device_metrics"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
device_id = Column(Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False)
|
|
|
|
# Metric data
|
|
timestamp = Column(DateTime, default=utc_now, index=True)
|
|
cpu_usage = Column(Float)
|
|
ram_usage = Column(Float)
|
|
disk_usage = Column(Float)
|
|
temperature = Column(Float)
|
|
network_bytes_sent = Column(Integer)
|
|
network_bytes_received = Column(Integer)
|
|
|
|
# Custom metrics (JSON for flexibility)
|
|
custom_data = Column(JSON, default=dict)
|
|
|
|
# Relationship
|
|
device = relationship("Device", back_populates="metrics")
|
|
|
|
|
|
class DeviceLog(Base):
|
|
"""Device event logs."""
|
|
|
|
__tablename__ = "device_logs"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
device_id = Column(Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False)
|
|
|
|
# Log data
|
|
timestamp = Column(DateTime, default=utc_now, index=True)
|
|
level = Column(String(20), nullable=False) # info, warning, error, critical
|
|
category = Column(String(50)) # system, network, service, hardware
|
|
message = Column(Text, nullable=False)
|
|
details = Column(JSON, default=dict)
|
|
|
|
# Relationship
|
|
device = relationship("Device", back_populates="logs")
|