Table of Contents

About

Growing in-doors flowers and produce are a very interesting latent atavism of people being transported into urban areas due to jobs and feel the lack of greeneries around them to be eerie.

Some ready-made solutions exist, browsing some of the largest outlets with prices between USD60 and USD200, given different features and doohickeys that can be bolted on, such as "smart growing", receiving notifications via your mobile phone when plants need watering, and so on. We find that one of the major drawbacks of these all-inclusive hydroponics bays is that they still have a certain amount of lock-in tactics, mainly due to their delivery system that is concentrated enough to be able to grow right about any plants with any exotic diet; a delivery system that will have to be renewed once the ones delivered with the hydroponics bay runs out. For instance, most of the commercially available hydroponics bays use a sponge-cone that is also spiked with some type of fertilizer. Once the cones run out, you will have to buy new cones, such that you will more or less end up paying a subscription.

In any case, here are some of the features of the commercially available hydroponics bays; enumerated such that we know what has to be created as a substitute:

Given the above, and with the help of some IoT, a new circuit can be sketched, along with a shopping list, in order to create a DIY hydroponics bay.

Requirements

This project will be built on top of the solar panel endeavor and will be powered entirely by solar. In case this project is to be executed individually, then just a $12V$ input is needed.

the nice part about the pot is that once the flowers are grown, the cotton rope will water the roots of the plants over time. Similarly, any excess water will just drip down into the storage basin at the bottom without having to clog the soil.

Block Diagram

The following is the complete block diagram of the project,

                                                                        
                                                    Grow                
                                             \\  | Lights               
                                  #             /|  ----------+         
                                  #        ----+ +--          |         
                                  #             \| --------+  |         
                                  #              |         |  |         
                                  # water                  |  |         
                              +------------------+         |  |         
                              |   # distribution |         |  |         
                  +-----+     |   #         +----+----+    |  |         
                  |     |     |   #         |         |    |  |         
                +-|-----|-+   |   #       #///#     #///#  |  |         
                | |     | |   |   #       #...#     #...#  |  |         
          +-----+-+-+   | |   |   #       #...#     #...#  |  |         
          | to 3.3V |   | |   |   #########################|##|######## 
          +---+-+---+   | |   |                            |  |         
              | |       | |   |                            |  |         
              | |       | |   |                            |  |         
              | |   +---+-+-+ |                            |  |         
              | |   | Relay | |                            |  |         
              | |   +-+-+-+-+ |                            |  |         
              | |     | | |   | GPIO           Transistor  |  |         
              | |     | | +---|-----+            Switch    |  |         
      12V     | |     | |     |     |            Array     |  |         
     >--------+-|-----+ |     |     |                      |  |         
 battery      | |     | |     |   +-+-----+        |       |  |         
     >--------|-+-------+     |   | ESP32 |       /+    +--+--+--+      
              | |     | |     |   |       +--/\/-| .    | Grow-  |      
              | |     | |     |   |       |       \+----+  Light |      
              | |     | |     |   |       +----.....    | Remote |      
              | |   +-+-+---+ |   |       |        .----+        |      
              | |   | water | |   |       +----.....    |        |      
              | |   | pump  +-+   |       |        .----+        |      
              | |   +---+---+     |       +----.....    |        |      
              | |       |         |       |        .----+        |      
              | |       |         +-+-----+        .    |        |      
              | |       |           |              .    +-+------+      
              | |       |           |              |      |             
           +--+-+--+    |           |              |      |             
           | to 5V +----|-----------+---------------------+             
           +-------+    |                          |                    
                        |                          |                    
                        |                         ///                   
                    +---------+                                         
                    |  water  |                                         
                    |..     ..|                                         
                    |.........|                                         
                    |.........|                                         
                    |.........|                                         
                    +---------+                                         

along with the water distribution system at the top-right where the plants will grow. Here are some notes on how all of this is supposed to come together:

The entire system will be mediated from Node-Red, even though it would be fairly trivial to just include all the logic within the ESP32 instead.

Taking Apart the Grow Lights Remote

