update README, add geyser sample (as per quickstart in README)

This commit is contained in:
Chris Oloff 2025-12-15 13:34:44 +02:00
parent b52e70e918
commit 39a17e688b
2 changed files with 65 additions and 8 deletions

View file

@ -1,8 +1,42 @@
# Watt42 Viewlib # Watt42 Viewlib
Supports building a view for Watt42 systems. Watt42 Viewlib supports building browser-based front ends for Watt42 systems.
The purpose of those front ends is to visualize the state of a Watt42 system,
and to allow users to interact with it.
## Prerequisites # Quickstart
Given a Watt42 system that exposes the status of a smart device (`is_geyser_on`
is either `true` or `false`), the following code creates a simple view that
shows the status of the device.
```python
import os
import panel
from typing import Any
from watt42_viewlib import attach_w42_state
SYSTEM_ID = os.environ.get("WATT42_SYSTEM_ID", "invalid-system-id")
API_TOKEN = os.environ.get("WATT42_API_TOKEN", "invalid-api-token")
w42_state = panel.rx(None)
attach_w42_state(rx_var=w42_state, system_id=SYSTEM_ID, token=API_TOKEN)
def get_geyser_state(state: dict[str, Any]) -> bool:
if not state:
return False
return state.get("is_geyser_on", False)
geyser_state = panel.rx(get_geyser_state)(w42_state)
indicator = panel.indicators.BooleanStatus(value=geyser_state, name="W42 Connected", color="success")
_ = indicator.servable()
```
# Prerequisites
You should be familiar with Python. You should be familiar with Python.
@ -10,15 +44,15 @@ You need poetry installed:
- [Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer) - [Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer)
## Demo # Demo
You can [run the sample online](https://viewlib-demo.watt42.com). The sample code is in [sample.py](./sample.py). You can [run the sample online](https://viewlib-demo.watt42.com). The sample code is in [sample.py](./sample.py).
TODO: provide more sophisticated demos online. TODO: publish demo, provide more sophisticated demos online.
## Documentation # Documentation
### Installation ## Installation
Make sure you have poetry installed (see above), then run: Make sure you have poetry installed (see above), then run:
@ -40,7 +74,7 @@ Your view will be available at `http://localhost:5006/sample`. In order for the
view to work, you need to configure an access token, and the Watt42 system that view to work, you need to configure an access token, and the Watt42 system that
you want to use. See #how-to-use below. you want to use. See #how-to-use below.
### How to use ## How to use
Build your own front end for a Watt42 system by creating a Python script that Build your own front end for a Watt42 system by creating a Python script that
uses Viewlib. Start off with the sample code in [sample.py](./sample.py). You uses Viewlib. Start off with the sample code in [sample.py](./sample.py). You
@ -53,7 +87,7 @@ can then extend the view by adding more widgets and logic.
- `WATT42_API_TOKEN`: Your access token. - `WATT42_API_TOKEN`: Your access token.
### Howtos ## Howtos
- See above on how to use Viewlib to build your own view. - See above on how to use Viewlib to build your own view.
- [How to add a diagram](https://source.c3.uber5.com/watt42-public/watt42_viewlib/src/branch/main/docs/howto_add_diagram.md) - [How to add a diagram](https://source.c3.uber5.com/watt42-public/watt42_viewlib/src/branch/main/docs/howto_add_diagram.md)

23
geyser_on_off.py Normal file
View file

@ -0,0 +1,23 @@
import os
import panel
from typing import Any
from watt42_viewlib import attach_w42_state
SYSTEM_ID = os.environ.get("WATT42_SYSTEM_ID", "invalid-system-id")
API_TOKEN = os.environ.get("WATT42_API_TOKEN", "invalid-api-token")
w42_state = panel.rx(None)
attach_w42_state(rx_var=w42_state, system_id=SYSTEM_ID, token=API_TOKEN)
def get_geyser_state(state: dict[str, Any]) -> bool:
if not state:
return False
return state.get("is_geyser_on", False)
geyser_state = panel.rx(get_geyser_state)(w42_state)
indicator = panel.indicators.BooleanStatus(value=geyser_state, name="W42 Connected", color="success")
_ = indicator.servable()