@@ -76,16 +76,26 @@ class SwitchbotAdvertising {
7676
7777 if ( model === 'H' ) { // WoHand
7878 sd = this . _parseServiceDataForWoHand ( buf , onlog ) ;
79- } else if ( model === 'e' ) { // WoHumi
80- sd = this . _parseServiceDataForWoHumi ( buf , onlog ) ;
8179 } else if ( model === 'T' ) { // WoSensorTH
8280 sd = this . _parseServiceDataForWoSensorTH ( buf , onlog ) ;
83- } else if ( model === 'c ' ) { // WoCurtain
84- sd = this . _parseServiceDataForWoCurtain ( buf , onlog ) ;
81+ } else if ( model === 'e ' ) { // WoHumi
82+ sd = this . _parseServiceDataForWoHumi ( buf , onlog ) ;
8583 } else if ( model === 's' ) { // WoMotion
8684 sd = this . _parseServiceDataForWoPresence ( buf , onlog ) ;
8785 } else if ( model === 'd' ) { // WoContact
8886 sd = this . _parseServiceDataForWoContact ( buf , onlog ) ;
87+ } else if ( model === 'c' ) { // WoCurtain
88+ sd = this . _parseServiceDataForWoCurtain ( buf , onlog ) ;
89+ } else if ( model === 'u' ) { // WoColorBulb
90+ sd = this . _parseServiceDataForWoColorBulb ( buf , onlog ) ;
91+ } else if ( model === 'g' ) { // WoPlugMini
92+ sd = this . _parseServiceDataForWoPlugMini ( buf , onlog ) ;
93+ } else if ( model === 'o' ) { // WoSmartLock
94+ sd = this . _parseServiceDataForWoSmartLock ( buf , onlog ) ;
95+ } else if ( model === 'i' ) { // WoMeterPlus
96+ sd = this . _parseServiceDataForWoSensorTHPlus ( buf , onlog ) ;
97+ } else if ( model === 'r' ) { // WoLEDStripLight
98+ sd = this . _parseServiceDataForWoLEDStripLight ( buf , onlog ) ;
8999 } else {
90100 if ( onlog && typeof onlog === 'function' ) {
91101 onlog ( `[parseAdvertising.${ peripheral . id } ] return null, model "${ model } " not available!` ) ;
@@ -152,34 +162,6 @@ class SwitchbotAdvertising {
152162 return data ;
153163 }
154164
155- _parseServiceDataForWoHumi ( buf , onlog ) {
156- if ( buf . length !== 8 ) {
157- if ( onlog && typeof onlog === 'function' ) {
158- onlog ( `[_parseServiceDataForWoHumi] Buffer length ${ buf . length } !== 8!` ) ;
159- }
160- return null ;
161- }
162- let byte1 = buf . readUInt8 ( 1 ) ;
163- // let byte2 = buf.readUInt8(2);
164- let byte3 = buf . readUInt8 ( 3 ) ;
165- let byte4 = buf . readUInt8 ( 4 ) ;
166- let byte5 = buf . readUInt8 ( 5 ) ;
167-
168- let onState = ( byte1 & 0b10000000 ) ? true : false ; // 1 - on
169- let autoMode = ( byte4 & 0b10000000 ) ? true : false ; // 1 - auto
170- let percentage = byte4 & 0b01111111 ; // 0-100%, 101/102/103 - Quick gear 1/2/3
171-
172- let data = {
173- model : 'e' ,
174- modelName : 'WoHumi' ,
175- onState : onState ,
176- autoMode : autoMode ,
177- percentage : autoMode ? 0 : percentage ,
178- } ;
179-
180- return data ;
181- }
182-
183165 _parseServiceDataForWoSensorTH ( buf , onlog ) {
184166 if ( buf . length !== 6 ) {
185167 if ( onlog && typeof onlog === 'function' ) {
@@ -212,6 +194,34 @@ class SwitchbotAdvertising {
212194 return data ;
213195 }
214196
197+ _parseServiceDataForWoHumi ( buf , onlog ) {
198+ if ( buf . length !== 8 ) {
199+ if ( onlog && typeof onlog === 'function' ) {
200+ onlog ( `[_parseServiceDataForWoHumi] Buffer length ${ buf . length } !== 8!` ) ;
201+ }
202+ return null ;
203+ }
204+ let byte1 = buf . readUInt8 ( 1 ) ;
205+ // let byte2 = buf.readUInt8(2);
206+ let byte3 = buf . readUInt8 ( 3 ) ;
207+ let byte4 = buf . readUInt8 ( 4 ) ;
208+ let byte5 = buf . readUInt8 ( 5 ) ;
209+
210+ let onState = ( byte1 & 0b10000000 ) ? true : false ; // 1 - on
211+ let autoMode = ( byte4 & 0b10000000 ) ? true : false ; // 1 - auto
212+ let percentage = byte4 & 0b01111111 ; // 0-100%, 101/102/103 - Quick gear 1/2/3
213+
214+ let data = {
215+ model : 'e' ,
216+ modelName : 'WoHumi' ,
217+ onState : onState ,
218+ autoMode : autoMode ,
219+ percentage : autoMode ? 0 : percentage ,
220+ } ;
221+
222+ return data ;
223+ }
224+
215225 _parseServiceDataForWoPresence ( buf , onlog ) {
216226 if ( buf . length !== 6 ) {
217227 if ( onlog && typeof onlog === 'function' ) {
@@ -303,6 +313,129 @@ class SwitchbotAdvertising {
303313
304314 return data ;
305315 }
316+
317+ _parseServiceDataForWoColorBulb ( buf , onlog ) {
318+ if ( buf . length !== 6 ) {
319+ if ( onlog && typeof onlog === 'function' ) {
320+ onlog ( `[_parseServiceDataForWoColorBulb] Buffer length ${ buf . length } !== 6!` ) ;
321+ }
322+ return null ;
323+ }
324+ let byte1 = buf . readUInt8 ( 1 ) ;
325+ let byte2 = buf . readUInt8 ( 2 ) ;
326+ // let byte3 = buf.readUInt8(3);
327+ // let byte4 = buf.readUInt8(4);
328+ let byte5 = buf . readUInt8 ( 5 ) ;
329+
330+ let data = {
331+ model : 'u' ,
332+ modelName : 'WoColorBulb' ,
333+ } ;
334+
335+ return data ;
336+ }
337+
338+ _parseServiceDataForWoPlugMini ( buf , onlog ) {
339+ if ( buf . length !== 6 ) {
340+ if ( onlog && typeof onlog === 'function' ) {
341+ onlog ( `[_parseServiceDataForWoPlugMini] Buffer length ${ buf . length } !== 6!` ) ;
342+ }
343+ return null ;
344+ }
345+ let byte1 = buf . readUInt8 ( 1 ) ;
346+ let byte2 = buf . readUInt8 ( 2 ) ;
347+ // let byte3 = buf.readUInt8(3);
348+ // let byte4 = buf.readUInt8(4);
349+ let byte5 = buf . readUInt8 ( 5 ) ;
350+
351+ let data = {
352+ model : 'g' ,
353+ modelName : 'WoPlugMini' ,
354+ } ;
355+
356+ return data ;
357+ }
358+
359+ _parseServiceDataForWoSmartLock ( buf , onlog ) {
360+ if ( buf . length !== 6 ) {
361+ if ( onlog && typeof onlog === 'function' ) {
362+ onlog ( `[_parseServiceDataForWoSmartLock] Buffer length ${ buf . length } !== 6!` ) ;
363+ }
364+ return null ;
365+ }
366+ let byte1 = buf . readUInt8 ( 1 ) ;
367+ let byte2 = buf . readUInt8 ( 2 ) ;
368+ // let byte3 = buf.readUInt8(3);
369+ // let byte4 = buf.readUInt8(4);
370+ let byte5 = buf . readUInt8 ( 5 ) ;
371+
372+ //let pirState = (byte1 & 0b01000000) ? true : false; // 1 - Movement detected
373+ let battery = byte2 & 0b01111111 ; // %
374+ //let lightLevel = byte5 & 0b00000011;
375+
376+ let data = {
377+ model : 'o' ,
378+ modelName : 'WoSmartLock' ,
379+ //movement: pirState,
380+ battery : battery ,
381+ //lightLevel: (lightLevel == 1) ? 'dark' : ((lightLevel == 2) ? 'bright' : 'unknown'),
382+ } ;
383+
384+ return data ;
385+ }
386+
387+ _parseServiceDataForWoSensorTHPlus ( buf , onlog ) {
388+ if ( buf . length !== 6 ) {
389+ if ( onlog && typeof onlog === 'function' ) {
390+ onlog ( `[_parseServiceDataForWoSensorTHPlus] Buffer length ${ buf . length } !== 6!` ) ;
391+ }
392+ return null ;
393+ }
394+ let byte2 = buf . readUInt8 ( 2 ) ;
395+ let byte3 = buf . readUInt8 ( 3 ) ;
396+ let byte4 = buf . readUInt8 ( 4 ) ;
397+ let byte5 = buf . readUInt8 ( 5 ) ;
398+
399+ let temp_sign = ( byte4 & 0b10000000 ) ? 1 : - 1 ;
400+ let temp_c = temp_sign * ( ( byte4 & 0b01111111 ) + ( byte3 / 10 ) ) ;
401+ let temp_f = ( temp_c * 9 / 5 ) + 32 ;
402+ temp_f = Math . round ( temp_f * 10 ) / 10 ;
403+
404+ let data = {
405+ model : 'i' ,
406+ modelName : 'WoSensorTHPlus' ,
407+ temperature : {
408+ c : temp_c ,
409+ f : temp_f
410+ } ,
411+ fahrenheit : ( byte5 & 0b10000000 ) ? true : false ,
412+ humidity : byte5 & 0b01111111 ,
413+ battery : ( byte2 & 0b01111111 )
414+ } ;
415+
416+ return data ;
417+ }
418+
419+ _parseServiceDataForWoLEDStripLight ( buf , onlog ) {
420+ if ( buf . length !== 6 ) {
421+ if ( onlog && typeof onlog === 'function' ) {
422+ onlog ( `[_parseServiceDataForWoLEDStripLight] Buffer length ${ buf . length } !== 6!` ) ;
423+ }
424+ return null ;
425+ }
426+ let byte1 = buf . readUInt8 ( 1 ) ;
427+ let byte2 = buf . readUInt8 ( 2 ) ;
428+ // let byte3 = buf.readUInt8(3);
429+ // let byte4 = buf.readUInt8(4);
430+ let byte5 = buf . readUInt8 ( 5 ) ;
431+
432+ let data = {
433+ model : 'r' ,
434+ modelName : 'WoLEDStripLight' ,
435+ } ;
436+
437+ return data ;
438+ }
306439}
307440
308441module . exports = new SwitchbotAdvertising ( ) ;
0 commit comments