diff --git a/main.py b/main.py index c68760a..03f398b 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,7 @@ recorder = PooRecorder() @asynccontextmanager -async def _lifespan(_app: FastAPI): +async def _lifespan(_app: FastAPI): # noqa: ANN202 await recorder.start() yield await recorder.stop() @@ -19,4 +19,5 @@ app = FastAPI(lifespan=_lifespan) @app.put("/record/s={status}") async def record(status: str) -> dict: + await recorder.record(status) return {"status": status} diff --git a/poo.py b/poo.py index 52ca26c..00536a8 100644 --- a/poo.py +++ b/poo.py @@ -4,8 +4,15 @@ from fastapi_mqtt import FastMQTT, MQTTConfig class PooRecorder: - mqtt_config = MQTTConfig(username="mqtt", password="mqtt") + mqtt_config = MQTTConfig(username="mqtt", password="mqtt") # noqa: S106 mqtt = FastMQTT(config=mqtt_config) + CONFIG_TOPIC = "homeassistant/text/poo_recorder/config" + AVAILABILITY_TOPIC = "studiotj/poo_recorder/status" + COMMAND_TOPIC = "studiotj/poo_recorder/update_text" + STATE_TOPIC = "studiotj/poo_recorder/text" + JSON_TOPIC = "studiotj/poo_recorder/attributes" + ONLINE = "online" + OFFLINE = "offline" def __init__(self) -> None: print("Initialization.") @@ -18,16 +25,30 @@ class PooRecorder: print("Stopping...") await PooRecorder.mqtt.mqtt_shutdown() - def record(self) -> None: - print("Recording...", self._status) + async def record(self, status: str) -> None: + PooRecorder.publish_text(status) now = datetime.now(tz=datetime.now().astimezone().tzinfo) - formatted_time = now.strftime("%a | %Y-%m-%d | %H:%M") + PooRecorder.publish_time(now) + @staticmethod @mqtt.on_connect() - def on_connect(client, flags, rc, properties): + def on_connect(client, flags, rc, properties) -> None: # noqa: ANN001, ARG004 print("Connected") config = PooRecorder.compose_config() - PooRecorder.mqtt.publish("homeassistant/text/poo_recorder/config", config) + PooRecorder.mqtt.publish(PooRecorder.CONFIG_TOPIC, config) + PooRecorder.publish_text("N/A") + + @staticmethod + def publish_text(new_text: str) -> None: + PooRecorder.mqtt.publish(PooRecorder.AVAILABILITY_TOPIC, PooRecorder.ONLINE) + PooRecorder.mqtt.publish(PooRecorder.STATE_TOPIC, new_text) + + @staticmethod + def publish_time(time: datetime) -> None: + formatted_time = time.strftime("%a | %Y-%m-%d | %H:%M") + PooRecorder.mqtt.publish(PooRecorder.AVAILABILITY_TOPIC, PooRecorder.ONLINE) + json_string = {"last_poo": formatted_time} + PooRecorder.mqtt.publish(PooRecorder.JSON_TOPIC, json_string) @staticmethod def compose_config() -> dict: @@ -40,12 +61,13 @@ class PooRecorder: "manufacturer": "Studio TJ", }, "unique_id": "poo_recorder", - "name": "Poop Recorder", - "availability_topic": "studiotj/poo_recorder/status", + "name": "Poo Status", + "availability_topic": PooRecorder.AVAILABILITY_TOPIC, "availability_template": "{{ value_json.availability }}", - "json_attributes_topic": "studiotj/poo_recorder/attributes", + "json_attributes_topic": PooRecorder.JSON_TOPIC, "min": 0, "max": 255, "mode": "text", - "command_topic": "studiotj/poo_recorder/command", + "command_topic": PooRecorder.COMMAND_TOPIC, + "state_topic": PooRecorder.STATE_TOPIC, }