initial Commit

This commit is contained in:
2026-05-10 12:46:33 +02:00
commit 108f08645c
36 changed files with 8688 additions and 0 deletions

47
backend/services/pico.py Normal file
View File

@@ -0,0 +1,47 @@
from __future__ import annotations
import json
from dataclasses import dataclass
from typing import Any
@dataclass(frozen=True)
class PicoEvent:
button: int
pin: int
event: str
pressed: bool
def to_dict(self) -> dict[str, Any]:
return {
"button": self.button,
"pin": self.pin,
"event": self.event,
"pressed": self.pressed,
}
def parse_pico_line(raw_line: str) -> PicoEvent | None:
try:
payload = json.loads(raw_line)
except json.JSONDecodeError:
return None
if not isinstance(payload, dict):
return None
if not {"button", "pin", "event", "pressed"}.issubset(payload):
return None
if payload["event"] not in {"down", "up"}:
return None
try:
button = int(payload["button"])
pin = int(payload["pin"])
except (TypeError, ValueError):
return None
if button < 1 or button > 10:
return None
return PicoEvent(button=button, pin=pin, event=payload["event"], pressed=bool(payload["pressed"]))