Skip to content

Commit caead06

Browse files
authored
support current Meter Pro CO2 with firmware 1.6 (#293)
1 parent bd44206 commit caead06

File tree

1 file changed

+48
-23
lines changed

1 file changed

+48
-23
lines changed

src/device.ts

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2763,34 +2763,59 @@ export class WoSensorTHProCO2 extends SwitchbotDevice {
27632763
manufacturerData: Buffer,
27642764
emitLog: (level: string, message: string) => void,
27652765
): Promise<meterProCO2ServiceData | null> {
2766-
if (serviceData.length !== 7) {
2767-
emitLog('debugerror', `[parseServiceData] Buffer length ${serviceData.length} !== 7!`)
2766+
if (serviceData.length !== 7 && serviceData.length !== 3) {
2767+
emitLog('debugerror', `[parseServiceData] Buffer length ${serviceData.length} !== 3 or 7!`)
27682768
return null
27692769
}
27702770

2771-
const [byte2, byte3, byte4, byte5, byte6] = [
2772-
serviceData.readUInt8(2),
2773-
serviceData.readUInt8(3),
2774-
serviceData.readUInt8(4),
2775-
serviceData.readUInt8(5),
2776-
manufacturerData.readUInt16BE(6),
2777-
]
2778-
const tempSign = byte4 & 0b10000000 ? 1 : -1
2779-
const tempC = tempSign * ((byte4 & 0b01111111) + (byte3 & 0b00001111) / 10)
2780-
const tempF = Math.round(((tempC * 9) / 5 + 32) * 10) / 10
2771+
if (serviceData.length === 7) {
2772+
const [byte2, byte3, byte4, byte5, byte6] = [
2773+
serviceData.readUInt8(2),
2774+
serviceData.readUInt8(3),
2775+
serviceData.readUInt8(4),
2776+
serviceData.readUInt8(5),
2777+
manufacturerData.readUInt16BE(6),
2778+
]
2779+
const tempSign = byte4 & 0b10000000 ? 1 : -1
2780+
const tempC = tempSign * ((byte4 & 0b01111111) + (byte3 & 0b00001111) / 10)
2781+
const tempF = Math.round(((tempC * 9) / 5 + 32) * 10) / 10
27812782

2782-
const data = {
2783-
model: SwitchBotBLEModel.MeterProCO2,
2784-
modelName: SwitchBotBLEModelName.MeterProCO2,
2785-
modelFriendlyName: SwitchBotBLEModelFriendlyName.MeterProCO2,
2786-
celsius: tempC,
2787-
fahrenheit: tempF,
2788-
fahrenheit_mode: !!(byte5 & 0b10000000),
2789-
humidity: byte5 & 0b01111111,
2790-
battery: byte2 & 0b01111111,
2791-
co2: byte6,
2783+
return {
2784+
model: SwitchBotBLEModel.MeterProCO2,
2785+
modelName: SwitchBotBLEModelName.MeterProCO2,
2786+
modelFriendlyName: SwitchBotBLEModelFriendlyName.MeterProCO2,
2787+
celsius: tempC,
2788+
fahrenheit: tempF,
2789+
fahrenheit_mode: !!(byte5 & 0b10000000),
2790+
humidity: byte5 & 0b01111111,
2791+
battery: byte2 & 0b01111111,
2792+
co2: byte6,
2793+
} as meterProCO2ServiceData
2794+
}
2795+
else {
2796+
const [mdByte10, mdByte11, mdByte12] = [
2797+
manufacturerData.readUInt8(10),
2798+
manufacturerData.readUInt8(11),
2799+
manufacturerData.readUInt8(12),
2800+
]
2801+
const sdByte2 = serviceData.readUInt8(2)
2802+
2803+
const tempSign = mdByte11 & 0b10000000 ? 1 : -1
2804+
const tempC = tempSign * ((mdByte11 & 0b01111111) + (mdByte10 & 0b00001111) / 10)
2805+
const tempF = Math.round(((tempC * 9) / 5 + 32) * 10) / 10
2806+
2807+
return {
2808+
model: SwitchBotBLEModel.MeterProCO2,
2809+
modelName: SwitchBotBLEModelName.MeterProCO2,
2810+
modelFriendlyName: SwitchBotBLEModelFriendlyName.MeterProCO2,
2811+
celsius: tempC,
2812+
fahrenheit: tempF,
2813+
fahrenheit_mode: !!(mdByte12 & 0b10000000),
2814+
humidity: mdByte12 & 0b01111111,
2815+
battery: sdByte2 & 0b01111111,
2816+
co2: manufacturerData.readUInt16BE(15),
2817+
} as meterProCO2ServiceData
27922818
}
2793-
return data as meterProCO2ServiceData
27942819
}
27952820
}
27962821

0 commit comments

Comments
 (0)