homebridge-tryfi 1.1.1 → 1.2.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/CHANGELOG.md +60 -0
- package/README.md +308 -21
- package/config.schema.json +24 -0
- package/dist/accessory.d.ts +1 -0
- package/dist/accessory.d.ts.map +1 -1
- package/dist/accessory.js +21 -7
- package/dist/accessory.js.map +1 -1
- package/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +42 -6
- package/dist/api.js.map +1 -1
- package/dist/platform.d.ts +16 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +90 -0
- package/dist/platform.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/accessory.ts +28 -12
- package/src/api.ts +52 -7
- package/src/platform.ts +109 -1
- package/src/types.ts +2 -0
package/dist/api.js
CHANGED
|
@@ -18,6 +18,8 @@ class TryFiAPI {
|
|
|
18
18
|
client;
|
|
19
19
|
jar;
|
|
20
20
|
session = null;
|
|
21
|
+
// Cache last known good location data to avoid false escape alerts on timeouts
|
|
22
|
+
locationCache = new Map();
|
|
21
23
|
constructor(username, password, log) {
|
|
22
24
|
this.username = username;
|
|
23
25
|
this.password = password;
|
|
@@ -152,12 +154,16 @@ class TryFiAPI {
|
|
|
152
154
|
// Parse device info JSON object
|
|
153
155
|
const deviceInfo = pet.device.info || {};
|
|
154
156
|
const batteryPercent = parseInt(deviceInfo.batteryPercent) || 0;
|
|
155
|
-
|
|
157
|
+
// Detect charging from battery chip data
|
|
158
|
+
// batteryAverageCurrentMa > 0 means current flowing INTO battery (charging)
|
|
159
|
+
// batteryAverageCurrentMa < 0 means current flowing OUT (discharging)
|
|
160
|
+
// bq27421Info is null when collar is not on charger
|
|
161
|
+
const bq27421Info = deviceInfo.bq27421Info;
|
|
162
|
+
const isCharging = (bq27421Info?.batteryAverageCurrentMa ?? 0) > 0;
|
|
156
163
|
// Get location data for this pet
|
|
157
164
|
const location = await this.getPetLocation(pet.id);
|
|
158
165
|
// Determine connection status
|
|
159
166
|
const connectionState = pet.device.lastConnectionState;
|
|
160
|
-
const isCharging2 = connectionState?.__typename === 'ConnectedToBase';
|
|
161
167
|
const connectedToUser = connectionState?.__typename === 'ConnectedToUser'
|
|
162
168
|
? connectionState.user?.firstName || null
|
|
163
169
|
: null;
|
|
@@ -167,7 +173,7 @@ class TryFiAPI {
|
|
|
167
173
|
breed: pet.breed?.name || 'Unknown',
|
|
168
174
|
moduleId: pet.device.moduleId,
|
|
169
175
|
batteryPercent,
|
|
170
|
-
isCharging
|
|
176
|
+
isCharging,
|
|
171
177
|
ledEnabled: pet.device.operationParams?.ledEnabled || false,
|
|
172
178
|
mode: pet.device.operationParams?.mode || 'NORMAL',
|
|
173
179
|
connectedToUser,
|
|
@@ -186,6 +192,7 @@ class TryFiAPI {
|
|
|
186
192
|
}
|
|
187
193
|
/**
|
|
188
194
|
* Get pet location - matches pytryfi's getCurrentPetLocation
|
|
195
|
+
* Returns cached data on timeout/error to prevent false escape alerts
|
|
189
196
|
*/
|
|
190
197
|
async getPetLocation(petId) {
|
|
191
198
|
const query = `
|
|
@@ -261,15 +268,44 @@ class TryFiAPI {
|
|
|
261
268
|
latitude = lastPosition.position?.latitude || 0;
|
|
262
269
|
longitude = lastPosition.position?.longitude || 0;
|
|
263
270
|
}
|
|
264
|
-
|
|
271
|
+
const locationData = { latitude, longitude, areaName, placeName, placeAddress };
|
|
272
|
+
// Cache this successful location data
|
|
273
|
+
this.locationCache.set(petId, locationData);
|
|
274
|
+
return locationData;
|
|
265
275
|
}
|
|
266
276
|
catch (error) {
|
|
267
|
-
|
|
277
|
+
// Handle different error types for location queries
|
|
278
|
+
if (error.code === 'ECONNABORTED') {
|
|
279
|
+
// Timeout errors - common when TryFi API is slow
|
|
280
|
+
this.log.debug(`Location query timed out for pet ${petId}, using cached/default location`);
|
|
281
|
+
}
|
|
282
|
+
else if (error.response?.status) {
|
|
283
|
+
const status = error.response.status;
|
|
284
|
+
// Transient server errors
|
|
285
|
+
if (status === 502 || status === 503 || status === 504) {
|
|
286
|
+
this.log.debug(`Location API temporarily unavailable for pet ${petId} (${status})`);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
this.log.warn(`Failed to get location for pet ${petId} (HTTP ${status})`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
// Other errors - log message only, not full error object
|
|
294
|
+
this.log.warn(`Failed to get location for pet ${petId}: ${error.message || 'Unknown error'}`);
|
|
295
|
+
}
|
|
296
|
+
// Return cached data if available, otherwise return safe defaults
|
|
297
|
+
// IMPORTANT: Using cached placeName prevents false escape alerts on timeouts
|
|
298
|
+
const cached = this.locationCache.get(petId);
|
|
299
|
+
if (cached) {
|
|
300
|
+
this.log.debug(`Using cached location for pet ${petId}`);
|
|
301
|
+
return cached;
|
|
302
|
+
}
|
|
303
|
+
// No cache available - return defaults (first time seeing this pet)
|
|
268
304
|
return {
|
|
269
305
|
latitude: 0,
|
|
270
306
|
longitude: 0,
|
|
271
307
|
areaName: null,
|
|
272
|
-
placeName: null,
|
|
308
|
+
placeName: null, // null is safe here - no previous data to rely on
|
|
273
309
|
placeAddress: null,
|
|
274
310
|
};
|
|
275
311
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,qEAAkD;AAClD,+CAAyC;AASzC;;GAEG;AACH,MAAa,QAAQ;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export declare class TryFiPlatform implements DynamicPlatformPlugin {
|
|
|
16
16
|
readonly tryfiApi: TryFiAPI;
|
|
17
17
|
readonly api: TryFiAPI;
|
|
18
18
|
private pollingInterval?;
|
|
19
|
+
private escapeCounters;
|
|
20
|
+
private quickCheckTimeouts;
|
|
19
21
|
constructor(log: Logger, config: PlatformConfig, homebridgeApi: API);
|
|
20
22
|
/**
|
|
21
23
|
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
|
@@ -33,6 +35,20 @@ export declare class TryFiPlatform implements DynamicPlatformPlugin {
|
|
|
33
35
|
* Poll TryFi API for device updates
|
|
34
36
|
*/
|
|
35
37
|
private pollDevices;
|
|
38
|
+
/**
|
|
39
|
+
* Handle escape detection with hysteresis (debouncing)
|
|
40
|
+
* Prevents false alarms from GPS drift by requiring multiple consecutive detections
|
|
41
|
+
*/
|
|
42
|
+
private handleEscapeDetection;
|
|
43
|
+
/**
|
|
44
|
+
* Schedule a quick check for a specific pet
|
|
45
|
+
* Used during escape detection to re-verify faster than normal polling
|
|
46
|
+
*/
|
|
47
|
+
private scheduleQuickCheck;
|
|
48
|
+
/**
|
|
49
|
+
* Cancel any pending quick check for a pet
|
|
50
|
+
*/
|
|
51
|
+
private cancelQuickCheck;
|
|
36
52
|
/**
|
|
37
53
|
* Stop polling when platform is shutting down
|
|
38
54
|
*/
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAY,MAAM,SAAS,CAAC;AAExD;;GAEG;AACH,qBAAa,aAAc,YAAW,qBAAqB;aAiBvC,GAAG,EAAE,MAAM;aAEX,aAAa,EAAE,GAAG;IAlBpC,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IAEtD,SAAgB,MAAM,EAAE,mBAAmB,CAAC;IAC5C,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtD,SAAgB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAa;IAEjF,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IACnC,SAAgB,GAAG,EAAE,QAAQ,CAAC;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAiB;IAGzC,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,kBAAkB,CAA0C;gBAGlD,GAAG,EAAE,MAAM,EAC3B,MAAM,EAAE,cAAc,EACN,aAAa,EAAE,GAAG;IA2BpC;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;IAK/C;;OAEG;IACG,eAAe;IAwHrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;YACW,WAAW;IA+DzB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoC7B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,QAAQ;CAWT"}
|
package/dist/platform.js
CHANGED
|
@@ -17,6 +17,9 @@ class TryFiPlatform {
|
|
|
17
17
|
tryfiApi;
|
|
18
18
|
api; // Alias for accessory use
|
|
19
19
|
pollingInterval;
|
|
20
|
+
// Escape alert hysteresis tracking (in-memory only, resets on restart)
|
|
21
|
+
escapeCounters = new Map();
|
|
22
|
+
quickCheckTimeouts = new Map();
|
|
20
23
|
constructor(log, config, homebridgeApi) {
|
|
21
24
|
this.log = log;
|
|
22
25
|
this.homebridgeApi = homebridgeApi;
|
|
@@ -166,6 +169,8 @@ class TryFiPlatform {
|
|
|
166
169
|
const accessory = this.collarAccessories.get(pet.petId);
|
|
167
170
|
if (accessory) {
|
|
168
171
|
accessory.updatePetData(pet);
|
|
172
|
+
// Handle escape alert hysteresis
|
|
173
|
+
this.handleEscapeDetection(pet);
|
|
169
174
|
}
|
|
170
175
|
}
|
|
171
176
|
this.log.debug(`Updated ${pets.length} collar(s)`);
|
|
@@ -193,6 +198,7 @@ class TryFiPlatform {
|
|
|
193
198
|
const accessory = this.collarAccessories.get(pet.petId);
|
|
194
199
|
if (accessory) {
|
|
195
200
|
accessory.updatePetData(pet);
|
|
201
|
+
this.handleEscapeDetection(pet);
|
|
196
202
|
}
|
|
197
203
|
}
|
|
198
204
|
this.log.debug(`Updated ${pets.length} collar(s) after re-auth`);
|
|
@@ -211,6 +217,85 @@ class TryFiPlatform {
|
|
|
211
217
|
}
|
|
212
218
|
}
|
|
213
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Handle escape detection with hysteresis (debouncing)
|
|
222
|
+
* Prevents false alarms from GPS drift by requiring multiple consecutive detections
|
|
223
|
+
*/
|
|
224
|
+
handleEscapeDetection(pet) {
|
|
225
|
+
// Check if pet is escaped (out of zone AND not with anyone)
|
|
226
|
+
const isEscaped = (pet.placeName === null && pet.connectedToUser === null);
|
|
227
|
+
const currentCount = this.escapeCounters.get(pet.petId) || 0;
|
|
228
|
+
const confirmationsRequired = this.config.escapeConfirmations || 2;
|
|
229
|
+
if (isEscaped) {
|
|
230
|
+
// Potential escape detected - increment counter
|
|
231
|
+
const newCount = currentCount + 1;
|
|
232
|
+
this.escapeCounters.set(pet.petId, newCount);
|
|
233
|
+
this.log.debug(`${pet.name} out of zone (${newCount}/${confirmationsRequired} confirmations)`);
|
|
234
|
+
if (newCount >= confirmationsRequired) {
|
|
235
|
+
// Threshold reached - escape confirmed
|
|
236
|
+
// Accessory will handle the actual alert state update
|
|
237
|
+
this.log.info(`${pet.name} escape confirmed after ${newCount} check(s)`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// Not confirmed yet - schedule quick re-check
|
|
241
|
+
this.scheduleQuickCheck(pet.petId, pet.name);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// Pet is safe (in zone OR with someone) - reset counter
|
|
246
|
+
const hadCount = currentCount > 0;
|
|
247
|
+
this.escapeCounters.set(pet.petId, 0);
|
|
248
|
+
this.cancelQuickCheck(pet.petId);
|
|
249
|
+
if (hadCount) {
|
|
250
|
+
this.log.debug(`${pet.name} back in safe state, reset escape counter`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Schedule a quick check for a specific pet
|
|
256
|
+
* Used during escape detection to re-verify faster than normal polling
|
|
257
|
+
*/
|
|
258
|
+
scheduleQuickCheck(petId, petName) {
|
|
259
|
+
// Don't schedule if already scheduled
|
|
260
|
+
if (this.quickCheckTimeouts.has(petId)) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const interval = (this.config.escapeCheckInterval || 30) * 1000;
|
|
264
|
+
this.log.debug(`Scheduling quick check for ${petName} in ${interval / 1000}s`);
|
|
265
|
+
const timeout = setTimeout(async () => {
|
|
266
|
+
this.log.debug(`Running quick check for ${petName}`);
|
|
267
|
+
// Remove from timeouts map
|
|
268
|
+
this.quickCheckTimeouts.delete(petId);
|
|
269
|
+
// Poll just this one pet
|
|
270
|
+
try {
|
|
271
|
+
const allPets = await this.tryfiApi.getPets();
|
|
272
|
+
const pet = allPets.find(p => p.petId === petId);
|
|
273
|
+
if (pet) {
|
|
274
|
+
const accessory = this.collarAccessories.get(petId);
|
|
275
|
+
if (accessory) {
|
|
276
|
+
accessory.updatePetData(pet);
|
|
277
|
+
// Handle escape detection (may schedule another quick check)
|
|
278
|
+
this.handleEscapeDetection(pet);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
this.log.warn(`Quick check failed for ${petName}:`, error.message || error);
|
|
284
|
+
// Counter will remain, next normal poll will try again
|
|
285
|
+
}
|
|
286
|
+
}, interval);
|
|
287
|
+
this.quickCheckTimeouts.set(petId, timeout);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Cancel any pending quick check for a pet
|
|
291
|
+
*/
|
|
292
|
+
cancelQuickCheck(petId) {
|
|
293
|
+
const timeout = this.quickCheckTimeouts.get(petId);
|
|
294
|
+
if (timeout) {
|
|
295
|
+
clearTimeout(timeout);
|
|
296
|
+
this.quickCheckTimeouts.delete(petId);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
214
299
|
/**
|
|
215
300
|
* Stop polling when platform is shutting down
|
|
216
301
|
*/
|
|
@@ -218,6 +303,11 @@ class TryFiPlatform {
|
|
|
218
303
|
if (this.pollingInterval) {
|
|
219
304
|
clearInterval(this.pollingInterval);
|
|
220
305
|
}
|
|
306
|
+
// Cancel all pending quick checks
|
|
307
|
+
for (const timeout of this.quickCheckTimeouts.values()) {
|
|
308
|
+
clearTimeout(timeout);
|
|
309
|
+
}
|
|
310
|
+
this.quickCheckTimeouts.clear();
|
|
221
311
|
}
|
|
222
312
|
}
|
|
223
313
|
exports.TryFiPlatform = TryFiPlatform;
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";;;AASA,+BAAiC;AACjC,2CAAmD;AAGnD;;GAEG;AACH,MAAa,aAAa;IAiBN;IAEA;IAlBF,OAAO,CAAiB;IACxB,cAAc,CAAwB;IAEtC,MAAM,CAAsB;IAC5B,WAAW,GAAwB,EAAE,CAAC;IACtC,iBAAiB,GAAsC,IAAI,GAAG,EAAE,CAAC;IAEjE,QAAQ,CAAW;IACnB,GAAG,CAAW,CAAC,0BAA0B;IACjD,eAAe,CAAkB;IAEzC,uEAAuE;IAC/D,cAAc,GAAwB,IAAI,GAAG,EAAE,CAAC;IAChD,kBAAkB,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEpE,YACkB,GAAW,EAC3B,MAAsB,EACN,aAAkB;QAFlB,QAAG,GAAH,GAAG,CAAQ;QAEX,kBAAa,GAAb,aAAa,CAAK;QAElC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC;QAE5D,0CAA0C;QAC1C,IAAI,CAAC,MAAM,GAAG,MAA6B,CAAC;QAE5C,kBAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACnD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,0BAA0B;QAEpD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE/D,mFAAmF;QACnF,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC/C,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAClD,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,SAA4B;QAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAE9C,6CAA6C;YAC7C,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAElF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAClD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,YAAY,gCAAgC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC;YAE3D,2BAA2B;YAC3B,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;YAE3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEhC,wCAAwC;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAE7D,oCAAoC;gBACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAC7C,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CACvC,CAAC;gBAEF,IAAI,iBAAiB,EAAE,CAAC;oBACtB,6BAA6B;oBAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBACpE,iBAAiB,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;oBAEpC,kCAAkC;oBAClC,MAAM,eAAe,GAAG,IAAI,gCAAoB,CAC9C,IAAI,EACJ,iBAAiB,EACjB,GAAG,CACJ,CAAC;oBACF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;oBAEvD,sBAAsB;oBACtB,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,uBAAuB;oBACvB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEjD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC3E,SAAS,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;oBAE5B,kCAAkC;oBAClC,MAAM,eAAe,GAAG,IAAI,gCAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;oBACvE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;oBAEvD,yBAAyB;oBACzB,IAAI,CAAC,aAAa,CAAC,2BAA2B,CAAC,kBAAkB,EAAE,OAAO,EAAE;wBAC1E,SAAS;qBACV,CAAC,CAAC;oBACH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,mDAAmD;YACnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACjD,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CACnE,CAAC;YAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,YAAY,mBAAmB,CAAC,MAAM,kCAAkC,CACzE,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAC9C,kBAAkB,EAClB,OAAO,EACP,mBAAmB,CACpB,CAAC;gBAEF,2BAA2B;gBAC3B,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;oBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAClD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;wBACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBACpC,CAAC;oBACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,gDAAgD;YAChD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAErC,uEAAuE;gBACvE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACvD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,MAAM,kBAAkB,CAAC,CAAC;oBAC9E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;oBACvD,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,mCAAmC;oBACxD,OAAO;gBACT,CAAC;gBAED,wBAAwB;gBACxB,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;oBAClF,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,MAAM,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtF,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,eAAe,GAAG,IAAI,UAAU,CAAC,CAAC;QAE1E,8BAA8B;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtC,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,EAAE,eAAe,CAAC,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAE9C,6CAA6C;YAC7C,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAElF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxD,IAAI,SAAS,EAAE,CAAC;oBACd,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;oBAE7B,iCAAiC;oBACjC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,6CAA6C;YAC7C,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAErC,8EAA8E;gBAC9E,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACvD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,MAAM,4BAA4B,CAAC,CAAC;oBACxF,OAAO;gBACT,CAAC;gBAED,4DAA4D;gBAC5D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;oBACnE,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;wBAC1D,8CAA8C;wBAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC9C,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;wBACpF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBAClF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;4BACvB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;4BACxD,IAAI,SAAS,EAAE,CAAC;gCACd,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gCAC7B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;4BAClC,CAAC;wBACH,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,0BAA0B,CAAC,CAAC;oBACnE,CAAC;oBAAC,OAAO,WAAW,EAAE,CAAC;wBACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,WAAW,CAAC,CAAC;oBACvE,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,oBAAoB;gBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,MAAM,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAAC,GAAa;QACzC,4DAA4D;QAC5D,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC;QAE3E,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAEnE,IAAI,SAAS,EAAE,CAAC;YACd,gDAAgD;YAChD,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAE7C,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,GAAG,GAAG,CAAC,IAAI,iBAAiB,QAAQ,IAAI,qBAAqB,iBAAiB,CAC/E,CAAC;YAEF,IAAI,QAAQ,IAAI,qBAAqB,EAAE,CAAC;gBACtC,uCAAuC;gBACvC,sDAAsD;gBACtD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,2BAA2B,QAAQ,WAAW,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEjC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,2CAA2C,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,KAAa,EAAE,OAAe;QACvD,sCAAsC;QACtC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QAEhE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,OAAO,OAAO,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC;QAE/E,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;YAErD,2BAA2B;YAC3B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEtC,yBAAyB;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBAEjD,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpD,IAAI,SAAS,EAAE,CAAC;wBACd,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;wBAE7B,6DAA6D;wBAC7D,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,OAAO,GAAG,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;gBAC5E,uDAAuD;YACzD,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEb,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAa;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtC,CAAC;QAED,kCAAkC;QAClC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;YACvD,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;CACF;AAlXD,sCAkXC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface TryFiPlatformConfig extends PlatformConfig {
|
|
|
8
8
|
pollingInterval?: number;
|
|
9
9
|
escapeAlertType?: 'leak' | 'motion';
|
|
10
10
|
ignoredPets?: string[];
|
|
11
|
+
escapeConfirmations?: number;
|
|
12
|
+
escapeCheckInterval?: number;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* TryFi Session Information
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-tryfi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Homebridge plugin for TryFi Dog GPS Collars",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"license": "Apache-2.0",
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
|
-
"url": "https://github.com/
|
|
27
|
+
"url": "https://github.com/yourusername/homebridge-tryfi.git"
|
|
28
28
|
},
|
|
29
29
|
"bugs": {
|
|
30
|
-
"url": "https://github.com/
|
|
30
|
+
"url": "https://github.com/yourusername/homebridge-tryfi/issues"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"axios": "^1.6.0",
|
package/src/accessory.ts
CHANGED
|
@@ -11,6 +11,9 @@ export class TryFiCollarAccessory {
|
|
|
11
11
|
private batteryService: Service;
|
|
12
12
|
private lightbulbService: Service;
|
|
13
13
|
private lostDogSwitchService: Service;
|
|
14
|
+
|
|
15
|
+
// Track last escape state to avoid redundant HomeKit updates
|
|
16
|
+
private lastEscapeState?: boolean;
|
|
14
17
|
|
|
15
18
|
constructor(
|
|
16
19
|
private readonly platform: TryFiPlatform,
|
|
@@ -77,18 +80,31 @@ export class TryFiCollarAccessory {
|
|
|
77
80
|
// Escape Alert: Triggered when NOT in safe zone AND NOT with owner
|
|
78
81
|
const isEscaped = (this.pet.placeName === null) && (this.pet.connectedToUser === null);
|
|
79
82
|
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
83
|
+
// Only update HomeKit if escape state changed (prevents redundant notifications)
|
|
84
|
+
if (this.lastEscapeState !== isEscaped) {
|
|
85
|
+
if (escapeAlertType === 'leak') {
|
|
86
|
+
this.escapeAlertService.updateCharacteristic(
|
|
87
|
+
this.platform.Characteristic.LeakDetected,
|
|
88
|
+
isEscaped
|
|
89
|
+
? this.platform.Characteristic.LeakDetected.LEAK_DETECTED
|
|
90
|
+
: this.platform.Characteristic.LeakDetected.LEAK_NOT_DETECTED,
|
|
91
|
+
);
|
|
92
|
+
} else {
|
|
93
|
+
this.escapeAlertService.updateCharacteristic(
|
|
94
|
+
this.platform.Characteristic.MotionDetected,
|
|
95
|
+
isEscaped,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
this.lastEscapeState = isEscaped;
|
|
100
|
+
|
|
101
|
+
// Log state changes
|
|
102
|
+
if (isEscaped) {
|
|
103
|
+
this.platform.log.warn(`🚨 ${this.pet.name} has ESCAPED!`);
|
|
104
|
+
} else if (this.lastEscapeState === true) {
|
|
105
|
+
// Only log "back safe" if was previously escaped
|
|
106
|
+
this.platform.log.info(`✅ ${this.pet.name} is back in safe zone`);
|
|
107
|
+
}
|
|
92
108
|
}
|
|
93
109
|
|
|
94
110
|
// Battery Service
|
package/src/api.ts
CHANGED
|
@@ -17,6 +17,15 @@ export class TryFiAPI {
|
|
|
17
17
|
private readonly client: AxiosInstance;
|
|
18
18
|
private readonly jar: CookieJar;
|
|
19
19
|
private session: TryFiSession | null = null;
|
|
20
|
+
|
|
21
|
+
// Cache last known good location data to avoid false escape alerts on timeouts
|
|
22
|
+
private locationCache: Map<string, {
|
|
23
|
+
latitude: number;
|
|
24
|
+
longitude: number;
|
|
25
|
+
areaName: string | null;
|
|
26
|
+
placeName: string | null;
|
|
27
|
+
placeAddress: string | null;
|
|
28
|
+
}> = new Map();
|
|
20
29
|
|
|
21
30
|
constructor(
|
|
22
31
|
private readonly username: string,
|
|
@@ -170,14 +179,19 @@ export class TryFiAPI {
|
|
|
170
179
|
// Parse device info JSON object
|
|
171
180
|
const deviceInfo = pet.device.info || {};
|
|
172
181
|
const batteryPercent = parseInt(deviceInfo.batteryPercent) || 0;
|
|
173
|
-
|
|
182
|
+
|
|
183
|
+
// Detect charging from battery chip data
|
|
184
|
+
// batteryAverageCurrentMa > 0 means current flowing INTO battery (charging)
|
|
185
|
+
// batteryAverageCurrentMa < 0 means current flowing OUT (discharging)
|
|
186
|
+
// bq27421Info is null when collar is not on charger
|
|
187
|
+
const bq27421Info = deviceInfo.bq27421Info;
|
|
188
|
+
const isCharging = (bq27421Info?.batteryAverageCurrentMa ?? 0) > 0;
|
|
174
189
|
|
|
175
190
|
// Get location data for this pet
|
|
176
191
|
const location = await this.getPetLocation(pet.id);
|
|
177
192
|
|
|
178
193
|
// Determine connection status
|
|
179
194
|
const connectionState = pet.device.lastConnectionState;
|
|
180
|
-
const isCharging2 = connectionState?.__typename === 'ConnectedToBase';
|
|
181
195
|
const connectedToUser =
|
|
182
196
|
connectionState?.__typename === 'ConnectedToUser'
|
|
183
197
|
? (connectionState as any).user?.firstName || null
|
|
@@ -189,7 +203,7 @@ export class TryFiAPI {
|
|
|
189
203
|
breed: pet.breed?.name || 'Unknown',
|
|
190
204
|
moduleId: pet.device.moduleId,
|
|
191
205
|
batteryPercent,
|
|
192
|
-
isCharging
|
|
206
|
+
isCharging,
|
|
193
207
|
ledEnabled: pet.device.operationParams?.ledEnabled || false,
|
|
194
208
|
mode: pet.device.operationParams?.mode || 'NORMAL',
|
|
195
209
|
connectedToUser,
|
|
@@ -209,6 +223,7 @@ export class TryFiAPI {
|
|
|
209
223
|
|
|
210
224
|
/**
|
|
211
225
|
* Get pet location - matches pytryfi's getCurrentPetLocation
|
|
226
|
+
* Returns cached data on timeout/error to prevent false escape alerts
|
|
212
227
|
*/
|
|
213
228
|
private async getPetLocation(petId: string): Promise<{
|
|
214
229
|
latitude: number;
|
|
@@ -298,14 +313,44 @@ export class TryFiAPI {
|
|
|
298
313
|
longitude = lastPosition.position?.longitude || 0;
|
|
299
314
|
}
|
|
300
315
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
this
|
|
316
|
+
const locationData = { latitude, longitude, areaName, placeName, placeAddress };
|
|
317
|
+
|
|
318
|
+
// Cache this successful location data
|
|
319
|
+
this.locationCache.set(petId, locationData);
|
|
320
|
+
|
|
321
|
+
return locationData;
|
|
322
|
+
} catch (error: any) {
|
|
323
|
+
// Handle different error types for location queries
|
|
324
|
+
if (error.code === 'ECONNABORTED') {
|
|
325
|
+
// Timeout errors - common when TryFi API is slow
|
|
326
|
+
this.log.debug(`Location query timed out for pet ${petId}, using cached/default location`);
|
|
327
|
+
} else if (error.response?.status) {
|
|
328
|
+
const status = error.response.status;
|
|
329
|
+
// Transient server errors
|
|
330
|
+
if (status === 502 || status === 503 || status === 504) {
|
|
331
|
+
this.log.debug(`Location API temporarily unavailable for pet ${petId} (${status})`);
|
|
332
|
+
} else {
|
|
333
|
+
this.log.warn(`Failed to get location for pet ${petId} (HTTP ${status})`);
|
|
334
|
+
}
|
|
335
|
+
} else {
|
|
336
|
+
// Other errors - log message only, not full error object
|
|
337
|
+
this.log.warn(`Failed to get location for pet ${petId}: ${error.message || 'Unknown error'}`);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Return cached data if available, otherwise return safe defaults
|
|
341
|
+
// IMPORTANT: Using cached placeName prevents false escape alerts on timeouts
|
|
342
|
+
const cached = this.locationCache.get(petId);
|
|
343
|
+
if (cached) {
|
|
344
|
+
this.log.debug(`Using cached location for pet ${petId}`);
|
|
345
|
+
return cached;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// No cache available - return defaults (first time seeing this pet)
|
|
304
349
|
return {
|
|
305
350
|
latitude: 0,
|
|
306
351
|
longitude: 0,
|
|
307
352
|
areaName: null,
|
|
308
|
-
placeName: null,
|
|
353
|
+
placeName: null, // null is safe here - no previous data to rely on
|
|
309
354
|
placeAddress: null,
|
|
310
355
|
};
|
|
311
356
|
}
|