vigilar/vigilar/constants.py
Aaron D. Lee d69bf6d6af feat(Q1,Q4): add HighlightsConfig, KioskConfig, HIGHLIGHT/TIMELAPSE triggers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 19:06:08 -04:00

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