aboutsummaryrefslogtreecommitdiff
path: root/plugin.ts
blob: 318d56c65332f57a3e2b4497b7ee6e8b5a8ab8b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { AccessoryConfig, AccessoryPlugin, API, Logger, Service } from 'homebridge';

import Lamp, { LampColor } from './lamp';
const Color = require('color');

export default class BekenBridge implements AccessoryPlugin {
	private lamp: Lamp;
	private infoService: Service;

	private whiteBulbService: Service;
	private RGBBulbService: Service;

	private whiteState: {
		brt: number;
		on: boolean;
	};

	private rgbState: {
		hue: number;
		sat: number;
		brt: number;
		on: boolean;
	};

	public name: string;

	constructor(
		public readonly log: Logger,
		public readonly config: AccessoryConfig,
		public readonly api: API,
	) {
		this.name = config.name;
		this.lamp = new Lamp(config.address, log);

		this.whiteState = {
			on: false,
			brt: 0,
		};

		this.rgbState = {
			on: false,
			brt: 0,
			sat: 0,
			hue: 0,
		};

		this.infoService = new this.api.hap.Service.AccessoryInformation()
			.setCharacteristic(this.api.hap.Characteristic.Manufacturer, 'Beken')
			.setCharacteristic(this.api.hap.Characteristic.Model, 'Beken LED');

		this.whiteBulbService = new this.api.hap.Service.Lightbulb('White', 'normal');
		this.RGBBulbService = new this.api.hap.Service.Lightbulb('RGB', 'rgb');

		this.registerWhiteBulbServices();
		this.registerRGBBulbServices();
	}

	registerWhiteBulbServices() {
		this.whiteBulbService.getCharacteristic(this.api.hap.Characteristic.On)
			.onGet(() => this.whiteState.on)
			.onSet((on: boolean) => {
				this.whiteState.on = on;
				if (this.rgbState.on) {
					this.RGBBulbService.getCharacteristic(this.api.hap.Characteristic.On).setValue(false);
				}
				this.updateLamp();
			});
		this.whiteBulbService.getCharacteristic(this.api.hap.Characteristic.Brightness)
			.onGet(() => this.whiteState.brt)
			.onSet((brt: number) => {
				this.whiteState.brt = brt;
				this.updateLamp();
			});
	}

	registerRGBBulbServices() {
		this.RGBBulbService.getCharacteristic(this.api.hap.Characteristic.On)
			.onGet(() => this.rgbState.on)
			.onSet((on: boolean) => {
				this.rgbState.on = on;
				if (this.whiteState.on) {
					this.whiteBulbService.getCharacteristic(this.api.hap.Characteristic.On).setValue(false);
				}
				this.updateLamp();
			});
		this.RGBBulbService.getCharacteristic(this.api.hap.Characteristic.Brightness)
			.onGet(() => this.rgbState.brt)
			.onSet((brt: number) => {
				this.rgbState.brt = brt;
				this.updateLamp();
			});
		this.RGBBulbService.getCharacteristic(this.api.hap.Characteristic.Hue)
			.onGet(() => this.rgbState.hue)
			.onSet((hue: number) => {
				this.rgbState.hue = hue;
				this.updateLamp();
			});
		this.RGBBulbService.getCharacteristic(this.api.hap.Characteristic.Saturation)
			.onGet(() => this.rgbState.sat)
			.onSet((sat: number) => {
				this.rgbState.sat = sat;
				this.updateLamp();
			});
	}

	updateLamp() {
		if (this.rgbState.on) {
			var rgb = Color({ h: this.rgbState.hue, s: this.rgbState.sat, v: this.rgbState.brt });
			this.lamp.color = [rgb.red(), rgb.green(), rgb.blue(), 0];
		} else if (this.whiteState.on) {
			var value = Math.floor(this.whiteState.brt / 100 * 255);
			this.lamp.color = [0, 0, 0, value];
		} else {
			this.lamp.color = [0, 0, 0, 0];
		}
	}

	getServices() {
		return [
			this.infoService,
			this.whiteBulbService,
			this.RGBBulbService,
		];
	}
}