Merge pull request #173 from barduinor/development

MockMySensors refactoring
This commit is contained in:
Henrik Ekblad
2015-08-23 11:06:43 +02:00
3 changed files with 211 additions and 161 deletions
+4
View File
@@ -397,6 +397,10 @@ boolean MySensor::sendRoute(MyMessage &message) {
#endif
if (dest == GATEWAY_ADDRESS || !repeaterMode) {
// Store this address in routing table (if repeater)
if (repeaterMode) {
hw_writeConfig(EEPROM_ROUTES_ADDRESS+sender, last);
}
// If destination is the gateway or if we aren't a repeater, let
// our parent take care of the message
ok = sendWrite(nc.parentNodeId, message);
@@ -1,29 +1,49 @@
/*
* FakeMySensors
* MockMySensors
*
* This skecth is intended to crate fake sensors which register and respond to the controller
*
* Barduino, GizMoCuz 2015
* ***
* Barduino 2015, GizMoCuz 2015
*/
#include <MySensor.h>
#include <SPI.h>
#include <MySigningNone.h>
#include <MyTransportRFM69.h>
#include <MyTransportNRF24.h>
#include <MyHwATMega328.h>
#include <MySigningAtsha204Soft.h>
#include <MySigningAtsha204.h>
// SPI Pins
#define CE_PIN 9
#define CS_PIN 10
#include <SPI.h>
#include <MySensor.h>
#include <MyMessage.h>
#define RADIO_ERROR_LED_PIN 4 // Error led pin
#define RADIO_RX_LED_PIN 6 // Receive led pin
#define RADIO_TX_LED_PIN 5 // the PCB, on board LED
// Wait times
#define LONG_WAIT 500
#define SHORT_WAIT 50
#define SKETCH_NAME "FakeMySensors "
#define SKETCH_VERSION "v0.3"
#define SKETCH_NAME "MockMySensors "
#define SKETCH_VERSION "v0.4"
// Define Sensors ids
/* S_DOOR, S_MOTION, S_SMOKE, S_LIGHT, S_DIMMER, S_COVER, S_TEMP, S_HUM, S_BARO, S_WIND,
S_RAIN, S_UV, S_WEIGHT, S_POWER, S_HEATER, S_DISTANCE, S_LIGHT_LEVEL, S_ARDUINO_NODE,
S_ARDUINO_REPEATER_NODE, S_LOCK, S_IR, S_WATER, S_AIR_QUALITY, S_CUSTOM, S_DUST,
S_SCENE_CONTROLLER
*/
////#define ID_S_ARDUINO_NODE //auto defined in initialization
////#define ID_S_ARDUINO_REPEATER_NODE //auto defined in initialization
//#define ID_S_DOOR 1
// Some of these ID's have not been updated for v1.5. Uncommenting too many of them
// will make the sketch too large for a pro mini's memory so it's probably best to try
// one at a time.
#define ID_S_ARMED 0 // dummy to controll armed stated for several sensors
#define ID_S_DOOR 1
//#define ID_S_MOTION 2
//#define ID_S_SMOKE 3
//#define ID_S_LIGHT 4
@@ -33,11 +53,11 @@
//#define ID_S_HUM 8
//#define ID_S_BARO 9
//#define ID_S_WIND 10
//#define ID_S_RAIN 11
//#define ID_S_RAIN 11
//#define ID_S_UV 12
//#define ID_S_WEIGHT 13
//#define ID_S_POWER 14
//#define ID_S_HEATER 15 <<-- not correctly implemented (1.5 API)
//#define ID_S_HEATER 15
//#define ID_S_DISTANCE 16
//#define ID_S_LIGHT_LEVEL 17
//#define ID_S_LOCK 18
@@ -46,43 +66,71 @@
//#define ID_S_AIR_QUALITY 21
//#define ID_S_DUST 22
//#define ID_S_SCENE_CONTROLLER 23
//#define ID_S_CUSTOM 24
//#define ID_S_CUSTOM 99
// Global Vars
unsigned long SLEEP_TIME = 12000; // Sleep time between reads (in milliseconds)
unsigned long SLEEP_TIME = 180000; // Sleep time between reads (in milliseconds)
boolean metric = true;
long randNumber;
// Instanciate MySersors Gateway
MySensor gw;
MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW);
//MyTransportRFM69 transport;
// Message signing driver (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
//MySigningNone signer;
//MySigningAtsha204Soft signer;
//MySigningAtsha204 signer;
// Hardware profile
MyHwATMega328 hw;
// Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h)
// To use LEDs blinking, uncomment WITH_LEDS_BLINKING in MyConfig.h
#ifdef WITH_LEDS_BLINKING
MySensor gw(transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN);
#else
MySensor gw(transport, hw /*, signer*/);
#endif
//MySensor gw;
//Instanciate Messages objects
#ifdef ID_S_DOOR
MyMessage msg_S_DOOR(ID_S_DOOR,V_TRIPPED);
#ifdef ID_S_ARMED
bool isArmed;
#endif
#ifdef ID_S_MOTION
#ifdef ID_S_DOOR // V_TRIPPED, V_ARMED
MyMessage msg_S_DOOR_T(ID_S_DOOR,V_TRIPPED);
MyMessage msg_S_DOOR_A(ID_S_DOOR,V_ARMED);
#endif
#ifdef ID_S_MOTION // V_TRIPPED, V_ARMED
MyMessage msg_S_MOTION_A(ID_S_MOTION,V_ARMED);
MyMessage msg_S_MOTION_T(ID_S_MOTION,V_TRIPPED);
#endif
#ifdef ID_S_SMOKE
MyMessage msg_S_SMOKE(ID_S_SMOKE,V_TRIPPED);
#ifdef ID_S_SMOKE // V_TRIPPED, V_ARMED
MyMessage msg_S_SMOKE_T(ID_S_SMOKE,V_TRIPPED);
MyMessage msg_S_SMOKE_A(ID_S_SMOKE,V_ARMED);
#endif
#ifdef ID_S_LIGHT
MyMessage msg_S_LIGHT(ID_S_LIGHT,V_LIGHT);
bool isLightOn=0;
#endif
#ifdef ID_S_DIMMER
MyMessage msg_S_DIMMER(ID_S_DIMMER,V_DIMMER);
int dimmerVal=100;
#endif
#ifdef ID_S_COVER
MyMessage msg_S_COVER_U(ID_S_COVER,V_UP);
MyMessage msg_S_COVER_D(ID_S_COVER,V_DOWN);
MyMessage msg_S_COVER_S(ID_S_COVER,V_STOP);
const char* coverVal = "V_STOP";
#endif
#ifdef ID_S_TEMP
@@ -118,18 +166,18 @@ MySensor gw;
#endif
#ifdef ID_S_POWER
MyMessage msg_S_POWER_I(ID_S_POWER,V_IMPEDANCE);
MyMessage msg_S_POWER_W(ID_S_POWER,V_WATT);
MyMessage msg_S_POWER_K(ID_S_POWER,V_KWH);
MyMessage msg_S_POWER_V(ID_S_POWER,V_VOLTAGE);
MyMessage msg_S_POWER_C(ID_S_POWER,V_CURRENT);
// MyMessage msg_S_POWER_I(ID_S_POWER,V_IMPEDANCE);
// MyMessage msg_S_POWER_V(ID_S_POWER,V_VOLTAGE);
// MyMessage msg_S_POWER_C(ID_S_POWER,V_CURRENT);
#endif
#ifdef ID_S_HEATER
float current_set_point=21.5;
MyMessage msg_S_HEATER_SP(ID_S_HEATER,V_HVAC_SETPOINT_HEAT);
MyMessage msg_S_HEATER_F(ID_S_HEATER,V_HVAC_SETPOINT_HEAT);
MyMessage msg_S_HEATER_T(ID_S_HEATER,V_TEMP);
#ifdef ID_S_HEATER //V_HVAC_SETPOINT_HEAT, V_HVAC_FLOW_STATE, V_TEMP
MyMessage msg_S_HEATER_S(ID_S_HEATER,V_HVAC_SETPOINT_HEAT); // HVAC/Heater setpoint (Integer between 0-100). S_HEATER, S_HVAC
MyMessage msg_S_HEATER_F(ID_S_HEATER,V_HVAC_FLOW_STATE); // HVAC flow state ("Off", "HeatOn", "CoolOn", or "AutoChangeOver"). S_HEATER, S_HVAC
int heatTemp=18;
const char* heatState="Off";
#endif
#ifdef ID_S_DISTANCE
@@ -142,11 +190,13 @@ MySensor gw;
#ifdef ID_S_LOCK
MyMessage msg_S_LOCK(ID_S_LOCK,V_LOCK_STATUS);
bool isLocked = 0;
#endif
#ifdef ID_S_IR
MyMessage msg_S_IR_S(ID_S_IR,V_IR_SEND);
MyMessage msg_S_IR_R(ID_S_IR,V_IR_RECEIVE);
const char* irVal = "";
#endif
#ifdef ID_S_WATER
@@ -165,9 +215,22 @@ MySensor gw;
#ifdef ID_S_SCENE_CONTROLLER
MyMessage msg_S_SCENE_CONTROLLER_ON(ID_S_SCENE_CONTROLLER,V_SCENE_ON);
MyMessage msg_S_SCENE_CONTROLLER_OF(ID_S_SCENE_CONTROLLER,V_SCENE_OFF);
// not sure if scene controller sends int or chars
// betting on ints as Touch Display Scen by Hek
char *scenes[] = {
"All off",
"Good Morning",
"Clean Up!",
"All Lights Off",
"Music On/Off"
};
int sceneVal=0;
int sceneValPrevious=0;
#endif
#ifdef ID_S_CUSTOM
MyMessage msg_S_CUSTOM_1(ID_S_CUSTOM,V_VAR1);
MyMessage msg_S_CUSTOM_2(ID_S_CUSTOM,V_VAR2);
MyMessage msg_S_CUSTOM_3(ID_S_CUSTOM,V_VAR3);
MyMessage msg_S_CUSTOM_4(ID_S_CUSTOM,V_VAR4);
@@ -200,6 +263,11 @@ void setup()
Serial.println(metric ? "Metric":"Imperial");
gw.wait(LONG_WAIT);
// Init Armed
#ifdef ID_S_ARMED
isArmed = true;
#endif
// Register all sensors to gw (they will be created as child devices)
Serial.println("Presenting Nodes");
Serial.println("________________");
@@ -241,7 +309,7 @@ void setup()
#endif
#ifdef ID_S_TEMP
Serial.println(" S_TEMP");
Serial.println(" S_TMEP");
gw.present(ID_S_TEMP,S_TEMP);
gw.wait(SHORT_WAIT);
#endif
@@ -277,7 +345,7 @@ void setup()
#endif
#ifdef ID_S_WEIGHT
Serial.println(" S_WEIGHT"):
Serial.println(" S_WEIGHT");
gw.present(ID_S_WEIGHT,S_WEIGHT);
gw.wait(SHORT_WAIT);
#endif
@@ -486,25 +554,31 @@ void receiveTime(unsigned long controllerTime) {
}
//void door(){}
#ifdef ID_S_DOOR
void door(){
Serial.print("Door is: " );
if (randNumber <= 50) {
Serial.println("Open");
gw.send(msg_S_DOOR.set(1));
gw.send(msg_S_DOOR_T.set(1));
} else {
Serial.println("Closed");
gw.send(msg_S_DOOR.set(0));
gw.send(msg_S_DOOR_T.set(0));
}
#ifdef ID_S_ARMED
Serial.print("System is: " );
Serial.println((isArmed ? "Armed":"Disarmed"));
gw.send(msg_S_DOOR_A.set(isArmed));
#endif
}
#endif
#ifdef ID_S_MOTION
void motion(){
Serial.print("Motion is: " );
if (randNumber <= 50) {
@@ -515,6 +589,11 @@ void motion(){
gw.send(msg_S_MOTION_T.set(0));
}
#ifdef ID_S_ARMED
Serial.print("System is: " );
Serial.println((isArmed ? "Armed":"Disarmed"));
gw.send(msg_S_MOTION_A.set(isArmed));
#endif
}
#endif
@@ -525,38 +604,35 @@ void smoke(){
if (randNumber <= 50) {
Serial.println("Active");
gw.send(msg_S_SMOKE.set(1));
gw.send(msg_S_SMOKE_T.set(1));
} else {
Serial.println("Quiet");
gw.send(msg_S_SMOKE.set(0));
gw.send(msg_S_SMOKE_T.set(0));
}
#ifdef ID_S_ARMED
Serial.print("System is: " );
Serial.println((isArmed ? "Armed":"Disarmed"));
gw.send(msg_S_SMOKE_A.set(isArmed));
#endif
}
#endif
#ifdef ID_S_LIGHT
void light(){
bool isLightOn = gw.loadState(ID_S_LIGHT);
Serial.print("Light is: " );
Serial.println((isLightOn ? "On":"Off"));
if (isLightOn) {
Serial.println("On");
gw.send(msg_S_LIGHT.set(1));
} else {
Serial.println("Off");
gw.send(msg_S_LIGHT.set(0));
}
gw.send(msg_S_LIGHT.set(isLightOn));
}
#endif
#ifdef ID_S_DIMMER
void dimmer(){
int dimmerVal = gw.loadState(ID_S_DIMMER);
Serial.print("Dimmer is set to: " );
Serial.println(dimmerVal);
@@ -568,20 +644,15 @@ void dimmer(){
#ifdef ID_S_COVER
void cover(){
int coverVal = gw.loadState(ID_S_COVER);
Serial.print("Cover is : " );
switch (coverVal) {
case 0:
if (coverVal == "V_UP"){
Serial.println("Opening");
gw.send(msg_S_COVER_U.set(V_UP));
break;
case 1:
}else if (coverVal == "V_DONW"){
Serial.println("Closing");
gw.send(msg_S_COVER_D.set(V_DOWN));
break;
default:
}else{
Serial.println("Idle");
gw.send(msg_S_COVER_S.set(V_STOP));
}
@@ -615,7 +686,7 @@ void hum(){
void baro(){
const char *weather[] = {"stable","sunny","cloudy","unstable","thunderstorm","unknown"};
long pressure = map(randNumber,1,100,900,1200);
long pressure = map(randNumber,1,100,87000,108600);
int forecast = map(randNumber,1,100,0,5);
Serial.print("Atmosferic Pressure is: " );
@@ -687,12 +758,7 @@ void weight(){
#ifdef ID_S_POWER
void power(){
Serial.print("Impedance is: " );
Serial.println(map(randNumber,1,100,0,150));
gw.send(msg_S_POWER_I.set(map(randNumber,1,100,0,150)));
Serial.print("Watt is: " );
Serial.println(map(randNumber,1,100,0,150));
@@ -703,55 +769,36 @@ void power(){
gw.send(msg_S_POWER_K.set(map(randNumber,1,100,0,150)));
Serial.print("Voltage is: " );
Serial.println(map(randNumber,1,100,0,150));
gw.send(msg_S_POWER_V.set(map(randNumber,1,100,0,150)));
// Serial.print("Impedance is: " );
// Serial.println(map(randNumber,1,100,0,150));
//
// gw.send(msg_S_POWER_I.set(map(randNumber,1,100,0,150)));
Serial.print("Current is: " );
Serial.println(map(randNumber,1,100,0,150));
gw.send(msg_S_POWER_C.set(map(randNumber,1,100,0,150)));
// Serial.print("Voltage is: " );
// Serial.println(map(randNumber,1,100,0,150));
//
// gw.send(msg_S_POWER_V.set(map(randNumber,1,100,0,150)));
// Serial.print("Current is: " );
// Serial.println(map(randNumber,1,100,0,150));
//
// gw.send(msg_S_POWER_C.set(map(randNumber,1,100,0,150)));
}
#endif
#ifdef ID_S_HEATER
void heater(){
int heater_set_point = gw.loadState(ID_S_HEATER);
int heater_flow_state = gw.loadState(ID_S_HEATER+1);
int heater_temp = gw.loadState(ID_S_HEATER+2);
Serial.print("Heater mode is: " );
Serial.println(heatState);
if (heater_mode == 0){
Serial.println("Off");
}
else if (heater_mode == 1){
Serial.println("Heat On");
}
else if (heater_mode == 2){
Serial.println("Cool On");
}
else if (heater_mode == 3){
Serial.println("Auto Change Over");
}
else {
Serial.print("Unknown Heater Mode: ");
Serial.println(heater_mode);
}
gw.send(msg_S_HEATER_M.set(heater_mode));
gw.send(msg_S_HEATER_F.set(heatState));
Serial.print("Heater is: " );
Serial.println(heater_switch?"On":"Off");
Serial.print("Heater Set Point is: " );
Serial.println(heatTemp);
gw.send(msg_S_HEATER_S.set(heater_switch));
Serial.print("Heater Temperature is: " );
Serial.println(map(randNumber,1,100,0,45));
gw.send(msg_S_HEATER_T.set(map(randNumber,1,100,0,45)));
gw.send(msg_S_HEATER_S.set(heatTemp));
}
#endif
@@ -781,25 +828,15 @@ void light_level(){
#ifdef ID_S_LOCK
void lock(){
bool isLocked = gw.loadState(ID_S_LOCK);
Serial.print("Lock is: " );
if (isLocked) {
Serial.println("On");
gw.send(msg_S_LOCK.set(1));
} else {
Serial.println("Off");
gw.send(msg_S_LOCK.set(0));
}
Serial.println((isLocked ? "Locked":"Unlocked"));
gw.send(msg_S_LOCK.set(isLocked));
}
#endif
#ifdef ID_S_IR
void ir(){
int irVal = gw.loadState(ID_S_IR);
Serial.print("Infrared is: " );
Serial.println(irVal);
@@ -850,16 +887,15 @@ void dust(){
#ifdef ID_S_SCENE_CONTROLLER
void scene(){
bool isSceneOn = gw.loadState(ID_S_SCENE_CONTROLLER);
Serial.print("Scene is: " );
Serial.println(isSceneOn ? "On":"Off");
if(isSceneOn)
gw.send(msg_S_SCENE_CONTROLLER_ON.set(isSceneOn));
else
gw.send(msg_S_SCENE_CONTROLLER_OF.set(isSceneOn));
Serial.println(scenes[sceneVal]);
if(sceneValPrevious != sceneVal){
gw.send(msg_S_SCENE_CONTROLLER_OF.set(sceneValPrevious));
gw.send(msg_S_SCENE_CONTROLLER_ON.set(sceneVal));
sceneValPrevious=sceneVal;
}
}
#endif
@@ -869,6 +905,7 @@ void custom(){
Serial.print("Custom value is: " );
Serial.println(randNumber);
gw.send(msg_S_CUSTOM_1.set(randNumber));
gw.send(msg_S_CUSTOM_2.set(randNumber));
gw.send(msg_S_CUSTOM_3.set(randNumber));
gw.send(msg_S_CUSTOM_4.set(randNumber));
@@ -880,13 +917,24 @@ void custom(){
void incomingMessage(const MyMessage &message) {
switch (message.type) {
#ifdef ID_S_ARMED
case V_ARMED:
isArmed = message.getBool();
Serial.print("Incoming change for ID_S_ARMED:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println((isArmed ? "Armed":"Disarmed" ));
break;
#endif
#ifdef ID_S_LIGHT
case V_LIGHT:
gw.saveState(ID_S_LIGHT, message.getBool());
isLightOn = message.getBool();
Serial.print("Incoming change for ID_S_LIGHT:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
Serial.println((isLightOn ? "On":"Off"));
light();
break;
#endif
@@ -896,7 +944,7 @@ void incomingMessage(const MyMessage &message) {
Serial.println( "V_DIMMER data invalid (should be 0..100)" );
break;
}
gw.saveState(ID_S_DIMMER, message.getInt());
dimmerVal= message.getInt();
Serial.print("Incoming change for ID_S_DIMMER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
@@ -906,7 +954,7 @@ void incomingMessage(const MyMessage &message) {
#ifdef ID_S_COVER
case V_UP:
gw.saveState(ID_S_COVER, 0);
coverVal="V_UP";
Serial.print("Incoming change for ID_S_COVER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
@@ -914,7 +962,7 @@ void incomingMessage(const MyMessage &message) {
break;
case V_DOWN:
gw.saveState(ID_S_COVER, 1);
coverVal="V_DOWN";
Serial.print("Incoming change for ID_S_COVER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
@@ -922,7 +970,7 @@ void incomingMessage(const MyMessage &message) {
break;
case V_STOP:
gw.saveState(ID_S_COVER, 2);
coverVal="V_STOP";
Serial.print("Incoming change for ID_S_COVER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
@@ -931,42 +979,27 @@ void incomingMessage(const MyMessage &message) {
#endif
#ifdef ID_S_HEATER
case V_HEATER:
gw.saveState(ID_S_HEATER, message.getInt());
case V_HVAC_FLOW_STATE:
heatState = message.getString();
Serial.print("Incoming change for ID_S_HEATER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(heatState);
if (message.getInt() == 0){
Serial.println("Off");
}
else if (message.getInt() == 1){
Serial.println("Heat On");
}
else if (message.getInt() == 2){
Serial.println("Cool On");
}
else if (message.getInt() == 3){
Serial.println("Auto Change Over");
}
else {
Serial.print("Unknown Heater Mode: ");
Serial.println(message.getInt());
}
break;
case V_HEATER_SW:
gw.saveState(ID_S_HEATER+1, message.getBool());
case V_HVAC_SETPOINT_HEAT:
heatTemp = message.getInt();
Serial.print("Incoming change for ID_S_HEATER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println((message.getBool() ? "On":"Off"));
Serial.println(heatTemp);
break;
#endif
#ifdef ID_S_LOCK
case V_LOCK_STATUS:
gw.saveState(ID_S_LOCK, message.getBool());
isLocked = message.getBool();
Serial.print("Incoming change for ID_S_LOCK:");
Serial.print(message.sensor);
Serial.print(", New status: ");
@@ -976,33 +1009,37 @@ void incomingMessage(const MyMessage &message) {
#ifdef ID_S_IR
case V_IR_RECEIVE:
gw.saveState(ID_S_IR, message.getInt());
irVal = message.getString();
Serial.print("Incoming change for ID_S_IR:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getInt());
Serial.println(irVal);
break;
#endif
#ifdef ID_S_SCENE_CONTROLLER
case V_SCENE_ON:
gw.saveState(ID_S_SCENE_CONTROLLER, 1);
sceneVal = message.getInt();
Serial.print("Incoming change for ID_S_SCENE_CONTROLLER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println("On");
Serial.print(scenes[sceneVal]);
Serial.println(" On");
scene();
break;
case V_SCENE_OFF:
gw.saveState(ID_S_SCENE_CONTROLLER, 0);
sceneVal = message.getInt();
Serial.print("Incoming change for ID_S_SCENE_CONTROLLER:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println("Off");
Serial.print(scenes[sceneVal]);
Serial.println(" Off");
scene();
break;
#endif
default:
Serial.print("Unknown/UnImplemented message type:");
Serial.print("Unknown/UnImplemented message type: ");
Serial.println(message.type);
}
@@ -9,7 +9,16 @@ Barduino, GizMoCuz 2015
Comment/Uncomment the sensors you would like to test
Arduino Uno R3 can support about 12 sensors before it runs out of memory.
You probably need to turn of the MySensor Lib debug to save some memory
(turning off the MySensors debug helps if you are memory limited)
Nest step will be to remove the read/write to the eprom
and extend 'ID_S_HEATER' to support the v1.5 API
With a Mega you can have them all
Changes Log
-----------------
2015-08-19
Removed the load/save to eeprom
Touched the heater sensor
Created a pseudo sensor to handle the V_ARMED message.
All sensors which support V_ARMED will arm/disarm at the same time