Fortunately, the grow lights are shipped with a remote that is easy to disassemble and, even more fortunately, the buttons are press buttons such that they can be hooked into using a transistor switch.

The wires can then be de-soldered and new wires fitted on the final PCB.

Realization

Here are the realizations of the various components of this project.

The Controller

Just like reading the ending of a book before the book itself, the following table contains the realized project from top to bottom.

Top Bottom

Here is an explantion of the components to be found on the PCB, following the image of the top of the PCB, from left to right:

The Pump and Water Tank

The water tank is a 5L canister with a plastic lid that is removed in order to fit a plastic tube connector and a power jack. The idea is that when the tank needs refilling, the plastic tube carrying the water to the plants can be removed, along with the power jack such that the tank can be transported on its own to be refilled.

The pump itself is just a $12V$ pump that should manage to push water from the tank through the plastic tubes. Here is a closeup of the plastic cap that has been modified to fit two ports for water tubes and power.

The water connector is made out of a T-junction plastic bit that is used for car windshields to split the water stream in two. The transversal junction of the T has been cut and then tapered such that a plain plastic pipe is obtained that is then fitted to the plastic lid using JB Weld.

Bringing it All Together

The PCB controller is mounted on the side of a wardrobe, the water tank is placed somwhere underneath the wardrobe and plastic tubes are used to distribute water to the planters. Overall, the result looks pretty good and works well given some preliminary testing such that we can move on to the software.

Software

The ESP32 uses a boilerplate Arduino pin setting sketch and the rest is controlled via Node-Red.

Right now, the Node-Red flow is responsible for turning the lights on and off depending on the time of day. About 8 hours or the grow lights being on should be sufficient to allow any plants to grow properly. Although not implemented yet, the water pump can be scheduled to drip some water both in the mornings and the evenings in order to ensure that the soil is always moist.

Node-Red Flow

