hues 0.1.2

A Rust client for the Philips Hue API v2
Documentation
# hues


A Rust client for the Philips Hue API v2, with a focus on accuracy to the [official spec](https://developers.meethue.com/develop/hue-api-v2/).

[![Crates.io (version)](https://img.shields.io/crates/v/hues.svg?style=flat-square)](https://crates.io/crates/hues)

[![GitHub stars](https://img.shields.io/github/stars/rektdeckard/hues?style=flat-square&label=Star)](https://github.com/rektdeckard/hues)
[![GitHub forks](https://img.shields.io/github/forks/rektdeckard/hues?style=flat-square&label=Fork)](https://github.com/rektdeckard/hues/fork)
[![GitHub watchers](https://img.shields.io/github/watchers/rektdeckard/hues?style=flat-square&label=Watch)](https://github.com/rektdeckard/hues)
[![Follow on GitHub](https://img.shields.io/github/followers/rektdeckard?style=flat-square&label=Follow)](https://github.com/rektdeckard)

`hues` uses [reqwest](https://docs.rs/reqwest/0.11) and the [tokio](https://docs.rs/tokio/1) async runtime. It currently supports most basic operations, such as:

- Local network device discovery
  - Via **mDNS** using the [mdns]https://docs.rs/mdns/3 crate, requires the `mdns` feature
  - Via **HTTPS** using the Hue Discovery Endpoint
- App key creation
- Light, Group, and Scene control
- Schedule and Smart Scene management

It does not yet support the following features:

 - [Entertainment API]https://developers.meethue.com/develop/hue-entertainment/ for fast, synchronous light effects via UDP
- Advanced features regarding Entertainment Configurations


> [!WARNING]
> This is an experimental library, and is subject to change. Use at your own risk. 

## Installation


```bash
cargo add hues
```

## Usage



If you already know your Bridge IP address and have previously created an
App Key, constructing a client is quick and simple:

```rust
use hues::prelude::*;

#[tokio::main]

async fn main() -> Result<(), HueAPIError> {
    // Construct a Bridge when IP and App Key are known
    let bridge = Bridge::new([10u8, 0, 0, 123], "my-app-key");
    // Refresh it to fetch the current state of all resources
    bridge.refresh().await?;
    
    // Toggle the power state of a Room named "office", if it exists
    if let Some(office) = bridge.rooms().iter().find(|r| r.name() == "office") {
        office.toggle().await?;
    }
    Ok(())
}
```

### Bridge discovery and registration


When the Bridge IP address is not known, you can locate the device on the
local network using the [Bridge::discover](service::Bridge::discover)
associated function. If you are creating an app for the first time, the
[Bridge::create_app](service::Bridge::create_app) method initializes new
credentials that can be used for future authentication.

```rust
use hues::prelude::*
use std::time::Duration;

#[tokio::main]

async fn main() {
    // Discover a Hue Bridge on the local network, and initialize polling
    // to synchronize state every 30 seconds.
    let mut bridge = Bridge::discover()
        .await
        .unwrap()
        .build()
        .poll(Duration::from_secs(30))
        .await;
    // This is your App Key, it should be saved for future sessions
    // NOTE: press the `Link Button` on the Hues Bridge before attempting
    // to create new app credentials.
    let key = bridge.create_app("my_app", "my_instance").await.unwrap();

    // Blink each light to confirm you're registered!
    for light in bridge.lights() {
        let _ = light.identify().await;
    }
}
```

### Automatic sync with `sse`


Optionally, you can sync automatically by listening for Server-Sent Events. The bridge will communicate changes as they happen to the client, and you can take action if you choose to do so:

```rust
use hues::prelude::*;

#[tokio::main]

async main() -> Result<(), HueAPIError> {
    let bridge = Bridge::new([10u8, 0, 0, 123], "my_app_key").listen(|_rids| {
        // Do something whenever changes are sent from the Bridge
    });
}
```

## License


MIT © [Tobias Fried](https://github.com/rektdeckard)