---
title: wot-rust dev notes
tags: wp2, blog, published
---
# Introducing wot-rust
As part of the contribution from [Luminem](https://github.com/luminem), we are developing a full implementation of the [Web of Things](https://www.w3.org/WoT/wg/).
We are developing it using [rust](https://rust-lang.org) giving a real-life field-test for the developer guidelines and tools we are co-developing with the [Software Engineering group @ PoliTO](https://github.com/SoftengPoliTo/).
## Web of Things
Web of Things is a set of W3C specification that aim to address a number of shortcomings around **Connected Devices** pretty much in the same way the **Web** specifications solved the problems regarding browser interoperability.
The key concept is that a connected device (in WoT jargon **Thing**) should be fully controllable by having just the knowledge of its **Description**.
A **Thing Description** uses [JSON-LD](https://www.w3.org/TR/json-ld11/) to provide the full information on how to interact with a generic **Thing**, exposing its capability through the concept of **Affordances**.
There are three kind of affordances:
- `Property`, a directly exposed state, that can be directly read or wrote.
- `Action`, a mean to give an arbitrary complex task to the Thing and then get the result of its execution.
- `Event`, an informative message that a Thing may emit at will.
Every Affordance offers information on how to reach the mapped interaction point and how to format data via **Forms** and **DataSchemas**.
It looks like this:
``` json
{
"@context": "https://www.w3.org/2022/wot/td/v1.1",
"id": "urn:dev:ops:32473-WoTLamp-1234",
"title": "MyLampThing",
"securityDefinitions": {
"basic_sc": {"scheme": "basic", "in": "header"}
},
"security": "basic_sc",
"properties": {
"status": {
"type": "string",
"forms": [{"href": "https://mylamp.example.com/status"}]
}
},
"actions": {
"toggle": {
"forms": [{"href": "https://mylamp.example.com/toggle"}]
}
},
"events":{
"overheating":{
"data": {"type": "string"},
"forms": [{
"href": "https://mylamp.example.com/oh",
"subprotocol": "longpoll"
}]
}
}
}
```
And being a **JSON-LD**, its [@context](https://www.w3.org/TR/json-ld11/#the-context) can be used to add additional information and extend its expressivity, e.g supporting additional [protocols](https://w3c.github.io/wot-binding-templates/#protocol-intro) or providing more details.
In [SIFIS-Home](https://sifis-home.eu) we try to make so that every [potential hazard](https://www.sifis-home.eu/ontology) related to the use of a **Connected Device** is evident to the user and the to the system controlling it.
The **Thing Description** can easily use our [hazard ontology](https://www.sifis-home.eu/ontology) by adding it to the `@context`, and any program using it (**Consumer** in WoT jargon) can use or ignore the additional information as it see fit. A SIFIS-Home WoT Device can be still used by any WoT implementation.
## wot-rust
We split our implementation in multiple crates, to keep the different concers [separated](https://en.wikipedia.org/wiki/Separation_of_concerns):
- [wot-td](https://crates.io/crates/wot-td) Only focuses on building, serialising and deserialising the **Thing Descriptions**
- [wot-serve](https://crates.io/crates/wot-serve) Simplifies the creation of the application server that exposes the **Thing** affordances to the world. As the first release we only support HTTP via [axum](https://github.com/tokio-rs/axum).
- [wot-discovery](https://crates.io/crates/wot-discovery) Let you find and keep a Directory of Things available in your network.
- [wot-consume](https://crates.io/crates/wot-consume) Simplifies using a **Thing** by abstracting away as many details as possible. It is the moral dual of **wot-serve** and it is a wrapper around [reqwest](https://crates.io/crates/reqwest).
During the next weeks we'll publish more blogpost about our implementation journey, our interaction with the larger WoT-wg community and how this technology is being used in SIFIS-Home.
## Author
[Luca Barbato](https://github.com/lu-zero) is a long-time Open Source contributor, member of VideoLan, Gentoo, X.org and a few other organizations. He participates in SIFIS-Home with his company, [Luminem SRL](https://luminem.it).