@@ -48,6 +48,7 @@ def __init__(self, name, **kwargs):
48
48
self .on_read = kwargs .pop ("on_read" , None )
49
49
self .on_write = kwargs .pop ("on_write" , None )
50
50
self .interval = kwargs .pop ("interval" , 1.0 )
51
+ self ._runnable = kwargs .pop ("runnable" , False )
51
52
value = kwargs .pop ("value" , None )
52
53
if keys := kwargs .pop ("keys" , {}): # Create a complex object (with sub-records).
53
54
mkrec = lambda k , v : AIOTObject (f"{ name } :{ k } " , value = v , callback = self .senml_callback )
@@ -86,6 +87,10 @@ def initialized(self):
86
87
return all (r .initialized for r in self .value .values ())
87
88
return self .value is not None
88
89
90
+ @property
91
+ def runnable (self ):
92
+ return self .on_read is not None or self .on_write is not None or self ._runnable
93
+
89
94
@SenmlRecord .value .setter
90
95
def value (self , value ):
91
96
if value is not None :
@@ -114,18 +119,16 @@ def __setattr__(self, name, value):
114
119
def _build_rec_dict (self , naming_map , appendTo ):
115
120
if isinstance (self .value , dict ):
116
121
for r in self .value .values ():
117
- # NOTE: should filter by updated when it's supported.
118
- if r .value is not None : # and r.updated
122
+ if r .value is not None : # NOTE: should filter by updated when it's supported.
119
123
r ._build_rec_dict (naming_map , appendTo )
120
124
else :
121
125
super ()._build_rec_dict (naming_map , appendTo )
122
126
123
127
def add_to_pack (self , pack ):
124
128
if isinstance (self .value , dict ):
125
129
for r in self .value .values ():
126
- # NOTE: should filter by updated when it's supported.
127
- if r .value is not None : # and r.updated
128
- pack .add (r )
130
+ # NOTE: If record value is None it can still be added to the pack for initialization.
131
+ pack .add (r ) # NOTE: should filter by updated when it's supported.
129
132
else :
130
133
pack .add (self )
131
134
self .updated = False
@@ -159,15 +162,26 @@ def __init__(self, device_id, ssl_params=None, server="mqtts-sa.iot.oniudra.cc",
159
162
self .device_topic = b"/a/d/" + device_id + b"/e/i"
160
163
self .senmlpack = SenmlPack ("urn:uuid:" + device_id .decode ("utf-8" ), self .senml_generic_callback )
161
164
self .mqtt_client = MQTTClient (device_id , server , port , ssl_params , keepalive = keepalive , callback = self .mqtt_callback )
162
- # Note: this object is set by the cloud discovery protocol .
165
+ # Note: the following objects are initialized by the cloud.
163
166
self .register ("thing_id" , value = None , on_write = self .discovery_callback )
167
+ self .register ("tz_offset" , value = None )
164
168
165
169
def __getitem__ (self , key ):
166
- return self .records [key ]
170
+ if isinstance (self .records [key ].value , dict ):
171
+ return self .records [key ]
172
+ return self .records [key ].value
167
173
168
174
def __setitem__ (self , key , value ):
169
175
self .records [key ].value = value
170
176
177
+ def __contains__ (self , key ):
178
+ return key in self .records
179
+
180
+ def get (self , key , default = None ):
181
+ if key in self and self [key ] is not None :
182
+ return self [key ]
183
+ return default
184
+
171
185
def update_systime (self ):
172
186
try :
173
187
from aiotcloud import ntptime
@@ -195,7 +209,7 @@ def register(self, aiotobj, **kwargs):
195
209
self .records [aiotobj .name ] = aiotobj
196
210
197
211
# Create a task for this object if it has any callbacks.
198
- if aiotobj .on_read is not None or aiotobj . on_write is not None :
212
+ if aiotobj .runnable :
199
213
self .create_new_task (aiotobj .run , self , name = aiotobj .name )
200
214
201
215
# Check if object needs to be initialized from the cloud.
@@ -219,14 +233,12 @@ def discovery_callback(self, aiot, thing_id):
219
233
self .thing_id = bytes (thing_id , "utf-8" )
220
234
self .topic_in = b"/a/t/" + self .thing_id + b"/e/i"
221
235
self .topic_out = b"/a/t/" + self .thing_id + b"/e/o"
222
-
223
- shadow_in = b"/a/t/" + self .thing_id + b"/shadow/i"
224
- shadow_out = b"/a/t/" + self .thing_id + b"/shadow/o"
225
-
226
236
logging .info (f"Subscribing to thing topic { self .topic_in } ." )
227
237
self .mqtt_client .subscribe (self .topic_in )
228
238
229
239
if lastval_record := self .records .pop ("r:m" , None ):
240
+ shadow_in = b"/a/t/" + self .thing_id + b"/shadow/i"
241
+ shadow_out = b"/a/t/" + self .thing_id + b"/shadow/o"
230
242
lastval_record .add_to_pack (self .senmlpack )
231
243
logging .info (f"Subscribing to shadow topic { shadow_in } ." )
232
244
self .mqtt_client .subscribe (shadow_in )
0 commit comments