234 lines
5.7 KiB
Python
234 lines
5.7 KiB
Python
"""System-wide constants, enums, and MQTT topic definitions."""
|
|
|
|
from enum import StrEnum
|
|
|
|
# --- Arm States ---
|
|
|
|
class ArmState(StrEnum):
|
|
DISARMED = "DISARMED"
|
|
ARMED_HOME = "ARMED_HOME"
|
|
ARMED_AWAY = "ARMED_AWAY"
|
|
|
|
|
|
# --- Event Severity ---
|
|
|
|
class Severity(StrEnum):
|
|
INFO = "INFO"
|
|
WARNING = "WARNING"
|
|
ALERT = "ALERT"
|
|
CRITICAL = "CRITICAL"
|
|
|
|
|
|
# --- Event Types ---
|
|
|
|
class EventType(StrEnum):
|
|
MOTION_START = "MOTION_START"
|
|
MOTION_END = "MOTION_END"
|
|
CONTACT_OPEN = "CONTACT_OPEN"
|
|
CONTACT_CLOSED = "CONTACT_CLOSED"
|
|
ALARM_TRIGGERED = "ALARM_TRIGGERED"
|
|
ARM_STATE_CHANGED = "ARM_STATE_CHANGED"
|
|
POWER_LOSS = "POWER_LOSS"
|
|
POWER_RESTORED = "POWER_RESTORED"
|
|
LOW_BATTERY = "LOW_BATTERY"
|
|
CAMERA_ERROR = "CAMERA_ERROR"
|
|
CAMERA_RECONNECTED = "CAMERA_RECONNECTED"
|
|
SYSTEM_STARTUP = "SYSTEM_STARTUP"
|
|
SYSTEM_SHUTDOWN = "SYSTEM_SHUTDOWN"
|
|
PERSON_DETECTED = "PERSON_DETECTED"
|
|
VEHICLE_DETECTED = "VEHICLE_DETECTED"
|
|
KNOWN_VEHICLE_ARRIVED = "KNOWN_VEHICLE_ARRIVED"
|
|
UNKNOWN_VEHICLE_DETECTED = "UNKNOWN_VEHICLE_DETECTED"
|
|
PET_DETECTED = "PET_DETECTED"
|
|
PET_ESCAPE = "PET_ESCAPE"
|
|
UNKNOWN_ANIMAL = "UNKNOWN_ANIMAL"
|
|
WILDLIFE_PREDATOR = "WILDLIFE_PREDATOR"
|
|
WILDLIFE_NUISANCE = "WILDLIFE_NUISANCE"
|
|
WILDLIFE_PASSIVE = "WILDLIFE_PASSIVE"
|
|
PACKAGE_DELIVERED = "PACKAGE_DELIVERED"
|
|
PACKAGE_REMINDER = "PACKAGE_REMINDER"
|
|
PACKAGE_COLLECTED = "PACKAGE_COLLECTED"
|
|
PET_RULE_TRIGGERED = "PET_RULE_TRIGGERED"
|
|
KNOWN_VISITOR = "KNOWN_VISITOR"
|
|
UNKNOWN_VISITOR = "UNKNOWN_VISITOR"
|
|
VISITOR_DEPARTED = "VISITOR_DEPARTED"
|
|
|
|
|
|
# --- Sensor Types ---
|
|
|
|
class SensorType(StrEnum):
|
|
CONTACT = "CONTACT"
|
|
MOTION = "MOTION"
|
|
TEMPERATURE = "TEMPERATURE"
|
|
HUMIDITY = "HUMIDITY"
|
|
SMOKE = "SMOKE"
|
|
VIBRATION = "VIBRATION"
|
|
|
|
|
|
class SensorProtocol(StrEnum):
|
|
ZIGBEE = "ZIGBEE"
|
|
ZWAVE = "ZWAVE"
|
|
GPIO = "GPIO"
|
|
VIRTUAL = "VIRTUAL"
|
|
|
|
|
|
# --- Recording Triggers ---
|
|
|
|
class RecordingTrigger(StrEnum):
|
|
MOTION = "MOTION"
|
|
CONTINUOUS = "CONTINUOUS"
|
|
MANUAL = "MANUAL"
|
|
PERSON = "PERSON"
|
|
VEHICLE = "VEHICLE"
|
|
PET = "PET"
|
|
WILDLIFE = "WILDLIFE"
|
|
HIGHLIGHT = "HIGHLIGHT"
|
|
TIMELAPSE = "TIMELAPSE"
|
|
|
|
|
|
# --- Alert Channels ---
|
|
|
|
class AlertChannel(StrEnum):
|
|
WEB_PUSH = "WEB_PUSH"
|
|
EMAIL = "EMAIL"
|
|
WEBHOOK = "WEBHOOK"
|
|
LOCAL = "LOCAL"
|
|
|
|
|
|
class AlertStatus(StrEnum):
|
|
SENT = "SENT"
|
|
FAILED = "FAILED"
|
|
SUPPRESSED = "SUPPRESSED"
|
|
|
|
|
|
# --- UPS Status ---
|
|
|
|
class UPSStatus(StrEnum):
|
|
ONLINE = "OL"
|
|
ON_BATTERY = "OB"
|
|
LOW_BATTERY = "LB"
|
|
UNKNOWN = "UNKNOWN"
|
|
|
|
|
|
# --- Household Presence ---
|
|
|
|
class HouseholdState(StrEnum):
|
|
EMPTY = "EMPTY"
|
|
KIDS_HOME = "KIDS_HOME"
|
|
ADULTS_HOME = "ADULTS_HOME"
|
|
ALL_HOME = "ALL_HOME"
|
|
|
|
|
|
# --- Threat Levels (Wildlife) ---
|
|
|
|
class ThreatLevel(StrEnum):
|
|
PREDATOR = "PREDATOR"
|
|
NUISANCE = "NUISANCE"
|
|
PASSIVE = "PASSIVE"
|
|
|
|
|
|
# --- Camera Location ---
|
|
|
|
class CameraLocation(StrEnum):
|
|
EXTERIOR = "EXTERIOR"
|
|
INTERIOR = "INTERIOR"
|
|
TRANSITION = "TRANSITION"
|
|
|
|
|
|
# --- MQTT Topics ---
|
|
|
|
class Topics:
|
|
PREFIX = "vigilar"
|
|
|
|
# Camera
|
|
@staticmethod
|
|
def camera_motion_start(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/motion/start"
|
|
|
|
@staticmethod
|
|
def camera_motion_end(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/motion/end"
|
|
|
|
@staticmethod
|
|
def camera_heartbeat(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/heartbeat"
|
|
|
|
@staticmethod
|
|
def camera_error(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/error"
|
|
|
|
# Sensor
|
|
@staticmethod
|
|
def sensor_event(sensor_id: str, event_type: str) -> str:
|
|
return f"vigilar/sensor/{sensor_id}/{event_type}"
|
|
|
|
@staticmethod
|
|
def sensor_heartbeat(sensor_id: str) -> str:
|
|
return f"vigilar/sensor/{sensor_id}/heartbeat"
|
|
|
|
# UPS
|
|
UPS_STATUS = "vigilar/ups/status"
|
|
UPS_POWER_LOSS = "vigilar/ups/power_loss"
|
|
UPS_LOW_BATTERY = "vigilar/ups/low_battery"
|
|
UPS_CRITICAL = "vigilar/ups/critical"
|
|
UPS_RESTORED = "vigilar/ups/restored"
|
|
|
|
# Presence
|
|
@staticmethod
|
|
def presence_member(name: str) -> str:
|
|
return f"vigilar/presence/{name}"
|
|
|
|
PRESENCE_STATUS = "vigilar/presence/status"
|
|
|
|
# Pet
|
|
@staticmethod
|
|
def camera_pet_detected(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/pet/detected"
|
|
|
|
@staticmethod
|
|
def camera_wildlife_detected(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/wildlife/detected"
|
|
|
|
@staticmethod
|
|
def camera_package_delivered(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/package/delivered"
|
|
|
|
@staticmethod
|
|
def camera_package_reminder(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/package/reminder"
|
|
|
|
@staticmethod
|
|
def camera_package_collected(camera_id: str) -> str:
|
|
return f"vigilar/camera/{camera_id}/package/collected"
|
|
|
|
@staticmethod
|
|
def pet_location(pet_name: str) -> str:
|
|
return f"vigilar/pets/{pet_name}/location"
|
|
|
|
# System
|
|
SYSTEM_ARM_STATE = "vigilar/system/arm_state"
|
|
SYSTEM_ALERT = "vigilar/system/alert"
|
|
SYSTEM_SHUTDOWN = "vigilar/system/shutdown"
|
|
SYSTEM_RULES_UPDATED = "vigilar/system/rules_updated"
|
|
|
|
# Wildcard subscriptions
|
|
ALL = "vigilar/#"
|
|
ALL_CAMERAS = "vigilar/camera/#"
|
|
ALL_SENSORS = "vigilar/sensor/#"
|
|
|
|
|
|
# --- Defaults ---
|
|
|
|
DEFAULT_IDLE_FPS = 2
|
|
DEFAULT_MOTION_FPS = 30
|
|
DEFAULT_PRE_MOTION_BUFFER_S = 5
|
|
DEFAULT_POST_MOTION_BUFFER_S = 30
|
|
DEFAULT_MOTION_SENSITIVITY = 0.7
|
|
DEFAULT_MOTION_MIN_AREA_PX = 500
|
|
DEFAULT_RETENTION_DAYS = 30
|
|
DEFAULT_UPS_POLL_INTERVAL_S = 30
|
|
DEFAULT_LOW_BATTERY_THRESHOLD_PCT = 20
|
|
DEFAULT_CRITICAL_RUNTIME_THRESHOLD_S = 300
|
|
DEFAULT_WEB_PORT = 49735
|
|
DEFAULT_MQTT_PORT = 1883
|