Etched and soldered a new gateway after the original one I had failed.
Etched and soldered a new gateway after the original one I had failed.
Hi everybody,
Having a weird issue with my WiFi gateway. My nodes get FPAR:NO REPLY consistently when they start up. If i use another gateway, they work immediately.
If I switch gateways to the WiFi after the nodes have a parent and are asleep, it works fine. I had it run like that the whole weekend with no issues so I doubt it's a radio problem.
Unfortunately when I built the gateway, I didn't have an 8pin DIL socket so I had to solder the radio in place, making testing out with another very difficult.
I've tried with vesion 2.3.1 as well as the dev branch from github.
Background
This Gateway has been working for over a year with a temperature sensor node on a ATMEGA168 Seeduino arduino board. Both were running MySensors 2.1.1.
I decided to replace the arduino with a dedicated board I made with a ATMEGA328 running at 8Mhz using the MYSBootloader.
After soldering up the board, I loaded the sketch with MySensors 2.3.1 and tested with an Ethernet Gateway on my Arduino Duemilanove.
When it worked fine for a couple of days, I upgraded the Wifi gateway to 2.3.1 as well.
Original node connected to the Wifi gateway and ran fo another few days while I made a case for the new node.
When I switched the nodes, the new one would not connect. Power cycled both but no dice. Both are located in awkward positions so I removed them, flased each with the Clear EEPROM sketch and reloaded firmware but still no connection.
Also tried with a 16Mhz board with MYSBootloader because I didn't solder headers to the 8Mhz board for serial and it became a pain to pull the chip out to flash.
My setup:
Wifi Gateway:
ESP8266 12-E with a NRF24L2401+
5v power supply with a HT7833 on the ESP8266 with a 100 nF Bypass across VCC and Gnd.
AMS1117 on the NRF24L01+ with a 4.7uF Electrolytical Bypass Cap (Added a 100uF as well in testing while trying to debug)
DS18B20 Temperature Node
ATMEGA328 with MYSBootlader @ 8Mhz internal powered with a 5v Regulated Wall Wart power supply.
AMS1117 regulator for the NRF24L01+ with 47uF Bypass Capacitor.
Second test node
ATMEGA328 with MYSBootlader @ 16Mhz crystal oscillator powered with a 5v Regulated power bank.
AMS1117 regulator for the NRF24L01+ with 47uF Bypass Capacitor.
WIFI Gateway Sketch
// Enable debug prints to serial monitor
#define MY_DEBUG
//#define MY_DEBUG_VERBOSE_RF24
#define MY_DEBUG_VERBOSE_GATEWAY
// Use a bit lower baudrate for serial prints on ESP8266 than default in MyConfig.h
#define MY_BAUD_RATE 9600
//#define MY_RF24_CHANNEL 26
//#define MY_RF24_DATARATE RF24_250KBPS
//#define MY_RF24_DATARATE RF24_1MBPS
// Enables and select radio type (if attached)
#define MY_RADIO_RF24
#define MY_GATEWAY_MQTT_CLIENT
#define MY_GATEWAY_ESP8266
// Set this node's subscribe and publish topic prefix
#define MY_MQTT_PUBLISH_TOPIC_PREFIX "sensors-out"
#define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "sensors-in"
// Set MQTT client id
#define MY_MQTT_CLIENT_ID "mysensors-esp"
// Set WIFI SSID and password
#define MY_WIFI_SSID "wifi_ssid"
#define MY_WIFI_PASSWORD "wifi_password"
// Set the hostname for the WiFi Client. This is the hostname
// it will pass to the DHCP server if not static.
#define MY_HOSTNAME "mqtt-sensor-gateway"
// Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP)
#define MY_IP_ADDRESS 192,168,1,15
// If using static ip you need to define Gateway and Subnet address as well
#define MY_IP_GATEWAY_ADDRESS 192,168,1,1
#define MY_IP_SUBNET_ADDRESS 255,255,255,0
// MQTT broker ip address.
#define MY_CONTROLLER_IP_ADDRESS 192, 168, 1, 2
// The MQTT broker port to to open
#define MY_PORT 1883
// Set blinking period
//#define MY_DEFAULT_LED_BLINK_PERIOD 100
// Flash leds on rx/tx/err
//Pin 2 is the PCB, on board LED
//#define MY_DEFAULT_ERR_LED_PIN 5 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 2 // Receive led pin
//#define MY_DEFAULT_TX_LED_PIN 16 //
#include <ESP8266WiFi.h>
#include <MySensors.h>
#include <ArduinoOTA.h>
void setup()
{
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Setup locally attached sensors
ArduinoOTA.onStart([]() {
Serial.println("ArduinoOTA start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nArduinoOTA end");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("OTA Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
}
void presentation()
{
// Present locally attached sensors here
sendSketchInfo("ESP-MC Gateway", "1.2.3", 0);
}
void loop()
{
// Send locally attech sensors data here
wdt_disable();
ArduinoOTA.handle();
}
Temperature Node Sketch
// Enable debug prints to serial monitor
//#define MY_DEBUG
//#define MY_RF24_CHANNEL 26
//#define MY_RF24_DATARATE RF24_250KBPS
//#define MY_RF24_DATARATE RF24_1MBPS
#define MY_SKETCH_NAME "Temperature Sensor"
#define MY_SKETCH_VERSION "2.3.2"
#define MY_NODE_ID 10
#define MY_PARENT_ID 0
#define CHILD_ID_BATTERY 5
// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_DEFAULT_LED_BLINK_PERIOD 50
//#define MY_WITH_LEDS_BLINKING_INVERSE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 100
// Flash leds on rx/tx/err
// Uncomment to override default HW configurations
#define MY_DEFAULT_ERR_LED_PIN 5 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin
#define MY_DEFAULT_TX_LED_PIN 4 // Transmit led pin
#include <MySensors.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected
#define MAX_ATTACHED_DS18B20 3
unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);
//MyMessage msgbatt(CHILD_ID_BATTERY, V_VOLTAGE);
/////////////////////////////////////////////////
int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
int oldBatteryPcnt = 0;
/////////////////////////////////////////////////
void before()
{
// Startup up the OneWire library
sensors.begin();
}
void setup()
{
// requestTemperatures() will not block current thread
sensors.setWaitForConversion(false);
///////////////////////////////////////////////
// use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
analogReference(INTERNAL1V1);
#else
analogReference(INTERNAL);
#endif
////////////////////////////////////////////////
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(MY_SKETCH_NAME, MY_SKETCH_VERSION);
// Fetch the number of attached temperature sensors
numSensors = sensors.getDeviceCount();
// Present all sensors to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
present(i, S_TEMP);
}
present(CHILD_ID_BATTERY, S_MULTIMETER);
}
int16_t millisToWaitForConversion(uint8_t bitResolution)
{
switch (bitResolution)
{
case 9:
return 94;
case 10:
return 188;
case 11:
return 375;
default:
return 750;
}
}
void loop()
{
// Fetch temperatures from Dallas sensors
sensors.requestTemperatures();
// query conversion time and sleep until conversion completed
int16_t conversionTime = millisToWaitForConversion(sensors.getResolution());
// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
sleep(conversionTime);
// Read temperatures and send them to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
// Fetch and round temperature to one decimal
float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
// Only send data if temperature has changed and no error
//Serial.print(temperature);
#if COMPARE_TEMP == 1
if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
#else
if (temperature != -127.00 && temperature != 85.00) {
#endif
// Send in the new temperature
send(msg.setSensor(i).set(temperature,1));
// Save new temperatures for next compare
lastTemperature[i]=temperature;
}
}
//////////////////////////////////////////////////////////////////////////
// get the battery Voltage
int sensorValue = analogRead(BATTERY_SENSE_PIN);
#ifdef MY_DEBUG
Serial.print("Sensor Reading: ");
Serial.print(sensorValue);
Serial.print(" --> modified to -->> ");
Serial.print(sensorValue*5.5);
Serial.println(" bits");
#endif
// sensorValue = sensorValue * 5.5;
// 1M, 470K divider across battery and using internal ADC ref of 1.1V
// Sense point is bypassed with 0.1 uF cap to reduce noise at that point
// ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
// 3.44/1023 = Volts per bit = 0.003363075
int batteryPcnt = sensorValue / 10;
// ((1M+220k)/220K)*1.1 = Vmax = 6.1 Volts
// 6.1/1023 = Volts per bit = 0.005962854
// // ((220k+1M)/1M)*1.1 = Vmax = 6.1 Volts // incorrect resistors
// // 1.342/1023 = Volts per bit = 0.001311827 // incorrect resistors
// float batteryV = sensorValue * 0.00498533724; // incorrect resistors
float batteryV = sensorValue * 0.00593824228;
#ifdef MY_DEBUG
Serial.print("Battery Voltage: ");
Serial.print(batteryV);
Serial.println(" V");
Serial.print("Battery percent: ");
Serial.print(batteryPcnt);
Serial.println(" %");
#endif
if (oldBatteryPcnt != batteryPcnt) {
// Power up radio after sleep
sendBatteryLevel(batteryPcnt);
oldBatteryPcnt = batteryPcnt;
// send(msgbatt.set(batteryV ,2));
}
//////////////////////////////////////////////////////////////////////////
smartSleep(SLEEP_TIME);
}
16Mhz test Node sketch
// Enable debug prints to serial monitor
#define MY_DEBUG
//#define MY_RF24_CHANNEL 76
//#define MY_RF24_DATARATE RF24_250KBPS
//#define MY_RF24_DATARATE RF24_1MBPS
#define MY_NODE_ID 200
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define CHILD_ID_BATTERY 25
#define MY_SIGNAL_REPORT_ENABLED
// Enable and select radio type attached
#define MY_RADIO_RF24
#include <MySensors.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define SKETCH_NAME "MC Pulse & Temp"
#define SKETCH_VERSION "1.0.6"
#define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your light sensor. (Only 2 and 3 generates interrupt!)
#define PULSE_FACTOR 1000 // Number of blinks per of your meter
#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 filters outliers.
#define PULSE_CHILD_ID 4
#define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS 5 // Pin where dallas sensor is connected
#define MAX_ATTACHED_DS18B20 3
unsigned long SLEEP_TIME = 50000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);
MyMessage msgbatt(CHILD_ID_BATTERY, V_VOLTAGE);
/************************************************************/
uint32_t SEND_FREQUENCY =
20000; // Minimum time between send (in milliseconds). We don't want to spam the gateway.
double ppwh = ((double)PULSE_FACTOR)/1000; // Pulses per watt hour
bool pcReceived = false;
volatile uint32_t pulseCount = 0;
volatile uint32_t lastBlink = 0;
volatile uint32_t watt = 0;
uint32_t oldPulseCount = 0;
uint32_t oldWatt = 0;
double oldkWh;
uint32_t lastSend;
MyMessage wattMsg(PULSE_CHILD_ID,V_WATT);
MyMessage kWhMsg(PULSE_CHILD_ID,V_KWH);
MyMessage pcMsg(PULSE_CHILD_ID,V_VAR1);
/////////////////////////////////////////////////
// Enable REPORT_BATTERY_LEVEL to measure battery level and send changes to gateway
#define REPORT_BATTERY_LEVEL
#ifdef REPORT_BATTERY_LEVEL
#include <Vcc.h>
static uint8_t oldBatteryPcnt = 200; // Initialize to 200 to assure first time value will be sent.
const float VccMin = 1.8; // Minimum expected Vcc level, in Volts: Brownout at 1.8V -> 0%
const float VccMax = 2.0*1.6; // Maximum expected Vcc level, in Volts: 2xAA fresh Alkaline -> 100%
const float VccCorrection = 1.0; // Measured Vcc by multimeter divided by reported Vcc
static Vcc vcc(VccCorrection);
#endif
/////////////////////////////////////////////////
void before()
{
// Startup up the OneWire library
sensors.begin();
}
void setup()
{
// Fetch last known pulse count value from gw
request(PULSE_CHILD_ID, V_VAR1);
// Use the internal pullup to be able to hook up this sketch directly to an energy meter with S0 output
// If no pullup is used, the reported usage will be too high because of the floating pin
pinMode(DIGITAL_INPUT_SENSOR,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), onPulse, RISING);
lastSend=millis();
// requestTemperatures() will not block current thread
sensors.setWaitForConversion(false);
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(SKETCH_NAME, SKETCH_VERSION);
present(PULSE_CHILD_ID, S_POWER);
// Fetch the number of attached temperature sensors
numSensors = sensors.getDeviceCount();
// Present all temperature sensors to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
present(i, S_TEMP);
}
//present voltage sensor
//present(CHILD_ID_BATTERY, S_MULTIMETER);
}
int16_t millisToWaitForConversion(uint8_t bitResolution)
{
switch (bitResolution)
{
case 9:
return 94;
case 10:
return 188;
case 11:
return 375;
default:
return 750;
}
}
void loop()
{
uint32_t 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 don't get unreasonable large watt value.
// could happen when long wraps or false interrupt triggered
if (watt<((uint32_t)MAX_WATT)) {
send(wattMsg.set(watt)); // Send watt value to gw
}
Serial.print("Watt:");
Serial.println(watt);
oldWatt = watt;
}
// Pulse count value has changed
if (pulseCount != oldPulseCount) {
send(pcMsg.set(pulseCount)); // Send pulse count value to gw
double kWh = ((double)pulseCount/((double)PULSE_FACTOR));
oldPulseCount = pulseCount;
if (kWh != oldkWh) {
send(kWhMsg.set(kWh, 4)); // Send kWh value to gw
oldkWh = kWh;
}
}
lastSend = now;
} else if (sendTime && !pcReceived) {
// No pulse count value received. Try requesting it again
request(PULSE_CHILD_ID, V_VAR1);
lastSend=now;
}
if (SLEEP_MODE) {
sleep(SEND_FREQUENCY);
}
// Fetch temperatures from Dallas sensors
sensors.requestTemperatures();
// query conversion time and sleep until conversion completed
int16_t conversionTime = millisToWaitForConversion(sensors.getResolution());
// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
sleep(conversionTime);
// Read temperatures and send them to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
// Fetch and round temperature to one decimal
float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
// Only send data if temperature has changed and no error
#if COMPARE_TEMP == 1
if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
#else
if (temperature != -127.00 && temperature != 85.00) {
#endif
// Send in the new temperature
send(msg.setSensor(i).set(temperature,1));
// Save new temperatures for next compare
lastTemperature[i]=temperature;
}
}
/***************************************************************************************************************************************/
#ifdef REPORT_BATTERY_LEVEL
const uint8_t batteryPcnt = static_cast<uint8_t>(0.5 + vcc.Read_Perc(VccMin, VccMax));
#ifdef MY_DEBUG
Serial.print(F("Vbat "));
Serial.print(vcc.Read_Volts());
Serial.print(F("\tPerc "));
Serial.println(batteryPcnt);
#endif
// Battery readout should only go down. So report only when new value is smaller than previous one.
if ( batteryPcnt < oldBatteryPcnt )
{
sendBatteryLevel(batteryPcnt);
oldBatteryPcnt = batteryPcnt;
}
#endif
/********************************************************************************************************************************/
//send(msgbatt.set(batteryV ,2));
smartSleep(SLEEP_TIME);
}
void receive(const MyMessage &message)
{
if (message.type==V_VAR1) {
pulseCount = oldPulseCount = message.getLong();
Serial.print("Received last pulse count value from gw:");
Serial.println(pulseCount);
pcReceived = true;
}
}
void onPulse()
{
if (!SLEEP_MODE) {
uint32_t newBlink = micros();
uint32_t interval = newBlink-lastBlink;
if (interval<10000L) { // Sometimes we get interrupt on RISING
return;
}
watt = (3600000000.0 /interval) / ppwh;
lastBlink = newBlink;
}
pulseCount++;
}
Logs
Wifi Gateway
MCO:BGN:INIT GW,CP=RNNGE---,REL=255,VER=2.3.1
109 TSF:LRT:OK
125 TSM:INIT
138 TSF:WUR:MS=0
162 TSM:INIT:TSP OK
183 TSM:INIT:GW MODE
205 TSM:READY:ID=0,PAR=0,DIS=0
237 MCO:REG:NOT NEEDED
scandone
350 TSM:READY:NWD REQ
2626 TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK:
2700 GWT:TPC:CONNECTING...
3228 GWT:TPC:CONNECTING...
3756 GWT:TPC:CONNECTING...
4284 GWT:TPC:CONNECTING...
4812 GWT:TPC:CONNECTING...
5340 GWT:TPC:CONNECTING...
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 2
cnt
connected with wifi_ssid, channel 13
dhcp client start...
6965 GWT:TPC:CONNECTING...
7493 GWT:TPC:CONNECTING...
8021 GWT:TPC:CONNECTING...
ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
8549 GWT:TPC:CONNECTING...
8577 GWT:TPC:IP=192.168.1.15
8608 MCO:BGN:STP
Ready
IP address: 192.168.1.15
8628 MCO:BGN:INIT OK,TSP=1
8688 GWT:TPC:IP=192.168.1.15
8719 GWT:RMQ:MQTT RECONNECT
8761 GWT:RMQ:MQTT CONNECTED
8791 GWT:TPS:TOPIC=sensors-out/0/255/0/0/18,MSG SENT
8847 GWT:TPS:TOPIC=sensors-out/0/255/3/0/11,MSG SENT
8903 GWT:TPS:TOPIC=sensors-out/0/255/3/0/12,MSG SENT
pm open,type:2 0
18609 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
18671 TSF:MSG:BC
18689 TSF:MSG:FPAR REQ,ID=200
18721 TSF:PNG:SEND,TO=0
18746 TSF:CKU:OK
18764 TSF:MSG:GWL OK
21385 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
22703 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
22766 TSF:MSG:BC
22783 TSF:MSG:FPAR REQ,ID=200
22815 TSF:CKU:OK,FCTRL
22839 TSF:MSG:GWL OK
25439 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
52218 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=1,l=1,sg=0:119
52284 TSF:MSG:BC
52302 TSF:MSG:FPAR REQ,ID=200
52333 TSF:PNG:SEND,TO=0
52359 TSF:CKU:OK
52376 TSF:MSG:GWL OK
...
95174 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
95947 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
96010 TSF:MSG:BC
96028 TSF:MSG:FPAR REQ,ID=200
96059 TSF:CKU:OK,FCTRL
96083 TSF:MSG:GWL OK
...
...
313918 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
313997 TSF:MSG:READ,10-10-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
314059 TSF:MSG:BC
314078 TSF:MSG:FPAR REQ,ID=10
314109 TSF:CKU:OK,FCTRL
314134 TSF:MSG:GWL OK
317217 !TSF:MSG:SEND,0-0-10-10,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
324923 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
324987 TSF:MSG:BC
325006 TSF:MSG:FPAR REQ,ID=200
325039 TSF:PNG:SEND,TO=0
325065 TSF:CKU:OK
325084 TSF:MSG:GWL OK
...
368945 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
369025 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=1,l=1,sg=0:0
369090 TSF:MSG:BC
369109 TSF:MSG:FPAR REQ,ID=200
369141 TSF:CKU:OK,FCTRL
369166 TSF:MSG:GWL OK
371985 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
372065 TSF:MSG:READ,10-10-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
372127 TSF:MSG:BC
372145 TSF:MSG:FPAR REQ,ID=10
372177 TSF:CKU:OK,FCTRL
372202 TSF:MSG:GWL OK
Second Node
__ __ ____
| \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| | | | |_| |___| | __/ | | \__ \ _ | | \__ \
|_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/
|___/ 2.3.1
16 MCO:BGN:INIT NODE,CP=RNNNA---,REL=255,VER=2.3.1
26 MCO:BGN:BFR
43 TSM:INIT
44 TSF:WUR:MS=0
51 TSM:INIT:TSP OK
53 TSM:INIT:STATID=200
55 TSF:SID:OK,ID=200
57 TSM:FPAR
93 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
2101 !TSM:FPAR:NO REPLY
2103 TSM:FPAR
2139 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
4147 !TSM:FPAR:NO REPLY
4149 TSM:FPAR
4185 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
6193 !TSM:FPAR:NO REPLY
6195 TSM:FPAR
6231 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
8239 !TSM:FPAR:FAIL
8240 TSM:FAIL:CNT=1
8242 TSM:FAIL:DIS
8244 TSF:TDI:TSL
18246 TSM:FAIL:RE-INIT
18248 TSM:INIT
18254 TSM:INIT:TSP OK
18256 TSM:INIT:STATID=200
18259 TSF:SID:OK,ID=200
18262 TSM:FPAR
18298 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
20307 !TSM:FPAR:NO REPLY
20310 TSM:FPAR
20346 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
22354 !TSM:FPAR:NO REPLY
22356 TSM:FPAR
22393 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
24401 !TSM:FPAR:NO REPLY
24403 TSM:FPAR
24440 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
26447 !TSM:FPAR:FAIL
26448 TSM:FAIL:CNT=2
26450 TSM:FAIL:DIS
26452 TSF:TDI:TSL
36456 TSM:FAIL:RE-INIT
36458 TSM:INIT
36464 TSM:INIT:TSP OK
36466 TSM:INIT:STATID=200
36469 TSF:SID:OK,ID=200
36471 TSM:FPAR
36508 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
38516 !TSM:FPAR:NO REPLY
38518 TSM:FPAR
38555 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
40562 !TSM:FPAR:NO REPLY
40564 TSM:FPAR
40601 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
42608 !TSM:FPAR:NO REPLY
42610 TSM:FPAR
42647 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
44654 !TSM:FPAR:FAIL
44655 TSM:FAIL:CNT=3
44657 TSM:FAIL:DIS
44659 TSF:TDI:TSL
54662 TSM:FAIL:RE-INIT
54664 TSM:INIT
54670 TSM:INIT:TSP OK
54672 TSM:INIT:STATID=200
54675 TSF:SID:OK,ID=200
54677 TSM:FPAR
54714 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
56721 !TSM:FPAR:NO REPLY
56723 TSM:FPAR
56760 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
58767 !TSM:FPAR:NO REPLY
58769 TSM:FPAR
58806 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
60813 !TSM:FPAR:NO REPLY
60815 TSM:FPAR
60852 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
62859 !TSM:FPAR:FAIL
62860 TSM:FAIL:CNT=4
62862 TSM:FAIL:DIS
62864 TSF:TDI:TSL
72867 TSM:FAIL:RE-INIT
72869 TSM:INIT
72876 TSM:INIT:TSP OK
72878 TSM:INIT:STATID=200
72881 TSF:SID:OK,ID=200
72883 TSM:FPAR
72920 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
74927 !TSM:FPAR:NO REPLY
74929 TSM:FPAR
74966 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
76973 !TSM:FPAR:NO REPLY
76975 TSM:FPAR
77011 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
79019 !TSM:FPAR:NO REPLY
79021 TSM:FPAR
79057 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
81065 !TSM:FPAR:FAIL
81068 TSM:FAIL:CNT=5
81069 TSM:FAIL:DIS
81071 TSF:TDI:TSL
91074 TSM:FAIL:RE-INIT
91076 TSM:INIT
91082 TSM:INIT:TSP OK
91084 TSM:INIT:STATID=200
91087 TSF:SID:OK,ID=200
91089 TSM:FPAR
91126 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
93134 !TSM:FPAR:NO REPLY
93136 TSM:FPAR
93173 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
95180 !TSM:FPAR:NO REPLY
95182 TSM:FPAR
95219 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
97226 !TSM:FPAR:NO REPLY
97228 TSM:FPAR
97265 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
99272 !TSM:FPAR:FAIL
99273 TSM:FAIL:CNT=6
99275 TSM:FAIL:DIS
99277 TSF:TDI:TSL
109280 TSM:FAIL:RE-INIT
109282 TSM:INIT
109288 TSM:INIT:TSP OK
109291 TSM:INIT:STATID=200
109293 TSF:SID:OK,ID=200
109296 TSM:FPAR
109333 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
111340 !TSM:FPAR:NO REPLY
111342 TSM:FPAR
111379 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
113387 !TSM:FPAR:NO REPLY
113389 TSM:FPAR
113426 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
115434 !TSM:FPAR:NO REPLY
115436 TSM:FPAR
115473 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
117481 !TSM:FPAR:FAIL
117483 TSM:FAIL:CNT=7
117485 TSM:FAIL:DIS
117487 TSF:TDI:TSL
177489 TSM:FAIL:RE-INIT
177491 TSM:INIT
177498 TSM:INIT:TSP OK
177501 TSM:INIT:STATID=200
177503 TSF:SID:OK,ID=200
177506 TSM:FPAR
177543 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
179550 !TSM:FPAR:NO REPLY
179552 TSM:FPAR
179589 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
181597 !TSM:FPAR:NO REPLY
181599 TSM:FPAR
181636 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
183644 !TSM:FPAR:NO REPLY
183646 TSM:FPAR
183683 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
185691 !TSM:FPAR:FAIL
185693 TSM:FAIL:CNT=7
185695 TSM:FAIL:DIS
185697 TSF:TDI:TSL
245699 TSM:FAIL:RE-INIT
245701 TSM:INIT
245707 TSM:INIT:TSP OK
245710 TSM:INIT:STATID=200
245712 TSF:SID:OK,ID=200
245715 TSM:FPAR
W5100 Ethernet Gateway
For some reason the ethernet gateway does not start if I have a serial debug window open, so here is the MQTT log.
sensors-out/0/255/0/0/18 2.3.1
sensors-out/10/255/4/0/0 02002B004003DC920103
sensors-out/10/255/4/0/0 02002B004003DC920103
sensors-out/0/255/0/0/18 2.3.1
sensors-out/10/255/0/0/17 2.3.1
sensors-out/10/255/3/0/6 0
sensors-in/10/255/3/0/6 M
sensors-out/10/255/3/0/11 Temperature Sensor
sensors-out/10/255/3/0/12 2.3.0
sensors-out/10/0/0/0/6 (null)
sensors-out/10/5/0/0/30 (null)
sensors-out/10/0/1/0/0 21.6
gelatitalia/freezer3/temperature 21.6
sensors-out/10/255/3/0/0 83
sensors-out/10/255/3/0/32 500
sensors-out/200/255/0/0/17 2.3.1
sensors-out/200/255/3/0/6 0
sensors-in/200/255/3/0/6 M
sensors-out/200/255/3/0/11 MC Pulse & Temp
sensors-out/200/255/3/0/12 1.0.6
sensors-out/200/4/0/0/13 (null)
sensors-out/200/4/2/0/24 (null)
sensors-out/200/255/3/0/0 100
sensors-out/200/255/3/0/32 500
WiFi gateway log after ethernet has assigned parent
While both nodes were asleep, I disconnected the ethernet gateway and powered the ESP8266
Jun 28 16:34:06 Ȥl���$$rZ�@>h��â¡ï¿½53 MCO:BGN:INIT GW,CP=RNNGE---,REL=255,VER=2.3.1
Jun 28 16:34:06 104 TSF:LRT:OK
Jun 28 16:34:06 120 TSM:INIT
Jun 28 16:34:06 134 TSF:WUR:MS=0
Jun 28 16:34:06 157 TSM:INIT:TSP OK
Jun 28 16:34:06 178 TSM:INIT:GW MODE
Jun 28 16:34:06 200 TSM:READY:ID=0,PAR=0,DIS=0
Jun 28 16:34:06 233 MCO:REG:NOT NEEDED
Jun 28 16:34:06 ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
Jun 28 16:34:06 scandone
Jun 28 16:34:06 261 TSM:READY:NWD REQ
Jun 28 16:34:08 2588 TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK:
Jun 28 16:34:08 scandone
Jun 28 16:34:09 state: 0 -> 2 (b0)
Jun 28 16:34:09 state: 2 -> 3 (0)
Jun 28 16:34:09 state: 3 -> 5 (10)
Jun 28 16:34:09 add 0
Jun 28 16:34:09 aid 1
Jun 28 16:34:09 cnt
Jun 28 16:34:09
Jun 28 16:34:09 connected with wifi_ssid, channel 13
Jun 28 16:34:09 ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
Jun 28 16:34:09 2838 GWT:TPC:CONNECTING...
Jun 28 16:34:09 2866 GWT:TPC:IP=192.168.1.15
Jun 28 16:34:09 2897 MCO:BGN:STP
Jun 28 16:34:09 Ready
Jun 28 16:34:09 IP address: 192.168.1.15
Jun 28 16:34:09 2916 MCO:BGN:INIT OK,TSP=1
Jun 28 16:34:09 2977 GWT:TPC:IP=192.168.1.15
Jun 28 16:34:09 3008 GWT:RMQ:MQTT RECONNECT
Jun 28 16:34:09 3609 GWT:RMQ:MQTT CONNECTED
Jun 28 16:34:10 3639 GWT:TPS:TOPIC=sensors-out/0/255/0/0/18,MSG SENT
Jun 28 16:34:10 3695 GWT:TPS:TOPIC=sensors-out/0/255/3/0/11,MSG SENT
Jun 28 16:34:10 3751 GWT:TPS:TOPIC=sensors-out/0/255/3/0/12,MSG SENT
Jun 28 16:34:18 pm open,type:2 0
Jun 28 16:34:31 25601 TSF:MSG:READ,200-200-0,s=255,c=3,t=33,pt=5,l=4,sg=0:50000
Jun 28 16:34:32 25668 GWT:TPS:TOPIC=sensors-out/200/255/3/0/33,MSG SENT
Jun 28 16:34:32 25749 TSF:MSG:READ,200-200-0,s=255,c=3,t=32,pt=5,l=4,sg=0:500
Jun 28 16:34:32 25814 GWT:TPS:TOPIC=sensors-out/200/255/3/0/32,MSG SENT
Jun 28 16:35:01 55299 TSF:MSG:READ,10-10-0,s=255,c=3,t=33,pt=5,l=4,sg=0:60000
Jun 28 16:35:01 55364 GWT:TPS:TOPIC=sensors-out/10/255/3/0/33,MSG SENT
Jun 28 16:35:02 56152 TSF:MSG:READ,10-10-0,s=0,c=1,t=0,pt=7,l=5,sg=0:22.4
Jun 28 16:35:02 56213 GWT:TPS:TOPIC=sensors-out/10/0/1/0/0,MSG SENT
Jun 28 16:35:02 56268 TSF:MSG:READ,10-10-0,s=255,c=3,t=32,pt=5,l=4,sg=0:500
Jun 28 16:35:02 56331 GWT:TPS:TOPIC=sensors-out/10/255/3/0/32,MSG SENT
@mfalkvidd Turns out I didn't completely destroy my second ESP8266.
Breadboarded a new gateway and it works fine. So I guess the radio is shot.
Busy working up a much neater PCB with replaceable components to etch.
Thanks for your help.
Etched and soldered a new gateway after the original one I had failed.
From my limited use with sensors other then temperature, sometimes items don't appear in the GUI on Home Assistant until they send some data.
Also check in the States section of Developer Tools at what data HA has acquired from your sensor.
Beyond that, you might have to ask on the Home Assistant forums.
@mfalkvidd Turns out I didn't completely destroy my second ESP8266.
Breadboarded a new gateway and it works fine. So I guess the radio is shot.
Busy working up a much neater PCB with replaceable components to etch.
Thanks for your help.
Are you using a relatively recent build of Home Assistant?
Check in the Unused Entities section for your sensor. I think home assistant no longer adds discovered devices to the front-end by default.
@mfalkvidd Thanks. While trying to debug this, I've seen a number of posts where somebody asks for logs or more details from the OP. Thought I'd save some time.
What I don't get is that it only fails to sent the FPAR response. Although maybe it's not sending any data at all, only receiving.
Do gateways usually send any data or ack to a node or just receive and forward?
I have noticed that it also does not seem to be receiving the bootloader firmware requests on node startup either.
This is a picture of my gateway. Since replacing the radio is so difficult, I'll probably have to build a new one. Too bad i damaged my backup ESP while trying to debug this on a breadboard.
Any recommendations on placement of the two modules?
Hi everybody,
Having a weird issue with my WiFi gateway. My nodes get FPAR:NO REPLY consistently when they start up. If i use another gateway, they work immediately.
If I switch gateways to the WiFi after the nodes have a parent and are asleep, it works fine. I had it run like that the whole weekend with no issues so I doubt it's a radio problem.
Unfortunately when I built the gateway, I didn't have an 8pin DIL socket so I had to solder the radio in place, making testing out with another very difficult.
I've tried with vesion 2.3.1 as well as the dev branch from github.
Background
This Gateway has been working for over a year with a temperature sensor node on a ATMEGA168 Seeduino arduino board. Both were running MySensors 2.1.1.
I decided to replace the arduino with a dedicated board I made with a ATMEGA328 running at 8Mhz using the MYSBootloader.
After soldering up the board, I loaded the sketch with MySensors 2.3.1 and tested with an Ethernet Gateway on my Arduino Duemilanove.
When it worked fine for a couple of days, I upgraded the Wifi gateway to 2.3.1 as well.
Original node connected to the Wifi gateway and ran fo another few days while I made a case for the new node.
When I switched the nodes, the new one would not connect. Power cycled both but no dice. Both are located in awkward positions so I removed them, flased each with the Clear EEPROM sketch and reloaded firmware but still no connection.
Also tried with a 16Mhz board with MYSBootloader because I didn't solder headers to the 8Mhz board for serial and it became a pain to pull the chip out to flash.
My setup:
Wifi Gateway:
ESP8266 12-E with a NRF24L2401+
5v power supply with a HT7833 on the ESP8266 with a 100 nF Bypass across VCC and Gnd.
AMS1117 on the NRF24L01+ with a 4.7uF Electrolytical Bypass Cap (Added a 100uF as well in testing while trying to debug)
DS18B20 Temperature Node
ATMEGA328 with MYSBootlader @ 8Mhz internal powered with a 5v Regulated Wall Wart power supply.
AMS1117 regulator for the NRF24L01+ with 47uF Bypass Capacitor.
Second test node
ATMEGA328 with MYSBootlader @ 16Mhz crystal oscillator powered with a 5v Regulated power bank.
AMS1117 regulator for the NRF24L01+ with 47uF Bypass Capacitor.
WIFI Gateway Sketch
// Enable debug prints to serial monitor
#define MY_DEBUG
//#define MY_DEBUG_VERBOSE_RF24
#define MY_DEBUG_VERBOSE_GATEWAY
// Use a bit lower baudrate for serial prints on ESP8266 than default in MyConfig.h
#define MY_BAUD_RATE 9600
//#define MY_RF24_CHANNEL 26
//#define MY_RF24_DATARATE RF24_250KBPS
//#define MY_RF24_DATARATE RF24_1MBPS
// Enables and select radio type (if attached)
#define MY_RADIO_RF24
#define MY_GATEWAY_MQTT_CLIENT
#define MY_GATEWAY_ESP8266
// Set this node's subscribe and publish topic prefix
#define MY_MQTT_PUBLISH_TOPIC_PREFIX "sensors-out"
#define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "sensors-in"
// Set MQTT client id
#define MY_MQTT_CLIENT_ID "mysensors-esp"
// Set WIFI SSID and password
#define MY_WIFI_SSID "wifi_ssid"
#define MY_WIFI_PASSWORD "wifi_password"
// Set the hostname for the WiFi Client. This is the hostname
// it will pass to the DHCP server if not static.
#define MY_HOSTNAME "mqtt-sensor-gateway"
// Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP)
#define MY_IP_ADDRESS 192,168,1,15
// If using static ip you need to define Gateway and Subnet address as well
#define MY_IP_GATEWAY_ADDRESS 192,168,1,1
#define MY_IP_SUBNET_ADDRESS 255,255,255,0
// MQTT broker ip address.
#define MY_CONTROLLER_IP_ADDRESS 192, 168, 1, 2
// The MQTT broker port to to open
#define MY_PORT 1883
// Set blinking period
//#define MY_DEFAULT_LED_BLINK_PERIOD 100
// Flash leds on rx/tx/err
//Pin 2 is the PCB, on board LED
//#define MY_DEFAULT_ERR_LED_PIN 5 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 2 // Receive led pin
//#define MY_DEFAULT_TX_LED_PIN 16 //
#include <ESP8266WiFi.h>
#include <MySensors.h>
#include <ArduinoOTA.h>
void setup()
{
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Setup locally attached sensors
ArduinoOTA.onStart([]() {
Serial.println("ArduinoOTA start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nArduinoOTA end");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("OTA Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
}
void presentation()
{
// Present locally attached sensors here
sendSketchInfo("ESP-MC Gateway", "1.2.3", 0);
}
void loop()
{
// Send locally attech sensors data here
wdt_disable();
ArduinoOTA.handle();
}
Temperature Node Sketch
// Enable debug prints to serial monitor
//#define MY_DEBUG
//#define MY_RF24_CHANNEL 26
//#define MY_RF24_DATARATE RF24_250KBPS
//#define MY_RF24_DATARATE RF24_1MBPS
#define MY_SKETCH_NAME "Temperature Sensor"
#define MY_SKETCH_VERSION "2.3.2"
#define MY_NODE_ID 10
#define MY_PARENT_ID 0
#define CHILD_ID_BATTERY 5
// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_DEFAULT_LED_BLINK_PERIOD 50
//#define MY_WITH_LEDS_BLINKING_INVERSE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 100
// Flash leds on rx/tx/err
// Uncomment to override default HW configurations
#define MY_DEFAULT_ERR_LED_PIN 5 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin
#define MY_DEFAULT_TX_LED_PIN 4 // Transmit led pin
#include <MySensors.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected
#define MAX_ATTACHED_DS18B20 3
unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);
//MyMessage msgbatt(CHILD_ID_BATTERY, V_VOLTAGE);
/////////////////////////////////////////////////
int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
int oldBatteryPcnt = 0;
/////////////////////////////////////////////////
void before()
{
// Startup up the OneWire library
sensors.begin();
}
void setup()
{
// requestTemperatures() will not block current thread
sensors.setWaitForConversion(false);
///////////////////////////////////////////////
// use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
analogReference(INTERNAL1V1);
#else
analogReference(INTERNAL);
#endif
////////////////////////////////////////////////
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(MY_SKETCH_NAME, MY_SKETCH_VERSION);
// Fetch the number of attached temperature sensors
numSensors = sensors.getDeviceCount();
// Present all sensors to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
present(i, S_TEMP);
}
present(CHILD_ID_BATTERY, S_MULTIMETER);
}
int16_t millisToWaitForConversion(uint8_t bitResolution)
{
switch (bitResolution)
{
case 9:
return 94;
case 10:
return 188;
case 11:
return 375;
default:
return 750;
}
}
void loop()
{
// Fetch temperatures from Dallas sensors
sensors.requestTemperatures();
// query conversion time and sleep until conversion completed
int16_t conversionTime = millisToWaitForConversion(sensors.getResolution());
// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
sleep(conversionTime);
// Read temperatures and send them to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
// Fetch and round temperature to one decimal
float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
// Only send data if temperature has changed and no error
//Serial.print(temperature);
#if COMPARE_TEMP == 1
if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
#else
if (temperature != -127.00 && temperature != 85.00) {
#endif
// Send in the new temperature
send(msg.setSensor(i).set(temperature,1));
// Save new temperatures for next compare
lastTemperature[i]=temperature;
}
}
//////////////////////////////////////////////////////////////////////////
// get the battery Voltage
int sensorValue = analogRead(BATTERY_SENSE_PIN);
#ifdef MY_DEBUG
Serial.print("Sensor Reading: ");
Serial.print(sensorValue);
Serial.print(" --> modified to -->> ");
Serial.print(sensorValue*5.5);
Serial.println(" bits");
#endif
// sensorValue = sensorValue * 5.5;
// 1M, 470K divider across battery and using internal ADC ref of 1.1V
// Sense point is bypassed with 0.1 uF cap to reduce noise at that point
// ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
// 3.44/1023 = Volts per bit = 0.003363075
int batteryPcnt = sensorValue / 10;
// ((1M+220k)/220K)*1.1 = Vmax = 6.1 Volts
// 6.1/1023 = Volts per bit = 0.005962854
// // ((220k+1M)/1M)*1.1 = Vmax = 6.1 Volts // incorrect resistors
// // 1.342/1023 = Volts per bit = 0.001311827 // incorrect resistors
// float batteryV = sensorValue * 0.00498533724; // incorrect resistors
float batteryV = sensorValue * 0.00593824228;
#ifdef MY_DEBUG
Serial.print("Battery Voltage: ");
Serial.print(batteryV);
Serial.println(" V");
Serial.print("Battery percent: ");
Serial.print(batteryPcnt);
Serial.println(" %");
#endif
if (oldBatteryPcnt != batteryPcnt) {
// Power up radio after sleep
sendBatteryLevel(batteryPcnt);
oldBatteryPcnt = batteryPcnt;
// send(msgbatt.set(batteryV ,2));
}
//////////////////////////////////////////////////////////////////////////
smartSleep(SLEEP_TIME);
}
16Mhz test Node sketch
// Enable debug prints to serial monitor
#define MY_DEBUG
//#define MY_RF24_CHANNEL 76
//#define MY_RF24_DATARATE RF24_250KBPS
//#define MY_RF24_DATARATE RF24_1MBPS
#define MY_NODE_ID 200
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define CHILD_ID_BATTERY 25
#define MY_SIGNAL_REPORT_ENABLED
// Enable and select radio type attached
#define MY_RADIO_RF24
#include <MySensors.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define SKETCH_NAME "MC Pulse & Temp"
#define SKETCH_VERSION "1.0.6"
#define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your light sensor. (Only 2 and 3 generates interrupt!)
#define PULSE_FACTOR 1000 // Number of blinks per of your meter
#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 filters outliers.
#define PULSE_CHILD_ID 4
#define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS 5 // Pin where dallas sensor is connected
#define MAX_ATTACHED_DS18B20 3
unsigned long SLEEP_TIME = 50000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);
MyMessage msgbatt(CHILD_ID_BATTERY, V_VOLTAGE);
/************************************************************/
uint32_t SEND_FREQUENCY =
20000; // Minimum time between send (in milliseconds). We don't want to spam the gateway.
double ppwh = ((double)PULSE_FACTOR)/1000; // Pulses per watt hour
bool pcReceived = false;
volatile uint32_t pulseCount = 0;
volatile uint32_t lastBlink = 0;
volatile uint32_t watt = 0;
uint32_t oldPulseCount = 0;
uint32_t oldWatt = 0;
double oldkWh;
uint32_t lastSend;
MyMessage wattMsg(PULSE_CHILD_ID,V_WATT);
MyMessage kWhMsg(PULSE_CHILD_ID,V_KWH);
MyMessage pcMsg(PULSE_CHILD_ID,V_VAR1);
/////////////////////////////////////////////////
// Enable REPORT_BATTERY_LEVEL to measure battery level and send changes to gateway
#define REPORT_BATTERY_LEVEL
#ifdef REPORT_BATTERY_LEVEL
#include <Vcc.h>
static uint8_t oldBatteryPcnt = 200; // Initialize to 200 to assure first time value will be sent.
const float VccMin = 1.8; // Minimum expected Vcc level, in Volts: Brownout at 1.8V -> 0%
const float VccMax = 2.0*1.6; // Maximum expected Vcc level, in Volts: 2xAA fresh Alkaline -> 100%
const float VccCorrection = 1.0; // Measured Vcc by multimeter divided by reported Vcc
static Vcc vcc(VccCorrection);
#endif
/////////////////////////////////////////////////
void before()
{
// Startup up the OneWire library
sensors.begin();
}
void setup()
{
// Fetch last known pulse count value from gw
request(PULSE_CHILD_ID, V_VAR1);
// Use the internal pullup to be able to hook up this sketch directly to an energy meter with S0 output
// If no pullup is used, the reported usage will be too high because of the floating pin
pinMode(DIGITAL_INPUT_SENSOR,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), onPulse, RISING);
lastSend=millis();
// requestTemperatures() will not block current thread
sensors.setWaitForConversion(false);
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(SKETCH_NAME, SKETCH_VERSION);
present(PULSE_CHILD_ID, S_POWER);
// Fetch the number of attached temperature sensors
numSensors = sensors.getDeviceCount();
// Present all temperature sensors to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
present(i, S_TEMP);
}
//present voltage sensor
//present(CHILD_ID_BATTERY, S_MULTIMETER);
}
int16_t millisToWaitForConversion(uint8_t bitResolution)
{
switch (bitResolution)
{
case 9:
return 94;
case 10:
return 188;
case 11:
return 375;
default:
return 750;
}
}
void loop()
{
uint32_t 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 don't get unreasonable large watt value.
// could happen when long wraps or false interrupt triggered
if (watt<((uint32_t)MAX_WATT)) {
send(wattMsg.set(watt)); // Send watt value to gw
}
Serial.print("Watt:");
Serial.println(watt);
oldWatt = watt;
}
// Pulse count value has changed
if (pulseCount != oldPulseCount) {
send(pcMsg.set(pulseCount)); // Send pulse count value to gw
double kWh = ((double)pulseCount/((double)PULSE_FACTOR));
oldPulseCount = pulseCount;
if (kWh != oldkWh) {
send(kWhMsg.set(kWh, 4)); // Send kWh value to gw
oldkWh = kWh;
}
}
lastSend = now;
} else if (sendTime && !pcReceived) {
// No pulse count value received. Try requesting it again
request(PULSE_CHILD_ID, V_VAR1);
lastSend=now;
}
if (SLEEP_MODE) {
sleep(SEND_FREQUENCY);
}
// Fetch temperatures from Dallas sensors
sensors.requestTemperatures();
// query conversion time and sleep until conversion completed
int16_t conversionTime = millisToWaitForConversion(sensors.getResolution());
// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
sleep(conversionTime);
// Read temperatures and send them to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
// Fetch and round temperature to one decimal
float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
// Only send data if temperature has changed and no error
#if COMPARE_TEMP == 1
if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
#else
if (temperature != -127.00 && temperature != 85.00) {
#endif
// Send in the new temperature
send(msg.setSensor(i).set(temperature,1));
// Save new temperatures for next compare
lastTemperature[i]=temperature;
}
}
/***************************************************************************************************************************************/
#ifdef REPORT_BATTERY_LEVEL
const uint8_t batteryPcnt = static_cast<uint8_t>(0.5 + vcc.Read_Perc(VccMin, VccMax));
#ifdef MY_DEBUG
Serial.print(F("Vbat "));
Serial.print(vcc.Read_Volts());
Serial.print(F("\tPerc "));
Serial.println(batteryPcnt);
#endif
// Battery readout should only go down. So report only when new value is smaller than previous one.
if ( batteryPcnt < oldBatteryPcnt )
{
sendBatteryLevel(batteryPcnt);
oldBatteryPcnt = batteryPcnt;
}
#endif
/********************************************************************************************************************************/
//send(msgbatt.set(batteryV ,2));
smartSleep(SLEEP_TIME);
}
void receive(const MyMessage &message)
{
if (message.type==V_VAR1) {
pulseCount = oldPulseCount = message.getLong();
Serial.print("Received last pulse count value from gw:");
Serial.println(pulseCount);
pcReceived = true;
}
}
void onPulse()
{
if (!SLEEP_MODE) {
uint32_t newBlink = micros();
uint32_t interval = newBlink-lastBlink;
if (interval<10000L) { // Sometimes we get interrupt on RISING
return;
}
watt = (3600000000.0 /interval) / ppwh;
lastBlink = newBlink;
}
pulseCount++;
}
Logs
Wifi Gateway
MCO:BGN:INIT GW,CP=RNNGE---,REL=255,VER=2.3.1
109 TSF:LRT:OK
125 TSM:INIT
138 TSF:WUR:MS=0
162 TSM:INIT:TSP OK
183 TSM:INIT:GW MODE
205 TSM:READY:ID=0,PAR=0,DIS=0
237 MCO:REG:NOT NEEDED
scandone
350 TSM:READY:NWD REQ
2626 TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK:
2700 GWT:TPC:CONNECTING...
3228 GWT:TPC:CONNECTING...
3756 GWT:TPC:CONNECTING...
4284 GWT:TPC:CONNECTING...
4812 GWT:TPC:CONNECTING...
5340 GWT:TPC:CONNECTING...
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 2
cnt
connected with wifi_ssid, channel 13
dhcp client start...
6965 GWT:TPC:CONNECTING...
7493 GWT:TPC:CONNECTING...
8021 GWT:TPC:CONNECTING...
ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
8549 GWT:TPC:CONNECTING...
8577 GWT:TPC:IP=192.168.1.15
8608 MCO:BGN:STP
Ready
IP address: 192.168.1.15
8628 MCO:BGN:INIT OK,TSP=1
8688 GWT:TPC:IP=192.168.1.15
8719 GWT:RMQ:MQTT RECONNECT
8761 GWT:RMQ:MQTT CONNECTED
8791 GWT:TPS:TOPIC=sensors-out/0/255/0/0/18,MSG SENT
8847 GWT:TPS:TOPIC=sensors-out/0/255/3/0/11,MSG SENT
8903 GWT:TPS:TOPIC=sensors-out/0/255/3/0/12,MSG SENT
pm open,type:2 0
18609 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
18671 TSF:MSG:BC
18689 TSF:MSG:FPAR REQ,ID=200
18721 TSF:PNG:SEND,TO=0
18746 TSF:CKU:OK
18764 TSF:MSG:GWL OK
21385 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
22703 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
22766 TSF:MSG:BC
22783 TSF:MSG:FPAR REQ,ID=200
22815 TSF:CKU:OK,FCTRL
22839 TSF:MSG:GWL OK
25439 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
52218 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=1,l=1,sg=0:119
52284 TSF:MSG:BC
52302 TSF:MSG:FPAR REQ,ID=200
52333 TSF:PNG:SEND,TO=0
52359 TSF:CKU:OK
52376 TSF:MSG:GWL OK
...
95174 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
95947 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
96010 TSF:MSG:BC
96028 TSF:MSG:FPAR REQ,ID=200
96059 TSF:CKU:OK,FCTRL
96083 TSF:MSG:GWL OK
...
...
313918 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
313997 TSF:MSG:READ,10-10-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
314059 TSF:MSG:BC
314078 TSF:MSG:FPAR REQ,ID=10
314109 TSF:CKU:OK,FCTRL
314134 TSF:MSG:GWL OK
317217 !TSF:MSG:SEND,0-0-10-10,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
324923 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
324987 TSF:MSG:BC
325006 TSF:MSG:FPAR REQ,ID=200
325039 TSF:PNG:SEND,TO=0
325065 TSF:CKU:OK
325084 TSF:MSG:GWL OK
...
368945 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
369025 TSF:MSG:READ,200-200-255,s=255,c=3,t=7,pt=1,l=1,sg=0:0
369090 TSF:MSG:BC
369109 TSF:MSG:FPAR REQ,ID=200
369141 TSF:CKU:OK,FCTRL
369166 TSF:MSG:GWL OK
371985 !TSF:MSG:SEND,0-0-200-200,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
372065 TSF:MSG:READ,10-10-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
372127 TSF:MSG:BC
372145 TSF:MSG:FPAR REQ,ID=10
372177 TSF:CKU:OK,FCTRL
372202 TSF:MSG:GWL OK
Second Node
__ __ ____
| \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| | | | |_| |___| | __/ | | \__ \ _ | | \__ \
|_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/
|___/ 2.3.1
16 MCO:BGN:INIT NODE,CP=RNNNA---,REL=255,VER=2.3.1
26 MCO:BGN:BFR
43 TSM:INIT
44 TSF:WUR:MS=0
51 TSM:INIT:TSP OK
53 TSM:INIT:STATID=200
55 TSF:SID:OK,ID=200
57 TSM:FPAR
93 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
2101 !TSM:FPAR:NO REPLY
2103 TSM:FPAR
2139 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
4147 !TSM:FPAR:NO REPLY
4149 TSM:FPAR
4185 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
6193 !TSM:FPAR:NO REPLY
6195 TSM:FPAR
6231 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
8239 !TSM:FPAR:FAIL
8240 TSM:FAIL:CNT=1
8242 TSM:FAIL:DIS
8244 TSF:TDI:TSL
18246 TSM:FAIL:RE-INIT
18248 TSM:INIT
18254 TSM:INIT:TSP OK
18256 TSM:INIT:STATID=200
18259 TSF:SID:OK,ID=200
18262 TSM:FPAR
18298 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
20307 !TSM:FPAR:NO REPLY
20310 TSM:FPAR
20346 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
22354 !TSM:FPAR:NO REPLY
22356 TSM:FPAR
22393 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
24401 !TSM:FPAR:NO REPLY
24403 TSM:FPAR
24440 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
26447 !TSM:FPAR:FAIL
26448 TSM:FAIL:CNT=2
26450 TSM:FAIL:DIS
26452 TSF:TDI:TSL
36456 TSM:FAIL:RE-INIT
36458 TSM:INIT
36464 TSM:INIT:TSP OK
36466 TSM:INIT:STATID=200
36469 TSF:SID:OK,ID=200
36471 TSM:FPAR
36508 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
38516 !TSM:FPAR:NO REPLY
38518 TSM:FPAR
38555 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
40562 !TSM:FPAR:NO REPLY
40564 TSM:FPAR
40601 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
42608 !TSM:FPAR:NO REPLY
42610 TSM:FPAR
42647 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
44654 !TSM:FPAR:FAIL
44655 TSM:FAIL:CNT=3
44657 TSM:FAIL:DIS
44659 TSF:TDI:TSL
54662 TSM:FAIL:RE-INIT
54664 TSM:INIT
54670 TSM:INIT:TSP OK
54672 TSM:INIT:STATID=200
54675 TSF:SID:OK,ID=200
54677 TSM:FPAR
54714 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
56721 !TSM:FPAR:NO REPLY
56723 TSM:FPAR
56760 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
58767 !TSM:FPAR:NO REPLY
58769 TSM:FPAR
58806 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
60813 !TSM:FPAR:NO REPLY
60815 TSM:FPAR
60852 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
62859 !TSM:FPAR:FAIL
62860 TSM:FAIL:CNT=4
62862 TSM:FAIL:DIS
62864 TSF:TDI:TSL
72867 TSM:FAIL:RE-INIT
72869 TSM:INIT
72876 TSM:INIT:TSP OK
72878 TSM:INIT:STATID=200
72881 TSF:SID:OK,ID=200
72883 TSM:FPAR
72920 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
74927 !TSM:FPAR:NO REPLY
74929 TSM:FPAR
74966 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
76973 !TSM:FPAR:NO REPLY
76975 TSM:FPAR
77011 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
79019 !TSM:FPAR:NO REPLY
79021 TSM:FPAR
79057 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
81065 !TSM:FPAR:FAIL
81068 TSM:FAIL:CNT=5
81069 TSM:FAIL:DIS
81071 TSF:TDI:TSL
91074 TSM:FAIL:RE-INIT
91076 TSM:INIT
91082 TSM:INIT:TSP OK
91084 TSM:INIT:STATID=200
91087 TSF:SID:OK,ID=200
91089 TSM:FPAR
91126 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
93134 !TSM:FPAR:NO REPLY
93136 TSM:FPAR
93173 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
95180 !TSM:FPAR:NO REPLY
95182 TSM:FPAR
95219 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
97226 !TSM:FPAR:NO REPLY
97228 TSM:FPAR
97265 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
99272 !TSM:FPAR:FAIL
99273 TSM:FAIL:CNT=6
99275 TSM:FAIL:DIS
99277 TSF:TDI:TSL
109280 TSM:FAIL:RE-INIT
109282 TSM:INIT
109288 TSM:INIT:TSP OK
109291 TSM:INIT:STATID=200
109293 TSF:SID:OK,ID=200
109296 TSM:FPAR
109333 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
111340 !TSM:FPAR:NO REPLY
111342 TSM:FPAR
111379 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
113387 !TSM:FPAR:NO REPLY
113389 TSM:FPAR
113426 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
115434 !TSM:FPAR:NO REPLY
115436 TSM:FPAR
115473 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
117481 !TSM:FPAR:FAIL
117483 TSM:FAIL:CNT=7
117485 TSM:FAIL:DIS
117487 TSF:TDI:TSL
177489 TSM:FAIL:RE-INIT
177491 TSM:INIT
177498 TSM:INIT:TSP OK
177501 TSM:INIT:STATID=200
177503 TSF:SID:OK,ID=200
177506 TSM:FPAR
177543 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
179550 !TSM:FPAR:NO REPLY
179552 TSM:FPAR
179589 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
181597 !TSM:FPAR:NO REPLY
181599 TSM:FPAR
181636 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
183644 !TSM:FPAR:NO REPLY
183646 TSM:FPAR
183683 TSF:MSG:SEND,200-200-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
185691 !TSM:FPAR:FAIL
185693 TSM:FAIL:CNT=7
185695 TSM:FAIL:DIS
185697 TSF:TDI:TSL
245699 TSM:FAIL:RE-INIT
245701 TSM:INIT
245707 TSM:INIT:TSP OK
245710 TSM:INIT:STATID=200
245712 TSF:SID:OK,ID=200
245715 TSM:FPAR
W5100 Ethernet Gateway
For some reason the ethernet gateway does not start if I have a serial debug window open, so here is the MQTT log.
sensors-out/0/255/0/0/18 2.3.1
sensors-out/10/255/4/0/0 02002B004003DC920103
sensors-out/10/255/4/0/0 02002B004003DC920103
sensors-out/0/255/0/0/18 2.3.1
sensors-out/10/255/0/0/17 2.3.1
sensors-out/10/255/3/0/6 0
sensors-in/10/255/3/0/6 M
sensors-out/10/255/3/0/11 Temperature Sensor
sensors-out/10/255/3/0/12 2.3.0
sensors-out/10/0/0/0/6 (null)
sensors-out/10/5/0/0/30 (null)
sensors-out/10/0/1/0/0 21.6
gelatitalia/freezer3/temperature 21.6
sensors-out/10/255/3/0/0 83
sensors-out/10/255/3/0/32 500
sensors-out/200/255/0/0/17 2.3.1
sensors-out/200/255/3/0/6 0
sensors-in/200/255/3/0/6 M
sensors-out/200/255/3/0/11 MC Pulse & Temp
sensors-out/200/255/3/0/12 1.0.6
sensors-out/200/4/0/0/13 (null)
sensors-out/200/4/2/0/24 (null)
sensors-out/200/255/3/0/0 100
sensors-out/200/255/3/0/32 500
WiFi gateway log after ethernet has assigned parent
While both nodes were asleep, I disconnected the ethernet gateway and powered the ESP8266
Jun 28 16:34:06 Ȥl���$$rZ�@>h��â¡ï¿½53 MCO:BGN:INIT GW,CP=RNNGE---,REL=255,VER=2.3.1
Jun 28 16:34:06 104 TSF:LRT:OK
Jun 28 16:34:06 120 TSM:INIT
Jun 28 16:34:06 134 TSF:WUR:MS=0
Jun 28 16:34:06 157 TSM:INIT:TSP OK
Jun 28 16:34:06 178 TSM:INIT:GW MODE
Jun 28 16:34:06 200 TSM:READY:ID=0,PAR=0,DIS=0
Jun 28 16:34:06 233 MCO:REG:NOT NEEDED
Jun 28 16:34:06 ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
Jun 28 16:34:06 scandone
Jun 28 16:34:06 261 TSM:READY:NWD REQ
Jun 28 16:34:08 2588 TSF:MSG:SEND,0-0-255-255,s=255,c=3,t=20,pt=0,l=0,sg=0,ft=0,st=OK:
Jun 28 16:34:08 scandone
Jun 28 16:34:09 state: 0 -> 2 (b0)
Jun 28 16:34:09 state: 2 -> 3 (0)
Jun 28 16:34:09 state: 3 -> 5 (10)
Jun 28 16:34:09 add 0
Jun 28 16:34:09 aid 1
Jun 28 16:34:09 cnt
Jun 28 16:34:09
Jun 28 16:34:09 connected with wifi_ssid, channel 13
Jun 28 16:34:09 ip:192.168.1.15,mask:255.255.255.0,gw:192.168.1.1
Jun 28 16:34:09 2838 GWT:TPC:CONNECTING...
Jun 28 16:34:09 2866 GWT:TPC:IP=192.168.1.15
Jun 28 16:34:09 2897 MCO:BGN:STP
Jun 28 16:34:09 Ready
Jun 28 16:34:09 IP address: 192.168.1.15
Jun 28 16:34:09 2916 MCO:BGN:INIT OK,TSP=1
Jun 28 16:34:09 2977 GWT:TPC:IP=192.168.1.15
Jun 28 16:34:09 3008 GWT:RMQ:MQTT RECONNECT
Jun 28 16:34:09 3609 GWT:RMQ:MQTT CONNECTED
Jun 28 16:34:10 3639 GWT:TPS:TOPIC=sensors-out/0/255/0/0/18,MSG SENT
Jun 28 16:34:10 3695 GWT:TPS:TOPIC=sensors-out/0/255/3/0/11,MSG SENT
Jun 28 16:34:10 3751 GWT:TPS:TOPIC=sensors-out/0/255/3/0/12,MSG SENT
Jun 28 16:34:18 pm open,type:2 0
Jun 28 16:34:31 25601 TSF:MSG:READ,200-200-0,s=255,c=3,t=33,pt=5,l=4,sg=0:50000
Jun 28 16:34:32 25668 GWT:TPS:TOPIC=sensors-out/200/255/3/0/33,MSG SENT
Jun 28 16:34:32 25749 TSF:MSG:READ,200-200-0,s=255,c=3,t=32,pt=5,l=4,sg=0:500
Jun 28 16:34:32 25814 GWT:TPS:TOPIC=sensors-out/200/255/3/0/32,MSG SENT
Jun 28 16:35:01 55299 TSF:MSG:READ,10-10-0,s=255,c=3,t=33,pt=5,l=4,sg=0:60000
Jun 28 16:35:01 55364 GWT:TPS:TOPIC=sensors-out/10/255/3/0/33,MSG SENT
Jun 28 16:35:02 56152 TSF:MSG:READ,10-10-0,s=0,c=1,t=0,pt=7,l=5,sg=0:22.4
Jun 28 16:35:02 56213 GWT:TPS:TOPIC=sensors-out/10/0/1/0/0,MSG SENT
Jun 28 16:35:02 56268 TSF:MSG:READ,10-10-0,s=255,c=3,t=32,pt=5,l=4,sg=0:500
Jun 28 16:35:02 56331 GWT:TPS:TOPIC=sensors-out/10/255/3/0/32,MSG SENT