Last active
July 19, 2023 10:48
-
-
Save lizhineng/985c901097e1c56d8db0d79ee0bf422d to your computer and use it in GitHub Desktop.
HomeBridge MQTT Thing Codec for ClearGrass CSG1 (AIRMX VERSION)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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