Living near a busy airport – and especially directly under one of the major flight paths – means regularly dealing with the noise of planes taking off and landing. In attempt to overcome the frustration of having calls and Netflix binges interrupted every few minutes during the nice months of the year when the windows are open, I set out to make the best of it. Inspired by a post on Hacker News earlier this year about how easy (and cheap!) it is to set up your own ADS-B monitoring station I realized I could build a program that automatically sends me information about the planes I hear flying over my home.
With the idea in mind I purchased an RTL-SDR starter kit and dug up my Raspberry Pi Zero W from the depths of my desk drawers. I was honestly amazed at how easy it was to start playing around with the SDR. Within 30 minutes of opening up the kit, I had everything I needed on my computer to listen to FM radio. A little more fiddling and research and I was listening to the airport radios, followed by eventually getting dump1090 set up on my RasPi and plotting the live data on a map. Once I had dump1090 setup and was able to access the processed ADS-B packets over my network it only took a couple weekends of spare time to put together the Node.js app that runs the Telegram notification bot. So without further ado, here’s a quick little demo:
The project cost totaling up to just under US$70 (excluding shipping fees and the USB power adapter).
Antenna – For this setup I have mounted the smaller dipole antenna in an airport-facing window using the suction mount from the antenna kit. I’ve adjusted the antenna so that each side is about 1/2 the wavelength of the 1090MHz signal I’m listening for – roughly 13.8cm – and aligned to form a 90° angle. Conveniently enough, this is about the same as the maximum length for this antenna. While I could probably be more scientific about tuning the length of the antenna and setting its position, the current setup works great for my relatively short-range needs, and the indoor location of the antenna is probably a bigger problem than the length and angle.
RasPi & SDR – These two parts are twist-tied to the window shutters. While originally they were resting on the window sill, I quickly found that opening the shutters would usually result in everything falling to the floor.
The Raspberry Pi has been setup with a standard headless Raspbian Stretch installation. Since the Pi is a fairly popular tool of choice for airplane tracking, everything that was needed for the SDR can be installed with prebuilt packages. For ease of setup, I chose to use the dump1090
fork maintained by FlightAware. Their package provides both a web UI for viewing the live data in human readable formats as well as the standard dump1090
network endpoints for fetching the data in SBS1 and BEAST formats.
As for the bot, I used Node.js and TypeScript since I’m relatively comfortable with both. Plus there’s the added benefit that there are already libraries for handling SBS1 data, geographical calculations, and the Telegram bot APIs. The Node.js app I put together handles everything from fetching the SBS1 data from dump1090
to sending the the messages to the Telegram bot API. I’ve created a systemd service to automatically run the Node.js app when the Raspberry Pi boots up so no need to remember to restart everything manually.
Hi, thanks for posting this. I tried setting this up and I had some problems. Specifically when I got to the npm start command. The output is below. Would you be able to advise where I went wrong?
Thanks & best regards,
Bill
pi@rpi4:~/telegram1090 $ npm start
> [email protected] start /home/pi/telegram1090
> ts-node ./src/index.ts
node-telegram-bot-api deprecated Automatic enabling of cancellation of promises is deprecated.
In the future, you will have to enable it yourself.
See https://github.com/yagop/node-telegram-bot-api/issues/319. internal/modules/cjs/loader.js:1138:30
Error: ENOENT: no such file or directory, open ‘/home/pi/telegram1090/persisted/flights-2020-06-15T02-20-29.json’
at Object.openSync (fs.js:458:3)
at Object.writeFileSync (fs.js:1355:35)
at JsonPersistence.save (/home/pi/telegram1090/src/persistenceService/jsonPersistence.ts:16:12)
at PersistenceService.saveCallback (/home/pi/telegram1090/src/persistenceService/index.ts:45:29)
at PersistenceService.start (/home/pi/telegram1090/src/persistenceService/index.ts:34:14)
at PersistedFlightCollection.createPersistenceService (/home/pi/telegram1090/src/airplaneService/persistedFlightCollection.ts:48:21)
at new PersistedFlightCollection (/home/pi/telegram1090/src/airplaneService/persistedFlightCollection.ts:21:33)
at new AirplaneService (/home/pi/telegram1090/src/airplaneService/index.ts:30:24)
at Object. (/home/pi/telegram1090/src/index.ts:8:25)
at Module._compile (internal/modules/cjs/loader.js:1138:30)
at Module.m._compile (/home/pi/telegram1090/node_modules/ts-node/src/index.ts:837:23)
at Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
at Object.require.extensions. [as .ts] (/home/pi/telegram1090/node_modules/ts-node/src/index.ts:840:12)
at Module.load (internal/modules/cjs/loader.js:986:32)
at Function.Module._load (internal/modules/cjs/loader.js:879:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at main (/home/pi/telegram1090/node_modules/ts-node/src/bin.ts:226:14)
at Object. (/home/pi/telegram1090/node_modules/ts-node/src/bin.ts:485:3)
at Module._compile (internal/modules/cjs/loader.js:1138:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
at Module.load (internal/modules/cjs/loader.js:986:32)
at Function.Module._load (internal/modules/cjs/loader.js:879:14)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `ts-node ./src/index.ts`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /home/pi/.npm/_logs/2020-06-15T02_20_30_166Z-debug.log
I don’t think I’ll have a chance to test for this error myself in the next couple days, but looking at the log this line sticks out to me:
ENOENT: no such file or directory, open '/home/pi/telegram1090/persisted/flights-2020-06-15T02-20-29.json
The issue is probably because I didn’t include an empty “persisted” directory in the git repo, so creating it manually might fix your issue:
$ mkdir persisted
If not, then I can try to investigate further next weekend.
It seems to be working, nur i wont get any messsge in Telegram.
Hi Jo,
I think there was a report of someone else having the same issue on the GitHub repo. Can you double check my reply here and see if that gets it working for you?
https://github.com/flakeparadigm/telegram1090/issues/7
If that does end up being the issue for both of you, then I think I need to update some of the documentation.
When I start it, I only get “Connected to SBS1 messages at localhost:30003” and thats it. My Dump1090-fa ist running and working and Planes are flying overhead, but my bot is not doing anything. Token is okay. Do I have to insert the Botname anywhere?
After the service is started up and running, In Telegram you have to start a chat with the bot and send a message that says `subscribe` to it. Then it should start sending you notifications.
I already did that and it says “You are now subscribed to updates”, but nothing, i even changed the mileage from home but nothing.
Ah okay. I’ll try and find some time this weekend to test it out and see if there are any issues, but it’s been quite a while since I’ve had it running on my own system.
That would be cool. You can reply to me via Github, I raised an issue.
Oh Wait! I got it running… I had a typo in my bot commands.