Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. rspecht
    3. Posts
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    Posts made by rspecht

    • MySensor Node for latching Relays

      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? 🙂

      posted in Hardware
      rspecht
      rspecht