function Decoder(bytes, port) { // Decode an uplink message from a buffer // (array) of bytes to an object of fields. var decoded = {}; // if (port === 1) decoded.led = bytes[0]; if (bytes[0]===0x73) { adr=1; //Binary Outputs decoded.O1=bytes[adr]&1; decoded.O2=(bytes[adr]>>1)&1; decoded.O3=(bytes[adr]>>2)&1; decoded.O4=(bytes[adr]>>3)&1; decoded.O5=(bytes[adr]>>4)&1; decoded.O6=(bytes[adr]>>5)&1; decoded.O7=(bytes[adr]>>6)&1; decoded.O8=(bytes[adr]>>7)&1; adr++; decoded.O9=bytes[adr]&1; decoded.O10=(bytes[adr]>>1)&1; decoded.O11=(bytes[adr]>>2)&1; decoded.O12=(bytes[adr]>>3)&1; decoded.O13=(bytes[adr]>>4)&1; decoded.O14=(bytes[adr]>>5)&1; decoded.O15=(bytes[adr]>>6)&1; decoded.O16=(bytes[adr]>>7)&1; adr++; //Binary Inputs decoded.I1=bytes[adr]&1; decoded.I2=(bytes[adr]>>1)&1; decoded.I3=(bytes[adr]>>2)&1; decoded.I4=(bytes[adr]>>3)&1; decoded.I5=(bytes[adr]>>4)&1; decoded.I6=(bytes[adr]>>5)&1; decoded.I7=(bytes[adr]>>6)&1; decoded.I8=(bytes[adr]>>7)&1; adr++; decoded.I9=bytes[adr]&1; decoded.I10=(bytes[adr]>>1)&1; decoded.I11=(bytes[adr]>>2)&1; decoded.I12=(bytes[adr]>>3)&1; decoded.I13=(bytes[adr]>>4)&1; decoded.I14=(bytes[adr]>>5)&1; decoded.I15=(bytes[adr]>>6)&1; //pressure_temp_humidity_airquality data received BOSCH decoded.I16=(bytes[adr]>>7)&1; decoded.bPATHAv= (bytes[adr]>>6)&1; //Available data in current decoded.hPPM = (bytes[adr]>>7)&1; //Available data in current adr++; //ADC Inputs decoded.ADC1=(bytes[adr]<<8)+bytes[adr+1];adr+=2; decoded.ADC2=(bytes[adr]<<8)+bytes[adr+1];adr+=2; decoded.ADC3=(bytes[adr]<<8)+bytes[adr+1];adr+=2; decoded.ADC4=(bytes[adr]<<8)+bytes[adr+1];adr+=2; ADC5=(bytes[adr]<<8)+bytes[adr+1];adr+=2; ADC6=(bytes[adr]<<8)+bytes[adr+1];adr+=2; if (decoded.hPPM===1) { decoded.PPM25=ADC5; decoded.PPM10=ADC6; } else { decoded.ADC5=ADC5; decoded.ADC6=ADC6; } decoded.ADC7=(bytes[adr]<<8)+bytes[adr+1];adr+=2; decoded.ADC8=(bytes[adr]<<8)+bytes[adr+1];adr+=2; //Dimmers (PWM Outputs) or 16B Nonvolatile Counters count1=(bytes[adr]<<8)|bytes[adr+1]; dimm1=bytes[adr++]; dimm2=bytes[adr++]; count2=(bytes[adr]<<8)|bytes[adr+1]; dimm3=bytes[adr++]; dimm4=bytes[adr++]; count3=(bytes[adr]<<8)|bytes[adr+1]; dimm5=bytes[adr++]; dimm6=bytes[adr++]; count4=(bytes[adr]<<8)|bytes[adr+1]; dimm7=bytes[adr++]; dimm8=bytes[adr++]; decoded.RSSI=bytes[adr++]; decoded.SNR=bytes[adr++]; //Nonvolatile Counter 32B Nr1 CounterL1=bytes[adr++]<<24; CounterL1+=bytes[adr++]<<16; CounterL1+=bytes[adr++]<<8; CounterL1+=bytes[adr++]; //Nonvolatile Counter 32B Nr2 CounterL2=bytes[adr++]<<24; CounterL2+=bytes[adr++]<<16; CounterL2+=bytes[adr++]<<8; CounterL2+=bytes[adr++]; RTemp=bytes[adr++]<<8; RTemp+=bytes[adr++]; RPressure=bytes[adr++]<<8; RPressure+=bytes[adr++]; RAxX=bytes[adr++]<<8; RAxX+=bytes[adr++]; RAxY=bytes[adr++]<<8; RAxY+=bytes[adr++]; RAxZ=bytes[adr++]<<8; RAxZ+=bytes[adr++]; RMagnX=bytes[adr++]<<8; RMagnX+=bytes[adr++]; RMagnY=bytes[adr++]<<8; RMagnY+=bytes[adr++]; RMagnZ=bytes[adr++]<<8; RMagnZ+=bytes[adr++]; RColorR=bytes[adr++]<<8; RColorR+=bytes[adr++]; RColorG=bytes[adr++]<<8; RColorG+=bytes[adr++]; RColorB=bytes[adr++]<<8; RColorB+=bytes[adr++]; RColorIR=bytes[adr++]<<8; RColorIR+=bytes[adr++]; RColorG2=bytes[adr++]<<8; RColorG2+=bytes[adr++]; RProxX=bytes[adr++]<<8; RProxX+=bytes[adr++]; RAmbientLightL=bytes[adr++]<<8; RAmbientLightL+=bytes[adr++]; RAmbientLightH=bytes[adr++]<<8; RAmbientLightH+=bytes[adr++]; RAvailable=bytes[adr++]; if (RAvailable===53)//'5' { // decoded.rTemp=RTemp; decoded.rPressure=RPressure; //Accelerometr Sensor decoded.rAxX=RAxX; decoded.rAxY=RAxY; decoded.rAxZ=RAxZ; //Magnetic Sensor decoded.rMagnX=RMagnX; decoded.rMagnY=RMagnY; decoded.rMagnZ=RMagnZ; //Color Sensor decoded.rColorR=RColorR; decoded.rColorG=RColorG; decoded.rColorB=RColorB; decoded.rColorIR=RColorIR; decoded.rColorG2=RColorG2; //Proximity decoded.rProxX=RProxX; //Ambient Light decoded.rAmbientLightL=RAmbientLightL; decoded.rAmbientLightH=RAmbientLightH; } if (count4===0x5555) { //measurement Presure, humidity, temperature, air quality decoded.bPATHEn=1; //In Firmware Enabled Sensor decoded.bHumidity=count3; decoded.bTemp1=count1; //adc_temp; decoded.bTemp2=count2; //adc_temp2; decoded.bPressure=CounterL1; decoded.bGas=CounterL2/100; } else { decoded.Count1=count1; decoded.Count2=count2; decoded.Count3=count3; decoded.Count4=count4; decoded.CounterL1=CounterL1; decoded.CounterL2=CounterL2; } } return decoded; }