homebridge-toshiba-plugin 0.2.7 → 0.2.8
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/README.md +6 -3
- package/config.schema.json +4 -1
- package/dist/nameUtils.d.ts +13 -0
- package/dist/nameUtils.js +108 -0
- package/dist/nameUtils.js.map +1 -0
- package/dist/platform.d.ts +18 -1
- package/dist/platform.js +496 -142
- package/dist/platform.js.map +1 -1
- package/dist/platformAccessory.d.ts +30 -3
- package/dist/platformAccessory.js +370 -137
- package/dist/platformAccessory.js.map +1 -1
- package/dist/toshiba/amqpClient.d.ts +12 -2
- package/dist/toshiba/amqpClient.js +198 -28
- package/dist/toshiba/amqpClient.js.map +1 -1
- package/dist/toshiba/device.d.ts +68 -13
- package/dist/toshiba/device.js +414 -52
- package/dist/toshiba/device.js.map +1 -1
- package/dist/toshiba/features.d.ts +10 -1
- package/dist/toshiba/features.js +45 -14
- package/dist/toshiba/features.js.map +1 -1
- package/dist/toshiba/httpApi.d.ts +16 -6
- package/dist/toshiba/httpApi.js +197 -63
- package/dist/toshiba/httpApi.js.map +1 -1
- package/dist/toshiba/state.d.ts +33 -0
- package/dist/toshiba/state.js +185 -21
- package/dist/toshiba/state.js.map +1 -1
- package/dist/toshiba/types.d.ts +15 -0
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ Homebridge dynamic platform plugin for Toshiba **Home AC Control** cloud devices
|
|
|
15
15
|
- Mobile cloud registration supports both response formats used by the app backend (`SasToken` or `HostName` + `DeviceId` + `PrimaryKey`).
|
|
16
16
|
- Startup self-recovery for transient cloud/network errors with exponential retry backoff.
|
|
17
17
|
- Device auto-discovery and cache reconciliation.
|
|
18
|
-
-
|
|
18
|
+
- Authority-aware discovery parsing (valid updates merge, while malformed/partial inventories can never prune cached accessories).
|
|
19
19
|
- Automatic AMQP reconnect with exponential backoff after cloud disconnects.
|
|
20
20
|
- AMQP operation timeout guards (connect/send/disconnect) with failure-triggered recovery.
|
|
21
21
|
- Poll/discovery overlap protection to avoid queue buildup during slow cloud responses.
|
|
@@ -25,8 +25,10 @@ Homebridge dynamic platform plugin for Toshiba **Home AC Control** cloud devices
|
|
|
25
25
|
- No-op command suppression (skips AMQP send when requested state already matches current effective state).
|
|
26
26
|
- Command preflight online check (`GetAllDeviceState`) before AMQP sends, with offline protection.
|
|
27
27
|
- Short-lived connection-state cache on command precheck to reduce command latency and cloud rate-limit pressure.
|
|
28
|
-
-
|
|
29
|
-
- Command
|
|
28
|
+
- Commands require a positive online result; an offline or unknown cloud status is reported to HomeKit as a communication failure.
|
|
29
|
+
- Command sends wait for AMQP reconnection and matching push telemetry or bounded HTTP readback before HomeKit reports success.
|
|
30
|
+
- Local receive generations prevent a delayed HTTP snapshot from overwriting state received after that request began. Toshiba's time-of-day-only push timestamp is not used to order packets across reconnects or midnight, so genuinely out-of-order push packets follow local arrival order.
|
|
31
|
+
- Shutdown/disposal aborts in-flight HTTP requests, retry backoff, and command-confirmation readbacks.
|
|
30
32
|
- Defensive payload parsing and malformed-cloud-update guards.
|
|
31
33
|
- Single accessory model: each Toshiba AC is exposed as one HomeKit `HeaterCooler` service (no extra Fan/Switch/Sensor services).
|
|
32
34
|
- HeaterCooler control:
|
|
@@ -124,6 +126,7 @@ homebridge -D
|
|
|
124
126
|
```bash
|
|
125
127
|
npm run lint
|
|
126
128
|
npm run build
|
|
129
|
+
npm test
|
|
127
130
|
```
|
|
128
131
|
|
|
129
132
|
## Publish
|
package/config.schema.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"pluginAlias": "ToshibaSmartAC",
|
|
3
3
|
"pluginType": "platform",
|
|
4
4
|
"singular": true,
|
|
5
|
-
"strictValidation":
|
|
5
|
+
"strictValidation": false,
|
|
6
6
|
"schema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"required": [
|
|
@@ -63,18 +63,21 @@
|
|
|
63
63
|
"enableFanService": {
|
|
64
64
|
"title": "Expose Fan Service (Deprecated)",
|
|
65
65
|
"type": "boolean",
|
|
66
|
+
"hidden": true,
|
|
66
67
|
"default": false,
|
|
67
68
|
"description": "Deprecated and ignored. Plugin now exposes a single HeaterCooler service only."
|
|
68
69
|
},
|
|
69
70
|
"enableFeatureSwitches": {
|
|
70
71
|
"title": "Expose Feature Switches (Deprecated)",
|
|
71
72
|
"type": "boolean",
|
|
73
|
+
"hidden": true,
|
|
72
74
|
"default": false,
|
|
73
75
|
"description": "Deprecated and ignored. Plugin now exposes a single HeaterCooler service only."
|
|
74
76
|
},
|
|
75
77
|
"enableTemperatureSensors": {
|
|
76
78
|
"title": "Expose Temperature Sensors (Deprecated)",
|
|
77
79
|
"type": "boolean",
|
|
80
|
+
"hidden": true,
|
|
78
81
|
"default": false,
|
|
79
82
|
"description": "Deprecated and ignored. Plugin now exposes a single HeaterCooler service only."
|
|
80
83
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preserve vendor-facing Unicode text while removing only characters that
|
|
3
|
+
* cannot safely be serialized as a HomeKit name or cache value. The original
|
|
4
|
+
* script, diacritics, punctuation, emoji, and ZWJ sequences remain intact.
|
|
5
|
+
*/
|
|
6
|
+
export declare function cleanVendorName(value: unknown): string | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Produce a deterministic HAP-compliant name without ASCII transliteration.
|
|
9
|
+
* All Unicode letters and numbers (including Polish and non-Latin scripts)
|
|
10
|
+
* are preserved. Typography with a safe HAP equivalent is mapped; unsupported
|
|
11
|
+
* symbols such as emoji remain available in the separately cached vendor name.
|
|
12
|
+
*/
|
|
13
|
+
export declare function toHomeKitName(value: unknown, fallback?: unknown): string;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
const CONTROL_OR_LINE_SEPARATOR = /[\p{Cc}\p{Zl}\p{Zp}]+/gu;
|
|
2
|
+
const SPACE_SEPARATOR = /\p{Zs}+/gu;
|
|
3
|
+
const DASH_PUNCTUATION = /[\u2010-\u2015\u2212\uFE58\uFE63\uFF0D]/gu;
|
|
4
|
+
const LEFT_APOSTROPHE = /\u2018/gu;
|
|
5
|
+
const DOUBLE_QUOTE = /["\u201C\u201D\u201E\u201F\u2033]/gu;
|
|
6
|
+
const HOMEKIT_UNSUPPORTED = /[^\p{L}\p{N}\p{Zs}\u2019'&!._:;()\u002F,-]+/gu;
|
|
7
|
+
const HOMEKIT_EDGE = /^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu;
|
|
8
|
+
const HOMEKIT_NAME_PATTERN = /^[\p{L}\p{N}][\p{L}\p{N}\p{Zs}\u2019'&!._:;()\u002F,-]*[\p{L}\p{N}]$/u;
|
|
9
|
+
const HOMEKIT_NAME_MAX_UTF16_LENGTH = 64;
|
|
10
|
+
function replaceLoneSurrogates(value) {
|
|
11
|
+
let output = '';
|
|
12
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
13
|
+
const codeUnit = value.charCodeAt(index);
|
|
14
|
+
if (codeUnit >= 0xD800 && codeUnit <= 0xDBFF) {
|
|
15
|
+
const nextCodeUnit = value.charCodeAt(index + 1);
|
|
16
|
+
if (nextCodeUnit >= 0xDC00 && nextCodeUnit <= 0xDFFF) {
|
|
17
|
+
output += value[index] + value[index + 1];
|
|
18
|
+
index += 1;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
output += '\uFFFD';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else if (codeUnit >= 0xDC00 && codeUnit <= 0xDFFF) {
|
|
25
|
+
output += '\uFFFD';
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
output += value[index];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
function replaceUnsafeFormatControls(value) {
|
|
34
|
+
let output = '';
|
|
35
|
+
for (const character of value) {
|
|
36
|
+
const codePoint = character.codePointAt(0);
|
|
37
|
+
const isUnsafeFormat = /\p{Cf}/u.test(character)
|
|
38
|
+
&& codePoint !== 0x200C
|
|
39
|
+
&& codePoint !== 0x200D;
|
|
40
|
+
output += isUnsafeFormat ? ' ' : character;
|
|
41
|
+
}
|
|
42
|
+
return output;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Preserve vendor-facing Unicode text while removing only characters that
|
|
46
|
+
* cannot safely be serialized as a HomeKit name or cache value. The original
|
|
47
|
+
* script, diacritics, punctuation, emoji, and ZWJ sequences remain intact.
|
|
48
|
+
*/
|
|
49
|
+
export function cleanVendorName(value) {
|
|
50
|
+
if (typeof value !== 'string') {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const cleaned = replaceUnsafeFormatControls(replaceLoneSurrogates(value))
|
|
54
|
+
.normalize('NFC')
|
|
55
|
+
.replace(CONTROL_OR_LINE_SEPARATOR, ' ')
|
|
56
|
+
.replace(SPACE_SEPARATOR, ' ')
|
|
57
|
+
.trim();
|
|
58
|
+
return cleaned.length > 0 ? cleaned : undefined;
|
|
59
|
+
}
|
|
60
|
+
function truncateUtf16WithoutSplittingCodePoints(value, maximumLength) {
|
|
61
|
+
let output = '';
|
|
62
|
+
for (const codePoint of value) {
|
|
63
|
+
if (output.length + codePoint.length > maximumLength) {
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
output += codePoint;
|
|
67
|
+
}
|
|
68
|
+
return output;
|
|
69
|
+
}
|
|
70
|
+
function normalizeHomeKitCandidate(value) {
|
|
71
|
+
const vendorName = cleanVendorName(value);
|
|
72
|
+
if (!vendorName) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
let normalized = vendorName
|
|
76
|
+
.replace(DASH_PUNCTUATION, '-')
|
|
77
|
+
.replace(LEFT_APOSTROPHE, '\u2019')
|
|
78
|
+
.replace(DOUBLE_QUOTE, '\u0027')
|
|
79
|
+
.replace(HOMEKIT_UNSUPPORTED, ' ')
|
|
80
|
+
.replace(SPACE_SEPARATOR, ' ')
|
|
81
|
+
.trim()
|
|
82
|
+
.replace(HOMEKIT_EDGE, '');
|
|
83
|
+
normalized = truncateUtf16WithoutSplittingCodePoints(normalized, HOMEKIT_NAME_MAX_UTF16_LENGTH)
|
|
84
|
+
.replace(HOMEKIT_EDGE, '');
|
|
85
|
+
// Current HAP-NodeJS name validation expects distinct start/end alphanumeric
|
|
86
|
+
// characters. Preserve the one-character vendor name in context and expose a
|
|
87
|
+
// stable compliant label rather than letting Apple substitute a default.
|
|
88
|
+
if (Array.from(normalized).length === 1 && /^[\p{L}\p{N}]$/u.test(normalized)) {
|
|
89
|
+
normalized = `${normalized} AC`;
|
|
90
|
+
}
|
|
91
|
+
return HOMEKIT_NAME_PATTERN.test(normalized) ? normalized : undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Produce a deterministic HAP-compliant name without ASCII transliteration.
|
|
95
|
+
* All Unicode letters and numbers (including Polish and non-Latin scripts)
|
|
96
|
+
* are preserved. Typography with a safe HAP equivalent is mapped; unsupported
|
|
97
|
+
* symbols such as emoji remain available in the separately cached vendor name.
|
|
98
|
+
*/
|
|
99
|
+
export function toHomeKitName(value, fallback = 'Toshiba AC') {
|
|
100
|
+
for (const candidate of [value, fallback, 'Toshiba AC']) {
|
|
101
|
+
const normalized = normalizeHomeKitCandidate(candidate);
|
|
102
|
+
if (normalized) {
|
|
103
|
+
return normalized;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return 'Toshiba AC';
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=nameUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nameUtils.js","sourceRoot":"","sources":["../src/nameUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { API, Characteristic, DynamicPlatformPlugin, Logging, PlatformAccessory, PlatformConfig, Service } from 'homebridge';
|
|
2
|
+
import { ToshibaAcDevice } from './toshiba/device.js';
|
|
2
3
|
interface ToshibaPlatformConfig extends PlatformConfig {
|
|
3
4
|
username?: string;
|
|
4
5
|
password?: string;
|
|
@@ -6,6 +7,9 @@ interface ToshibaPlatformConfig extends PlatformConfig {
|
|
|
6
7
|
discoveryRefreshMinutes?: number;
|
|
7
8
|
requestTimeoutSeconds?: number;
|
|
8
9
|
httpRetries?: number;
|
|
10
|
+
enableFanService?: boolean;
|
|
11
|
+
enableFeatureSwitches?: boolean;
|
|
12
|
+
enableTemperatureSensors?: boolean;
|
|
9
13
|
}
|
|
10
14
|
type ToshibaCloudConnectionState = 'online' | 'offline' | 'unknown';
|
|
11
15
|
export declare class ToshibaSmartACPlatform implements DynamicPlatformPlugin {
|
|
@@ -20,6 +24,8 @@ export declare class ToshibaSmartACPlatform implements DynamicPlatformPlugin {
|
|
|
20
24
|
private readonly connectionStateCache;
|
|
21
25
|
private readonly missingConnectionStateCounts;
|
|
22
26
|
private readonly stateEndpointByDevice;
|
|
27
|
+
private readonly missingAccessoryCounts;
|
|
28
|
+
private consecutiveSuspiciousEmptyInventories;
|
|
23
29
|
private readonly sessionId;
|
|
24
30
|
private httpApi?;
|
|
25
31
|
private amqpClient?;
|
|
@@ -34,9 +40,14 @@ export declare class ToshibaSmartACPlatform implements DynamicPlatformPlugin {
|
|
|
34
40
|
private stateRefreshInProgress;
|
|
35
41
|
private discoveryRefreshInProgress;
|
|
36
42
|
private additionalInfoEndpointForbidden;
|
|
43
|
+
private stateStaleAfterMs;
|
|
44
|
+
private readonly shutdownController;
|
|
37
45
|
constructor(log: Logging, config: ToshibaPlatformConfig, api: API);
|
|
38
46
|
configureAccessory(accessory: PlatformAccessory): void;
|
|
47
|
+
private markCachedAccessoryUnavailable;
|
|
39
48
|
getDeviceCloudConnectionState(uniqueId: string): ToshibaCloudConnectionState;
|
|
49
|
+
isDeviceStateFresh(device: ToshibaAcDevice): boolean;
|
|
50
|
+
isDeviceStateTimestampFresh(receivedAt: number | undefined): boolean;
|
|
40
51
|
private start;
|
|
41
52
|
private connectCloud;
|
|
42
53
|
private refreshSasToken;
|
|
@@ -45,10 +56,15 @@ export declare class ToshibaSmartACPlatform implements DynamicPlatformPlugin {
|
|
|
45
56
|
private scheduleTokenRefreshRetry;
|
|
46
57
|
private calculateTokenRefreshDelayMs;
|
|
47
58
|
private discoverDevices;
|
|
59
|
+
private resolveDiscoveredName;
|
|
60
|
+
private updateCachedAccessory;
|
|
48
61
|
private removeStaleAccessories;
|
|
62
|
+
private resetDiscoveryPruningEvidence;
|
|
49
63
|
private startStatePolling;
|
|
50
64
|
private startDiscoveryRefresh;
|
|
51
65
|
private refreshStates;
|
|
66
|
+
private refreshSingleDeviceState;
|
|
67
|
+
private forEachWithConcurrency;
|
|
52
68
|
private fetchLatestStateForDevice;
|
|
53
69
|
private getStateEndpointStatus;
|
|
54
70
|
private markStateEndpointForbidden;
|
|
@@ -62,15 +78,16 @@ export declare class ToshibaSmartACPlatform implements DynamicPlatformPlugin {
|
|
|
62
78
|
private loadOrCreateMobileDeviceId;
|
|
63
79
|
private errorToString;
|
|
64
80
|
private isHttpForbidden;
|
|
65
|
-
private isAlreadyBridgedAccessoryError;
|
|
66
81
|
private sleep;
|
|
67
82
|
private isConnectedState;
|
|
83
|
+
private parseCloudConnectionState;
|
|
68
84
|
private refreshDeviceConnectionStates;
|
|
69
85
|
private updateConnectionStateCache;
|
|
70
86
|
private incrementMissingConnectionStateCount;
|
|
71
87
|
private clearMissingConnectionStateCount;
|
|
72
88
|
private findDeviceByCloudSourceId;
|
|
73
89
|
private normalizeCloudIdentifier;
|
|
90
|
+
private captureDeviceStateGenerations;
|
|
74
91
|
private normalizeIntegerConfig;
|
|
75
92
|
private scheduleStartupRetry;
|
|
76
93
|
}
|