Skip to content

thymjan/avea_node

 
 

Repository files navigation

Avea Bulb

Binary Protocol

Communication with a bulb is done via the service f815e810456c6761746f4d756e696368 and its characteristic f815e811456c6761746f4d756e696368. The first byte in the protocol is the command, the others are the payload. When sending a command without payload the current value from this command is send back as notification.

Available Commands

  • 0x35: Color
  • 0x58: User defined name of the bulb
  • 0x57: Brightness

Color

The color is defined by these four variables: white, red, green, blue. Each variable has a value between 0 and 4095 (0xfff).

The byte sequence, which has to be send to bulb can be computed on the following way:

For example we set the color to w: 0xaaa, r: 0xbbb, g:0xccc, b:0xddd, with a fading of 0x111 we send:

35 11 01 0a 00 aa 8a bb 3b cc 2c dd 1d
Color command fading in LE unkown white with 8 as prefix red with 3 as prefix green with 2 as prefix blue with 1 as prefix

To compute the color part the following js function is used:

const buffer = new Buffer(8);
buffer.writeUInt16LE(this.white | 0x8000, 0);
buffer.writeUInt16LE(this.red | 0x3000, 2);
buffer.writeUInt16LE(this.green | 0x2000, 4);
buffer.writeUInt16LE(this.blue | 0x1000, 6);

The color send back through the notification has a different format. For the same values as set above the following bytes are received:

35 da 0a 5e 1d 57 2c 4f 3b aa 0a dd 1d cc 2c bb 3b
Color command current white (0xada) current blue (0xd5e) current green (0xc57) current red (0xb4f) target white (0xaaa) target blue (0xddd) target green (0xccc) target red (0xbbb)
// command code byte already stripped

// these are the current colors of the lamp.
let white = buffer.readUInt16LE(0);
let blue = buffer.readUInt16LE(2) ^ 0x1000;
let green = buffer.readUInt16LE(4) ^ 0x2000;
let red = buffer.readUInt16LE(6) ^ 0x3000;

// these are the colors the lamp is fading to.
let whiteTarget = buffer.readUInt16LE(8);
let blueTarget = buffer.readUInt16LE(10) ^ 0x1000;
let greenTarget = buffer.readUInt16LE(12) ^ 0x2000;
let redTarget = buffer.readUInt16LE(14) ^ 0x3000;

Name

The name is received as a null terminated string. For example: 0x58 0x45 0x6c 0x67 0x61 0x74 0x6f 0x20 0x41 0x76 0x65 0x61 0x00 = Elgato Avea

Brightness

Brightness goes from 0-4095 and is send and received as little endian value.

e.g. 0x57ff0f for 4095.

About

nodejs POC to control avea bulb

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%