Last week I showed you how you can capture the remote codes for cheap radio controlled electrical outlets and this week the theme is MOTION DETECTORS. With a properly configured motion detector you can then trigger that outlet. For example……..when you open the pantry door the light comes on………when you walk in the laundry room, the light comes on……..when someone presses the smart doorbell, the lights come on. Pretty handy stuff.
Most home automation motion sensors send TWO signals. One when they are tripped and one when they reset. Most of them will stay tripped for a predetermined amount of time. Usually for 2-4 minutes or so. Good idea to know the state of the motion detector BEFORE you buy it.
For example I have a motion detector with a 4 minute reset on it in my garage and laundry closet. That means that both of those lights that get triggered are staying on for 4 minutes whether I like it or not (unless I write some crazy code).
But some of these cheap sensors send ONE signal. “I’m ON” and that’s it. They don’t reset. That provides a challenge. This is one such sensor I bought (and DEFEATED).
It costs about $10 and you can get them even cheaper. I got this for an outside sensor.
Anyway it does have some user control as inside there are two DIP switches. One sets the sensor state for 5 seconds or 5 minutes and the other one turns the LED indication it has been tripped on or off.
If you want to be stealthy, turn off the LED. I personally like the bad guys to know they got got.
Anyway before you can do this you must capture the code with a program called RTL_433. I discussed this in another blog. Once your hardware is set up (an RTL-SDR device) you run this command on that pi to send THIS code below. The last part would only be necessary if your mosquitto MQTT server is on another device. Mine is.
rtl_433 -F json -M utc | mosquitto_pub -t home/rtl_433 -l -h 192.168.XX.X
Now that will take all the messages it receives from the SDR device (on 433.920 MHz) then it publishes a message on your MQTT server that looks like this:
{"time" : "2019-01-24 00:26:07", "model" : "Kerui Security", "id" : 924442, "cmd" : 10, "state" : "motion"}
Now we have to extract that data to make sure we hone in on this device (because I have multiple devices on this same MQTT Topic). In your HomeAssistant configuration.yaml file you add the following to create a binary sensor.
binary_sensor: - platform: mqtt qos: 1 state_topic: home/rtl_433 name: Pantry Motion value_template: > {% if value_json is defined and value_json.id == 924442 %} {{ value_json.state }} {% endif %} payload_on: 'motion' off_delay: 10 optimistic: true retain: false
Whew! You can see I have it so it only takes information from sensor id #924442 and when the “state” = “motion” then it triggers the binary sensor. Then the line with:
off_delay: 10
Sets the sensor back to the OFF position after 10 seconds. So with a ONE signal sensor I can turn the state to OFF after how ever many seconds I want. That garage light will now go out after 1 minute or 2 minutes or 2 seconds……..whatever I want.
Well……It works PERFECTLY. Here’s what the tripped state looks like:
Now I can start making some automations to use with my $10 motion sensor. Open the pantry door……..the light comes on……….hence the name “Pantry Motion”.
So what I did here was to make an automation to turn on one of my inexpensive outlets. Eventually this will be tied to a smart light or smart switch. Right at this moment I have no smart light nor have installed a smart switch in the pantry. Changing the line of the entity_id in the action part of the code can turn basically any device on or off. Because the code above leaves the sensor state on for 10 seconds, running the automation means the “light” (in this case outlet) will be on for 1 minute. Pretty cool, huh?
automation 21: alias: Den Outlet Motion Sensor trigger: platform: state entity_id: binary_sensor.pantry_motion to: 'on' # condition: # condition: state # entity_id: sun.sun # state: below_horizon action: service: switch.turn_on entity_id: switch.den_outlet automation 22: - alias: Den Outlet Motion Sensor Off trigger: platform: state entity_id: binary_sensor.pantry_motion to: 'off' for: '00:00:50' action: service: switch.turn_off entity_id: switch.den_outlet
Notice that I have # marks in front of the condition statements. In many cases you wouldn’t want a light to come on until after dark. I left that in there to easily change it back if I find I don’t need the light on in the daytime, but hey, it is essentially a windowless closet.
Here’s a video of how it all works. I shortened the sensor time for the purpose of the video.
And Bob is your Uncle.
Really useful! Thanks for sharing.
Quick question. Is there any way to detect if the device is running out of batteries? Does it emit any kind of heartbeat?
so do you still need the rtl hardware device once captured in mqtt ? how do the PIRs communicate to MQTT ?
The syntax has changed a little bit for configuration.yaml, so for others’ benefit, here’s what worked for me:
mqtt:
binary_sensor:
– name: “Driveway motion”
unique_id: “Driveway motion”
state_topic: “home/rtl_433”
qos: 1
payload_on: ‘14015a’
device_class: motion
value_template: “{{ value_json.code }}”
off_delay: 10
– name: “bush motion”
unique_id: “bush motion”
state_topic: “home/rtl_433”
qos: 1
payload_on: “1123da”
device_class: motion
value_template: “{{ value_json.code }}”
off_delay: 10