Brain In Jar EPS8266 Honeypot

Brain In Jar EPS8266 Honeypot

This post will cover how to build and operate a honeypot run on the ESP8266 platform, specifically the ESP-01 module.  The enclosure for the project will be a prop that resembles a brain in a jar that is lit by a LED strip to represent operational conditions.  The ESP-01 module will connect to a defined network and run common network services.  The module will subscribe and publish MQTT messages to a broker for various conditions, states, and controls.  The module will control a color LED strip via an IR LED interfaced with the native LED strip controller.  Depending on the module state of operation, different LED colors will be displayed to provide quick visual queues.  Since the native LED strip controller will be used, the native remote can as well.  Power will be tapped from the LED strip controller power source and buck converted to the operating voltage of the ESP-01 module.  Node-Red will be used to provide a graphical interface for the honeypot operational details.  The details in Node-Red will include network connection status, uptime, current date and time, IP address of remote host, when the connection occurred, and what services were hit.  Control functions will also be available to clear the detection from the interface, update time, or reboot the ESP-01 module.  This project has several layers that leverage topics covered in earlier posts on this blog as well as lead into new areas for future project use.  It will be a best effort approach to include as much detail and to provide those who have inspired this work the credit they deserve.

This video provides a demonstration of a canary honeypot on an ESP platform.

My initial attempts were repeating these demonstrations.  However with each try it would fail.  The problem was either a library failing to load because it was an incorrect version or the IDE just outright said it was not supported for the device.  It was starting to look like a riddle, wrapped in a mystery, inside an enigma.

So the approach that ultimately was successful was to define the goals of the project.  With the project roadmap, it was then a matter of identifying each facet and testing them individually.  Project goals were adjusted based on the test results.  Then the aggregate was made and the goal reached.  This was the same philosophy used in earlier complex projects that succeeded.  One of the key advantages from this strategy was that each facet was classified based on difficulty.  The tough work was done first, with lighter load work being available as a reset.  That kept traction on the project and was the cornerstone of its success.

Here is the code used to create the firmware loaded on the EPS-01 module.  Each section of the code will not be disected and discussed in this post, comments in the code serve that purpose.

/*
  Brain In Jar EPS8266 Honeypot
  
  The work of others was instrumental in success of this code.
  Thanks goes out to the following:
  
  <https://randomnerdtutorials.com/esp8266-nodemcu-date-time-ntp-client-server-arduino>
  <https://techtutorialsx.com/2018/02/17/esp32-arduino-web-server-getting-client-ip>
  <https://randomnerdtutorials.com/esp8266-web-server>
  <https://github.com/mtnbkr88/ESP32_FTPServer>
  <https://github.com/ldab/ESP32_FTPClient>
  <https://learn.adafruit.com/ir-sensor>
  
*/

// Declarations and Variables

#include <ESP8266WiFi.h> //ESP8266 WiFi Library
#include <WiFiClient.h>
#include <PubSubClient.h>

// NTP Libraries, Declarations, and Variables
#include <NTPClient.h>
#include <WiFiUdp.h>
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
//Week Days
String weekDays[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//Month names
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

// Network and MQTT Broker
const char* mqtt_server = "IP_Address_Of_MQTT_Broker";     // Put your MQTT Broker here
const char* ssid =     "Wi-Fi_SSID";               // Put your SSID here
const char* password = "Wi-Fi_Password";           // Put your PASSWORD here

// IR LED Pin used as remote control for LED strip
int IRledPin = 3;    // LED connected to digital GPIO 3

// Network services to run on the ESP8266 Honeypot
WiFiServer FTPserver(21);
WiFiServer SSHserver(22);
WiFiServer Telnetserver(23);
WiFiServer SMTPserver(25);
WiFiServer HTTPserver(80);
WiFiServer HTTPSserver(443);

// Wi-Fi and MQTT client declarations
WiFiClient espClient;
PubSubClient client(espClient);

// Timer and counter variables
unsigned long laststats = 0;	// Time counter for MQTT publishing
unsigned long lastalive = 0;	// Time counter for periodic blink of LED to indicate system is running
unsigned long lasttimeupdate = 0;	// Time counter for periodic NTP time checks
unsigned long lasttimereboot = 0;	// Time counter for periodic reboots to avoid millis rollover
unsigned int TCPClients = 0;	// Client counter
unsigned int ClientTrigger = 0;  // Client trigger state
unsigned int LEDCounter = 0;	// Loop counter to time when LED  

ADC_MODE(ADC_VCC);  // See comment block below for more details
/*
  see - http://arduino.esp8266.com/Arduino/versions/2.0.0-rc2/doc/libraries.html

  ESP.getVcc() may be used to measure supply voltage. ESP needs to reconfigure the ADC at 
  startup in order for this feature to be available. Add the following line to the top of 
  your sketch to use getVcc:

  ADC_MODE(ADC_VCC);

  TOUT pin has to be disconnected in this mode.

  Note that by default ADC is configured to read from TOUT pin using analogRead(A0), and 
  ESP.getVCC() is not available.

 */
 
// MQTT Functions

void callback(char* topic, byte* message, unsigned int length) {
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    messageTemp += (char)message[i];
  }

    // Clears the detected client information
  if (String(topic) == "ESP01/ResetTCPClients") {
    if(messageTemp == "ResetTCPClients"){
          TCPClients = 0;
          ClientTrigger = 0;
          BlinkRedLEDOnce();
    }
  }  

    // Checks NTP for current time
  if (String(topic) == "ESP01/UpdateTime") {
    if(messageTemp == "CheckTime"){
          timeClient.update();
          BlinkRedLED();
    }
  }  

    // Reboots the ESP01 module
  if (String(topic) == "ESP01/Reboot") {
    if(messageTemp == "Reboot"){
          ESP.restart();
    }
  }  


}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    // Attempt to connect
    if (client.connect("ESP01")) {
      // Subscribe
      // Do you not subscribe to my methods?
      // ESP01/# for everything, or ESP01/Uptime for just the Uptime
      client.subscribe("ESP01/#");
    } else {
      // Blinks blue to indicate no MQTT connection
      // This is a visual queue that the network or broker are unavailable
      // and action should be taken to fix the problem.
          LEDOn();delay(25);
          LEDB();delay(25);
          LEDOn(); delay(450);
          LEDOff();delay(500);
    }
  }
}






// Setup Function

