Rules Engine
APScheduler-based automation rules engine for the home automation system.
Features
- APScheduler: Background job scheduler for rule execution
- Interval Jobs: Periodic rule evaluation
- Graceful Shutdown: Proper signal handling (SIGINT, SIGTERM)
- Logging: Structured logging at INFO level
Running
poetry run python -m apps.rules.main
Architecture
The rules engine uses APScheduler's BackgroundScheduler to run automation rules on a schedule.
Current Jobs
- rule_tick: Example job that runs every minute
- Logs "Rule tick" message
- Can be extended with actual rule logic
Example Output
2025-10-31 13:05:46,865 - __main__ - INFO - Rules engine starting...
2025-10-31 13:05:46,868 - __main__ - INFO - Scheduler started with rule_tick job (every 1 minute)
2025-10-31 13:05:46,868 - __main__ - INFO - Rule tick
2025-10-31 13:06:46,874 - __main__ - INFO - Rule tick
2025-10-31 13:07:46,874 - __main__ - INFO - Rule tick
Signal Handling
The application handles shutdown signals gracefully:
- SIGINT (Ctrl+C): Initiates graceful shutdown
- SIGTERM: Initiates graceful shutdown
On shutdown:
- Stops accepting new jobs
- Waits for running jobs to complete
- Shuts down the scheduler
- Exits cleanly
Adding New Rules
To add a new rule, define a function and schedule it:
def my_custom_rule() -> None:
"""Custom automation rule."""
# Your rule logic here
logger.info("Custom rule executed")
# In main():
scheduler.add_job(
my_custom_rule,
'interval',
minutes=5, # Run every 5 minutes
id='custom_rule',
name='My Custom Rule'
)
Scheduler Triggers
APScheduler supports various trigger types:
- interval: Run at fixed intervals (e.g., every N minutes)
- cron: Run at specific times (e.g., daily at 8:00 AM)
- date: Run once at a specific datetime
Example with cron trigger:
scheduler.add_job(
morning_routine,
'cron',
hour=8,
minute=0,
id='morning',
name='Morning Routine'
)
Dependencies
- APScheduler: Advanced job scheduling
Future Enhancements
- Load rules from configuration file
- MQTT integration for device state monitoring
- Rule conditions (if/then logic)
- Rule chaining and dependencies
- Web API for dynamic rule management
- Persistent job store (database)