Garage Door Opener Help

I've built a single door opener using a NodeMCU and relay board with 2 door magnetic switches, one on the garage door and one on an entry door. Setup was easy and the system works well. Now I'm trying to build another for an outbuilding with 2 overhead doors, one entry door and two additional switches, one timed. I've tried to edit the existing sketch but I'm having trouble getting it to work. The NodeMCU is loaded and I see it in the HE but the Child devices are not loading. My sketch is as follows:

//******************************************************************************************
// File: ST_Anything_GarageDoors_ESP8266WiFi.ino
// Authors: Dan G Ogorchock & Daniel J Ogorchock (Father and Son)
//
// Summary: This Arduino Sketch, along with the ST_Anything library and the revised SmartThings
// library, demonstrates the ability of one NodeMCU ESP8266 to
// implement a multi input/output custom device for integration into SmartThings.
// The ST_Anything library takes care of all of the work to schedule device updates
// as well as all communications with the NodeMCU ESP8266's WiFi.
//
// ST_Anything_Multiples implements the following ST Capabilities as a demo of what is possible with a single NodeMCU ESP8266
// - 2 x Door Control devices (used typically for Garage Doors - input pin (contact sensor) and output pin (relay switch)
//
// Change History:
//
// Date Who What
// ---- --- ----
// 2019-01-24 Dan Ogorchock Original Creation
//
//******************************************************************************************
//******************************************************************************************
// SmartThings Library for ESP8266WiFi
//******************************************************************************************
#include <SmartThingsESP8266WiFi.h>

//******************************************************************************************
// ST_Anything Library
//******************************************************************************************
#include <Constants.h> //Constants.h is designed to be modified by the end user to adjust behavior of the ST_Anything library
#include <Device.h> //Generic Device Class, inherited by Sensor and Executor classes
#include <Sensor.h> //Generic Sensor Class, typically provides data to ST Cloud (e.g. Temperature, Motion, etc...)
#include <Executor.h> //Generic Executor Class, typically receives data from ST Cloud (e.g. Switch)
#include <InterruptSensor.h> //Generic Interrupt "Sensor" Class, waits for change of state on digital input
#include <PollingSensor.h> //Generic Polling "Sensor" Class, polls Arduino pins periodically
#include <Everything.h> //Master Brain of ST_Anything library that ties everything together and performs ST Shield communications

#include <PS_Illuminance.h> //Implements a Polling Sensor (PS) to measure light levels via a photo resistor

#include <PS_TemperatureHumidity.h> //Implements a Polling Sensor (PS) to measure Temperature and Humidity via DHT library
#include <PS_DS18B20_Temperature.h> //Implements a Polling Sesnor (PS) to measure Temperature via DS18B20 libraries
#include <PS_Water.h> //Implements a Polling Sensor (PS) to measure presence of water (i.e. leak detector)
#include <IS_Motion.h> //Implements an Interrupt Sensor (IS) to detect motion via a PIR sensor
#include <IS_Contact.h> //Implements an Interrupt Sensor (IS) to monitor the status of a digital input pin
#include <IS_Smoke.h> //Implements an Interrupt Sensor (IS) to monitor the status of a digital input pin
#include <IS_DoorControl.h> //Implements an Interrupt Sensor (IS) and Executor to monitor the status of a digital input pin and control a digital output pin
#include <IS_Button.h> //Implements an Interrupt Sensor (IS) to monitor the status of a digital input pin for button presses
#include <EX_Switch.h> //Implements an Executor (EX) via a digital output to a relay
#include <EX_Alarm.h> //Implements Executor (EX)as an Alarm Siren capability via a digital output to a relay
#include <S_TimedRelay.h> //Implements a Sensor to control a digital output pin with timing capabilities

//*************************************************************************************************
//NodeMCU v1.0 ESP8266-12e Pin Definitions (makes it much easier as these match the board markings)
//*************************************************************************************************
//#define LED_BUILTIN 16
//#define BUILTIN_LED 16
//
//#define D0 16 //no internal pullup resistor
//#define D1 5
//#define D2 4
//#define D3 0 //must not be pulled low during power on/reset, toggles value during boot
//#define D4 2 //must not be pulled low during power on/reset, toggles value during boot
//#define D5 14
//#define D6 12
//#define D7 13
//#define D8 15 //must not be pulled high during power on/reset

//******************************************************************************************
//Define which Arduino Pins will be used for each device
//******************************************************************************************

//Garage Door Pins
#define PIN_DOORCONTROL_CONTACT_1 D1 //SmartThings Capabilty "Door Control""North Door"
#define PIN_DOORCONTROL_RELAY_1 D3 //SmartThings Capabilty "Door Control" "North Door"
#define PIN_DOORCONTROL_CONTACT_2 D2 //SmartThings Capabilty "Door Control""South Door"
#define PIN_DOORCONTROL_RELAY_2 D4 //SmartThings Capabilty "Door Control" "South Door"
#define PIN_TIMEDRELAY_1 D5 //SmartThings Capability "Relay Switch""Happy Hour Bell"
#define PIN_CONTACT_1 D6 //SmartThings Capabilty "Contact Sensor""Entrance Door"
#define PIN_SWITCH_1 D7 //SmartThings Capability "Switch""Spare Relay"