void setup()
{
    
    // initialize the IR digital pin as an output:
    pinMode(IRledPin, OUTPUT);    
    
    delay(500); // Delay to help prevent brownouts.

    while (LEDCounter < 10) {  // Brigtens the LED to highest setting
        LEDBrite(); delay(25);
        LEDCounter = ++LEDCounter;
        }
    LEDCounter = 0;
    
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
   
    IPAddress ip;

    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
      LEDOn();delay(25);
      LEDB();delay(100);
      LEDOff();delay(125);
        // Blinks blue to indicate no WiFi connection
    }
    ip = WiFi.localIP();
    WiFi.setAutoReconnect(true);
    WiFi.persistent(true);

    timeClient.begin(); // Initialize a NTPClient to get time
    timeClient.setTimeOffset(-25200);
    // Set offset time in seconds to adjust for your timezone, for example:
    // GMT -7 = -25200 (see - https://time.gov/)
    timeClient.update();

    StartServices();  // Start TCP Services

}

// Main Loop Function

void loop()
{

  // Checks and connects to the MQTT broker using the function
  if (!client.connected()) {
    reconnect();
  }

  
  client.loop();
  UpdateStats();

  ClientConnected();  // Publish info about TCP connected clients

  // Turn on green led if any tcp clients have a registered connection
  if ((TCPClients > 0) && (ClientTrigger > 0)) {
    LEDOn();delay(25);LEDG();
    ClientTrigger = 0;
    TriggerTime(); 
  }

  // Alive check every 15 minutes (15 * 60 * 1000 = 900000 milli-seconds)
  unsigned long timealive = millis();
  if (timealive - lastalive > 900000) {
    lastalive = timealive;
    BlinkRedLEDOnce();
    // Turn on green led if any tcp clients have a registered connection
    if (TCPClients > 0) {
      LEDOn();delay(25);LEDG();
      }
  }

  // Update time from NTP source every 1 day (24 * 60 * 60 * 1000 = 86400000 milli-seconds)
  unsigned long timeupdate = millis();
  if (timeupdate - lasttimeupdate > 86400000) {
    lasttimeupdate = timeupdate;
    timeClient.update(); 
    BlinkRedLED();
  }

  // Reboot microcontroller every 30 day to avoid millis() rollover (30 * 24 * 60 * 60 * 1000 = 2592000000 milli-seconds)
  unsigned long timereboot = millis();
  if (timereboot - lasttimereboot > 2592000000) {
      // Reboot command
      ESP.restart();
  }

}



void UpdateStats()
{
  unsigned long stats = millis();
  if (stats - laststats > 5000) {
    laststats = stats;

    client.publish("ESP01/Firmware", "Brain_In_Jar_EPS8266_Honeypot_ver8");     
    String StringUptime = String(millis());
    client.publish("ESP01/Uptime", StringUptime.c_str());
    String StringHWAddress = String(WiFi.macAddress());
    client.publish("ESP01/HWAddress", StringHWAddress.c_str());   
    String StringWifiSignal = String(WiFi.RSSI());
    client.publish("ESP01/WifiSignal",StringWifiSignal.c_str());   
    String StringFreeHeapSize = String(ESP.getFreeHeap());
    client.publish("ESP01/FreeHeapSize",StringFreeHeapSize.c_str());  
    String StringHeapFragmentation = String(ESP.getHeapFragmentation());
    client.publish("ESP01/HeapFragmentation",StringHeapFragmentation.c_str());  
    String StringMaxFreeBlockSize = String(ESP.getMaxFreeBlockSize());
    client.publish("ESP01/MaxFreeBlockSize",StringMaxFreeBlockSize.c_str());  
    String StringSketchSize = String(ESP.getSketchSize());
    client.publish("ESP01/SketchSize",StringSketchSize.c_str());  
    String StringFreeSketchSpace = String(ESP.getFreeSketchSpace());
    client.publish("ESP01/FreeSketchSpace",StringFreeSketchSpace.c_str());  
    String StringCpuFreqMHz = String(ESP.getCpuFreqMHz());
    client.publish("ESP01/CpuFreqMHz",StringCpuFreqMHz.c_str());
    String StringChipId = String(ESP.getChipId());
    client.publish("ESP01/ChipId",StringChipId.c_str());  
    String StringVcc = String(ESP.getVcc());
    client.publish("ESP01/Vcc",StringVcc.c_str());  

    //Get a Time Structure
    String formattedTime = timeClient.getFormattedTime();
    String StringformattedTime = String(formattedTime);
    client.publish("ESP01/Time",StringformattedTime.c_str());  

    //Get a Date Structure
    time_t epochTime = timeClient.getEpochTime();
    struct tm *ptm = gmtime ((time_t *)&epochTime); 
    int monthDay = ptm->tm_mday;
    int currentMonth = ptm->tm_mon+1;
    String currentMonthName = months[currentMonth-1];
    int currentYear = ptm->tm_year+1900;
    
    //Publish complete date:
    String StringcurrentDate = String(currentMonth) + "/" + String(monthDay) + "/" + String(currentYear);
    client.publish("ESP01/Date",StringcurrentDate.c_str());  
    
    //Publish Epoch:
    String StringEpochTime = String(timeClient.getEpochTime());
    client.publish("ESP01/EpochTime",StringEpochTime.c_str());  

    //Publish TCP Client Count
    String StringTCPClients = String(TCPClients);
    client.publish("ESP01/TCPClients",StringTCPClients.c_str());  

  }
}




void TriggerTime() {
  
    //Get a Time Structure
    String formattedTime = timeClient.getFormattedTime();
    String StringformattedTime = String(formattedTime);
    client.publish("ESP01/TriggerTime",StringformattedTime.c_str());  

    //Get a Date Structure
    time_t epochTime = timeClient.getEpochTime();
    struct tm *ptm = gmtime ((time_t *)&epochTime); 
    int monthDay = ptm->tm_mday;
    int currentMonth = ptm->tm_mon+1;
    String currentMonthName = months[currentMonth-1];
    int currentYear = ptm->tm_year+1900;
    
    //Publish complete date:
    String StringcurrentDate = String(currentMonth) + "/" + String(monthDay) + "/" + String(currentYear);
    client.publish("ESP01/TriggerDate",StringcurrentDate.c_str());  
 
}



