Last week we started with our home automation
system based on PIR sensors and Sonoff Switches. Both devices were operated by a Firmware based
on Tinkerman’s Espurna framework. The “brains” of the system is a Raspberry
Pi zero and a script provided by Peter Scargill. And all communication is done via the MQTT
protocol. Today, we will bring these things together
and dig a little into node-red and SQLite. I will also show you, how you can monitor
your Pi Zero from a web interface. So, let’s start:
You remember, I have 2 PIR sensors, one Alexa, and two Sonoff switches. This is just a small setup, but we can learn
a lot which can be used if we extend this setup. Last week, we were able to send messages to
a public MQTT broker. Because we do not want to leave our secure
Wi-Fi network, we first setup our own MQTT broker on a Raspberry Pi behind our Firewall. I did this in video #126. I even posted an image for a Pi Zero. You find a link in the description. So, you have an easy start. If you want to use another Raspberry, you
have to install Raspbian and run the script of Peter. You find a link in the description. So, we have now a working MQTT broker. With the utility “DietPi-setup”, we can
give it a fixed IP address. You can also work with the name of your device,
but, I decided for a fixed address. I also decided to use my old Pi zero without
Wi-Fi, because I will place the device close to my switch and I am able to connect it to
a Ethernet cable. For that, I purchased a 3$ USB hub with Ethernet
connection. It runs without any problems. I even can insert the Keyboard in one of the
three USB plugs if I want. So, The IP address is 192.168.0.203 and its
name is hub.local. Next, we have to change the MQTT broker addresses
in our PIR sensors and our Sonoff switches. This can be done by the webinterface introduced
in Video #127. Here, we are also able to set the first part
of the topics string. The device will automatically insert its board
name and add things like “relay” or “alexa”. For the moment, I do not use username/password
for MQTT. Now, we can start MQTT with the command mosquito
-v. When we power our devices, we should now see a lot of messages coming. Each message has a topic and a payload. This is, because the devices publish many
different topics to the MQTT broker. We can now “subscribe” to particular topics
using “mosquito-sub” plus the desired topic. Now, we only see the messages of this topic. If you use my SD card image, you have to issue
two additional commands now. Otherwise, later-on, you will see an empty
page. Now, we know, that the broker runs and we
can go on to the next step. We start node-red on our Pi. As soon as it runs, we can connect to it from
a browser by calling the address of our raspberry. Just type the IP address in a browser window
and you get this nice menu. For the next step, we go to node-red control
panel. If there is already something there, you can
delete it. For this video, we start with a fresh Flow. But how do you get this flow? This is really easy. You go to my Github and open the file “flow.txt”
with any editor. Then, you select the whole text and copy it
with crtl-c. Next, you go to node-red and import from clipboard. Paste the content of your clipboard and decide,
if you want a new flow. Hit import and the miracle happens. You have exactly my flow on your computer. Cool. BTW. You can do this with all sorts of objects
you find in the internet. Now we start from left to right. The first node is a so called MQTT node. You see this if you compare the color and
the symbol with the “palette” on the left. You see also, that it is an “input node”. Next, we have to connect this input node with
our MQTT broker. Easy: Because we run on the same computer,
we just type-in localhost and the Mosquitto port is 1883. Fortunately, we only have to enter this once
and can refer later to it. Because this node should connect to the main
PIR sensor, we have to select the right topic. The client id and the other tabs are not important
for the moment. If you are interested in these, you can watch
my video #125. If you do not remember the topics, just enter
# as topic, “done” and deploy. Connected to this node is a so-called “debug
node”. This node sends messages to the debug window. We can define, how much info we want and we
can switch it on or off. Now, we see the topic and the payload. “0” payload means “off” and “1”
means on. This is defined by the firmware of our PIR
sensor. So, the connection to our PIR sensor works. Next, I want, that the lamps keep on for 5
minutes after my last movement. This is to prevent, that the light goes on-and
off if I am thinking… To achieve that, we can choose a so-called
“function” node. I use the trigger node for our purpose. This has the desired function: It sends an
“on” message to its output as soon as it gets any message at its input. After 5 minutes, it automatically sends an
“off” message. We also select re-trigger. As we have seen before, the PIR sensor sends
on and off messages. If we want, that only on messages reach our
“Pulse” node, we can filter them with a switch node. Here, I define, that I only want the “on”
messages forwarded. The off messages are suppressed. I could add a second output for the off messages… The pulse node has a nice feature: it shows
us its status with a blue dot. Later on, we will build such a feature for
our own nodes. Another nice feature is the sound node: It
helps for example during debugging, when you work with your sensor and you cannot monitor
node red at the same time. So, I added an audio output. In several languages, of course! Now, I can concentrate on my work and get
acoustic feedback. How cool is that? BTW, you can look at these nodes if you are
interested on how you can achieve this function. We could connect the output of the pulse node
directly to our LIGHT_Main node. LIGHT_Main, by the way, is also an MQTT node,
this time an output node. And its topic is the topic of the Sonoff to
switch the light on. But, we want more: We want, that we are able
to override the PIR sensors with either a dashboard or with Alexa. So, we introduce a new input node: A dashboard
button node. Its function is simple: It creates or “injects”
a 1 for on, a 0 for off, and a “A” for automatic. But is not operated from this page. If we go back to our main page and select
“Node Red UI Desktop”, we get a new window. Here, we see for each of the nodes a button
with a label. I also grouped the different buttons according
their purpose. So, I have now a small “command center”. But now, we have two different chains of command
for our Sonoff switches: The PIR signals and the signals from our Dashboard. It is quite obvious, how this should work:
If we press the on or off button on the dashboard, we want, that the lamp is on or off, even
if a conflicting signal comes from the PIR sensor. Only if it is on “Automatic”, we want,
that the signal is transferred directly from our “Pulse” node to the Lamp. But how can we achieve this? Here, we need a few things: We have to use
a fully programmable node, and we have also to have variables which can store a particular
status. The first is easy: We just take the empty
“function” node. This node is programmable in java script. So, let’s have a closer look. If we look at a new node, we just see, that
it returns the message it gets. So, we learn two things:
1. The full message on the input is called msg
and 2. We can transfer a message to the output by
“returning” it. Simple. Now, let’s look at such a message. To do that, we use our PIR sensor and the
debug node. The only thing we do is, to select the complete
message. Then, we see an “object”, and its content,
which we easily refer to. You will later see, how. To play with that setup, I place the function
node between the PIR sensor and the debug node. So, if we want to refer to the topic, we use
msg.topic. So, if we want to transfer the topic also
to the payload, we just write this small code. And if we test now, we see in the debug tab,
that the magic works. But very often, the debug tab is clouded by
many different messages. We have to find a better way. What, if we could see important info in proximity
to the node, like with the pulse sensor? Easy, if you know, how. We just add this line of code, and we now
see the payload directly in our flow. Nice. But how do we get this “override” behavior? Here, we can add a few lines of code: If the
“override” variable is “ON” we want, that the payload always is “1”, and if
“OFF”, it has to be “0”. If the variable is “auto”, we transfer
the payload without change from the input to the output. So, we have to find a way to set and store
the override flag. So far, we only had messages to work with. If the next message arrives, we lose the content
of the former. If we look at our override node, we get sometimes
a message from the “always on” button, or from the PIR sensor and so on. To achieve our goal, we have to store the
override flag every time a message from the dashboard arrives. And the override flag should not be affected
by the messages from the PIR sensor. These lines of code do exactly that. Our dashboard buttons all include the word
“OVERRIDE” in their topic. So, we filter these messages and set the override
flag accordingly. If we now test our setup, it behaves exactly
as desired. We can use Alexa to switch the lamp on or
off, even if the PIR sensor is still on. We could now go on to the next topic. But I do not want to omit telling you, that
Peter Scargill wrote a small article about variables in node-red. You can, for example, store global variables
in one place and use them in another. If we store the result of the override flag
in a global variable, we can use it in our second node. We will use this function in our data logger. From our previous videos, we know, that Peter’s
script also installed the SQLite database. Here, we want to store all events from the
two PIR sensors, together with the override flags. For that, we go to the main page and from
there, to SQLite administrator. Here, we create a database called Sonoff and
add four fields: Topic, payload, timestamp, overrideMain, and overrideTable. That is all here. We go back to our node red tab and start with
connecting the two PIR sensors to a function node. This function node is connected to a SQLite
node. Now, our function node gets all messages from
the two PIR sensors. Now, we just have to bring all into a form
in which the SQLite node will store it properly away. In my last video, I showed you one version
to do that. Some of my viewers made a point, that this
method is not very secure. So, this time, I use a different method and
hope, it is better. The SQLite node needs a “SQL statement as
a topic and the field content as a payload. So, the SQL statement is “INSERT INTO Sonoff”
and all fields of the database. At the end, we add a “VALUES” template
with the same number of question marks. And the payload contains the content of the
variables in the right order. The rest of the code is easily understandable. It only formats the time stamp in a “human
readable format”. And, of course, displays the last update time
as a reference below the node. Now, everything is done and we can deploy
the flow a last time. If you want to create a backup, you can export
the whole content or only selected nodes into your clipboard. Then, you paste it in a text file and you
are done. Very simple, too. And, if you want to know how much resources
node red uses, you go back to the main page, and to “Web Administrator”. Here, you can do all the small stuff an administrator
has to do. So, summarized,
we are able to control our two lamps by two PIR sensors
can override their signal by either pressing a button on a dashboard or by calling Alexa
Were able to use voice as an output were able to store a nice log in a structured
database. And we even learned a few lines of java script. For me, I see now in the morning, if my PIR
sensors were triggered during night. Then, the usual suspect would be our cat called
Dishka. fortunately, we did not name her “Alexa”. I hope, this video was useful or at least
interesting. If true, then Like. Bye