diff --git a/source/_components/cover.mysensors.markdown b/source/_components/cover.mysensors.markdown new file mode 100644 index 000000000000..59861272eca0 --- /dev/null +++ b/source/_components/cover.mysensors.markdown @@ -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 +#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