Navigation

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

    Jan Gatzke

    @Jan Gatzke

    31
    Reputation
    185
    Posts
    1770
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    Jan Gatzke Follow

    Best posts made by Jan Gatzke

    • RE: Serial Gateway connection to Openhab

      Why are you using a usb to serial adapter to connect the arduino to the raspberry? The raspberry has an onboard uart at /dev/ttyAMA0. I am using the internal uart and cannot reproduce this kind of error.

      posted in OpenHAB
      Jan Gatzke
      Jan Gatzke
    • RE: Your workshop :)

      0_1493658096486_IMAG0331-klein.jpg

      I am especially proud of my 20 years old analog soldering station. πŸ˜„

      posted in General Discussion
      Jan Gatzke
      Jan Gatzke
    • MySensors controlled heating

      I have made a node which measures the temperature using a DS18b20 and controls an electric heating valve (http://www.ebay.de/itm/350991304709?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT) using a MOC3023 optocoupler with triac output (little white chip, works like a solid state relay. Only for small currents, but very cheap). The power supply is the pcb of a usb power supply.

      Pictures:

      IMG-20150306-WA0019.jpg
      circuit.jpg
      IMG-20150317-WA0009.jpg
      IMAG0757.jpg
      IMAG0758.jpg

      The code is a simple combination of the ds18b20 and the relay actuator examples.

      Using openHAB I can set a target temperature. When the temperature is below the target temperature the valve is opened. Else the valve is closed. Since I am using a NC (normally closed) valve, the valve opens when connected to power.

      openhab.PNG

      posted in My Project
      Jan Gatzke
      Jan Gatzke
    • RE: [Tutorial] openHAB with serial gateway

      Nice tutorial. I discarded my own incoming rules and am now using this solution. I have extended the rule by a few additional sub types:

      if (subType == V_LIGHT_LEVEL){
                          postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg)
                          println ("Light item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " light: " + msg )
                          }
      if (subType == V_VOLTAGE){
                          postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), msg)
                          println ("Voltage item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " voltage: " + msg )
                          }
      if (subType == V_LOCK_STATUS){
                          var String lockstatus="OPEN"
                          if (msg=="1"){
                              lockstatus="CLOSED"
                          }
                          postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), lockstatus)
                          println ("Door/Window item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Status: " + lockstatus )
                          }
      if (subType == V_TRIPPED){
                          var String tripped="OFF"
                          if (msg=="1"){
                              tripped="ON"
                          }
                          postUpdate(sensorToItemsMap.get( nodeId + ";" + childId + ";"), tripped)
                          println ("Button/Contact item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Status: " + tripped )
                          }
      if (subType == V_LIGHT){
                          var String light="OFF"
                          if (msg=="1"){
                              light="ON"
                          }
                          postUpdat(sensorToItemsMap.get( nodeId + ";" + childId + ";"), light)
                          println ("Light item: " + sensorToItemsMap.get( nodeId + ";" + childId + ";") + " Light: " + light )
                          }
      
      
      
      posted in OpenHAB
      Jan Gatzke
      Jan Gatzke
    • RE: Newbie - Do not succeed to start

      I think the generic board does not work because the default settings are not sufficient for ms. Be sure the settings match your actual esp8266 module.
      Did you pull down gpio0 when you powered on the module? This activates the programming mode.
      If you want to go the easy way just get a node mcu compatible board like wemos d1 mini. It has an onboard USB port and you don't have to manually put it in programming mode.
      Mqtt adds complexity. If you don't need it you should choose plain ms.

      posted in Hardware
      Jan Gatzke
      Jan Gatzke
    • RE: Sketch works on Uno, but not pro mini

      This could be a power problem. The UNO has a much better voltage regulator circuit. Did you connect a capacitor to the nrf24?

      posted in Development
      Jan Gatzke
      Jan Gatzke
    • RE: Minding the robot

      And how do you know where your wife is and whether she got stuck? πŸ˜„

      posted in My Project
      Jan Gatzke
      Jan Gatzke
    • RE: Serial Gateway connection to Openhab

      @jemish This is to basic to earn an answer. I suggest you start reading at http://www.mysensors.org .

      posted in OpenHAB
      Jan Gatzke
      Jan Gatzke
    • RE: Radio FAIL after ~3 weeks [SOLVED]

      @Reza
      Which NRF Modules do you use? 50 meter with a wall in between wont function properly with the cheap ones. You need something like this for the Job:

      http://www.ebay.de/itm/2-4G-22dBm-100mW-nRF24L01P-PA-LNA-Wireless-Transmission-Module-Shield-Case-/191955447324?hash=item2cb16fae1c:g:3XQAAOSwgZ1XwQvw

      posted in Troubleshooting
      Jan Gatzke
      Jan Gatzke
    • RE: Install kicad mysensor components

      @mfalkvidd

      Thx, this definitly saves some Google time. πŸ˜‰

      posted in KiCad
      Jan Gatzke
      Jan Gatzke

    Latest posts made by Jan Gatzke

    • RE: New version of the MySensors adapter

      @raig would you sage share your sketch?

      posted in IOBroker
      Jan Gatzke
      Jan Gatzke
    • RE: New version of the MySensors adapter

      @Raig I must confest I have no clue what these custom values are good for and should look like. What kind of values do you expect? Strings? Numbers?

      Out of the API description for V_Custom: "Custom messages used for controller/inter node specific commands"

      So it seems totally unspecified what commands or data is inside a V_Custom message.

      posted in IOBroker
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway

      @gohan won't this option miss some features? πŸ˜„

      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway

      @gohan I know some controller are aware of ESP Easy via MQTT. If you controller does not support this directly, you have to integrate it manually (with node red). In my opinion scenarios, where MySensors with ESP Easy frontend would be of use, do still exist.

      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway

      @dbemowsk You cannot because MQTT is just a transport and not a strict data format. You can however use MySenSors MQTT + ESP Easy MQTT + a broker + node red + a controller. Node Red can do data conversions and integrate everything.

      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ Sonoff relay using MySensors ESP8266 wifi or mqtt gateway

      It's a shame that we cannot have both, mysensors and the ESP Easy stuff. There has been a project for this: https://github.com/letscontrolit/ESPEasyMySensors πŸ˜₯

      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke
    • New version of the MySensors adapter

      I have just commited some changes to the iobroker MySensors Adapter on github. All set command are send with ack flag now and the states in iobroker get an ack on successful transmission, too. The new version is not being published via the iobroker admin, yet. You have to download it from github and copy it to your iobroker directory. Please test and report any problems you are facing.

      posted in IOBroker
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ OH MySensors RGBW Controller

      @Sergio-Rius

      The problem with the linear fading was that a value of 100 almost looked the same as 150. So the goal was to make the fading look more linear. The logarythmic calculations needed for this cannot be done on an atmega 328p. (I tried it)
      This is why I calculated the values with MS Excel and put them in an array.

      Making the fading process alway take the same time would be nice. Feel free to post your implementation. πŸ˜‰

      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ OH MySensors RGBW Controller

      @LastSamurai

      I am using Domoticz. This was the only way reading initial values from the controller. Directly requesting the value of a child did not work for me. Meanwhile MySensors support in Domoticz seems extremly bugy and uncomplete to me. I am going to give OpenHAB2 a try.

      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke
    • RE: πŸ’¬ OH MySensors RGBW Controller

      @LastSamurai

      Yes, I did! This sketch is working for me:

      /**
        Based on the MySensors Project: http://www.mysensors.org
      
        This sketch controls a (analog)RGBW strip by listening to new color values from a (domoticz) controller and then fading to the new color.
      
        Version 1.1 - Added save/restore of values to/from controller, removed non linear fading code
        Version 1.0 - Changed pins and gw definition
        Version 0.9 - Oliver Hilsky
      
      **/
      #define MY_DEBUG
      
      #define SN   "RGBW 01"
      #define SV   "1.1"
      #define MY_RADIO_NRF24
      #define MY_PARENT_NODE_ID 10
      // change the pins to free up the pwm pin for led control
      #define MY_RF24_CE_PIN 4 //<-- NOTE!!! changed, the default is 9
      #define MY_RF24_CS_PIN 10 // default is 10
      // Set LOW transmit power level as default, if you have an amplified NRF-module and
      // power your radio separately with a good regulator you can turn up PA level.
      #define MY_RF24_PA_LEVEL RF24_PA_LOW
      //Uncomment to enable repeater mode
      //#define MY_REPEATER_FEATURE
      //Uncomment to assign static node ID
      //#define MY_NODE_ID 9
      
      
      // Load mysensors library
      #include <MySensors.h>
      // Load Serial Peripheral Interface library
      #include <SPI.h>
      
      // Arduino pin attached to driver pins
      #define RED_PIN 3
      #define WHITE_PIN 9
      #define GREEN_PIN 5
      #define BLUE_PIN 6
      #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3...
      #define CHILD_ID 1
      
      // Smooth stepping between the values
      #define STEP 1
      #define INTERVAL 10
      
      MyMessage lastvalueMsg(CHILD_ID, V_VAR1);
      MyMessage lastisonMsg(CHILD_ID, V_VAR2);
      MyMessage lastdimmMsg(CHILD_ID, V_VAR3);
      
      // Stores the current color settings
      byte channels[4] = {RED_PIN, GREEN_PIN, BLUE_PIN, WHITE_PIN};
      byte values[4] = {0, 0, 0, 0};
      byte target_values[4] = {0, 0, 0, 0};
      //Stores corrected values for each step from 0 to 255. See https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
      byte converted_values[256] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,15,15,15,16,16,17,17,17,18,18,19,19,20,20,20,21,21,22,22,23,23,24,24,25,26,26,27,27,28,29,29,30,31,31,32,33,34,34,35,36,37,38,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,54,55,56,57,58,60,61,62,64,65,67,68,70,71,73,75,76,78,80,81,83,85,87,89,91,93,95,97,99,101,104,106,108,111,113,116,118,121,123,126,129,132,135,138,141,144,147,150,154,157,161,164,168,171,175,179,183,187,191,195,200,204,209,213,218,223,228,233,238,243,249,255};
      
      
      // stores dimming level
      byte dimming = 100;
      byte target_dimming = 100;
      
      // tracks if the strip should be on of off
      boolean isOn = false;
      // tracks if the strip's last status was off. This overrides isOn at startup
      boolean wasOff = true;
      //tracks if the old values have bben requested from the controller. This prevents the request from being send multipßle times in the main loop.
      boolean valuesrequested = false;
      // time tracking for updates
      unsigned long lastupdate = millis();
      
      void setup()
      {
        // Set all channels to output (pin number, type)
        for (int i = 0; i < NUM_CHANNELS; i++) {
          pinMode(channels[i], OUTPUT);
        }
        // debug
        if (isOn) {
          Serial.println("RGBW is running...");
        }
      }
      
      void presentation()  {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo(SN, SV);
      
        // Register this device as Waterflow sensor
        present(CHILD_ID, S_RGBW_LIGHT, SN, true);
      }
      
      void loop()
      {
        if (!valuesrequested) {
          // get old values if this is just a restart
          Serial.println("Requesting old values...");
          //Request RGBW values
          request( CHILD_ID, V_VAR1 );
          wait(200);
          //Request Status
          request( CHILD_ID, V_VAR2 );
          wait(200);
          //Request dimm level
          request( CHILD_ID, V_VAR3 );
          valuesrequested = true;
        }
      
        // set the new light colors
        if (millis() > lastupdate + INTERVAL) {
          updateLights();
          lastupdate = millis();
        }
      }
      
      // callback function for incoming messages
      void receive(const MyMessage &message) {
      
        Serial.print("Got a message - ");
        Serial.print("Messagetype is: ");
        Serial.println(message.type);
      
        // acknoledgment
        if (message.isAck())
        {
          Serial.println("Got ack from gateway");
        }
      
        // new dim level
        else if (message.type == V_DIMMER or message.type == V_VAR3) {
          Serial.println("Dimming to ");
          Serial.println(message.getString());
          target_dimming = message.getByte();
          send(lastdimmMsg.set(target_dimming));
      
          if (!wasOff) {
            // a new dimmer value also means on, no seperate signal gets send (by domoticz)
            isOn = true;
            send(lastisonMsg.set(isOn));
          }
        }
      
        // on / off message
        else if (message.type == V_STATUS or message.type == V_VAR2) {
          Serial.print("Turning light ");
      
          isOn = message.getInt();
      
          if (isOn) {
            Serial.println("on");
            wasOff = false;
          } else {
            Serial.println("off");
          }
          send(lastisonMsg.set(isOn));
        }
      
        // new color value
        else if (message.type == V_RGBW or message.type == V_VAR1) {
          const char * rgbvalues = message.getString();
          send(lastvalueMsg.set(rgbvalues));
          inputToRGBW(rgbvalues);
          if (!wasOff) {
            // a new color also means on, no seperate signal gets send (by domoticz); needed e.g. for groups
            isOn = true;
            send(lastisonMsg.set(isOn));
          }
        }
      }
      
      // this gets called every INTERVAL milliseconds and updates the current pwm levels for all colors
      void updateLights() {
        int convertedvalue=0;
        // update pin values -debug
        //Serial.println(greenval);
        //Serial.println(redval);
        //Serial.println(blueval);
        //Serial.println(whiteval);
      
        //Serial.println(target_greenval);
        //Serial.println(target_redval);
        //Serial.println(target_blueval);
        //Serial.println(target_whiteval);
        //Serial.println("+++++++++++++++");
      
        // for each color
        for (int v = 0; v < NUM_CHANNELS; v++) {
          if (values[v] < target_values[v]) {
            values[v] += STEP;
            if (values[v] > target_values[v]) {
              values[v] = target_values[v];
            }
          }
      
          if (values[v] > target_values[v]) {
            values[v] -= STEP;
            if (values[v] < target_values[v]) {
              values[v] = target_values[v];
            }
          }
        }
      
      
        // dimming
        if (dimming < target_dimming) {
          dimming += STEP;
          if (dimming > target_dimming) {
            dimming = target_dimming;
          }
        }
        if (dimming > target_dimming) {
          dimming -= STEP;
          if (dimming < target_dimming) {
            dimming = target_dimming;
          }
        }
      
        /*
          // debug - new values
          Serial.println(greenval);
          Serial.println(redval);
          Serial.println(blueval);
          Serial.println(whiteval);
      
          Serial.println(target_greenval);
          Serial.println(target_redval);
          Serial.println(target_blueval);
          Serial.println(target_whiteval);
          Serial.println("+++++++++++++++");
        */
      
        // set actual pin values
        for (int i = 0; i < NUM_CHANNELS; i++) {
          if (isOn) {
            // normal fading
            //analogWrite(channels[i], dimming / 100.0 * values[i]);
            //Fading with corrected values see https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
            analogWrite(channels[i], dimming / 100.0 * converted_values[values[i]]);
            
          } else {
            analogWrite(channels[i], 0);
          }
        }
      }
      
      // converts incoming color string to actual (int) values
      // ATTENTION this currently does nearly no checks, so the format needs to be exactly like domoticz sends the strings
      void inputToRGBW(const char * input) {
        Serial.print("Got color value of length: ");
        Serial.println(strlen(input));
      
        if (strlen(input) == 6) {
          Serial.println("new rgb value");
          target_values[0] = fromhex (& input [0]);
          target_values[1] = fromhex (& input [2]);
          target_values[2] = fromhex (& input [4]);
          target_values[3] = 0;
        } else if (strlen(input) == 9) {
          Serial.println("new rgbw value");
          target_values[0] = fromhex (& input [1]); // ignore # as first sign
          target_values[1] = fromhex (& input [3]);
          target_values[2] = fromhex (& input [5]);
          target_values[3] = fromhex (& input [7]);
        } else {
          Serial.println("Wrong length of input");
        }
      
      
        Serial.print("New color values: ");
        Serial.println(input);
      
        for (int i = 0; i < NUM_CHANNELS; i++) {
          Serial.print(target_values[i]);
          Serial.print(", ");
        }
      
        Serial.println("");
        Serial.print("Dimming: ");
        Serial.println(dimming);
      
      }
      
      // converts hex char to byte
      byte fromhex (const char * str)
      {
        char c = str [0] - '0';
        if (c > 9)
          c -= 7;
        int result = c;
        c = str [1] - '0';
        if (c > 9)
          c -= 7;
        return (result << 4) | c;
      }
      
      
      posted in OpenHardware.io
      Jan Gatzke
      Jan Gatzke