@constructorfleet/ultimate-govee
Version:
Library for interacting with Govee devices written in Typescript.
271 lines (215 loc) • 9.31 kB
Markdown
# Ultimate Govee
## Description
Provides command and control interface for interacting with
[Govee](https://govee.com) via Bluetooth LE, AWS IoT Core, LAN (TODO), and Govee
OpenAPI Developer Platform (TODO).
If a device type is known, it will be categorized and have type-specific device
states. Supported types so far:
- Purifiers
- Humidifiers
- RGB Lights (Bulbs, Strips, etc.)
- RGBIC Lights (Bulbs, Strips, Glide, etc.)
- Air Quality Monitors
- Hygrometers
- Ice Makers
## Control Channels
The primary control channel is AWS IoT Core - this is a Pub/Sub system that
works with any WiFi-enabled device (and soon any device behind a disributed
gateway). If you have a bluetooth adapter, you can enable the BLE control
channel to control those directly; however, if you try to enable this and do not
have a bluetooth adapter - it will cause the library to crash.
This works on OSX and Linux system. Have not tested Windows.
## Devices
Devices are composed of various states, some allow you to change them while
others are informational only. Each state keeps a history for the previous 5
state values and if it's a controllable state you can set it to one of them by
invoking the `previousState` method, which accepts a value between 0 and 5 (0
means set it to the current state, 1 the previous state, all the way to 5 being
the 5th previous state). This allows for automations like "When motion: set
RGBICLightDevice's wholecolor state to white and brightness state to 100%; On
motion clear return to the previous brightness and previous light effect"
```typescript
const device: RGBICLight;
onMotion() {
device.wholeColor().setState({red: 255, green: 255, blue: 255});
device.brightness().setState(100);
}
onMotionClear() {
device.ligthEffect().previousState(1);
device.brightness().previousState(1);
}
```
### States
- `isActive` - Whether the device is "active", i.e. the Purifier is running
- `batteryLevel` - The remaining battery level as a percentage (if device is
battery powered)
- `brightness` - The brighness (as percentage) for the device (in the case of
RGBICLights, this is the entire device)
- `colorRGB` - Color of a light, for bulb and strips this is for the device
itself
- `colorTemp` - The color temperature for the light (2000K - 9000K)
- `connected` - This should indicate whether the device is online, however it's
not consistent
- `controlLock` - Locks or unlocks the physical controls on the device
- `displaySchedule` - Sets when the display on the device is to be illuminated
- `filterExpired` - Flag indicating the device's filter is needing replaced
- `filterLife` - The remaining life of the device's filter (as a percentage),
not all devices report this
- `humidity` - An object containing the valid relative humidity range, current
reading, calibration settings and raw value
- `lightEffect` - Contains the list of valid light effects for the device, you
can control the state via the effect name or the numeric code
- `mode` - The active mode of the device, this state is meaningless without a
specific device implementation
- `nightLight` - Control the night light feature of the device, if the device
has one
- `power` - Whether the device is on or off, this is similar to
- `isActive` but applies primarily to switch and light devices
- `temperature` - An object containing the valid temperature range, current
reading, calibration settings and raw value
- `timer`- Allows interacting with the device's timer feature (setting the start
and end for operation)
- `waterShortage` - Flag indicating the device is out of water.
### Humidifiers
- `mistLevel` - The amount of mist the humidifier is emitting
- `targetHumidity` - If paired with Hygrometer or one is integrated, sets the
relative humidity at which the device will pause activity
- `uvc` - Some humidifiers offer a UVC sterilization feature, set this to true
to enable sanitization
- `manualMode` - Simple mode where you can control the mistLevel directly
* `customMode` - Set three mist levels and their durations, once the first is
completed it starts the second, the third can be indefinite or a finite
duration
- `autoMode` - Humidifier will operate automatically until the target humidity
is reached
### Ice Makers
- `nuggetSize` - Set the size of the ice cubes
- `makingIce` - Analogous to `isActive`, starts or stops the ice production
- `iceMakerStatus` - The status of the device: washing, idle, making ice, etc.
- `scheduledStart` - Allows you to set a time in the future to start ice
production
- `basketFull` - Flag indicating the basket is full and needs to be emptied.
### Purifier
- `fanSpeed` - Reported as a percentage, indicates how much the purifier is
working. Some devices only allow 3 speeds, some 4.
- `manualMode` - Control the fan speed directly
- `customMode` - Set three speed settigns and their durations, once the first is
complete it starts the second, the third can be indefinite or a finite
duration
- `autoMode` - If paird with an air quality monitor or has one integrated, will
purify the air until the air quality measurement is below the threshold
### Air Quality Monitor
- `pm25` - the PPM measurements of particles in the air
- `humdidity` - the measured ambient relative humidity
- `temprature` - the measured ambient temperature
### Hygrometer
- `humidity` - the measured ambient relative humidity
- `temperature` - the measure ambient temperature
- `batteryLevel` - Remaining battery level of the device
### Presence Sensor
- `presence-mmWave` - mmWave sensor detected, distance in centimeters and
duration
- `presence-biological` - IR sensor detected, distance in centimters and
duration
- `enablePresence` - Flags for enabling the sensors
- `detectionSettings` - Configure the detection distance, report detection
duration and duration before absence
### RGB Lights
- `micMode` - Makes the device sound reactive, various settings can be applied
to this mode such as sensitivity, colors and intensity
- `colorMode` - The color of the light
- `brightness` - The brightness of the light
- `colorTemp` - The color temperature of the light
### RGBIC LIghts
- `micMode` - set the device to be audio reactive, you can change the colors,
intensity, how the colors change (chase, pulse, etc)
- `wholeColorMode` - controls the color of the entire device
- `segmentedColorMode` - controls color and brightness of the individual light
segments
- `lightEffect` - activates one of the numerous light effects defined by govee
(the application automatically retrieves this list)
- `advancedColorMod` - This allows for you to create DIY light effects (this is
not implemented yet)
## Installing the library
```bash
npm install --save @constructorfleet/ultimate-govee
```
## Running the library
**NOTE** All options for this module are optional, but at least one control
channel must be enabled to interact with devices
First, import the `UltimateGoveeModule`:
```typescript
@Module({
import: [UltimateGoveeModule.forRootAsync({
persist: {
rootDirectory: 'path/to/persistent/storage', // Path to persistent storage, as of now, it writs a lot for debugging
},
auth: {
refreshMargin: 5000 // Number of milliseconds before token expires to reauthenticate with Govee
},
channels: {
ble: {
enabled: true, // Whether to enable the BLE control channel (if you do not have BLE adapter, this MUST be false)
deviceIds: [ // List of IDs for devices to command and control - these are not the BLE address!
"00:11:22:33:44:55:66:77:88"
]
},
iot: {
enabled: true, // Whether to enable the AWS IoT Core control channel
}
}
})]
...
})
export class AppModule {}
```
Then, inject the `UltimateGoveeService`:
```typescript
@Injectable()
export class AppService {
constructor(private readonly govee: UltimateGoveeService, ...) {}
}
```
Subscribe to device discovery events:
```typescript
this.govee.deviceDiscovered.subscribe((device: Device) => {
// Get the device value of all states
console.dir(device.currentState);
// Get a specific device state
device.state(FanSpeedStateName);
// Issue a command to the device state
device.state('mistLevel').setState(4);
device.state('scheduledStart').setState({
enabled: true,
startHour: 14,
startMinute: 30,
});
});
```
Connect using the user's credentials:
```typescript
this.govee.connect(username, password);
```
## Test
```bash
nest test
```
## Future Work
- [x] - Configure control channels on initialization and during runtime.
- ~~[ ] - Configurable controllers.~~
- [ ] - Specify devices to listen for.
- [ ] - Device overrides.
- [ ] - LAN control channel.
- [ ] - Govee OpenAPI control channel.
- [ ] - Tool for facilitating device support.
## Support
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
and support by the amazing backers. If you'd like to join them, please
[read more here](https://docs.nestjs.com/support).
## Stay in touch
- Author - [Teagan42](https://blog.teagantotally.rocks)
## License
Ultimate-Govee is GPLv3 Licensed. Nest is MIT licensed.
Special Thanks:
- https://github.com/theengs/decoder
- https://github.com/Bluetooth-Devices/govee-ble