[door] add doorcontroller with mock pins for testing
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
import logging
|
||||
from datetime import date, datetime, timedelta
|
||||
from time import sleep
|
||||
|
||||
from gpiozero import OutputDevice
|
||||
from gpiozero.pins.mock import MockFactory
|
||||
from sqlalchemy import exc
|
||||
from sqlmodel import select
|
||||
|
||||
@@ -9,25 +12,77 @@ from app.services.database import Session, add_and_refresh
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
doorIsOpen = True
|
||||
# I think this could also be gpio controlled
|
||||
|
||||
# See: https://github.com/technyon/nuki_hub#gpio-lock-control-optional
|
||||
# TODO: add sensor pin
|
||||
class DoorController:
|
||||
def __init__(
|
||||
self,
|
||||
lock_pin: str = 17, # connected to 20 on the esp
|
||||
unlock_pin: str = 18, # connected to 21 on the esp
|
||||
mock_factory: bool = False,
|
||||
):
|
||||
self._is_open: bool = False
|
||||
self._lock_pin = lock_pin
|
||||
self._unlock_pin = unlock_pin
|
||||
|
||||
if mock_factory:
|
||||
from gpiozero import Device
|
||||
|
||||
Device.pin_factory = MockFactory()
|
||||
|
||||
self._lock = OutputDevice(pin=lock_pin, active_high=False)
|
||||
self._unlock = OutputDevice(pin=unlock_pin, active_high=False)
|
||||
|
||||
logger.info(
|
||||
"DoorController started. lock=%s unlock=%s factory=%s",
|
||||
lock_pin,
|
||||
unlock_pin,
|
||||
type(self._lock.pin_factory).__name__,
|
||||
)
|
||||
|
||||
def open(self):
|
||||
self._unlock.on()
|
||||
sleep(0.4)
|
||||
self._unlock.off()
|
||||
self._is_open = True
|
||||
logger.info("Door unlocked!")
|
||||
|
||||
def close(self):
|
||||
self._lock.on()
|
||||
sleep(0.4)
|
||||
self._lock.off()
|
||||
self._is_open = False
|
||||
logger.info("Door locked!")
|
||||
|
||||
def is_open(self):
|
||||
return self._is_open
|
||||
|
||||
|
||||
_contoller: DoorController | None = None
|
||||
|
||||
|
||||
def init_controller(ctrl: DoorController):
|
||||
global _contoller
|
||||
_contoller = ctrl
|
||||
|
||||
|
||||
def get_controller():
|
||||
if _contoller is None:
|
||||
raise RuntimeError("DoorController not initialized.")
|
||||
return _contoller
|
||||
|
||||
|
||||
def openDoor():
|
||||
global doorIsOpen
|
||||
doorIsOpen = True
|
||||
logger.info("Still needs gpio out")
|
||||
get_controller().open()
|
||||
|
||||
|
||||
def closeDoor():
|
||||
global doorIsOpen
|
||||
doorIsOpen = False
|
||||
logger.info("Still needs gpio out")
|
||||
get_controller().close()
|
||||
|
||||
|
||||
def isDoorOpen():
|
||||
return doorIsOpen
|
||||
return get_controller().is_open()
|
||||
|
||||
|
||||
def decrementOneshot(db: Session, oneshot: OneShotAccess):
|
||||
|
||||
Reference in New Issue
Block a user