ikalchev / HAP-python

A python implementation of the HomeKit Accessory Protocol (HAP)
Other
607 stars 116 forks source link

Add services and characteristics used by Home Keys #454

Closed kormax closed 9 months ago

kormax commented 10 months ago

This pull request adds following services and characteristics into the characteristics.json and services.json files:

Information about those services had been taken from:

kormax commented 10 months ago

This message contains demo code that can be used to verify that characteristic and service definitions are correct (assuming that proposed changes are applied).

import signal
import logging

from pyhap.accessory import Accessory
from pyhap.const import CATEGORY_DOOR_LOCK
from pyhap.accessory_driver import AccessoryDriver
from pyhap.service import Service
from pyhap.characteristic import Characteristic

logger = logging.getLogger(__name__)

class Lock(Accessory):
    category = CATEGORY_DOOR_LOCK

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.add_lock_service()
        self.add_nfc_access_service()

    def add_info_service(self):
        serv_info: Service = self.driver.loader.get_service("AccessoryInformation")
        serv_info.configure_char("Name", value=self.display_name)
        serv_info.configure_char("SerialNumber", value="default")
        serv_info.add_characteristic(self.driver.loader.get_char("HardwareFinish"))
        serv_info.configure_char("HardwareFinish", value="AQTj4+MA") # Silver color
        self.add_service(serv_info)

    def add_lock_service(self):
        self.service_lock_mechanism: Service = self.add_preload_service("LockMechanism")

        def get_lock_current_state():
            print(f"get_lock_current_state")
            return 1

        self.lock_current_state: Characteristic = self.service_lock_mechanism.configure_char(
            "LockCurrentState",
            getter_callback=get_lock_current_state,
        )

        def get_lock_target_state():
            print(f"get_lock_target_state")
            return 1

        def set_lock_target_state(value):
            print(f"set_lock_target_state {value}")

        self.lock_current_state: Characteristic = self.service_lock_mechanism.configure_char(
            "LockTargetState",
            getter_callback=get_lock_target_state,
            setter_callback=set_lock_target_state,
        )

        self.service_lock_management: Service = self.add_preload_service("LockManagement")

        def set_lock_control_point(value):
            print(f"set_lock_control_point: {value}")

        self.lock_control_point: Characteristic = self.service_lock_management.configure_char(
            "LockControlPoint",
            setter_callback=set_lock_control_point,
        )

        def get_lock_version():
            print(f"get_lock_version")
            return ""

        self.lock_control_point: Characteristic = self.service_lock_management.configure_char(
            "Version",
            getter_callback=get_lock_version,
        )

    def add_nfc_access_service(self):
        self.service_nfc_access: Service = self.add_preload_service("NFCAccess")

        def get_configuration_state():
            print(f"get_configuration_state")
            return 0

        self.char_configuration_state: Characteristic = self.service_nfc_access.configure_char(
            "ConfigurationState",
            getter_callback=get_configuration_state
        )

        def get_nfc_access_supported_configuration():
            print(f"get_nfc_access_supported_configuration")
            return "AQEQAgEQ"

        self.char_nfc_access_supported_configuration: Characteristic = self.service_nfc_access.configure_char(
            "NFCAccessSupportedConfiguration",
            getter_callback=get_nfc_access_supported_configuration
        )

        def get_nfc_access_control_point():
            print(f"get_nfc_access_control_point")
            return ""

        def set_nfc_access_control_point(value):
            print(f"set_nfc_access_control_point {value}")
            return ""

        self.char_nfc_access_control_point: Characteristic = self.service_nfc_access.configure_char(
            "NFCAccessControlPoint",
            getter_callback=get_nfc_access_control_point,
            setter_callback=set_nfc_access_control_point,
        )   

def main():
    driver = AccessoryDriver(port=51926)
    lock = Lock(driver=driver, display_name="NFC Lock")
    driver.add_accessory(accessory=lock)

    signal.signal(signal.SIGTERM, driver.signal_handler)
    driver.start()

if __name__ == "__main__":
    main()