void StartServices() {
  
  FTPserver.begin();
  client.publish("ESP01/FTPserver", "FTP Server Running");  
    delay(100);
  SSHserver.begin();
  client.publish("ESP01/SSHserver", "SSH Server Running");  
    delay(100);
  Telnetserver.begin();
  client.publish("ESP01/Telnetserver", "Telnet Server Running");  
    delay(100);
  SMTPserver.begin();
  client.publish("ESP01/SMTPserver", "SMTP Server Running");  
    delay(100);
  HTTPserver.begin();
  client.publish("ESP01/HTTPserver", "HTTP Server Running");  
    delay(100);
  HTTPSserver.begin();
  client.publish("ESP01/HTTPSserver", "HTTPS Server Running");  
    delay(100);
  
}





void ClientConnected() {
  
  WiFiClient FTPclient = FTPserver.available();   // Listen for incoming clients
    if (FTPclient) {                             // If a new client connects,
    String StringFTPClient = String(FTPclient.remoteIP().toString());
    client.publish("ESP01/FTPClient",StringFTPClient.c_str());  
    TCPClients = TCPClients + 1;
    ClientTrigger = ClientTrigger + 1;
    FTPclient.stop(); // Close the connection    
  }

  WiFiClient SSHclient = SSHserver.available();   // Listen for incoming clients
    if (SSHclient) {                             // If a new client connects,
    String StringSSHclient = String(SSHclient.remoteIP().toString());
    client.publish("ESP01/SSHClient",StringSSHclient.c_str());  
    TCPClients = TCPClients + 1;
    ClientTrigger = ClientTrigger + 1;
    SSHclient.stop(); // Close the connection    
    
  }

  WiFiClient Telnetclient = Telnetserver.available();   // Listen for incoming clients
    if (Telnetclient) {                             // If a new client connects,
    String StringTelnetclient = String(Telnetclient.remoteIP().toString());
    client.publish("ESP01/TelnetClient",StringTelnetclient.c_str());  
    TCPClients = TCPClients + 1;
    ClientTrigger = ClientTrigger + 1;
    Telnetclient.stop(); // Close the connection    
    
  }

  WiFiClient SMTPclient = SMTPserver.available();   // Listen for incoming clients
    if (SMTPclient) {                             // If a new client connects,
    String StringSMTPclient = String(SMTPclient.remoteIP().toString());
    client.publish("ESP01/SMTPClient",StringSMTPclient.c_str());  
    TCPClients = TCPClients + 1;
    ClientTrigger = ClientTrigger + 1;
    SMTPclient.stop(); // Close the connection    
    
  }

  WiFiClient HTTPclient = HTTPserver.available();   // Listen for incoming clients
    if (HTTPclient) {                             // If a new client connects,
    String StringHTTPclient = String(HTTPclient.remoteIP().toString());
    client.publish("ESP01/HTTPClient",StringHTTPclient.c_str());  
    TCPClients = TCPClients + 1;
    ClientTrigger = ClientTrigger + 1;
    HTTPclient.stop(); // Close the connection    
    
  }

  WiFiClient HTTPSclient = HTTPSserver.available();   // Listen for incoming clients
    if (HTTPSclient) {                             // If a new client connects,
    String StringHTTPSclient = String(HTTPSclient.remoteIP().toString());
    client.publish("ESP01/HTTPSClient",StringHTTPSclient.c_str());  
    TCPClients = TCPClients + 1;
    ClientTrigger = ClientTrigger + 1;
    HTTPSclient.stop(); // Close the connection    
    
  }

  
}



 
// This procedure sends a 38KHz pulse to the IRledPin 
// for a certain # of microseconds. We'll use this whenever we need to send codes
void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait
 
  cli();  // this turns off any background interrupts
 
  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
 
   // so 26 microseconds altogether
   microsecs -= 26;
  }
 
  sei();  // this turns them back on
}




// IR Remote Control Sequences = = = = = = = = = = = = = = = = = = = = 

// LED IR Remote Control

void LEDOff() {
  LEDOffButton();
}
void LEDOn() {
  LEDOnButton();
}
void LEDDim() {
  LEDDimButton();
}
void LEDBrite() {
  LEDBriteButton();
}

void LEDW() {
  LEDWButton();
}
void LEDB() {
  LEDBButton();
}
void LEDG() {
  LEDGButton();
}
void LEDR() {
  LEDRButton();
}

// Button IR LED Codes  = = = = = = = = = = = = = = = = = = = = 

// IR LED Buttons
void LEDOnButton() {pulseIR(9320);delayMicroseconds(4600);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(640);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(40000);pulseIR(9320);delayMicroseconds(2300);pulseIR(620);}
void LEDOffButton() {pulseIR(9320);delayMicroseconds(4600);pulseIR(620);delayMicroseconds(600);pulseIR(580);delayMicroseconds(600);pulseIR(600);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(600);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(600);pulseIR(580);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(640);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(600);pulseIR(580);delayMicroseconds(40020);pulseIR(9300);delayMicroseconds(2320);pulseIR(600);}
void LEDDimButton() {pulseIR(9320);delayMicroseconds(4600);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(640);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(40000);pulseIR(9320);delayMicroseconds(2300);pulseIR(620);}
void LEDBriteButton() {pulseIR(9320);delayMicroseconds(4620);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(640);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(40020);pulseIR(9300);delayMicroseconds(2300);pulseIR(600);}

void LEDWButton() {pulseIR(9320);delayMicroseconds(4600);pulseIR(620);delayMicroseconds(600);pulseIR(580);delayMicroseconds(600);pulseIR(600);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1720);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(600);pulseIR(600);delayMicroseconds(40020);pulseIR(9320);delayMicroseconds(2300);pulseIR(600);}
void LEDBButton() {pulseIR(9340);delayMicroseconds(4620);pulseIR(600);delayMicroseconds(600);pulseIR(600);delayMicroseconds(600);pulseIR(580);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(600);pulseIR(580);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(600);pulseIR(580);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(600);pulseIR(600);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1740);pulseIR(580);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1740);pulseIR(600);delayMicroseconds(580);pulseIR(600);delayMicroseconds(40020);pulseIR(9340);delayMicroseconds(2300);pulseIR(600);}
void LEDGButton() {pulseIR(9300);delayMicroseconds(4620);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(640);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(560);pulseIR(640);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(560);pulseIR(640);delayMicroseconds(40000);pulseIR(9300);delayMicroseconds(2300);pulseIR(620);}
void LEDRButton() {pulseIR(9320);delayMicroseconds(4600);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(560);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(580);pulseIR(600);delayMicroseconds(1720);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1700);pulseIR(620);delayMicroseconds(1720);pulseIR(600);delayMicroseconds(580);pulseIR(620);delayMicroseconds(40000);pulseIR(9320);delayMicroseconds(2300);pulseIR(620);}


