diff --git a/app/services/door.py b/app/services/door.py index 94339c8..c3fb0ee 100644 --- a/app/services/door.py +++ b/app/services/door.py @@ -2,8 +2,7 @@ import logging from datetime import date, datetime, timedelta from time import sleep -from gpiozero import OutputDevice -from gpiozero.pins.mock import MockFactory +import lgpio from sqlalchemy import exc from sqlmodel import select @@ -25,33 +24,37 @@ class DoorController: self._is_open: bool = False self._lock_pin = lock_pin self._unlock_pin = unlock_pin + self._mock = mock_factory + self._chip = None - 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) + if not mock_factory: + self._chip = lgpio.gpiochip_open(0) + lgpio.gpio_claim_output(self._chip, unlock_pin, 1) + lgpio.gpio_claim_output(self._chip, lock_pin, 1) logger.info( - "DoorController started. lock=%s unlock=%s factory=%s", + "DoorController started. lock=%s unlock=%s mock=%s", lock_pin, unlock_pin, - type(self._lock.pin_factory).__name__, + mock_factory, ) def open(self): - self._unlock.on() + if self._mock: + self._is_open = True + logger.info("Dor unlocked.[MOCK]") + return + + lgpio.gpio_write(self._chip, self._unlock_pin, 0) sleep(0.4) - self._unlock.off() + lgpio.gpio_write(self._chip, self._unlock_pin, 1) self._is_open = True logger.info("Door unlocked!") def close(self): - self._lock.on() + lgpio.gpio_write(self._chip, self._lock_pin, 0) sleep(0.4) - self._lock.off() + lgpio.gpio_write(self._chip, self._lock_pin, 1) self._is_open = False logger.info("Door locked!") diff --git a/pyproject.toml b/pyproject.toml index b26351e..15bc111 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,8 +18,8 @@ dependencies = [ "pyscard>=2.3.1", "alembic>=1.18.5", "ruff>=0.16.0", - "gpiozero>=2.0.1.post3", "pydantic-settings>=2.13.1", + 'lgpio>=0.2.2.0' # ; sys_platform == "linux" and platform_machine == "aarch64"', ] [tool.uv.sources] @@ -28,6 +28,7 @@ python-desfire = { git = "https://github.com/waza-ari/python-desfire" } [tool.uv.extra-build-dependencies] python-desfire = ["poetry"] "pyscard" = ["setuptools"] +"lgpio" = ["setuptools"] [tool.setuptools] py-modules = ["app"] diff --git a/uv.lock b/uv.lock index 85457fa..1f3154c 100644 --- a/uv.lock +++ b/uv.lock @@ -270,18 +270,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "colorzero" -version = "2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/688824a06e8c4d04c7d2fd2af2d8da27bed51af20ee5f094154e1d680334/colorzero-2.0.tar.gz", hash = "sha256:e7d5a5c26cd0dc37b164ebefc609f388de24f8593b659191e12d85f8f9d5eb58", size = 25382, upload-time = "2021-03-15T23:42:23.261Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/a6/ddd0f130e44a7593ac6c55aa93f6e256d2270fd88e9d1b64ab7f22ab8fde/colorzero-2.0-py2.py3-none-any.whl", hash = "sha256:0e60d743a6b8071498a56465f7719c96a5e92928f858bab1be2a0d606c9aa0f8", size = 26573, upload-time = "2021-03-15T23:42:21.757Z" }, -] - [[package]] name = "coverage" version = "7.14.0" @@ -636,7 +624,7 @@ source = { virtual = "." } dependencies = [ { name = "alembic" }, { name = "fastapi", extra = ["standard"] }, - { name = "gpiozero" }, + { name = "lgpio" }, { name = "poetry" }, { name = "pwdlib", extra = ["argon2"] }, { name = "pydantic-settings" }, @@ -655,7 +643,7 @@ dependencies = [ requires-dist = [ { name = "alembic", specifier = ">=1.18.5" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.135.3" }, - { name = "gpiozero", specifier = ">=2.0.1.post3" }, + { name = "lgpio", specifier = ">=0.2.2.0" }, { name = "poetry", specifier = ">=2.3.4" }, { name = "pwdlib", extras = ["argon2"], specifier = ">=0.3.0" }, { name = "pydantic-settings", specifier = ">=2.13.1" }, @@ -670,18 +658,6 @@ requires-dist = [ { name = "sqlmodel", specifier = ">=0.0.38" }, ] -[[package]] -name = "gpiozero" -version = "2.0.1.post3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorzero" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/67/63/864a3c36842cf7b05808aadf906763a024a1b13f2a4c8144e3163de91255/gpiozero-2.0.1.post3.tar.gz", hash = "sha256:745feab6df463ac2e9de10c67e2dd9f396e668ba4e281e92381d6c460100a8f7", size = 168403, upload-time = "2026-07-27T10:03:32.628Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/cb/ec5917b454b2e82874769a348dc74cfcec5b447bf1061c827edea9702451/gpiozero-2.0.1.post3-py3-none-any.whl", hash = "sha256:d491734803a9bc6036602e6b8bbd73fb25c33da88de0fcd11a40e890b8bc2d3b", size = 151465, upload-time = "2026-07-27T10:03:31.195Z" }, -] - [[package]] name = "greenlet" version = "3.4.0" @@ -870,6 +846,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, ] +[[package]] +name = "lgpio" +version = "0.2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/33/26ec2e8049eaa2f077bf23a12dc61ca559fbfa7bea0516bf263d657ae275/lgpio-0.2.2.0.tar.gz", hash = "sha256:11372e653b200f76a0b3ef8a23a0735c85ec678a9f8550b9893151ed0f863fff", size = 90087, upload-time = "2024-03-29T21:59:55.901Z" } + [[package]] name = "mako" version = "1.3.12"