Tasmota/lib/libesp32_div/ESP32-HomeKit/src/hap.h
2021-03-11 14:48:59 +01:00

1573 lines
52 KiB
C

/*
* ESPRESSIF MIT License
*
* Copyright (c) 2020 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
*
* Permission is hereby granted for use on ESPRESSIF SYSTEMS products only, in which case,
* it is free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef _HAP_H_
#define _HAP_H_
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <esp_event.h>
#ifdef __cplusplus
extern "C" {
#endif
#define HAP_CHAR_STRING_MAX_LEN 256
#define HAP_CHAR_STRING_MAX_DEF_LEN 64
#define HAP_SUCCESS 0
#define HAP_FAIL -1
typedef enum {
HAP_MFI_AUTH_NONE = 0,
HAP_MFI_AUTH_HW,
HAP_MFI_AUTH_SW
} hap_mfi_auth_type_t;
/** HomeKit Transports to be enabled */
typedef enum {
/** Unknown. Default uninitialized value */
HAP_TRANSPORT_UNKNOWN = 0x00,
/** HAP over Wi-Fi */
HAP_TRANSPORT_WIFI = 0x01,
/** HAP Over Ethernet (Wi-Fi disabled).
* To enable both Wi-Fi and Ethernet, use (HAP_TRANSPORT_WIFI | HAP_TRANSPORT_ETHERNET) for hap_init()
*/
HAP_TRANSPORT_ETHERNET = 0x02,
} hap_transport_t;
/**
* HAP characteristic value formats
*/
typedef enum {
/** No Type/Invalid type */
HAP_CHAR_FORMAT_NONE = 0,
/** Boolean (true or false)*/
HAP_CHAR_FORMAT_BOOL,
/** Unsigned 8-bit integer */
HAP_CHAR_FORMAT_UINT8,
/** Unsigned 16-bit integer */
HAP_CHAR_FORMAT_UINT16,
/** Unsigned 32-bit integer */
HAP_CHAR_FORMAT_UINT32,
/** Unsigned 64-bit integer */
HAP_CHAR_FORMAT_UINT64,
/** Signed 32-bit integer */
HAP_CHAR_FORMAT_INT,
/** Signed 32-bit floating point number */
HAP_CHAR_FORMAT_FLOAT,
/** Unicode string */
HAP_CHAR_FORMAT_STRING,
/** Base64 encoded set of one or more TLV8s */
HAP_CHAR_FORMAT_TLV8,
/** base64 encoded data blob */
HAP_CHAR_FORMAT_DATA,
} hap_char_format_t;
/** Data value */
typedef struct {
/** Pointer to an allocated buffer holding the data. This should remain valid
* throughout the lifetime of the characteristic.
*/
uint8_t *buf;
/** Length of the data */
uint32_t buflen;
} hap_data_val_t;
/** TLV8 value (Same as \ref hap_data_val_t) */
typedef hap_data_val_t hap_tlv8_val_t;
/** HAP Value */
typedef union {
/** Boolean */
bool b;
/** Unsigned integer (uint8, uint16, uint32) */
uint32_t u;
/** Signed integer */
int i;
/** 64 bit Unsigned integer */
uint64_t i64;
/** Floating point number */
float f;
/** Pointer to string */
char *s;
/** Structure for Data */
hap_data_val_t d;
/** Structure for TLV8 */
hap_tlv8_val_t t;
} hap_val_t;
/** Information about the Provisioned Network to which the accessory will connect */
typedef struct {
/** SSID for the network */
uint8_t ssid[64];
/** Length of the SSID */
size_t ssid_len;
/** Password for the network. Can be NULL for Open networks */
uint8_t password[64];
/** Length of the Password. Can be 0 for Open networks */
size_t password_len;
} hap_provisioned_nw_t;
/**
* HAP characteristics unit types
*/
#define HAP_CHAR_UNIT_CELSIUS "celsius"
#define HAP_CHAR_UNIT_PERCENTAGE "percentage"
#define HAP_CHAR_UNIT_ARCDEGREES "arcdegrees"
#define HAP_CHAR_UNIT_LUX "lux"
#define HAP_CHAR_UNIT_SECONDS "seconds"
/** HAP Characteristic properties/permissions */
/** Characteristic supports Paired Read */
#define HAP_CHAR_PERM_PR (1 << 0)
/** Characteristic supports Paired Write */
#define HAP_CHAR_PERM_PW (1 << 1)
/** Characteristic supports Event Notifications */
#define HAP_CHAR_PERM_EV (1 << 2)
/** Characteristic supports Additional Authorization Data */
#define HAP_CHAR_PERM_AA (1 << 3)
/** Characteristic supports Timed Writes */
#define HAP_CHAR_PERM_TW (1 << 4)
/** Characteristic is hidden from the user */
#define HAP_CHAR_PERM_HD (1 << 5)
/** Characterictic is of special read only type.
* Valid for characteristics like "Programmable Switch Event" wherein the value
* needs to be reported as NULL for a read, even when it is a uint8. Actual value
* is reported only using event notifications.
*/
#define HAP_CHAR_PERM_SPECIAL_READ (1 << 6)
/** HAP object handle */
typedef size_t hap_handle_t;
/** HAP Characteristic handle */
typedef hap_handle_t hap_char_t;
/** HAP Service handle */
typedef hap_handle_t hap_serv_t;
/** HAP Accessory handle */
typedef hap_handle_t hap_acc_t;
/** HAP Status codes as per the HAP Specifications */
typedef enum {
/** This specifies a success for the request. */
HAP_STATUS_SUCCESS = 0,
/** Request denied due to insufficient privileges. */
HAP_STATUS_NO_PRIVILEGE = -70401,
/** Unable to communicate with requested service. */
HAP_STATUS_COMM_ERR = -70402,
/** Resource is busy, try again. */
HAP_STATUS_RES_BUSY = -70403,
/** Cannot write to read only characteristic. */
HAP_STATUS_WR_ON_RDONLY = -70404,
/** Cannot read from a write only characteristic. */
HAP_STATUS_RD_ON_WRONLY = -70405,
/** Notification is not supported for characteristic */
HAP_STATUS_NO_NOTIF = -70406,
/** Out of resources to process request. */
HAP_STATUS_OO_RES = -70407,
/** Operation timed out. */
HAP_STATUS_TIMEOUT = -70408,
/** Resource does not exist. */
HAP_STATUS_RES_ABSENT = -70409,
/** Accessory received an invalid value in a write request. */
HAP_STATUS_VAL_INVALID = -70410,
/** Insufficient Authorization. */
HAP_STATUS_INSUFFICIENT_AUTH = -70411,
} hap_status_t;
typedef enum {
HAP_CID_NONE = 0,
HAP_CID_OTHER,
HAP_CID_BRIDGE,
HAP_CID_FAN,
HAP_CID_GARAGE_DOOR_OPENER,
HAP_CID_LIGHTING,
HAP_CID_LOCK,
HAP_CID_OUTLET,
HAP_CID_SWITCH,
HAP_CID_THERMOSTAT,
HAP_CID_SENSOR,
HAP_CID_SECURITY_SYSTEM,
HAP_CID_DOOR,
HAP_CID_WINDOW,
HAP_CID_WINDOW_COVERING,
HAP_CID_PROGRAMMABLE_SWITCH,
HAP_CID_RESERVED,
HAP_CID_IP_CAMERA,
HAP_CID_VIDEO_DOORBELL,
HAP_CID_AIR_PURIFIER,
HAP_CID_HEATER,
HAP_CID_AIR_CONDITIONER,
HAP_CID_HUMIDIFIER,
HAP_CID_DEHUMIDIFIER,
HAP_CID_MAX,
} hap_cid_t;
/** Prototype for Identify routine for the accessory
*
* @param[in] acc Handle of the accessory object
*/
typedef int (*hap_identify_routine_t) (hap_acc_t *acc);
/** HAP Accessory configuration */
typedef struct {
/** Name (Mandatory) */
char *name;
/** Model (Mandatory) */
char *model;
/** Manufacturer (Mandatory) */
char *manufacturer;
/** Serial Number (Mandatory) */
char *serial_num;
/** Firmware Revision number in format x[.y[.z]] (Mandatory) */
char *fw_rev;
/** Hardware revision number in format x[.y[.z]] (Optional. Can be NULL )*/
char *hw_rev;
/** HAP Protocol version supported by the accessory. Should be set to "1.1"
* @note The value set here will currently be ignored and assumed to be 1.1
* as it is the only protocol version currently supported.
* This is valid only for the Primary accessory.
*/
char *pv;
/** Category Identifier for the Accessory. This is valid only for the
* primary accessory
*/
hap_cid_t cid;
/** Identify routine for the accessory (Mandatory) */
hap_identify_routine_t identify_routine;
} hap_acc_cfg_t;
/** HomeKit Debug prints level
*/
typedef enum {
/** Basic information indicating what's happening in the HomeKit core */
HAP_DEBUG_LEVEL_INFO = 0,
/** Warnings for incidents that can affect behavior, but not necessarily cause a failure*/
HAP_DEBUG_LEVEL_WARN,
/** Errors which will affect the working, and may even halt the process */
HAP_DEBUG_LEVEL_ERR,
/** Asserts for failures which will definitely cause system to halt */
HAP_DEBUG_LEVEL_ASSERT
} hap_debug_level_t;
/**
* @brief Set the HomeKit Debug prints level.
*
* This indicates the maximum level for which the debug messages
* will be printed. Default value is \ref HAP_DEBUG_LEVEL_INFO which means
* that all information, warnings, errors and asserts will be printed, as
* this is the lowest level. You can change it to any suitable higher level
* to reduce the prints. For Eg. Setting this to HAP_DEBUG_LEVEL_WARN will
* print all warnings, errors and asserts, but not the basic information.
*
* @param[in] level Maximum debug print level as per \ref hap_debug_level_t
*/
void hap_set_debug_level(hap_debug_level_t level);
/**
*
* @brief Get the HAP SDK Version from the hap core
*
* @return Pointer to a NULL terminated Version string (Eg. 2.0.r1-0136161)
*/
const char *hap_get_version();
/** Unique Paramaters for HomeKit */
typedef enum {
/** Nothing unique.
* Application code should ensure uniqueness of name and ssid.
* HAP Core will not change anything.
*/
UNIQUE_NONE = 0,
/** Unique SSID (default configuration).
* 3 bytes of MAC will be added to accessory name to create unique WAC SSID (Eg. Name-xxyyzz) */
UNIQUE_SSID,
/** Unique Name.
* Name will be changed by adding 3 bytes of MAC to original name.
* Thi swill automatically make the SSID unique as the accessory name will be used as SSID.
*/
UNIQUE_NAME,
} hap_unique_param_t;
/** HomeKit Configuration.
* Please do not change unless you understand the purpose of these */
typedef struct {
/** Internal HomeKit Task's stack size */
uint32_t task_stack_size;
/** Internal HomeKit Task's priority */
uint8_t task_priority;
/** Maximum characteristics to which event notifications can be sent simultaneously.
* Default value is enough for standalone accessories. Change may be required only
* for bridges.
*/
uint8_t max_event_notif_chars;
/** Indicates what paramaters will be made unique by the HAP Core */
hap_unique_param_t unique_param;
/** Timeout (in seconds) after which a socket data receive call will return for a pair verified
* socket, in case the call blocks. This has been added to avoid the webserver getting stalled on a read,
* especially in case wherein some garbage data is received on a pair verified connection.
*/
uint8_t recv_timeout;
/** Timeout (in seconds) after which a socket data send call will return for a pair verified
* socket, in case the call blocks. This has been added to avoid the webserver getting stalled on a write.
*/
uint8_t send_timeout;
/** Max length of the buffer to be used for handling SW Token Requests. The Default value has been kept
* as 1200 to help pass HCA Tests. This can be changed to 512 for practical purposes as the actual Apple
* tokens never really need more than that.
*/
size_t sw_token_max_len;
/** By default, config number (c#) incremenents on addition/removal of every bridged accessory after
* hap_start(). Setting this flag to true will disable this. Use hap_update_config_number()
* to increment c#. Note thar c# will still increment on a firmware upgrade though.
*/
bool disable_config_num_update;
} hap_cfg_t;
/** Get HomeKit Configuration
*
* Gets the configuration that will be used by the HomeKit core.
*
* @param[out] cfg Pointer to an allocated \ref hap_cfg_t structure which will be populated
* with the configuration information.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on error
*/
int hap_get_config(hap_cfg_t *cfg);
/** Set HomeKit Configuration
*
* This sets the HomeKit configuration. Please use hap_get_config() to get the old
* configuration first, before modifying any values. Eg.
*
* @code
* hap_cfg_t hap_cfg;
* hap_get_config(&hap_cfg);
* hap_cfg.unique_param = UNIQUE_NAME;
* hap_set_config(&hap_cfg);
* @endcode
*
* @note This should be called before hap_init().
*
* @param[in] cfg Pointer to an allocated \ref hap_cfg_t structure which has the new values
* to set.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on error
*/
int hap_set_config(const hap_cfg_t *cfg);
/* Update config number (c#)
*
* This increments the config number (c#) by 1
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on error
*/
int hap_update_config_number();
/**
* @brief Initialize HAP Framework
*
* This internally initializes the MFi auth chip, TCP-IP stack, HomeKit Key Store,
* HomeKit database, Wi-Fi and mDNS.
*
* @return HAP_SUCCESS on success
* @return others on error
*/
int hap_init(hap_transport_t transport);
/**
* @brief De-initialize HAP Framework.
*
* @note This currently does not do anything
*
* @return HAP_SUCCESS on success
* @return others on error
*/
int hap_deinit();
/**
* @brief Start the HAP framework
*
* This starts the webserver and also initializes WAC or HomeKit services
* as per the state of the accessory.
*
* @return HAP_SUCCESS on success
* @return others on error
*/
int hap_start(void);
/**
* @brief Stop HAP framework and free all relevant resources
*
* @note This currently does not do anything
*
* @return HAP_SUCCESS on success
* @return others on error
*/
int hap_stop(void);
/**
* @brief Create a HAP accessory object
*
* @param[in] acc_cfg Pointer to the accessory configuration \ref hap_acc_cfg_t
*
* @return Handle for the accessory object pre-populated with
* the Accessory Information Service (and Protocol Information Service
* for the first accessory created)
*
* @return NULL on error
*/
hap_acc_t *hap_acc_create(hap_acc_cfg_t *acc_cfg);
/**
* @brief Add Accessory flags to the Accessory Info service
*
* This adds the optional Accessory Information Flag to the given accessory,
* with the value set to the one specified. Typically, the flags will be
* initialised with a value of 1, meaning that additional manufacturer specific
* setup is required. Once the setup is done, the flags should be reset to 0
* using hap_acc_update_accessory_flags()
*
* @note Use of these flags requires explicit approval from Apple.
*
* @param[in] ha HAP Accessory object handle
* @param[in] flags Initial value of flags. Check the specs for valid values
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_acc_add_accessory_flags(hap_acc_t *ha, uint32_t flags);
/**
* @brief Update the Accessory flags
*
* This updates the Accessory flags characteristic of the Accessory Info service
* of the given accessory, if it has been added using hap_acc_add_accessory_flags().
*
* @param[in] ha HAP Accessory object handle
* @param[in] flags New value of flags. Check the specs for valid values
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_acc_update_accessory_flags(hap_acc_t *ha, uint32_t flags);
/**
* @brief Add Product data
*
* As per HAP specs R15, this is the 8 byte product data assigned to the Product Plan.
*
* @param[in] ha HAP Accessory object handle
* @param[in] product_data Pointer to the product data value buffer
* @param[in] data_size Size of the buffer (should be 8 as per HAP Spec R15)
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_acc_add_product_data(hap_acc_t *ha, uint8_t *product_data, size_t data_size);
/**
* @brief Add accessory to the HAP Object database
*
* @param[in] ha HAP Accessory object handle
*/
void hap_add_accessory(hap_acc_t *ha);
/**
* @brief Add a bridged accessory to the HAP Object database
*
* This adds a bridged accessory to the Homekit Object database and assigns
* it the given AID. HomeKit requires that each accessory gets assigned a unique aid.
* To ensure this, a helper API hap_get_unique_aid() has been provided. This API
* requires some unique identifier of the accessory, say mac address, serial number, etc.
*
* Example: hap_add_bridged_accessory(ha, hap_get_unique_aid(mac_addr));
*
* @param[in] aid The AID desired for the bridged accessory. If a 0 is passed, the
* next available AID will be assigned. However, this should be used only for
* evaluation, not production.
*
* @param[in] ha HAP Accessory object handle
*/
void hap_add_bridged_accessory(hap_acc_t *ha, int aid);
/**
* @brief Remove a bridged accessory from the HAP Object database
*
* @param[in] ha HAP Accessory object handle
*/
void hap_remove_bridged_accessory(hap_acc_t *ha);
/**
* @brief Delete HAP Accessory Object
*
* @note Primary accessory cannot be deleted
*
* @param[in] ha HAP Accessory object handle
*
*/
void hap_acc_delete(hap_acc_t *ha);
/**
* @brief Delete all accessories
*/
void hap_delete_all_accessories(void);
/**
* Get unique AID for the given identifier
*
* This API can be used to ensure that the same AID gets assigned to an accessory
* every time, even across reboots and irrespective of when it is added to the
* HomeKit database. It requires a unique identifier of the accessory, say a
* mac addtess, serial number, etc. If it is a new accessory, a new AID gets
* assigned and the id:aid combination gets stored in NVS (Non Volatile Storage).
* If the accessory was already added some time later, the original AID is fetched
* from the NVS and returned. This API should be used as the "aid" argument for
* hap_add_bridged_accessory()
*
* @param[in] id Unique identifier for the accessory
*
* @return Unique AID for the accessory
* @return -1 on error (NULL id)
*/
int hap_get_unique_aid(const char *id);
/**
* @brief Get Accessory using AID
*
* @param[in] aid Accessory ID of the required accessory
*
* @return Handle for the accessory with given aid
* @return NULL if accessory not found
*/
hap_acc_t *hap_acc_get_by_aid(int32_t aid);
/**
* @brief Get first accessory in the database
*
* @return Handle for the first accessory
*/
hap_acc_t *hap_get_first_acc();
/**
* @brief Get next accessory in the database
*
* @param[in] ha Current HAP Accessory object handle
*
* @return Pointer to the next accessory
* @return NULL if the current accessory is the last
*/
hap_acc_t *hap_acc_get_next(hap_acc_t *ha);
/**
* @brief Get Service using IID
*
* @param[in] ha HAP Accessory object handle in which the service should be searched
* @param[in] iid Instance ID of the required service
*
* @return Handle for the service with given iid
* @return NULL if service not found
*/
hap_serv_t *hap_acc_get_serv_by_iid(hap_acc_t *ha, int32_t iid);
/**
* @brief Get Service using Type UUID
*
* @param[in] ha HAP Accessory object handle in which the service should be searched
* @param[in] type_uuid UUID of the required service
*
* @return Handle for the service with given type_uuid
* @return NULL if service not found
*/
hap_serv_t *hap_acc_get_serv_by_uuid(hap_acc_t *ha, const char *type_uuid);
/**
* @brief Get characteristic using IID
*
* @param[in] ha HAP Accessory object handle in which the characteristic should be searched
* @param[in] iid Instance ID of the required characteristic
*
* @return Handle for the characteristic with given iid
* @return NULL if characteristic not found
*/
hap_char_t *hap_acc_get_char_by_iid(hap_acc_t *ha, int32_t iid);
/**
* @brief Get first service in a given accessory object
*
* This is useful for iterating over all services of an accessory.
* The subsequent services of the accessory can be iterated by using
* hap_serv_get_next().
*
* @param[in] ha HAP Accessory object handle
*
* @return Handle for the first service in the accessory object
*/
hap_serv_t *hap_acc_get_first_serv(hap_acc_t *ha);
/**
* @brief Create a Boolean Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_bool_create(char *type_uuid, uint16_t perms, bool val);
/**
* @brief Create an 8-bit unsigned integer Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_uint8_create(char *type_uuid, uint16_t perms, uint8_t val);
/**
* @brief Create a 16-bit unsigned integer Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_uint16_create(char *type_uuid, uint16_t perms, uint16_t val);
/**
* @brief Create a 32-bit unsigned integer Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_uint32_create(char *type_uuid, uint16_t perms, uint32_t val);
/**
* @brief Create a 64-bit unsigned integer Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_uint64_create(char *type_uuid, uint16_t perms, uint64_t val);
/**
* @brief Create a 32-bit signed integer Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_int_create(char *type_uuid, uint16_t perms, int val);
/**
* @brief Create a Floating point Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_float_create(char *type_uuid, uint16_t perms, float val);
/**
* @brief Create a String Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_string_create(char *type_uuid, uint16_t perms, char *val);
/**
* @brief Create a Data Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Pointer to initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_data_create(char *type_uuid, uint16_t perms, hap_data_val_t *val);
/**
* @brief Create a TLV8 Characteristic Object
*
* @param[in] type_uuid UUID for the characteristic as per the HAP Specs
* @param[in] perms Logically OR of the various permissions supported by the characteristic
* @param[in] val Pointer to initial value of the characteristic
*
* @return Handle for the characteristic object created
* @return NULL on error
*/
hap_char_t *hap_char_tlv8_create(char *type_uuid, uint16_t perms, hap_tlv8_val_t *val);
/**
* @brief Delete a characteristic object
*
* @param[in] hc HAP Characteristic Object handle
*/
void hap_char_delete(hap_char_t *hc);
/**
* @brief Create a HAP Service Object
*
* @param[in] type_uuid UUID for the service as per the HAP Specs
*
* @return Handle for the service object created
* @return NULL on error
*/
hap_serv_t *hap_serv_create(char *type_uuid);
/**
* @brief Delete a service object
*
* @param[in] hs HAP Service Object handle
*/
void hap_serv_delete(hap_serv_t *hs);
/**
* @brief Get the AID for the given accessory
*
* @param[in] ha HAP Accessory Object handle
*
* @return aid for the accessory
*/
uint32_t hap_acc_get_aid(hap_acc_t *ha);
/**
* @brief Get Characteristic using Type UUID
*
* @param[in] hs HAP Service object handle in which the characteristic should be searched
* @param[in] type_uuid UUID of the required characteristic
*
* @return Handle for the characteristic with given type_uuid
* @return NULL if characteristic not found
*/
hap_char_t *hap_serv_get_char_by_uuid(hap_serv_t *hs, const char *type_uuid);
/**
* @brief Get parent Accessory for given Service
*
* @param[in] hs HAP Service object handle
*
* @return Handle for the parent accessory
* @return NULL if the service is not added in any accessory
*/
hap_acc_t *hap_serv_get_parent(hap_serv_t *hs);
/**
* @brief Get the next service in a given accessory object
*
* This is useful for iterating over all services of an accessory.
*
* @param[in] Current service object handle
*
* @return Handle for next service in the accessory object
* @return NULL if the current service was the last one in the accessory
*/
hap_serv_t *hap_serv_get_next(hap_serv_t *hs);
/**
* @brief Get first characteristic in a given service object
*
* This is useful for iterating over all characteristics of a service.
* The subsequent characteristics of the service can be
* iterated by using hap_char_get_next().
*
* @param[in] hs HAP Service object handle
*
* @return Handle for the first chatracteristic in the service object
*/
hap_char_t *hap_serv_get_first_char(hap_serv_t *hs);
/**
* @brief Get the IID for the given characteristic
*
* @param[in] hc HAP Characteristic Object handle
*
* @return iid for the characteristic
*/
uint32_t hap_char_get_iid(hap_char_t *hc);
/**
* @brief Get the type UUID for the given characteristic
*
* @param[in] hc HAP Characteristic Object handle
*
* @return Type UUID for the characteristic
*/
const char * hap_char_get_type_uuid(hap_char_t *hc);
/**
* @brief Get the Permissions for the given characteristic
*
* @param[in] hc HAP Characteristic Object handle
*
* @return The permissions for the characteristics, the same as the ones passed while creating it.
* It will be a logically OR of the various permissions supported by the characteristic.
*/
uint16_t hap_char_get_perm(hap_char_t *hc);
/**
* @brief Get the format for the given characteristic
*
* @param[in] hc HAP Characteristic Object handle
*
* @return Format of the characteristic value
*/
hap_char_format_t hap_char_get_format(hap_char_t *hc);
/**
* @brief Get the IID for the given service
*
* @param[in] hs HAP Service Object handle
*
* @return iid for the service
*/
uint32_t hap_serv_get_iid(hap_serv_t *hs);
/**
* @brief Get the type UUID for the given service
*
* @param[in] hs HAP Service Object handle
*
* @return Type UUID for the service
*/
char *hap_serv_get_type_uuid(hap_serv_t *hs);
/**
* @brief Get parent Service for given Characteristic
*
* @param[in] hc HAP Characteristic object handle
*
* @return Handle for the parent service
* @return NULL if the characteristic is not added in any service
*/
hap_serv_t *hap_char_get_parent(hap_char_t *hc);
/**
* @brief Get the next characteristic in a given service object
*
* This is useful for iterating over all characteristics of a service.
*
* @param[in] Current characteristic object handle
*
* @return Handle for next characteristic in the service object
* @return NULL if the current characteristic was the last one in the service
*/
hap_char_t *hap_char_get_next(hap_char_t *hc);
/**
* @brief Add Integer characteristic constraints
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] min Minimum Value
* @param[in] max Maximum Value
* @param[in] step Step Value
*/
void hap_char_int_set_constraints(hap_char_t *hc, int min, int max, int step);
/**
* @brief Add Integer characteristic constraints
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] min Minimum Value
* @param[in] max Maximum Value
* @param[in] step Step Value
*/
void hap_char_float_set_constraints(hap_char_t *hc, float min, float max, float step);
/**
* @brief Add String characteristic constraints
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] maxlen Maximum Length of the string (default: 64, max: 256)
*/
void hap_char_string_set_maxlen(hap_char_t *hc, int maxlen);
/**
* @brief Add Characteristic Description
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] description Manufacturer defined String description for the characteristic
*/
void hap_char_add_description(hap_char_t *hc, const char *description);
/**
* @brief Add Characteristic Unit
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] unit Unit for the characteristic. Please see specs for valid strings.
*/
void hap_char_add_unit(hap_char_t *hc, const char *unit);
/**
* @brief Add Valid Values for Characteristic
*
* Using this API will just add the valid-values metadata for a characteristic
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] valid_vals Pointer to an array of valid values
* @param[in] valid_val_cnt Number of entries in the array
*/
void hap_char_add_valid_vals(hap_char_t *hc, const uint8_t *valid_vals, size_t valid_val_cnt);
/**
* @brief Add Valid Values Range for Characteristic
*
* Using this API will just add the valid-values-range metadata for a characteristic
*
* @param[in] hc HAP Characteristic Object handle
* @param[in] start_val Start value of the range
* @param[in] end_val End value of the range
*/
void hap_char_add_valid_vals_range(hap_char_t *hc, uint8_t start_val, uint8_t end_val);
/**
* @brief Set IID for a given characteristic
*
* HomeKit specifications require that the IID for a given characteristic should remain the same,
* even after a firmware upgrade. Since the HomeKit core assigns the IIDs internally,
* it is possible that a different IID is getting assigned because of removal of
* some old service/characteristic or addition of a newer one in between. In such a case,
* in order to maintain the same IID, this API can be used.
*
* @note This must be used only if actually required, and that too after adding all services/
* characteristics to an accessory, but before hap_start().
*
* @param[in] hc HAP Characteristic Object Handle
* @param[in] iid Desired IID
*/
void hap_char_set_iid(hap_char_t *hc, int32_t iid);
/**
* @brief Add a characteristic to a service
*
* @param[in] hs HAP service object handle
* @param[in] hc HAP characteristic object handle
*
* @return 0 on success
* @return other on error
*/
int hap_serv_add_char(hap_serv_t *hs, hap_char_t *hc);
/**
* @brief HAP add a service to an accessory
*
* @param[in] ha HAP Accessory object handle
* @param[in] hs HAP Service object handle
*
* @return 0 on success
* @return other on error
*/
int hap_acc_add_serv(hap_acc_t *ha, hap_serv_t *hs);
/**
* @brief Update characteristic value
*
* This should be called within service read/write callbacks to update the
* value of characteristic maintained by the HAP Core. This can also be called
* from some other thread, for accessories like sensors that periodically
* monitor some paramters.
*
* @param[in] hc HAP characteristic object handle
* @param[in] val Pointer to new value
*
* @return 0 on success
* @return other on error
*/
int hap_char_update_val(hap_char_t *hc, hap_val_t *val);
/**
* @brief Get the current value of characteristic
*
* @param[in] hc HAP characteristic object handle
*
* @return Pointer to the current value
*/
const hap_val_t *hap_char_get_val(hap_char_t *hc);
/** Authorization Data received in a write reqest
*/
typedef struct {
/** Pointer to the data. Will be NULL if no auth data was present */
uint8_t *data;
/** Length of the data. Will be 0 if no auth data was present */
int len;
} hap_auth_data_t;
/** Write data for a characteristics received over HAP
*/
typedef struct {
/** Pointer to the characteristic object */
hap_char_t *hc;
/** Value received in the write request.
* Appropriate value in the \ref hap_val_t union will be set as per the format.
*/
hap_val_t val;
/** Authorization data \ref hap_auth_data_t id any, received in the write request.
* It is the application's responsibility to handle and validate this data and
* report the status accordingly.
*/
hap_auth_data_t auth_data;
/** Indicates if the received request was a remote write
*/
bool remote;
/** This is an output parameter, which should be set in the service write
* routine as per the status of the write.
*/
hap_status_t *status;
} hap_write_data_t;
/** Read data for a characteristic
*/
typedef struct {
/** Pointer to the characteristic object */
hap_char_t *hc;
/** This is an output parameter, which should be set in the service read
* routine as per the status of the read
*/
hap_status_t *status;
} hap_read_data_t;
/** Service Write Function Prototype
*
* A function with this prototype must be registered with the HAP framework to handle
* writes for the characteristics in the given service
*
* @note For writes, an array is sent instead of individual writes to avoid cases wherein
* writes to multiple properties of a single accessory can cause unexpected behavior.
* Eg. For a light which is off, a write could ask it to be turned on at 50% brightness,
* with blue color. If 3 writes are issued for this, the light could first turn on to
* 100% with white color, then dim down to 50% and then change color. A single write will
* ensure that the hardware control takes care of all these at the same time.
*
* @param[in] write_data Array of characteristic write objects of type \ref hap_write_data_t
* which has relevant information like the characteristic object handle, new value received, etc.
* @param[in] count Number of entries in the write_data array.
* @param[in] serv_priv The private data for the service set using hap_serv_set_priv()
* @param[in] write_priv Can be used with hap_is_req_admin()
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL if an error is encountered even for a single characteristic. Actual error
* value must be reported in the status under \ref hap_write_data_t.
*/
typedef int (*hap_serv_write_t) (hap_write_data_t write_data[], int count,
void *serv_priv, void *write_priv);
/** Service Read Function Prototype
*
* A function with this prototype must be registered with the HAP framework to handle
* reads for the characteristics in the given service. The new value must be set
* by invoking hap_char_update_val().
*
* @param[in] hc HAP Characteristic Object Handle.
* @param[out] status_code Status of the read, to be populated by the callback with
* values from \ref hap_status_t.
* @param[in] serv_priv The private data for the service set using hap_serv_set_priv()
* @param[in] read_priv Can be used with hap_is_req_admin()
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL if an error is encountered while reading. Actual error
* value must be reported in the status_code
*/
typedef int (*hap_serv_read_t) (hap_char_t *hc, hap_status_t *status_code,
void *serv_priv, void *read_priv);
/** Service Bulk Read Function Prototype
*
* A function with this prototype can be registered with the HAP framework to handle
* bulk reads for the characteristics in the given service. The new values must be set
* by invoking hap_char_update_val() for each characteristic.
*
* @note This should be used only under special circumstances for cases like
* bridges, wherein fetching individual values from bridged accessories could
* be time consuming. If this is used, it will override the handler of
* type \ref hap_serv_read_t registered for the same service.
*
* @param[in] read_data Array of characteristic write objects of type \ref hap_read_data_t
* which has characteristic object handle and read status pointer.
* @param[in] count Number of entries in the read_data array.
* @param[in] serv_priv The private data for the service set using hap_serv_set_priv()
* @param[in] read_priv Can be used with hap_is_req_admin()
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL if an error is encountered even for a single characteristic.
* Actual error value must be reported in the status under \ref hap_read_data_t.
*/
typedef int (*hap_serv_bulk_read_t) (hap_read_data_t read_data[], int count,
void *serv_priv, void *read_priv);
/**
* @brief Register Service Write callback
*
* @param[in] hs HAP Service Object Handle
* @param[in] write Callback of type \ref hap_serv_write_t
*/
void hap_serv_set_write_cb(hap_serv_t *hs, hap_serv_write_t write);
/**
* @brief Register Service Read callback
*
* @param[in] hs HAP Service Object Handle
* @param[in] read Callback of type \ref hap_serv_read_t
*/
void hap_serv_set_read_cb(hap_serv_t *hs, hap_serv_read_t read);
/**
* @brief Register Service Bulk read callback
*
* @note This should be used only under special circumstances for cases like
* bridges, wherein fetching individual values from bridged accessories could
* be time consuming. If this is used, the callback registered using
* @ref hap_serv_set_read_cb() will be overriden.
*
* @param[in] hs HAP Service Object Handle
* @param[in] read Callback of type \ref hap_serv_bulk_read_t
*/
void hap_serv_set_bulk_read_cb(hap_serv_t *hs, hap_serv_bulk_read_t read);
/**
* @brief Set service private data
*
* This will be available in the read/write callbacks
*
* @param[in] hs HAP Service Object Handle
* @param[in] priv Private data for the service
*/
void hap_serv_set_priv(hap_serv_t *hs, void *priv);
/**
* @brief Get Service private
*
* This will get the private data associated with the service, which
* was set using hap_serv_set_priv().
*
* @param[in] hs HAP Service Object Handle
*
* @return Pointer to the private data (can be NULL)
*/
void *hap_serv_get_priv(hap_serv_t *hs);
/**
* @brief Mark service as primary
*
* @param[in] hs HAP Service Object Handle
*/
void hap_serv_mark_primary(hap_serv_t *hs);
/**
* @brief Mark service as hidden
*
* @param[in] hs HAP Service Object Handle
*/
void hap_serv_mark_hidden(hap_serv_t *hs);
/**
* @brief Link a HomeKit service to other service
*
* @param[in] hs HAP Service Object Handle
* @param[in] linked_serv HAP Service Object Handle of the service to be linked
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_serv_link_serv(hap_serv_t *hs, hap_serv_t *linked_serv);
/**
* @brief Set IID for a given sService
*
* HomeKit specifications require that the IID for a given service should remain the same,
* even after a firmware upgrade. Since the HomeKit core assigns the IIDs internally,
* it is possible that a different IID is getting assigned because of removal of
* some old service/characteristic or addition of a newer one in between. In such a case,
* in order to maintain the same IID, this API can be used.
*
* @note This must be used only if actually required, and that too after adding all services/
* characteristics to a service, but before hap_start().
*
* @param[in] hs HAP Service Object Handle
* @param[in] iid Desired IID
*/
void hap_serv_set_iid(hap_serv_t *hs, int32_t iid);
/** HomeKit Setup Information */
typedef struct {
/** SRP Salt */
uint8_t salt[16];
/** SRP Verifier */
uint8_t verifier[384];
} hap_setup_info_t;
/**
* @brief Set the Setup info for HomeKit Pairing
*
* HomeKit Pairing/Accessory Setup uses a Setup Code (Also called Pairing PIN).
* However, the specs recommend that, instead of storing the PIN on the accessory,
* the salt and verifier for the PIN should be stored.
*
* This API should be used to provide this information.
*
* @param[in] setup_info Pointer to the Setup Information structure which has
* the Salt and Verifier.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure (like setup_info being NULL);
*/
int hap_set_setup_info(const hap_setup_info_t *setup_info);
/**
* @brief Set the setup code (i.e. pairing pin)
*
* @note Ideally, the PIN should not be present in the firmware. Instead,
* the salt and verifier should be stored on the accessory and provided using
* hap_set_setup_info(). This API should be used only for testing purposes.
*
* Using this API overrides the setup information provided by hap_set_setup_info().
*
* @param[in] setup_code NULL terminated Setup code of the format xxx-xx-xxx where each
* x is a number
*/
void hap_set_setup_code(const char *setup_code);
/**
* @brief Set the setup ID
*
* @param[in] setup_id NULL terminated Setup ID, which will be a 4 character
* long alpha numeric string (with capital alphabets)
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_set_setup_id(const char *setup_id);
/**
* Check if the MFi authentication co-processor is connected
*
* @note This should be called before hap_init()
*
* @return HAP_SUCCESS if an MFi co-processor is detected
* @return HAP_FAIL if no MFi co-processor is detected
*/
int hap_check_mfi_chip();
/**
* @brief Reboot the accessory
*
* This closes all the active HomeKit sessions and reboots the accessory.
* It is recommended to use this API instead of the standard platform reboot/restart
* APIs, for cleaner operation.
*
* @note This is an asynchronous API (actual action executed in HomeKit core thread context)
* and can be invoked even from interrupt context. The \ref HAP_EVENT_ACC_REBOOTING
* event will be invoked after this.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_reboot_accessory();
/**
* @brief Reset to Factory Settings
*
* This resets the accessory to factory settings and reboots it.
* All pairing information, network information and accessory specific information
* (like accessory ID, keys, config number, etc.) is erased. Even all application
* data written to NVS partition is erased.
*
* @note This is an asynchronous API (actual action executed in HomeKit core thread context)
* and can be invoked even from interrupt context. The \ref HAP_EVENT_ACC_REBOOTING
* event will be invoked after this.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_reset_to_factory();
/**
* @brief Reset the Network Credentials
*
* This resets only the network credntials (keeping the pairing and any other information
* intact) and reboots the accessory.
*
* @note This is an asynchronous API (actual action executed in HomeKit core thread context)
* and can be invoked even from interrupt context. The \ref HAP_EVENT_ACC_REBOOTING
* event will be invoked after this.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_reset_network();
/**
* @brief Reset HomeKit Data
*
* This resets all the data stored by the HomeKit Framework, which includes
* all pairing information, network information and accessory specific information
* (like accessory ID, keys, config number, etc.)
*
* @note This is an asynchronous API (actual action executed in HomeKit core thread context)
* and can be invoked even from interrupt context. The \ref HAP_EVENT_ACC_REBOOTING
* event will be invoked after this.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_reset_homekit_data();
/**
* @brief Reset HomeKit Pairings
*
* This API resets the HomeKit Pairing Information and also the accessory specific
* information (like accessory ID, keys, config number, etc.). The accessory id is
* reset because else, the paired controllers would consider the accessory as paired,
* as they would still have the keys for the given accessory id.
*
* @note This is an asynchronous API (actual action executed in HomeKit core thread context)
* and can be invoked even from interrupt context. The \ref HAP_EVENT_ACC_REBOOTING
* event will be invoked after this.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_reset_pairings();
/**
* @brief Check if the request is from Admin Controller
*
* This API can be used inside service read (\ref hap_serv_read_t) and service write
* (\ref hap_serv_write_t) callbacks to check if the request was from an admin controller.
* Pass the write_priv or read_priv pointer to this API
*
* @return true if request is from an admin controller
* @return false if request is from a non-admin controller
*/
bool hap_is_req_admin(void *priv);
/**
* @brief Get the ID of the controller who sent the request
*
* This API can be used inside service read (\ref hap_serv_read_t) and service write
* (\ref hap_serv_write_t) callbacks to check the id of the controller who sent the request.
* Pass the write_priv or read_priv pointer to this API
*
* @return pointer to a null terminated controller id string on success.
* @return NULL on failure.
*/
char *hap_req_get_ctrl_id(void *priv);
/**
*
* @brief Get a value from factory NVS keystore
*
* This API can be used to fetch information from the factory_nvs flash partition.
* This is treated as a Read-Only partition and so, no "set" API has been provided.
*
* @param[in] name_space NVS name space from which the value needs to be read.
* @param[in] key The NVS key for the value
* @param[out] val Buffer which will be used to hold the value, if found
* @param[in,out] val_size Holds the size of the val buffer. Will be populated with the length of
* the value by this function.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_factory_keystore_get(const char *name_space, const char *key, uint8_t *val, size_t *val_size);
/**
* Enable MFi authentication
*
* @param[in] auth_type The authentication type desired.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL on failure
*/
int hap_enable_mfi_auth(hap_mfi_auth_type_t auth_type);
/**
* @brief Enable Software Token based authentication.
*
* This is valid for HomeKit Accessory Protocol Spec R12 (or later) and works with iOS 11.3 (or later) only.
*
* This API enables the Software Token based authentication for HomeKit pairing. It requires the accessory
* UUID and Token to be programmed in the factory_nvs partition. Please check the README for more details.
*
* Please refer HomeKit Software Authentication Server Specification to understand the server side
* implications of using this method for HomeKit Pairing. The tokens fetched from Apple server need to
* be programmed on the accessory
*
* @note Software Authentication is not recommended for new accessories. It should be used only if HomeKit
* functionality needs to be enabled on accessories which are already in field, or if an existing hardware
* design needs to be re-used for cost or other considerations. For any other use cases, please get in touch
* with your Apple contact.
*
* @return HAP_SUCCESS on success
* @return HAP_FAIL if the correct UUID or Token is not provided in the factory_nvs partition
*/
static inline int hap_enable_software_auth()
{
return hap_enable_mfi_auth(HAP_MFI_AUTH_SW);
}
#define HAP_REBOOT_REASON_UNKNOWN "unknown"
#define HAP_REBOOT_REASON_RESET_TO_FACTORY "reset_to_factory"
#define HAP_REBOOT_REASON_REBOOT_ACC "reboot_acc"
#define HAP_REBOOT_REASON_RESET_NETWORK "reset_network"
#define HAP_REBOOT_REASON_RESET_PAIRINGS "reset_pairings"
#define HAP_REBOOT_REASON_RESET_HOMEKIT_DATA "reset_homekit_data"
/** HomeKit Event Base */
ESP_EVENT_DECLARE_BASE(HAP_EVENT);
/** HomeKit Events */
typedef enum {
/** A new controller was paired/added/modified.
* Associated data is a NULL terminated controller identifier string.
*/
HAP_EVENT_CTRL_PAIRED = 1,
/** A controller was removed
* Associated data is a NULL terminated controller identifier string.
*/
HAP_EVENT_CTRL_UNPAIRED,
/** A paired controller connected to the accessory (extablished a pair verified session).
* Associated data is a NULL terminated controller identifier string.
*/
HAP_EVENT_CTRL_CONNECTED,
/** A controller disconnected from the accessory. This event is reported before the
* actual disconnection, because for cases like pair-remove, the controller information
* gets erased before the disconnection, and so the controller id is not available
* after disconnection.
* Associated data is a NULL terminated controller identifier string.
*/
HAP_EVENT_CTRL_DISCONNECTED,
/** A Pair Setup attempt has started. Waiting for Setup Code */
HAP_EVENT_PAIRING_STARTED,
/** Pair Setup was aborted because of inactivity or a wrong setup code */
HAP_EVENT_PAIRING_ABORTED,
/** A GET on /accessories was successfully completed */
HAP_EVENT_GET_ACC_COMPLETED,
/** A GET on /characteristics was successfully completed */
HAP_EVENT_GET_CHAR_COMPLETED,
/** A PUT (Set value) on /characteristics was successfully completed.
* This event can also mean that notifications were enabled for some
* characteristics as the same is also done in PUT /characteristics */
HAP_EVENT_SET_CHAR_COMPLETED,
/* Accessory is about to reboot. Will be triggered for operations like hap_reset_to_factory(),
* hap_reboot_accessory(), hap_reset_network(), hap_reset_pairings() and hap_reset_homekit_data()
* just before rebooting. Associated data is a pointer to a string indicating the reboot reason.
* Reefer the HAP_REBOOT_REASON_* macros for possible values.
*/
HAP_EVENT_ACC_REBOOTING,
} hap_event_t;
/** Prototype for HomeKit Event handler
*
* @param[in] event The event id of type \ref hap_event_t
* @param[in] data Data associated with the event (if applicable).
* Please refer \ref hap_event_t documentation for information regarding
* data for each event.
*/
typedef void (*hap_event_handler_t) (hap_event_t event, void *data);
/** Register HomeKit Event Handler
*
* If applications are interested in HomeKit specific events, they can
* write their own event handler and register with HomeKit core using
* this API.
*
* @param[in] handler Application specific HomeKit event handler.
*/
void hap_register_event_handler(hap_event_handler_t handler);
/** Get Paired controller count
*
* This API can be used to get a count of number of paired controllers.
* Thi can be used only after hap_init().
*
* @return Number of paired controllers
*/
int hap_get_paired_controller_count();
/*
* Enable Simple HTTP Debugging
*
* Calling this API will enable HTTP Debugging which will show some HomeKit HTTP Debug
* info like the URL and data.
*/
void hap_http_debug_enable();
/**
* Disable Simple HTTP Debugging
*
* Calling this API will disable HTTP Debugging which was enabled by hap_enable_http_debug()
*/
void hap_http_debug_disable();
/** Get Setup payload
*
* This gives the setup payload for the given information
*
* @param[in] setup_code NULL terminated setup code. Eg. "111-22-333"
* @param[in] setup_id NULL terminated setup id. Eg. "ES32"
* @param[in] wac_support Boolean indicating if WAC provisioning is supported.
* @param[in] cid Accessory category identifier.
*
* @return On success, an allocated NULL terminal setup paylod string. Eg. "X-HM://003363Z4TES32". Should be freed by the caller.
* @return NULL on failure.
*/
char *esp_hap_get_setup_payload(char *setup_code, char *setup_id, bool wac_support, hap_cid_t cid);
#ifdef __cplusplus
}
#endif
#endif /* _ESP_HAP_H_ */