Publishing IoT IP Addresses to MQTT

I have been playing around with using ESP8266’s as endpoints around the house for collecting temperature, turning the sprinkler pump on, texting me when the doorbell is pressed, etc.  One of the challenges when doing setup/testing is getting the IP address of them when they first come online.

I am running dnsmasq on a raspberry pi, which provides both local DNS and DHCP services.  This is in no way novel, as it is a pretty vanilla configuration.  What I wanted to share is a small script that monitors for updates to the dnsmasq log, watches for new client releases/renewals and then posts those to the MQTT service.  There are lots of things you can do with it from there, but I usually just subscribe to the topic via terminal or mqtttool on my iPhone.

#!/usr/bin/python
from pygtail import Pygtail
import sys
import re
import time
import paho.mqtt.client as mqtt

client = mqtt.Client()
client.username_pw_set("xxxxxx","xxxxxx")

while (1):
 for line in Pygtail("/var/log/dnsmasq.log"):
   isItACK = re.search(r'DHCPACK',line)                #see if its an ACK
   if isItACK:
     newInput = re.sub(r'^.*DHCPACK\(eth0\).', "", line) #strip everything before mac address
     newInput = newInput.rstrip()                        #strip newlines
     client.connect("xxxxxx.widgetninja.net",1883)       #connect to mqtt
     client.publish("/network/DHCP",newInput)            #publish to mqtt
     client.disconnect                                   #hang up
     #sys.stdout.write(newInput)                         #debugging
 time.sleep(10)

Hope this helps save you some time trying to find the ip address of that new device, be it something you made or otherwise just added to your network.

mqtt

Monitor your Garage Doors with MQTT

Its a nighttime ritual for me.  Usher kids to bed, pick up kitchen, turn out lights, and peek into the garage to ensure the overhead doors are closed.  Odds are they aren’t, as someone always seems to have left them open through the normal bustle of the day.

I have been dabbling with home automation, building sensors and devices to automate the mundane.  So to that end, I set out to build something for the garage.  Design goals were:

  • Provide a status of open/closed for the two overhead doors
  • Ability to open/close doors from my phone

The hub of my home system today is Home Assistant (running on raspberry pi) which is very versatile, and allows many integration points.  As many internet of things devices are using MQTT, I am using that as the primary means of communication to/from the hub.

The micro controller used is an esp8266 which has an amazing story in itself; rising from simple beginnings – being initially sold as a uart->wifi adapter and becoming a stand along micro controller thanks to a dedicated group of enthusiasts.  This device can be had for about $8.00, has WiFi, and can run code compiled on the Arduino IDE.

Parts:

This project was fairly straightforward as it stands on the shoulders of projects done by others, as well as some starts and stops I had with recent ESP8266 projects.  The device is powered by a 5v wall wart, which supplies power for the ESP as well as the relay breakout board used.  These components combined with the hall sensors on the doors are all that was needed.  An overview of the hardware connections are here..

In Fritzing:

Fritzing Diagram

In reality:

ESP_WiringCloseUp

Note that the relay outputs that connect to the door ‘buttons’ can actually be connected right at the opener, where the button’s wire comes in.  Thats the blue/white wires on the right side above.

The door sensors are installed on the wall, and triggered by magnets on the doors.  This means any position other than fully closed will register as open (good in my opinion).  Installed they look something like this:

 

On the software side what the ESP8266 is doing is watching for the digital reads of pins D5 (door 1) or D6 (door 2) to change state (open / closed) and when it sees this it’ll post a message on the MQTT server.

The home automation hub takes it from there.  The other thing the ESP8266 is doing is watching for updates on MQTT for requests to open or close the door.  Once a message is notified the ESP will close the relay for a second (simulating a button press) and the door will start moving.  The messages look like this (going from open to closed):

/esp/garageDoorTwo/set 0       #this is the request to close
/esp/garageDoorTwo/state 0    #this is confirming state changed to closed

The actual code on the ESP8266 is linked below.  The highlights are the WiFi join, enabling of over-the-air updates, and the management of the MQTT messaging.

garageDoor.ino code

And if you happen to use HomeAssistant here is the relevant parts of the configuration.yaml file.

config.yaml code

And to wrap things up, here is what the results look like on my iPhone.

IOS_HA_Homescreen

Let me know if you have any questions or clarifications and I’ll try to answer them.

 

