Websocket Monitor for door sensors
This commit is contained in:
parent
a5725edb36
commit
7a71b0c216
@ -1,2 +1,5 @@
|
|||||||
# `Dec0ntamination`
|
# `Dec0ntamination`
|
||||||
|
|
||||||
|
Uses Node 20
|
||||||
|
|
||||||
|
Takes sensors from deconz and uploads the data to Influx as defined in config.json
|
@ -1,9 +1,10 @@
|
|||||||
{
|
{
|
||||||
"servers": {
|
"servers": {
|
||||||
"deconz": {
|
"deconz": {
|
||||||
"url": "http://zigbee.hacdcserver.org",
|
"url": "zigbee.hacdcserver.org",
|
||||||
"apiKey": "",
|
"apiKey": "",
|
||||||
"clientName": "dec0ntaminator"
|
"clientName": "dec0ntaminator",
|
||||||
|
"websocketPort": 8082
|
||||||
},
|
},
|
||||||
"influx": {
|
"influx": {
|
||||||
"url": "http://influx.hacdc.org",
|
"url": "http://influx.hacdc.org",
|
||||||
@ -20,5 +21,13 @@
|
|||||||
"valueModifier": "1",
|
"valueModifier": "1",
|
||||||
"influxKey": ""
|
"influxKey": ""
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"wsDevices": [
|
||||||
|
{
|
||||||
|
"name": "",
|
||||||
|
"uniqueId": "",
|
||||||
|
"valueKey": "open",
|
||||||
|
"influxKey": "state"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ const axios = require('axios')
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
let config = JSON.parse(fs.readFileSync('config.json', 'utf8'))
|
let config = JSON.parse(fs.readFileSync('config.json', 'utf8'))
|
||||||
|
|
||||||
axios.get(config.servers.deconz.url + '/api/' + config.servers.deconz.apiKey + '/sensors')
|
axios.get(`http://${config.servers.deconz.url}:${config.servers.deconz.apiPort}/api/${config.servers.deconz.apiKey}/sensors`)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
// console.log(response.data)
|
// console.log(response.data)
|
||||||
fs.writeFileSync('devices.json', JSON.stringify(response.data, null, 2))
|
fs.writeFileSync('devices.json', JSON.stringify(response.data, null, 2))
|
||||||
|
@ -24,7 +24,7 @@ if (config.servers.deconz.apiKey.length > 0 && !cli.flags.force) {
|
|||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
axios.post(config.servers.deconz.url + '/api', {
|
axios.post(`http://${config.servers.deconz.url}:${config.servers.deconz.apiPort}/api`, {
|
||||||
devicetype: config.servers.deconz.clientName +'l',
|
devicetype: config.servers.deconz.clientName +'l',
|
||||||
})
|
})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
|
2
index.js
2
index.js
@ -4,7 +4,7 @@ let config = JSON.parse(fs.readFileSync('config.json', 'utf8'))
|
|||||||
|
|
||||||
// name influxKey=data[valueKey],influxKey=data[valueKey],...
|
// name influxKey=data[valueKey],influxKey=data[valueKey],...
|
||||||
|
|
||||||
axios.get(config.servers.deconz.url + '/api/' + config.servers.deconz.apiKey + '/sensors')
|
axios.get(`http://${config.servers.deconz.url}:${config.servers.deconz.apiPort}/api/${config.servers.deconz.apiKey}/sensors`)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
let sensors = response.data
|
let sensors = response.data
|
||||||
let data = []
|
let data = []
|
||||||
|
24
package-lock.json
generated
24
package-lock.json
generated
@ -10,7 +10,8 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.7.9",
|
||||||
"meow": "^13.2.0"
|
"meow": "^13.2.0",
|
||||||
|
"ws": "^8.18.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/asynckit": {
|
"node_modules/asynckit": {
|
||||||
@ -123,6 +124,27 @@
|
|||||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/ws": {
|
||||||
|
"version": "8.18.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
|
||||||
|
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"bufferutil": "^4.0.1",
|
||||||
|
"utf-8-validate": ">=5.0.2"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"bufferutil": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"utf-8-validate": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.7.9",
|
||||||
"meow": "^13.2.0"
|
"meow": "^13.2.0",
|
||||||
|
"ws": "^8.18.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
watcher.js
Normal file
33
watcher.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import axios from 'axios'
|
||||||
|
import WebSocket from 'ws'
|
||||||
|
import fs from 'fs'
|
||||||
|
let config = JSON.parse(fs.readFileSync('config.json', 'utf8'))
|
||||||
|
let ws = new WebSocket(`ws://${config.servers.deconz.url}:${config.servers.deconz.websocketPort}`)
|
||||||
|
|
||||||
|
ws.on('message', msg => {
|
||||||
|
let data = JSON.parse(msg)
|
||||||
|
try {
|
||||||
|
if (data.state) {
|
||||||
|
let device = config.wsDevices.find(device => device.uniqueId === data.uniqueid)
|
||||||
|
if (device) {
|
||||||
|
let influxPayload = `${device.name} ${device.influxKey}=${data.state[device.valueKey]?0:1}`
|
||||||
|
console.log(`${new Date().toString()} 👉🏻 Sending ${influxPayload}`)
|
||||||
|
axios.post(`${config.servers.influx.url}/api/v2/write?orgID=${config.servers.influx.orgId}&bucket=${config.servers.influx.bucket}`,
|
||||||
|
influxPayload,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Token ${config.servers.influx.apiKey}`,
|
||||||
|
'Content-Type': 'text/plain'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).then(response => {
|
||||||
|
console.log(response.data)
|
||||||
|
}).catch(error => {
|
||||||
|
console.error(error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user