deconz-ts
Asynchronous implementation of the deCONZ REST API in Typescript.
Prerequesites
- RaspBee I or II Zigbee shields for Raspberry Pi or
- Conbee I or II Zigbee USB Gateway
- A working instance of deConz
- node >= 16.13
Installing
NPM: coming soon maybe
From Source:
git clone https://gitlab.com/thallosaurus/deconz-typescript.git
cd deconz-typescript
yarn
Running the development playground:
yarn dev
Documentation
A documentated version of the api of this release is found in the docs folder after running yarn generate:docs
. An auto-generated version that gets uploaded after every push to main can you find at https://thallosaurus.gitlab.io/deconz-typescript/
Visual Studio Code Run Config
A Run-Config for code
is provided in .vscode/launch.json
Pairing?
Automatically (recommended)
The Pairing happens automatically. The script requests an api key from the first gateway it finds if no config.json
file is found. If pairing is successful (alas the link button was pressed on the Web UI) it saves it into the mentioned config.json
file and connects using it.
Manual
Create the config.json
file in the root of the project and fill it with the following content. Change values accordingly:
Via Command-Line
Any program that implements this library should have a --link
option automatically. This overrides the existing config.json
file.
Configuration
For default, the script searches the process.cwd()/config.json
path for the script. Alternativly, if you want to export this to a UNIX executable, override the launch parameter like so:
CONFIG_PATH=/etc/ts-lights/config.conf node index.js
This sets the config variable globally and enables system-wide installation.
The config looks like so:
{
"host":"127.0.0.1:80",
"apikey":"0123456789"
}
Example:
import { getGroups } from "./index";
//You can do es6 async/await...
let d = await getGroups();
for (let group of d) {
let lights = await group.getLights();
lights.forEach((light) => {
if (light.hascolor && light.state.reachable) {
light.state.setState("on", true);
let r = Math.floor(Math.random() * 255);
let g = Math.floor(Math.random() * 255);
let b = Math.floor(Math.random() * 255);
let xy = ColorConverter.rgbToXy(r, g, b);
console.log(light.id, xy);
//...or use .then and .catch
light.state.setState("xy", [xy.x, xy.y]).then(() => {
}).catch(err => {
console.error(err, light);
});
}
})
setTimeout(() => {
lights.forEach(light => {
if (light.state.reachable) {
//Might throw an error if the light is not reachable
light.state.setState("on", false);
}
})
}, 1000);
}
What works/TODO?
- [x] Pairing
- [x] REST Datastructures inconsistencies
- [x] Attributes Setting and Getting
- [x] Lights Power State
- [x] Lights Color
- [x] Groups Power State
- [x] Groups Color
- [x] All Other States (Should work as it is implemented, if not please send a Pull Request)
- [ ] Item Operations (Deleting, creating etc)
- [ ] Rules
- [ ] Scenes
- [ ] Sensors
- [ ] Switches
- [ ] Button Events
- [ ] Touchlink
- [ ] Websocket Listener (Low Prio)