@@ -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