1+ """ 
2+ Source: https://github.com/simonqbs/cayennelpp-python 
3+ """ 
4+ 
5+ import  struct 
6+ import  math 
7+ 
8+ LPP_DIGITAL_INPUT  =  0          # 1 byte 
9+ LPP_DIGITAL_OUTPUT  =  1         # 1 byte 
10+ LPP_ANALOG_INPUT  =  2           # 2 bytes, 0.01 signed 
11+ LPP_ANALOG_OUTPUT  =  3          # 2 bytes, 0.01 signed 
12+ LPP_LUMINOSITY  =  101           # 2 bytes, 1 lux unsigned 
13+ LPP_PRESENCE  =  102             # 1 byte, 1 
14+ LPP_TEMPERATURE  =  103          # 2 bytes, 0.1°C signed 
15+ LPP_RELATIVE_HUMIDITY  =  104    # 1 byte, 0.5% unsigned 
16+ LPP_ACCELEROMETER  =  113        # 2 bytes per axis, 0.001G 
17+ LPP_BAROMETRIC_PRESSURE  =  115  # 2 bytes 0.1 hPa Unsigned 
18+ LPP_GYROMETER  =  134            # 2 bytes per axis, 0.01 °/s 
19+ LPP_GPS  =  136                  # 3 byte lon/lat 0.0001 °, 3 bytes alt 0.01 meter 
20+ 
21+ # Data ID + Data Type + Data Size 
22+ LPP_DIGITAL_INPUT_SIZE  =  3        # 1 byte 
23+ LPP_DIGITAL_OUTPUT_SIZE  =  3       # 1 byte 
24+ LPP_ANALOG_INPUT_SIZE  =  4         # 2 bytes, 0.01 signed 
25+ LPP_ANALOG_OUTPUT_SIZE  =  4        # 2 bytes, 0.01 signed 
26+ LPP_LUMINOSITY_SIZE  =  4           # 2 bytes, 1 lux unsigned 
27+ LPP_PRESENCE_SIZE  =  3             # 1 byte, 1 
28+ LPP_TEMPERATURE_SIZE  =  4          # 2 bytes, 0.1°C signed 
29+ LPP_RELATIVE_HUMIDITY_SIZE  =  3    # 1 byte, 0.5% unsigned 
30+ LPP_ACCELEROMETER_SIZE  =  8        # 2 bytes per axis, 0.001G 
31+ LPP_BAROMETRIC_PRESSURE_SIZE  =  4  # 2 bytes 0.1 hPa Unsigned 
32+ LPP_GYROMETER_SIZE  =  8            # 2 bytes per axis, 0.01 °/s 
33+ LPP_GPS_SIZE  =  11                 # 3 byte lon/lat 0.0001 °, 3 bytes alt 0.01 meter 
34+ 
35+ class  CayenneLPP :
36+     def  __init__ (self ):
37+         self .buffer  =  bytearray ()
38+ 
39+     def  get_buffer (self ):
40+         return  self .buffer 
41+ 
42+     def  reset (self ):
43+         self .buffer  =  bytearray ()
44+ 
45+     def  get_size (self ):
46+         return  len (self .buffer )
47+ 
48+     def  add_temperature (self , channel , value ):
49+         val  =  math .floor (value  *  10 );
50+ 
51+         self .buffer .extend (struct .pack ('b' , channel ))
52+         self .buffer .extend (struct .pack ('b' , LPP_TEMPERATURE ))
53+         self .buffer .extend (struct .pack ('b' , val  >>  8 ))
54+         self .buffer .extend (struct .pack ('b' , val ))
55+ 
56+     def  add_relative_humidity (self , channel , value ):
57+         val  =  math .floor (value  *  2 )
58+ 
59+         self .buffer .extend (struct .pack ('b' , channel ))
60+         self .buffer .extend (struct .pack ('b' , LPP_RELATIVE_HUMIDITY ))
61+         self .buffer .extend (struct .pack ('b' , val ))
62+ 
63+     def  add_digital_input (self , channel , value ):
64+         self .buffer .extend (struct .pack ('b' , channel ))
65+         self .buffer .extend (struct .pack ('b' , LPP_DIGITAL_INPUT ))
66+         self .buffer .extend (struct .pack ('b' , value ))
67+ 
68+     def  add_digital_output (self , channel , value ):
69+         self .buffer .extend (struct .pack ('b' , channel ))
70+         self .buffer .extend (struct .pack ('b' , LPP_DIGITAL_OUTPUT ))
71+         self .buffer .extend (struct .pack ('b' , value ))
72+ 
73+     def  add_analog_input (self , channel , value ):
74+         val  =  math .floor (value  *  100 )
75+ 
76+         self .buffer .extend (struct .pack ('b' , channel ))
77+         self .buffer .extend (struct .pack ('b' , LPP_ANALOG_INPUT ))
78+         self .buffer .extend (struct .pack ('b' , val  >>  8 ))
79+         self .buffer .extend (struct .pack ('b' , val ))
80+ 
81+     def  add_analog_output (self , channel , value ):
82+         val  =  math .floor (value  *  100 )
83+ 
84+         self .buffer .extend (struct .pack ('b' , channel ))
85+         self .buffer .extend (struct .pack ('b' , LPP_ANALOG_OUTPUT ))
86+         self .buffer .extend (struct .pack ('b' , val  >>  8 ))
87+         self .buffer .extend (struct .pack ('b' , val ))
88+ 
89+     def  add_luminosity (self , channel , value ):
90+         self .buffer .extend (struct .pack ('b' , channel ))
91+         self .buffer .extend (struct .pack ('b' , LPP_LUMINOSITY ))
92+         self .buffer .extend (struct .pack ('b' , value  >>  8 ))
93+         self .buffer .extend (struct .pack ('b' , value ))
94+ 
95+     def  add_presence (self , channel , value ):
96+         self .buffer .extend (struct .pack ('b' , channel ))
97+         self .buffer .extend (struct .pack ('b' , LPP_PRESENCE ))
98+         self .buffer .extend (struct .pack ('b' , value ))
99+ 
100+     def  add_accelerometer (self , channel , x , y , z ):
101+         vx  =  math .floor (x  *  1000 )
102+         vy  =  math .floor (y  *  1000 )
103+         vz  =  math .floor (z  *  1000 )
104+ 
105+         self .buffer .extend (struct .pack ('b' , channel ))
106+         self .buffer .extend (struct .pack ('b' , LPP_ACCELEROMETER ))        
107+         self .buffer .extend (struct .pack ('b' , vx  >>  8 ))
108+         self .buffer .extend (struct .pack ('b' , vx ))
109+         self .buffer .extend (struct .pack ('b' , vy  >>  8 ))
110+         self .buffer .extend (struct .pack ('b' , vy ))        
111+         self .buffer .extend (struct .pack ('b' , vz  >>  8 ))
112+         self .buffer .extend (struct .pack ('b' , vz ))        
113+ 
114+     def  add_barometric_pressure (self , channel , value ):
115+         val  =  math .floor (value  *  10 )
116+ 
117+         self .buffer .extend (struct .pack ('b' , channel ))
118+         self .buffer .extend (struct .pack ('b' , LPP_BAROMETRIC_PRESSURE ))
119+         self .buffer .extend (struct .pack ('b' , val  >>  8 ))
120+         self .buffer .extend (struct .pack ('b' , val ))                
121+ 
122+     def  add_gryrometer (self , channel , x , y , z ):
123+         vx  =  math .floor (x  *  100 )
124+         vy  =  math .floor (y  *  100 )
125+         vz  =  math .floor (z  *  100 )
126+ 
127+         self .buffer .extend (struct .pack ('b' , channel ))
128+         self .buffer .extend (struct .pack ('b' , LPP_GYROMETER ))        
129+         self .buffer .extend (struct .pack ('b' , vx  >>  8 ))
130+         self .buffer .extend (struct .pack ('b' , vx ))
131+         self .buffer .extend (struct .pack ('b' , vy  >>  8 ))
132+         self .buffer .extend (struct .pack ('b' , vy ))        
133+         self .buffer .extend (struct .pack ('b' , vz  >>  8 ))
134+         self .buffer .extend (struct .pack ('b' , vz ))
135+ 
136+     def  add_gps (self , channel , latitude , longitude , meters ):
137+         lat  =  math .floor (latitude  *  10000 )
138+         lon  =  math .floor (longitude  *  10000 )
139+         alt  =  math .floor (meters  *  100 )
140+ 
141+         self .buffer .extend (struct .pack ('b' , channel ))
142+         self .buffer .extend (struct .pack ('b' , LPP_GPS ))
143+         self .buffer .extend (struct .pack ('b' , lat  >>  16 ))
144+         self .buffer .extend (struct .pack ('b' , lat  >>  8 ))
145+         self .buffer .extend (struct .pack ('b' , lat ))
146+         self .buffer .extend (struct .pack ('b' , lon  >>  16 ))
147+         self .buffer .extend (struct .pack ('b' , lon  >>  8 ))
148+         self .buffer .extend (struct .pack ('b' , lon ))        
149+         self .buffer .extend (struct .pack ('b' , alt  >>  16 ))
150+         self .buffer .extend (struct .pack ('b' , alt  >>  8 ))
151+         self .buffer .extend (struct .pack ('b' , alt ))
0 commit comments