--- layout: page title: "MySensors Cover" description: "Instructions on how to integrate MySensors covers into Home Assistant." date: 2016-10-01 15:00 +0200 sidebar: true comments: false sharing: true footer: true logo: mysensors.png ha_category: DIY ha_release: "0.30" ha_iot_class: "Local Push" --- 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