//******************************************************************************************
//ESP8266 WiFi Information
//******************************************************************************************
String str_ssid = "W8JBD-19"; // <---You must edit this line!
String str_password = "addisonb4aidan"; // <---You must edit this line!
IPAddress ip(192, 168, 2, 151); //Device IP Address // <---You must edit this line!
IPAddress gateway(192, 168, 2, 1); //Router gateway // <---You must edit this line!
IPAddress subnet(255, 255, 255, 0); //LAN subnet mask // <---You must edit this line!
IPAddress dnsserver(192, 168, 2, 1); //DNS server // <---You must edit this line!
const unsigned int serverPort = 8090; // port to run the http server on

// Smartthings / Hubitat Hub TCP/IP Address
IPAddress hubIp(192, 168, 1, 133); // smartthings/hubitat hub ip // <---You must edit this line!

// SmartThings / Hubitat Hub TCP/IP Address: UNCOMMENT line that corresponds to your hub, COMMENT the other
//const unsigned int hubPort = 39500; // smartthings hub port
const unsigned int hubPort = 39501; // hubitat hub port

//******************************************************************************************
//st::Everything::callOnMsgSend() optional callback routine. This is a sniffer to monitor
// data being sent to ST. This allows a user to act on data changes locally within the
// Arduino sktech.
//******************************************************************************************
void callback(const String &msg)
{
// Serial.print(F("ST_Anything Callback: Sniffed data = "));
// Serial.println(msg);

//TODO: Add local logic here to take action when a device's value/state is changed

//Masquerade as the ThingShield to send data to the Arduino, as if from the ST Cloud (uncomment and edit following line)
//st::receiveSmartString("Put your command here!"); //use same strings that the Device Handler would send
}

//******************************************************************************************
//Arduino Setup() routine
//******************************************************************************************
void setup()
{
//******************************************************************************************
//Declare each Device that is attached to the Arduino
// Notes: - For each device, there is typically a corresponding "tile" defined in your
// SmartThings Device Hanlder Groovy code, except when using new COMPOSITE Device Handler
// - For details on each device's constructor arguments below, please refer to the
// corresponding header (.h) and program (.cpp) files.
// - The name assigned to each device (1st argument below) must match the Groovy
// Device Handler names. (Note: "temphumid" below is the exception to this rule
// as the DHT sensors produce both "temperature" and "humidity". Data from that
// particular sensor is sent to the ST Hub in two separate updates, one for
// "temperature" and one for "humidity")
// - The new Composite Device Handler is comprised of a Parent DH and various Child
// DH's. The names used below MUST not be changed for the Automatic Creation of
// child devices to work properly. Simply increment the number by +1 for each duplicate
// device (e.g. contact1, contact2, contact3, etc...) You can rename the Child Devices
// to match your specific use case in the ST Phone Application.
//******************************************************************************************
//Polling Sensors

//Interrupt Sensors
static st::IS_DoorControl sensor1(F("doorControl1"), PIN_DOORCONTROL_CONTACT_1, LOW, true, PIN_DOORCONTROL_RELAY_1, LOW, true, 1000, 1000);
static st::IS_DoorControl sensor2(F("doorControl2"), PIN_DOORCONTROL_CONTACT_2, LOW, true, PIN_DOORCONTROL_RELAY_2, LOW, true, 1000, 1000);
static st::IS_Contact sensor3(F("contact1"), PIN_CONTACT_1, LOW, true);

//Special sensors/executors (uses portions of both polling and executor classes)
static st::S_TimedRelay sensor4(F("relaySwitch1"), PIN_TIMEDRELAY_1, LOW, false, 3000, 0, 1);

//Executors
static st::EX_Switch executor1(F("switch1"), PIN_SWITCH_1, LOW, true); //Inverted logic for "Active Low" Relay Board

//*****************************************************************************
// Configure debug print output from each main class
// -Note: Set these to "false" if using Hardware Serial on pins 0 & 1
// to prevent communication conflicts with the ST Shield communications
//*****************************************************************************
st::Everything::debug=true;
st::Executor::debug=true;
st::Device::debug=true;
st::PollingSensor::debug=true;
st::InterruptSensor::debug=true;

//*****************************************************************************
//Initialize the "Everything" Class
//*****************************************************************************

//Initialize the optional local callback routine (safe to comment out if not desired)
st::Everything::callOnMsgSend = callback;

//Create the SmartThings ESP8266WiFi Communications Object
//STATIC IP Assignment - Recommended
st::Everything::SmartThing = new st::SmartThingsESP8266WiFi(str_ssid, str_password, ip, gateway, subnet, dnsserver, serverPort, hubIp, hubPort, st::receiveSmartString, "OfficeESP");

//DHCP IP Assigment - Must set your router's DHCP server to provice a static IP address for this device's MAC address
//st::Everything::SmartThing = new st::SmartThingsESP8266WiFi(str_ssid, str_password, serverPort, hubIp, hubPort, st::receiveSmartString);

//Run the Everything class' init() routine which establishes WiFi communications with SmartThings Hub
st::Everything::init();

//*****************************************************************************
//Add each sensor to the "Everything" Class
//*****************************************************************************
st::Everything::addSensor(&sensor1);
st::Everything::addSensor(&sensor2);
st::Everything::addSensor(&sensor3);
st::Everything::addSensor(&sensor4);
//*****************************************************************************
//Add each executor to the "Everything" Class
//*****************************************************************************
st::Everything::addExecutor(&executor1);
//*****************************************************************************
//Initialize each of the devices which were added to the Everything Class
//*****************************************************************************
st::Everything::initDevices();

}