[
    {
        "id": "32d027e661530e74",
        "type": "tab",
        "label": "Hydroponics",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "4484ae51a2ccb4f5",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Feedback",
        "style": {
            "label": true
        },
        "nodes": [
            "8ba06389a07522f9",
            "92ceef98a69ba4e4",
            "1ddb01818b54a5a4"
        ],
        "x": 294,
        "y": 19,
        "w": 1568,
        "h": 328
    },
    {
        "id": "0a261dbe1394d521",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Light Switch",
        "style": {
            "label": true
        },
        "nodes": [
            "590dbe14a34f5778",
            "374c66be6df1abe5",
            "975d366c61bfb773",
            "6cbc0ccc51390907",
            "ef3672983b7c69ad",
            "8e7ba0aef8e2df43",
            "51457689a5d94d7d",
            "4a4e5cc7163482f4",
            "bf5c7f64d1132744",
            "7becb909f4bddf16",
            "896b64c95774305c",
            "08495d894db77d04",
            "641267a7bbff47c4",
            "b8a7896a4f0c9722",
            "053a5d720148da79",
            "62ff6f26bb9d82b9",
            "975b719b01b41fdd",
            "e0ff8e014faa2970",
            "4995224ad9848ea7"
        ],
        "x": 314,
        "y": 439,
        "w": 1112,
        "h": 522
    },
    {
        "id": "38e386a497b7494c",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Scheduling",
        "style": {
            "label": true
        },
        "nodes": [
            "4b399c7602045b83",
            "f8e19949a8523515",
            "a8f8ee5d7e221371",
            "40dbda74da5ec015",
            "ad18e871217116cb",
            "3d35bbdbecf29f48",
            "bc93b19563327aaf",
            "6b694e3ada38423b",
            "900a0f7e457b613d"
        ],
        "x": 314,
        "y": 1019,
        "w": 1062,
        "h": 222
    },
    {
        "id": "d68759f86859c790",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Water Pump",
        "style": {
            "label": true
        },
        "nodes": [
            "443b1549a1832b4e",
            "a387335795df9388",
            "7b7351cf24c53d30",
            "00283e3635668185",
            "563c1db45f5d6eed"
        ],
        "x": 314,
        "y": 1279,
        "w": 512,
        "h": 162
    },
    {
        "id": "1ddb01818b54a5a4",
        "type": "group",
        "z": "32d027e661530e74",
        "g": "4484ae51a2ccb4f5",
        "name": "Light Status",
        "style": {
            "label": true
        },
        "nodes": [
            "e923ef9a7a1ce56b",
            "4d8bef63bbabbfb4",
            "3751f6e88c02a18e",
            "78767dc1de179d15",
            "4e602877d1662927",
            "8b6322c929eafce1",
            "3d7c6f4a46ffd2f6",
            "082b9a0a921ac26b",
            "288f0c1581828a75",
            "2e80482e137f0668",
            "e4dd511e0bcee2ee",
            "b975b3a9a1dc52b1",
            "ea79023ab4b33b24"
        ],
        "x": 474,
        "y": 51.5,
        "w": 1362,
        "h": 269.5
    },
    {
        "id": "590dbe14a34f5778",
        "type": "mqtt out",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "topic": "esp/9067",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "725ed69c.6d76a8",
        "x": 1080,
        "y": 840,
        "wires": []
    },
    {
        "id": "8ba06389a07522f9",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "4484ae51a2ccb4f5",
        "name": "debug 22",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 60,
        "wires": []
    },
    {
        "id": "92ceef98a69ba4e4",
        "type": "mqtt in",
        "z": "32d027e661530e74",
        "g": "4484ae51a2ccb4f5",
        "name": "",
        "topic": "esp/9067",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "725ed69c.6d76a8",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 380,
        "y": 120,
        "wires": [
            [
                "8ba06389a07522f9",
                "e923ef9a7a1ce56b"
            ]
        ]
    },
    {
        "id": "374c66be6df1abe5",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "measure(GPIO 35)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "35",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "measure",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 870,
        "y": 920,
        "wires": [
            [
                "590dbe14a34f5778"
            ]
        ]
    },
    {
        "id": "e923ef9a7a1ce56b",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "GPIO 35 |-> 1",
        "property": "payload.pin",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "35",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 580,
        "y": 240,
        "wires": [
            [
                "4d8bef63bbabbfb4"
            ],
            []
        ]
    },
    {
        "id": "975d366c61bfb773",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init(msg)",
        "func": "msg = {}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 640,
        "y": 920,
        "wires": [
            [
                "374c66be6df1abe5"
            ]
        ]
    },
    {
        "id": "443b1549a1832b4e",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "On (Relay)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "25",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.state",
                "pt": "msg",
                "to": "on",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "set",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 1320,
        "wires": [
            [
                "563c1db45f5d6eed"
            ]
        ]
    },
    {
        "id": "a387335795df9388",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{}",
        "payloadType": "json",
        "x": 410,
        "y": 1320,
        "wires": [
            [
                "443b1549a1832b4e"
            ]
        ]
    },
    {
        "id": "7b7351cf24c53d30",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "Off (Relay)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "25",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.state",
                "pt": "msg",
                "to": "off",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "set",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 1400,
        "wires": [
            [
                "563c1db45f5d6eed"
            ]
        ]
    },
    {
        "id": "00283e3635668185",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{}",
        "payloadType": "json",
        "x": 410,
        "y": 1400,
        "wires": [
            [
                "7b7351cf24c53d30"
            ]
        ]
    },
    {
        "id": "4b399c7602045b83",
        "type": "light-scheduler",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "settings": "ef6eaeb844d08601",
        "events": "[{\"start\":{\"dow\":2,\"mod\":240},\"end\":{\"dow\":2,\"mod\":1140}},{\"start\":{\"dow\":6,\"mod\":240},\"end\":{\"dow\":6,\"mod\":1140}},{\"start\":{\"dow\":0,\"mod\":240},\"end\":{\"dow\":0,\"mod\":1140}},{\"start\":{\"dow\":4,\"mod\":240},\"end\":{\"dow\":4,\"mod\":1140}},{\"start\":{\"dow\":5,\"mod\":240},\"end\":{\"dow\":5,\"mod\":1140}},{\"start\":{\"dow\":3,\"mod\":240},\"end\":{\"dow\":3,\"mod\":1140}},{\"start\":{\"dow\":1,\"mod\":240},\"end\":{\"dow\":1,\"mod\":1140}}]",
        "topic": "",
        "name": "",
        "onPayload": "on",
        "onPayloadType": "str",
        "offPayload": "off",
        "offPayloadType": "str",
        "onlyWhenDark": false,
        "scheduleRndMax": 0,
        "sunElevationThreshold": 6,
        "sunShowElevationInStatus": true,
        "outputfreq": "output.statechange.startup",
        "x": 460,
        "y": 1120,
        "wires": [
            [
                "f8e19949a8523515"
            ]
        ]
    },
    {
        "id": "4d8bef63bbabbfb4",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "init(msg) & msg.payload = value",
        "func": "let value = msg.payload.value\nmsg = {}\nmsg.payload = parseInt(value)\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 830,
        "y": 240,
        "wires": [
            [
                "3751f6e88c02a18e"
            ]
        ]
    },
    {
        "id": "6cbc0ccc51390907",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "push(GPIO 12)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "12",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "push",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.delay",
                "pt": "msg",
                "to": "75",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 860,
        "y": 840,
        "wires": [
            [
                "975d366c61bfb773",
                "590dbe14a34f5778"
            ]
        ]
    },
    {
        "id": "3d7c6f4a46ffd2f6",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "debug 25",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1680,
        "y": 140,
        "wires": []
    },
    {
        "id": "3751f6e88c02a18e",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "ADC := High | Low |-> 1 | 2",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "gt",
                "v": "2048",
                "vt": "str"
            },
            {
                "t": "lte",
                "v": "2048",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 1120,
        "y": 240,
        "wires": [
            [
                "4e602877d1662927"
            ],
            [
                "78767dc1de179d15"
            ],
            []
        ]
    },
    {
        "id": "8b6322c929eafce1",
        "type": "redis-command",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "server": "a37a41f9.a98da8",
        "command": "SET",
        "name": "",
        "topic": "",
        "params": "[]",
        "paramsType": "json",
        "payloadType": "json",
        "block": false,
        "x": 1680,
        "y": 240,
        "wires": [
            [
                "082b9a0a921ac26b",
                "3d7c6f4a46ffd2f6"
            ]
        ]
    },
    {
        "id": "4e602877d1662927",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "SET harponics/light/state := off",
        "func": "msg = {}\nmsg.payload = [\"harponics/light/state\", \"off\"]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1430,
        "y": 280,
        "wires": [
            [
                "8b6322c929eafce1"
            ]
        ]
    },
    {
        "id": "78767dc1de179d15",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "SET harponics/light/state := on",
        "func": "msg = {}\nmsg.payload = [\"harponics/light/state\", \"on\"]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1430,
        "y": 200,
        "wires": [
            [
                "8b6322c929eafce1"
            ]
        ]
    },
    {
        "id": "ef3672983b7c69ad",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "switch(msg.payload) := on | off",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 1050,
        "y": 560,
        "wires": [
            [
                "7becb909f4bddf16"
            ],
            [
                "896b64c95774305c"
            ]
        ]
    },
    {
        "id": "8e7ba0aef8e2df43",
        "type": "ui_switch",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "label": "Switch",
        "tooltip": "",
        "group": "8ae51af3338acf00",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "decouple": "false",
        "topic": "topic",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "x": 630,
        "y": 720,
        "wires": [
            [
                "08495d894db77d04",
                "975b719b01b41fdd"
            ]
        ]
    },
    {
        "id": "51457689a5d94d7d",
        "type": "redis-command",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "server": "a37a41f9.a98da8",
        "command": "GET",
        "name": "",
        "topic": "",
        "params": "[]",
        "paramsType": "json",
        "payloadType": "json",
        "block": false,
        "x": 820,
        "y": 560,
        "wires": [
            [
                "ef3672983b7c69ad"
            ]
        ]
    },
    {
        "id": "4a4e5cc7163482f4",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "GET harponics/light/state",
        "func": "msg = {}\nmsg.payload = [\"harponics/light/state\"]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 610,
        "y": 560,
        "wires": [
            [
                "51457689a5d94d7d"
            ]
        ]
    },
    {
        "id": "bf5c7f64d1132744",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{}",
        "payloadType": "json",
        "x": 550,
        "y": 500,
        "wires": [
            [
                "62ff6f26bb9d82b9"
            ]
        ]
    },
    {
        "id": "7becb909f4bddf16",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "msg.payload := true",
        "func": "msg = {}\nmsg.payload = true\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1290,
        "y": 480,
        "wires": [
            [
                "053a5d720148da79",
                "8e7ba0aef8e2df43"
            ]
        ]
    },
    {
        "id": "896b64c95774305c",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "msg.payload := false",
        "func": "msg = {}\nmsg.payload = false\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1300,
        "y": 620,
        "wires": [
            [
                "053a5d720148da79",
                "8e7ba0aef8e2df43"
            ]
        ]
    },
    {
        "id": "08495d894db77d04",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init(msg)",
        "func": "msg = {}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 840,
        "y": 720,
        "wires": [
            [
                "6cbc0ccc51390907"
            ]
        ]
    },
    {
        "id": "641267a7bbff47c4",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init(msg)",
        "func": "msg = {}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 400,
        "y": 560,
        "wires": [
            [
                "4a4e5cc7163482f4"
            ]
        ]
    },
    {
        "id": "f8e19949a8523515",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "msg.payload |-> msg.request",
        "rules": [
            {
                "t": "set",
                "p": "request",
                "pt": "msg",
                "to": "payload",
                "tot": "msg",
                "dc": true
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "[\"harponics/light/state\"]",
                "tot": "json"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 700,
        "y": 1120,
        "wires": [
            [
                "a8f8ee5d7e221371"
            ]
        ]
    },
    {
        "id": "a8f8ee5d7e221371",
        "type": "redis-command",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "server": "a37a41f9.a98da8",
        "command": "GET",
        "name": "",
        "topic": "",
        "params": "[]",
        "paramsType": "json",
        "payloadType": "json",
        "block": false,
        "x": 920,
        "y": 1120,
        "wires": [
            [
                "ad18e871217116cb",
                "6b694e3ada38423b"
            ]
        ]
    },
    {
        "id": "40dbda74da5ec015",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "trigger",
        "payloadType": "str",
        "x": 410,
        "y": 1060,
        "wires": [
            [
                "4b399c7602045b83"
            ]
        ]
    },
    {
        "id": "ad18e871217116cb",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "msg.payload := request |-> 1,2",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "request",
                "vt": "msg"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 1150,
        "y": 1120,
        "wires": [
            [],
            [
                "3d35bbdbecf29f48",
                "bc93b19563327aaf"
            ]
        ]
    },
    {
        "id": "b8a7896a4f0c9722",
        "type": "link in",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "link in 13",
        "links": [
            "75f31c3f7c8a9a38",
            "c78ff9f407cea372",
            "bc93b19563327aaf",
            "ea79023ab4b33b24"
        ],
        "x": 665,
        "y": 780,
        "wires": [
            [
                "08495d894db77d04"
            ]
        ]
    },
    {
        "id": "3d35bbdbecf29f48",
        "type": "delay",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "",
        "pauseType": "delay",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 440,
        "y": 1200,
        "wires": [
            [
                "900a0f7e457b613d"
            ]
        ]
    },
    {
        "id": "563c1db45f5d6eed",
        "type": "mqtt out",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "",
        "topic": "esp/9067",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "725ed69c.6d76a8",
        "x": 740,
        "y": 1360,
        "wires": []
    },
    {
        "id": "053a5d720148da79",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "debug 26",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1100,
        "y": 700,
        "wires": []
    },
    {
        "id": "62ff6f26bb9d82b9",
        "type": "delay",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "pauseType": "delay",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 700,
        "y": 500,
        "wires": [
            [
                "4a4e5cc7163482f4"
            ]
        ]
    },
    {
        "id": "975b719b01b41fdd",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "debug 27",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1040,
        "y": 780,
        "wires": []
    },
    {
        "id": "082b9a0a921ac26b",
        "type": "link out",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "link out 9",
        "mode": "link",
        "links": [
            "e0ff8e014faa2970"
        ],
        "x": 1795,
        "y": 240,
        "wires": []
    },
    {
        "id": "e0ff8e014faa2970",
        "type": "link in",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "link in 14",
        "links": [
            "082b9a0a921ac26b"
        ],
        "x": 445,
        "y": 620,
        "wires": [
            [
                "4a4e5cc7163482f4"
            ]
        ]
    },
    {
        "id": "bc93b19563327aaf",
        "type": "link out",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "link out 10",
        "mode": "link",
        "links": [
            "b8a7896a4f0c9722"
        ],
        "x": 1335,
        "y": 1120,
        "wires": []
    },
    {
        "id": "6b694e3ada38423b",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "debug 28",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1120,
        "y": 1200,
        "wires": []
    },
    {
        "id": "900a0f7e457b613d",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "function 30",
        "func": "msg = {}\nmsg.payload = \"trigger\"\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 610,
        "y": 1200,
        "wires": [
            [
                "4b399c7602045b83"
            ]
        ]
    },
    {
        "id": "4995224ad9848ea7",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 480,
        "y": 920,
        "wires": [
            [
                "975d366c61bfb773"
            ]
        ]
    },
    {
        "id": "e4dd511e0bcee2ee",
        "type": "amazon-echo-device",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "Harponics Lights",
        "topic": "",
        "x": 930,
        "y": 100,
        "wires": [
            [
                "288f0c1581828a75",
                "2e80482e137f0668"
            ]
        ]
    },
    {
        "id": "b975b3a9a1dc52b1",
        "type": "link in",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "link in 19",
        "links": [
            "e83f88e6.89dfb8"
        ],
        "x": 795,
        "y": 100,
        "wires": [
            [
                "e4dd511e0bcee2ee"
            ]
        ]
    },
    {
        "id": "288f0c1581828a75",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "",
        "property": "on",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            },
            {
                "t": "false"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 1110,
        "y": 100,
        "wires": [
            [
                "78767dc1de179d15"
            ],
            [
                "4e602877d1662927"
            ],
            []
        ]
    },
    {
        "id": "2e80482e137f0668",
        "type": "delay",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "",
        "pauseType": "delay",
        "timeout": "2",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1120,
        "y": 160,
        "wires": [
            [
                "ea79023ab4b33b24"
            ]
        ]
    },
    {
        "id": "ea79023ab4b33b24",
        "type": "link out",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "link out 15",
        "mode": "link",
        "links": [
            "b8a7896a4f0c9722"
        ],
        "x": 1235,
        "y": 160,
        "wires": []
    },
    {
        "id": "725ed69c.6d76a8",
        "type": "mqtt-broker",
        "name": "",
        "broker": "",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": false,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willPayload": ""
    },
    {
        "id": "ef6eaeb844d08601",
        "type": "light-scheduler-settings",
        "name": "Local",
        "latitude": "44.49",
        "longitude": "26.1734"
    },
    {
        "id": "a37a41f9.a98da8",
        "type": "redis-config",
        "name": "Local",
        "options": "{}",
        "cluster": false,
        "optionsType": "json"
    },
    {
        "id": "8ae51af3338acf00",
        "type": "ui_group",
        "name": "Lights",
        "tab": "b7988cc7b62d5c6e",
        "order": 1,
        "disp": true,
        "width": "6",
        "collapse": false
    },
    {
        "id": "b7988cc7b62d5c6e",
        "type": "ui_tab",
        "name": "Harponics",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]

Problems and Further Work

Here are a few problems encountered along the way: