Ever since I first learned about electronic paper, I’ve thought it would be perfect to display some sort of regularly updated, but not real-time, data such as the current date, an agenda, or the weather forecast. Unfortunately, e-paper displays have always cost more than I was willing to spend on such a project. However, with the price of Amazon’s cheapest Kindle recently dropped to $69, I decided e-paper displays were finally cheap enough for me to pursue such a project: an e-paper based weather forecast display.
The system consists of two parts, one running on the wall-mounted Kindle and one running on a server. The server fetches and processes weather data to create an image, and the Kindle downloads and displays it. While the Kindle is capable of handling both parts, I already had a server, and utilizing it saved me the time and hassle of setting up a build environment for the Kindle.
The server side of the system uses shell and Python scripts to convert weather forecast data into an image for the Kindle. The scripts first download and parse forecast data from NOAA via the National Digital Forecast Database XML/SOAP Service. After parsing the data, the data then needs to be converted into an image. This is accomplished by preprocessing a specially crafted SVG file to insert temperatures, forecast symbols, and days of the week. This SVG is then rendered as a PNG using rsvg-convert and converted to a grayscale, no transparency color space as required by the Kindle using pngcrush. Finally, it is copied to a public location on the web server.
Before running anything on the Kindle, one must first jailbreak it and obtain shell access; this is left as an exercise for the reader. The Kindle portion of the system consists of a shell script that downloads the rendered image from the server, clears the screen twice to prevent ghosting, and then displays the image on the Kindle’s screen. On both the server and the Kindle, cron is used to execute the required scripts twice a day, with the server executing its scripts five minutes earlier than the Kindle to ensure a new image is ready. In addition, the Kindle requires an initialization script to disable the framework and power daemons to prevent the screen from being overwritten and to prevent the Kindle from going into sleep mode, which would disable the WiFi as well as cron, preventing any forecast updates. This initialization script was made easily accessible on power on of the Kindle using kite.
To create the icons, I started off with public domain icons from the Noun Project. Either using pieces of these icons or from scratch, I created icons for the weather conditions there were no icons available for and for those where there were no public domain versions. I am releasing the icons under the CC0 Public Domain Dedication and the source code for the scripts under the MIT License.
Source: Archive, GitHub
Pingback: Turning a Kindle into a weather display - Hack a Day
Rather humorously – this may be the perfect application for gifsockets.
Rather than have the server poll to update the png file, you could ‘stream’ the gif.
Unfortunately, the Kindle’s built-in screen test utility that is used to display the images only supports PNG and bitmap images.
The kindle touch has a webkit based browser which might be able to be used with gifsockets.
I’m not sure of the non-touch version, but I’d imagine it would be possible to install it on a rooted device.
The non-touch version also has a WebKit-based browser. Just making a web page would have been much easier, but it would not be nearly as clean as there is no way to hide the browser chrome.
Ah! I didn’t know that.
Thanks for the awesome hack.
I love the simplicity of this project, thanks for sharing everything! I’m going to try to create my own display modeled after yours to display my solar power generation #s.
I assume the SVG “preprocess” file is part of the MIT-licensed source code and not the CC0 icons? At a glance I can’t tell the difference between the two licenses.
How did you create the SVG file initially?
I’m assuming the wget works over wifi, and you just use USB to power it?
Why update this on half-day intervals? NOAA’s API license states their data updates hourly.
It seems like you could turn off wifi when you’re not updating to save power, allowing you to run this wirelessly for some time. Do you have any idea how much life it will have with the power daemon turned off?
The SVG “preprocess” file is with the MIT licensed code. The main difference being, the MIT License requires attribution, while the CC0 license does not.
I initially created the SVG “preprocess” file and the icons using Inkscape, saved them as “Optimized SVG” to strip out various unneeded information, and finally edited them extensively by hand to simplify them. I then inserted the icons into the “preprocess” file as “
” and replaced what had been blank boxes with markup to use one of the icons. This left me with a sample output file. I then replaced the links to the icons, the temperatures, and the days of the week with strings to be replaced by the Python script.
Correct, it uses wget over WiFi and uses USB power.
I only update twice a day because the forecast doesn’t change that much with more frequent updates. Also, at some point in the evening, NOAA starts returning the forecast starting with the next day. I suppose I could use this and change the large image to “tomorrow,” but it’s easier just updating less frequently.
If I were to look closely at the power daemon and rc.d, I probably could get it to turn off everything but the cron daemon and let cron turn on the WiFi as needed, but I think it’s not worth the effort as I don’t mind having it plugged in. I haven’t tested how long the battery lasts with the current configuration, but I think it’s probably only a few days.
Disregard my other comment or don’t let it through moderation :) … I was wrong about the GMT thing – I see now that it does indeed roll over to forecasting for the next day and gives the valid start time in local time. So my preferred easy solution is to simply preface all forecasts with the day of week, rather than Today and Tomorrow. I made the following two changes to do this.
In weather-script.py, add just before “# Write output”:
And to keep the top label in a good spot, make the “Today” line in weather-script-preprocess.svg look like:
(change text-anchor to begin and x to 25)
Thanks again for the cool hack :)
Pingback: Hack A Kindle Into A Weather Display | Lifehacker Australia
Can you use private weather stations, such as WeatherLink? Here’s a station in Xenia:
Here’s a worldwide WeatherLink map:
You can you any source for weather information you want, you just need to write the code to retrieve and parse the data.
Which specific model is this Kindle?
The model number is D01100. The serial number prefix is B023.
What a great idea! I suppose doing this for the $25 Pandigital Novel 6″ ePaper would be a complete re-write?
It would be a complete rewrite of the Kindle-side image display code. The server-side data parsing and image rendering would remain the same.
Hi Matt, your project turned out really nice. I think I’m going to give this a shot… thanks!
Love this project, its simplicity and useability are quite brilliant.
A few questions (as I know very littel about the programming side)
Does this completely re-write the useage of the kinde? i.e. can it still be used as an e-reader?
Can this be implimented on older versions, say the 3G keyboard?
Could it be produced to run as a screensaver for a functioning e-reader kindle?
Once again great work.
The Kindle can still be used as an e-reader. When it is first turned on, it functions normally until the initialization script is selected and run.
It should work fine on the Kindle 3; I don’t know about older versions.
It can’t be run as a screensaver, as the cron daemon is stopped when the Kindle goes into sleep mode, so it wouldn’t be able to update. I think it could, however, be modified to run as a screensaver as long as one is okay that it won’t update until the next time the Kindle is turned on and off.
I love your project! It’s a very elegant way to display the weather information.
I’m new to SVG graphics and I’ve been trying to figure out how you added the icons to the “preprocess” file as “”, as you said in a comment above. When I open the “preprocess” file in Inkscape, I can only see the placeholder txt. Are the icons invisible? I am hoping you can point me in the right direction. Thanks!
If you open the SVG file in a text editor, you’ll notice the
section. That is where all the icons are. Specific icons are then used by linking to their definitions. Since the “preprocess” file doesn’t have valid links, no icons are shown.
Hey thanks for this awesome project. It took me a couple days to get everything figured out, but I believe that I fully have it running now.
I’m using a Kindle 3 Keyboard and it displays the image perfectly. I did however have some problems with the init script on the Kindle. I placed it in the power on folder for Kite, and that just screwed up everything and sent the Kindle into a boot loop. I finally got things reset and moved the init script to just the Kite folder and selected to run it manually. It worked fine then. It also took a bit to get the SSH and jail break initially setup, but I was able to find some other people that had done that and had posted good instructions. The final thing that I just now got setup is the Cron table. Now that it’s going I think that everything should be good to go.
Like I said it was a fun, though challenging little project and I thank you for sharing it with the rest of us.
(Just as a side note, I’m using a Raspberry Pi I already had setup as a web server to process the server side files, it works perfectly and only takes about 5 seconds to run the script.)
i made the same error putting the script into power on folder for Kite. Now I cannot access my Kindle neither by USB cable, neither by WLAN. Can you send me what you have done to get reset.
It would be great if you can answer here.
I was lucky; I actually followed these instructions on rooting the Kindle and was able to access the terminal and run
rm -rf /mnt/us/kite/onboot
Anybody else have ideas for how to get out of this situation? My Kindle rebooted and I can’t enable USB networking because of the init script, which means there’s no way to get it and remove the init script. Whoops.
I stumbled upon the same issue. Finally, I have got it resolved with Kubrik: http://www.mobileread.com/forums/showthread.php?t=206064
Hope that works also for you.
how to add exisiting ra1.svg and additional new icons to weather-script-preprocess.svg’s xml?
just for info, already succesfully added.
Funny, I was just thinking about this exact same project. Would it be possible to modify it to display the time/date too? Maybe update the display once a minute or once every 5 minutes?
Both could easily be done; modifiying the server-side code will change what is displayed, and changing the cron settings on both the server and the Kindle will change the update rate.
Good idea – best next step is to do all the processing on the Kindle, obviously. That makes it a killer reason to jailbreak and a new use for the Kindle when not reading for many users who would not have the server to plug into it all the time.
I had seen this when you posted it but didn’t think much of it since my price threshold was a bit lower for a similar device. As it turns out, I came into one of these Kindles through some unrelated business, so now I’m trying to get this working. In any case, can you explain a little more about how you got kite installed? I followed the link, but the install process doesn’t seem to work as documented on the newer models of Kindle. Specifically, I don’t see any option to do a system update to pull in the kite mod. If you have any further, more detailed information about how you got that working, that’d be great. Thanks.
I used the “installation of kite as a script” method listed in the post; the “installation as update” method did not work for me either.
Nice work :-)
I think I will try it too, but need to buy a Kindle first. Amazon (Austria) sells a Kindle 4 for 79€, which looks exactly like yours; would it work with that one?
Also, I have an idea:
I could make a little hardware hack that closes the power button about every hour, so maybe it’s possible to alter the scripts to update the picture when turned on and then go back to sleep with that pic on the screen…do you think that’s possible? Maybe there is another way to wake the Kindle up every hour, I can check the hardware if I have one :-)
I used a Kindle 4, so yes, it should work on one.
There is no limitation as to how often the screen is updated; no hardware hacks need. To make it update more frequently, one simply needs to edit crontab to have the script run more often.
This is awesome; I’ve been hoping to do this for some time and will be shamelessly copying your efforts.
I’ve been thinking of using pwnazon to serve the images as “ads,” so even the Kindle I use as an ereader can benefit. Did you chose to pull the images yourself to better control update frequency?
Yes; otherwise it would only update when the Kindle is taken out of sleep mode.
I spent hours trying to figure out why my Kindle 3 would zoom the PNG image horizontally while appearing to be proper vertically. The following change to the last two lines of weather-script.sh fixed the problem.
pngcrush -c 0 -nofilecheck weather-script-output.png weather-script-output-new.png
cp -f weather-script-output-new.png /var/www/weather-script-output.png
I don’t really need -nofilecheck flag. The point being that the original command did not work because of the -ow flag. I think that pngcrush actually needs input and output file.
You’re probably running an old version of pngcrush. The “-ow” flag was added with pngcrush 1.7.22, released December 2011.
Pingback: How to Replace a Kindle 2 Battery | Hack Writing
Any chance you could post step by step directions? I love doing these mods to my devices, but I don’t want to take a wrong turn anywhere. So far my device is “jailbroken,” and kite is installed; where do I go from there?
First, you need to set up the server-side scripts. Then, you need to copy “init-weather.sh” to your kite folder and copy “display-weather.sh” and “weather-image-error.png” to a “weather” directory on your Kindle. Finally, you need to edit your Kindle’s crontab to run the “display-weather.sh” script at specified intervals. Running “init-weather.sh” will start the display.
Will this work with a Kindle Touch?
It should work with a Kindle Touch, but you’ll need a method other than kite to launch it.
and one other odd question-
How did you mount it to the wall?
Amazing project! Since my weather station finally broke and all the new ones I could find were either aesthetically acceptable but absolutely not informative or just way too techie. So I decided to follow your lead. Given my rather marginal working knowledge of linux and total incomprehension of any programming language, it took me a while to get tha basics together, but in the end it worked and in an attack of megalomania I even decided to extend the setup by a raspberry pi and a temperature/humiditychip to measure the conditions inside and include them in the script.
As you can see I took a typographic approach. You may have noticed that the text is in German, but it’s not really coherent, so it wouldn’t make sense to translate it here. The information consists of the current condition outside (including temperature, pressure and wind speed/direction), inside (temp and humidity) and minimum/maximum temperatures and conditions for the next two following days.
The pi extracts the sensor data every minute, so the display is updated every minute as well (the weather data from the internet is just included every twenty minutes). To prevent ghosting (which I didn’t notice so far but would probably occur sonner or later), the screen is blanked once an hour. For simplicity, the pi acts as the webserver as well.
Again, thanks a lot for the instructions! Without them I probably wouldn’t have known where to start at all.
Looks like embedding the image didn’t work, so here’s the link:
Your improvement looks great, and I particularly like the extension using the internal sensor via a Pi. Any chance that you can share the code and a description for this?
Thank you so much for sharing this project. It’s fantastic! I’ve wanted to do something with an e-ink device for awhile and wasn’t sure how to start. I’m also not as knowledgeable with Linux and I didn’t have a web server so this was an excellent opportunity to learn more about both.
At present, I’ve basically re-created your entire project with a minor change – I added a date and time stamp for my own sanity check. I wrote up my experience and the steps I took in case anyone else is in my shoes and isn’t quite sure why something isn’t working properly. They can be found here: http://www.shatteredhaven.com/2012/11/1347365-kindle-weather-display.html
I plan on making modifications down the road and adding extra sensors hooked the the Raspberry Pi. Thanks so much for the inspiration.
Wow, great project. Thanks for sharing.
I need the same but with a higher refresh rate. Do you think that it would work with if the data was updated every 30 seconds? Further if I skip clearing the screen before displaying the new image would I then prevent the screen from flickering during the update?
Updating every 30 seconds should work. The screen would still flicker if one doesn’t clear it due to the nature of the “eips” utility; not clearing the screen would, however, reduce the delay.
Thanks, Matthew. I will test it.
Thank you for the code! Since I live in Europe, I had to modify the code to get data from weather.com. I have to fix icons and some details, but it works!
I’ll upload the code in a week, when everything will work.
Hello! Everything works fine! I finally used the wunderground service, which provide a wonderful API! The only thing I regret is I’m too lazy to modify the icons to reflect some weather conditions.
So, here is the new Python file to generate the image: http://sprunge.us/feFc
And here is the SVG file “weather-script-preprocess.svg” modified to reflect most of weather condition icons:
Thanks for the code!
To do: modify the chancesnow, chanceflurries, chancesleet, chancerain, and chancetstorms icons to indicate the incertitude; make the code less ugly.
Unfortunately, the links are broken. I would like to see your European solution.
If you have your own server, why not create a html file, include the weather information, and displayed with Kindle’s web browser?
While that would certainly be simpler, the final result is not nearly as clean as one can’t hide the browser interface.
If I install the above scripts and use the Kindle as a weather display, can I still use the Kindle as an eBook reader?
The Kindle can still be used as an eBook reader, but doing so will be inconvenient as the only way to exit the weather display is to restart the Kindle.
You can use this script: http://sprunge.us/MCLj
It launches the weather display from kite and waits for the user to press any key to resume the Kindle’s Java virtual machine and go to the homepage.
You may want to add a loop to refresh the data or add the power management command.
Is there any way to display the temperature in Celsius?
Change part of line 19 of “weather-script.py” from “&Unit=e” to “&Unit=m” and change the eight instances of “°F” in “weather-script-preprocess.svg” to “°C”.
As a fun project, I made a version of this. You can check it out here http://origami.phys.rpi.edu/~jimenc/public/pjs/weather_kindle/server2/weather.php
Pingback: Kindle Weather Display on the Nook | Ethan's Makerblog
Pingback: Ordered A Kindle - Webomatica
I figured everything out, except for the cron job running on my Kindle 4nt. Crontab -e gives me an empty file – is that right? Or are the cronjobs located somewhere else on my device?
I don’t remember exactly. Try looking at /etc/crontabs/root with vim.
@Jay : Please search in here for ‘Jennifer’
or go directly to
She has described the solution.
BTW, I’m working on server side solution with ‘node.js’ hosted on ‘heroku’.
Sorry, for now I can’t publish the URL, WOUNDERGROUND allows only 500 GET request per day and any caching is missing yet.
Pingback: Disassembling an eReader | Terence Eden has a Blog
Pingback: Kids and weather station | Annalog
Awesome project! I’m trying to recreate this on my own, but I’m running into an issue displaying the image on the Kindle 4. When I call `eips -g weather.png` my image displays, but it is stretched very wide. Here is a picture: http://sdrv.ms/12vwWks
Any idea why the image is distorted? I can open this in various image viewers and see that the image is in fact 600 x 800.
Your PNG uses a RGB color space; it needs to be grayscale.
@Matt: This can be fixed simply by use of ‘pngcrush’.
Please take a look at Matthew’s server side scripts.
(Or search this site for ‘pngcrush’)
I have the same problem, that the picture is stretched. Could you fix the problem and find a solution? The two short answers are not enough for me, sorry…
Thanks and greetings!
If the picture is stretched, you’re using an RGB formatted PNG image instead of a grayscale formatted PNG image. If you look at
weather-script.shin the server-side code, you’ll see that it runs
pngcrushon the image, which converts the RGB image produced by
rsvg-convertinto a usable grayscale image.
Thank you for your fast reply! I’m exactly using your code for the weather-script.sh. I only did a few changes in the other parts to make it working for europe. And there is the point… It seems like pngcrush is not doing right. Maybe I should switch to a different version.
Can you advise how I get this to work for a UK location? When I change the Lat and Lon, the script errors out on line 43 of the weather-script.py. Also reports IndexError: List index out of range
Thanks for a great project.
The scripts sources forecast data from the United States’ National Weather Service; not surprisingly, this data is US only. In order to get the script to work in the UK, one needs to modify it to use a different source for forecast data.
I’ve modified Mathew’s code to pull data from the UK Met Office – code here https://github.com/obitoo/kindle-weather-display
I tweaked the icons a little – unsurprisingly we have more types of rain.
It looks wonderful! However, it seems to me to be way easier to set up a simple webpage that refreshes itself. It might even display unread emails, etc. :D How about something like that? Do you know any such initiatives?
One could do that, but this hides the unattractive browser chrome.
I had an issue with pngcrush on Debian – it couldnt handle the grayscale conversion properly, even when i forced the bitdepth. Solution was on the ‘convert’ step, to do ‘convert -depth 8’
Pingback: Informational Display Ideas and Inspiration - jpreardon.com
Wow, this project looks great…
Has anyone gotten this project to work on the Kindle as a stand alone without the web server?
How about just getting a date/time to show up in big fonts without a server call?
Thanks again for the great post.
I’ve briefly tried to get it to work standalone, but getting all the required software compiled for the Kindle is easier said than done.
Is there any way you could send me a Kindle such as this, but that shows the date and time? This would be also a tad simpler for you since it wouldn’t require the server. I would pay for the Kindle and shipping and for your work.
You can email me at [email removed].
It would actually be a little more complicated; the server would still be needed as it generates the images, and as the Kindle would be updating every minute, one would have to be more careful with image generation and refresh timings. I neither have time for something like this right now, nor do I want to take on the support obligations that would be involved with selling something.
Display with something wrong in my Kindle Paperwhite.
The png looks like too large in my Kindle. How to fix?
The Paperwhite has a higher screen resolution than previous models. You need PNG files that are 758 x 1024 pixels instead of 600 x 800 pixels as for the older Kindles. Also, make sure your PNG uses true grayscale, not RGB.
How do you do this without hacking and using calibre?
It’s a hack; it involves hacking. The post doesn’t mention calibre anywhere as it has nothing to do with calibre.
I know this hack is kinda “old” know but I am a little bit desperate about what svg programm you used to edit the icons? I have found no tool which is able to direclty manage/edit the graphics inside of the weather-script-preprocess.svg ? Any suggestens other then manual copy-paste them in seperate svg files for editing?
As I created the file by manually copying and pasting the separate icons in, I’d recommend doing the opposite to edit them, as you suggest.
Pingback: Code Something! » EInk Walldisplay
I really like your project! I did my own under the wall, so I only can see the screen! Thank you; it looks great. But I have some problems with ghosting.
How can I load a blank .png file several times before it loads the weather.png?
Thanks a lot,
There’s no need to load a blank image as there is a built in command for clearing the screen. My script clears the screen twice, which eliminates the ghosting for me, except when it’s cold. To clear the screen more times, modify the
display-weather.shscript to run the
eips -ccommand more times.
Thank you, I did the script by myself, so I did not have the
eips -c! Now it is build in and it runs well :)
Thank you, for your help.
So, did anyone get it to work as a standalone weather display, i.e without the need of a separate server?
Not that I’m aware of.
Amazing project, I just now terminate the same setup. Only a question, did you find a way to change the font?
Is it possible to use some custom font and not the standard web like helvetica, times new roman etc.?
You can use any font you have installed on the server generating the images. You just need to have an SVG source file with the text styled with the font you want to use.
Thank you!!! It is working; I am using Gotham Light.
Preview of the Kindle
Pingback: Other Interesting Weather Projects - Workshopshed
Pingback: Nook Simple Touch e-paper weather display | Rory Crispin
It’s possible to do a Kindle weather display without USB networking, ssh, or Linux commands. Kite can issue all the necessary commands. I have a writeup at http://www.galacticstudios.org/kindle-weather-display/
Thank you for your kind share.
I made small changes based on your work, one might be useful is
“Use crontab instead of kite or stop powerd by changing the suspend_levels.”
Thanks for this nice project!
Unfortunately the display_weather script isn’t working on my Kindle. Even if it just contains
eips -g weather-image-error.png
it shows a blank screen until I reboot it. What am I doing wrong?
This was from ~3.5 years ago. Amazon may very well have changed the Kindle firmware in the interim, breaking things, or you could have installed something wrong. I don’t know.
Please just use Kubrick to resolve the issue: http://www.mobileread.com/forums/showthread.php?t=206064
This is probably long ago not something you care much about any more but for anyone (like me) looking to implement something similar, there are a few improvements worth considering.
1)Don’t update the image if it hasn’t changed. The server can know if it’s updating stuff. This would definitely avoid the flicker and could save power.
2)Pass the battery level to the server. The server can then superimpose the battery level on the display if required (use batt=`lipc-get-prop -i com.lab126.powerd battLevel`).
3)As others have said, turn wifi off when not in use. Still looking into doing this one.
4)Suspend may be an option. https://www.mobileread.com/forums/showthread.php?t=235821
Except for occasionally dropping the Wi-Fi connection, it’s worked flawlessly for me for almost five years now, so I have no intention of changing anything. If I ever replace it, it will probably be with a multi-screen setup running on custom electronics.
Hey Matthew, seriously I love this project, its simplicity and usability is brilliant. What a great idea! I want to buy a Kindle device for developed my project. But, I want to know the model number and price of the Kindle device, which model will be the best for developing the weather forecasting project.
I did this project five years ago and have not stayed up-to-date on the hackability of newer Kindle models. It would probably be good to check the MobileRead Forums.
Wrote a custom server side script and everything is working wonderfully!
Only issue is that upon the cronjob running it always returns `weather-image-error.png`, despite being able to access the image initially via `init`. :(
Put /etc/init.d/framework stop and /etc/init.d/powerd stop in the startup directory of kite – and now i have no chance to access the kindle anymore. Bricked…
If you hold the power button down for long enough (40 seconds, apparently), the Kindle will reboot. Neither of those commands should do anything permanent. However, I’m sure the Kindle’s firmware has changed significantly in the decade since I wrote this post.
That is ending in the same behavior. I am waiting now for a TTL adapter to try acessing it this way…
Okay – my adapter arrived today and i was able to delete the init script – now the kindle is booting normal again. Puh… ;-)
Got it running now.
To display the weather i used the “start.sh” from here:
It disables a lot of services to save Battery and works with a loop instead of cron. Updating every 30 minutes took 6% from battery in 24h. So it should run at least 2 weeks on battery.