//******************************************************************************************
//Arduino Loop() routine
//******************************************************************************************
void loop()
{
//*****************************************************************************
//Execute the Everything run method which takes care of "Everything"
//*****************************************************************************
st::Everything::run();
}

I've turned on debug in the parent device and I get the following logs:

dev:2302020-01-25 06:29:37.785 pm warnRead timed out

dev:2302020-01-25 06:29:27.742 pm debugUsing ip: 192.168.2.151 and port: 8090 for device: 230

dev:2302020-01-25 06:29:27.740 pm debugExecuting 'sendEthernet' refresh

dev:2302020-01-25 06:29:27.738 pm debugExecuting 'refresh()'

dev:2302020-01-25 06:27:58.629 pm debugdescription= 'mac:DC4F22759E8D, ip:c0a80297, port:1f9a, headers:SFRUUC8xLjEgMjAwIE9LDQo=, body:'

dev:2302020-01-25 06:27:58.422 pm debugUsing ip: 192.168.2.151 and port: 8090 for device: 230

dev:2302020-01-25 06:27:58.420 pm debugExecuting 'sendEthernet' refresh

dev:2302020-01-25 06:27:58.418 pm debugExecuting 'refresh()'

dev:2302020-01-25 06:22:11.383 pm warnRead timed out

dev:2302020-01-25 06:22:01.343 pm debugUsing ip: 192.168.2.151 and port: 8090 for device: 230

dev:2302020-01-25 06:22:01.341 pm debugExecuting 'sendEthernet' refresh

dev:2302020-01-25 06:22:01.339 pm debugExecuting 'refresh()'

dev:2302020-01-25 06:21:27.668 pm debugdescription= 'mac:DC4F22759E8D, ip:c0a80297, port:1f9a, headers:SFRUUC8xLjEgMjAwIE9LDQo=, body:'

dev:2302020-01-25 06:21:25.062 pm debugUsing ip: 192.168.2.151 and port: 8090 for device: 230

dev:2302020-01-25 06:21:25.060 pm debugExecuting 'sendEthernet' refresh

dev:2302020-01-25 06:21:25.059 pm debugExecuting 'refresh()'

I've probably made a simple mistake in the sketch but I've been unable to find. Any help would be appreciated.
Jim

Tagging @ogiewon he should be able to help you.

I recommend you go back to the original Garage Doors example sketch and see if it works without adding any additional devices. The GPIO pins in that sketch were chosen for specific reasons, based on the limitations of the ESP8266 board.

Let me know if that version works. Also, make sure you have updated the Groovy Devices Handlers and the ST_Anything Arduino libraries. They are a matched set and there were some changes a little while back to the Door Control logic that requires both the Arduino and Groovy code to be updated.

I was able to get the garage sketch that I used on my other garage and it does work. I went back at tried again to modify the example sketch to control 2 doors, add a timed relay a switch and a sensor and a switch and got all the child devices to populate except the 2nd overhead door control. Your suggestion helped but I still need to work on it some more. I need to use 6 pins on the NodeMCU so will work on it some more. Thanks.

Just an FYI and thanks. Assigning DoorControl to D1 &D3 and D2 &D4 of the ESP8266 caused the HE Groovy to fail loading the Child devices. Changing those assignments to D1&D5 and D2&D6 resolved that issue. I did assign D3 and D4 to switches and the HE loaded those Child Devices without issue. Makes little sense to me but one can't argue with success. Again, thanks.
Jim

Glad to hear you got it up and running.

Those two pins are special during the boot process, and thus one must exercise caution with their use. In my ST_Anything ReadMe I have a table that explains some of the quirks of the ESP8266's GPIO pins when use as inputs and outputs.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.