A work in progress collection of proprietary and as of yet undocumented HomeKit characteristics and their UUIDs used by Elgato Eve.
Based on the work by gomfunkel and 0ff. Characteristics and data dump for Door, Motion and Thermo thanks to @NebzHB.
More infos not yet incorporated in the comment section.
This list is not including all Eve accessories available and some services and characteristics still make no sense to me. If you have anything to contribute, please leave a comment. There is no guarantee that the information listed below is correct.
These characteristics are under custom service E863F007-079E-48FF-8F27-9C2605A29F52 and are used by Elgato accessories to exchange logs with Eve.app. Note that the accessory may have to include some of the custom characteristics listed below in order for the history to be shown in Eve.app.
This write-only characteristic seem to control data flux from accessory to Eve.app. A typical value when reading from a fake Eve Weather accessory is 01140100 000000. Tentative decoding:
- byte 1: ??
- byte 2: ??
- byte 3-6: Requested memory entry, based on the last entry that Eve.app downloaded. If set to 0000, asks the accessory the start restart from the beginning of the memory
- byte 7-8: ??
In this write-only characteristics a time stamp is written by Eve.app every second if the accessory is selected in the app. Format from https://gist.github.com/gomfunkel/b1a046d729757120907c#gistcomment-1841206:
the current timestamp is in seconds since 1.1.2001 e.g.: written value: cf1b521d -> reverse 1d521bcf -> hex2dec 491920335 Epoch Timestamp 1.1.2001 = 978307200; 978307200 + 491920335 = 1470227535 = Wed, 03 Aug 2016 12:32:15 GMT = 3.8.2016, 14:32:15 GMT+2:00 DST (MEST)
It is probably used to set time/date of the accessory.
This read-only characteristics is used to send the actual log entry to Eve.app It is an array of logs with each entry having x bytes as determined by Byte 1. The first portion up to byte 10 included is common, the last portion contain the data specific for each accessory.
- Byte 1: Length (i.e. 14 for 20 Bytes)
- Bytes 2-5: entry counter
- Bytes 6-9: Seconds since reference time set with type 0x81 entry. In order to account for multiple iOS devices, the actual reference time and offset are apparently always reported also in E863F116
- Byte 10: Entry type
- 0x81 Entry to set the reference timestamp, to be written on bytes 11-14. A negative offset can be written on bytes 6-9, and it's probably neeeded when the clock is updated.
- 0x07 Entry for Eve Weather log.
- 0x1f Entry for Eve Energy log (20 bytes in total)
- 0x1e Entry for Eve Energy log (18 bytes in total - not working)
- 0x0f Entry for Eve Room log.
- 0x02 Entry for Eve Motion log.
- 0x01 Entry for Eve Door log.
- 0x1f Entry for Eve Thermo log.
Accessory specific portion:
- Bytes 11 & 12: ??
- Bytes 13 & 14: ??
- Bytes 15 & 16: Power multiplied by 10. Eve.app will assume that the same power is drawn for all the sampling time (10 minutes), so it will show a point with an energy consumption equal to this value divided by 60. Example. Your appliance is consuming 1000W, which means a total energy of 1kWh if run for 1 hour. The value reported is 1000 x 10. The value shown is 1000 x 10 / 60 = 166Wh, which is correct because this sample covers 10min, i.e. 1/6 of an hour. At the end of the hour, Eve.app will show 6 samples at 166Wh, totalizing 1kWh.
- Bytes 17 & 18: ??
- Bytes 19 & 20: ??
- Bytes 11 & 12: Power multiplied by 10. Eve.app will assume that the same power is drawn for all the sampling time (10 minutes), so it will show a point with an energy consumption equal to this value divided by 60. Example. Your appliance is consuming 1000W, which means a total energy of 1kWh if run for 1 hour. The value reported is 1000 x 10. The value shown is 1000 x 10 / 60 = 166Wh, which is correct because this sample covers 10min, i.e. 1/6 of an hour. At the end of the hour, Eve.app will show 6 samples at 166Wh, totalizing 1kWh.
- Bytes 13 & 14: V * 10
- Bytes 15 & 16: A * 10 ??
- Bytes 17 & 18: ??
- Temperature * 100 on bytes 11-12
- humidity * 100 on bytes 13-14
- pressure * 10 on bytes 15-16
- Temperature * 100 in bytes 11-12
- Humidity * 100 on bytes 13-14
- PPM on bytes 15-16
- ??? on bytes 17-19.
- Status 0/1 on byte 11
- Current Temperature x 100 on bytes 11-12
- Set Temperature x 100 on bytes 13-14
- Valve position % on byte 15
- ?? on bytes 16-17
This read-only characteristic is used by the accessory to signal how many entries are in the log (and other infos). Comparing this characteristics over different type of accessory, it was possible to obtain the following partial decoding. Data is composed by a fixed size portion (12 bytes) with info about time, 1 byte indicating the length of the following variable length portion with accessory "signature" and finally a fixed length portion with info about memory status.
- 4 bytes: Actual time, in seconds from last time update
- 4 bytes: negative offset of reference time
- 4 bytes: reference time/last Accessory time update (taken from E863F117-079E-48FF-8F27-9C2605A29F52)
- 1 byte: number of 16 bits word of the following "signature" portion
- 2-12 bytes: variable length "signature"
- 2 bytes: last physical memory position occupied (used by Eve.app to understand how many transfers are needed). If set to an address lower than the last successfully uploaded entry, forces Eve.app to start from the beginning of the memory, asking address 00 in E863F11C. Accessory answers with entry 01. Once the memory is fully written and memory overwriting is necessary this field remains equal to history size.
- 2 bytes: history size
- 4 bytes: once memory rolling occurred it indicates the address of the oldest entry present in memory (if memory rolling did not occur yet, these bytes are at 0)
- 4 bytes:??
- 2 bytes:?? always 01ff or 0101
The "signature" seems to be a fixed portion for each accessory type (i.e. it does not change in time). If a wrong signature is given data are not recognized, however it seems that not all bytes are really needed to identify the accessory (in fact, it is possible to use the Room signature to upload data from Weather, Thermo and Energy by changing only one or two bytes). Signatures as follows:
- Door: 1 16bits word, "0601", example of full data "44340000 6e270000 b102f51f 01 0601 b600 0010 00000000 01000000 0100"
- Motion: 2 16bits word, "1301 1c01", example of full data "a6000000 00000000 00000000 02 1301 1c01 0100 ed0f 00000000 00000000 01ff"
- Weather (to be checked): 3 16bits word, "0102 0202 0302", example of full data "01010000 FF000000 3C0F0000 03 0102 0202 0302 1D00 F50F 00000000 00000000 01FF"
- Room: 4 16bits word, "0102 0202 0402 0f03", example of full data "5f837400 d8bd7300 de12a91f 04 0102 0202 0402 0f03 ed0f ed0f 10220000 02654f00 01ff"
- Thermo: 5 16bits word, "0102 1102 1001 1201 1d01", example of full data "e1f50500 41dd0500 09c5ef1f 05 0102 1102 1001 1201 1d01 9202 de0f 00000000 00000000 01ff"
- Energy (from dump but currently not working): 5 16bits word, "0502 0b02 0c02 0d02 0702", example of full data "a209d301 4b09d301 71f0381f 05 0502 0b02 0c02 0d02 0702 ed0f ed0f 0fbb0000 e53aae01 01ff"
- Energy (working, tweeking from Room): 4 16bits word, "0102 0202 0702 0f03", example of full data "58020000 00000000 cd8f0220 04 0102 0202 0702 0f03 0300 c00f 00000000 00000000 0101"
1 - Accessory should advertise the address of the last available log entry on E863F116, along with the current time. If no memory rolling yet occurred this address is reported in bytes 22-23. If memory rolling occurred, bytes 22-23 are fixed to history size, and bytes 26-29 reports the oldest entry in the history. The address of the most recent entry is thus given adding up bytes 22-23 with bytes 26-29. The address starts from zero when the accessory is reset and it is then incremented for each new entry (since it seems that 4 bytes are used, there are plenty of binary codes for the entire life of the accessory, so no address rolling is required)
2 - Accessory monitors E863F11C for data request
3 - When a data request occurs, accessory starts sending out log entries on E863F117, beginning with the address requested and stopping when the last log is reached. Multiple log entries can be sent with a single update of the characteristics (up to 11 entries seen on Eve Room). The first entry should be of type 81 (reference time). Type 81 entries are sometimes sent along with data entries (maybe when the internal clock is adjusted), but it seems that the actual reference time (given by the time stamp in bytes 9-12 of E863F116, minus the negative offset in 5-8 of E863F116) set upon accessory reset is never changed, probably to ensure data consinstency (in fact, if from time to time reference time is changed, should an iOS device miss the corresponding type 81 entry, all following data will be misplaced in time). What is seen on real Elgato accessories it that when a new type 81 entry is sent, the time stamp stamp is incremented (probably to the actual time), but the negative offset is incremented as well by more or less the same quantiy (a part small differences probably due to clock adjustment). Reason unknown.
4 - This should be useless since homebridge has its own clock: monitor E863F121 for clock updates. Eve.app will ignore any entry "in the future".
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Accessory Information | 0000003E-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Manufacturer | 00000020-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Model | 00000021-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Serial Number | 00000030-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Identify | 00000014-0000-1000-8000-0026BB765291 | X | Boolean | HomeKit Standard | |
Firmware Revision | 00000052-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Outlet | 00000047-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Power State | 00000025-0000-1000-8000-0026BB765291 | X | X | Boolean | HomeKit Standard |
Outlet In Use | 00000026-0000-1000-8000-0026BB765291 | X | Boolean | HomeKit Standard | |
Volt | E863F10A-079E-48FF-8F27-9C2605A29F52 | X | float | Volt = (value) | |
Ampere | E863F126-079E-48FF-8F27-9C2605A29F52 | X | float | Ampere = (value) | |
Watt | E863F10D-079E-48FF-8F27-9C2605A29F52 | X | float | Watt = (value). This is what is reported as "Consumption" in the Eve app. | |
Kilowatt-hour | E863F10C-079E-48FF-8F27-9C2605A29F52 | X | float | kWh = (value). This is what is reported as "Total Consumption" in the Eve app. | |
??? | E863F007-079E-48FF-8F27-9C2605A29F52 | - | - | Custom service for meta and/or historical information. Characteristics for logging: E863F11C, E863F121, E863F116, E863F117 | |
Volt-Ampere | E863F110-079E-48FF-8F27-9C2605A29F52 | X | UInt16 | Volt-Ampere = UInt16(value) | |
kVAh | E863F127-079E-48FF-8F27-9C2605A29F52 | X | UInt32 | kVAh = UInt32(value) | |
??? | E863F11E-079E-48FF-8F27-9C2605A29F52 | X | X | ??? - Also available on Eve Room & Weather. Maybe model and version. If set to 01be00be 00f44fb8 0a000000 triggers an "Eve Weather firmware update advice" in Eve app. | |
Time from totalizer reset | E863F112-079E-48FF-8F27-9C2605A29F52 | X | X | UInt32 | Set to seconds from 1.1.2001 upon Reset of total consumption in Eve.app. Also in Door |
??? | E863F10E-079E-48FF-8F27-9C2605A29F52 | X | UInt16? | ??? - Seems to be 0 when no consumers are attached to the outlet | |
??? | E863F11C-079E-48FF-8F27-9C2605A29F52 | X | ??? - Also available on Eve Room. Handshaking for log transfer. | ||
??? | E863F121-079E-48FF-8F27-9C2605A29F52 | X | ??? - Also available on Eve Room - A time stamp is written here periodically by Eve.app. Format here https://gist.github.com/gomfunkel/b1a046d729757120907c#gistcomment-1841206 | ||
??? | E863F116-079E-48FF-8F27-9C2605A29F52 | X | ??? - Also available on Eve Room & Weather. Info from the accessory needed to trigger the log transfer. Yet to be understood. | ||
??? | E863F117-079E-48FF-8F27-9C2605A29F52 | X | See below - Also available on Eve Room & Weather. Entries for the log from the accessory to Eve.app |
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Accessory Information | 0000003E-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Manufacturer | 00000020-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Model | 00000021-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Serial Number | 00000030-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Identify | 00000014-0000-1000-8000-0026BB765291 | X | Boolean | HomeKit Standard | |
Firmware Revision | 00000052-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Battery | 00000096-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Status Low Battery | 00000079-0000-1000-8000-0026BB765291 | ? | ? | ? | HomeKit Standard |
Battery Level | 00000068-0000-1000-8000-0026BB765291 | ? | ? | ? | HomeKit Standard |
Charging State | 0000008F-0000-1000-8000-0026BB765291 | ? | ? | ? | HomeKit Standard |
Temperature Sensor | 0000008A-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Current Temperature | 00000011-0000-1000-8000-0026BB765291 | ? | ? | float | HomeKit Standard |
Humidity Sensor | 00000082-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Current Relative Humidity | 00000010-0000-1000-8000-0026BB765291 | ? | ? | float | HomeKit Standard |
Air Quality Sensor | 0000008D-0000-1000-8000-0026BB765291 | - | - | HomeKit Standard | |
Name | 00000023-0000-1000-8000-0026BB765291 | X | String(64) | HomeKit Standard | |
Air Quality | 00000095-0000-1000-8000-0026BB765291 | ? | ? | ? | HomeKit Standard (Level 0 - 5) |
Air Quality in ppm | E863F10B-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | UInt16(value) in ppm. Rough classification: 0 - 700 Excellent, 700 - 1100 Good, 1100 - 1600 Acceptable, 1600 - 2000 Moderate, > 2000 Bad. Represented by simple levels with the characteristic above. |
??? | E863F132-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? |
??? | E863F007-079E-48FF-8F27-9C2605A29F52 | - | - | Probably a service for meta and/or historical information | |
??? | E863F11C-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? - Also available on Eve Energy |
??? | E863F121-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? - Also available on Eve Energy |
??? | E863F11D-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? |
??? | E863F11E-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? - Also available on Eve Energy |
??? | E863F116-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? - Also available on Eve Energy |
??? | E863F117-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? - Also available on Eve Energy |
??? | E863F131-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | ??? |
Status Fault | 00000077-0000-1000-8000-0026BB765291 | ? | ? | ? | HomeKit Standard |
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Number of times opened | E863F129-079E-48FF-8F27-9C2605A29F52 | ? | ? | UInt32 | UInt32(value) / 2 |
Battery Level | E863F11B-079E-48FF-8F27-9C2605A29F52 | ? | ? | UInt16 | UInt16(value) in % |
Last activation | E863F11A-079E-48FF-8F27-9C2605A29F52 | x | UInt32? | Time of last activation. ?Seconds from HW reset? | |
Total seconds open | E863F118-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | From last HW reset? |
Total seconds close | E863F119-079E-48FF-8F27-9C2605A29F52 | ? | ? | ? | From last HW reset? |
Time from totalizer reset | E863F112-079E-48FF-8F27-9C2605A29F52 | X | X | UInt32 | Set to seconds from 1.1.2001 upon Reset of total openings in Eve.app. Also in Energy |
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Battery Level | E863F11B-079E-48FF-8F27-9C2605A29F52 | ? | ? | UInt16 | UInt16(value) in % |
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Sensitivity | E863F120-079E-48FF-8F27-9C2605A29F52 | x | x | UInt8 | 0 = high, 4 = medium, 7 = low. Set in Eve.app |
Duration | E863F12D-079E-48FF-8F27-9C2605A29F52 | x | x | UInt16 | Persistence of motion indication in seconds. Set in Eve.app |
Last activation | E863F11A-079E-48FF-8F27-9C2605A29F52 | x | UInt32? | Time of last activation. ?Seconds from HW reset? |
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Accessory Information | 0000003E-0000-1000-8000-0026BB765291 | ||||
Name | 00000023-0000-1000-8000-0026BB765291 | x | |||
Manufacturer | 00000020-0000-1000-8000-0026BB765291 | x | |||
Model | 00000021-0000-1000-8000-0026BB765291 | x | |||
Serial Number | 00000030-0000-1000-8000-0026BB765291 | x | |||
Firmware Revision | 00000052-0000-1000-8000-0026BB765291 | x | |||
??? | 00000053-0000-1000-8000-0026BB765291 | x | |||
Identify | 00000014-0000-1000-8000-0026BB765291 | x | |||
Battery | 00000096-0000-1000-8000-0026BB765291 | ||||
Name | 00000023-0000-1000-8000-0026BB765291 | x | |||
Battery Level | 00000068-0000-1000-8000-0026BB765291 | x | |||
Charging State | 0000008F-0000-1000-8000-0026BB765291 | x | |||
Status Low Battery | 00000079-0000-1000-8000-0026BB765291 | x | |||
Temperature Sensor | 0000008A-0000-1000-8000-0026BB765291 | ||||
Name | 00000023-0000-1000-8000-0026BB765291 | x | |||
Current Temperature | 00000011-0000-1000-8000-0026BB765291 | x | |||
Temperature Units | 00000036-0000-1000-8000-0026BB765291 | x | |||
Humidity Sensor | 00000082-0000-1000-8000-0026BB765291 | ||||
Name | 00000023-0000-1000-8000-0026BB765291 | x | |||
Current Relative Humidity | 00000010-0000-1000-8000-0026BB76529 | x | |||
??? | E863F00A-079E-48FF-8F27-9C2605A29F52 | ||||
Name | 00000023-0000-1000-8000-0026BB765291 | x | |||
??? | E863F10F-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F130-079E-48FF-8F27-9C2605A29F52 | x | |||
Logging | 863F007-079E-48FF-8F27-9C2605A29F52 | ||||
Name | 00000023-0000-1000-8000-0026BB765291 | x | |||
Status Fault | 00000077-0000-1000-8000-0026BB765291 | x | |||
??? | E863F11E-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F112-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F116-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F117-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F131-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F11C-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F121-079E-48FF-8F27-9C2605A29F52 | x | |||
??? | E863F11D-079E-48FF-8F27-9C2605A29F52 | x |
Service - Characteristic | UUID | R | W | Type | Description |
---|---|---|---|---|---|
Valve position | E863F12E-079E-48FF-8F27-9C2605A29F52 | x | UInt8 | Valve position in % | |
Program command | E863F12C-079E-48FF-8F27-9C2605A29F52 | x | Data | Command from Eve to Thermo on Program (set, query, ...), format uknown | |
Program data | E863F12F-079E-48FF-8F27-9C2605A29F52 | x | Data | Data from Thermo to Eve, format unknown |
I actually did nothing. They must have found the plugin on npm and looked for the UUIDs on my github repo. I think this is a cool feature, they also did this before with an audio plugin.
Edit: Nice, it looks like you started the history service for my plugin :) . I will implement your great history lib in the coming days. Btw, you are missing the forecast feature if you are still on the forked version.