Hello there,
I am reporting the following issue when adding an Hisense DecoTV through HomeKit inside OpenHAB 5.2.1 with the Homekit Binding.
I am running this test on a fresh installation of OpenHAB through a Linux Container, and I did add the HomeKit Thing through auto-discovery inside OpenHAB; then, I executed the Direct pairing (simple pairing) Thing action and provided the HomeKit pairing code showed on the TV, to complete the process.
Finally, on the TV itself I got confirmation for successful pairing.
At this point, the Thing created in OpenHAB keeps the “ERROR” state with the following messages on the log:
INFO
09:15:30.714 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'homekit:accessory:4a6d5c913114' changed from UNINITIALIZED (NOT_YET_READY) to INITIALIZING
09:15:30.726 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'homekit:accessory:4a6d5c913114' changed from INITIALIZING to UNKNOWN
09:15:37.634 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'homekit:accessory:4a6d5c913114' changed from UNKNOWN to OFFLINE (COMMUNICATION_ERROR): Accessory fetch error: 'com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected an int but was BEGIN_ARRAY at line 1 column 2290 path $.accessories0.services2.characteristics8.valid-values-range0
See https://github.com/google/gson/blob/main/Troubleshooting.md#unexpected-json-structure', reconnecting...
TRACE
09:19:31.130 [DEBUG] [omekit.internal.transport.IpTransport] - Connecting to 192.168.1.43:4635 alias LinuxTV.local:4635
09:19:31.137 [DEBUG] [omekit.internal.transport.IpTransport] - Connected to 192.168.1.43:4635 alias LinuxTV.local:4635
09:19:31.140 [TRACE] [l.handler.HomekitBaseAccessoryHandler] - homekit:accessory:4a6d5c913114 set mac property F0:ED:**:**:**:**
09:19:31.143 [DEBUG] [l.handler.HomekitBaseAccessoryHandler] - homekit:accessory:4a6d5c913114 starting Pair-Verify with existing key
09:19:31.146 [DEBUG] [internal.hapservices.PairVerifyClient] - Created..
09:19:31.149 [DEBUG] [internal.hapservices.PairVerifyClient] - Pair-Verify M1: Send verification start request with client ephemeral X25519 PK to server
09:19:31.152 [TRACE] [internal.hapservices.PairVerifyClient] -
- 0x06: 01 {1}
- 0x03: 2da5************************************************************ {32}
09:19:31.156 [TRACE] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 sent:
POST /pair-verify HTTP/1.1
Host: LinuxTV.local:4635
Content-Length: 37
Content-Type: application/pairing+tlv8
-¥¨DFÎ;4;`në42ºH
{
09:19:31.165 [TRACE] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 received:
HTTP/1.1 200 OK
Content-Type: application/pairing+tlv8
Content-Length: 140
ñP«ýUT+p'
eÍÿ[********************************************************************************************
09:19:31.168 [DEBUG] [internal.hapservices.PairVerifyClient] - Pair-Verify M2: Read server ephemeral X25519 PK and encrypted id; validate signature
09:19:31.172 [TRACE] [internal.hapservices.PairVerifyClient] -
- 0x06: 02 {1}
- 0x03: adf1************************************************************ {32}
- 0x05: fbe7****************************************************************************************************************************************************************************************************** {101}
09:19:31.179 [DEBUG] [internal.hapservices.PairVerifyClient] - Pair-Verify M3: Send encrypted controller id with signature
09:19:31.185 [TRACE] [internal.hapservices.PairVerifyClient] -
- 0x06: 03 {1}
- 0x05: 2990******************************************************************************************************************************************************************************************************************************************** {120}
09:19:31.418 [TRACE] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 sent:
POST /pair-verify HTTP/1.1
Host: LinuxTV.local:4635
Content-Length: 125
Content-Type: applicati5¦qpairing+tlv8
À²¤¡*******************
®£y$*******************
·ç:.******
09:19:31.489 [TRACE] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 received:
HTTP/1.1 200 OK
Content-Type: application/pairing+tlv8
Content-Length: 3
09:19:31.492 [DEBUG] [internal.hapservices.PairVerifyClient] - Pair-Verify M4: Confirm validation; derive session keys
09:19:31.494 [TRACE] [internal.hapservices.PairVerifyClient] -
- 0x06: 04 {1}
09:19:31.496 [TRACE] [omekit.internal.transport.IpTransport] - setSessionKeys()
09:19:31.993 [DEBUG] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 HTTP reader closed normally
09:19:31.996 [TRACE] [omekit.internal.transport.IpTransport] - setSessionKeys() org.openhab.binding.homekit.internal.session.SecureSession@3c33cbb1
09:19:31.998 [DEBUG] [l.handler.HomekitBaseAccessoryHandler] - homekit:accessory:4a6d5c913114 restored pairing was verified
09:19:34.001 [TRACE] [l.handler.HomekitBaseAccessoryHandler] - homekit:accessory:4a6d5c913114 throttling call for PT1.999985065S to respect minimum interval
09:19:36.004 [TRACE] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 sent:
GET /accessories HTTP/1.1
Host: LinuxTV.local:4635
09:19:36.023 [TRACE] [omekit.internal.transport.IpTransport] - 192.168.1.43:4635 received:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/hap+json
{"accessories":[{"aid":1,"services":[{"iid":1,"type":"3E","primary":false,"hidden":false,"characteristics":[{"iid":2,"type":"14","format":"bool","perms":["pw"]},{"iid":3,"type":"20","format":"string","value":"Hisense","perms":["pr"],"ev":false,"enc":false},{"iid":4,"type":"21","format":"string","value":"43S5QE","perms":["pr"],"ev":false,"enc":false},{"iid":5,"type":"23","format":"string","value":"Hisense 43S5QE-15A10159","perms":["pr"],"ev":false,"enc":false},{"iid":6,"type":"30","format":"string","value":"3TE43G25453E01715A10159","perms":["pr"],"ev":false,"enc":false},{"iid":7,"type":"52","format":"string","value":"09.5012.251219","perms":["pr","ev"],"ev":false,"enc":false},{"iid":10,"type":"220","format":"data","value":"7gXr7ZN7s+I=","perms":["pr"],"ev":false,"enc":false,"maxDataLen":8}]},{"iid":16,"type":"A2","primary":false,"hidden":false,"characteristics":[{"iid":18,"type":"37","format":"string","value":"1.1.0","perms":["pr"],"ev":false,"enc":false}]},{"iid":48,"type":"D8","primary":true,"hidden":false,"linked":[1,16,129,80,256,272,384,288,304,320],"characteristics":[{"iid":50,"type":"23","format":"string","value":"Television","perms":["pr"],"ev":false,"enc":false},{"iid":51,"type":"E3","format":"string","value":"Cornicione","perms":["pr","pw","ev"],"ev":false,"enc":false},{"iid":52,"type":"B0","format":"uint8","value":1,"perms":["pr","pw","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":53,"type":"E7","format":"uint32","value":2,"perms":["pr","pw","ev"],"ev":false,"enc":false,"minValue":1,"maxValue":14,"minStep":1},{"iid":54,"type":"E8","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":55,"type":"136","format":"tlv8","value":"AQQBAAAAAAABBAIAAAAAAAEEAwAAAAAAAQQEAAAAAAABBAUAAAAAAAEEBgAAAA==","perms":["pr","ev"],"ev":false,"enc":false},{"iid":56,"type":"DD","format":"uint8","value":0,"perms":["pr","pw","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":59,"type":"E1","format":"uint8","perms":["pw"],"minValue":0,"maxValue":16,"minStep":1},{"iid":60,"type":"E2","format":"uint8","value":10,"perms":["pr","pw","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":12,"minStep":1,"valid-values":[0,1,2,3,5,6,7,11,12],"valid-values-range":[[0,12]]},{"iid":61,"type":"8","format":"int","value":50,"perms":["pr","pw","ev"],"ev":false,"enc":false,"unit":"percentage","minValue":0,"maxValue":100,"minStep":1}]},{"iid":129,"type":"DA","primary":false,"hidden":false,"characteristics":[{"iid":130,"type":"E5","format":"uint16","value":0,"perms":["pr","pw","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":2,"minStep":1},{"iid":131,"type":"E4","format":"tlv8","value":"AQACAQA=","perms":["pr","pw","ev"],"ev":false,"enc":false}]},{"iid":80,"type":"113","primary":false,"hidden":false,"characteristics":[{"iid":84,"type":"119","format":"uint8","value":8,"perms":["pr","pw","ev"],"ev":false,"enc":false,"unit":"percentage","minValue":0,"maxValue":100,"minStep":1},{"iid":82,"type":"11A","format":"bool","value":0,"perms":["pr","pw","ev"],"ev":false,"enc":false},{"iid":83,"type":"23","format":"string","value":"Speaker","perms":["pr"],"ev":false,"enc":false},{"iid":85,"type":"B0","format":"uint8","value":1,"perms":["pr","pw","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":86,"type":"E9","format":"uint8","value":3,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1},{"iid":87,"type":"EA","format":"uint8","perms":["pw"],"minValue":0,"maxValue":1,"minStep":1}]},{"iid":256,"type":"D9","primary":false,"hidden":false,"characteristics":[{"iid":258,"type":"DB","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":10,"minStep":1},{"iid":259,"type":"D6","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":260,"type":"E6","format":"uint32","value":1,"perms":["pr"],"ev":false,"enc":false},{"iid":261,"type":"23","format":"string","value":"Home","perms":["pr"],"ev":false,"enc":false},{"iid":262,"type":"E3","format":"string","value":"Casa","perms":["pr","ev"],"ev":false,"enc":false},{"iid":263,"type":"135","format":"uint8","value":3,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1}]},{"iid":272,"type":"D9","primary":false,"hidden":false,"characteristics":[{"iid":274,"type":"DB","format":"uint8","value":2,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":10,"minStep":1},{"iid":275,"type":"D6","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":276,"type":"E6","format":"uint32","value":2,"perms":["pr"],"ev":false,"enc":false},{"iid":277,"type":"23","format":"string","value":"TV","perms":["pr"],"ev":false,"enc":false},{"iid":278,"type":"E3","format":"string","value":"TV Channelsâ¶","perms":["pr","ev"],"ev":false,"enc":false},{"iid":279,"type":"135","format":"uint8","value":3,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1}]},{"iid":384,"type":"D9","primary":false,"hidden":false,"characteristics":[{"iid":386,"type":"DB","format":"uint8","value":8,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":10,"minStep":1},{"iid":387,"type":"D6","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":388,"type":"E6","format":"uint32","value":3,"perms":["pr"],"ev":false,"enc":false},{"iid":389,"type":"23","format":"string","value":"AirPlay","perms":["pr"],"ev":false,"enc":false},{"iid":390,"type":"E3","format":"string","value":"AirPlay","perms":["pr","ev"],"ev":false,"enc":false},{"iid":391,"type":"135","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1}]},{"iid":288,"type":"D9","primary":false,"hidden":false,"characteristics":[{"iid":290,"type":"DB","format":"uint8","value":3,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":10,"minStep":1},{"iid":291,"type":"D6","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":292,"type":"E6","format":"uint32","value":4,"perms":["pr"],"ev":false,"enc":false},{"iid":293,"type":"23","format":"string","value":"HDMI1","perms":["pr"],"ev":false,"enc":false},{"iid":294,"type":"E3","format":"string","value":"HDMI1","perms":["pr","pw","ev"],"ev":false,"enc":false},{"iid":295,"type":"135","format":"uint8","value":0,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1}]},{"iid":304,"type":"D9","primary":false,"hidden":false,"characteristics":[{"iid":306,"type":"DB","format":"uint8","value":3,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":10,"minStep":1},{"iid":307,"type":"D6","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":308,"type":"E6","format":"uint32","value":5,"perms":["pr"],"ev":false,"enc":false},{"iid":309,"type":"23","format":"string","value":"HDMI2","perms":["pr"],"ev":false,"enc":false},{"iid":310,"type":"E3","format":"string","value":"HDMI2","perms":["pr","pw","ev"],"ev":false,"enc":false},{"iid":311,"type":"135","format":"uint8","value":0,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1}]},{"iid":320,"type":"D9","primary":false,"hidden":false,"characteristics":[{"iid":322,"type":"DB","format":"uint8","value":3,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":10,"minStep":1},{"iid":323,"type":"D6","format":"uint8","value":1,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":1,"minStep":1},{"iid":324,"type":"E6","format":"uint32","value":6,"perms":["pr"],"ev":false,"enc":false},{"iid":325,"type":"23","format":"string","value":"HDMI3","perms":["pr"],"ev":false,"enc":false},{"iid":326,"type":"E3","format":"string","value":"HDMI3","perms":["pr","pw","ev"],"ev":false,"enc":false},{"iid":327,"type":"135","format":"uint8","value":0,"perms":["pr","ev"],"ev":false,"enc":false,"minValue":0,"maxValue":3,"minStep":1}]}]}]}
09:19:36.027 [DEBUG] [l.handler.HomekitBaseAccessoryHandler] - homekit:accessory:4a6d5c913114 accessory fetch error com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected an int but was BEGIN_ARRAY at line 1 column 2290 path $.accessories[0].services[2].characteristics[8].valid-values-range[0]
See https://github.com/google/gson/blob/main/Troubleshooting.md#unexpected-json-structure, reconnecting..
09:19:36.029 [TRACE] [l.handler.HomekitBaseAccessoryHandler] - homekit:accessory:4a6d5c913114 stack trace:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected an int but was BEGIN_ARRAY at line 1 column 2290 path $.accessories[0].services[2].characteristics[8].valid-values-range[0]
See https://github.com/google/gson/blob/main/Troubleshooting.md#unexpected-json-structure
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:521)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:84)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:64)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:84)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:64)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:84)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:64)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
at com.google.gson.Gson.fromJson(Gson.java:1358)
at com.google.gson.Gson.fromJson(Gson.java:1259)
at com.google.gson.Gson.fromJson(Gson.java:1169)
at com.google.gson.Gson.fromJson(Gson.java:1106)
at org.openhab.binding.homekit.internal.handler.HomekitBaseAccessoryHandler.fetchAccessories(HomekitBaseAccessoryHandler.java:254)
at org.openhab.binding.homekit.internal.handler.HomekitBaseAccessoryHandler.fetchAccessoriesAfterUpgrade(HomekitBaseAccessoryHandler.java:237)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.IllegalStateException: Expected an int but was BEGIN_ARRAY at line 1 column 2290 path $.accessories[0].services[2].characteristics[8].valid-values-range[0]
See https://github.com/google/gson/blob/main/Troubleshooting.md#unexpected-json-structure
at com.google.gson.stream.JsonReader.unexpectedTokenError(JsonReader.java:1831)
at com.google.gson.stream.JsonReader.nextInt(JsonReader.java:1346)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:265)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:257)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:84)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:64)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
... 30 more
Thanks for your time to whoever may look into this, I will try to experiment more with that “HomeKit TV” in the meantime.