Node Serialport v2.1.0

A few weeks ago I started maintaining node serialport after a long hiatus. We hadn’t had a release in about a year and we had some outstanding bugs that I wanted to tackle. I had also introduced some complexity around testing, years ago, that was never removed and seemed to be making it harder to work on the project. Exactly a month since my first beta release we’ve released serialport@2.1.0 which is one of the larger releases we’ve ever had. This includes work from 13 people, including myself.

The Change Log:

  • Major refactor, bug fixes and docs improvements thanks to @ecksun, @fivdi, @gfcittolin,@jacobrosenthal, @mhart, @nebrius, @pabigot, @paulkaplan, @reconbot, @rodovich,@rwaldron, @sayanee, @tigoe and everyone who reported and helped debug issues!
  • Fix binary paths to confirm with modern standards
  • Integration tests on CI’s that support it or for the folks at home with an arduino handy
  • Upgrade to nan-2.2.1 for memory leak fixes and node 6 compatibility (still not supported)
  • Confirm nw.js and electron compatibility
  • Make the outpout of .list consistent between platforms and docs
  • Define ambiguous flow control flags and document them
  • Fix support systems who provide 0 as a valid file descriptor
  • Fix race conditions when opening and closing ports that led to errors while reading and writing while closing or opening the port.
  • [unix] Fix a double open bug on unix that would cause opening and closing ports repetitively to error.
  • [unix] Listing serialports on linux now include more ports (including bluetooth devices eg./dev/rfcommXX) and have less bugs in the output
  • [windows] Remove deprecated BuildCommDCB for windows 10 support
  • [windows] Fix a memory leak on windows
  • [windows] Fix a 100% cpu and possible hang bug when ports were disconnected on windows.

The change log is extensive but doesn’t tell the whole story. This release started as a bug triage. I saw over 100 issues, some a year and a half old. I started helping people close them. If they were over 4 months old I would close them (usually with a resolution!) and urge people to reopen tickets if the problem was still a problem. In doing this, however, I saw a lot of common trends.

Serialport Pulse

On Linux and OSX we had issues reopening ports. On Windows we had problems detecting disconnections. And a lot of support issues were due to errors that were either not meaningful or were delivered at the wrong time. This was scary! Fortunately, I found a lot of patches for these issues already researched, written, and waiting to be merged. It’s why we have 13 authors this release! I was able to test and merge most of the submitted changes, and that fixed the worst of the bugs. I also added many more errors. You’ll be warned a lot earlier if you’re trying to do something that doesn’t make sense. (Eg, if you open an already-open port, you no longer get a cryptic system level issue, you get a “port is already open” error.)

I have a habit of “stress cleaning”. Ever since I was a child if someone was angry I’d start tidying up. In recent years this has evolved to involve refactoring code. If you’re going to refactor code you need to know what it does and you need to ensure the fundamental behavior doesn’t change. We now have better documentation, more test coverage, and cleaner code then we’ve ever had before. In a few notable cases I’ve kept behaviors that are arguably bugs in order to not break the API. It was painful, but I wanted this release to be widely consumed by anyone currently using serialport, with little fear and no outside change. The more people who get the bug fixes the better.

The next release will get to attack these bad behaviors and hopefully provide a much easier library to work with. I’ve got the unfortunate advantage of studying a year of bug reports to design version 3.0.0. A year of people trying to work around issues that were left unfixed. A year of people hitting the same issue over and over. As one of the maintainers I want to apologize to anyone who’s had issues over the past year, and I want to thank you for documenting and researching your efforts. It’s been a big help, keep it up.

We’ve got a roadmap to 3.0 open and available to comment. I’ve shared my ideas but I’d like yours too. And if you’re looking to work on the project, please check out the backlog label. There’s still much to do.

And Thanks.


React Redux Robots a Nodebots Adventure with Missile Launchers

