Motion Sensor not presenting to RS485 Gateway / TSM:FPAR:NO REPLY
-
Hardware: Arduino nano boards+ RS485 devices with separate 5 volt power supply
I am trying to set up my 1st Rs485 gateway motion sensor on Home Assistant, per the following tutorial:
https://www.mysensors.org/build/rs485The motion sensor is not presenting itself to the gateway, so I did some digging and found this thread on the subject:
https://forum.mysensors.org/topic/11048/mqtt-ethernet-gateway-with-wired-rs485-network.
I have things wired up as per this pic provided in the tutorial
Although I am not using mqtt, everything seemed to be pertinent but I was still unable to get communication between the sensor and gateway.
Ha logs show the gateway seems to be happy:
[mysensors] Connected to Serial<id=0x7f2fd0c2f518, open=True>(port='/dev/ttyUSB0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=False, dsrdtr=False) 2020-10-05 13:17:05 INFO (MainThread) [mysensors] Connected to <_SelectorSocketTransport fd=25 read=idle write=<idle, bufsize=0>> p:Gateway startup complete.
However serial monitor for the motion sensor shows the following:
| \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___ | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __| | | | | |_| |___| | __/ | | \__ \ _ | | \__ \ |_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/ |___/ 2.3.2 16 MCO:BGN:INIT NODE,CP=RSNNA---,FQ=16,REL=255,VER=2.3.2 26 TSM:INIT 28 TSF:WUR:MS=0 29 TSM:INIT:TSP OK 31 TSM:FPAR 33 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 2041 !TSM:FPAR:NO REPLY 2043 TSM:FPAR 2045 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 4054 !TSM:FPAR:NO REPLY 4056 TSM:FPAR 4058 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 6066 !TSM:FPAR:NO REPLY 6068 TSM:FPAR 6070 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 8078 !TSM:FPAR:FAIL 8079 TSM:FAIL:CNT=1 8081 TSM:FAIL:DIS 8083 TSF:TDI:TSL 18085 TSM:FAIL:RE-INIT 18087 TSM:INIT 18088 TSM:INIT:TSP OK
Gateway sketch:
/** * 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-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/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 RS485 Gateway prints data received from sensors on the serial link. * The gateway accepts input on seral which will be sent out on * the RS485 link. * * 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): * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or receive crc error * * If your Arduino board has additional serial ports * you can use to connect the RS485 module. * Otherwise, the gateway uses AltSoftSerial to handle two serial * links on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 115200 // Enable this if RS485 is connected to a hardware serial port #define MY_RS485_HWSERIAL Serial // Enable serial gateway #define MY_GATEWAY_SERIAL // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // 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 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Flash leds on rx/tx/err #define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin #define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin #define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #include <MySensors.h> void setup() { // Setup locally attached sensors } void presentation() { // Present locally attached sensors } void loop() { // Send locally attached sensor data here }
Motion detector Sketch:
/* * 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-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/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. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * This is an example of sensors using RS485 as transport layer * * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * * If your Arduino board has additional serial ports * you can use to connect the RS485 module. * Otherwise, the transport uses AltSoftSerial to handle two serial * links on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 115200 // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial #include <MySensors.h> uint32_t SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define MY_NODE_ID 123 #define CHILD_ID 1 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); } void loop() { // Read digital motion value bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); }
To rule out hardware failure, I followed this tutorial, and all works as expected:
https://naylampmechatronics.com/blog/37_Comunicación-RS485-con-Arduino.htmlTransmitter sketch:
const int ledPin = 13; // Built-in LED const int EnTxPin = 2; // HIGH:Transmitter, LOW:Receiver void setup() { Serial.begin(9600); Serial.setTimeout(100); pinMode(ledPin, OUTPUT); pinMode(EnTxPin, OUTPUT); digitalWrite(ledPin, LOW); digitalWrite(EnTxPin, HIGH); } void loop() { int rdata = analogRead(0); //data from potentiometer int angle= map(rdata, 0, 1023, 0, 180); //transmitter data packet Serial.print("I"); //initiate data packet Serial.print("S"); //code for servo Serial.print(angle); //servo angle data Serial.print("F"); //finish data packet delay(50); //receiver data packet Serial.print("I"); //initiate data packet Serial.print("L"); //code for sensor Serial.print("F"); //finish data packet Serial.flush(); digitalWrite(EnTxPin, LOW); //RS485 as receiver if(Serial.find("i")) { int data=Serial.parseInt(); if(Serial.read()=='f') //finish reading { onLED(data); } } digitalWrite(EnTxPin, HIGH); //RS485 as transmitter } void onLED(int data) { if(data>500) digitalWrite(ledPin, HIGH); else digitalWrite(ledPin, LOW); }
Reciever sketch:
#include <Servo.h> Servo myservo; const int EnTxPin = 2; void setup () { Serial.begin (9600); myservo.attach (9); pinMode(EnTxPin, OUTPUT ); digitalWrite (EnTxPin, LOW ); } void loop (){ if ( Serial.available ()){ if ( Serial.read () == 'I' ){ char function = Serial.read (); if (function == 'S' ){ int angle = Serial.parseInt (); if ( Serial.read () == 'F' ){ if (angle <= 180) { myservo.write (angle); } } } else if (function == 'L' ){ if ( Serial.read () == 'F' ){ int val = analogRead (0); digitalWrite (EnTxPin, HIGH ); //enable to transmit Serial.print ( "i" ); Serial.print (val); Serial.println ( "f" ); Serial.flush (); digitalWrite (EnTxPin, LOW ); //enable to receive } } } } delay (10); }
Any ideas about what might be causing the issue?
-
@mrhutchinsonmn I haven’t used rs485 myself, but I think it will work better if you use the same speed for MY_RS485_BAUD_RATE on gateway and nodes.
-
@mrhutchinsonmn said in Motion Sensor not presenting to RS485 Gateway / TSM:FPAR:NO REPLY:
9600
Good catch.. That was an old version... both are set to 115200 after 9600 did not work
-
@mrhutchinsonmn Might have confused the issue with my reply.. Neither 115200 nor 9600 baud rates resolve the communication issue.
-
The sketch uses MY_RS485_HWSERIAL but you say you have wired according to https://forum.mysensors.org/topic/11048/mqtt-ethernet-gateway-with-wired-rs485-network which uses pins 8 and 9?
Pins 8 and 9 are not the hardware serial pins.
-
@mfalkvidd Ugh!!! Too many versions of the sketch :)... Had to switch between my laptop and pc because of sketch upload issues.... Must have grabbed an old sketch.. I HAD commented hwserial out earlier... Getting communication now but not a valid message, not enough values to unpack errors. I will dig into that tomorrow. Thank you!!!
-
@mrhutchinsonmn I would try 9600 again. 115200 leaves very little room for interference and oscillator differences.
-
Thank you for the advice!
I started over, just to be sure I didn't have anymore mix ups, but still have not been able to get the RS485 motion sensor and RS485 gateway to talk.
Hardware: Arduino Nanos+ RS485 modules.
Wiring:
RO = Pin 8 of Arduino
DI = Pin 9 of Arduino
A = A on other Nano
B = B on other Nano
DI= Pin 9 of Nano
RO = Pin 8 of Nano
DE & RE = Pin 2 of Nano
VCC = External power source
GND = External power sourceCurrent Gateway Sketch:
/** * 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-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/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 RS485 Gateway prints data received from sensors on the serial link. * The gateway accepts input on seral which will be sent out on * the RS485 link. * * 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): * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or receive crc error * * If your Arduino board has additional serial ports * you can use to connect the RS485 module. * Otherwise, the gateway uses AltSoftSerial to handle two serial * links on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial // Enable serial gateway #define MY_GATEWAY_SERIAL // Enable inclusion mode #define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway #define MY_INCLUSION_BUTTON_FEATURE // 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 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Flash leds on rx/tx/err #define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin #define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin #define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #include <MySensors.h> void setup() { // Setup locally attached sensors } void presentation() { // Present locally attached sensors } void loop() { // Send locally attached sensor data here }
Current Motion Detector Sketch:
/* * 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-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/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. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * This is an example of sensors using RS485 as transport layer * * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * * If your Arduino board has additional serial ports * you can use to connect the RS485 module. * Otherwise, the transport uses AltSoftSerial to handle two serial * links on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 // Enable this if RS485 is connected to a hardware serial port //#define MY_RS485_HWSERIAL Serial1 #include <MySensors.h> uint32_t SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define MY_NODE_ID 12 #define CHILD_ID 1 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); } void loop() { // Read digital motion value bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); }
Commented the following out on the gateway, as per other forum users recommendations ( but made no difference)
// Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // 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
Serial Monitor info:
21257 TSM:FAIL:CNT=7 321259 TSM:FAIL:DIS 321261 TSF:TDI:TSL 381263 TSM:FAIL:RE-INIT 381265 TSM:INIT 381266 TSM:INIT:TSP OK 381268 TSM:FPAR 381287 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 383295 !TSM:FPAR:NO REPLY 383297 TSM:FPAR 383315 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 385324 !TSM:FPAR:NO REPLY 385326 TSM:FPAR 385344 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 387352 !TSM:FPAR:NO REPLY 387354 TSM:FPAR 387373 ?TSF:MSG:SEND,255-255-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 389381 !TSM:FPAR:FAIL
Ideas?
-
@mrhutchinsonmn At RS485, it's obligatory to assign NodeIDs within your sketch.
-
You should move the define for the node ID before you include mysensors.h
-
@rejoe2 In research, some stated it needed to be there if the sensor did not present itself. Followed @electrik advice and it now works. Thank you for your feedback!
-
@electrik Yes... that worked!!! Moved node and child id above mysensors.h
Thank you!!!!