Audio on the go

I’ll save you the long back story, but I recently came across a pretty amazing module, the USR-S12.

usrs12

This module seems to be built for integration in other devices, and has an impressive list of features.  The key ones (to me) are:

  • WiFi base station or bridge
  • Airplay

This website has a pretty good breakout of what the interface looks like.

I ordered mine directly from china, for about $35 – but it took about 2 weeks to arrive.  Sparkfun also carries them with a break-out board (including rj45 ethernet) but they want a bit of coin for it.

With module in hand I set about wiring it into my car.  My goal was to stream audio from my iPhone as my car didn’t support the proper bluetooth codecs to play music.  With airplay i could stream podcasts and pandora with a higher sound quality than bluetooth would give me anyways.

My Audi has an interesting interface (AMI) which supports different cables for iphone aux etc.  The ipod cable was interesting to me as it supported analog left/right, data (not used for this application) and power.  I was fortunate to find a wiring diagram for the audi connector on a blog (thanks w.ashcroft!).

audioConnector

The only other sticky-wicket on the Audi part is that there is a small resistor inside the connector housing that tells the car if you have the ipod or the aux cord connected.  I wanted it to think the aux cord was connected so it wouldn’t try to talk via the data lines.  There is a 18.7k resistor in the iPOD cable, and i had to swap that out for a 1k to emulate the AUX cable.

After a quick snip-snip with the wire-cutter the 30-pin ipod connector was removed and I was able to identify which wires were which with a the help of the multi-meter (diode test for the win!).  Soldered power, ground and analog to the USR-S12 and was pretty much ready to go.

20141204_032154925_iOS 20141204_032203288_iOS

Plugged it in and thankfully everything worked as expected.  Iphone joined the new WiFi hotspot in my glove compartment, and airplay sounded awesome!  I made a few small changes through the web interface (10.10.10.254), changing the network/ssid name.  This also changed the name of the airplay host.

Final change is to edit the network properties on the wireless network on your iPhone.  When joined to this hotspot you want to set a static IP (such as 10.10.10.200) and NO default gateway.  This way your phone will still use the cellular network to get to the internet instead of trying to use the hotspot.  This is critical if you want to stream content like Pandora.

Boo

Whipped up a yard sign for this Halloween.  My wife picked up some really neat orange bulb strings with over sized glass bulbs – no LED’s here!  Scaled up some letters to be about 2’x3′ and layed out a hole pattern so each letter used an entire string.  The holes had to be slightly recessed so the bulbs could screw into the sockets fully.

Painted them up with some exterior paint.  They look nice next to the yard ghosts I got years back from the father-in-law!

WP_20140927_006 WP_20140927_008 WP_20141020_002 WP_20141021_002

Here are the .dxf files.

New gear begets new gear

It was bound to happen.  I finally got tired of finding the appropriately-sized wall warts to power my workbench projects.  It was time for a new power supply.  I picked up a reasonably priced 30v 5a Korad KD3005D, which seemed to have the small number of features I needed.

Upon its arrival, and after the unpacking excitement waned, I noticed a small problem.  The voltage being produced was way off from the displayed amount.  This was troubling, and an email to the manufacturer brought about a new control board which I swapped out.  Bummer is, the same problem persisted.

Dumb cheap-ass supplies right?  My concern for the second service inquiry is them doubting my technical prowess, so i ordered a second multi-meter.  I wanted to be able to have two meters showing the output, which wouldn’t match the power supply.  So i got a TekPower TP4000ZC ordered (serial output!) off Amazon (thanks prime!).

Wired the new meter up with my old meter (acquired in 1993) and low-and-behold.  Problem on my end.

WP_20141108_004

My trusty old meter turns out to be not so trusty.  Sorry, Korad – sorry I ever doubted you.  Threw the old meter in the trash and picked up a second TekPower.  Nice to have two.

Calling this an amplifier build would be deceitful

Its more of a box build.

So browsing adafruit.com a while back I came across a class-d amplifier board they recently introduced. What is interesting about class-d amps is they are very efficient, thus generally needing no heatsinks. Seeing boards like this I am frequently reminded how far things have progressed since my electronics classes in 92/93. In that class I tried to build an amplifier for my car, and really didn’t get much further than etching the board. The traces didn’t etch cleanly, even using the advanced (at the time) sharpie+acid method. After getting board patched up with jumper wires to fix screwed up traces I then realized how expensive power mosfets were for a high school student. End of that project.