I made a little presentation, a hack, a spike into the world of the unknown. I wanted to see if I could power a johnny-five robot with redux a powerful state manager for JavaScript commonly used with ReactJS. I could, I did, and I think you should too. The code in this presentation gets a little handwavey. I did get it working but never finished getting both the browser side simulation and the hardware controlling processes to share the same state. That would be awesome. You should try it.

Download the PDF here.
Browse the github source.

Or browse with this browser thingy below. The last slide was the losing screen from missile command where the screen flashes red. It really lit up the room.

Modules, Packages and candy, oh my!

Tonight I gave a talk at QueensJS. It was my first time speaking there and it completes my trifecta of “borojs” speaking events. (I’ve now spoken at BrooklynJS, ManhattanJS and QueensJS!) I would have done it sooner but Sara wouldn’t let me until now.

The talk was on ES6 Modules and the brave new world popping up around them. It was also about how and why we tried to migrate PouchDB to use them and failed.

You can find the presentation on github, I used Deckset to present the markdown file and generate a PDF for download.

The Internet I wish we had: Making Toast

“Why is the light in the refrigerator purple? It looks like I’m making a breakfast for zombies!”

I grab the makings for a mushroom cheddar omelet. We’re running low on butter.  I say “Ok refrigerator” and then wait.. its display shows it’s thinking about what I said and then beeps an error tone at me. It writes out “unrecognized command”. This time I hit the listen button and say, “We’re running low on butter.” It shoots back, “Salted or unsalted?”, “Salted” I say. It beeps happily having understood that I want butter added to my shopping todo list. I hit the settings button, and follow the menus to “light”, “color” and set it back to “natural full spectrum”. The food glows a healthily once again.

I start cooking while my family runs around getting ready for work and school. I put the kettle on the stove for tea, I leave the frying pan heating up, put the toast in the toaster. A usual weekday morning. As the eggs are starting to firm, up the toaster in a loud shrill voice beeps three times that it’s done. It waits a few moments and beeps again, three times. I’m still working the eggs but the toaster doesn’t care. It wants me to walk over to it and hit “cancel” even though it’s done and there’s nothing to cancel. I glance in its direction and it flashes its LED display back at me in annoyance. “DONE” it reads and then beeps three times again. Something needs to be done about that toaster.

I go to put the eggs back into the fridge and the lights are purple again. What the hell? Must be one of the kids’ idea of a joke. “Hey Sara, can you grab me my debugging cable when you have a chance?” I serve breakfast and it’s devoured before I even get a chance to sit down. Everyone starts to head out, leaving me with hugs and kisses and dirty dishes. Sara hands me my debugging cable with her goodbye kiss and runs off to catch the bus. I clean up from breakfast and then get to work. That toaster has it coming.

A debugging cable isn’t much more than a USB host cable. One end plugs into my cell phone and the other is an octopus of different usb ports, mini, micro, A and B. The toaster is a little older too, so it has a micro usb port. Newer ones would just have the USB C ports with the nifty cables that you can plug in to either end and upside down. Remember when no matter which way you plugged in your cable it was wrong? Those days are almost long gone. I pull up the CodeCat app on my phone. I’m sure the toaster has an official app but the community keeps better track of these things. The app detects it’s plugged into a “SmartTek Heatmaster 1520” with stock firmware. It downloads the code from the toaster and opens it up. Boy this thing is a mess. I find where it keeps beeping but I can’t figure out why it keeps beeping, something must be calling the beep function over and over.  I hit the “community firmware” tab on CodeCat I bet someone has already solved this. It’s not a popular toaster oven but there are at least 3 firmwares with “STOP THE BEEPING” in their names so I hit the most popular one and view a diff.

It shows me where the firmware was changed to stop the beeping, and it also looks like they turned the toasting levels down a bit. That’s great! It used to be “kinda toasty”, “burnt”, “burnt to a crisp”, “fire hazard”,  and two more levels I’ve never dared to toast with. I wish they had said they fixed that in the docs but this is wonderful news. I hit install and it downloads into the toaster. I then test it with a nice piece of fresh sourdough. The bread turns golden brown and then a nice low “beep” happens once. The display reads “Thank You”.

