Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Hardware
  3. MySensor Node for latching Relays

MySensor Node for latching Relays

Scheduled Pinned Locked Moved Hardware
2 Posts 2 Posters 943 Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    rspecht
    wrote on last edited by
    #1

    Hello Guys,

    i try to do some Controldevices for Homeautomation. My purpose is an self-sufficient system which is controlable from a mysensor.
    So i use some Relays from Eltako - the ES12Z-200-UC Type.
    Here is the Datasheet: http://www.eltako.com/fileadmin/downloads/en/_datasheets/Datasheet_ES12Z-200-UC.pdf

    The big benefit is the standalone working and the simple controlability. So now i have done a MySensor Box and atached it on the control on and off connection and also a senseloop over the second switch contact to detect the State.
    I adapt the Relay Sketch and include the Sensor in my FHEM Network. Now my Problem: When i detect a one, i send it to FHEM and FHEM reply it to me and so i switch again.. how can i interlock this?

    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    #define PIN_LEDRD  8
    #define PIN_LEDGN  7
    #define PIN_SWON   5
    #define PIN_SWOFF  6
    #define PIN_STATE  4
    #define CHILD_ID 1   // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    
    Bounce debouncer = Bounce();
    int oldValue = 0;
    bool state;
    MySensor gw;
    MyMessage msg(CHILD_ID, V_LIGHT);
    
    void setup()
    {
      gw.begin(incomingMessage, AUTO, true);
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay & Button", "1.0");
    
      // Setup the button
      pinMode(PIN_STATE, INPUT);
      // Activate internal pull-up
      digitalWrite(PIN_STATE, HIGH);
    
      // After setting up the button, setup debouncer
      debouncer.attach(PIN_STATE);
      debouncer.interval(5);
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_LIGHT);
    
      // Make sure relays are off when starting up
      digitalWrite(PIN_SWON, 0);
      digitalWrite(PIN_SWOFF, 0);
      digitalWrite(PIN_LEDGN, 1);
      digitalWrite(PIN_LEDRD, 1);
      // Then set relay pins in output mode
      pinMode(PIN_SWOFF, OUTPUT);
      pinMode(PIN_SWON, OUTPUT);
      pinMode(PIN_LEDGN, OUTPUT);
      pinMode(PIN_LEDRD, OUTPUT);
    
      // Set relay to last known state (using eeprom storage)
      state = gw.loadState(CHILD_ID);
      //digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    }
    
    
    /*
       Example on how to asynchronously check for new messages from gw
    */
    void loop()
    {
      gw.process();
      debouncer.update();
      // Get the update value
      int value = debouncer.read();
    
    
      if (value != oldValue ) {
        Serial.print("Incoming change for value:");
        Serial.println(value);
    
        if (value == 1) {
          digitalWrite(PIN_LEDRD, 0);
          digitalWrite(PIN_LEDGN, 1);
        } else {
          digitalWrite(PIN_LEDRD, 1);
          digitalWrite(PIN_LEDGN, 0);
    
        }
    
       // gw.send(msg.set(value), true); // Send new state and request ack back
      }
      oldValue = value;
    }
    
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.isAck()) {
        Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_LIGHT) {
        // Change relay state
        state = message.getBool();
        if (state == 1) {
          digitalWrite(PIN_SWON, 1);
          //digitalWrite(PIN_LEDRD, 1);
          delay(100);
          digitalWrite(PIN_SWON, 0);
          // digitalWrite(PIN_LEDGN, 0);
        } else {
          digitalWrite(PIN_SWOFF, 1);
          delay(100);
          digitalWrite(PIN_SWOFF, 0);
          // digitalWrite(PIN_LEDRD, 0);
          // digitalWrite(PIN_LEDGN, 1);
    
        }
    
        // Store state in eeprom
        gw.saveState(CHILD_ID, state);
    
        // Write some debug info
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
      }
    }
    

    Can you help me a little bit? :)

    1 Reply Last reply
    0
    • hekH Offline
      hekH Offline
      hek
      Admin
      wrote on last edited by
      #2

      You could perhaps save the time when the GPIO input changes... and wait to do the DigitalWrite until some timeout (a second?).

      If you receive the ack from gateway, just reset the timeout and do exactly like you do today.

      1 Reply Last reply
      0
      Reply
      • Reply as topic
      Log in to reply
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes


      19

      Online

      11.7k

      Users

      11.2k

      Topics

      113.1k

      Posts


      Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • MySensors
      • OpenHardware.io
      • Categories
      • Recent
      • Tags
      • Popular