Connected Devices/Projects/Project Link/Taxonomy
Taxonomy Documentation
Github Link: http://fxbox.github.io/taxonomy/doc/foxbox_taxonomy/index.html
Current REST API
Account
- To create account:
- POST http://localhost:3000/users/setup {"email": "a@b.com","username":"admin","password": "00000000"}
- To login:
- POST http://localhost:3000/users/login (Header contains Authorization: Basic <base64 encode of username:password)
Services
Services may requested by selector. A service selector is an object with the following fields:
- (optional) string `id`: accept only a service with a given id;
- (optional) string array of string `tags`: accept only services with all the tags in the array;
- (optional) object or array of objects `getters` (see GetterSelector): accept only services with channels matching all the selectors in this array;
- (optional) object or array of objects `setters` (see SetterSelector): accept only services with channels matching all the selectors in this array.
Generally, except for (de)assigning tags, using an id is considered a bad idea, as this ties the application to a specific device, and this will fail if the device is replaced (consider that this is equivalent to using an IP address instead of a domain name).
List of Services
Example with 1 selector:
- Get services with tag "location: kitchen" and channel kind "OvenTemperature"
- GET http://localhost:3000/api/v1/services { tags: "location: kitchen", setters: { kind: "OvenTemperature" } }
Example with 2 selectors:
- Get services with tag "location: kitchen" or "location: entrance":
- GET http://localhost:3000/api/v1/services [{ tags: "location: kitchen" }, {tags: "location: entrance"}]
As a shortcut, providing no argument will locate all services:
- Get all services:
Tags
- Assign Tags to a service
- POST http://localhost:3000/api/v1/services/tags {"services": selector(s), "tags": tag(s)}
- Remove Tags of a service
- DELETE http://localhost:3000/api/v1/services/tags {"services": selector(s), "tags": tag(s)}
- Example
- POST http://localhost:3000/api/v1/services/tags {"services":[{"id":"thinkerbell-root-service"}],"tags":["Living Room"] }
Channels
Channels are designed to be used by selector.
A selector is an object with the following fields:
- (optional) string id: accept only a channel with a given id;
- (optional) string `service`: accept only channels of a service with a given id;
- (optional) string|array of string `tags`: accept only channels with all the tags in the array;
- (optional) string|array of string `service_tags`: accept only channels of a service with all the tags in the array;
- (optional) string|object `kind` (see ChannelKind): accept only channels of a given kind.
While each field is optional, at least one field must be provided.
Generally, except for (de)assigning tags, using an id is considered a bad idea, as this ties the application to a specific device, and this will fail if the device is replaced (consider that this is equivalent to using an IP address instead of a domain name).
Fetching
- Fetch values from all channels matching any of the selectors
- PUT http://localhost:3000/api/v1/channels/get selector(s)
Example:
- PUT http://localhost:3000/api/v1/channels/get [{"tags": "location: entrance", kind: "OpenClosed"}
Sending
- Send one values to all channels matching any of the selectors:
PUT http://localhost:3000/api/v1/channels/set {"select": selector(s), "value": value}
or
- Send a bunch of values to all channels matching any of the selectors:
PUT http://localhost:3000/api/v1/channels/set [{"select": selector(s), "value": value}, {"select": selector(s), "value: value}, ...]
See http://fxbox.github.io/taxonomy/doc/foxbox_taxonomy/values/enum.Value.html for the full documentation on values.
Example (with CURL)
The following snippet displays "Hello world" on all the devices that support Log, in particular the console.
curl -X PUT http://localhost:3000/api/v1/channels/set -d '{"select":{"kind":"Log"},"value":{"String":"Hello, world"}}'
Tags
- Assign Tags to a channel
- POST http://localhost:3000/api/v1/channels/getter/tags {"getter": selector(s), "tags": tag(s)}
- POST http://localhost:3000/api/v1/channels/setter/tags {"setter": selector(s), "tags": tag(s)}
- Remove Tags of a channel
- DELETE http://localhost:3000/api/v1/channels/getter/tags {"getter": selector(s), "tags": tag(s)}
- DELETE http://localhost:3000/api/v1/channels/setter/tags {"setter": selector(s), "tags": tag(s)}
Specific services and channels
Time
- Get the current time
- PUT http://localhost:3000/api/v1/channels/get {"kind":"CurrentTime"}
- PUT http://localhost:3000/api/v1/channels/get {"kind":"CurrentTimeOfDay"}
Camera
- Take a picture with camera
- PUT http://localhost:3000/api/v1/channels/set {"select": {"id": "setter:snapshot.ae67e622-7a66-465e-bab0-28107b2df980@link.mozilla.org"}, "value": {"Unit": {}}}
- Get list of images taken
- PUT http://localhost:3000/api/v1/channels/get {"id":"getter:image_list.ae67e622-7a66-465e-bab0-28107b2df980@link.mozilla.org"}
- Download the last taken picture
- PUT http://localhost:3000/api/v1/channels/get {"id":"getter:image_newest.ae67e622-7a66-465e-bab0-28107b2df980@link.mozilla.org"}
- Get list of services that can take image (snapshot)
- POST http://localhost:3000/api/v1/services {"setters":[{"kind":{"adapter":"Adapter","kind":"snapshot","type": "Json", "vendor":"DLink"} }]}
Recipe
A recipe is a set of *rules*.
Each rule is triggered when *all* its *conditions* are true. A condition is specified by a set of channels to watch and a range of values that make it true - the condition becomes true once *any* of the channels it watches provides a value that fits the range.
Once a rule is triggered, it *executes*. An execution sends one value to a set of channels.
Once a rule is triggered, it won't be triggered again until at least one of the conditions has become false and true again.
Format:
{ rules: one or more of { conditions: one or more of { source: one or more of Selectors (see section on channels) kind: see documentation of channel kinds range: see documentation of ranges duration: (optional) floating point number of seconds } execute: one or more of { destination: one or more Selectors (see section on channels) kind: see documentation of channel kinds value: see documentation of values } } }
- Send Recipe
To Be Documented: Use channel selector {"kind": "AddThinkerbellRule"}.
Example:
PUT http://localhost:3000/api/v1/channels/set { "select":{ "kind":"AddThinkerbellRule" }, "value":{ "ThinkerbellRule":{ "name":"Hello, Thinkerbell", "source":"{\"rules\":[{\"conditions\":[{\"source\":[{\"id\":\"OpenZWave/72057594126794752 (Sensor)\"}],\"kind\":\"OpenClosed\",\"range\":{\"Eq\":{\"OpenClosed\":\"Open\"}}}],\"execute\":[{\"destination\":[{\"kind\":\"Log\"}],\"kind\":\"Log\",\"value\":{\"String\":\"Closed\"}}]}]}" } } }
- List available Recipes
To Be Documented: Use service selector {"getters": {"kind": "ThinkerbellRuleSource"}}}.
Example:
POST http://localhost:3000/api/v1/services HTTP/1.1 {"getters": [{"kind": "ThinkerbellRuleSource"}]}
WebPush
- Add push subscription
- PUT http://localhost:3000/api/v1/channels/set {"select": {"id": "setter:subscribe.webpush@link.mozilla.org"}, "value": {"Json": {“subscriptions”:[{“push_uri”:”http://push.service/t54wtresfesfd”,”public_key”:”base64_encoded_key”}]}}}
- Remove push subscription
- PUT http://localhost:3000/api/v1/channels/set {"select": {"id": "setter:unsubscribe.webpush@link.mozilla.org"}, "value": {"Json": {“subscriptions”:[{“push_uri”:”http://push.service/t54wtresfesfd”,”public_key”:”base64_encoded_key”}]}}}
- Set resources to receive notifications on
- PUT http://localhost:3000/api/v1/channels/set {"select": {"id": "setter:resource.webpush@link.mozilla.org"}, "value": {"Json": {“resources”:[“res1”, “res2”]}}}
- Get current subscriptions
- PUT http://localhost:3000/api/v1/channels/get {"select": {"id": "getter:subscription.webpush@link.mozilla.org"}, "value": {"Json": {}}}
- Get current resources receiving notifications on
- PUT http://localhost:3000/api/v1/channels/get {"select": {"id": "getter:resource.webpush@link.mozilla.org"}, "value": {"Json": {}}}
- Trigger notification
- PUT http://localhost:3000/api/v1/channels/set {"select": {"id": "setter:notify.webpush@link.mozilla.org"}, "value": {"Json": {“resource”:“res1”,”message”:”push_message_data”}}}