Now for the fridge! Something keeps changing the settings, and I bet it’s a script written by someone who wants to paint their room black and purple. The fridge has its own display and is capable of user scripts. This lets us write a script that runs either in response to events or all the time. It also lets us fork the scripts that the fridge came with. When we first got the fridge I played around with it a bit, and modified the light script to slowly increase the brightness when you open the door and then flash it a few times if the door is left open more than 30 seconds. In all honestly I thought it was a gimmick at the time. But when I figured out how to bypass the fridge’s quaint todo app and have it send todos to a shared shopping list on phones, I was sold 100 times over. There’s not much more I want from my fridge. And thank god fridge companies stopped trying to automatically detect what’s in there and place orders for us. Those were dark days. I mean someone even tried to get RFID chips put in individual eggs. Crazy, right?

There were no additional scripts but the modification time on my light script had been updated. I checked a diff and noticed almost every line had been modified, but only its whitespace? The fridge doesn’t support suppressing changes to spaces and tabs and only showing the actual code differences. So I plugged in my phone again (this time with USBC!) and pulled up CodeCat again. I found the lighting script again and had it show me only the code changes, no spaces this time. A new section had been hidden in the middle that would reset the color of the light every 7 minutes. Crafty. I copied it out and then reset the file to the previous version.

With the fridge fixed, I logged into my house’s command and control box. This is an old mini computer (about the size of my phone) that I had laying around and hooked up to the wifi. It primarily listens for all the switches and turns on the lights in whatever room you’re in. It can also listen for commands from your phone and it knows if we’re home or not and can turn on the porch light. Simple stuff. I add a new script for the switch in the kids’ bedroom, every 3rd time the light is turned on, and only if it hasn’t happened in the last 2 hours, flash the lights bright green for 30 seconds and then go back to purple or whatever. That will show them!

The kids haven’t really figured out about the house control as it’s not right in front of them like the fridge, and they’re still pretty young. I leave them with write access to the script so they can fix it if they figure it out. No point being completely mean. Time for work I suppose!

The Internet I wish we had: Texting

I hung up my phone and started typing. “Jason just called me, ideas for dinner before the movie?” and sent it to Sara. My phone know’s a lot about Sara and where she might be. It encrypted the message for her eyes only, indicated that the message will probably be delivered in midtown with a 70% confidence rating. After all it was 4pm on a Thursday, where else would she be?

My office runs a messages hub. It takes messages from nearby devices and puts them on the internet where they’re sent to hubs closer to their delivery locations. Midtown is full of hubs and even if it wasn’t there’s enough people in manhattan that it would only take a few extra seconds to go phone to phone.

My office’s hub took at look at the message and queried it’s routing database. It didn’t have a better idea of where Sara might be so it remembered mine and chose it’s favorite hub in midtown the one at Egyptian restaurant down the block. This hub has the best relationship with mine out of all the nearby hubs. It’s rarely overloaded, has a decent enough connection and it’s pretty close to Sara’s phone most of the time. It also knows my hub is in a similar situation when sending me messages.

The Egyptian restaurant’s hub broadcasts the message, it’s too far away from Sara’s phone for it to hear but a business man is walking near by. His phone picks up the message and sends it to everyone on the block. A woman at the far end had recently taken the elevator past Sara’s floor of the office and their phone had seen hers. Her phone relays it to the doorman of her building who’s still in range. The doorman always kept his phone plugged in and is in a perfect spot to relay messages. He doesn’t really know too much about the messaging app, other than it gives him some spending money at the end of the month and people are happier when he keeps it on.

Sara had tried to get reception to put in a hub, or at least keep the messaging app in “hub mode” on their phones. They’re plugged in, someone is almost always there and they’d help relay all the messages to the floor of the office. It would be great for everyone! Except one of the receptionists claimed it slowed down his phone. (Probably gave his online games some lag.) And the other one jacked up the price for each relay 100 times the market rate and everyone routed around him. He never made any money and turned it off. Their loss, they can keep paying for their service plans.

The doorman’s phone sends the message bouncing up the phones in the elevator cars until it hits someone walking across the office on the floor above who’s also in range of Sara.  Her phone receives the message with a “Beep Boop” The whole affair took 7 seconds and negligible battery life.

“I just left work. Swinging by comics, then I’ll head towards the theater. I had pizza for lunch, what did he say?”


Steam Heat

My home has radiators that are 70ish years old. I’m going to guess the air vents are 10-30 years old. It’s supposed to let the air out while the pipe fills with steam. Then and this is the important part, it stops letting anything out of the pipe and keeps the steam in the pipe. Some of our valves weren’t letting the air out, and some was letting everything out.


  1. It’s cold in my room
  2. Our boiler runs out of water too often
  3. Our windows take a constant bath from condensation

So lets fix some things.

This slideshow requires JavaScript.

The vents in the peanut butter jar were old, came with the house. They didn’t quite close when the steam hit them so they whistled a ton. So if you have a PB jar full of vents I recommend installing them at night so nobody is awake to hear them. The next day Sara drove me in the snow to spend a lot of money on valves from a store. I replaced the vents in my bedroom which were clogged. The air couldn’t escape so it couldn’t fill with steam. The one in the bathroom would never close, so while our bathroom was very warm, it also very damp. Notice the rust around the vent in the photo? That’s crazy. The last two had similar problems.

It’s so quiet! I love it! I hope my bedroom is warmer, I’ll find out. I can’t confirm it but I bet the house will heat a little faster, and my hunch is that the air will be much less humid.

I wish I could somehow measure the heat in the house vs outside, the time it takes to warm the house, the humidity, etc etc. Oh wait! I know how!


I’ll use my Nest! Unfortunately they don’t seem to make it easy to use the data. Looks like I may have to get clever.


This story is best read while listening to this.

Rick was driving north on I-95, he had to find an uplink or this whole trip had been for nothing. “Rose, scan the vehicles ahead.” His onboard computer sprang into action attempting to connect to internal networks of each and every car on the road around him. “No joy” she responded. All the cars either were too outdated to allow wireless access or detected their connection attempt and shut it down before they could get in. Rick sped past the cars in front of him, he had to find what he was looking for and these cars weren’t going to help.

It had been three long weeks since he had access to the ‘hub. Way too long for any self respecting keyboard cowboy. Back in 2017 when the loss of net neutrality caused the global collapse the internet as we knew it, all of the east coast had lost their uplinks to the internet. The Silicon Valley was the only place where you could get a reliable public connection and nobody dared to go there anymore. The internet wasn’t dead it was just hard to get to. Large corporations had the only uplinks and provided their own cell and wifi coverage to only their most elite customers. Having cast off the chains of debt and credit cards Rick was not considered an “Elite” customer. As a result it was hard to get online, and he had code to push.

Three quick “BEEP BEEP BEEP” sounded over the music, Rose flashed all the HUD’s alarms. His modified 6LOWPAN radio had picked up packets from a speed trap up ahead. He toggled back on his transponder and slowed down to the regulation 75 MPH. 6LOWPAN was supposed to be the savior of the net, allowing us to put all our devices online in distributed low power mesh networks. At one point you could send packets from New York to Boston via the ip6 mesh. The powers that be had different plans however. Private security had taken over the spectrum. Civilians quickly lost access to private low power networks and if you ran your own you were accused of interfering with national security and shut down.

Once he was sure he was clear of the trap Rick switched off the transponder and increased to hunting speed. This made him invisible to the EZPass speed checkpoints that littered the highway every few miles. They’d have no idea how fast he was going. It randomized his UUID whenever he switched it back on and appeared to be just another vehicle on the road. This got him past tolls and checkpoints. Even in this day and age it took the government a few weeks to even notice anything was out of the ordinary. Any tickets they would want to issue ended up in someone else’s inbox.

