Skip to content

Commit

Permalink
implement requested changes
Browse files Browse the repository at this point in the history
  • Loading branch information
kormax committed Oct 8, 2023
1 parent 32f6508 commit b719c95
Showing 1 changed file with 24 additions and 26 deletions.
50 changes: 24 additions & 26 deletions pyhap/accessory_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@
import tempfile
import threading
import time
from typing import Optional
from typing import Optional, List, Dict, Any

from zeroconf import ServiceInfo
from zeroconf.asyncio import AsyncZeroconf

from pyhap import util
from pyhap.accessory import Accessory, get_topic
from pyhap.characteristic import CharacteristicError
from pyhap.characteristic import CharacteristicError, Characteristic
from pyhap.service import Service
from pyhap.const import (
HAP_PERMISSION_NOTIFY,
HAP_PROTOCOL_SHORT_VERSION,
Expand Down Expand Up @@ -862,13 +863,17 @@ def set_characteristics(self, chars_query, client_addr):
"""
# TODO: Add support for chars that do no support notifications.

queries = chars_query[HAP_REPR_CHARS]
queries: List[Dict[str, Any]] = chars_query[HAP_REPR_CHARS]

self._notify(queries, client_addr)

updates_by_accessories_services = defaultdict(lambda: defaultdict(dict))
results = defaultdict(lambda: defaultdict(dict))
char_to_iid = {}
updates_by_accessories_services: defaultdict[
Accessory, defaultdict[Service, dict[Characteristic, Any]]
] = defaultdict(lambda: defaultdict(dict))
results: defaultdict[int, defaultdict[int, dict[str, Any]]] = defaultdict(
lambda: defaultdict(dict)
)
char_to_iid: Dict[Characteristic, int] = {}

expired = False
if HAP_REPR_PID in chars_query:
Expand All @@ -884,7 +889,7 @@ def set_characteristics(self, chars_query, client_addr):
continue

aid, iid = query[HAP_REPR_AID], query[HAP_REPR_IID]
value = query.get(HAP_REPR_VALUE, None)
value = query.get(HAP_REPR_VALUE)
write_response_requested = query.get(HAP_REPR_WRITE_RESPONSE, False)

if aid == primary_aid:
Expand All @@ -893,28 +898,22 @@ def set_characteristics(self, chars_query, client_addr):
acc = self.accessory.accessories.get(aid)
char = acc.get_characteristic(aid, iid)

set_result, set_result_value = (
HAP_SERVER_STATUS.INVALID_VALUE_IN_REQUEST,
None,
)
set_result = HAP_SERVER_STATUS.INVALID_VALUE_IN_REQUEST
set_result_value = None

if value is not None:
set_result, set_result_value = _wrap_char_setter(
char, value, client_addr
)

return_value_in_response = (
set_result_value is not None and write_response_requested
)

aid_results = results[aid]

aid_results[iid] = {HAP_REPR_STATUS: set_result}
if return_value_in_response:
aid_results[iid][HAP_REPR_VALUE] = set_result_value
if set_result_value is not None and write_response_requested:
result = {HAP_REPR_STATUS: set_result, HAP_REPR_VALUE: set_result_value}
else:
result = {HAP_REPR_STATUS: set_result}

results[aid][iid] = result
char_to_iid[char] = iid
service = char.service

updates_by_accessories_services[acc][service][char] = value

# Proccess accessory and service level setter callbacks
Expand Down Expand Up @@ -1001,11 +1000,10 @@ def _notify(self, queries, client_addr):
for query in queries:
if HAP_PERMISSION_NOTIFY not in query:
continue
aid, iid, ev = (
query[HAP_REPR_AID],
query[HAP_REPR_IID],
query[HAP_PERMISSION_NOTIFY],
)
aid = query[HAP_REPR_AID]
iid = query[HAP_REPR_IID]
ev = query[HAP_PERMISSION_NOTIFY]

char_topic = get_topic(aid, iid)
action = "Subscribed" if ev else "Unsubscribed"
logger.debug("%s client %s to topic %s", action, client_addr, char_topic)
Expand Down

0 comments on commit b719c95

Please sign in to comment.