I have been experimenting with my Raspberry Pi TFT display these few days with the intention to use it as a misc status display, heavily influenced by Mark‘s work. I collect most of my house’s telemetrics to an emoncms installation running on the server where I host this blog, so I will pull some of the data I need to visualize from there. I would be showing information such as
- Room temperatures (transmitted by multiple Funky+DS18B20)
- Outside air temperature and humidity (measured with Funky+DHT22)
- Heat pump telemetrics (power consumption, multiple temperature measurements as described here)
- House power consumption as described here
- Solar hot water tank telemetrics (gathered as explained here and here)
- Misc weather data from Weather Underground, data collected using the method I explained here
The python script is pretty self-explanatory, it uses pygame to generate the screens on the framebuffer device. This is work in progress, I will expand the script with IR remote control with Funky, so I can chose which specific page to show or other functions that I haven’t decided on yet.
I think that pulling and displaying satellite weather data from Weather Undergound for my area is pretty cool too:
Another cool part is displaying overlayed emoncms data for outside/ room temperatures and heat pump power usage as per my post here; I use a slightly simplified chart sized down to 160×128 pixels and display that one too:
No room for legends but I already know the colors by heart 🙂
Yet another cool thing is to overlay weather icons on the outside temperature page, using Weather Undergound API to get actual icon:
The code
#!/usr/bin/python import pygame import sys import time from time import strftime import os import httplib import urllib import json time_stamp_prev=0 #Set the framebuffer device to be the TFT os.environ["SDL_FBDEV"] = "/dev/fb1" #Get emoncms feed latest data def getFeedVal(feedId): conn = httplib.HTTPConnection("*******SITE**********") conn.request("GET", "/emoncms3/feed/value.json?apikey=*******API**********&id=" + feedId) response = conn.getresponse() #print response.status, response.reason data = response.read() conn.close() return data def getWUnder(): global time_stamp_prev # Only fetch latest data once every while, or we will violate WU's rules if (time.time() - time_stamp_prev) > 15*60: time_stamp_prev = time.time() f = urllib.urlopen('http://api.wunderground.com/api/*******W.U. key**********/geolookup/conditions/q/sofia.json') json_string = f.read() parsed_json = json.loads(json_string) #temp_c = parsed_json['current_observation']['temp_c'] #print "Current temperature in %s is: %s" % (location, temp_c) #Also see http://www.wunderground.com/weather/api/d/docs?d=resources/icon-sets iconurl = parsed_json['current_observation']['icon_url'] urllib.urlretrieve (iconurl, "graph.gif") f.close() #http://www.wunderground.com/weather/api/d/docs?d=layers/satellite urllib.urlretrieve ("http://api.wunderground.com/api/*******W.U. key**********/satellite/q/KS/Sofia.gif?width=160&height=128&basemap=1","satellite.gif") def displayTime(): # """Used to display date and time on the TFT""" screen.fill((0,0,0)) font = pygame.font.Font(None, 50) now=time.localtime() for setting in [("%H:%M:%S",60),("%d %b",10)] : timeformat,dim=setting currentTimeLine = strftime(timeformat, now) text = font.render(currentTimeLine, 0, (0,250,150)) Surf = pygame.transform.rotate(text, -90) screen.blit(Surf,(dim,20)) def displayText(text, size, line, color, clearScreen): """Used to display text to the screen. displayText is only configured to display two lines on the TFT. Only clear screen when writing the first line""" if clearScreen: screen.fill((0, 0, 0)) font = pygame.font.Font(None, size) text = font.render(text, 0, color) textRotated = pygame.transform.rotate(text, -90) textpos = textRotated.get_rect() textpos.centery = 80 if line == 1: textpos.centerx = 90 screen.blit(textRotated,textpos) elif line == 2: textpos.centerx = 40 screen.blit(textRotated,textpos) def main(): global screen pygame.init() size = width, height = 128, 160 black = 0, 0, 0 pygame.mouse.set_visible(0) screen = pygame.display.set_mode(size) #HP boiler=11 #Solar boiler=16 #Living room t=76 #Kids room t=18 #Outside temp=71 #Outside humidity=70 while True: getWUnder() displayTime() pygame.display.flip() time.sleep(10) displayText('Outside Temp', 30, 1, (200,200,1), True ) displayText(getFeedVal("71") + "C", 50, 2, (150,150,255), False ) graph = pygame.image.load("graph.gif") graph = pygame.transform.rotate(graph, 270) graphrect = graph.get_rect() screen.blit(graph, graphrect) pygame.display.flip() time.sleep(10) displayText('Out. Humidity', 30, 1, (200,200,1), True ) displayText(getFeedVal("70") + "%", 50, 2, (150,150,255), False ) pygame.display.flip() time.sleep(10) displayText('Solar boiler', 30, 1, (200,200,1), True ) displayText(getFeedVal("16") + "C", 50, 2, (150,150,255), False ) pygame.display.flip() time.sleep(10) displayText('HP Boiler', 30, 1, (200,200,1), True ) displayText(getFeedVal("11") + "C", 50, 2, (150,150,255), False ) pygame.display.flip() time.sleep(10) urllib.urlretrieve ("http://******* path to my site**********.php", "graph.png") graph = pygame.image.load("graph.png") graph = pygame.transform.rotate(graph, 270) graphrect = graph.get_rect() screen.fill(black) screen.blit(graph, graphrect) pygame.display.flip() time.sleep(10) graph = pygame.image.load("satellite.gif") graph = pygame.transform.rotate(graph, 270) graphrect = graph.get_rect() screen.fill(black) screen.blit(graph, graphrect) pygame.display.flip() time.sleep(10) if __name__ == '__main__': main()
To autostart the script on boot I did
sudo nano /etc/init.d/tft
and the tft script goes like this:
#! /bin/sh # If you want a command to always run, put it here # Carry out specific functions when asked to by the system case "$1" in start) echo "Starting TFT status display.." sudo python /home/pi/python/pg.py & ;; stop) ;; *) echo "Stopping TFT.." killall python exit 1 ;; esac
Finally, these commands will register your script to run at boot and shutdown:
sudo chmod +x /etc/init.d/tft sudo update-rc.d tft defaults
Pingback: Thomas Höser » Project: 1.8 TFT Raspberry Pi Status Display
Hi Martin,
I found your script and wanted to use just some parts of it, I want the weather on my display, so I deleted the unwanted bits from your script, now it just displays the time and date and after 10 sec it should give the temp with weather icon.
I see the time on the screen, but it does not flip over to the weather?
If I uncomment the line that says: print “Current temperature in Someren is: %s” % (temp_c) I get that line in my terminal, but not on screen.
Are you willing to help me out? can I post the script here or send it to you via email?
thanks for the sharing your script anyway, I allready some useful things from it.
kind regards,
Bor van Gool