Skip to content

Server limited to 25 characteristics #199

Description

@MrCavemen

I'm trying to run a bridge with 14 blinds (as different accessories as I want to put them in different rooms).
These each have 3 services.

My setup can handle 9 blinds, from 10 blinds and above, the accessories have the red "not responsive" text.
Output from the terminal tells me that when all target and position characteristics are being requested not all of them "make it".
For only 12/14 blinds, both target and current position is being asked. For the unlucky 13th, only one is asked, and the 14th blind is ignored.

Fun shenanigans:

  • (They are in a bridge, as it seems that when you have more than 8 accessories, homekit automatically assumes that it is a bridge. When you don't add the bridge, the first accessory will be seen as the bridge, and you will not be able to interact with it.)
  • When you add the bridge to the home hub, each one of them does update to the closed position, but after the adding steps, they are all listed as unresponsive.
  • Long pressing an accessory allows one to change the blind position, as it temporarily becomes responsive (until the home_hub requests all characteristics).
  • Siri can also change the position of these unresponsive blinds (as they temporarily become responsive)
  • Official homekit accessories (two smoke detectors) can also not update (become briefly unresponsive) when requesting all characteristics

My Setup:

  • Hub: Original iPad Air (iOS 12.5.5, <- latest supported software version)
  • ESP32 (4MB)
  • esp-idf v4.3.2
  • maximkulkin/esp-homekit and demo: latest commits

Part of the main.c code:

// ext := extension to separate pcb boards
// n := blind number on pcb
#define gen_blinds_accessory(ext, n, idd) \
HOMEKIT_ACCESSORY(.id= idd ,\
    .category=homekit_accessory_category_window_covering,\
    .services=(homekit_service_t*[]){\
        HOMEKIT_SERVICE(ACCESSORY_INFORMATION,\
            .characteristics=(homekit_characteristic_t*[]){\
                HOMEKIT_CHARACTERISTIC(NAME, "Blind"#ext"_"#n),\
                HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Me"),\
                HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "B"#ext"_"#n),\
                HOMEKIT_CHARACTERISTIC(MODEL, "BLIND"),\
                HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "0.1"),\
                HOMEKIT_CHARACTERISTIC(IDENTIFY, NULL),\
                NULL\
        }),\
    HOMEKIT_SERVICE(WINDOW_COVERING, .primary=true,\
        .characteristics=(homekit_characteristic_t*[]){\
            &blind_current_pos##ext##_##n,\
            &blind_target_pos##ext##_##n,\
            &blind_pos_state##ext##_##n,\
            NULL\
        }),\
    NULL}),



homekit_accessory_t *accessories[] = {
    HOMEKIT_ACCESSORY(.id=1 ,
        .category=homekit_accessory_category_bridge,
        .services=(homekit_service_t*[]){
            HOMEKIT_SERVICE(ACCESSORY_INFORMATION,
                .characteristics=(homekit_characteristic_t*[]){
                    HOMEKIT_CHARACTERISTIC(NAME, "CU Bridge"),
                    HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Me"),
                    HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "B"),
                    HOMEKIT_CHARACTERISTIC(MODEL, "BRIDGE"),
                    HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "0.1"),
                    HOMEKIT_CHARACTERISTIC(IDENTIFY, NULL),
                    NULL
                }),
        NULL}),
    gen_blinds_accessory(_1,2,2)
    gen_blinds_accessory(_1,3,3)
    gen_blinds_accessory(_1,4,4)
    gen_blinds_accessory(_1,6,5)
    gen_blinds_accessory(_1,7,6)
    gen_blinds_accessory(_1,8,7)

    gen_blinds_accessory(_2,1,8)
    gen_blinds_accessory(_2,2,9)
    gen_blinds_accessory(_2,3,10)
    gen_blinds_accessory(_2,4,11)
    gen_blinds_accessory(_2,5,12)
    gen_blinds_accessory(_2,6,13)
    gen_blinds_accessory(_2,7,14)
    gen_blinds_accessory(_2,8,15)
    NULL
};

Part of the blinds.c code:

//TODO store on FLASH memory to survive reboots & power outages
struct BLIND_DATA {
    uint8_t current;
    uint8_t target;
    uint8_t pos_state;
    bool hold;
};
static struct BLIND_DATA data_1[8];
static struct BLIND_DATA data_2[8];

#define gen_c_CURRENT_POS(ext, n) homekit_characteristic_t blind_current_pos##ext##_##n = \
    HOMEKIT_CHARACTERISTIC_(CURRENT_POSITION, \
                            100, \
                            .getter_ex=get_HK_UINT8_value, \
                            .setter_ex=set_HK_UINT8_value, \
                            .context=(void*)&(data##ext[n-1].current));

homekit_value_t get_HK_UINT8_value(const homekit_characteristic_t *ch) {
    uint8_t *data = (uint8_t*) ch->context;
    printf("printing get HK value for blind ~~~~~~~~~~~~~~\n");
    printf("uint8 data: %i\n", *data);
    return HOMEKIT_UINT8(*data);
}
void set_HK_UINT8_value(homekit_characteristic_t *ch, const homekit_value_t value) {
    printf("printing HK value for blind ~~~~~~~~~~~~~~\n");
    printf("uint8 value: %i\n", value.uint8_value);
    printf("uint  value: %i\n", value.int_value);
    
    uint8_t *data = ch->context;
    *data = value.uint8_value;
}

Output log:
(Note that for only 12/14 blinds, both target and current position is being asked. For the unlucky 13th, only one is asked, and the 14th blind is ignored.)

>>> HomeKit: [Client 2] Get Characteristics
>>> homekit_server_on_get_characteristics: Free heap: 185608
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 10.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 10.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 13.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 13.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 8.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 8.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 6.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 6.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 12.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 12.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 5.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 5.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 2.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 2.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 7.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 7.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 14.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 14.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 3.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 3.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 11.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 11.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 9.10
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 9.9
>>> homekit_server_on_get_characteristics: [Client 2] Requested characteristic info for 4.10
>>> client_sendv: [Client 2] Sending payload: HTTP/1.1 200 OK\x0D\x0AContent-Type: application/hap+json\x0D\x0ATransfer-Encoding: chunked\x0D\x0AConnection: keep-alive\x0D\x0A\x0D\x0A
>>> HomeKit: [Client 2] Requested characteristic info for 10.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 10.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 13.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 13.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 8.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 8.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 6.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 6.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> client_sendv: [Client 2] Sending payload: 3ff\x0D\x0A{"characteristics":[{"aid":10,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":10,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":13,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":13,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":8,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":8,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":6,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":6,"iid":10,"description":"\x0D\x0A
>>> HomeKit: [Client 2] Requested characteristic info for 12.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 12.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 5.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 5.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 2.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 2.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 7.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> client_sendv: [Client 2] Sending payload: 3ff\x0D\x0ATarget Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":12,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":12,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":5,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":5,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":2,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":2,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":7,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","\x0D\x0A
>>> HomeKit: [Client 2] Requested characteristic info for 7.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 14.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 14.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 3.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 3.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 11.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 11.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 9.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> client_sendv: [Client 2] Sending payload: 400\x0D\x0AminValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":7,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":14,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":14,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":3,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":3,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":11,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":11,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"ai\x0D\x0A
>>> HomeKit: [Client 2] Requested characteristic info for 9.9 ("Current Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> HomeKit: [Client 2] Requested characteristic info for 4.10 ("Target Position")
printing get HK value for blind ~~~~~~~~~~~~~~
uint8 data: 0
>>> client_sendv: [Client 2] Sending payload: 19b\x0D\x0Ad":9,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":9,"iid":9,"description":"Current Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0},{"aid":4,"iid":10,"description":"Target Position","format":"uint8","unit":"percentage","minValue":0,"maxValue":100,"minStep":1,"value":0}]}\x0D\x0A
>>> client_sendv: [Client 2] Sending payload: \x30\x0D\x0A\x0D\x0A
>>> homekit_client_process: [Client 2] Finished processing

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions