Sending motion V_TRIPPED and light V_STATUS
-
I have an outside motion-light sensor/relay. The motion-light logic is hosted on the arduino so the motion-light works when the controller is offline.
- The motion sensor successfully reports to Domoticz.
- I can turn the lights on/off from Domoticz.
- However, when motion turns on the light, the light status is not being reported to Domoticz.
// Enable debug prints to serial monitor #define MY_DEBUG #define MY_RADIO_NRF24 // Enabled repeater feature for this node #define MY_REPEATER_FEATURE #include <SPI.h> #include <MySensors.h> #include <DallasTemperature.h> #include <OneWire.h> #include <Bounce2.h> #define PIN_S_MOTION_BACK_GARAGE_1 3 // garage motion bench [Brown Stripe] #define PIN_S_MOTION_BACK_GARAGE_2 4 // garage motion car door [Green Stripe] #define PIN_S_MOTION_BACK_GARAGE_OUT 5 // garage motion outside [Green] #define PIN_S_LIGHT_IN 14 // LED lighting relay Use analog as digital A0=14 A5=19 #define MAX_ATTACHED 16 // Max attached ds18b20 sensors #define CONV_TIME 750 // conversion time for ds18b20 #define LONG_WAIT 750 // long wait between signals #define SHORT_WAIT 50 // short wait between signals // non-blocking loop timers unsigned long trip_time = 1000; // Sleep time between reads (in milliseconds) 1s * 1000ms unsigned long light_time = 300000; // Sleep time before lights turn off ( in ms ) 5min * 60s * 1000ms unsigned long lastTripTime = 0; bool lastState[MAX_ATTACHED]; bool tripped = 0; bool isArmed = 0; bool isLightOn = 0; unsigned long lastLightTime = 0; #define ID_S_MOTION_BACK_GARAGE_1 8 #define ID_S_MOTION_BACK_GARAGE_2 9 #define ID_S_LIGHT_IN 14 MyMessage msg_S_TEMP (0,V_TEMP); MyMessage msg_S_TIMER (7, V_DIMMER); // Dimmer used to set light countdown timer 1-100% MyMessage msg_S_MOTION_T (8,V_TRIPPED); // pir motion sensors MyMessage msg_S_REED_T (11,V_TRIPPED); // door/window sensors MyMessage msg_S_LIGHTS (14,V_STATUS); // light relay switch void setup() { pinMode(PIN_S_MOTION_BACK_GARAGE_1, INPUT); // sets the motion sensor digital pin as input pinMode(PIN_S_MOTION_BACK_GARAGE_2, INPUT); pinMode(PIN_S_LIGHT_IN, OUTPUT); } void presentation() { //Serial.println(""); Serial.println("three"); // Send the sketch version information to the gateway and Controller sendSketchInfo("Back Garage", "1.1"); wait(LONG_WAIT); present(ID_S_MOTION_BACK_GARAGE_1, S_MOTION,"BkGrgMotion1"); wait(LONG_WAIT); present(ID_S_MOTION_BACK_GARAGE_2, S_MOTION,"BkGrgMotion2"); wait(LONG_WAIT); present(ID_S_LIGHT_IN, S_BINARY,"BkGrgLightIn"); wait(LONG_WAIT); } void loop() { // check trip sensors every second. if ( (millis() - lastTripTime) > trip_time ){ check_motion(PIN_S_MOTION_BACK_GARAGE_1, ID_S_MOTION_BACK_GARAGE_1); check_motion(PIN_S_MOTION_BACK_GARAGE_2, ID_S_MOTION_BACK_GARAGE_2); lastTripTime = millis(); } if ( isLightOn == 1 && (millis() - lastLightTime) > light_time ) { lights_off(); } } void check_motion( uint8_t t_pin, uint8_t t_id ){ int tripped = digitalRead(t_pin) == HIGH; if (lastState[t_id] != tripped){ send(msg_S_MOTION_T.setSensor(t_id).set(tripped)); lastState[t_id] = tripped; wait(LONG_WAIT); } if (tripped){ lights_on(); } } void lights_on(){ if ( isLightOn == 0 ){ digitalWrite(PIN_S_LIGHT_IN, 1); send(msg_S_LIGHTS.setSensor(ID_S_LIGHT_IN).set(1)); isLightOn = 1; wait(LONG_WAIT); } lastLightTime = millis(); } void lights_off(){ if ( isLightOn == 1 ){ isLightOn = 0; digitalWrite(PIN_S_LIGHT_IN, 0); send(msg_S_LIGHTS.setSensor(ID_S_LIGHT_IN).set(0)); } } void receive(const MyMessage &message){ switch (message.type) { case V_STATUS: if(message.sensor==ID_S_LIGHT_IN) { if ( message.getBool() ){ lights_on(); } else { lights_off(); } } break; } }
-
@dmonty First question, and I realize it is outside of the scope of your question, why don't you have your message definitions using your IDs (ID_S_MOTION_BACK_GARAGE_1, ID_S_LIGHT_IN, etc...)
MyMessage msg_S_TEMP (0,V_TEMP); MyMessage msg_S_TIMER (7, V_DIMMER); // Dimmer used to set light countdown timer 1-100% MyMessage msg_S_MOTION_T (8,V_TRIPPED); // pir motion sensors MyMessage msg_S_REED_T (11,V_TRIPPED); // door/window sensors MyMessage msg_S_LIGHTS (14,V_STATUS); // light relay switch
You have 2 motion sensors defined, but only one to report back.
Anyways, looking at your code, I cannot see a reason why the light state would not report back. The only thing that I can see that wouldn't report back would be motion sensor 2.
-
When I was working with the temperature sensors I noticed that MyMessage class could be re-used if the type of sensor is the same. Just set the child-sensor-id before sending the message. This cut down the amount of code and made it easier when looping through similar sensors.
-
@dmonty You may be correct, I always worked on the philosophy that each sensor that needed to report should have it's own MyMessage definition. So do they both report back for you?
-
Yes. Both motion sensors report back fine. I also have a node with door, motion and temperature and they all report back their respective values according to child-sensor-id.
I'm going to try update and re-compiling the code for the master node. Then watch debugging on the master node. Finally if that doesn't work I'll read through the source code for domoticz and mysensors to see why the light is not reporting back.
-
@dmonty Skimming your code, I do not see any issues then that stand out to me. Maybe add some debug prints to see if things are getting where they should in the code.
-
OK while doing some serial debugging I noticed that the gateway node did not get the right message type: V_TEMP (t=0) should be V_STATUS (t=2).
TSF:MSG:READ,1-1-0,s=14,c=1,t=0,pt=1,l=1,sg=0:1 Received Message
Sender: 1
Last Node: 1
Destination: 0
Sensor Id: 14
Command: SET
Message Type: V_TEMP
Payload Type: P_BYTE
Payload Length: 1
Signing: 0
Payload: 1
-
It may be because the enum is clobbering V_STATUS with old V_LIGHT. Arduino/libraries/MySensors/core/MyMessage.h
typedef enum { V_TEMP = 0, //!< S_TEMP. Temperature S_TEMP, S_HEATER, S_HVAC V_HUM = 1, //!< S_HUM. Humidity V_STATUS = 2, //!< S_BINARY, S_DIMMER, S_SPRINKLER, S_HVAC, S_HEATER. Used for setting/reporting binary (on/off) status. 1=on, 0=off V_LIGHT = 2, //!< \deprecated Same as V_STATUS, **** DEPRECATED, DO NOT USE **** V_PERCENTAGE = 3, //!< S_DIMMER. Used for sending a percentage value 0-100 (%).
-
What version of mysensors are you using?
-
Version 2.1.1
This morning I found I did some serial debugging on the sender and master node.
I had to re-initiate the Sensor ID and the Sensor Type before sending.isLightOn = 1; msg_S_LIGHTS.setSensor(ID_S_LIGHT); msg_S_LIGHTS.setType(V_STATUS); send(msg_S_LIGHTS.set(isLightOn),true);
Without doing this the wrong type is sent from the node itself.
9234 TSF:MSG:SEND,1-1-0-0,s=15,c=0,t=3,pt=0,l=10,sg=0,ft=0,st=OK:SdGrgLight 9243 TSF:MSG:READ,0-0-1,s=15,c=0,t=3,pt=0,l=10,sg=0:SdGrgLight 9249 TSF:MSG:ACK 9991 MCO:REG:REQ 9996 TSF:MSG:SEND,1-1-0-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2 10002 TSF:MSG:READ,0-0-1,s=255,c=3,t=27,pt=1,l=1,sg=0:1 10007 MCO:PIM:NODE REG=1 10009 MCO:BGN:STP 10150 MCO:BGN:INIT OK,TSP=1 27173 TSF:MSG:SEND,1-1-0-0,s=9,c=1,t=16,pt=1,l=1,sg=0,ft=0,st=OK:1 27938 TSF:MSG:SEND,1-1-0-0,s=15,c=1,t=0,pt=1,l=1,sg=0,ft=0,st=OK:1
Sent Message
Sender: 1
Last Node: 1
Next Node: 0
Destination: 0
Sensor Id: 15
Command: SET
Message Type:V_TEMP
Payload Type: P_BYTE
Payload Length: 1
Signing: 0
Failed uplink counter: 0
Status: OK (OK=success, NACK=no radio ACK received)
Payload: 1
-
I tried uploading a simple Light on/off delay loop sending only light status from the node. I can confirm that the master node receives the message on the serial interface. However Domoticz does not log any incoming actions. So my thoughts are now that Domoticz does not handle light-status send-updates from the nodes.
msg_S_LIGHTS.setSensor(ID_S_LIGHT); msg_S_LIGHTS.setType(V_STATUS); send(msg_S_LIGHTS.set(isLightOn==1 ? "1" : "0"),true);
Message Type: V_STATUS
Payload Type: P_STRINGmsg_S_LIGHTS.setSensor(ID_S_LIGHT); msg_S_LIGHTS.setType(V_STATUS); send(msg_S_LIGHTS.set(isLightOn),true);
Message Type: V_STATUS
Payload Type: P_BYTEmsg_S_LIGHTS.setSensor(ID_S_LIGHT); msg_S_LIGHTS.setType(V_TRIPPED); send(msg_S_LIGHTS.set(isLightOn),true);
Message Type: V_TRIPPED
Payload Type: P_BYTE
-
Tried MockMySensors Example - with a light on/off loop and no radio and Domoticz updates light status based on Arduino code. This means Domoticz supports receiving update status for lights.
-
I tracked down the issue. My real sketch had too many large variables using up too much memory. Because the Lights were being declared later they were getting clobbered. After decreasing the number of sensors everything started working fine.
-
You could check the code and try using smaller variable types to something that you actually need