So I of course bought this little amplifier board immediately. There has been some conversations around the house that we should have music upstairs. So this board + an old ebay purchased airport express should do the trick nicely. So board in hand, it needed a box. I always skimp on the box, but in this case the board was pre-manufactured so I could afford to put some energy into its home. I haven’t done anything with any hardwoods on the CNC yet, and I had some walnut I got from a friend when he moved. So I set about making a box.

I have no jointer, so surfacing with the CNC, using a 1″ bit.

WP_20140427_002

Flipped the board over and routed a box + lid.

WP_20140427_011

WP_20140427_013

WP_20140519_002

The lid didn’t fit perfectly, and required some chisel work on the inside lip to seat properly. The outside also needed some time on the disc sander to be flush all the way around. I really need to upgrade my y/z axis with some linear bearings. Maybe this winter.

With the overall box built i used the drill press to put some holes in the back to mount the 1/8″ input, the 12v barrel jack, and the 4 speaker posts. Of course one of those holes is a square, so I had to spend some time with the files.

WP_20140519_003

Before mounting anything I needed to finish the back, as it would have been hard to do with all the posts etc in place. I was just going to do a basic coat of poly as this wood was very nice. Got out the rattle-can and gave it the first light coat – which did not work out well. I was not paying attention and grabbed black spray paint instead of my clear lacquer. How could that happen?

WP_20140519_004

Quick wipe down with mineral spirits, but black was deep in the pores. Decided to just blast the whole thing with black, wipe with spirits, and sand again. Turned out ok, gave the wood a darker appearance – although this wont be my ‘go to’ finishing technique.

WP_20140519_005

Mounted the amplifier inside with double-sided foam tape, and soldered up all the connections. Pretty basic.

WP_20140601_004

Functionality test with a 12v 1.5A switching power supply I had in the junk box, and it wouldn’t power up. I kinda forgot that 20w per channel is 40w. At 12v you need 3.5A at full power. I tested instead with a 11.1v Lipo battery from one of my RC airplanes, using alligator wires to the board and all was fine. (fatal mistake)

Double checked everything, glued the lid on, and finalized the finish.

WP_20140605_003

WP_20140605_004

I sourced an old pc power supply, as they can handle crazy current, and modified it to work w/o a pc. Grounding green wire is all it takes. I pulled out all the un-needed connections and put a barrel connector on it.

WP_20140606_003

Brought everything inside, connected up the speakers, power, airport express… and it doesn’t work. Much testing ensues, still does not work. Shamefully bring it out to the garage, and bust it open with a chisel.

WP_20140607_002

Of all things it turns out the barrel connector plug was bad. That was why the initial power supply didn’t work. That is why new power supply didn’t work. The test battery worked because I alligator jumped the leads to the back-side of the connector. Dang.

So now the power supply is hard wired in and everything works fine. This amp does a great job driving bookshelf speakers, and i would use it again. Things I would do differently if i were to do this again (hint : i won’t).

    Not use black spray paint by accident
    Put an indicator LED in the box so I know if there is power
    Turn the box ‘upside down’ and inset a plexiglass bottom that is screwed in (for access)

Overall a fun project, and I learned how nice walnut is to work with. I also finished an amplifier project, that i started over 20 years ago!

Automated airframe

WP_20140420_005

It appears the road to a GPS-Controlled airplane (Drone) is paved with broken Styrofoam. Pictured above is on of my first automated flights on an old P-47 I had. It lived up to its historical nickname of “Jug” which is how they look when they nosedive in to the ground. To move forward I am going to try to make my own airframes from a $15 AirHog glider I picked up at Target. I have a few of them on hand, and they are pretty big. Each wing is 2′ long. To start I needed to cut off the top, so I can CNC in some pockets inside to hold an arrow shaft (for strength) and to house all the electronics.

I do not have a Styrofoam cutter, but I do have some nichrome wire I used as a electronic firework igniter so I hacked something together. I took the blade out of a tree saw I have, strung some nichrome, added a 12v wall wart and sliced away.

WP_20140423_005 - Copy

WP_20140423_006 - Copy

I have started laying out the electronics, servo mounting holes, and cuts for flaps in my cad software, and will share those results when I get them on the CNC.