// = = = = = = = = = = = = = = = = = = = = 

void BlinkRedLED() {
            
          while (LEDCounter < 10) {  // Dims the LED to lowest setting
            LEDDim(); delay(25);
            LEDCounter = ++LEDCounter;
            }
          LEDCounter = 0;
          
          LEDOn();delay(25);  // Blinks red 6 times to indicate time has updated
          LEDR();delay(475);
          LEDOff();delay(500);
          
          while (LEDCounter < 5) {
            LEDOn(); delay(500);
            LEDOff();delay(500);
            LEDCounter = ++LEDCounter;
            }
          LEDCounter = 0;
          
}

void BlinkRedLEDOnce() {
            
          while (LEDCounter < 10) {  // Dims the LED to lowest setting
            LEDDim(); delay(25);
            LEDCounter = ++LEDCounter;
            }
          LEDCounter = 0;
          
          LEDOn();delay(25);  // Blinks red 6 times to indicate time has updated
          LEDR();delay(475);
          LEDOff();delay(500);
          
}


// Footnotes

The hardware build was the amusing part.  A small plastic storage jar was used to hold a toy rubber brain.  All of the electronic hardware was attached to the lid of the jar.  The LED strip was attached to the inside lip of the jar top with its connecting wiring protruding out of an opening on the lid.  A header was used so the buck converter and ESP-01 module could be removed, updated, or replaced as needed with ease.  The native LED controller power source attaches to the barrel jack on the top of the lid.  The IR LED and reciever are also protruding out so that the native remote can be used if needed.

The Node-Red interface is simple, mobile friendly, and provides a quick overall view.  Here is a video demonstrating how it responds to different operating states.

Here is the exported Node-Red flow.

