Skip to content

Create component page for mysensors based cover #986

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Oct 1, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 155 additions & 0 deletions source/_components/cover.mysensors.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
---
layout: page
title: "MySensors Cover"
description: "Instructions how to integrate MySensors covers into Home Assistant."
date: 2016-09-25 11:30 +0100
sidebar: true
comments: false
sharing: true
footer: true
logo: mysensors.png
ha_category: Cover
ha_release: 0.30
---

Integrates MySensors covers into Home Assistant. See the [main component] for configuration instructions.

The following actuator types are supported:

##### MySensors version 1.4
S_TYPE | V_TYPE
------------|-------------
S_COVER | V_UP, V_DOWN, V_STOP, [V_DIMMER or V_LIGHT]

##### MySensors version 1.5 and higher
S_TYPE | V_TYPE
------------|-------------
S_COVER | V_UP, V_DOWN, V_STOP, [V_PERCENTAGE or V_STATUS]

All V_TYPES above are required. Use V_PERCENTAGE (or V_DIMMER) if you know the exact position of the cover in percent, use V_STATUS (or V_LIGHT) if you don't.

For more information, visit the [serial api] of MySensors.

### {% linkable_title Example sketch %}

```cpp
/*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*/

// Enable debug prints to serial monitor
#define MY_DEBUG
#define MY_RADIO_NRF24

#include <MySensors.h>
#define SN "Cover"
#define SV "1.1"

// Actuators for moving the cover up and down respectively.
#define COVER_UP_ACTUATOR_PIN 2
#define COVER_DOWN_ACTUATOR_PIN 3
// Sensors for finding out when the cover has reached its up/down position.
// These could be simple buttons or linear hall sensors.
#define COVER_UP_SENSOR_PIN 4
#define COVER_DOWN_SENSOR_PIN 5

#define CHILD_ID 0

// Internal representation of the cover state.
enum State {
IDLE,
UP, // Window covering. Up.
DOWN, // Window covering. Down.
};

static int state = IDLE;
static int status = 0; // 0=cover is down, 1=cover is up
static bool initial_state_sent = false;
MyMessage upMessage(CHILD_ID, V_UP);
MyMessage downMessage(CHILD_ID, V_DOWN);
MyMessage stopMessage(CHILD_ID, V_STOP);
MyMessage statusMessage(CHILD_ID, V_STATUS);

void sendState() {
// Send current state and status to gateway.
send(upMessage.set(state == UP));
send(downMessage.set(state == DOWN));
send(stopMessage.set(state == IDLE));
send(statusMessage.set(status));
}

void setup() {
pinMode(COVER_UP_SENSOR_PIN, INPUT);
pinMode(COVER_DOWN_SENSOR_PIN, INPUT);
}

void presentation() {
sendSketchInfo(SN, SV);

present(CHILD_ID, S_COVER);
}

void loop() {
if (!initial_state_sent) {
sendState();
initial_state_sent = true;
}

if (state == IDLE) {
digitalWrite(COVER_UP_ACTUATOR_PIN, LOW);
digitalWrite(COVER_DOWN_ACTUATOR_PIN, LOW);
}

if (state == UP && digitalRead(COVER_UP_SENSOR_PIN) == HIGH) {
Serial.println("Cover is up.");
// Update status and state; send it to the gateway.
status = 1;
state = IDLE;
sendState();
// Actuators will be disabled in next loop() iteration.
}

if (state == DOWN && digitalRead(COVER_DOWN_SENSOR_PIN) == HIGH) {
Serial.println("Cover is down.");
// Update status and state; send it to the gateway.
status = 0;
state = IDLE;
sendState();
// Actuators will be disabled in next loop() iteration.
}
}

void receive(const MyMessage &message) {
if (message.type == V_UP) {
// Set state to covering up and send it back to the gateway.
state = UP;
sendState();
Serial.println("Moving cover up.");

// Activate actuator until the sensor returns HIGH in loop().
digitalWrite(COVER_UP_ACTUATOR_PIN, HIGH);
}

if (message.type == V_DOWN) {
// Set state to covering up and send it back to the gateway.
state = DOWN;
sendState();
Serial.println("Moving cover down.");
// Activate actuator until the sensor returns HIGH in loop().
digitalWrite(COVER_DOWN_ACTUATOR_PIN, HIGH);
}

if (message.type == V_STOP) {
// Set state to idle and send it back to the gateway.
state = IDLE;
sendState();
Serial.println("Stopping cover.");

// Actuators will be switched off in loop().
}
}
```

[main component]: /components/mysensors/
[serial api]: https://www.mysensors.org/download/serial_api_20