diff --git a/examples/WatermeterSensor/WaterMeterSensor.ino b/examples/WatermeterSensor/WaterMeterSensor.ino new file mode 100644 index 00000000..e5163e8e --- /dev/null +++ b/examples/WatermeterSensor/WaterMeterSensor.ino @@ -0,0 +1,111 @@ +/* +* 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 +* Copyright (C) 2013-2017 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. +*/ + +/************************** +Motion Sensor + +The following sketch can be used to report back to the controller when a motion sensor attached to the board's pin 3 +triggers. In this example, the board will be put to sleep just after startup and will report a heartbeat every hour. +NodeManager will take care of configuring an interrupt associated to the provided pin so automatically wake up when a +motion is detected and report a V_TRIPPED message back. +*/ + + +/********************************** +* MySensors node configuration +*/ + +// General settings +#define SKETCH_NAME "WaterMeterSensor" +#define SKETCH_VERSION "1.0" +#define MY_BAUD_RATE 9600 +#define MY_NODE_ID 99 + +// NRF24 radio settings +#define MY_RADIO_RF24 + +/*********************************** + * NodeManager configuration + */ + +#define NODEMANAGER_SLEEP OFF + +// import NodeManager library (a nodeManager object will be then made available) +#include + +/*********************************** + * Add your sensors + */ + +#include +SensorWaterMeter waterMeter(3); + +/*********************************** +* Main Sketch +*/ + +// before +void before() { + +/*********************************** +* Configure your sensors +*/ + + // set reporting interval to 30 seconds. + waterMeter.setReportIntervalSeconds(30); + // set pulse factor to 1000 pulses per m3 + waterMeter.setPulseFactor(1000); + + // call NodeManager before routine + nodeManager.before(); +} + +// presentation +void presentation() { + // call NodeManager presentation routine + nodeManager.presentation(); +} + +// setup +void setup() { + // call NodeManager setup routine + nodeManager.setup(); +} + +// loop +void loop() { + // call NodeManager loop routine + nodeManager.loop(); +} + +#if NODEMANAGER_RECEIVE == ON +// receive +void receive(const MyMessage &message) { + // call NodeManager receive routine + nodeManager.receive(message); +} +#endif + +#if NODEMANAGER_TIME == ON +// receiveTime +void receiveTime(unsigned long ts) { + // call NodeManager receiveTime routine + nodeManager.receiveTime(ts); +} +#endif \ No newline at end of file diff --git a/nodemanager/Child.cpp b/nodemanager/Child.cpp index aa6c481c..d64474c0 100644 --- a/nodemanager/Child.cpp +++ b/nodemanager/Child.cpp @@ -196,7 +196,7 @@ void Child::sendValue(bool force) { if (_format == DOUBLE) nodeManager.sendMessage(_child_id,_type,_value,_float_precision); if (_format == STRING) nodeManager.sendMessage(_child_id,_type,_value_string); // reset the counters - reset(); + if (_value_processing != SUM) reset(); } // print the child value to a device diff --git a/nodemanager/Node.cpp b/nodemanager/Node.cpp index de62c605..c36744a3 100644 --- a/nodemanager/Node.cpp +++ b/nodemanager/Node.cpp @@ -561,7 +561,7 @@ void NodeManager::loop() { for (int i = 0; i < _retries; i++) { if (mGetPayloadType(_message) == P_INT16) debug_verbose(PSTR(LOG_MSG "SEND(%d) t=%d p=%d\n"),_message.sensor,_message.type,_message.getInt()); if (mGetPayloadType(_message) == P_LONG32) debug_verbose(PSTR(LOG_MSG "SEND(%d) t=%d p=%ld\n"),_message.sensor,_message.type,_message.getLong()); - if (mGetPayloadType(_message) == P_FLOAT32) debug_verbose(PSTR(LOG_MSG "SEND(%d) t=%d p=%d.%02d\n"),_message.sensor,_message.type,(unsigned int)_message.getFloat(), (unsigned int)(_message.getFloat()*100)%100); + if (mGetPayloadType(_message) == P_FLOAT32) debug_verbose(PSTR(LOG_MSG "SEND(%d) t=%d p=%d.%03d\n"),_message.sensor,_message.type,(unsigned int)_message.getFloat(), (unsigned int)(_message.getFloat()*100)%100); if (mGetPayloadType(_message) == P_STRING) debug_verbose(PSTR(LOG_MSG "SEND(%d) t=%d p=%s\n"),_message.sensor,_message.type,_message.getString()); send(_message, _ack); // if configured, sleep between each send diff --git a/sensors/SensorPowerMeter.h b/sensors/SensorPowerMeter.h index fed8c012..1e8bcb48 100644 --- a/sensors/SensorPowerMeter.h +++ b/sensors/SensorPowerMeter.h @@ -46,7 +46,14 @@ class SensorPowerMeter: public SensorPulseMeter { void onReceive(MyMessage* message) { Child* child = getChild(message->sensor); if (child == nullptr) return; - if (message->getCommand() == C_REQ && message->type == child->getType()) { + // handle SET command + if (message->getCommand() == C_SET && message->type == child->getType()) { + // set the pulse counter to the received value + children.get()->reset(); + children.get()->setValue(message->getFloat()); + } + // handle REQ command + if (message->getCommand() == C_REQ && message->type == child->getType()) { // send the accumulated value so far children.get()->sendValue(); } diff --git a/sensors/SensorWaterMeter.h b/sensors/SensorWaterMeter.h index 75529b9a..9e4cba31 100644 --- a/sensors/SensorWaterMeter.h +++ b/sensors/SensorWaterMeter.h @@ -46,7 +46,14 @@ class SensorWaterMeter: public SensorPulseMeter { void onReceive(MyMessage* message) { Child* child = getChild(message->sensor); if (child == nullptr) return; - if (message->getCommand() == C_REQ && message->type == child->getType()) { + // handle SET command + if (message->getCommand() == C_SET && message->type == child->getType()) { + // set the pulse counter to the received value + children.get()->reset(); + children.get()->setValue(message->getFloat()); + } + // handle REQ command + if (message->getCommand() == C_REQ && message->type == child->getType()) { // send the accumulated value so far children.get()->sendValue(); }