NIP-107 ====== Nostr Internet of Things ----------------------------------- `draft` `optional` `author:benarc` `author:blackcoffeebtc` `author:motorina0` ## Rationale The terms/conditions of IoT software/hardware is horrible. A user should be able to message a light or heating system and ask it to turn on/off. Nostr gives the simple, permissionless development environment IoT needs. ## Terms - `user` - user operating IoT devices with NOSTR key-pair and a client made specifically for IoT - `device` - device to operate over Nostr with NOSTR key-pair, using a microcontroller client like nostr-arduino ## Nostr IoT Clients ### User Where the `user` registers 'device'(s) and its keys, then updates the `device`(s). ### Device The `device` uses a client like nostr-arduino to receive commands from the `user` or another `device`. The `device` can also push data such as sensor readings and updates. ## Events A `device` can publish any of the events described in [NIP-91 Event Kinds](https://github.com/nostr-protocol/nips/blob/iot/91.md#event-kinds). A `user` can publish these event kinds: | Kind | | Description | NIP | |---------|----------|-------------------------------|-----------------------------------------------------------------------------------------| | `30107` | `config` | Configure a device | [NIP-107 Configure Device Event](https://github.com/arcbtc/nips/edit/nip_107/107.md#configure-device-event) | | `8000` | `intent` | Trigger an action on a device | [NIP-91 Event Kinds](https://github.com/nostr-protocol/nips/blob/iot/91.md#event-kinds) | | `8001 - 8999` | `data` | Publish the state of a `device` | [NIP-91 Event Kinds](https://github.com/nostr-protocol/nips/blob/iot/91.md#event-kinds) | The content of events can be transmitted in clear text (for public data) or as [NIP-59 Gift Wrap](https://github.com/staab/nips/blob/NIP-59/59.md). ### Configure Device Event (`kind: 30107`) This message is sent by an admin `user` to a `device`. The `device` saves the config locally and then uses it. **Event Content**: ```json { "name": , "description": , "categories":[ ], "admin_pubkeys": [ []], "publish_to_pubkeys":[ []], "intents_from_pubkeys":[ []], "publish_on_change": , "publish_interval": "unix_time": } ``` | Field | Description | |---|---| | `admin_pubkeys` | List of public keys that are allowed to configure this device.
A fresh/blank device will not have this value.
The `admin_pubkeys` implicitly have the `actions_from_pubkeys` permissions. | | `publish_to_pubkeys` | List of public keys to which events are published. | | `actions_from_pubkeys` | List of public keys that are allowed to trigger an action on this device.
The `admin_pubkeys` implicitly have the `actions_from_pubkeys` permissions. | > [!IMPORTANT] > The content of the `30107` event should be encrypted if the user chooses the "encrypted" mode **Event Tags**: ```json "tags": [["d", , ]] ``` Example that turns on a device and sets the temperature to `20.9` degrees Celsius: ```json [[8001, true], [8003, 20.9]] ``` **Event Tags**: ```json "tags": [["p", [!IMPORTANT] > If the transmission mode is encrypted ([NIP-59 Gift Wrap](https://github.com/staab/nips/blob/NIP-59/59.md)) then an individual message must be published for each public key in `publish_to_pubkeys`.