Scheduler (resolves #1)

This commit is contained in:
Артём Кокос
2026-02-18 22:47:57 +07:00
parent 298dcbc277
commit 7d30afe9a3
6 changed files with 100 additions and 0 deletions

View File

@@ -1,9 +1,13 @@
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy import create_engine
DATABASE_URL = "sqlite+aiosqlite:///./ignis.db"
SYNC_DATABASE_URL = "sqlite:///./ignis.db"
engine = create_async_engine(DATABASE_URL, echo=False)
sync_engine = create_engine(SYNC_DATABASE_URL)
async_session = async_sessionmaker(engine, expire_on_commit=False)

31
app/core/scheduler.py Normal file
View File

@@ -0,0 +1,31 @@
import os
import logging
import pytz
from datetime import datetime
from dotenv import load_dotenv
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from app.core.database import sync_engine
from app.drivers.wiz import WizDriver
load_dotenv()
logger = logging.getLogger(__name__)
TZ_NAME = os.getenv("APP_TIMEZONE", "Asia/Novosibirsk")
app_tz = pytz.timezone(TZ_NAME)
jobstores = {"default": SQLAlchemyJobStore(engine=sync_engine)}
scheduler = AsyncIOScheduler(jobstores=jobstores, timezone=app_tz)
async def execute_lamp_command(ip: str, params: dict):
"""Выполнение команды по расписанию"""
driver = WizDriver()
await driver.set_pilot(ip, params)
logger.info(f"⏰ Сработало расписание для {ip}: {params}")
async def start_scheduler():
if not scheduler.running:
scheduler.start()
logger.info(f"🚀 Планировщик запущен. Таймзона: {TZ_NAME}")

13
app/models/schedule.py Normal file
View File

@@ -0,0 +1,13 @@
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, JSON
from app.core.database import Base
class ScheduleTask(Base):
__tablename__ = "schedules"
id = Column(Integer, primary_key=True, index=True)
device_id = Column(Integer, ForeignKey("devices.id"), nullable=False)
task_type = Column(String) # 'once', 'daily', 'cron'
action_params = Column(JSON) # {'state': True, 'dimming': 50}
is_active = Column(Boolean, default=True)
job_id = Column(String, unique=True) # ID задачи в APScheduler