echonet 1.3.2

ECHONET Lite framework for Rust
Documentation
![logo](img/logo.png)

# Overview of uEcho Controller

The controller is a special node of [ECHONETLite][enet] to control other nodes, it can find the nodes in the local area network and send any messages into the found devices.

## Using Controller

### 1. Starting Controller

To start a controller, create a controller instanse of `echonet::Controller` and start the controller using `Controller::start()` as the following:

```
use echonet::Controller;

let mut ctrl = Controller::new();
ctrl.start();
```

### 2. Searching Nodes

Next, use `Controller::search()` to search other nodes in the local area network as the following:

```
let mut ctrl = Controller::new()
....
ctrl.search()
```

### 3. Getting Nodes and Objects

After the searching, the controller has the found nodes in the `Controller::nodes` property. The [ECHONETLite](http://www.echonet.gr.jp/english/index.htm) node might have multiple objects such as the device or profile objects, and the found node has the objects in the `Object.objects` property. The following example shows all objects in the found nodes.

```
let mut ctrl = Controller::new()
....
for (i, node) in ctrl.nodes().iter().enumerate() {
    println!("[{}] {}", i, node.addr());
    for (j, obj) in node.objects().iter().enumerate() {
        println!("[{}] {:06X}", j, obj.code());
        for obj_prop in obj.properties() {
            ....
        }
    }
}
```

### 4. Creating Request Message

To control the found objects, create the request message using `echonet::Message` as the following.

```
use echonet::protocol::{ESV, Message, Property};
....
let mut msg = Message::new();
msg.set_esv(ESV::ReadRequest);
msg.set_deoj(obj.code());
let mut prop = Property::new();
prop.set_code(obj_prop.code());
msg.add_property(prop);
```

### 5. Sending Messages

To send the created request message, use `Controller::send_message()` as the following:

```
let mut ctrl = Controller::new();
....
let node = ctrl.nodes[0];
....
let mut msg = Message::new();
....
ctrl.send_message(&node, &mut msg);
```

Basically, all messages of [ECHONETLite](http://www.echonet.gr.jp/english/index.htm) is async. To handle the async response message, use `Controller::post_message()` instead of `Controller::send_message()` as the following:

```
let rx = ctrl.post_message(&node, &mut msg);
match rx.recv_timeout(Duration::from_secs(1)) {
    Ok(res_msg) => {
        ....
    }
    Err(_e) => {
        ....
    }
};
```

## Next Steps

Let's check the following documentation to know the controller functions of uEcho in more detail.

- [Usage examples]https://github.com/cybergarage/uecho-rs/tree/master/examples

[enet]:http://echonet.jp/english/