Skip to content

Instantly share code, notes, and snippets.

@spddl
Created November 28, 2020 20:36
Show Gist options
  • Save spddl/299e0a4832b903fb824e1ade3d05751c to your computer and use it in GitHub Desktop.
Save spddl/299e0a4832b903fb824e1ade3d05751c to your computer and use it in GitHub Desktop.
const { exec } = require('child_process')
const sensor = require('node-dht-sensor').promises
const WebSocketClient = require('./WebSocketClient')
const FormatDate = require('./FormatDate')
const { readFileSync } = require('fs')
const data = JSON.parse(readFileSync('config', 'utf8'))
const wsc = new WebSocketClient('wss://smarthome.spddl.de/')
const interval = 60 // sek
let lastConnect = 0
let lastDisconnect = 0
let lastStatus = { type: 'rpizero', value: { wLan: 0, time: 0, temp: '0', humidity: '0' } }
wsc.onopen = () => {
// console.log(FormatDate(), 'onOpen')
lastConnect = Date.now()
// console.log(FormatDate(), `wsc.send(${JSON.stringify({ type: 'rpizero', value: { lastConnect, lastDisconnect, lastConnectFormat: FormatDate(lastConnect), lastDisconnectFormat: FormatDate(lastDisconnect) } })}`)
wsc.send(JSON.stringify({ type: 'rpizero', value: { lastConnect, lastDisconnect, lastConnectFormat: FormatDate(lastConnect), lastDisconnectFormat: FormatDate(lastDisconnect) } }))
if (lastStatus.value.time !== 0) {
// console.log(FormatDate(), `wsc.send(${JSON.stringify(lastStatus)})`)
wsc.send(JSON.stringify(lastStatus))
}
}
wsc.onerror = () => {
// console.log(FormatDate(), 'onError')
lastDisconnect = Date.now()
}
const execPromise = cmd => {
return new Promise(resolve => {
exec(cmd, (err, stdout, stderr) => {
resolve({ err, stdout, stderr })
})
})
}
// LOOP
setInterval(async () => {
Promise.all([
execPromise("awk 'NR==3 {print $3}' /proc/net/wireless"),
sensor.read(22, 4)
])
.then(output => {
const wLan = Number(output[0].stdout)
const sensor = output[1]
const time = Date.now()
const status = { type: 'rpizero', value: { wLan, time, roomid: data.id, temp: sensor.temperature.toFixed(1), humidity: sensor.humidity.toFixed(1) } }
if (status.value.wLan !== lastStatus.value.wLan || status.value.temp !== lastStatus.value.temp || status.value.humidity !== lastStatus.value.humidity) {
// console.log(FormatDate(), `wsc.send(${JSON.stringify(status)})`)
wsc.send(JSON.stringify(status))
lastStatus = status
}
}).catch(reason => {
console.warn(FormatDate(), 'catch', reason)
})
}, interval * 1000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment