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. Controllers
  3. OpenHAB
  4. openHab binding 2.4.0 Variable Problem ( 2.4.0.201806211605)

openHab binding 2.4.0 Variable Problem ( 2.4.0.201806211605)

Scheduled Pinned Locked Moved OpenHAB
2 Posts 1 Posters 1.8k 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.
  • I Offline
    I Offline
    itbeyond
    wrote on last edited by
    #1

    @TimO I posted something in the thread https://forum.mysensors.org/topic/9346/getting-mysensors-mqtt-gateway-working-on-openhab-2-2-stable/40 but just did another full round of testing to be sure so adding a new thread to get the conversation started. I have just set a test node that sits on my desk and have added the var1 item to an already well working test node - it is a switch and was not using any vars etc. So I editted the node code and added a loop request for var1 every 30 seconds.

    Here is the code for this node

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik Ekblad
     *
     * DESCRIPTION
     * Example sketch showing how to control physical relays.
     * This example will remember relay state after power failure.
     * http://www.mysensors.org/build/relay
     */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    #define MY_RF24_CHANNEL 82
    #define MY_RF24_IRQ_PIN 2
    #define MY_RX_MESSAGE_BUFFER_FEATURE
    
    #define MY_NODE_ID 27  // Set this to fix your Radio ID or use Auto
    
    // Enable repeater functionality for this node
    //#define MY_REPEATER_FEATURE
    #define MY_TRANSPORT_SANITY_CHECK
    
    #include <MySensors.h>
    
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define NUMBER_OF_RELAYS 1 // Total number of attached relays
    #define RELAY_ON 0  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 1 // GPIO value to write to turn off attached relay
    #define RELAY_UNKNOWN 2
    
    int CurrentState[] = {RELAY_UNKNOWN, RELAY_UNKNOWN, RELAY_UNKNOWN, RELAY_UNKNOWN};
    int SetState[] = {RELAY_OFF, RELAY_OFF, RELAY_OFF, RELAY_OFF};
    
    unsigned long requestVar1Last = millis();
    unsigned long requestVar1Time = 30000;
    
    MyMessage relayMsg(0, V_STATUS);
    
    void before() {
      wdt_enable(WDTO_2S);
    }
    
    void setup()
    {
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);
        SetState[sensor] = RELAY_OFF;
        request(sensor, V_STATUS);
        delay(50); 
        request(sensor, V_VAR1);
      }
    }
    void presentation()
    {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Power Socket (7)", "4.1");
    
      for (int sensor=1; sensor<=NUMBER_OF_RELAYS; sensor++) {
        // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
      }
    }
    
    void loop()
    {
      wdt_reset();
      
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
          if (CurrentState[sensor] != SetState[sensor] && SetState[sensor] != RELAY_UNKNOWN) {
            digitalWrite(pin, SetState[sensor]?RELAY_ON:RELAY_OFF);
            CurrentState[sensor] = SetState[sensor];   
            resend(relayMsg.setSensor(sensor).set(CurrentState[sensor]), 5);  
          }
        }
    
      if (requestVar1Last + requestVar1Time < millis()) {
         request(1, V_VAR1);
         requestVar1Last = millis();
      }
    }
    
    void resend(MyMessage &msg, int repeats)
    {
      int repeat = 1;
      int repeatdelay = 0;
      boolean sendOK = false;
    
      while ((sendOK == false) and (repeat < repeats)) {
        if (send(msg)) {
          sendOK = true;
        } else {
          sendOK = false;
          Serial.print("Send Failed: ");
          Serial.println(repeat);
          repeatdelay += 50;
        } repeat++; wait(repeatdelay);
      }
    }
    
    void receive(const MyMessage &message)
    {
      int sensor = message.sensor;
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_STATUS) {
        // Change relay state
        SetState[sensor] = message.getBool();
    
        // Write some debug info
        Serial.print(F("Incoming change for sensor:"));
        Serial.print(message.sensor);
        Serial.print(F(", New status: "));
        Serial.println(message.getBool());
      }
      if (message.type == V_VAR1) {
        int variable1 = atoi(message.data);// RUN_ALL_ZONES time
        Serial.print(F("Recieved variable1: "));
        Serial.println(variable1);     
      }
    }
    

    I added the item to openHab ad follows:

    Switch   Desktop_Debug_Light "Desktop Debug Light" <light> (gDevices,gRoom_Office) [ "iss:type:DevSwitch", "iss:room:Entry" ]  {channel="mysensors:light:gateway:Desktop_Debug_Light:status"}
    Number  Desktop_Debug_Var1 "Desktop Debug Light- Var1 [%d]" <selfruntime>  (gDevices,gRoom_Office)   {channel="mysensors:light:gateway:Desktop_Debug_Light:var1"}
    

    I used Paper UI and set the variable to 10 - this pushed the update to the node correctly. I then rebooted openHab which using persistance restores the variable 1 value back to 10 however when the node requests var1 from the controller after the reboot it receives 0. I have found this to be the same if I do an postUpdate. The var1 container on openHab has the 10 value in it I have confirmed this with a Rest API commnd the GET the item.

    Here is the logs from the openHab log:tail and also the node I have added comments where the reboot happened and you will see the results:

    2018-08-28 08:23:22.581 [.ItemChannelLinkAddedEvent] - Link 'Desktop_Debug_Var1-mysensors:light:gateway:Desktop_Debug_Light:var1' has been added.
    2018-08-28 08:24:08.812 [ome.event.ItemCommandEvent] - Item 'Desktop_Debug_Var1' received command 10
    2018-08-28 08:24:08.829 [vent.ItemStateChangedEvent] - Desktop_Debug_Var1 changed from NULL to 10
    REBOOTED THE OPENHAB SERVER
    2018-08-28 08:27:40.145 [temChannelLinkRemovedEvent] - Link 'Desktop_Debug_Var1 => mysensors:light:gateway:Desktop_Debug_Light:var1' has been removed.
    2018-08-28 08:28:57.469 [.ItemChannelLinkAddedEvent] - Link 'Desktop_Debug_Var1-mysensors:light:gateway:Desktop_Debug_Light:var1' has been added.
    2018-08-28 08:29:08.389 [vent.ItemStateChangedEvent] - Desktop_Debug_Var1 changed from NULL to 10.0
    
    2280 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    2286 MCO:BGN:INIT OK,TSP=1
    2290 TSF:MSG:SEND,27-27-0-0,s=1,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=OK:1
    2317 TSF:MSG:READ,0-0-27,s=1,c=1,t=2,pt=0,l=1,sg=0:1
    Incoming change for sensor:1, New status: 1
    2521 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=2,sg=0:10
    Recieved variable1: 10
    30002 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    30026 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=2,sg=0:10
    Recieved variable1: 10
    ***** REBOOT OF OPENHAB SERVER *******
    60010 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    90018 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    120026 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    150038 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    ***** OPENHAB UP AGAIN ********
    150090 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=1,sg=0:0
    Recieved variable1: 0
    180046 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    180071 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=1,sg=0:0
    Recieved variable1: 0
    210054 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
    210073 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=1,sg=0:0
    Recieved variable1: 0
    
    

    You can see the PaperUI update at 2018-08-28 08:24:08.829 which corresponds with the 30026 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=2,sg=0:10. I then rebooted and the server restored the value of 10 but the node continues to receive 0 and does so for ever - it never gets the value 10.

    Here is the output of the item using the REST API which is taken well after the reboot and after many request(1,V_VAR1)'s is still reporting 0.

    http://openhabianpi:8080/rest/items/Desktop_Debug_Var1
    {
      "link": "http://openhabianpi:8080/rest/items/Desktop_Debug_Var1",
      "state": "10.0",
      "stateDescription": {
        "pattern": "%d",
        "readOnly": false,
        "options": []
      },
      "editable": false,
      "type": "Number",
      "name": "Desktop_Debug_Var1",
      "label": "Desktop Debug Light- Var1",
      "category": "selfruntime",
      "tags": [],
      "groupNames": [
        "gDevices",
        "gRoom_Office"
      ]
    }
    
    http://openhabianpi:8080/rest/items/Desktop_Debug_Var1/state
    10.0
    

    As mentioned the variable received at the node never updates also if we use a postUpdate in openHab it will continue to receive 0 until we issue a sendCommand at which time it will update until the next postUpdate or server reboot.

    I 1 Reply Last reply
    0
    • I itbeyond

      @TimO I posted something in the thread https://forum.mysensors.org/topic/9346/getting-mysensors-mqtt-gateway-working-on-openhab-2-2-stable/40 but just did another full round of testing to be sure so adding a new thread to get the conversation started. I have just set a test node that sits on my desk and have added the var1 item to an already well working test node - it is a switch and was not using any vars etc. So I editted the node code and added a loop request for var1 every 30 seconds.

      Here is the code for this node

      /**
       * The MySensors Arduino library handles the wireless radio link and protocol
       * between your home built sensors/actuators and HA controller of choice.
       * The sensors forms a self healing radio network with optional repeaters. Each
       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
       * network topology allowing messages to be routed to nodes.
       *
       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
       * Copyright (C) 2013-2015 Sensnology AB
       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
       *
       * Documentation: http://www.mysensors.org
       * Support Forum: http://forum.mysensors.org
       *
       * This program is free software; you can redistribute it and/or
       * modify it under the terms of the GNU General Public License
       * version 2 as published by the Free Software Foundation.
       *
       *******************************
       *
       * REVISION HISTORY
       * Version 1.0 - Henrik Ekblad
       *
       * DESCRIPTION
       * Example sketch showing how to control physical relays.
       * This example will remember relay state after power failure.
       * http://www.mysensors.org/build/relay
       */
      
      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      #define MY_RF24_CHANNEL 82
      #define MY_RF24_IRQ_PIN 2
      #define MY_RX_MESSAGE_BUFFER_FEATURE
      
      #define MY_NODE_ID 27  // Set this to fix your Radio ID or use Auto
      
      // Enable repeater functionality for this node
      //#define MY_REPEATER_FEATURE
      #define MY_TRANSPORT_SANITY_CHECK
      
      #include <MySensors.h>
      
      #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
      #define NUMBER_OF_RELAYS 1 // Total number of attached relays
      #define RELAY_ON 0  // GPIO value to write to turn on attached relay
      #define RELAY_OFF 1 // GPIO value to write to turn off attached relay
      #define RELAY_UNKNOWN 2
      
      int CurrentState[] = {RELAY_UNKNOWN, RELAY_UNKNOWN, RELAY_UNKNOWN, RELAY_UNKNOWN};
      int SetState[] = {RELAY_OFF, RELAY_OFF, RELAY_OFF, RELAY_OFF};
      
      unsigned long requestVar1Last = millis();
      unsigned long requestVar1Time = 30000;
      
      MyMessage relayMsg(0, V_STATUS);
      
      void before() {
        wdt_enable(WDTO_2S);
      }
      
      void setup()
      {
        for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
          // Then set relay pins in output mode
          pinMode(pin, OUTPUT);
          SetState[sensor] = RELAY_OFF;
          request(sensor, V_STATUS);
          delay(50); 
          request(sensor, V_VAR1);
        }
      }
      void presentation()
      {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Power Socket (7)", "4.1");
      
        for (int sensor=1; sensor<=NUMBER_OF_RELAYS; sensor++) {
          // Register all sensors to gw (they will be created as child devices)
          present(sensor, S_BINARY);
        }
      }
      
      void loop()
      {
        wdt_reset();
        
        for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
            if (CurrentState[sensor] != SetState[sensor] && SetState[sensor] != RELAY_UNKNOWN) {
              digitalWrite(pin, SetState[sensor]?RELAY_ON:RELAY_OFF);
              CurrentState[sensor] = SetState[sensor];   
              resend(relayMsg.setSensor(sensor).set(CurrentState[sensor]), 5);  
            }
          }
      
        if (requestVar1Last + requestVar1Time < millis()) {
           request(1, V_VAR1);
           requestVar1Last = millis();
        }
      }
      
      void resend(MyMessage &msg, int repeats)
      {
        int repeat = 1;
        int repeatdelay = 0;
        boolean sendOK = false;
      
        while ((sendOK == false) and (repeat < repeats)) {
          if (send(msg)) {
            sendOK = true;
          } else {
            sendOK = false;
            Serial.print("Send Failed: ");
            Serial.println(repeat);
            repeatdelay += 50;
          } repeat++; wait(repeatdelay);
        }
      }
      
      void receive(const MyMessage &message)
      {
        int sensor = message.sensor;
        // We only expect one type of message from controller. But we better check anyway.
        if (message.type==V_STATUS) {
          // Change relay state
          SetState[sensor] = message.getBool();
      
          // Write some debug info
          Serial.print(F("Incoming change for sensor:"));
          Serial.print(message.sensor);
          Serial.print(F(", New status: "));
          Serial.println(message.getBool());
        }
        if (message.type == V_VAR1) {
          int variable1 = atoi(message.data);// RUN_ALL_ZONES time
          Serial.print(F("Recieved variable1: "));
          Serial.println(variable1);     
        }
      }
      

      I added the item to openHab ad follows:

      Switch   Desktop_Debug_Light "Desktop Debug Light" <light> (gDevices,gRoom_Office) [ "iss:type:DevSwitch", "iss:room:Entry" ]  {channel="mysensors:light:gateway:Desktop_Debug_Light:status"}
      Number  Desktop_Debug_Var1 "Desktop Debug Light- Var1 [%d]" <selfruntime>  (gDevices,gRoom_Office)   {channel="mysensors:light:gateway:Desktop_Debug_Light:var1"}
      

      I used Paper UI and set the variable to 10 - this pushed the update to the node correctly. I then rebooted openHab which using persistance restores the variable 1 value back to 10 however when the node requests var1 from the controller after the reboot it receives 0. I have found this to be the same if I do an postUpdate. The var1 container on openHab has the 10 value in it I have confirmed this with a Rest API commnd the GET the item.

      Here is the logs from the openHab log:tail and also the node I have added comments where the reboot happened and you will see the results:

      2018-08-28 08:23:22.581 [.ItemChannelLinkAddedEvent] - Link 'Desktop_Debug_Var1-mysensors:light:gateway:Desktop_Debug_Light:var1' has been added.
      2018-08-28 08:24:08.812 [ome.event.ItemCommandEvent] - Item 'Desktop_Debug_Var1' received command 10
      2018-08-28 08:24:08.829 [vent.ItemStateChangedEvent] - Desktop_Debug_Var1 changed from NULL to 10
      REBOOTED THE OPENHAB SERVER
      2018-08-28 08:27:40.145 [temChannelLinkRemovedEvent] - Link 'Desktop_Debug_Var1 => mysensors:light:gateway:Desktop_Debug_Light:var1' has been removed.
      2018-08-28 08:28:57.469 [.ItemChannelLinkAddedEvent] - Link 'Desktop_Debug_Var1-mysensors:light:gateway:Desktop_Debug_Light:var1' has been added.
      2018-08-28 08:29:08.389 [vent.ItemStateChangedEvent] - Desktop_Debug_Var1 changed from NULL to 10.0
      
      2280 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      2286 MCO:BGN:INIT OK,TSP=1
      2290 TSF:MSG:SEND,27-27-0-0,s=1,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=OK:1
      2317 TSF:MSG:READ,0-0-27,s=1,c=1,t=2,pt=0,l=1,sg=0:1
      Incoming change for sensor:1, New status: 1
      2521 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=2,sg=0:10
      Recieved variable1: 10
      30002 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      30026 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=2,sg=0:10
      Recieved variable1: 10
      ***** REBOOT OF OPENHAB SERVER *******
      60010 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      90018 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      120026 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      150038 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      ***** OPENHAB UP AGAIN ********
      150090 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=1,sg=0:0
      Recieved variable1: 0
      180046 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      180071 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=1,sg=0:0
      Recieved variable1: 0
      210054 TSF:MSG:SEND,27-27-0-0,s=1,c=2,t=24,pt=0,l=0,sg=0,ft=0,st=OK:
      210073 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=1,sg=0:0
      Recieved variable1: 0
      
      

      You can see the PaperUI update at 2018-08-28 08:24:08.829 which corresponds with the 30026 TSF:MSG:READ,0-0-27,s=1,c=1,t=24,pt=0,l=2,sg=0:10. I then rebooted and the server restored the value of 10 but the node continues to receive 0 and does so for ever - it never gets the value 10.

      Here is the output of the item using the REST API which is taken well after the reboot and after many request(1,V_VAR1)'s is still reporting 0.

      http://openhabianpi:8080/rest/items/Desktop_Debug_Var1
      {
        "link": "http://openhabianpi:8080/rest/items/Desktop_Debug_Var1",
        "state": "10.0",
        "stateDescription": {
          "pattern": "%d",
          "readOnly": false,
          "options": []
        },
        "editable": false,
        "type": "Number",
        "name": "Desktop_Debug_Var1",
        "label": "Desktop Debug Light- Var1",
        "category": "selfruntime",
        "tags": [],
        "groupNames": [
          "gDevices",
          "gRoom_Office"
        ]
      }
      
      http://openhabianpi:8080/rest/items/Desktop_Debug_Var1/state
      10.0
      

      As mentioned the variable received at the node never updates also if we use a postUpdate in openHab it will continue to receive 0 until we issue a sendCommand at which time it will update until the next postUpdate or server reboot.

      I Offline
      I Offline
      itbeyond
      wrote on last edited by
      #2

      @itbeyond said in openHab binding 2.4.0 Variable Problem ( 2.4.0.201806211605):

      Bug reported to Github issues at: https://github.com/tobof/openhab2-addons/issues/126

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


      27

      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