.. Copyright (c) 2026 Contributors to the Eclipse Foundation .. _getting-started: Getting Started with wotpy ========================== wotpy is a Python implementation of the `W3C WoT Runtime and Scripting API `__. It lets you build Things (producers) and Consumers in Python, with built-in protocol bindings for HTTP, WebSockets, MQTT, CoAP, and Zenoh. This guide gets you up and running using the **Smart Coffee Machine** example. By the end you will have a Thing and a Consumer running locally and talking to each other. Installation ------------ Install wotpy from PyPI: .. code-block:: bash pip install wotpy For development — running the examples from the repository — you need a virtual environment with the project installed in editable mode. * Using ``pip``: .. code-block:: bash python3 -m venv .venv .venv/bin/pip install -U -e ".[tests]" * Using ``uv``: .. code-block:: bash uv venv .venv uv sync --extra tests If you have `Taskfile `__ **v3.28 or later** installed, the first two steps can be replaced with ``task venv`` (pip) or ``task uv-venv`` (uv). Running the example ------------------- Open two terminals in the repository root. **Terminal 1 — start the Thing (server)** .. code-block:: bash .venv/bin/python examples/coffee-machine/server.py You should see output similar to:: INFO coffee-machine:server.py Creating WebSocket server on: 9393 INFO coffee-machine:server.py Creating HTTP server on: 9494 INFO coffee-machine:server.py Creating servient with TD catalogue on: 9090 INFO coffee-machine:server.py Starting servient INFO coffee-machine:server.py Exposing and configuring Thing INFO coffee-machine:server.py Smart-Coffee-Machine is ready The server exposes three endpoints: * ``http://localhost:9090`` — Thing Description catalogue (lists all available Things) * ``http://localhost:9494`` — HTTP protocol binding * ``ws://localhost:9393`` — WebSocket protocol binding **Terminal 2 — run the Consumer (client)** The client discovers the Thing's URL automatically from the catalogue, so no manual configuration is needed: .. code-block:: bash .venv/bin/python examples/coffee-machine/client.py What the coffee machine exposes -------------------------------- The Thing Description defines the following interactions: Properties ^^^^^^^^^^ ============================= ========= ============================================================ Property Type Description ============================= ========= ============================================================ ``allAvailableResources`` object Current percentage of water, milk, chocolate, and coffeeBeans ``possibleDrinks`` array Fixed list of available drink types ``servedCounter`` integer Total number of drinks served so far ``maintenanceNeeded`` boolean Set to ``True`` automatically when ``servedCounter`` > 1000; observable ``schedules`` array List of scheduled drink tasks ============================= ========= ============================================================ Actions ^^^^^^^ ``makeDrink`` Brew a drink. Accepts ``drinkId``, ``size`` (``s``/``m``/``l``), and ``quantity`` (1–5). Defaults to one medium americano if no input is provided. Returns ``{"result": true, "message": "..."}`` on success. ``setSchedule`` Add a recurring or one-off brew schedule. ``time`` (24 h format) and ``mode`` (e.g. ``everyday``, ``everyMo``) are required. Events ^^^^^^ ``outOfResource`` Emitted when a requested drink cannot be made because a resource (water, milk, etc.) has run out. Reading the client output -------------------------- When the client runs successfully you will see log lines showing each interaction in sequence: 1. Read ``allAvailableResources`` (all at 100 %) 2. Write water level down to 80 % and read it back 3. Subscribe to ``maintenanceNeeded`` observable property 4. Invoke ``makeDrink`` for 3 large lattes and log the result 5. Read ``allAvailableResources`` again to see resource consumption 6. Invoke ``setSchedule`` for a daily espresso at 10:00 7. Read ``schedules`` to confirm it was stored 8. Subscribe to the ``outOfResource`` event 9. Wait 60 seconds for any incoming events, then exit Other examples -------------- Each example directory contains a ``README.md`` with setup and run instructions. .. list-table:: :widths: 25 75 :header-rows: 1 * - Example - What it covers * - `coffee-machine `__ - Full producer/consumer pair — properties, actions, events, catalogue discovery *(this guide)* * - `temperature `__ - Server with a custom property read handler, periodic updates, and threshold events * - `subscriber `__ - Generic consumer that subscribes to all observables on any Thing by TD URL * - `cpumonitor `__ - HTTP + WebSocket + MQTT server with environment-variable configuration * - `basic-security-test `__ - Basic auth (username/password) over CoAP * - `bearer-security-test `__ - Bearer token auth over HTTP * - `benchmark `__ - Throughput and latency measurement across protocol bindings Next steps ---------- * :ref:`protocols` — learn how properties, actions, and events map to raw HTTP, WebSocket, MQTT, CoAP, and Zenoh messages * :ref:`authentication` — add security to your Things * :ref:`genindex` — full API reference