44
55from requests .structures import CaseInsensitiveDict
66from blinkpy import api
7- from blinkpy .camera import BlinkCamera , BlinkCameraMini
7+ from blinkpy .camera import BlinkCamera , BlinkCameraMini , BlinkDoorbell
88from blinkpy .helpers .util import time_to_seconds
99from blinkpy .helpers .constants import ONLINE
1010
@@ -126,11 +126,14 @@ def update_cameras(self, camera_type=BlinkCamera):
126126 name = camera_config ["name" ]
127127 self .motion [name ] = False
128128 owl_info = self .get_owl_info (name )
129+ lotus_info = self .get_lotus_info (name )
129130 if blink_camera_type == "mini" :
130131 camera_type = BlinkCameraMini
132+ if blink_camera_type == "lotus" :
133+ camera_type = BlinkDoorbell
131134 self .cameras [name ] = camera_type (self )
132135 camera_info = self .get_camera_info (
133- camera_config ["id" ], owl_info = owl_info
136+ camera_config ["id" ], owl_info = owl_info , lotus_info = lotus_info
134137 )
135138 self .cameras [name ].update (camera_info , force_cache = True , force = True )
136139
@@ -149,6 +152,16 @@ def get_owl_info(self, name):
149152 pass
150153 return None
151154
155+ def get_lotus_info (self , name ):
156+ """Extract lotus information."""
157+ try :
158+ for doorbell in self .blink .homescreen ["doorbells" ]:
159+ if doorbell ["name" ] == name :
160+ return doorbell
161+ except (TypeError , KeyError ):
162+ pass
163+ return None
164+
152165 def get_events (self , ** kwargs ):
153166 """Retrieve events from server."""
154167 force = kwargs .pop ("force" , False )
@@ -164,6 +177,9 @@ def get_camera_info(self, camera_id, **kwargs):
164177 owl = kwargs .get ("owl_info" , None )
165178 if owl is not None :
166179 return owl
180+ lotus = kwargs .get ("lotus_info" , None )
181+ if lotus is not None :
182+ return lotus
167183 response = api .request_camera_info (self .blink , self .network_id , camera_id )
168184 try :
169185 return response ["camera" ][0 ]
@@ -190,7 +206,9 @@ def refresh(self, force_cache=False):
190206 for camera_name in self .cameras .keys ():
191207 camera_id = self .cameras [camera_name ].camera_id
192208 camera_info = self .get_camera_info (
193- camera_id , owl_info = self .get_owl_info (camera_name )
209+ camera_id ,
210+ owl_info = self .get_owl_info (camera_name ),
211+ lotus_info = self .get_lotus_info (camera_name ),
194212 )
195213 self .cameras [camera_name ].update (camera_info , force_cache = force_cache )
196214 self .available = True
@@ -294,3 +312,66 @@ def network_info(self):
294312 @network_info .setter
295313 def network_info (self , value ):
296314 """Set network_info property."""
315+
316+
317+ class BlinkLotus (BlinkSyncModule ):
318+ """Representation of a sync-less device."""
319+
320+ def __init__ (self , blink , name , network_id , response ):
321+ """Initialize a sync-less object."""
322+ cameras = [{"name" : name , "id" : response ["id" ]}]
323+ super ().__init__ (blink , name , network_id , cameras )
324+ self .sync_id = response ["id" ]
325+ self .serial = response ["serial" ]
326+ self .status = response ["enabled" ]
327+ if not self .serial :
328+ self .serial = f"{ network_id } -{ self .sync_id } "
329+
330+ def sync_initialize (self ):
331+ """Initialize a sync-less module."""
332+ self .summary = {
333+ "id" : self .sync_id ,
334+ "name" : self .name ,
335+ "serial" : self .serial ,
336+ "status" : self .status ,
337+ "onboarded" : True ,
338+ "account_id" : self .blink .account_id ,
339+ "network_id" : self .network_id ,
340+ }
341+ return self .summary
342+
343+ def update_cameras (self , camera_type = BlinkDoorbell ):
344+ """Update sync-less cameras."""
345+ return super ().update_cameras (camera_type = BlinkDoorbell )
346+
347+ def get_camera_info (self , camera_id , ** kwargs ):
348+ """Retrieve camera information."""
349+ try :
350+ for doorbell in self .blink .homescreen ["doorbells" ]:
351+ if doorbell ["name" ] == self .name :
352+ self .status = doorbell ["enabled" ]
353+ return doorbell
354+ except (TypeError , KeyError ):
355+ pass
356+ return None
357+
358+ def get_network_info (self ):
359+ """Get network info for sync-less module."""
360+ return True
361+
362+ @property
363+ def network_info (self ):
364+ """Format lotus response to resemble sync module."""
365+ return {
366+ "network" : {
367+ "id" : self .network_id ,
368+ "name" : self .name ,
369+ "armed" : self .status ,
370+ "sync_module_error" : False ,
371+ "account_id" : self .blink .account_id ,
372+ }
373+ }
374+
375+ @network_info .setter
376+ def network_info (self , value ):
377+ """Set network_info property."""
0 commit comments