35
35
from adafruit_bus_device import i2c_device
36
36
from micropython import const
37
37
38
+ try :
39
+ from typing import Tuple
40
+ from typing_extensions import Literal
41
+ from busio import I2C
42
+ except ImportError :
43
+ pass
44
+
38
45
__version__ = "0.0.0+auto.0"
39
46
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_HTU31D.git"
40
47
@@ -89,24 +96,24 @@ class HTU31D:
89
96
90
97
"""
91
98
92
- def __init__ (self , i2c_bus , address = _HTU31D_DEFAULT_ADDR ):
99
+ def __init__ (self , i2c_bus : I2C , address : int = _HTU31D_DEFAULT_ADDR ) -> None :
93
100
if address not in _HTU31D_ADDRESSES :
94
- raise ValueError ("Invalid address: 0x%x" % ( address ) )
101
+ raise ValueError (f "Invalid address: { address :#x } " )
95
102
self .i2c_device = i2c_device .I2CDevice (i2c_bus , address )
96
103
self ._conversion_command = _HTU31D_CONVERSION
97
104
self ._buffer = bytearray (6 )
98
105
self .reset ()
99
106
100
107
@property
101
- def serial_number (self ):
108
+ def serial_number (self ) -> int :
102
109
"""The unique 32-bit serial number"""
103
110
self ._buffer [0 ] = _HTU31D_READSERIAL
104
111
with self .i2c_device as i2c :
105
112
i2c .write_then_readinto (self ._buffer , self ._buffer , out_end = 1 , in_end = 4 )
106
113
ser = struct .unpack (">I" , self ._buffer [0 :4 ])
107
- return ser
114
+ return ser [ 0 ]
108
115
109
- def reset (self ):
116
+ def reset (self ) -> None :
110
117
"""Perform a soft reset of the sensor, resetting all settings to their power-on defaults"""
111
118
self ._conversion_command = _HTU31D_CONVERSION
112
119
self ._buffer [0 ] = _HTU31D_SOFTRESET
@@ -115,14 +122,14 @@ def reset(self):
115
122
time .sleep (0.015 )
116
123
117
124
@property
118
- def heater (self ):
125
+ def heater (self ) -> bool :
119
126
"""The current sensor heater mode"""
120
127
return self ._heater
121
128
122
129
@heater .setter
123
- def heater (self , new_mode ) :
124
- # check its a boolean
125
- if not new_mode in ( True , False ):
130
+ def heater (self , new_mode : bool ) -> None :
131
+ # check it is a boolean
132
+ if not isinstance ( new_mode , bool ):
126
133
raise AttributeError ("Heater mode must be boolean" )
127
134
# cache the mode
128
135
self ._heater = new_mode
@@ -135,17 +142,17 @@ def heater(self, new_mode):
135
142
i2c .write (self ._buffer , end = 1 )
136
143
137
144
@property
138
- def relative_humidity (self ):
145
+ def relative_humidity (self ) -> float :
139
146
"""The current relative humidity in % rH"""
140
147
return self .measurements [1 ]
141
148
142
149
@property
143
- def temperature (self ):
150
+ def temperature (self ) -> float :
144
151
"""The current temperature in degrees Celsius"""
145
152
return self .measurements [0 ]
146
153
147
154
@property
148
- def measurements (self ):
155
+ def measurements (self ) -> Tuple [ float , float ] :
149
156
"""both `temperature` and `relative_humidity`, read simultaneously"""
150
157
151
158
temperature = None
@@ -183,7 +190,7 @@ def measurements(self):
183
190
return (temperature , humidity )
184
191
185
192
@property
186
- def humidity_resolution (self ):
193
+ def humidity_resolution (self ) -> Literal [ "0.020%" , "0.014%" , "0.010%" , "0.007%" ] :
187
194
"""The current relative humidity resolution in % rH.
188
195
189
196
Possibles values:
@@ -198,17 +205,19 @@ def humidity_resolution(self):
198
205
return _HTU31D_HUMIDITY_RES [self ._conversion_command >> 4 & 3 ]
199
206
200
207
@humidity_resolution .setter
201
- def humidity_resolution (self , value ):
208
+ def humidity_resolution (
209
+ self , value : Literal ["0.020%" , "0.014%" , "0.010%" , "0.007%" ]
210
+ ) -> None :
202
211
if value not in _HTU31D_HUMIDITY_RES :
203
212
raise ValueError (
204
- "Humidity resolution must be one of: {}" . format ( _HTU31D_HUMIDITY_RES )
213
+ f "Humidity resolution must be one of: { _HTU31D_HUMIDITY_RES } "
205
214
)
206
215
register = self ._conversion_command & 0xCF
207
216
hum_res = _HTU31D_HUMIDITY_RES .index (value )
208
217
self ._conversion_command = register | hum_res << 4
209
218
210
219
@property
211
- def temp_resolution (self ):
220
+ def temp_resolution (self ) -> Literal [ "0.040" , "0.025" , "0.016" , "0.012" ] :
212
221
"""The current temperature resolution in Celsius.
213
222
214
223
Possibles values:
@@ -223,17 +232,19 @@ def temp_resolution(self):
223
232
return _HTU31D_TEMP_RES [self ._conversion_command >> 2 & 3 ]
224
233
225
234
@temp_resolution .setter
226
- def temp_resolution (self , value ):
235
+ def temp_resolution (
236
+ self , value : Literal ["0.040" , "0.025" , "0.016" , "0.012" ]
237
+ ) -> None :
227
238
if value not in _HTU31D_TEMP_RES :
228
239
raise ValueError (
229
- "Temperature resolution must be one of: {}" . format ( _HTU31D_TEMP_RES )
240
+ f "Temperature resolution must be one of: { _HTU31D_TEMP_RES } "
230
241
)
231
242
register = self ._conversion_command & 0xF3
232
243
temp_res = _HTU31D_TEMP_RES .index (value )
233
244
self ._conversion_command = register | temp_res << 2
234
245
235
246
@staticmethod
236
- def _crc (value ):
247
+ def _crc (value ) -> int :
237
248
polynom = 0x988000 # x^8 + x^5 + x^4 + 1
238
249
msb = 0x800000
239
250
mask = 0xFF8000
0 commit comments