“Pay Dirt!” Rose exclaimed. A Fung Wah bus was up ahead and it had a connection to the net! Fung Wah had long since been shut down, but their buses still drove the roads. Their drivers were able to pick up the buses on the cheap after the company went bankrupt and had organized their own routes free of oversight and regulation. It was pretty lucrative. Luckily the bus’s uplink hardware was valuable enough that it remained in service and if you rode the bus you could use it to connect to your own systems. Someone on this bus had it activated and was using it right now!

Rick pulled up alongside the bus in the driver’s blind spot. If the driver or the passenger noticed him, either in real life or cyberspace, he’d be shutdown, reported and locked out from all uplinks until he could cycle his hardware address and that took weeks. Rose started the connection attempt. It was almost too easy. He had his 128 bit address in no time at all, and routes to all the backbones populated almost instantly. It was never this easy. The passenger on the bus either had no security or had seen him coming miles away. “Fuck it, git push.. wha!?” Rick was cut off by a squeal of sound. The whole car shuddered and the smell of magic blue smoke sifted into his nostrils. The safety circuits kicked in and the car drifted slowly to the side of the highway. It stopped, dead. What happened! Had been back hacked? “Rose!”

After what seemed like an eternity Rick was able to get the car to spring back to life. It took flashing the firmware in his starter circuits twice to get the engine running. Rose had detected the hack and shut everything down before the hacker on the Fung Wah bus could get too far. The navigation and scanning circuits were toast however. Not only were they hacked but the hacker had decided to pump emergency current into their subsystems and destroy $30,000 worth of equipment. Rose and the rest of his systems were fine. He could drive. And he better leave before any private security showed up to see why he stopped.

That was close but he couldn’t give up.

“You wont believe this” Rose piped up. It had been two hours and they had almost reached their destination. Rick had feared they wouldn’t be able to push any code tonight. “It’s a MEGABUS”. MEGABUS had been one of the few companies to survive the collapse. Every bus had power and material hookups at every luxury leather seat, and most importantly a corporate uplink connection active 24/7 for use by all passengers. Rick wasn’t going to mess around this time. He killed his lights and activated stealth mode. Rose picked up and identified packets from all 36 of the passengers on the megabus. Most were encrypted but one was downloading a ton of data. Mostly facebook, twitter and netflix. Streaming video on the east coast!? Gluttonous. This guy wouldn’t notice a little extra bandwidth. Rose cloned his MAC and carefully connected to the bus. Connections to twitter and the hub were successful. “I’m in” she reported. “Alright, easy now. cd johnny-five, git push origin master.” Rose connected via SSH to github and started pushing binary blobs of robot control data. “Eta 137 seconds” she reported. Rick decided to tweet.

There was only 30 seconds left when the MEGABUS driver noticed him and pulled hard to the right narrowly missing Rick as he slammed on the breaks. “We’re losing signal!” Rose yelled out as the bus sped away. 20 Seconds! Rick sped up, this time right behind the bus. It slammed on it’s breaks, and broke off towards an exit. Rose quickly deduced the situation “The Fung Wah hacker must have reported us to all uplinks in the area, they knew we were there from the second we pulled up!” Rick yanked on the wheel and slammed the pedal. Even if it meant leaving the safety of the highway he wasn’t going to drop this connection. 5 seconds left! He pulled ahead of the bus and slammed on his breaks. Time for some of the your own medicine! The buses safety circuits kicked in and the bus slammed on it’s brakes skidding to a halt before tapping Rose’s bumper. It would need a visual inspection before it was allowed to drive again. “Git push complete.”

Rick sped off into the night.

Bosty by Richard Cox

The One Place to Hang Out

I’ve been making my way through this presentation by Maciej Cegłowski

Some kinds of services are just crying out for decentralization. Fifty years from now, people will be shocked that we had one social network that all seven billion people on the planet were expected to join.

Imagine if there was only one bar in Düsseldorf, or all of Germany, and if you wanted to hang out with your friends, you had to go there. And when you did, there were cameras everywhere, and microphones, and you were constantly being interrupted by people selling you stuff. That’s the situation that obtains with Facebook today.

Surveillance as a business model is the only thing that makes a site like Facebook possible.