Pls Help: Sensor value shows in Domoticz Hardware TAB, but wont show on Switches



  • Please Help needed I have a Node with Sonar sensor and an digitalRead(A0) value from Node to Gateway. The value shows on Domoticz Hardware TAB, but wont show on Switches. I have stayed up all night looking for solutions without much luck. I sketch is as follows.

    // Example sketch showing how to control physical relays. 
    // This example will remember relay state even after power failure.
    
    // Enable debug prints
    #define MY_DEBUG ON
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    #define MY_RF24_PA_LEVEL RF24_PA_HIGH // Options MAX to reach the furthest 
    #define MY_NODE_ID 4  // Set this to fix your Radio ID or use AUTO or 1
    #define MY_REGISTRATION_FEATURE // Force registration
    #define MY_REGISTRATION_RETRIES 5
    
    #include <Wire.h>
    #include <TimeLib.h>
    #include <SPI.h>
    #include <MySensors.h>
    #include <NewPing.h>
    
    // For Debug
    #ifdef DEBUG_ON
    #define DEBUG_PRINT(x)   Serial.print(x)
    #define DEBUG_PRINTLN(x) Serial.println(x)
    #else
    #define DEBUG_PRINT(x)
    #define DEBUG_PRINTLN(x)
    #define SERIAL_START(x)
    #endif
    
    #define RELAY_PIN 2  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define NUMBER_OF_RELAYS 5 // Total number of attached relays
    #define RELAY_ON 1  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    #define SKETCH_NAME "Generator Node"
    #define SKETCH_VERSION "1.3.1"
    #define CHILD_ID 0
    
    MyMessage msgNEPA(0, V_STATUS);
    MyMessage msg(CHILD_ID, V_STATUS);
    MyMessage msgTank1(1, V_VOLUME);
    MyMessage msgTank2(8, V_VOLUME);
    
    boolean sensorState, lastSensorState;
    
    //constant for the sonar HC-SR04 sensor
    #define TRIGGER_PIN  8
    #define ECHO_PIN     7
    #define MAX_DISTANCE 300 //distance max measured
    
    //constant to calculate the volume of the tank
    #define high_water_level 30 //tank depth from the lowest point to the max water level
    #define distance_sensor 10 //was 30 = distance in cm between the max water level and the sensor
    #define tank_volume 1000 //tank volume (10000 default) when it is fitted to the max water level
    unsigned long SLEEP_TIME = 5000; // Sleep time between reads (in milliseconds)
    
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
    
    int lastDist;
    bool metric = true;
    
    void setup()
    {
      for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins to output mode
        pinMode(pin, OUTPUT);
        // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
        DEBUG_PRINT(F("Initialised Relay: "));
        DEBUG_PRINT(F(sensor));
        DEBUG_PRINT(F(" at pin "));
        DEBUG_PRINT(F(pin));
        DEBUG_PRINT(F(" ("));
        DEBUG_PRINT(F(loadState(sensor)));
        DEBUG_PRINTLN(F(")"));
      }
        pinMode(A0, INPUT); // Then set etra sensor pins to input mode
        pinMode(A1, INPUT);   // Float Sensor for Gen fuel Tank
        pinMode(A2, INPUT);   // Spare Sensor Readout
        DEBUG_PRINTLN(F("Initialize additional Sensor: "));
    }
    
    void presentation() { 
    sendSketchInfo(SKETCH_NAME, SKETCH_VERSION);
    
    //  Manually present the additional 3 sensors
        present(0, S_BINARY);
        pinMode(A0, INPUT); // Then set relay pins in output mode  
        boolean savedState = loadState(A0); // Set relay to last known state (using eeprom storage)
        digitalWrite(A0, savedState?RELAY_ON:RELAY_OFF);
        DEBUG_PRINT(F("Presented Relay at : "));
        DEBUG_PRINTLN(F(A0));
        send(msg.set(savedState? 0 : 1));
    
    // Fetch relay status   
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
        pinMode(pin, OUTPUT); // Then set relay pins in output mode  
        savedState = loadState(pin); // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, savedState?RELAY_ON:RELAY_OFF);
        DEBUG_PRINT(F("Presented Relay st : "));
        DEBUG_PRINTLN(F(pin));
        send(msg.set(savedState? 0 : 1));
      }
        
    //    DEBUG_PRINTLN(F("Sensor Presentation Complete"));
    
    //  Manually present the additional 2 sensors
        present(6, S_WATER);
        pinMode(A1, INPUT); // Then set relay pins in output mode  
        savedState = loadState(A1); // Set relay to last known state (using eeprom storage)
        digitalWrite(A1, savedState?RELAY_ON:RELAY_OFF);
        DEBUG_PRINT(F("Presented Relay at : "));
        DEBUG_PRINTLN(F(A1));
        send(msg.set(savedState? 0 : 1));
    }
    void loop() 
    {
    // Alway process incoming messages whenever possible
    // Sleep until interrupt comes in on motion sensor. Send update every two minute.
    //  sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);
    
      Serial.print("Fuel Level: ");
      Serial.print(tank_level("liters"));
      Serial.print("L");
      Serial.print("(");
      Serial.print(tank_level("percent"));
      Serial.println("%)");
      send(msgTank1.set(tank_level("liters")));
    
    if(digitalRead(A0) == LOW){
      DEBUG_PRINTLN(F("There is no Light"));
       Serial.println(sensorState? "Light On" : "Light Off");
       send(msgNEPA.set(sensorState?"0":"0"));  // Update gateway on change of state
      }
    else
      {
      DEBUG_PRINTLN(F("Up NEPA!"));
      Serial.println(sensorState? "Light Off" : "Light On");
      send(msgNEPA.set(sensorState?"1":"1"));  // Update gateway on change of state
      }
      wait(2000); // use for debuging
    }
    void receive(const MyMessage &message){
    // Change relay state if message is received
    if (digitalRead(A0) == HIGH){
    // Sensor says tank is full do something
    //  DEBUG_PRINTLN(F("Float Sensor High, 'Tank is Full'"));
    //  digitalWrite(3, LOW);  // Switch off tank pump
      saveState(message.sensor, message.getBool());
      bool send(MyMessage &msgNEPA, bool ack);
    
      }
      if (message.type == V_STATUS){
    //   digitalWrite(message.sensor, !digitalRead(message.sensor));
         if (message.getBool() == 0) {
         digitalWrite(message.sensor, LOW);
         // Store state in eeprom
         saveState(message.sensor, message.getBool());
          }
         else //getBool() == 1
         digitalWrite(message.sensor, HIGH);   
         // Store state in eeprom
         saveState(message.sensor, message.getBool());
         
    // digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
    
    // Write some debug info
       Serial.print("Incoming change for sensor ID: ");
       Serial.print(message.sensor);
       Serial.print(", New status: ");
       Serial.println(message.getBool());
        } 
      }
    
    int tank_level(String unit)   //function to measure and convert the tank volume
    {
    
      int level_liters = 0,level_percent = 0, echo_us = 0, echo_cm = 0, water_level_cm = 0;
    //  int level_liters,level_percent, echo_us, echo_cm, water_level_cm;
      echo_us = sonar.ping_median(); //return the median time of 5measures between the ping and the echo in microseconds
      echo_cm = echo_us / US_ROUNDTRIP_CM; //convert the echo time to distance in cm.
      water_level_cm = high_water_level - (echo_cm - distance_sensor);
      level_liters = water_level_cm * (tank_volume / high_water_level);
      level_percent = (water_level_cm * 100) / high_water_level;
      
      if (unit == "liters")
      {
        return level_liters;
      }
      else if (unit == "percent")
      {
        return level_percent;
      }
      else
      {
        return 0;
      }
    }
    

    0_1559969259570_Hardware Values.png
    0_1559969279829_Switches.png


  • Mod

    @eme look at the debug log from the node and the gateway.

    My guess is that they will show messages with st=fail, showing that the message didn't get through.

    If you haven't already, see https://forum.mysensors.org/topic/666/debug-faq-and-how-ask-for-help/ for a list of the most common problems and a troubleshooting flowchart.



  • @eme
    I am not sure if Domoticz can know, what you want.
    I am not MySensors expert, but there are some weird things in your code:

    #define CHILD_ID 0
    
    MyMessage msgNEPA(0, V_STATUS);
    MyMessage msg(CHILD_ID, V_STATUS);
    

    msg and msgNEPA are identical, but you use it in different ways ....

    MyMessage msgTank1(1, V_VOLUME);
    

    For CHILD ID 1 type of message V_VOLUME, but in loop:

    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
        pinMode(pin, OUTPUT); // Then set relay pins in output mode  
        savedState = loadState(pin); // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, savedState?RELAY_ON:RELAY_OFF);
        DEBUG_PRINT(F("Presented Relay st : "));
        DEBUG_PRINTLN(F(pin));
        send(msg.set(savedState? 0 : 1));
      }
    

    You present CHILID ID 1 like S_BINARY

    And then you set to this binary sensor volume value:

    send(msgTank1.set(tank_level("liters")));
    

    And in the same presentation loop you send value only to child id 0, because msg.set send to ID 0



  • Did you activate the child(ren) through the "Setup" > "Devices" list? If yes, the arrow on the child(ren) should be oriented to the left side. If not, activate them, giving a name. You'll then see them on the associated tabs. Note that device type depends on the type sent during presentation (so don't expect being able to declare device as a switch if you don't use the right child type)



  • In addition to the remark on declaring sensor to Domoticz, the sketch itself seems to me a bit confusing.

    Normally, you should do setup into setup function (stuff like pin mode, even eventually reading saved config and setting relay in correct state), presentation should contain only sendsketchinfo() & present(), loop should do the repetitive job.

    You should avoid blocking the loop, especially if you want to receive messages (as you did).

    You're using relay from pin 2 to 6 but sensor 1 to 5, but when receiving an order to set sensor x, you set pin x (instead of x+1). Result may not exactly be what you want/imagine.

    You're turning pump off only when receiving a message (as the test is done here), instead in the loop.

    You're using digitalWrite() on some analog pin (A1) 😉

    You're sending udpdates every 2 seconds, while sending either changes or data at larger interval may fit better.

    In addition, you may also want to simplify:
    send(msgNEPA.set(sensorState?"0":"0")) by send(msgNEPA.set(0)) (in addition, this will send numeric value instead of string, don't think that sending a string is what you want)

    and

    send(msgNEPA.set(sensorState?"1":"1")) by send(msgNEPA.set(1))

    May I suggest you explain what you have, and what you want to do, for us to guide you setting the sensors properly?


 

273
Online

8.8k
Users

9.6k
Topics

100.3k
Posts