openhab / openhab-addons

Add-ons for openHAB
https://www.openhab.org/
Eclipse Public License 2.0
1.86k stars 3.58k forks source link

[homekit] Hierarchical objects do not seem to be refreshed #17155

Open lsiepel opened 1 month ago

lsiepel commented 1 month ago

Did some testing after i encoutnered this weird issue, also mentioned here.

I have setup this irrigation system:

Group   gr_buiten_achter_irrigatie                          "Name"                                                      { homekit="IrrigationSystem" }
String                      buiten_achter_irrigatie_program     "Program mode [%s]"     (gr_buiten_achter_irrigatie)        { homekit="IrrigationSystem.ProgramMode" }
String                      buiten_achter_irrigatie_naam        "Name"                  (gr_buiten_achter_irrigatie)        { homekit="IrrigationSystem.Name", channel="gardena:irrigation_control:home:buiten_achter_irrigatie:common#name"  }
Group:Switch:AND(ON,OFF)    buiten_achter_irrigatie_enabled     "Enabled"               (gr_buiten_achter_irrigatie)        { homekit="IrrigationSystem.Active" }
Group:Switch:OR(ON,OFF)     buiten_achter_irrigatie_inuse       "Valve open"            (gr_buiten_achter_irrigatie)        { homekit="IrrigationSystem.InUseStatus" }
Number                      buiten_achter_irrigatie_remaining   "Total remaining [%s]"  (gr_buiten_achter_irrigatie)        { homekit="IrrigationSystem.RemainingDuration" }