[
    {
        "id": "a58d4795bd789e74",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 11,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Free Heap Size",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 820,
        "y": 820,
        "wires": []
    },
    {
        "id": "74765d6b8dc84063",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/FreeHeapSize",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 510,
        "y": 820,
        "wires": [
            [
                "a58d4795bd789e74"
            ]
        ]
    },
    {
        "id": "a4d6f8c1500dc191",
        "type": "ui_button",
        "z": "d1dc3db337ee0cf2",
        "name": "Check Time",
        "group": "3444198712388431",
        "order": 10,
        "width": "2",
        "height": "1",
        "passthru": false,
        "label": "Check Time",
        "tooltip": "",
        "color": "#585858",
        "bgcolor": "#242424",
        "className": "",
        "icon": "",
        "payload": "CheckTime",
        "payloadType": "str",
        "topic": "ESP01/UpdateTime",
        "topicType": "str",
        "x": 470,
        "y": 1080,
        "wires": [
            [
                "b889bd8f29232911"
            ]
        ]
    },
    {
        "id": "b889bd8f29232911",
        "type": "mqtt out",
        "z": "d1dc3db337ee0cf2",
        "name": "ESP01 UpdateTime",
        "topic": "ESP01/UpdateTime",
        "qos": "0",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "54b01280.e7076c",
        "x": 770,
        "y": 1080,
        "wires": []
    },
    {
        "id": "3f95464d7073f78d",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 8,
        "width": "3",
        "height": "1",
        "name": "",
        "label": "System Controls",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 240,
        "y": 1080,
        "wires": []
    },
    {
        "id": "7f5c02e2fa3be610",
        "type": "ui_button",
        "z": "d1dc3db337ee0cf2",
        "name": "Reboot",
        "group": "3444198712388431",
        "order": 9,
        "width": "2",
        "height": "1",
        "passthru": false,
        "label": "Reboot",
        "tooltip": "",
        "color": "#585858",
        "bgcolor": "#242424",
        "className": "",
        "icon": "",
        "payload": "Reboot",
        "payloadType": "str",
        "topic": "ESP01/Reboot",
        "topicType": "str",
        "x": 460,
        "y": 1140,
        "wires": [
            [
                "44cf1199057b172b"
            ]
        ]
    },
    {
        "id": "44cf1199057b172b",
        "type": "mqtt out",
        "z": "d1dc3db337ee0cf2",
        "name": "ESP01 Reboot",
        "topic": "ESP01/Reboot",
        "qos": "0",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "54b01280.e7076c",
        "x": 750,
        "y": 1140,
        "wires": []
    },
    {
        "id": "03260bd6511035dc",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/FTPClient",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 280,
        "y": 1520,
        "wires": [
            [
                "9186efa7f7afa09d",
                "8d113f51e1a8972f"
            ]
        ]
    },
    {
        "id": "9186efa7f7afa09d",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 17,
        "width": "6",
        "height": "1",
        "name": "FTP Client IP",
        "label": "FTP Client IP",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 890,
        "y": 1520,
        "wires": []
    },
    {
        "id": "c8aeb4b55af5f795",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/SSHClient",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 280,
        "y": 1720,
        "wires": [
            [
                "4c845187030e4736",
                "db5b8d347b986ae9"
            ]
        ]
    },
    {
        "id": "4c845187030e4736",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 19,
        "width": "6",
        "height": "1",
        "name": "SSH Client IP",
        "label": "SSH Client IP",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 920,
        "y": 1720,
        "wires": []
    },
    {
        "id": "0f3c02f7d66698db",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/TelnetClient",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 280,
        "y": 1920,
        "wires": [
            [
                "29a8d118f4998cf3",
                "ca71f7ef8c48be2c"
            ]
        ]
    },
    {
        "id": "29a8d118f4998cf3",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 21,
        "width": "6",
        "height": "1",
        "name": "Telnet Client IP",
        "label": "Telnet Client IP",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 940,
        "y": 1920,
        "wires": []
    },
    {
        "id": "5a6e024790c6c87e",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/HTTPClient",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 280,
        "y": 2140,
        "wires": [
            [
                "4fc084da31a95a8a",
                "791e344141fa4d1c"
            ]
        ]
    },
    {
        "id": "4fc084da31a95a8a",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 23,
        "width": "6",
        "height": "1",
        "name": "HTTP Client IP",
        "label": "HTTP Client IP",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 960,
        "y": 2140,
        "wires": []
    },
    {
        "id": "3cb7a49217284b6f",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/HTTPSClient",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 290,
        "y": 2360,
        "wires": [
            [
                "5c405ddab807496e",
                "5b33c557787d9734"
            ]
        ]
    },
    {
        "id": "5c405ddab807496e",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 25,
        "width": "6",
        "height": "1",
        "name": "HTTPS Client IP",
        "label": "HTTPS Client IP",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 980,
        "y": 2360,
        "wires": []
    },
    {
        "id": "631370488dd6bbb4",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/SMTPClient",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 280,
        "y": 2580,
        "wires": [
            [
                "56e2ec02a2709345",
                "74adb2d04aa282a5"
            ]
        ]
    },
    {
        "id": "56e2ec02a2709345",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 27,
        "width": "6",
        "height": "1",
        "name": "SMTP Client IP",
        "label": "SMTP Client IP",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 980,
        "y": 2580,
        "wires": []
    },
    {
        "id": "ee57fe3dcefd91f9",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 7,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Uptime",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 1080,
        "y": 120,
        "wires": []
    },
    {
        "id": "2da513a35e47b66c",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/Uptime",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 250,
        "y": 120,
        "wires": [
            [
                "66ab1ee6fa89fc35"
            ]
        ]
    },
    {
        "id": "1a4c651f8c2159d5",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Seconds to DD:HH:MM:SS",
        "func": " var totalNumberOfSeconds =  msg.payload;\n var days = parseInt( totalNumberOfSeconds / 86400 );\n var hours = parseInt (( totalNumberOfSeconds - ( days * 86400 )) / 3600  );\n var minutes = parseInt ((totalNumberOfSeconds - ((hours * 3600)+( days * 86400 ))) / 60 );\n var seconds = parseInt(totalNumberOfSeconds - ((hours * 3600) + (minutes * 60)+( days * 86400 )));\n var result = (days < 10 ? \"0\" + days : days) + \" Days \" + (hours < 10 ? \"0\" + hours : hours) + \":\" + (minutes < 10 ? \"0\" + minutes : minutes) + \":\" + (seconds  < 10 ? \"0\" + seconds : seconds);\n msg.payload=result;\n return msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 840,
        "y": 120,
        "wires": [
            [
                "ee57fe3dcefd91f9"
            ]
        ]
    },
    {
        "id": "76e1f83848120805",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/WifiSignal",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 720,
        "y": 240,
        "wires": [
            [
                "5b7615517936dbc4"
            ]
        ]
    },
    {
        "id": "66ab1ee6fa89fc35",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Millis to Seconds",
        "func": "var millis = msg.payload;\nvar S = millis / 1000;\nvar seconds = Math.floor(S);\nmsg.payload = seconds;\nreturn msg;\n\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 120,
        "wires": [
            [
                "1a4c651f8c2159d5"
            ]
        ]
    },
    {
        "id": "b090ae80f0e4b8eb",
        "type": "ping",
        "z": "d1dc3db337ee0cf2",
        "mode": null,
        "name": "ESP01",
        "host": "192.168.6.182",
        "timer": "15",
        "inputs": 0,
        "x": 250,
        "y": 300,
        "wires": [
            [
                "87c6e88ea92a03fd",
                "01316d0bbe4ff6a3"
            ]
        ]
    },
    {
        "id": "be4fd3d73679d7b0",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 1,
        "width": "7",
        "height": "1",
        "name": "ESP01",
        "label": "ESP01",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-heartbeat\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 990,
        "y": 300,
        "wires": []
    },
    {
        "id": "339b2c68ae378776",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \"On\")?\"red\":\"lime\";\n//return msg;\n\nif (msg.payload === \"Off\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nelse {\nmsg.color = \"lime\";\nreturn msg;\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 740,
        "y": 300,
        "wires": [
            [
                "be4fd3d73679d7b0"
            ]
        ]
    },
    {
        "id": "d02b0d1f2ae9dd9e",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 30,
        "width": "7",
        "height": "1",
        "name": "",
        "label": "Firmware Version",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 830,
        "y": 880,
        "wires": []
    },
    {
        "id": "e85313e8fbad8b40",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 29,
        "width": "7",
        "height": "1",
        "name": "",
        "label": "HW Add",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 800,
        "y": 940,
        "wires": []
    },
    {
        "id": "14b65f612eb55693",
        "type": "comment",
        "z": "d1dc3db337ee0cf2",
        "name": "MAC Address",
        "info": "https://randomnerdtutorials.com/get-change-esp32-esp8266-mac-address-arduino/",
        "x": 1050,
        "y": 880,
        "wires": []
    },
    {
        "id": "28aa6d817e8d9c75",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/Firmware",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 500,
        "y": 880,
        "wires": [
            [
                "d02b0d1f2ae9dd9e"
            ]
        ]
    },
    {
        "id": "f7d25b7f4504e874",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/HWAddress",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 500,
        "y": 940,
        "wires": [
            [
                "e85313e8fbad8b40"
            ]
        ]
    },
    {
        "id": "fad3e0c25eb28d47",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/Date",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 480,
        "y": 460,
        "wires": [
            [
                "c802be90e1109c91"
            ]
        ]
    },
    {
        "id": "c802be90e1109c91",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 5,
        "width": "2",
        "height": "1",
        "name": "Current Date",
        "label": "",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 810,
        "y": 460,
        "wires": []
    },
    {
        "id": "f08b14bf23f1012c",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/Time",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 480,
        "y": 520,
        "wires": [
            [
                "b00bd6ba92ed10aa"
            ]
        ]
    },
    {
        "id": "b00bd6ba92ed10aa",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 6,
        "width": "2",
        "height": "1",
        "name": "Current Time",
        "label": "",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 810,
        "y": 520,
        "wires": []
    },
    {
        "id": "5b7615517936dbc4",
        "type": "ui_level",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 3,
        "width": 0,
        "height": 0,
        "name": "RSSI Value",
        "label": "RSSI Value in db = ",
        "colorHi": "#73d216",
        "colorWarn": "#e6e600",
        "colorNormal": "#cc0000",
        "colorOff": "#2e3436",
        "min": "-100",
        "max": "-40",
        "segWarn": "",
        "segHigh": "",
        "unit": "",
        "layout": "sh",
        "channelA": "",
        "channelB": "",
        "decimals": 0,
        "animations": "soft",
        "shape": "3",
        "colorschema": "rainbow",
        "textoptions": "default",
        "colorText": "#eeeeee",
        "fontLabel": "",
        "fontValue": "",
        "fontSmall": "",
        "colorFromTheme": true,
        "textAnimations": true,
        "hideValue": false,
        "tickmode": "off",
        "peakmode": false,
        "property": "payload",
        "peaktime": 3000,
        "x": 1010,
        "y": 240,
        "wires": []
    },
    {
        "id": "87c6e88ea92a03fd",
        "type": "ui_level",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 2,
        "width": 0,
        "height": 0,
        "name": "Ping Latency",
        "label": "Ping Latency in ms = ",
        "colorHi": "#e60000",
        "colorWarn": "#e6e600",
        "colorNormal": "#00b33c",
        "colorOff": "#595959",
        "min": 0,
        "max": "500",
        "segWarn": "",
        "segHigh": "",
        "unit": "",
        "layout": "sh",
        "channelA": "",
        "channelB": "",
        "decimals": 0,
        "animations": "soft",
        "shape": "3",
        "colorschema": "rainbow",
        "textoptions": "default",
        "colorText": "#eeeeee",
        "fontLabel": "",
        "fontValue": "",
        "fontSmall": "",
        "colorFromTheme": true,
        "textAnimations": true,
        "hideValue": false,
        "tickmode": "off",
        "peakmode": false,
        "property": "payload",
        "peaktime": 3000,
        "x": 510,
        "y": 240,
        "wires": []
    },
    {
        "id": "a61bf444cdc66d58",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 18,
        "width": "1",
        "height": "1",
        "name": "FTP Server",
        "label": "",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-folder-open\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 1070,
        "y": 1600,
        "wires": []
    },
    {
        "id": "fe71aa4c559fc8da",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \" \")?\"lime\":\"red\";\n//return msg;\n\nif (msg.payload === \"Clear\"){\nmsg.color = \"lime\";\nreturn msg;\n}\n\nif (msg.payload === \"Client\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nif (msg.payload === \"Off\"){\nmsg.color = \"grey\";\nreturn msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 900,
        "y": 1600,
        "wires": [
            [
                "a61bf444cdc66d58"
            ]
        ]
    },
    {
        "id": "567a73b61a7a30bf",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 20,
        "width": "1",
        "height": "1",
        "name": "SSH Server",
        "label": "",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-terminal\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 1090,
        "y": 1800,
        "wires": []
    },
    {
        "id": "a0e5f56ca5df4c23",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \" \")?\"lime\":\"red\";\n//return msg;\n\nif (msg.payload === \"Clear\"){\nmsg.color = \"lime\";\nreturn msg;\n}\n\nif (msg.payload === \"Client\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nif (msg.payload === \"Off\"){\nmsg.color = \"grey\";\nreturn msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 920,
        "y": 1800,
        "wires": [
            [
                "567a73b61a7a30bf"
            ]
        ]
    },
    {
        "id": "195b158f586cefa7",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 22,
        "width": "1",
        "height": "1",
        "name": "Telnet Server",
        "label": "",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-television\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 1150,
        "y": 2000,
        "wires": []
    },
    {
        "id": "6f928369937fe682",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \" \")?\"lime\":\"red\";\n//return msg;\n\nif (msg.payload === \"Clear\"){\nmsg.color = \"lime\";\nreturn msg;\n}\n\nif (msg.payload === \"Client\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nif (msg.payload === \"Off\"){\nmsg.color = \"grey\";\nreturn msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 940,
        "y": 2000,
        "wires": [
            [
                "195b158f586cefa7"
            ]
        ]
    },
    {
        "id": "b7b6655464271673",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 24,
        "width": "1",
        "height": "1",
        "name": "HTTP Server",
        "label": "",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-globe\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 1170,
        "y": 2220,
        "wires": []
    },
    {
        "id": "f12869f7a53ac2fd",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \" \")?\"lime\":\"red\";\n//return msg;\n\nif (msg.payload === \"Clear\"){\nmsg.color = \"lime\";\nreturn msg;\n}\n\nif (msg.payload === \"Client\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nif (msg.payload === \"Off\"){\nmsg.color = \"grey\";\nreturn msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 940,
        "y": 2220,
        "wires": [
            [
                "b7b6655464271673"
            ]
        ]
    },
    {
        "id": "060fad04d21555ae",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 26,
        "width": "1",
        "height": "1",
        "name": "HTTPS Server",
        "label": "",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-lock\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 1160,
        "y": 2440,
        "wires": []
    },
    {
        "id": "e1d4fa3c10eb8573",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \" \")?\"lime\":\"red\";\n//return msg;\n\nif (msg.payload === \"Clear\"){\nmsg.color = \"lime\";\nreturn msg;\n}\n\nif (msg.payload === \"Client\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nif (msg.payload === \"Off\"){\nmsg.color = \"grey\";\nreturn msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 960,
        "y": 2440,
        "wires": [
            [
                "060fad04d21555ae"
            ]
        ]
    },
    {
        "id": "188da874a869f398",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 28,
        "width": "1",
        "height": "1",
        "name": "SMTP Server",
        "label": "",
        "format": "<font color={{msg.color}} ><i class=\"fa fa-envelope\" style=\"font-size:24px;\"></i></font>",
        "layout": "row-spread",
        "className": "",
        "x": 1160,
        "y": 2660,
        "wires": []
    },
    {
        "id": "93c860a5b5d89c9f",
        "type": "function",
        "z": "d1dc3db337ee0cf2",
        "name": "Red LED",
        "func": "// msg.color = (msg.payload === \" \")?\"lime\":\"red\";\n//return msg;\n\nif (msg.payload === \"Clear\"){\nmsg.color = \"lime\";\nreturn msg;\n}\n\nif (msg.payload === \"Client\"){\nmsg.color = \"red\";\nreturn msg;\n}\n\nif (msg.payload === \"Off\"){\nmsg.color = \"grey\";\nreturn msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 960,
        "y": 2660,
        "wires": [
            [
                "188da874a869f398"
            ]
        ]
    },
    {
        "id": "fc0472e2a0c97d46",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 15,
        "width": "5",
        "height": "1",
        "name": "TCP Client Count",
        "label": "TCP Client Count",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 950,
        "y": 600,
        "wires": []
    },
    {
        "id": "545c6266d5aa5c07",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/TCPClients",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 500,
        "y": 600,
        "wires": [
            [
                "fc0472e2a0c97d46"
            ]
        ]
    },
    {
        "id": "d0e9e5f3e808b65a",
        "type": "ui_button",
        "z": "d1dc3db337ee0cf2",
        "name": "Reset TCP Clients",
        "group": "3444198712388431",
        "order": 16,
        "width": "2",
        "height": "1",
        "passthru": false,
        "label": "Clear",
        "tooltip": "",
        "color": "#585858",
        "bgcolor": "#242424",
        "className": "",
        "icon": "",
        "payload": "ResetTCPClients",
        "payloadType": "str",
        "topic": "ESP01/ResetTCPClients",
        "topicType": "str",
        "x": 490,
        "y": 1220,
        "wires": [
            [
                "fa3decb281a3ba53",
                "2aab5c03ff624e21"
            ]
        ]
    },
    {
        "id": "fa3decb281a3ba53",
        "type": "mqtt out",
        "z": "d1dc3db337ee0cf2",
        "name": "ESP01 Reset TCP Clients",
        "topic": "ESP01/ResetTCPClients",
        "qos": "0",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "54b01280.e7076c",
        "x": 790,
        "y": 1220,
        "wires": []
    },
    {
        "id": "bb2c28b10ba5ad03",
        "type": "link out",
        "z": "d1dc3db337ee0cf2",
        "name": "Clear TCP Clients",
        "mode": "link",
        "links": [
            "1b7b7d0721cc4cf1",
            "5eb21566ab868c25",
            "87df62aaf307c71b",
            "888d524800e9c86d",
            "94b4a53bc1773d41",
            "a184f5ba1ad38655",
            "ec8cd5104a08d682",
            "f364f4c6158bed1b"
        ],
        "x": 895,
        "y": 1280,
        "wires": []
    },
    {
        "id": "87df62aaf307c71b",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "FTP Client",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 475,
        "y": 1540,
        "wires": [
            [
                "9186efa7f7afa09d",
                "41ac9822827acfe3"
            ]
        ]
    },
    {
        "id": "ec8cd5104a08d682",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "SSH Client",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 475,
        "y": 1740,
        "wires": [
            [
                "4c845187030e4736",
                "7e29671eece51af3"
            ]
        ]
    },
    {
        "id": "1b7b7d0721cc4cf1",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "Telnet Client",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 475,
        "y": 1940,
        "wires": [
            [
                "29a8d118f4998cf3",
                "c4e4f35cda6c76b6"
            ]
        ]
    },
    {
        "id": "888d524800e9c86d",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "HTTP Client",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 495,
        "y": 2160,
        "wires": [
            [
                "4fc084da31a95a8a",
                "9d221eb202384d79"
            ]
        ]
    },
    {
        "id": "a184f5ba1ad38655",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "HTTPS Client",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 495,
        "y": 2380,
        "wires": [
            [
                "5c405ddab807496e",
                "87bbb1ef789d170a"
            ]
        ]
    },
    {
        "id": "a74b73c0ffb4d96f",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Client",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 650,
        "y": 1600,
        "wires": [
            [
                "fe71aa4c559fc8da"
            ]
        ]
    },
    {
        "id": "2aab5c03ff624e21",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "ResetTCPClients",
                "fromt": "str",
                "to": " ",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 750,
        "y": 1280,
        "wires": [
            [
                "bb2c28b10ba5ad03"
            ]
        ]
    },
    {
        "id": "5eb21566ab868c25",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "SMTP Client",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 495,
        "y": 2600,
        "wires": [
            [
                "56e2ec02a2709345",
                "d0a5c160ed50a4eb"
            ]
        ]
    },
    {
        "id": "0ee94c6e7399d302",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 12,
        "width": "3",
        "height": "1",
        "name": "Triggered Time",
        "label": "Triggered Time",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 240,
        "y": 680,
        "wires": []
    },
    {
        "id": "84c0495087c52009",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/TriggerDate",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 500,
        "y": 680,
        "wires": [
            [
                "ecba26f4dd04ab6a"
            ]
        ]
    },
    {
        "id": "ecba26f4dd04ab6a",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 13,
        "width": "2",
        "height": "1",
        "name": "Trigger Date",
        "label": "",
        "format": "{{msg.payload}}",
        "layout": "row-center",
        "className": "",
        "x": 810,
        "y": 680,
        "wires": []
    },
    {
        "id": "9578015a749165b0",
        "type": "mqtt in",
        "z": "d1dc3db337ee0cf2",
        "name": "",
        "topic": "ESP01/TriggerTime",
        "qos": "0",
        "datatype": "auto",
        "broker": "54b01280.e7076c",
        "nl": false,
        "rap": false,
        "inputs": 0,
        "x": 500,
        "y": 740,
        "wires": [
            [
                "e980250a2692326a"
            ]
        ]
    },
    {
        "id": "e980250a2692326a",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 14,
        "width": "2",
        "height": "1",
        "name": "Trigger Time",
        "label": "",
        "format": "{{msg.payload}}",
        "layout": "row-center",
        "className": "",
        "x": 810,
        "y": 740,
        "wires": []
    },
    {
        "id": "f364f4c6158bed1b",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "Clear Date",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 695,
        "y": 660,
        "wires": [
            [
                "ecba26f4dd04ab6a"
            ]
        ]
    },
    {
        "id": "94b4a53bc1773d41",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "Clear Time",
        "links": [
            "bb2c28b10ba5ad03"
        ],
        "x": 695,
        "y": 720,
        "wires": [
            [
                "e980250a2692326a"
            ]
        ]
    },
    {
        "id": "01316d0bbe4ff6a3",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "false",
                "fromt": "bool",
                "to": "Off",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 510,
        "y": 300,
        "wires": [
            [
                "339b2c68ae378776",
                "a68cb745c873e2c0"
            ]
        ]
    },
    {
        "id": "f5089535a76e8450",
        "type": "ui_text",
        "z": "d1dc3db337ee0cf2",
        "group": "3444198712388431",
        "order": 4,
        "width": "3",
        "height": "1",
        "name": "Current Time",
        "label": "Current Time",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "x": 230,
        "y": 460,
        "wires": []
    },
    {
        "id": "41ac9822827acfe3",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": " ",
                "fromt": "re",
                "to": "Clear",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 630,
        "y": 1560,
        "wires": [
            [
                "fe71aa4c559fc8da"
            ]
        ]
    },
    {
        "id": "a68cb745c873e2c0",
        "type": "link out",
        "z": "d1dc3db337ee0cf2",
        "name": "Client Offline",
        "mode": "link",
        "links": [
            "4347a07c0b778610",
            "06c65f3671a60c1a",
            "3272f591adf14aee",
            "c92e56c5cca51589",
            "81aa5015c8a9c62a",
            "67743835d3ae315d"
        ],
        "x": 685,
        "y": 340,
        "wires": []
    },
    {
        "id": "4347a07c0b778610",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "FTP Offline",
        "links": [
            "a68cb745c873e2c0"
        ],
        "x": 795,
        "y": 1560,
        "wires": [
            [
                "fe71aa4c559fc8da"
            ]
        ]
    },
    {
        "id": "7e29671eece51af3",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": " ",
                "fromt": "re",
                "to": "Clear",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 630,
        "y": 1760,
        "wires": [
            [
                "a0e5f56ca5df4c23"
            ]
        ]
    },
    {
        "id": "06c65f3671a60c1a",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "SSH Offline",
        "links": [
            "a68cb745c873e2c0"
        ],
        "x": 815,
        "y": 1760,
        "wires": [
            [
                "a0e5f56ca5df4c23"
            ]
        ]
    },
    {
        "id": "3272f591adf14aee",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "Telnet Offline",
        "links": [
            "a68cb745c873e2c0"
        ],
        "x": 835,
        "y": 1960,
        "wires": [
            [
                "6f928369937fe682"
            ]
        ]
    },
    {
        "id": "c4e4f35cda6c76b6",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": " ",
                "fromt": "re",
                "to": "Clear",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 630,
        "y": 1960,
        "wires": [
            [
                "6f928369937fe682"
            ]
        ]
    },
    {
        "id": "c92e56c5cca51589",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "HTTP Offline",
        "links": [
            "a68cb745c873e2c0"
        ],
        "x": 835,
        "y": 2180,
        "wires": [
            [
                "f12869f7a53ac2fd"
            ]
        ]
    },
    {
        "id": "81aa5015c8a9c62a",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "HTTPS Offline",
        "links": [
            "a68cb745c873e2c0"
        ],
        "x": 835,
        "y": 2400,
        "wires": [
            [
                "e1d4fa3c10eb8573"
            ]
        ]
    },
    {
        "id": "9d221eb202384d79",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": " ",
                "fromt": "re",
                "to": "Clear",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 650,
        "y": 2180,
        "wires": [
            [
                "f12869f7a53ac2fd"
            ]
        ]
    },
    {
        "id": "87bbb1ef789d170a",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": " ",
                "fromt": "re",
                "to": "Clear",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 670,
        "y": 2400,
        "wires": [
            [
                "e1d4fa3c10eb8573"
            ]
        ]
    },
    {
        "id": "67743835d3ae315d",
        "type": "link in",
        "z": "d1dc3db337ee0cf2",
        "name": "SMTP Offline",
        "links": [
            "a68cb745c873e2c0"
        ],
        "x": 835,
        "y": 2620,
        "wires": [
            [
                "93c860a5b5d89c9f"
            ]
        ]
    },
    {
        "id": "d0a5c160ed50a4eb",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": " ",
                "fromt": "re",
                "to": "Clear",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 670,
        "y": 2620,
        "wires": [
            [
                "93c860a5b5d89c9f"
            ]
        ]
    },
    {
        "id": "8d113f51e1a8972f",
        "type": "switch",
        "z": "d1dc3db337ee0cf2",
        "name": "Client On",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "Off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 480,
        "y": 1600,
        "wires": [
            [
                "a74b73c0ffb4d96f"
            ]
        ]
    },
    {
        "id": "f2b240625766df9d",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Client",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 650,
        "y": 1800,
        "wires": [
            [
                "a0e5f56ca5df4c23"
            ]
        ]
    },
    {
        "id": "db5b8d347b986ae9",
        "type": "switch",
        "z": "d1dc3db337ee0cf2",
        "name": "Client On",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "Off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 480,
        "y": 1800,
        "wires": [
            [
                "f2b240625766df9d"
            ]
        ]
    },
    {
        "id": "5cf2b2c6de3f03ca",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Client",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 650,
        "y": 2000,
        "wires": [
            [
                "6f928369937fe682"
            ]
        ]
    },
    {
        "id": "ca71f7ef8c48be2c",
        "type": "switch",
        "z": "d1dc3db337ee0cf2",
        "name": "Client On",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "Off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 480,
        "y": 2000,
        "wires": [
            [
                "5cf2b2c6de3f03ca"
            ]
        ]
    },
    {
        "id": "89ac583b7ce170cf",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Client",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 670,
        "y": 2220,
        "wires": [
            [
                "f12869f7a53ac2fd"
            ]
        ]
    },
    {
        "id": "791e344141fa4d1c",
        "type": "switch",
        "z": "d1dc3db337ee0cf2",
        "name": "Client On",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "Off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 500,
        "y": 2220,
        "wires": [
            [
                "89ac583b7ce170cf"
            ]
        ]
    },
    {
        "id": "9be7559841af483f",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Client",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 690,
        "y": 2440,
        "wires": [
            [
                "e1d4fa3c10eb8573"
            ]
        ]
    },
    {
        "id": "5b33c557787d9734",
        "type": "switch",
        "z": "d1dc3db337ee0cf2",
        "name": "Client On",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "Off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 520,
        "y": 2440,
        "wires": [
            [
                "9be7559841af483f"
            ]
        ]
    },
    {
        "id": "81df92b3ecd7c5e3",
        "type": "change",
        "z": "d1dc3db337ee0cf2",
        "name": "Change Payload",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "Client",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 690,
        "y": 2660,
        "wires": [
            [
                "93c860a5b5d89c9f"
            ]
        ]
    },
    {
        "id": "74adb2d04aa282a5",
        "type": "switch",
        "z": "d1dc3db337ee0cf2",
        "name": "Client On",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "Off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 520,
        "y": 2660,
        "wires": [
            [
                "81df92b3ecd7c5e3"
            ]
        ]
    },
    {
        "id": "3444198712388431",
        "type": "ui_group",
        "name": "Brain in Jar",
        "tab": "238580cca2e1ee0f",
        "order": 1,
        "disp": true,
        "width": "7",
        "collapse": false,
        "className": ""
    },
    {
        "id": "54b01280.e7076c",
        "type": "mqtt-broker",
        "name": "MQTT_BROKER",
        "broker": "192.168.10.101",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "3",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "sessionExpiry": ""
    },
    {
        "id": "238580cca2e1ee0f",
        "type": "ui_tab",
        "name": "Brain in Jar",
        "icon": "dashboard",
        "order": 6,
        "disabled": false,
        "hidden": false
    }
]

There may never be an instance of someone poking around the network for it to detect, but at least it has potential as a conversation piece for my desktop.

Comments are closed.