only one arduino to domoticz without radio



  • Hello everybody,

    I feel a little bit dumb asking that but I'm a real newbie in arduino, sketches libraries ans everything and I don't manage to do the simple thing I want to : using my aduino connected to rpi over serial usb with domoticz.

    I don't need radio, my arduino is next to my rpi and i'd like to measure voltage from one analog pin and use it as a sensor in domoticz.

    I read a lot about mysensors, gateway, nodes but I can't figure out how to manage my simple project.

    Can only one arduino can be used ? (as a gateway without NRF)
    Can I read analog and digital inputs ? command digital outputs ?
    Is mysensors that I need or something else ???

    I would be very glad to have a little help because I am about to let it go !!

    Thank you so much (sorry for bad english)


  • Plugin Developer

    @nico57100

    Hi!

    You can use the dev branch of mysensors at github. See this post:

    http://forum.mysensors.org/topic/1978/power-usage-sensor-multi-channel-local-display/27



  • Thanks for your answer.

    How should i use that ? should I install git on my raspian ?? I'm so lost !
    The exemple you point is so complicated...


  • Plugin Developer

    I would suggest using git, but you could download a snapshot of the dev branch as a zip file from github if you want. But git gives you an easy way of keeping your local files up to date, which might be important, since the dev branch is not a stable release.

    When you have the library downloaded somehow, have a look here, in this file:

    https://github.com/mysensors/Arduino/blob/development/libraries/MySensors/examples/GatewaySerial/GatewaySerial.ino#L82-L92

    It's the example for the serial gateway, which you want to use. Setup, add and use the sensors, where it says so. Check the other examples of sensors in the library, for how to do that. Note that this is not done exactly like in version 1.5.

    In the roadmap for version 1.6 there's instructions on how to convert version 1.5 sketches to 1.6 (dev), if you already have sketches that you want to reuse:
    https://docs.google.com/document/d/1NKq5uuNdnxF5jWnum7VT32mbKLjuvqlx2A5D1qQ-H3Q/edit?usp=sharing



  • Hello and thank so much for all that.
    That's (a little bit) clearer...

    However, I can see in this sketch some radio definitions. Should I remove them as far as I am not using radio.

    Could you tell me where to find sensor setup / presentation / loop for simple things (measuring voltage on analog x / commanding a relay on digital y ??

    That's so nice helping me...

    I am really about to give up. I checked other solution than mysensors (JSON over serialIP, I2C, MQTT....) but I am SOOOO bad in all that. When I read forums, I fell like I was trying to run before knowing to walk lol


  • Plugin Developer

    I haven't tested it myself, but I think you can remove/comment all the defines for functionality you are not using, radio for example.

    Look in the examples directory in the dev branch at github for examples on how to program your sensors/actuators.

    For example, see this relay example:
    https://github.com/mysensors/Arduino/blob/development/libraries/MySensors/examples/RelayActuator/RelayActuator.ino

    Go to the official arduino reference page, for reading about analog pin reads, and more:
    https://www.arduino.cc/en/Reference/AnalogRead



  • I'm so happy !!!!
    That's working very fine. I made it create a temperature sensor over analog measurement !
    Now time to go further ! I think ethernet shield I've just ordered will wait in the cupboard.

    Thank you so much for your damned effective help



  • Hi Nico

    I am looking for such a sketch but did not manage to get it up and running.
    Can you send me the one you created?
    I hope to modify it to my needs.
    Thanks!



  • Below the script I used.
    I am trying to get the EnergyMeterPulsSensor working without RF GW but directly connected via USB.

    /**

    • 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.

    • DESCRIPTION
    • The ArduinoGateway prints data received from sensors on the serial link.
    • The gateway accepts input on seral which will be sent out on radio network.
    • The GW code is designed for Arduino Nano 328p / 16MHz
    • Wire connections (OPTIONAL):
      • Inclusion button should be connected between digital pin 3 and GND
      • RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
    • LEDs (OPTIONAL):
      • To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h
      • 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

    */

    // Enable debug prints to serial monitor
    #define MY_DEBUG

    // Enable and select radio type attached
    //#define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69

    // 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

    // Enable serial gateway
    #define MY_GATEWAY_SERIAL

    // Flash leds on rx/tx/err
    #define MY_LEDS_BLINKING_FEATURE
    // Set blinking period
    #define MY_DEFAULT_LED_BLINK_PERIOD 300

    // Inverses the behavior of leds
    //#define MY_WITH_LEDS_BLINKING_INVERSE

    // Enable inclusion mode
    #define MY_INCLUSION_MODE_FEATURE
    // Enable Inclusion mode button on gateway
    #define MY_INCLUSION_BUTTON_FEATURE

    // Inverses behavior of inclusion button (if using external pullup)
    //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP

    // 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

    #define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin
    #define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin
    #define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED

    #include <SPI.h>
    #include <MySensor.h>

    #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your light sensor. (Only 2 and 3 generates interrupt!)
    #define PULSE_FACTOR 1000 // Nummber of blinks per KWH of your meeter
    #define SLEEP_MODE false // Watt-value can only be reported when sleep mode is false.
    #define MAX_WATT 10000 // Max watt value to report. This filetrs outliers.
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 1 // Id of the sensor child
    unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    MySensor gw;
    double ppwh = ((double)PULSE_FACTOR)/1000; // Pulses per watt hour
    boolean pcReceived = false;
    volatile unsigned long pulseCount = 0;
    volatile unsigned long lastBlink = 0;
    volatile unsigned long watt = 0;
    unsigned long oldPulseCount = 0;
    unsigned long oldWatt = 0;
    double oldKwh;
    unsigned long lastSend;
    MyMessage wattMsg(CHILD_ID,V_WATT);
    MyMessage kwhMsg(CHILD_ID,V_KWH);
    MyMessage pcMsg(CHILD_ID,V_VAR1);

    void setup()
    {
    gw.begin(incomingMessage);

    // Send the sketch version information to the gateway and Controller
    gw.sendSketchInfo("Energy Meter", "1.0");

    // Register this device as power sensor
    gw.present(CHILD_ID, S_POWER);

    // Fetch last known pulse count value from gw
    gw.request(CHILD_ID, V_VAR1);

    attachInterrupt(INTERRUPT, onPulse, RISING);
    lastSend=millis();
    }

    void presentation() {
    // Present locally attached sensors
    }

    void loop()
    {
    gw.process();
    unsigned long now = millis();
    // Only send values at a maximum frequency or woken up from sleep
    bool sendTime = now - lastSend > SEND_FREQUENCY;
    if (pcReceived && (SLEEP_MODE || sendTime)) {
    // New watt value has been calculated
    if (!SLEEP_MODE && watt != oldWatt) {
    // Check that we dont get unresonable large watt value.
    // could hapen when long wraps or false interrupt triggered
    if (watt<((unsigned long)MAX_WATT)) {
    gw.send(wattMsg.set(watt)); // Send watt value to gw
    }
    Serial.print("Watt:");
    Serial.println(watt);
    oldWatt = watt;
    }

    // Pulse cout has changed
    if (pulseCount != oldPulseCount) {
      gw.send(pcMsg.set(pulseCount));  // Send pulse count value to gw 
      double kwh = ((double)pulseCount/((double)PULSE_FACTOR));     
      oldPulseCount = pulseCount;
      if (kwh != oldKwh) {
        gw.send(kwhMsg.set(kwh, 4));  // Send kwh value to gw 
        oldKwh = kwh;
      }
    }    
    lastSend = now;
    

    } else if (sendTime && !pcReceived) {
    // No count received. Try requesting it again
    gw.request(CHILD_ID, V_VAR1);
    lastSend=now;
    }

    if (SLEEP_MODE) {
    gw.sleep(SEND_FREQUENCY);
    }
    }

    void incomingMessage(const MyMessage &message) {
    if (message.type==V_VAR1) {
    pulseCount = oldPulseCount = message.getLong();
    Serial.print("Received last pulse count from gw:");
    Serial.println(pulseCount);
    pcReceived = true;
    }
    }

    void onPulse()
    {
    if (!SLEEP_MODE) {
    unsigned long newBlink = micros();
    unsigned long interval = newBlink-lastBlink;
    if (interval<10000L) { // Sometimes we get interrupt on RISING
    return;
    }
    watt = (3600000000.0 /interval) / ppwh;
    lastBlink = newBlink;
    }
    pulseCount++;
    }



  • @Roland
    And does it work?


Log in to reply
 

Suggested Topics

10
Online

11.2k
Users

11.1k
Topics

112.5k
Posts