Group   gr_buiten_achter_irrigatie_klep1            "Valve 1"           (gr_buiten_achter_irrigatie)                                        { homekit="Valve"[ServiceIndex=1] }
String  buiten_achter_irrigatie_klep1_naam          "Valve"             (gr_buiten_achter_irrigatie_klep1)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveOne#name" }
String  buiten_achter_irrigatie_klep1_activity      "Activiteit"                                                                            { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveOne#activity" }
Switch  buiten_achter_irrigatie_klep1_enabled       "Enabled"           (buiten_achter_irrigatie_enabled,gr_buiten_achter_irrigatie_klep1)  { homekit="Valve.ActiveStatus" }
Switch  buiten_achter_irrigatie_klep1_inuse         "Valve open"        (buiten_achter_irrigatie_inuse,gr_buiten_achter_irrigatie_klep1)    { homekit="Valve.InUseStatus" }
Switch  buiten_achter_irrigatie_klep1_stop          "Stop Switch"       (gr_buiten_achter_irrigatie_klep1)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveOne_commands#stop_until_next_task" }
Number  buiten_achter_irrigatie_klep1_duration      "Opdr. duration"    (gr_buiten_achter_irrigatie_klep1)                                  { homekit="Valve.Duration"[homekitDefaultDuration=1800]}
Number  buiten_achter_irrigatie_klep1_remaining     "Remaining [%s]"    (gr_buiten_achter_irrigatie_klep1)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveOne#duration"}
Number  buiten_achter_irrigatie_klep1_hkremaining   "Remaining [%s]"    (gr_buiten_achter_irrigatie_klep1)                                  { homekit="Valve.RemainingDuration"}

Group   gr_buiten_achter_irrigatie_klep2            "Valve 2"           (gr_buiten_achter_irrigatie)                                        { homekit="Valve"[ServiceIndex=2] }
String  buiten_achter_irrigatie_klep2_naam          "Valve"             (gr_buiten_achter_irrigatie_klep2)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveTwo#name" }
String  buiten_achter_irrigatie_klep2_activity      "Activiteit"                                                                            { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveTwo#activity" }
Switch  buiten_achter_irrigatie_klep2_enabled       "Enabled"           (buiten_achter_irrigatie_enabled,gr_buiten_achter_irrigatie_klep2)  { homekit="Valve.ActiveStatus" }
Switch  buiten_achter_irrigatie_klep2_inuse         "Valve open"        (buiten_achter_irrigatie_inuse,gr_buiten_achter_irrigatie_klep2)    { homekit="Valve.InUseStatus" }
Switch  buiten_achter_irrigatie_klep2_stop          "Stop Switch"       (gr_buiten_achter_irrigatie_klep2)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveTwo_commands#stop_until_next_task" }
Number  buiten_achter_irrigatie_klep2_duration      "Opdr. duration"    (gr_buiten_achter_irrigatie_klep2)                                  { homekit="Valve.Duration"[homekitDefaultDuration=1800]}
Number  buiten_achter_irrigatie_klep2_remaining     "Remaining [%s]"    (gr_buiten_achter_irrigatie_klep2)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveTwo#duration"}
Number  buiten_achter_irrigatie_klep2_hkremaining   "Remaining [%s]"    (gr_buiten_achter_irrigatie_klep2)                                  { homekit="Valve.RemainingDuration"}

Group   gr_buiten_achter_irrigatie_klep3            "Valve 3"           (gr_buiten_achter_irrigatie)                                        { homekit="Valve"[ServiceIndex=3] }
String  buiten_achter_irrigatie_klep3_naam          "Valve"             (gr_buiten_achter_irrigatie_klep3)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveThree#name" }
String  buiten_achter_irrigatie_klep3_activity      "Activiteit"                                                                            { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveThree#activity" }
Switch  buiten_achter_irrigatie_klep3_enabled       "Enabled"           (buiten_achter_irrigatie_enabled,gr_buiten_achter_irrigatie_klep3)  { homekit="Valve.ActiveStatus" }
Switch  buiten_achter_irrigatie_klep3_inuse         "Valve open"        (buiten_achter_irrigatie_inuse,gr_buiten_achter_irrigatie_klep3)    { homekit="Valve.InUseStatus" }
Switch  buiten_achter_irrigatie_klep3_stop          "Stop Switch"       (gr_buiten_achter_irrigatie_klep3)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveThree_commands#stop_until_next_task" }
Number  buiten_achter_irrigatie_klep3_duration      "Opdr. duration"    (gr_buiten_achter_irrigatie_klep3)                                  { homekit="Valve.Duration"[homekitDefaultDuration=1800]}
Number  buiten_achter_irrigatie_klep3_remaining     "Remaining [%s]"    (gr_buiten_achter_irrigatie_klep3)                                  { channel="gardena:irrigation_control:home:buiten_achter_irrigatie:valveThree#duration"}
Number  buiten_achter_irrigatie_klep3_hkremaining   "Remaining [%s]"    (gr_buiten_achter_irrigatie_klep3)                                  { homekit="Valve.RemainingDuration"}

At some point in time it showed the Irrigation system without any valves. The steps i took where:

  1. I fiddled around and could not get it to work until i renamed the irrigation group to gr_buiten_achter_irrigatie_v2, now it showed only one valve, due to me commenting out valves 2 and 3.
  2. So i added valve 2 and 3. They do not show up in the home app.
  3. When i rename the irrigation system to gr_buiten_achter_irrigatie_v3 it reloaded ande the Home app now shoes all three valves.

My first conclusion is that when the items file is reloaded and the definiton of the irrigation system changes, it is not propagated to the home app as it is not detected as a change. This might be due to the item revision logic (PR here not handling such case or maybe this PR that persists data that would need a refresh in this case ? Both are assumptions, it might be something totally different.

lsiepel commented 1 month ago

cc @ccutrer

ccutrer commented 1 month ago

So to be clear, it's not that Home is not receiving updated values for characteristics as the items are updated in openHAB, it's that you've changed the structure of the Accessory, and Home is not necessarily reflecting that changed structure immediately? Can you check your logs for the line Created {} HomeKit items in instance {}.? That line indicates we incremented the configuration revision we publish to Home, telling it to refresh its cache of the accessory structure. If you instead see Created {} HomeKit items in instance {} (no change from prior configuration)., then we didn't increment the configuration revision, and it's a bug. It's also possible you won't see either of those log lines, but I think the probability of that is extremely low. But most likely, I expect it to be a similar case to what's described in the README - Home app simply has a hard time sometimes figuring out large structural changes to existing accessories.

lsiepel commented 1 month ago

You are right; it is me changing the structure in openHAB, and that is not reflected in home app.

Sorry to say, but I don’t see either log when adding a valve to an existing irrigation item.

When I rename the irrigation item id with a version suffix (like v2 or v3) I do see the log Created {} HomeKit items in instance {} but only then all valves show up.