Navigation

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

    Madhias

    @Madhias

    8
    Reputation
    21
    Posts
    473
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online
    Website www.flickr.com/photos/madhias

    Madhias Follow

    Best posts made by Madhias

    • RE: Correct presentation of Sensebender temperature and humidity?

      I have called the measurement function now inside the loop function (that is way better of course), and changed the third wait argument to V_TEMP. That works.

      I had a request in the code, but commented it out, it was like: request(CHILD_ID_TEMP, V_TEMP); because I was not sure if it is needed.

      Thanks for your help!

      posted in Home Assistant
      Madhias
      Madhias
    • RE: 💬 Building a Raspberry Pi Gateway

      I have a question regarding the --my-serial-groupname option: since I start the gateway under an user account with sudo, the gateway device ([EDIT] symlink) will be created with ownership root:root. Shouldn't it be created with root:dialout (as I chose dialout as group in my case)?

      [DELETED]

      posted in Announcements
      Madhias
      Madhias
    • How to connect Sensebender with serial gateway?

      Hi all,

      A few weeks ago I got some packages in the mail, including 4 Sensebenders, and some other parts. I wanted to start on a small scale and try to connect a node with a serial gateway, since everything is new for me!

      I uploaded the (example) serial gateway sketch to an Uno clone, with a NRF24L01 attached to it, and also the (example) SensebenderMicro sketch to the Sensebender (with a Foca FTDI serial adapter), also with a NRF24L01 attached.

      Looking at the serial monitor of the gateway, this is the output:

      u�jI�0;255;3;0;9;MCO:BGN:INIT GW,CP=RNNGA--,VER=2.1.0
      0;255;3;0;9;TSM:INIT
      0;255;3;0;9;TSF:WUR:MS=0
      0;255;3;0;9;TSM:INIT:TSP OK
      0;255;3;0;9;TSM:INIT:GW MODE
      0;255;3;0;9;TSM:READY:ID=0,PAR=0,DIS=0
      0;255;3;0;9;MCO:REG:NOT NEEDED
      0;255;3;0;14;Gateway startup complete.
      0;255;0;0;18;2.1.0
      0;255;3;0;9;MCO:BGN:STP
      0;255;3;0;9;MCO:BGN:INIT OK,TSP=1
      

      Looking at the Sensebenders output:

      4 TSM:INIT
      4 TSF:WUR:MS=0
      12 TSM:INIT:TSP OK
      14 TSM:FPAR
      16 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
      2025 !TSM:FPAR:NO REPLY
      2027 TSM:FPAR
      2029 TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
      4038 !TSM:FPAR:NO REPLY
      

      Did I miss a simple setting to do in the sketches? It took a while until I am this point, to ask this question 😃 My wife asked me again why I don't have a simple hobby like playing tennis.

      posted in Troubleshooting
      Madhias
      Madhias
    • RE: Correct presentation of Sensebender temperature and humidity?

      @martinhjelmare It works now! I think it is a hardware issue I have here, since I just put the decoupling capacitor in between the radio and the pin header socket. Checking that connection helped (pushing again in), and the presentation was correct now - including the sketch name.

      posted in Home Assistant
      Madhias
      Madhias
    • RE: How to connect Sensebender with serial gateway?

      Adding a capacitor at the radio solved my issues... Sorry for not trying that from the very beginning, today I bought some capacitors, and now it looks good!

      Happy now!

      33804 TSF:MSG:SEND,3-3-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:24.0
      33818 TSF:MSG:SEND,3-3-0-0,s=2,c=1,t=1,pt=2,l=2,sg=0,ft=0,st=OK:62
      34127 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
      34134 MCO:SLP:TPD
      34136 MCO:SLP:WUP=-1
      Sending initial value
      34154 TSF:MSG:SEND,3-3-0-0,s=1,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:1
      Requesting initial value from controller
      34164 TSF:MSG:SEND,3-3-0-0,s=1,c=2,t=2,pt=0,l=0,sg=0,ft=0,st=OK:
      TempDiff :1.01
      HumDiff  :1.50
      T: 23.00
      H: 65
      
      posted in Troubleshooting
      Madhias
      Madhias
    • RE: [SOLVED] device_tracker unable to load / known_devices.yaml not found after HA update

      @martinhjelmare OK, It was not an update, since when booting the gateway device from my backup drive I have the same radio problem. So I'll have a look onto that. The gateway is installed on a Raspberry Pi 3, powered by the 'normal' micro USB adapter. I could exchange the capacitor on the radio there as a start.

      [EDIT] Solved, just 'touched' the capacitor and wobbled around on the gateways radio, and radio communication works again. Sorry for the confusion...

      posted in Home Assistant
      Madhias
      Madhias
    • RE: 'getConfig' was not declared in this scope (V2.1.1) - FIXED

      Thanks, had the same problem!

      posted in Troubleshooting
      Madhias
      Madhias

    Latest posts made by Madhias

    • RE: 💬 MySensors @Eindhoven Maker Fair 2017 2-3 September

      Hopefully you'll make some pictures or videos for those who can't attend!

      posted in Announcements
      Madhias
      Madhias
    • RE: 'getConfig' was not declared in this scope (V2.1.1) - FIXED

      @Newzwaver If I remember correctly you have to change in your sketches from getConfig() to getControllerConfig()

      posted in Troubleshooting
      Madhias
      Madhias
    • RE: [SOLVED] device_tracker unable to load / known_devices.yaml not found after HA update

      @martinhjelmare OK, It was not an update, since when booting the gateway device from my backup drive I have the same radio problem. So I'll have a look onto that. The gateway is installed on a Raspberry Pi 3, powered by the 'normal' micro USB adapter. I could exchange the capacitor on the radio there as a start.

      [EDIT] Solved, just 'touched' the capacitor and wobbled around on the gateways radio, and radio communication works again. Sorry for the confusion...

      posted in Home Assistant
      Madhias
      Madhias
    • RE: [SOLVED] device_tracker unable to load / known_devices.yaml not found after HA update

      @martinhjelmare I'll do right now, what can be the problem there. Very strange, since it was working perfect for a long time now, maybe an update broke it (HA and Rasbian Lite). I have a fear about radio problems though, to solve them. It must be the gateway, since it is the same for all sensors.

      posted in Home Assistant
      Madhias
      Madhias
    • RE: [SOLVED] device_tracker unable to load / known_devices.yaml not found after HA update

      @martinhjelmare Thanks again for your help! In the HA log this is the only error shown. I installed it in a Python virtual environment, the path locations are correct – I called the user homeass 😃

      But looking at my gateway log there seems to be another error, with all sensors the same output:

      TSF:MSG:READ,3-3-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
      TSF:MSG:BC
      TSF:MSG:FPAR REQ,ID=3
      TSF:CKU:OK,FCTRL
      TSF:MSG:GWL OK
      !TSF:MSG:SEND,0-0-3-3,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
      
      posted in Home Assistant
      Madhias
      Madhias
    • [SOLVED] device_tracker unable to load / known_devices.yaml not found after HA update

      Hi,

      I am not sure if my problem fits in here or rather to Home Assistant itself, but after an upgrade of HA to 0.48.1 sensor information is not updated, only after restarting Home Assistant once, but with an old value (the one before upgrading). I updated netdisco manually as always to the now correct version (1.0.1). Maybe that is the cause? The Philips Hue lamp is detected and working.

      ERROR (MainThread) [homeassistant.components.device_tracker] Unable to load 
      /home/homeass/.homeassistant/known_devices.yaml: Config file not found:
      /home/homeass/.homeassistant/known_devices.yaml
      

      Do I have to use the device_tracker component now which I did not used before? Is the problem related to netdisco? Creating manually the *.yaml file did not help (of course).

      posted in Home Assistant
      Madhias
      Madhias
    • RE: Correct presentation of Sensebender temperature and humidity?

      @martinhjelmare It works now! I think it is a hardware issue I have here, since I just put the decoupling capacitor in between the radio and the pin header socket. Checking that connection helped (pushing again in), and the presentation was correct now - including the sketch name.

      posted in Home Assistant
      Madhias
      Madhias
    • RE: Correct presentation of Sensebender temperature and humidity?

      I thought I have a correct sketch now, but as I loaded the sketch to another sensor, something must be wrong, since I always get this error in the Home Assistant log:

      WARNING:mysensors.mysensors:Node 2 is unknown
      INFO:mysensors.mysensors:Requesting new presentation for node 2
      INFO:homeassistant.components.mysensors:No sketch_name: node 2
      WARNING:mysensors.mysensors:child_id 1 already exists in children of node 2, cannot add child
      WARNING:mysensors.mysensors:child_id 2 already exists in children of node 2, cannot add child
      

      The json file looks like it got some values (I just changed the format for better reading here):

      {
          "2": {
              "sketch_version": "1.4",
              "children": {
                  "1": {
                      "type": 6,
                      "id": 1,
                      "description": "",
                      "values": {
                          "0": "25.6"
                      }
                  },
                  "2": {
                      "type": 7,
                      "id": 2,
                      "description": "",
                      "values": {
                          "1": "65"
                      }
                  }
              },
              "sensor_id": 2,
              "type": 17,
              "protocol_version": "2.1.1",
              "sketch_name": null,
              "battery_level": 104
          }
      }
      

      This is the sketch:

      // Enable debug prints to serial monitor
      #define MY_DEBUG 
      
      // Define a static node address, remove if you want auto address assignment
      #define MY_NODE_ID 2
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      // Enable to support OTA for this node (needs DualOptiBoot boot-loader to fully work)
      #define MY_OTA_FIRMWARE_FEATURE
      
      #include <SPI.h>
      #include <MySensors.h>
      #include <Wire.h>
      #include <SI7021.h>
      #ifndef MY_OTA_FIRMWARE_FEATURE
      #include "drivers/SPIFlash/SPIFlash.cpp"
      #endif
      #include <EEPROM.h>  
      #include <sha204_lib_return_codes.h>
      #include <sha204_library.h>
      #include <RunningAverage.h>
      //#include <avr/power.h>
      
      // Uncomment the line below, to transmit battery voltage as a normal sensor value
      //#define BATT_SENSOR    199
      
      #define RELEASE "1.4"
      
      #define AVERAGES 2
      
      // Child sensor ID's
      #define CHILD_ID_TEMP  1
      #define CHILD_ID_HUM   2
      
      // How many milli seconds between each measurement
      #define MEASURE_INTERVAL 60000
      
      // How many milli seconds should we wait for OTA?
      #define OTA_WAIT_PERIOD 300
      
      // FORCE_TRANSMIT_INTERVAL, this number of times of wakeup, the sensor is forced to report all values to the controller
      #define FORCE_TRANSMIT_INTERVAL 30 
      
      // When MEASURE_INTERVAL is 60000 and FORCE_TRANSMIT_INTERVAL is 30, we force a transmission every 30 minutes.
      // Between the forced transmissions a tranmission will only occur if the measured value differs from the previous measurement
      
      // HUMI_TRANSMIT_THRESHOLD tells how much the humidity should have changed since last time it was transmitted. Likewise with
      // TEMP_TRANSMIT_THRESHOLD for temperature threshold.
      #define HUMI_TRANSMIT_THRESHOLD 0.5
      #define TEMP_TRANSMIT_THRESHOLD 0.5
      
      // Pin definitions
      #define TEST_PIN       A0
      #define LED_PIN        A2
      #define ATSHA204_PIN   17 // A3
      
      const int sha204Pin = ATSHA204_PIN;
      atsha204Class sha204(sha204Pin);
      
      SI7021 humiditySensor;
      SPIFlash flash(8, 0x1F65);
      
      // Sensor messages
      MyMessage msgHum(CHILD_ID_HUM, V_HUM);
      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      
      #ifdef BATT_SENSOR
      MyMessage msgBatt(BATT_SENSOR, V_VOLTAGE);
      #endif
      
      // Global settings
      int measureCount = 0;
      int sendBattery = 0;
      boolean isMetric = true;
      boolean highfreq = true;
      boolean transmission_occured = false;
      
      bool state = false;
      bool initialValueSent = false;
      
      // Storage of old measurements
      float lastTemperature = -100;
      int lastHumidity = -100;
      long lastBattery = -100;
      
      RunningAverage raHum(AVERAGES);
      
      /****************************************************
       *
       * Setup code 
       *
       ****************************************************/
      void setup() {
        
        pinMode(LED_PIN, OUTPUT);
        digitalWrite(LED_PIN, LOW);
      
        Serial.begin(115200);
        Serial.print(F("Sensebender Micro FW "));
        Serial.print(RELEASE);
        Serial.flush();
      
        // First check if we should boot into test mode
      
        pinMode(TEST_PIN,INPUT);
        digitalWrite(TEST_PIN, HIGH); // Enable pullup
        if (!digitalRead(TEST_PIN)) testMode();
      
        // Make sure that ATSHA204 is not floating
        pinMode(ATSHA204_PIN, INPUT);
        digitalWrite(ATSHA204_PIN, HIGH);
        
        digitalWrite(TEST_PIN,LOW);
        
        digitalWrite(LED_PIN, HIGH); 
      
        humiditySensor.begin();
      
        digitalWrite(LED_PIN, LOW);
      
        Serial.flush();
        Serial.println(F(" - Online!"));
        
        isMetric = getControllerConfig().isMetric;
        Serial.print(F("isMetric: ")); Serial.println(isMetric);
        raHum.clear();
        sendTempHumidityMeasurements(false);
        sendBattLevel(false);
        
      #ifdef MY_OTA_FIRMWARE_FEATURE  
        Serial.println("OTA FW update enabled");
      #endif
      
      }
      
      void presentation()  {
        sendSketchInfo("Sensebender Micro", RELEASE);
      
        present(CHILD_ID_TEMP, S_TEMP);
        present(CHILD_ID_HUM, S_HUM);
          
      #ifdef BATT_SENSOR
        present(BATT_SENSOR, S_POWER);
      #endif
      }
      
      
      /***********************************************
       *
       *  Main loop function
       *
       ***********************************************/
      void loop() {
      
        if (!initialValueSent) {
          bool forceMeasure = true;
          sendTempHumidityMeasurements(forceMeasure);
          Serial.println("Requesting initial value from controller");
          request(CHILD_ID_HUM, V_HUM);
          request(CHILD_ID_TEMP, V_TEMP);
          wait(2000, C_SET, V_TEMP);
        }
        
        measureCount ++;
        sendBattery ++;
        bool forceTransmit = false;
        transmission_occured = false;
      #ifndef MY_OTA_FIRMWARE_FEATURE
        if ((measureCount == 5) && highfreq) 
        {
          clock_prescale_set(clock_div_8); // Switch to 1Mhz for the reminder of the sketch, save power.
          highfreq = false;
        } 
      #endif
        
        if (measureCount > FORCE_TRANSMIT_INTERVAL) { // force a transmission
          forceTransmit = true; 
          measureCount = 0;
        }
          
        sendTempHumidityMeasurements(forceTransmit);
      /*  if (sendBattery > 60) 
        {
           sendBattLevel(forceTransmit); // Not needed to send battery info that often
           sendBattery = 0;
        }*/
      #ifdef MY_OTA_FIRMWARE_FEATURE
        if (transmission_occured) {
            wait(OTA_WAIT_PERIOD);
        }
      #endif
      
        sleep(MEASURE_INTERVAL);  
      }
      
      
      /*********************************************
       *
       * Sends temperature and humidity from Si7021 sensor
       *
       * Parameters
       * - force : Forces transmission of a value (even if it's the same as previous measurement)
       *
       *********************************************/
      void sendTempHumidityMeasurements(bool force)
      {
        bool tx = force;
      
        si7021_env data = humiditySensor.getHumidityAndTemperature();
        
        raHum.addValue(data.humidityPercent);
        
        float diffTemp = abs(lastTemperature - (isMetric ? data.celsiusHundredths : data.fahrenheitHundredths)/100.0);
        float diffHum = abs(lastHumidity - raHum.getAverage());
      
        Serial.print(F("TempDiff :"));Serial.println(diffTemp);
        Serial.print(F("HumDiff  :"));Serial.println(diffHum); 
      
        if (isnan(diffHum)) tx = true; 
        if (diffTemp > TEMP_TRANSMIT_THRESHOLD) tx = true;
        if (diffHum > HUMI_TRANSMIT_THRESHOLD) tx = true;
      
        if (tx) {
          measureCount = 0;
          float temperature = (isMetric ? data.celsiusHundredths : data.fahrenheitHundredths) / 100.0;
           
          int humidity = data.humidityPercent;
          Serial.print("T: ");Serial.println(temperature);
          Serial.print("H: ");Serial.println(humidity);
          
          send(msgTemp.set(temperature,1));
          send(msgHum.set(humidity));
          lastTemperature = temperature;
          lastHumidity = humidity;
          transmission_occured = true;
          if (sendBattery > 60) {
           sendBattLevel(true); // Not needed to send battery info that often
           sendBattery = 0;
          }
        }
      }
      
      /********************************************
       *
       * Sends battery information (battery percentage)
       *
       * Parameters
       * - force : Forces transmission of a value
       *
       *******************************************/
      void sendBattLevel(bool force)
      {
        if (force) lastBattery = -1;
        long vcc = readVcc();
        if (vcc != lastBattery) {
          lastBattery = vcc;
      
      #ifdef BATT_SENSOR
          float send_voltage = float(vcc)/1000.0f;
          send(msgBatt.set(send_voltage,3));
      #endif
      
          // Calculate percentage
      
          vcc = vcc - 1900; // subtract 1.9V from vcc, as this is the lowest voltage we will operate at
          
          long percent = vcc / 14.0;
          sendBatteryLevel(percent);
          transmission_occured = true;
        }
      }
      
      /*******************************************
       *
       * Internal battery ADC measuring 
       *
       *******************************************/
      long readVcc() {
        // Read 1.1V reference against AVcc
        // set the reference to Vcc and the measurement to the internal 1.1V reference
        #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
          ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
          ADMUX = _BV(MUX5) | _BV(MUX0);
        #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
          ADcdMUX = _BV(MUX3) | _BV(MUX2);
        #else
          ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #endif  
       
        delay(2); // Wait for Vref to settle
        ADCSRA |= _BV(ADSC); // Start conversion
        while (bit_is_set(ADCSRA,ADSC)); // measuring
       
        uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
        uint8_t high = ADCH; // unlocks both
       
        long result = (high<<8) | low;
       
        result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
        return result; // Vcc in millivolts
       
      }
      
      /****************************************************
       *
       * Verify all peripherals, and signal via the LED if any problems.
       *
       ****************************************************/
      void testMode()
      {
        uint8_t rx_buffer[SHA204_RSP_SIZE_MAX];
        uint8_t ret_code;
        byte tests = 0;
        
        digitalWrite(LED_PIN, HIGH); // Turn on LED.
        Serial.println(F(" - TestMode"));
        Serial.println(F("Testing peripherals!"));
        Serial.flush();
        Serial.print(F("-> SI7021 : ")); 
        Serial.flush();
        
        if (humiditySensor.begin()) 
        {
          Serial.println(F("ok!"));
          tests ++;
        }
        else
        {
          Serial.println(F("failed!"));
        }
        Serial.flush();
      
        Serial.print(F("-> Flash : "));
        Serial.flush();
        if (flash.initialize())
        {
          Serial.println(F("ok!"));
          tests ++;
        }
        else
        {
          Serial.println(F("failed!"));
        }
        Serial.flush();
      
        
        Serial.print(F("-> SHA204 : "));
        ret_code = sha204.sha204c_wakeup(rx_buffer);
        Serial.flush();
        if (ret_code != SHA204_SUCCESS)
        {
          Serial.print(F("Failed to wake device. Response: ")); Serial.println(ret_code, HEX);
        }
        Serial.flush();
        if (ret_code == SHA204_SUCCESS)
        {
          ret_code = sha204.getSerialNumber(rx_buffer);
          if (ret_code != SHA204_SUCCESS)
          {
            Serial.print(F("Failed to obtain device serial number. Response: ")); Serial.println(ret_code, HEX);
          }
          else
          {
            Serial.print(F("Ok (serial : "));
            for (int i=0; i<9; i++)
            {
              if (rx_buffer[i] < 0x10)
              {
                Serial.print('0'); // Because Serial.print does not 0-pad HEX
              }
              Serial.print(rx_buffer[i], HEX);
            }
            Serial.println(")");
            tests ++;
          }
      
        }
        Serial.flush();
      
        Serial.println(F("Test finished"));
        
        if (tests == 3) 
        {
          Serial.println(F("Selftest ok!"));
          while (1) // Blink OK pattern!
          {
            digitalWrite(LED_PIN, HIGH);
            delay(200);
            digitalWrite(LED_PIN, LOW);
            delay(200);
          }
        }
        else 
        {
          Serial.println(F("----> Selftest failed!"));
          while (1) // Blink FAILED pattern! Rappidly blinking..
          {
          }
        }  
      }
      

      @Mark69 Can't post a helpful sketch so far. Sorry!

      posted in Home Assistant
      Madhias
      Madhias
    • RE: 'getConfig' was not declared in this scope (V2.1.1) - FIXED

      Thanks, had the same problem!

      posted in Troubleshooting
      Madhias
      Madhias
    • RE: 💬 Building a Raspberry Pi Gateway

      @marceloaqno OK, many thanks for that hint!

      I was wrong from the beginning on, since I thought my configuration for the gateway was correct because of --my-serial-groupname=dialout - but that was not compiled. I edited now the mysgw.cpp manually (there was tty instead of dialout; and of course there was all the time the warning when compiling...). Now it works! Without chmod, or chowning anything later!

      posted in Announcements
      Madhias
      Madhias