@switchbot/homebridge-switchbot 1.15.1-beta.8 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/Old Releaser.zip +0 -0
- package/.github/npm-version-script.js +81 -0
- package/.github/workflows/beta-release.yml +31 -0
- package/.github/workflows/build.yml +18 -0
- package/.github/workflows/codeql-analysis.yml +5 -63
- package/.github/workflows/label.yml +2 -2
- package/.github/workflows/release-drafter.yml +14 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/stale.yml +6 -22
- package/README.md +10 -3
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +33 -29
- package/dist/device/bot.js.map +1 -1
- package/dist/device/colorbulb.d.ts +1 -0
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +129 -97
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.js +1 -1
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +34 -26
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +88 -92
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +29 -25
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.js +1 -1
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.js +1 -1
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.js +1 -1
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +31 -27
- package/dist/device/plug.js.map +1 -1
- package/dist/device/striplight.d.ts.map +1 -1
- package/dist/device/striplight.js +81 -72
- package/dist/device/striplight.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +2 -2
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +35 -32
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +2 -2
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +35 -32
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +2 -2
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +28 -26
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +2 -2
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +47 -45
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/light.d.ts +2 -2
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +40 -38
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +2 -2
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +28 -26
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +2 -2
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +82 -80
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +2 -2
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +24 -22
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +2 -2
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +28 -26
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/settings.d.ts +0 -5
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js.map +1 -1
- package/package.json +79 -79
- package/src/device/bot.ts +34 -39
- package/src/device/colorbulb.ts +130 -119
- package/src/device/contact.ts +1 -1
- package/src/device/curtain.ts +35 -35
- package/src/device/humidifier.ts +89 -118
- package/src/device/lock.ts +29 -34
- package/src/device/meter.ts +1 -1
- package/src/device/meterplus.ts +1 -1
- package/src/device/motion.ts +1 -1
- package/src/device/plug.ts +32 -36
- package/src/device/striplight.ts +82 -98
- package/src/irdevice/airconditioner.ts +36 -41
- package/src/irdevice/airpurifier.ts +36 -43
- package/src/irdevice/camera.ts +29 -34
- package/src/irdevice/fan.ts +48 -53
- package/src/irdevice/light.ts +41 -46
- package/src/irdevice/other.ts +29 -34
- package/src/irdevice/tv.ts +83 -88
- package/src/irdevice/vacuumcleaner.ts +25 -30
- package/src/irdevice/waterheater.ts +29 -34
- package/src/settings.ts +0 -19
- package/.github/workflows/nodejs-beta.yml +0 -42
- package/.github/workflows/nodejs.yml +0 -47
- package/.github/workflows/prerelease-beta.js +0 -34
|
@@ -2,7 +2,7 @@ import https from 'https';
|
|
|
2
2
|
import crypto from 'crypto';
|
|
3
3
|
import { IncomingMessage } from 'http';
|
|
4
4
|
import { SwitchBotPlatform } from '../platform';
|
|
5
|
-
import { irDevicesConfig, irdevice,
|
|
5
|
+
import { irDevicesConfig, irdevice, HostDomain, DevicePath } from '../settings';
|
|
6
6
|
import { CharacteristicValue, PlatformAccessory, Service } from 'homebridge';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -86,40 +86,38 @@ export class VacuumCleaner {
|
|
|
86
86
|
*/
|
|
87
87
|
async pushOnChanges(): Promise<void> {
|
|
88
88
|
if (this.On) {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
parameter: 'default',
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
await this.pushChanges(
|
|
89
|
+
const body = JSON.stringify({
|
|
90
|
+
'command': 'turnOn',
|
|
91
|
+
'parameter': 'default',
|
|
92
|
+
'commandType': 'command',
|
|
93
|
+
});
|
|
94
|
+
await this.pushChanges(body);
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
async pushOffChanges(): Promise<void> {
|
|
99
99
|
if (!this.On) {
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
parameter: 'default',
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
await this.pushChanges(
|
|
100
|
+
const body = JSON.stringify({
|
|
101
|
+
'command': 'turnOff',
|
|
102
|
+
'parameter': 'default',
|
|
103
|
+
'commandType': 'command',
|
|
104
|
+
});
|
|
105
|
+
await this.pushChanges(body);
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
async pushChanges(
|
|
109
|
+
async pushChanges(body): Promise<void> {
|
|
110
110
|
try {
|
|
111
|
-
|
|
112
|
-
`Vacuum Cleaner: ${this.accessory.displayName} Sending request to SwitchBot API. command: ${payload.command},` +
|
|
113
|
-
` parameter: ${payload.parameter}, commandType: ${payload.commandType}`,
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
// Make the API request
|
|
111
|
+
// Make Push On request to the API
|
|
117
112
|
const t = Date.now();
|
|
118
113
|
const nonce = 'requestID';
|
|
119
114
|
const data = this.platform.config.credentials?.token + t + nonce;
|
|
120
|
-
const signTerm = crypto.createHmac('sha256', this.platform.config.credentials?.secret)
|
|
115
|
+
const signTerm = crypto.createHmac('sha256', this.platform.config.credentials?.secret)
|
|
116
|
+
.update(Buffer.from(data, 'utf-8'))
|
|
117
|
+
.digest();
|
|
121
118
|
const sign = signTerm.toString('base64');
|
|
122
119
|
this.debugLog(`Vacuum Cleaner: ${this.accessory.displayName} sign: ${sign}`);
|
|
120
|
+
this.infoLog(`Vacuum Cleaner: ${this.accessory.displayName} Sending request to SwitchBot API. body: ${body},`);
|
|
123
121
|
const options = {
|
|
124
122
|
hostname: HostDomain,
|
|
125
123
|
port: 443,
|
|
@@ -131,24 +129,21 @@ export class VacuumCleaner {
|
|
|
131
129
|
'nonce': nonce,
|
|
132
130
|
't': t,
|
|
133
131
|
'Content-Type': 'application/json',
|
|
132
|
+
'Content-Length': body.length,
|
|
134
133
|
},
|
|
135
134
|
};
|
|
136
|
-
|
|
137
|
-
const req = https.request(options, (res) => {
|
|
135
|
+
const req = https.request(options, res => {
|
|
138
136
|
this.debugLog(`Vacuum Cleaner: ${this.accessory.displayName} statusCode: ${res.statusCode}`);
|
|
139
137
|
this.statusCode({ res });
|
|
140
|
-
res.on('data',
|
|
138
|
+
res.on('data', d => {
|
|
141
139
|
this.debugLog(`Vacuum Cleaner: ${this.accessory.displayName} d: ${d}`);
|
|
142
140
|
});
|
|
143
141
|
});
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.errorLog(`Vacuum Cleaner: ${this.accessory.displayName} error: ${error}`);
|
|
142
|
+
req.on('error', (e: any) => {
|
|
143
|
+
this.errorLog(`Vacuum Cleaner: ${this.accessory.displayName} error message: ${e.message}`);
|
|
147
144
|
});
|
|
148
|
-
|
|
149
|
-
req.write(payload);
|
|
145
|
+
req.write(body);
|
|
150
146
|
req.end();
|
|
151
|
-
|
|
152
147
|
this.debugLog(`Vacuum Cleaner: ${this.accessory.displayName} pushchanges: ${JSON.stringify(req)}`);
|
|
153
148
|
this.OnCached = this.On;
|
|
154
149
|
this.accessory.context.On = this.OnCached;
|
|
@@ -2,7 +2,7 @@ import https from 'https';
|
|
|
2
2
|
import crypto from 'crypto';
|
|
3
3
|
import { IncomingMessage } from 'http';
|
|
4
4
|
import { SwitchBotPlatform } from '../platform';
|
|
5
|
-
import { irDevicesConfig, irdevice,
|
|
5
|
+
import { irDevicesConfig, irdevice, HostDomain, DevicePath } from '../settings';
|
|
6
6
|
import { CharacteristicValue, PlatformAccessory, Service } from 'homebridge';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -93,69 +93,64 @@ export class WaterHeater {
|
|
|
93
93
|
*/
|
|
94
94
|
async pushWaterHeaterOnChanges(): Promise<void> {
|
|
95
95
|
if (this.Active !== 1) {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
parameter: 'default',
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
await this.pushChanges(
|
|
96
|
+
const body = JSON.stringify({
|
|
97
|
+
'command': 'turnOn',
|
|
98
|
+
'parameter': 'default',
|
|
99
|
+
'commandType': 'command',
|
|
100
|
+
});
|
|
101
|
+
await this.pushChanges(body);
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
async pushWaterHeaterOffChanges(): Promise<void> {
|
|
106
106
|
if (this.Active !== 0) {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
parameter: 'default',
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
await this.pushChanges(
|
|
107
|
+
const body = JSON.stringify({
|
|
108
|
+
'command': 'turnOff',
|
|
109
|
+
'parameter': 'default',
|
|
110
|
+
'commandType': 'command',
|
|
111
|
+
});
|
|
112
|
+
await this.pushChanges(body);
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
async pushChanges(
|
|
116
|
+
async pushChanges(body): Promise<void> {
|
|
117
117
|
try {
|
|
118
|
-
|
|
119
|
-
`Water Heater: ${this.accessory.displayName} Sending request to SwitchBot API. command: ${payload.command},` +
|
|
120
|
-
` parameter: ${payload.parameter}, commandType: ${payload.commandType}`,
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
// Make the API request
|
|
118
|
+
// Make Push On request to the API
|
|
124
119
|
const t = Date.now();
|
|
125
120
|
const nonce = 'requestID';
|
|
126
121
|
const data = this.platform.config.credentials?.token + t + nonce;
|
|
127
|
-
const signTerm = crypto.createHmac('sha256', this.platform.config.credentials?.secret)
|
|
122
|
+
const signTerm = crypto.createHmac('sha256', this.platform.config.credentials?.secret)
|
|
123
|
+
.update(Buffer.from(data, 'utf-8'))
|
|
124
|
+
.digest();
|
|
128
125
|
const sign = signTerm.toString('base64');
|
|
129
126
|
this.debugLog(`Water Heater: ${this.accessory.displayName} sign: ${sign}`);
|
|
127
|
+
this.infoLog(`Water Heater: ${this.accessory.displayName} Sending request to SwitchBot API. body: ${body},`);
|
|
130
128
|
const options = {
|
|
131
129
|
hostname: HostDomain,
|
|
132
130
|
port: 443,
|
|
133
131
|
path: `${DevicePath}/${this.device.deviceId}/commands`,
|
|
134
132
|
method: 'POST',
|
|
135
133
|
headers: {
|
|
136
|
-
Authorization: this.platform.config.credentials?.token,
|
|
137
|
-
sign: sign,
|
|
138
|
-
nonce: nonce,
|
|
139
|
-
t: t,
|
|
134
|
+
'Authorization': this.platform.config.credentials?.token,
|
|
135
|
+
'sign': sign,
|
|
136
|
+
'nonce': nonce,
|
|
137
|
+
't': t,
|
|
140
138
|
'Content-Type': 'application/json',
|
|
139
|
+
'Content-Length': body.length,
|
|
141
140
|
},
|
|
142
141
|
};
|
|
143
|
-
|
|
144
|
-
const req = https.request(options, (res) => {
|
|
142
|
+
const req = https.request(options, res => {
|
|
145
143
|
this.debugLog(`Water Heater: ${this.accessory.displayName} statusCode: ${res.statusCode}`);
|
|
146
144
|
this.statusCode({ res });
|
|
147
|
-
res.on('data',
|
|
145
|
+
res.on('data', d => {
|
|
148
146
|
this.debugLog(`Water Heater: ${this.accessory.displayName} d: ${d}`);
|
|
149
147
|
});
|
|
150
148
|
});
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
this.errorLog(`Water Heater: ${this.accessory.displayName} error: ${error}`);
|
|
149
|
+
req.on('error', (e: any) => {
|
|
150
|
+
this.errorLog(`Water Heater: ${this.accessory.displayName} error message: ${e.message}`);
|
|
154
151
|
});
|
|
155
|
-
|
|
156
|
-
req.write(payload);
|
|
152
|
+
req.write(body);
|
|
157
153
|
req.end();
|
|
158
|
-
|
|
159
154
|
this.debugLog(`Water Heater: ${this.accessory.displayName} pushchanges: ${JSON.stringify(req)}`);
|
|
160
155
|
this.updateHomeKitCharacteristics();
|
|
161
156
|
} catch (e: any) {
|
package/src/settings.ts
CHANGED
|
@@ -177,19 +177,6 @@ export type other = {
|
|
|
177
177
|
commandOff?: string;
|
|
178
178
|
};
|
|
179
179
|
|
|
180
|
-
export type payload = {
|
|
181
|
-
commandType: string;
|
|
182
|
-
parameter: string;
|
|
183
|
-
command: string;
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
/*
|
|
187
|
-
export type deviceResponses = {
|
|
188
|
-
statusCode: number | string;
|
|
189
|
-
message: string;
|
|
190
|
-
body: deviceList | infraredRemoteList;
|
|
191
|
-
};*/
|
|
192
|
-
|
|
193
180
|
//a list of physical devices.
|
|
194
181
|
export type deviceList = {
|
|
195
182
|
device: Array<device>;
|
|
@@ -232,12 +219,6 @@ export type irdevice = {
|
|
|
232
219
|
hubDeviceId: string; //remote device's parent Hub ID
|
|
233
220
|
};
|
|
234
221
|
|
|
235
|
-
/*export type deviceStatusResponse = {
|
|
236
|
-
statusCode: number;
|
|
237
|
-
message: string;
|
|
238
|
-
body: deviceStatus;
|
|
239
|
-
};*/
|
|
240
|
-
|
|
241
222
|
export type deviceStatus = {
|
|
242
223
|
//device ID.
|
|
243
224
|
deviceId: string;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
|
|
2
|
-
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
|
|
3
|
-
|
|
4
|
-
name: Beta
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
push:
|
|
8
|
-
branches:
|
|
9
|
-
- beta
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
build:
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
steps:
|
|
15
|
-
- uses: actions/checkout@v3
|
|
16
|
-
- uses: actions/setup-node@v3
|
|
17
|
-
with:
|
|
18
|
-
node-version: 14
|
|
19
|
-
- name: npm install, build and test
|
|
20
|
-
run: |
|
|
21
|
-
npm install
|
|
22
|
-
npm run lint
|
|
23
|
-
npm run build
|
|
24
|
-
env:
|
|
25
|
-
CI: true
|
|
26
|
-
|
|
27
|
-
publish-npm:
|
|
28
|
-
if: github.repository == 'openwonderlabs/homebridge-switchbot'
|
|
29
|
-
needs: build
|
|
30
|
-
runs-on: ubuntu-latest
|
|
31
|
-
steps:
|
|
32
|
-
- uses: actions/checkout@v3
|
|
33
|
-
- uses: actions/setup-node@v3
|
|
34
|
-
with:
|
|
35
|
-
node-version: 14
|
|
36
|
-
registry-url: https://registry.npmjs.org/
|
|
37
|
-
- run: npm ci
|
|
38
|
-
- run: node .github/workflows/prerelease-beta.js
|
|
39
|
-
- run: npm --no-git-tag-version version prerelease --preid=beta
|
|
40
|
-
- run: npm publish --tag=beta
|
|
41
|
-
env:
|
|
42
|
-
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
name: Latest
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: latest
|
|
6
|
-
pull_request:
|
|
7
|
-
release: # Run when release is created
|
|
8
|
-
types: [created]
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
build:
|
|
12
|
-
strategy:
|
|
13
|
-
matrix:
|
|
14
|
-
node-version: [14.x, 16.x]
|
|
15
|
-
os: [ubuntu-latest]
|
|
16
|
-
|
|
17
|
-
runs-on: ${{ matrix.os }}
|
|
18
|
-
|
|
19
|
-
steps:
|
|
20
|
-
- uses: actions/checkout@v3
|
|
21
|
-
- name: Use Node.js ${{ matrix.node-version }}
|
|
22
|
-
uses: actions/setup-node@v3
|
|
23
|
-
with:
|
|
24
|
-
node-version: ${{ matrix.node-version }}
|
|
25
|
-
- name: npm install, build and test
|
|
26
|
-
run: |
|
|
27
|
-
npm install
|
|
28
|
-
npm run lint
|
|
29
|
-
npm run build
|
|
30
|
-
env:
|
|
31
|
-
CI: true
|
|
32
|
-
|
|
33
|
-
publish-npm:
|
|
34
|
-
# publish only if we are on our own repo, event was 'release' (a tag was created) and the tag starts with "v" (aka version tag)
|
|
35
|
-
if: github.repository == 'openwonderlabs/homebridge-switchbot' && github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v')
|
|
36
|
-
needs: build # only run if build succeeds
|
|
37
|
-
runs-on: ubuntu-latest
|
|
38
|
-
steps:
|
|
39
|
-
- uses: actions/checkout@v3
|
|
40
|
-
- uses: actions/setup-node@v3
|
|
41
|
-
with:
|
|
42
|
-
node-version: 14 # use the minimum required version
|
|
43
|
-
registry-url: https://registry.npmjs.org/
|
|
44
|
-
- run: npm ci
|
|
45
|
-
- run: npm publish
|
|
46
|
-
env:
|
|
47
|
-
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
#!/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const semver = require('semver');
|
|
5
|
-
const child_process = require('child_process');
|
|
6
|
-
|
|
7
|
-
function getTagVersionFromNpm(tag) {
|
|
8
|
-
try {
|
|
9
|
-
return child_process.execSync(`npm info ${package.name} version --tag="${tag}"`).toString('utf8').trim();
|
|
10
|
-
} catch (e) {
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// load package.json
|
|
16
|
-
const package = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
|
17
|
-
|
|
18
|
-
// work out the correct tag
|
|
19
|
-
const currentLatest = getTagVersionFromNpm('latest') || '0.0.0';
|
|
20
|
-
const currentBeta = getTagVersionFromNpm('beta') || '0.0.0';
|
|
21
|
-
const latestNpmTag = semver.gt(currentBeta, currentLatest, {
|
|
22
|
-
includePrerelease: true,
|
|
23
|
-
})
|
|
24
|
-
? currentBeta
|
|
25
|
-
: currentLatest;
|
|
26
|
-
const publishTag = semver.gt(package.version, latestNpmTag, {
|
|
27
|
-
includePrerelease: true,
|
|
28
|
-
})
|
|
29
|
-
? package.version
|
|
30
|
-
: latestNpmTag;
|
|
31
|
-
|
|
32
|
-
// save the package.json
|
|
33
|
-
package.version = publishTag;
|
|
34
|
-
fs.writeFileSync('package.json', JSON.stringify(package, null, 4));
|