Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/abn/homey-interval-manager
https://github.com/abn/homey-interval-manager
helper homey library node-module nodejs setinterval typescript
Last synced: 7 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/abn/homey-interval-manager
- Owner: abn
- License: mit
- Created: 2024-10-22T23:08:52.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2024-12-10T23:14:21.000Z (16 days ago)
- Last Synced: 2024-12-11T00:21:35.206Z (16 days ago)
- Topics: helper, homey, library, node-module, nodejs, setinterval, typescript
- Language: TypeScript
- Homepage: https://abn.github.io/homey-interval-manager/
- Size: 369 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# homey-interval-manager
A lightweight TypeScript library for managing intervals in Homey Apps, Devices and Drivers. Simplifies the process of
scheduling and managing recurring tasks within your Homey applications.## Features
- **Easy interval management:** Start, stop, and restart intervals with a simple API.
- **Flexible configuration:** Define intervals with custom functions, settings, and intervals.
- **Automatic restarts:** Optionally restart intervals when device settings change.
- **TypeScript support:** Provides type definitions for improved code clarity and maintainability.## Installation
```bash
npm install homey-interval-manager
```## Usage
1. **Import the class:**
```typescript
import HomeyIntervalManager from "homey-interval-manager";
```2. **Create an instance:**
```typescript
// In your device class constructor:
this.intervalManager = new HomeyIntervalManager(
this,
{
SOME_KEY: {
functionName: "myFunction", // Name of the function to execute
settingName: "mySetting", // Optional setting to watch for changes
intervalSeconds: 300, // Optional interval in seconds (default: 600)
disableAutoStart: false, // Optional, prevent auto-start on device init
},
SOME_OTHER_KEY: {
functionName: "myOtherFunction", // Name of the function to execute
},
// ... more interval configurations ...
},
600,
); // defaults to 10 minutes if no interval or setting name provided
```3. **Start the intervals:**
```typescript
// Start all intervals (defined in the config)
await this.intervalManager.start();// Or start specific intervals
await this.intervalManager.start("SOME_KEY", "SOME_OTHER_KEY");
```4. **Stop the intervals:**
```typescript
// Stop all intervals
await this.intervalManager.stop();// Or stop a specific interval
await this.intervalManager.clearInterval("myInterval");
```5. **Restart intervals:**
```typescript
// Restart all intervals
await this.intervalManager.restart();// Restart intervals associated with specific settings
await this.intervalManager.restart("mySetting");
```## Example
```typescript
import { OAuth2Device } from "homey-oauth2app";
import { HomeyIntervalManager, IntervalConfiguration, IntervalConfigurationCollection } from "homey-interval-manager";type DeviceSettingsValue = boolean | string | number | undefined | null;
type DeviceSettings = Record;class SomeCloudApiDevice extends OAuth2Device {
protected intervalManager!: HomeyIntervalManager;async onOAuth2Init() {
this.intervalManager = new HomeyIntervalManager(
this,
{
STATUS_UPDATE: {
functionName: "syncStatusUpdate",
settingName: "status_update_polling_interval",
},
},
600,
true,
);
await this.intervalManager.start();
}async syncStatusUpdate(): Promise {
const status = await this.get({ path: "/status" });
await this.setCapabilityValue("device_status", status.name);
}async onOAuth2Uninit() {
await this.intervalManager.stop();
}async onSettings(event: {
oldSettings: DeviceSettings;
newSettings: DeviceSettings;
changedKeys: string[];
}): Promise {
this.log("SomeCloudApi device settings where changed");
const changedKeys = event.changedKeys as IntervalConfiguration["settingName"][] & string[];
this.homey.setTimeout(async () => {
await this.intervalManager.restartBySettings(...changedKeys);
}, 1000);
}
}
```## Contributing
Contributions are welcome\! Feel free to open issues or submit pull requests.
## License
[MIT](LICENSE)