Skip to content

Instantly share code, notes, and snippets.

@lizhineng
Last active July 19, 2023 10:48
Show Gist options
  • Save lizhineng/985c901097e1c56d8db0d79ee0bf422d to your computer and use it in GitHub Desktop.
Save lizhineng/985c901097e1c56d8db0d79ee0bf422d to your computer and use it in GitHub Desktop.
HomeBridge MQTT Thing Codec for ClearGrass CSG1 (AIRMX VERSION)
// The threshold to determine whether the battery is low
const LOW_BATTERY_THRESHOLD = 20
// The factor to convert TVOC in ppb to μg/m3
// @see https://leeduser.buildinggreen.com/content/my-device-measures-tvoc-ppb-units-how-do-i-convert-measurements-gm3
const TVOC_CONVERSION_FACTOR = 3.767
module.exports = {
init() {
return {
properties: {
batteryLevel: {
decode(message) {
let { data } = JSON.parse(message)
return data.battery
}
},
chargingState: {
decode(message) {
let { data } = JSON.parse(message)
return data.battery_state === 'discharge'
? 'NOT_CHARGING'
: 'CHARGING'
}
},
// {@link https://developers.homebridge.io/#/characteristic/StatusLowBattery}
statusLowBattery: {
decode(message) {
let { data } = JSON.parse(message)
return +(data.battery <= LOW_BATTERY_THRESHOLD)
}
},
airQuality: {
decode(message) {
const { data } = JSON.parse(message)
const value = data.pm25
if (value <= 12) {
return 'EXCELLENT'
} else if (value <= 35) {
return 'GOOD'
} else if (value <= 55) {
return 'FAIR'
}
return 'POOR'
}
},
pm2_5density: {
decode(message) {
const { data } = JSON.parse(message)
return data.pm25
}
},
pm10density: {
decode(message) {
const { data } = JSON.parse(message)
return data.pm100
}
},
carbonDioxideLevel: {
decode(message) {
const { data } = JSON.parse(message)
return data.co2
}
},
VOCDensity: {
decode(message) {
const { data } = JSON.parse(message)
return parseInt(data.tvoc * TVOC_CONVERSION_FACTOR)
}
},
currentTemperature: {
decode(message) {
const { data } = JSON.parse(message)
return data.t / 100
}
},
currentRelativeHumidity: {
decode(message) {
const { data } = JSON.parse(message)
return data.h / 100
}
}
},
encode(message) {
return message
},
decode(message) {
return message
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment