31
31
from adafruit_bus_device import i2c_device
32
32
from micropython import const
33
33
34
+ try :
35
+ from typing import Tuple , Union
36
+ from busio import I2C
37
+ except ImportError :
38
+ pass
34
39
35
40
__version__ = "0.0.0+auto.0"
36
41
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_SCD4X.git"
@@ -93,7 +98,7 @@ class SCD4X:
93
98
94
99
"""
95
100
96
- def __init__ (self , i2c_bus , address = SCD4X_DEFAULT_ADDR ):
101
+ def __init__ (self , i2c_bus : I2C , address : int = SCD4X_DEFAULT_ADDR ) -> None :
97
102
self .i2c_device = i2c_device .I2CDevice (i2c_bus , address )
98
103
self ._buffer = bytearray (18 )
99
104
self ._cmd = bytearray (2 )
@@ -107,7 +112,7 @@ def __init__(self, i2c_bus, address=SCD4X_DEFAULT_ADDR):
107
112
self .stop_periodic_measurement ()
108
113
109
114
@property
110
- def CO2 (self ): # pylint:disable=invalid-name
115
+ def CO2 (self ) -> int : # pylint:disable=invalid-name
111
116
"""Returns the CO2 concentration in PPM (parts per million)
112
117
113
118
.. note::
@@ -119,7 +124,7 @@ def CO2(self): # pylint:disable=invalid-name
119
124
return self ._co2
120
125
121
126
@property
122
- def temperature (self ):
127
+ def temperature (self ) -> float :
123
128
"""Returns the current temperature in degrees Celsius
124
129
125
130
.. note::
@@ -131,7 +136,7 @@ def temperature(self):
131
136
return self ._temperature
132
137
133
138
@property
134
- def relative_humidity (self ):
139
+ def relative_humidity (self ) -> float :
135
140
"""Returns the current relative humidity in %rH.
136
141
137
142
.. note::
@@ -142,18 +147,18 @@ def relative_humidity(self):
142
147
self ._read_data ()
143
148
return self ._relative_humidity
144
149
145
- def reinit (self ):
150
+ def reinit (self ) -> None :
146
151
"""Reinitializes the sensor by reloading user settings from EEPROM."""
147
152
self .stop_periodic_measurement ()
148
153
self ._send_command (_SCD4X_REINIT , cmd_delay = 0.02 )
149
154
150
- def factory_reset (self ):
155
+ def factory_reset (self ) -> None :
151
156
"""Resets all configuration settings stored in the EEPROM and erases the
152
157
FRC and ASC algorithm history."""
153
158
self .stop_periodic_measurement ()
154
159
self ._send_command (_SCD4X_FACTORYRESET , cmd_delay = 1.2 )
155
160
156
- def force_calibration (self , target_co2 ) :
161
+ def force_calibration (self , target_co2 : int ) -> None :
157
162
"""Forces the sensor to recalibrate with a given current CO2"""
158
163
self .stop_periodic_measurement ()
159
164
self ._set_command_value (_SCD4X_FORCEDRECAL , target_co2 )
@@ -167,7 +172,7 @@ def force_calibration(self, target_co2):
167
172
)
168
173
169
174
@property
170
- def self_calibration_enabled (self ):
175
+ def self_calibration_enabled (self ) -> bool :
171
176
"""Enables or disables automatic self calibration (ASC). To work correctly, the sensor must
172
177
be on and active for 7 days after enabling ASC, and exposed to fresh air for at least 1 hour
173
178
per day. Consult the manufacturer's documentation for more information.
@@ -182,18 +187,18 @@ def self_calibration_enabled(self):
182
187
return self ._buffer [1 ] == 1
183
188
184
189
@self_calibration_enabled .setter
185
- def self_calibration_enabled (self , enabled ) :
190
+ def self_calibration_enabled (self , enabled : bool ) -> None :
186
191
self ._set_command_value (_SCD4X_SETASCE , enabled )
187
192
188
- def self_test (self ):
193
+ def self_test (self ) -> None :
189
194
"""Performs a self test, takes up to 10 seconds"""
190
195
self .stop_periodic_measurement ()
191
196
self ._send_command (_SCD4X_SELFTEST , cmd_delay = 10 )
192
197
self ._read_reply (self ._buffer , 3 )
193
198
if (self ._buffer [0 ] != 0 ) or (self ._buffer [1 ] != 0 ):
194
199
raise RuntimeError ("Self test failed" )
195
200
196
- def _read_data (self ):
201
+ def _read_data (self ) -> None :
197
202
"""Reads the temp/hum/co2 from the sensor and caches it"""
198
203
self ._send_command (_SCD4X_READMEASUREMENT , cmd_delay = 0.001 )
199
204
self ._read_reply (self ._buffer , 9 )
@@ -204,14 +209,14 @@ def _read_data(self):
204
209
self ._relative_humidity = 100 * (humi / 2 ** 16 )
205
210
206
211
@property
207
- def data_ready (self ):
212
+ def data_ready (self ) -> bool :
208
213
"""Check the sensor to see if new data is available"""
209
214
self ._send_command (_SCD4X_DATAREADY , cmd_delay = 0.001 )
210
215
self ._read_reply (self ._buffer , 3 )
211
216
return not ((self ._buffer [0 ] & 0x07 == 0 ) and (self ._buffer [1 ] == 0 ))
212
217
213
218
@property
214
- def serial_number (self ):
219
+ def serial_number (self ) -> Tuple [ int , int , int , int , int , int ] :
215
220
"""Request a 6-tuple containing the unique serial number for this sensor"""
216
221
self ._send_command (_SCD4X_SERIALNUMBER , cmd_delay = 0.001 )
217
222
self ._read_reply (self ._buffer , 9 )
@@ -224,11 +229,11 @@ def serial_number(self):
224
229
self ._buffer [7 ],
225
230
)
226
231
227
- def stop_periodic_measurement (self ):
232
+ def stop_periodic_measurement (self ) -> None :
228
233
"""Stop measurement mode"""
229
234
self ._send_command (_SCD4X_STOPPERIODICMEASUREMENT , cmd_delay = 0.5 )
230
235
231
- def start_periodic_measurement (self ):
236
+ def start_periodic_measurement (self ) -> None :
232
237
"""Put sensor into working mode, about 5s per measurement
233
238
234
239
.. note::
@@ -247,25 +252,25 @@ def start_periodic_measurement(self):
247
252
"""
248
253
self ._send_command (_SCD4X_STARTPERIODICMEASUREMENT )
249
254
250
- def start_low_periodic_measurement (self ):
255
+ def start_low_periodic_measurement (self ) -> None :
251
256
"""Put sensor into low power working mode, about 30s per measurement. See
252
257
:meth:`start_periodic_measurement() <adafruit_scd4x.SCD4X.start_perodic_measurement>`
253
258
for more details.
254
259
"""
255
260
self ._send_command (_SCD4X_STARTLOWPOWERPERIODICMEASUREMENT )
256
261
257
- def persist_settings (self ):
262
+ def persist_settings (self ) -> None :
258
263
"""Save temperature offset, altitude offset, and selfcal enable settings to EEPROM"""
259
264
self ._send_command (_SCD4X_PERSISTSETTINGS , cmd_delay = 0.8 )
260
265
261
- def set_ambient_pressure (self , ambient_pressure ) :
266
+ def set_ambient_pressure (self , ambient_pressure : int ) -> None :
262
267
"""Set the ambient pressure in hPa at any time to adjust CO2 calculations"""
263
268
if ambient_pressure < 0 or ambient_pressure > 65535 :
264
269
raise AttributeError ("`ambient_pressure` must be from 0~65535 hPascals" )
265
270
self ._set_command_value (_SCD4X_SETPRESSURE , ambient_pressure )
266
271
267
272
@property
268
- def temperature_offset (self ):
273
+ def temperature_offset (self ) -> float :
269
274
"""Specifies the offset to be added to the reported measurements to account for a bias in
270
275
the measured signal. Value is in degrees Celsius with a resolution of 0.01 degrees and a
271
276
maximum value of 374 C
@@ -281,7 +286,7 @@ def temperature_offset(self):
281
286
return 175.0 * temp / 2 ** 16
282
287
283
288
@temperature_offset .setter
284
- def temperature_offset (self , offset ) :
289
+ def temperature_offset (self , offset : Union [ int , float ]) -> None :
285
290
if offset > 374 :
286
291
raise AttributeError (
287
292
"Offset value must be less than or equal to 374 degrees Celsius"
@@ -290,7 +295,7 @@ def temperature_offset(self, offset):
290
295
self ._set_command_value (_SCD4X_SETTEMPOFFSET , temp )
291
296
292
297
@property
293
- def altitude (self ):
298
+ def altitude (self ) -> int :
294
299
"""Specifies the altitude at the measurement location in meters above sea level. Setting
295
300
this value adjusts the CO2 measurement calculations to account for the air pressure's effect
296
301
on readings.
@@ -304,12 +309,12 @@ def altitude(self):
304
309
return (self ._buffer [0 ] << 8 ) | self ._buffer [1 ]
305
310
306
311
@altitude .setter
307
- def altitude (self , height ) :
312
+ def altitude (self , height : int ) -> None :
308
313
if height > 65535 :
309
314
raise AttributeError ("Height must be less than or equal to 65535 meters" )
310
315
self ._set_command_value (_SCD4X_SETALTITUDE , height )
311
316
312
- def _check_buffer_crc (self , buf ) :
317
+ def _check_buffer_crc (self , buf : bytearray ) -> bool :
313
318
for i in range (0 , len (buf ), 3 ):
314
319
self ._crc_buffer [0 ] = buf [i ]
315
320
self ._crc_buffer [1 ] = buf [i + 1 ]
@@ -347,7 +352,7 @@ def _read_reply(self, buff, num):
347
352
self ._check_buffer_crc (self ._buffer [0 :num ])
348
353
349
354
@staticmethod
350
- def _crc8 (buffer ) :
355
+ def _crc8 (buffer : bytearray ) -> int :
351
356
crc = 0xFF
352
357
for byte in buffer :
353
358
crc ^= byte
0 commit comments