Gateway just another sensor node?



  • Hello

    in the release notes for API 2.0 i was reading: "Gateway just another sensor node!". But i wasn't able to find the solution.

    I've already read this (and sublinks):

    [https://forum.mysensors.org/topic/4066/ethernet-gateway-working-as-sensor-node-it-s-possible](link url)

    What i'm trying to test is a combination of arduino nano+W5100+MQ9 gas sensor. For test purposes i would only like to transmit the voltage value to controller (FHEM). Therefor i've merged some of examples and adjusted them the way i thought it would work. The sketch is based on the GatewayW5100 example. RF communication is disabled.Library v.2.1.1 (new installation)

    /**
     * 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
     * Contribution by a-lurker and Anticimex,
     * Contribution by Norbert Truchsess <norbert.truchsess@t-online.de>
     * Contribution by Tomas Hozza <thozza@gmail.com>
     *
     *
     * DESCRIPTION
     * The EthernetGateway sends data received from sensors to the ethernet link.
     * The gateway also accepts input on ethernet interface, which is then sent out to the radio network.
     *
     * The GW code is designed for Arduino 328p / 16MHz.  ATmega168 does not have enough memory to run this program.
     *
     * LED purposes:
     * - To use the feature, uncomment MY_DEFAULT_xxx_LED_PIN in the sketch below
     * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
     * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
     * - ERR (red) - fast blink on error during transmission error or recieve crc error
     *
     * See http://www.mysensors.org/build/ethernet_gateway for wiring instructions.
     *
     */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG
    
    // Enable and select radio type attached
    //#define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    // Enable gateway ethernet module type
    #define MY_GATEWAY_W5100
    
    // W5100 Ethernet module SPI enable (optional if using a shield/module that manages SPI_EN signal)
    //#define MY_W5100_SPI_EN 4
    
    // Enable Soft SPI for NRF radio (note different radio wiring is required)
    // The W5100 ethernet module seems to have a hard time co-operate with
    // radio on the same spi bus.
    #if !defined(MY_W5100_SPI_EN) && !defined(ARDUINO_ARCH_SAMD)
    #define MY_SOFTSPI
    #define MY_SOFT_SPI_SCK_PIN 14
    #define MY_SOFT_SPI_MISO_PIN 16
    #define MY_SOFT_SPI_MOSI_PIN 15
    #endif
    
    // When W5100 is connected we have to move CE/CSN pins for NRF radio
    //#ifndef MY_RF24_CE_PIN
    //#define MY_RF24_CE_PIN 5
    //#endif
    //#ifndef MY_RF24_CS_PIN
    //#define MY_RF24_CS_PIN 6
    //#endif
    
    // Enable to UDP
    //#define MY_USE_UDP
    
    #define MY_IP_ADDRESS 192,168,0,151   // If this is disabled, DHCP is used to retrieve address
    // Renewal period if using DHCP
    //#define MY_IP_RENEWAL_INTERVAL 60000
    // The port to keep open on node server mode / or port to contact in client mode
    #define MY_PORT 5003
    
    // Controller ip address. Enables client mode (default is "server" mode).
    // Also enable this if MY_USE_UDP is used and you want sensor data sent somewhere.
    //#define MY_CONTROLLER_IP_ADDRESS 192, 168, 0, 101
    
    // The MAC address can be anything you want but should be unique on your network.
    // Newer boards have a MAC address printed on the underside of the PCB, which you can (optionally) use.
    // Note that most of the Ardunio examples use  "DEAD BEEF FEED" for the MAC address.
    #define MY_MAC_ADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
    
    // Enable inclusion mode
    #define MY_INCLUSION_MODE_FEATURE
    // Enable Inclusion mode button on gateway
    //#define MY_INCLUSION_BUTTON_FEATURE
    // Set inclusion mode duration (in seconds)
    #define MY_INCLUSION_MODE_DURATION 60
    // Digital pin used for inclusion mode button
    //#define MY_INCLUSION_MODE_BUTTON_PIN  3
    
    // Set blinking period
    #define MY_DEFAULT_LED_BLINK_PERIOD 300
    
    // Flash leds on rx/tx/err
    // Uncomment to override default HW configurations
    //#define MY_DEFAULT_ERR_LED_PIN 7  // Error led pin
    //#define MY_DEFAULT_RX_LED_PIN  8  // Receive led pin
    //#define MY_DEFAULT_TX_LED_PIN  9  // Transmit led pin
    
    
    #if defined(MY_USE_UDP)
    #include <EthernetUdp.h>
    #endif
    #include <Ethernet.h>
    #include <MySensors.h>
    
    #define CHILD_ID_MQ 15
    
    
    float valMQ =0.0;
    float lastMQ =0.0;
    
    MyMessage msg(CHILD_ID_MQ, V_LEVEL);
    
    void setup()
    {
    }
    
    void presentation()
    {
        sendSketchInfo("Air Quality Sensor - Test", "1.0");
        present(CHILD_ID_MQ, S_AIR_QUALITY);
    }
    
    void loop()
    {
      float sensor_volt; 
      float RS_air; //  Get the value of RS via in a clear air
      float R0;  // Get the value of R0 via in LPG
      float sensorValue;
     
    
    /*--- Get a average data by testing 100 times ---*/   
        for(int x = 0 ; x < 100 ; x++)
      {
        sensorValue = sensorValue + analogRead(A0);
      }
      sensorValue = sensorValue/100.0;
    /*-----------------------------------------------*/
    
      sensor_volt = sensorValue/1024*5.0;
      RS_air = (5.0-sensor_volt)/sensor_volt; // omit *RL
      R0 = RS_air/9.9; // The ratio of RS/R0 is 9.9 in LPG gas
      
      Serial.print("sensor_volt = ");
      Serial.print(sensor_volt);
      Serial.println("V");
      
      Serial.print("R0 = ");
      Serial.println(R0);
    
      uint16_t valMQ = R0;
      if (valMQ != lastMQ) {
          send(msg.set((int16_t)ceil(valMQ)));
          lastMQ = ceil(valMQ);
      }
    
      
      delay(10000);
    }
    

    Connection from gateway to controller is opened, but no values arrive.
    Serial output is repeating every second and missing some output values and delay:
    0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0

    If i put comments on the "send" command the serial output is correct.

    Any idea which settings are wrong/ missing to get the setup run as ethernet connected sensor?

    Thx in advance


  • Mod

    I think the code is missing the send command for the voltage. Also include a little longer serial output. Did you check with myscontroller if actually no values are sent?


  • Admin

    Use wait(), never delay().



  • i'm trying to send the R0 value which is calculated from voltage

    for(int x = 0 ; x < 100 ; x++)
    {
      sensorValue = sensorValue + analogRead(A0);
    }
    sensorValue = sensorValue/100.0;
    /*-----------------------------------------------*/
    
    sensor_volt = sensorValue/1024*5.0;
    RS_air = (5.0-sensor_volt)/sensor_volt; // omit *RL
    R0 = RS_air/9.9; // The ratio of RS/R0 is 9.9 in LPG gas
    

  • Mod

    OK, but you need to post complete code that gives problem and longer serial output



  • @hek
    i've changed delay to wait, but the behaviour is still the same. Seems like "my" serial output in the loop is overwritten by the "debug" serial output.
    It is somehow related to the send command and usage of gateway as a sensor, but i don't get whats wrong 😕



  • @gohan
    the code was complete in the first post (now its only "wait" instead of "delay" in the end).

    Here is a longer serial output for active "send command":
    0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0;0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0;0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0;0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0;0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0;0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.0;0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    ...

    And here is how its look like if send command is commented:
    0;255;3;0;9;MCO:BGN:INIT GW,CP=R-NGA--,VER=2.1.1
    IP: 192.168.0.151
    0;255;3;0;9;MCO:BGN:STP
    0;255;3;0;9;MCO:REG:NOT NEEDED
    0;255;3;0;9;MCO:BGN:INIT OK,TSP=NA
    sensor_volt = 0.05V
    R0 = 10.84
    sensor_volt = 0.05V
    R0 = 10.83
    sensor_volt = 0.05V
    R0 = 10.83


  • Admin

    You cannot print your own debug messages on a serial gateway as it is the mean of communication against the gateway. The controller will try to interpret your prints according to the serial protocol.





  • @Michiel-van-der-Wulp and @hek
    Guys, thank you for fast help. Both answers helped me to solve the problem!



  • @hek I found that out while testing my very first/current gateway. Also, it is no good idea to define MY_DISABLED_SERIAL. (sssst, don't tell anyone i did that).
    ..but still, it's assuring to have my findings confirmed by an expert.


Log in to reply
 

Suggested Topics

0
Online

11.2k
Users

11.1k
Topics

112.5k
Posts