NIP-107 ====== Nostr Internet of Things ----------------------------------- `draft` `optional` `author:benarc` `author:blackcoffeebtc` ## Rationale The terms/conditions of IoT software/hardware is horrible. A user should be able to message a light or heating and ask it to turn on/off. Nostr gives the simple, permissionless development environment IoT needs. All communication happens over [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md). ## 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. ## `User` OR `device` registering/updating a `user` OR `device` A `device` or a `user` can publish these event kinds: | Kind | | Description | NIP | |---------|------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------| | `4 ` | `direct_message` | Communicate between `device`(s) and `user`(s). The messages can be plain-text or JSON. | [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md) | ### Event: Register a `device` **Event Content**: ```json { "id": , "device_id": , "name": , "description": , "categories":[ ], "users":[ []], } ``` Note: - `users`: - A list that can restrict access to public-keys, `device`(s) also has keys and can be a `user`. ### Event: Update a `device` **Event Content**: ```json { "id": , "device_id": , "settings":[ []] } ``` Note: - `settings`: - Standard `settings` include: - eg: `[["on", ], ["range", ], ["timer_on", ], ["timer_off", ]]`