Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4398128

Browse files
authored
Merge pull request#466 from ikalchev/v4.9.0
V4.9.0
2 parentse281b36 +72156bb commit4398128

15 files changed

+575
-297
lines changed

‎.coveragerc‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,19 @@ include = pyhap/*
44
omit =
55
tests/*
66
pyhap/accessories/*
7+
8+
[report]
9+
# Regexes for lines to exclude from consideration
10+
exclude_lines =
11+
# Have to re-enable the standard pragma
12+
pragma: no cover
13+
14+
# Don't complain about missing debug-only code:
15+
def __repr__
16+
17+
# Don't complain if tests don't hit defensive assertion code:
18+
raise AssertionError
19+
raise NotImplementedError
20+
21+
# TYPE_CHECKING and @overload blocks are never executed during pytest run
22+
if TYPE_CHECKING:

‎CHANGELOG.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ Sections
1616
### Developers
1717
-->
1818

19+
##[4.9.0] - 2023-10-15
20+
21+
- Hashing of accessories no longer includes their values, resulting in more reliable syncs between
22+
devices.[#464](https://github.com/ikalchev/HAP-python/pull/464)
23+
1924
##[4.8.0] - 2023-10-06
2025

2126
- Add AccessoryInformation:HardwareFinish and NFCAccess characteristics/services.

‎pyhap/accessory.py‎

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"""Module for the Accessory classes."""
22
importitertools
33
importlogging
4+
fromtypingimportTYPE_CHECKING,Any,Callable,Dict,Iterable,List,Optional
45
fromuuidimportUUID
56

6-
frompyhapimportSUPPORT_QR_CODE,util
7-
frompyhap.constimport (
7+
from.importSUPPORT_QR_CODE,util
8+
from .constimport (
89
CATEGORY_BRIDGE,
910
CATEGORY_OTHER,
1011
HAP_PROTOCOL_VERSION,
@@ -14,14 +15,19 @@
1415
HAP_REPR_VALUE,
1516
STANDALONE_AID,
1617
)
17-
frompyhap.iid_managerimportIIDManager
18-
frompyhap.serviceimportService
18+
from .iid_managerimportIIDManager
19+
from .serviceimportService
1920

2021
ifSUPPORT_QR_CODE:
2122
importbase36
2223
frompyqrcodeimportQRCode
2324

2425

26+
ifTYPE_CHECKING:
27+
from .accessory_driverimportAccessoryDriver
28+
from .characteristicimportCharacteristic
29+
30+
2531
HAP_PROTOCOL_INFORMATION_SERVICE_UUID=UUID("000000A2-0000-1000-8000-0026BB765291")
2632

2733
logger=logging.getLogger(__name__)
@@ -35,7 +41,13 @@ class Accessory:
3541

3642
category=CATEGORY_OTHER
3743

38-
def__init__(self,driver,display_name,aid=None,iid_manager=None):
44+
def__init__(
45+
self,
46+
driver:"AccessoryDriver",
47+
display_name:Optional[str],
48+
aid:Optional[int]=None,
49+
iid_manager:Optional[IIDManager]=None,
50+
)->None:
3951
"""Initialise with the given properties.
4052
4153
:param display_name: Name to be displayed in the Home app.
@@ -47,24 +59,24 @@ def __init__(self, driver, display_name, aid=None, iid_manager=None):
4759
will assign the standalone AID to this `Accessory`.
4860
:type aid: int
4961
"""
50-
self.aid=aid
51-
self.display_name=display_name
62+
self.aid:Optional[int]=aid
63+
self.display_name:Optional[str]=display_name
5264
self.driver=driver
53-
self.services= []
65+
self.services:List[Service]= []
5466
self.iid_manager=iid_managerorIIDManager()
55-
self.setter_callback=None
67+
self.setter_callback:Optional[Callable[[Any],None]]=None
5668

5769
self.add_info_service()
5870
ifaid==STANDALONE_AID:
5971
self.add_protocol_version_service()
6072

61-
def__repr__(self):
73+
def__repr__(self)->str:
6274
"""Return the representation of the accessory."""
6375
services= [s.display_nameforsinself.services]
6476
returnf"<accessory display_name='{self.display_name}' services={services}>"
6577

6678
@property
67-
defavailable(self):
79+
defavailable(self)->bool:
6880
"""Accessory is available.
6981
7082
If available is False, get_characteristics will return
@@ -75,7 +87,7 @@ def available(self):
7587
"""
7688
returnTrue
7789

78-
defadd_info_service(self):
90+
defadd_info_service(self)->None:
7991
"""Helper method to add the required `AccessoryInformation` service.
8092
8193
Called in `__init__` to be sure that it is the first service added.
@@ -116,7 +128,12 @@ def set_info_service(
116128
self.display_name,
117129
)
118130

119-
defadd_preload_service(self,service,chars=None,unique_id=None):
131+
defadd_preload_service(
132+
self,
133+
service:Service,
134+
chars:Optional[Iterable["Characteristic"]]=None,
135+
unique_id:Optional[str]=None,
136+
)->Service:
120137
"""Create a service with the given name and add it to this acc."""
121138
service=self.driver.loader.get_service(service)
122139
ifunique_idisnotNone:
@@ -129,12 +146,12 @@ def add_preload_service(self, service, chars=None, unique_id=None):
129146
self.add_service(service)
130147
returnservice
131148

132-
defset_primary_service(self,primary_service):
149+
defset_primary_service(self,primary_service:Service)->None:
133150
"""Set the primary service of the acc."""
134151
forserviceinself.services:
135152
service.is_primary_service=service.type_id==primary_service.type_id
136153

137-
defadd_service(self,*servs):
154+
defadd_service(self,*servs:Service)->None:
138155
"""Add the given services to this Accessory.
139156
140157
This also assigns unique IIDS to the services and their Characteristics.
@@ -153,7 +170,7 @@ def add_service(self, *servs):
153170
c.broker=self
154171
self.iid_manager.assign(c)
155172

156-
defget_service(self,name):
173+
defget_service(self,name:str)->Optional[Service]:
157174
"""Return a Service with the given name.
158175
159176
A single Service is returned even if more than one Service with the same name
@@ -168,7 +185,7 @@ def get_service(self, name):
168185
"""
169186
returnnext((sforsinself.servicesifs.display_name==name),None)
170187

171-
defxhm_uri(self):
188+
defxhm_uri(self)->str:
172189
"""Generates the X-HM:// uri (Setup Code URI)
173190
174191
:rtype: str
@@ -195,7 +212,7 @@ def xhm_uri(self):
195212

196213
return"X-HM://"+encoded_payload+self.driver.state.setup_id
197214

198-
defget_characteristic(self,aid,iid):
215+
defget_characteristic(self,aid:int,iid:int)->Optional["Characteristic"]:
199216
"""Get the characteristic for the given IID.
200217
201218
The AID is used to verify if the search is in the correct accessory.
@@ -205,7 +222,7 @@ def get_characteristic(self, aid, iid):
205222

206223
returnself.iid_manager.get_obj(iid)
207224

208-
defto_HAP(self):
225+
defto_HAP(self,include_value:bool=True)->Dict[str,Any]:
209226
"""A HAP representation of this Accessory.
210227
211228
:return: A HAP representation of this accessory. For example:
@@ -224,7 +241,7 @@ def to_HAP(self):
224241
"""
225242
return {
226243
HAP_REPR_AID:self.aid,
227-
HAP_REPR_SERVICES: [s.to_HAP()forsinself.services],
244+
HAP_REPR_SERVICES: [s.to_HAP(include_value=include_value)forsinself.services],
228245
}
229246

230247
defsetup_message(self):
@@ -325,13 +342,18 @@ class Bridge(Accessory):
325342

326343
category=CATEGORY_BRIDGE
327344

328-
def__init__(self,driver,display_name,iid_manager=None):
345+
def__init__(
346+
self,
347+
driver:"AccessoryDriver",
348+
display_name:Optional[str],
349+
iid_manager:Optional[IIDManager]=None,
350+
)->None:
329351
super().__init__(
330352
driver,display_name,aid=STANDALONE_AID,iid_manager=iid_manager
331353
)
332354
self.accessories= {}# aid: acc
333355

334-
defadd_accessory(self,acc):
356+
defadd_accessory(self,acc:"Accessory")->None:
335357
"""Add the given ``Accessory`` to this ``Bridge``.
336358
337359
Every ``Accessory`` in a ``Bridge`` must have an AID and this AID must be
@@ -364,14 +386,14 @@ def add_accessory(self, acc):
364386

365387
self.accessories[acc.aid]=acc
366388

367-
defto_HAP(self):
389+
defto_HAP(self,include_value:bool=True)->List[Dict[str,Any]]:
368390
"""Returns a HAP representation of itself and all contained accessories.
369391
370392
.. seealso:: Accessory.to_HAP
371393
"""
372-
return [acc.to_HAP()foraccin (super(),*self.accessories.values())]
394+
return [acc.to_HAP(include_value=include_value)foraccin (super(),*self.accessories.values())]
373395

374-
defget_characteristic(self,aid,iid):
396+
defget_characteristic(self,aid:int,iid:int)->Optional["Characteristic"]:
375397
""".. seealso:: Accessory.to_HAP"""
376398
ifself.aid==aid:
377399
returnself.iid_manager.get_obj(iid)
@@ -382,17 +404,17 @@ def get_characteristic(self, aid, iid):
382404

383405
returnacc.get_characteristic(aid,iid)
384406

385-
asyncdefrun(self):
407+
asyncdefrun(self)->None:
386408
"""Schedule tasks for each of the accessories' run method."""
387409
foraccinself.accessories.values():
388410
self.driver.async_add_job(acc.run)
389411

390-
asyncdefstop(self):
412+
asyncdefstop(self)->None:
391413
"""Calls stop() on all contained accessories."""
392414
awaitself.driver.async_add_job(super().stop)
393415
foraccinself.accessories.values():
394416
awaitself.driver.async_add_job(acc.stop)
395417

396418

397-
defget_topic(aid,iid):
419+
defget_topic(aid:int,iid:int)->str:
398420
returnstr(aid)+"."+str(iid)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp