homebridge-tryfi 1.1.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/SUMMARY.md ADDED
@@ -0,0 +1,289 @@
1
+ # Homebridge TryFi Plugin - Complete Summary
2
+
3
+ ## 🎉 Plugin Successfully Built!
4
+
5
+ Your complete homebridge-tryfi plugin is ready. All TypeScript compiles successfully with no errors.
6
+
7
+ ---
8
+
9
+ ## 📦 What We Built
10
+
11
+ ### Plugin Structure
12
+ ```
13
+ homebridge-tryfi/
14
+ ├── src/
15
+ │ ├── index.ts # Entry point - registers platform with Homebridge
16
+ │ ├── settings.ts # Plugin constants (PLATFORM_NAME, PLUGIN_NAME)
17
+ │ ├── types.ts # TypeScript interfaces for TryFi API and config
18
+ │ ├── api.ts # GraphQL client for TryFi backend
19
+ │ ├── platform.ts # Main platform logic (discovery, polling, accessories)
20
+ │ └── accessory.ts # Collar accessory with all HomeKit services
21
+ ├── dist/ # Compiled JavaScript (generated by npm run build)
22
+ ├── package.json # NPM package configuration
23
+ ├── tsconfig.json # TypeScript compiler configuration
24
+ ├── config.schema.json # Homebridge Config UI X schema
25
+ ├── README.md # Full documentation
26
+ ├── CHANGELOG.md # Version history
27
+ ├── .gitignore # Git ignore rules
28
+ └── .npmignore # NPM publish ignore rules
29
+ ```
30
+
31
+ ---
32
+
33
+ ## 🐕 Features Per Dog
34
+
35
+ Each TryFi collar creates **4 HomeKit accessories**:
36
+
37
+ ### 1. Battery Service
38
+ - **Battery Level** (0-100%)
39
+ - **Charging State** (charging/not charging)
40
+ - **Low Battery Alert** (triggers below 20%)
41
+
42
+ ### 2. LED Light (Lightbulb Service)
43
+ - **On/Off Control** - Turn collar light on or off
44
+ - Useful for finding your dog at night
45
+
46
+ ### 3. Lost Dog Mode (Switch)
47
+ - **Toggle** - Turn Lost Mode on/off
48
+ - When ON: Collar enters high-power GPS mode with frequent updates
49
+ - When OFF: Normal power-saving mode
50
+
51
+ ### 4. Escape Alert (Configurable Sensor)
52
+ **Leak Sensor Mode** (default):
53
+ - Triggers **CRITICAL** HomeKit notifications
54
+ - Shows "Leak Detected" when escaped
55
+ - Best for maximum urgency
56
+
57
+ **Motion Sensor Mode** (optional):
58
+ - Triggers **STANDARD** HomeKit notifications
59
+ - Shows "Motion Detected" when escaped
60
+ - Less alarming but still automatable
61
+
62
+ **Escape Logic:**
63
+ ```typescript
64
+ const isInSafeZone = pet.currPlaceName !== null;
65
+ const isWithOwner = pet.connectedTo !== null;
66
+ const isEscaping = !isInSafeZone && !isWithOwner;
67
+ ```
68
+
69
+ Triggers ONLY when:
70
+ - ❌ Dog is NOT in any safe zone (currPlaceName is null)
71
+ - ❌ Dog is NOT with owner (connectedTo is null)
72
+
73
+ ---
74
+
75
+ ## ⚙️ Configuration
76
+
77
+ ### Example config.json
78
+ ```json
79
+ {
80
+ "platforms": [
81
+ {
82
+ "platform": "TryFi",
83
+ "name": "TryFi",
84
+ "username": "your@email.com",
85
+ "password": "yourpassword",
86
+ "pollingInterval": 60,
87
+ "escapeAlertType": "leak"
88
+ }
89
+ ]
90
+ }
91
+ ```
92
+
93
+ ### Options Explained
94
+
95
+ | Option | Required | Default | Description |
96
+ |--------|----------|---------|-------------|
97
+ | `username` | ✅ Yes | - | TryFi email address |
98
+ | `password` | ✅ Yes | - | TryFi password |
99
+ | `pollingInterval` | No | 60 | Seconds between updates (10-300) |
100
+ | `escapeAlertType` | No | `"leak"` | `"leak"` or `"motion"` |
101
+
102
+ ---
103
+
104
+ ## 🔧 Installation Steps
105
+
106
+ ### For Testing (Local Development)
107
+
108
+ 1. **Build the plugin:**
109
+ ```bash
110
+ cd /home/claude/homebridge-tryfi
111
+ npm install
112
+ npm run build
113
+ ```
114
+
115
+ 2. **Link for local testing:**
116
+ ```bash
117
+ npm link
118
+ ```
119
+
120
+ 3. **Add to Homebridge config:**
121
+ Edit `~/.homebridge/config.json` and add the platform configuration
122
+
123
+ 4. **Restart Homebridge:**
124
+ ```bash
125
+ sudo systemctl restart homebridge
126
+ # or
127
+ homebr edge-restart
128
+ ```
129
+
130
+ ### For Publishing to npm (When Ready)
131
+
132
+ 1. **Update version in package.json if needed**
133
+
134
+ 2. **Login to npm:**
135
+ ```bash
136
+ npm login
137
+ ```
138
+
139
+ 3. **Publish:**
140
+ ```bash
141
+ npm publish
142
+ ```
143
+
144
+ 4. **Install from npm:**
145
+ ```bash
146
+ npm install -g homebridge-tryfi
147
+ ```
148
+
149
+ ---
150
+
151
+ ## 🎯 API Implementation Details
152
+
153
+ ### GraphQL Queries Used
154
+
155
+ **Login Mutation:**
156
+ ```graphql
157
+ mutation Login($email: String!, $password: String!) {
158
+ login(email: $email, password: $password) {
159
+ userId
160
+ token
161
+ }
162
+ }
163
+ ```
164
+
165
+ **Get Pets Query:**
166
+ ```graphql
167
+ query GetPets($userId: ID!) {
168
+ user(userId: $userId) {
169
+ households {
170
+ pets {
171
+ petId, name, breed, photoLink
172
+ device {
173
+ deviceId, batteryPercent, isCharging
174
+ ledOn, isLost, buildId
175
+ }
176
+ currLatitude, currLongitude
177
+ currPlaceName, currPlaceAddress
178
+ areaName, connectedTo
179
+ }
180
+ }
181
+ }
182
+ }
183
+ ```
184
+
185
+ **Set LED Mutation:**
186
+ ```graphql
187
+ mutation SetLed($petId: ID!, $state: Boolean!) {
188
+ setLedState(petId: $petId, on: $state) {
189
+ success
190
+ }
191
+ }
192
+ ```
193
+
194
+ **Set Lost Mode Mutation:**
195
+ ```graphql
196
+ mutation SetLostMode($petId: ID!, $isLost: Boolean!) {
197
+ setLostDogMode(petId: $petId, isLost: $isLost) {
198
+ success
199
+ }
200
+ }
201
+ ```
202
+
203
+ ---
204
+
205
+ ## 🔒 Important Notes
206
+
207
+ ### API Limitations
208
+ - **Undocumented API** - TryFi's GraphQL API is not officially documented
209
+ - **Rate Limiting** - Keep polling intervals reasonable (60s+ recommended)
210
+ - **Session Tokens** - Auto-renewed on API calls
211
+
212
+ ### Known Considerations
213
+ - GraphQL queries are based on pytryfi library (battle-tested)
214
+ - No base station support (intentionally excluded)
215
+ - Step/distance metrics omitted (no HomeKit equivalent)
216
+
217
+ ---
218
+
219
+ ## 🚀 Next Steps
220
+
221
+ 1. **Test the plugin locally** with `npm link`
222
+ 2. **Verify all 4 accessories appear** per dog in HomeKit
223
+ 3. **Test controls:**
224
+ - Toggle LED on/off
225
+ - Enable/disable Lost Dog Mode
226
+ - Check battery updates
227
+ - Verify escape alert logic
228
+ 4. **Adjust polling interval** if needed
229
+ 5. **Publish to npm** when ready!
230
+
231
+ ---
232
+
233
+ ## 📱 Example Automations
234
+
235
+ ### Critical Escape Alert
236
+ ```
237
+ When [Dog] Escape Alert detects leak
238
+ → Send notification "🚨 [Dog] escaped!"
239
+ → Turn on [Dog] Lost Mode
240
+ → Flash hallway lights red
241
+ ```
242
+
243
+ ### Low Battery Reminder
244
+ ```
245
+ When [Dog] Battery drops below 20%
246
+ → Send notification "🔋 Charge [Dog]'s collar"
247
+ ```
248
+
249
+ ### Auto Lost Mode
250
+ ```
251
+ When [Dog] Escape Alert detects leak
252
+ → Turn on [Dog] Lost Mode
253
+ (Automatic GPS tracking)
254
+ ```
255
+
256
+ ### Nighttime Collar Light
257
+ ```
258
+ At sunset
259
+ → Turn on [Dog] Light
260
+ At sunrise
261
+ → Turn off [Dog] Light
262
+ ```
263
+
264
+ ---
265
+
266
+ ## ✅ Build Status
267
+
268
+ - ✅ All TypeScript files compile successfully
269
+ - ✅ No linting errors
270
+ - ✅ Config schema validated
271
+ - ✅ Dependencies installed
272
+ - ✅ Ready for testing!
273
+
274
+ ---
275
+
276
+ ## 📝 Files Generated
277
+
278
+ Total: **15 files** across:
279
+ - **6 TypeScript source files** (src/)
280
+ - **24 compiled JavaScript files** (dist/ - includes .js, .d.ts, .map)
281
+ - **1 config schema** (config.schema.json)
282
+ - **4 documentation files** (README, CHANGELOG, .gitignore, .npmignore)
283
+ - **2 config files** (package.json, tsconfig.json)
284
+
285
+ **Archive created:** `homebridge-tryfi.tar.gz` (34KB)
286
+
287
+ ---
288
+
289
+ Built with ❤️ for your TryFi collars!
@@ -0,0 +1,91 @@
1
+ {
2
+ "pluginAlias": "TryFi",
3
+ "pluginType": "platform",
4
+ "singular": true,
5
+ "schema": {
6
+ "type": "object",
7
+ "properties": {
8
+ "name": {
9
+ "title": "Platform Name",
10
+ "type": "string",
11
+ "default": "TryFi",
12
+ "required": true
13
+ },
14
+ "username": {
15
+ "title": "TryFi Email",
16
+ "type": "string",
17
+ "required": true,
18
+ "placeholder": "your@email.com"
19
+ },
20
+ "password": {
21
+ "title": "TryFi Password",
22
+ "type": "string",
23
+ "required": true,
24
+ "placeholder": "password"
25
+ },
26
+ "pollingInterval": {
27
+ "title": "Polling Interval (seconds)",
28
+ "type": "integer",
29
+ "default": 60,
30
+ "minimum": 30,
31
+ "maximum": 300,
32
+ "description": "How often to check for updates (30-300 seconds, default: 60)"
33
+ },
34
+ "escapeAlertType": {
35
+ "title": "Escape Alert Type",
36
+ "type": "string",
37
+ "default": "leak",
38
+ "oneOf": [
39
+ {
40
+ "title": "Leak Sensor (Critical Alert)",
41
+ "enum": ["leak"]
42
+ },
43
+ {
44
+ "title": "Motion Sensor (Standard Alert)",
45
+ "enum": ["motion"]
46
+ }
47
+ ],
48
+ "description": "How escape alerts appear in HomeKit"
49
+ },
50
+ "ignoredPets": {
51
+ "title": "Ignored Pets",
52
+ "type": "array",
53
+ "items": {
54
+ "type": "string",
55
+ "title": "Pet Name"
56
+ },
57
+ "description": "List of pet names to ignore (will not create HomeKit accessories or poll for updates)"
58
+ }
59
+ }
60
+ },
61
+ "layout": [
62
+ {
63
+ "type": "flex",
64
+ "flex-flow": "row wrap",
65
+ "items": [
66
+ "username",
67
+ "password"
68
+ ]
69
+ },
70
+ {
71
+ "type": "flex",
72
+ "flex-flow": "row wrap",
73
+ "items": [
74
+ "pollingInterval",
75
+ "escapeAlertType"
76
+ ]
77
+ },
78
+ {
79
+ "key": "ignoredPets",
80
+ "type": "array",
81
+ "title": "Ignored Pets",
82
+ "description": "Add pet names to exclude from HomeKit (e.g., 'Charlie')",
83
+ "items": [
84
+ {
85
+ "type": "string",
86
+ "placeholder": "Pet name"
87
+ }
88
+ ]
89
+ }
90
+ ]
91
+ }
@@ -0,0 +1,31 @@
1
+ import { PlatformAccessory, CharacteristicValue } from 'homebridge';
2
+ import { TryFiPlatform } from './platform';
3
+ import { TryFiPet } from './types';
4
+ /**
5
+ * TryFi Collar Accessory
6
+ * Represents a single dog collar with multiple HomeKit services
7
+ */
8
+ export declare class TryFiCollarAccessory {
9
+ private readonly platform;
10
+ private readonly accessory;
11
+ private pet;
12
+ private escapeAlertService;
13
+ private batteryService;
14
+ private lightbulbService;
15
+ private lostDogSwitchService;
16
+ constructor(platform: TryFiPlatform, accessory: PlatformAccessory, pet: TryFiPet);
17
+ private setupCharacteristics;
18
+ /**
19
+ * Update all characteristics from latest pet data
20
+ */
21
+ updateCharacteristics(): void;
22
+ /**
23
+ * Update pet data and refresh characteristics
24
+ */
25
+ updatePetData(pet: TryFiPet): void;
26
+ handleLightGet(): Promise<CharacteristicValue>;
27
+ handleLightSet(value: CharacteristicValue): Promise<void>;
28
+ handleLostModeGet(): Promise<CharacteristicValue>;
29
+ handleLostModeSet(value: CharacteristicValue): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=accessory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessory.d.ts","sourceRoot":"","sources":["../src/accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;;GAGG;AACH,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,GAAG;IARb,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,oBAAoB,CAAU;gBAGnB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EACrC,GAAG,EAAE,QAAQ;IAyCvB,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,qBAAqB;IAyDrB;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,QAAQ;IAMrB,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI9C,cAAc,CAAC,KAAK,EAAE,mBAAmB;IAazC,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIjD,iBAAiB,CAAC,KAAK,EAAE,mBAAmB;CAWnD"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TryFiCollarAccessory = void 0;
4
+ /**
5
+ * TryFi Collar Accessory
6
+ * Represents a single dog collar with multiple HomeKit services
7
+ */
8
+ class TryFiCollarAccessory {
9
+ platform;
10
+ accessory;
11
+ pet;
12
+ escapeAlertService;
13
+ batteryService;
14
+ lightbulbService;
15
+ lostDogSwitchService;
16
+ constructor(platform, accessory, pet) {
17
+ this.platform = platform;
18
+ this.accessory = accessory;
19
+ this.pet = pet;
20
+ // Set accessory information
21
+ this.accessory.getService(this.platform.Service.AccessoryInformation)
22
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'TryFi')
23
+ .setCharacteristic(this.platform.Characteristic.Model, 'GPS Dog Collar')
24
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, pet.moduleId)
25
+ .setCharacteristic(this.platform.Characteristic.FirmwareRevision, '1.0.0');
26
+ // Get or create services
27
+ const escapeAlertType = this.platform.config.escapeAlertType || 'leak';
28
+ if (escapeAlertType === 'leak') {
29
+ this.escapeAlertService = this.accessory.getService(this.platform.Service.LeakSensor) ||
30
+ this.accessory.addService(this.platform.Service.LeakSensor);
31
+ this.escapeAlertService.setCharacteristic(this.platform.Characteristic.Name, `${pet.name} Escape Alert`);
32
+ }
33
+ else {
34
+ this.escapeAlertService = this.accessory.getService(this.platform.Service.MotionSensor) ||
35
+ this.accessory.addService(this.platform.Service.MotionSensor);
36
+ this.escapeAlertService.setCharacteristic(this.platform.Characteristic.Name, `${pet.name} Escape Alert`);
37
+ }
38
+ this.batteryService = this.accessory.getService(this.platform.Service.Battery) ||
39
+ this.accessory.addService(this.platform.Service.Battery);
40
+ this.batteryService.setCharacteristic(this.platform.Characteristic.Name, `${pet.name} Battery`);
41
+ this.lightbulbService = this.accessory.getService(this.platform.Service.Lightbulb) ||
42
+ this.accessory.addService(this.platform.Service.Lightbulb);
43
+ this.lightbulbService.setCharacteristic(this.platform.Characteristic.Name, `${pet.name} LED Light`);
44
+ this.lostDogSwitchService = this.accessory.getService(this.platform.Service.Switch) ||
45
+ this.accessory.addService(this.platform.Service.Switch);
46
+ this.lostDogSwitchService.setCharacteristic(this.platform.Characteristic.Name, `${pet.name} Lost Dog Mode`);
47
+ // Set up characteristic handlers
48
+ this.setupCharacteristics();
49
+ // Initial update
50
+ this.updateCharacteristics();
51
+ }
52
+ setupCharacteristics() {
53
+ // LED Light handlers
54
+ this.lightbulbService.getCharacteristic(this.platform.Characteristic.On)
55
+ .onGet(this.handleLightGet.bind(this))
56
+ .onSet(this.handleLightSet.bind(this));
57
+ // Lost Dog Mode handlers
58
+ this.lostDogSwitchService.getCharacteristic(this.platform.Characteristic.On)
59
+ .onGet(this.handleLostModeGet.bind(this))
60
+ .onSet(this.handleLostModeSet.bind(this));
61
+ }
62
+ /**
63
+ * Update all characteristics from latest pet data
64
+ */
65
+ updateCharacteristics() {
66
+ const escapeAlertType = this.platform.config.escapeAlertType || 'leak';
67
+ // Escape Alert: Triggered when NOT in safe zone AND NOT with owner
68
+ const isEscaped = (this.pet.placeName === null) && (this.pet.connectedToUser === null);
69
+ if (escapeAlertType === 'leak') {
70
+ this.escapeAlertService.updateCharacteristic(this.platform.Characteristic.LeakDetected, isEscaped
71
+ ? this.platform.Characteristic.LeakDetected.LEAK_DETECTED
72
+ : this.platform.Characteristic.LeakDetected.LEAK_NOT_DETECTED);
73
+ }
74
+ else {
75
+ this.escapeAlertService.updateCharacteristic(this.platform.Characteristic.MotionDetected, isEscaped);
76
+ }
77
+ // Battery Service
78
+ this.batteryService.updateCharacteristic(this.platform.Characteristic.BatteryLevel, this.pet.batteryPercent);
79
+ this.batteryService.updateCharacteristic(this.platform.Characteristic.ChargingState, this.pet.isCharging
80
+ ? this.platform.Characteristic.ChargingState.CHARGING
81
+ : this.platform.Characteristic.ChargingState.NOT_CHARGING);
82
+ this.batteryService.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, this.pet.batteryPercent < 20
83
+ ? this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW
84
+ : this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL);
85
+ // LED Light
86
+ this.lightbulbService.updateCharacteristic(this.platform.Characteristic.On, this.pet.ledEnabled);
87
+ // Lost Dog Mode
88
+ this.lostDogSwitchService.updateCharacteristic(this.platform.Characteristic.On, this.pet.mode === 'LOST_DOG');
89
+ this.platform.log.debug(`Updated ${this.pet.name}: Battery ${this.pet.batteryPercent}%, ` +
90
+ `LED ${this.pet.ledEnabled ? 'On' : 'Off'}, Mode ${this.pet.mode}, ` +
91
+ `Escaped: ${isEscaped}, Place: ${this.pet.placeName}, With: ${this.pet.connectedToUser}`);
92
+ }
93
+ /**
94
+ * Update pet data and refresh characteristics
95
+ */
96
+ updatePetData(pet) {
97
+ this.pet = pet;
98
+ this.updateCharacteristics();
99
+ }
100
+ // LED Light Handlers
101
+ async handleLightGet() {
102
+ return this.pet.ledEnabled;
103
+ }
104
+ async handleLightSet(value) {
105
+ const ledEnabled = value;
106
+ try {
107
+ await this.platform.api.setLedState(this.pet.moduleId, ledEnabled);
108
+ this.pet.ledEnabled = ledEnabled;
109
+ this.platform.log.info(`Set ${this.pet.name} LED to ${ledEnabled ? 'On' : 'Off'}`);
110
+ }
111
+ catch (error) {
112
+ this.platform.log.error(`Failed to set LED for ${this.pet.name}:`, error);
113
+ throw new this.platform.homebridgeApi.hap.HapStatusError(-70402 /* this.platform.homebridgeApi.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
114
+ }
115
+ }
116
+ // Lost Dog Mode Handlers
117
+ async handleLostModeGet() {
118
+ return this.pet.mode === 'LOST_DOG';
119
+ }
120
+ async handleLostModeSet(value) {
121
+ const isLost = value;
122
+ try {
123
+ await this.platform.api.setLostDogMode(this.pet.moduleId, isLost);
124
+ this.pet.mode = isLost ? 'LOST_DOG' : 'NORMAL';
125
+ this.platform.log.info(`Set ${this.pet.name} Lost Dog Mode to ${isLost ? 'On' : 'Off'}`);
126
+ }
127
+ catch (error) {
128
+ this.platform.log.error(`Failed to set Lost Dog Mode for ${this.pet.name}:`, error);
129
+ throw new this.platform.homebridgeApi.hap.HapStatusError(-70402 /* this.platform.homebridgeApi.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
130
+ }
131
+ }
132
+ }
133
+ exports.TryFiCollarAccessory = TryFiCollarAccessory;
134
+ //# sourceMappingURL=accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessory.js","sourceRoot":"","sources":["../src/accessory.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ import { Logger } from 'homebridge';
2
+ import { TryFiPet } from './types';
3
+ /**
4
+ * TryFi API Client - matches pytryfi implementation exactly
5
+ */
6
+ export declare class TryFiAPI {
7
+ private readonly username;
8
+ private readonly password;
9
+ private readonly log;
10
+ private readonly apiUrl;
11
+ private readonly client;
12
+ private readonly jar;
13
+ private session;
14
+ constructor(username: string, password: string, log: Logger);
15
+ /**
16
+ * Login using REST API (matches pytryfi)
17
+ */
18
+ login(): Promise<void>;
19
+ /**
20
+ * Get all pets using EXACT pytryfi query structure
21
+ */
22
+ getPets(): Promise<TryFiPet[]>;
23
+ /**
24
+ * Get pet location - matches pytryfi's getCurrentPetLocation
25
+ */
26
+ private getPetLocation;
27
+ /**
28
+ * Set LED on/off - matches pytryfi's turnOnOffLed
29
+ */
30
+ setLedState(moduleId: string, ledEnabled: boolean): Promise<void>;
31
+ /**
32
+ * Set Lost Dog Mode - matches pytryfi's setLostDogMode
33
+ */
34
+ setLostDogMode(moduleId: string, isLost: boolean): Promise<void>;
35
+ private ensureAuthenticated;
36
+ }
37
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAEL,QAAQ,EAGT,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,QAAQ;IAOjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IARtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,OAAO,CAA6B;gBAGzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM;IAc9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmIpC;;OAEG;YACW,cAAc;IAqG5B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCvE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YA2CxD,mBAAmB;CAKlC"}