# Meddelanden Moduler kommunicerar med varandra genom meddelanden. Alla meddelandetyper definieras i filen `lrpy/message.py`. ## Definiera ett nytt meddelande Ett meddelande är en Pydantic `BaseModel` med ett `type`-fält som unikt identifierar meddelandet. ```python from typing import Literal from pydantic import BaseModel class SensorMessage(BaseModel): type: Literal['sensor'] = 'sensor' distance: float ``` `type`-fältet måste: - Vara en `Literal` med exakt ett värde (t.ex. `Literal['sensor']`). - Ha ett default-värde som matchar literalen (t.ex. `= 'sensor'`). - Vara unikt — inga två meddelandetyper får ha samma `type`-sträng. `type`-strängen används internt för att routa meddelandet till rätt lyssnare. ## Registrera meddelandet Efter att meddelandet definierats måste det läggas till i `Message`-unionen längst ned i `message.py`: ```python type Message = Annotated[ TestMessage | TestMessage2 | SetSpeedMessage | SensorMessage, Field(discriminator="type") ] ``` Om meddelandet inte läggs till i unionen kommer det inte att kunna skickas eller tas emot. ## Validering av fält Pydantic validerar alla fält automatiskt. `Field` kan användas för att lägga till begränsningar: ```python from pydantic import BaseModel, Field from typing import Literal class SetSpeedMessage(BaseModel): type: Literal['set_speed'] = 'set_speed' left_speed: int = Field(ge=0, le=255) right_speed: int = Field(ge=0, le=255) ``` Här säkerställer `ge=0, le=255` att värdena ligger inom intervallet 0–255. Om ett ogiltigt värde skickas ger Pydantic ett felmeddelande. ## Skicka och ta emot Se [Modul](module.md) för hur meddelanden skickas med `self.emit_message()` och tas emot med `@on_message`.