FHEM Panel (Marke: Eigenbau)
Hallöchen,
ich habe bei mir Zuhause schon länger FHEM zum Steuern einiger Steckdosen, wie aber auch Heizungen im Einsatz. Manchmal ist es aber sehr nervig, dass ich FHEM „nur“ mit Handy oder Computer ansteuern kann. Aus diesem Grunde, habe ich mir ein Wand-Panel für FHEM gebaut.
Funktionsübersicht:
– Zugriff auf Heizelemente via FHEM (Gruppen- und Einzelgeräte)
– Zugriff auf Steckdosen-/Stromelemente via FHEM (Gruppen- und Einzelgeräte)
– Zugriff auf Systeminformationen (ifconfig, route, dmesg, messages, reboot, etc)
– Zugriff auf Bahnfahrpläne aus dem Internet
– Farbumschaltung auf dem Display
Im Hauptmenü habe ich dann noch Sammelfunktionen, wie „Alles aus“ oder „Heizungen aus“ erstellt, welche in FHEM einfach wieder auf eine Struktur zurückgreifen.
Insgesamt bin ich bei den Kosten unter 100,- Euro geblieben *freu* :-)
Als Bauteile wurden dafür verwendet:
– Gehäuse
– Raspberry
– TFT Touch Screen
– Netzteil
– 12V zu 5V Stromwandler (für Raspberry)
An einigen Stellen war erfinderisches Geschick gefragt, so als Beispiel beim Anschluss vom USB Touchscreen Controller. Dieser hatte im Auslieferungszustand einen unpassenden (für das Gehäuse zu langen) USB Stecker.
Nachfolgend ein paar Bilder vom Gerät:
(Blick auf alle Komponenten)
(Neu angelöteter USB-Stecker für den Touch-Controller)
(12V zu 5V Wandler für den Raspberry; ich habe ein 12V Netzteil für den Eingangsstrom)
Insgesamt ging der Elektro-Part sehr fix und einfach. Viel mehr Aufwand und Zeit hat mich das Gehäuse gekostet; dieses hatte nämlich auf der Front noch kein Einlass für das Display. Mit einer ruhigen Hand, einem guten Dremel und einer guten Feile ging das dann aber auch irgendwann ;-)
Um der Hardware Leben zu geben, habe ich ein Python-Skript geschrieben, welches die Module aus pyGame nutzt um eine Oberfläche darzustellen. Das Skript hängt unten an – ist mein erstes Skript in Python, daher bitte Nachsicht bei Schnitzern in der Sprache.
(Auskunft über die nächsten Bahn/Bus-Verbindungen)
(Manuelle Eingabe von Soll-Temperaturen)
Und nun die Intelligenz vom Projekt:
import sys, pygame from pygame.locals import * import time import subprocess import os from numpy import * from datetime import datetime, timedelta import telnetlib import threading import ConfigParser import httplib import urllib2 import lxml.html import re fhem_host = "192.168.178.1" fhem_port = "7072" fhem_pass = "" os.environ["SDL_FBDEV"] = "/dev/fb0" os.environ["SDL_MOUSEDEV"] = "/dev/input/event0" os.environ["SDL_MOUSEDRV"] = "TSLIB" pygame.init() screen_width = 800 screen_height = 480 btn_width = 245 btn_height = 60 lines_page = 20 blue = (26, 0, 255) cream = (254, 255, 250) black = (0, 0, 0) white = (255, 255, 255) colors = array([["white / black", 255, 255, 255, 0, 0, 0], ["white / blue", 255, 255, 255, 26, 0, 255], ["black / white", 0, 0, 0, 255, 255, 255], ["white / dimgrey", 255, 255, 255, 105, 105, 105], ["black / slategrey", 0, 0, 0, 112, 128, 144]]) color_fg = int(colors[0][1]), int(colors[0][2]), int(colors[0][3]) color_bg = int(colors[0][4]), int(colors[0][5]), int(colors[0][6]) color_int = 0 menu = [None] * 100 menu_txt = [None] * 100 menu_pos = [] menu_cur = 0 menu_mode = "menu" cli_out = [] cli_offset = 0 cli_lastcmd = "" temp_txt = "" temp_last = "" temp_fhem = "" temp_pos = [] fahrplan_attributes = [] def system_settings(action): global color_fg, color_bg, color_int sys_settings = ConfigParser.ConfigParser() if action == "load": print "[main] Loading Configuration from mymenu.ini" try: sys_settings.read("mymenu.ini") color_int = int(sys_settings.get('mymenu', 'color_scheme')) print "[main] color_scheme = " + str(color_int) color_fg = int(colors[color_int][1]), int(colors[color_int][2]), int(colors[color_int][3]) print "[main] color_fg = " + str(color_fg) color_bg = int(colors[color_int][4]), int(colors[color_int][5]), int(colors[color_int][6]) print "[main] color_bg = " + str(color_bg) except Exception, e: import traceback print "[main] Could not load configuration!" print traceback.format_exc() if action == "save": try: configfile = open("mymenu.ini", 'w') sys_settings.add_section('mymenu') sys_settings.set('mymenu', 'color_scheme', color_int) sys_settings.write(configfile) configfile.close() except Exception, e: import traceback print "[main] Could not save configuration!" print traceback.format_exc() def system_color(scheme): global color_fg, color_bg, color_int color_fg = int(colors[scheme][1]), int(colors[scheme][2]), int(colors[scheme][3]) color_bg = int(colors[scheme][4]), int(colors[scheme][5]), int(colors[scheme][6]) color_int = scheme system_settings("save") menu_message("Color set successfully!") def make_button(text, xpo, ypo, colour, cmdtype, cmdstr): font=pygame.font.Font(None,24) label=font.render(str(text), 1, (colour)) screen.blit(label,(xpo,ypo+(btn_height/3)-6)) pygame.draw.rect(screen, colour, (xpo-5,ypo-5,btn_width-5,btn_height-5),1) menu_pos.append([xpo-5, ypo-5, xpo+btn_width-5, ypo+btn_height-5, cmdtype, cmdstr]) def menu_click(): global menu_cur click_pos = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1]) for entry in menu_pos: print "checking click on: " + str(entry[0]) + " and " + str(entry[1]) + " (x,y) and " + str(entry[2]) + " and " + str(entry[3]) + " (x,y)" if entry[0] <= click_pos[0] <= entry[2] and entry[1] <= click_pos[1] <= entry[3]: click_pos = [] print "checking cmdtype: " + str(entry[4]) if entry[4] == "system": print "executing cmdtype system and command " + str(entry[5]) menu_message("Executing OS: " + str(entry[5])) pygame.display.update() os.system(entry[5]) menu_message("Executing OS: " + str(entry[5]) + " ... finished!") if entry[4] == "python": print "executing cmdtype python and command " + str(entry[5]) menu_message("Executing Python: " + str(entry[5])) pygame.display.update() eval(entry[5]) return def menu_layout(): global color_bg, color_fg screen.fill(color_bg) pygame.draw.rect(screen, color_fg, (0,0,screen_width,screen_height),1) #pygame.draw.rect pygame.draw.rect(screen, color_fg, (0,screen_height-50,screen_width,50),1) pygame.draw.rect(screen, color_fg, (0,0,screen_width,50),1) def menu_display(pos): global menu_cur #menu_create() menu_layout() menu_cur = pos menu_pos[:] = [] starty = (btn_height / 2) + 50 startx = 20 for entry in menu[pos]: if (starty + btn_height + (btn_height / 2)) >= screen_height: starty = (btn_height / 2) + 50 startx += btn_width + 20 if (entry[0].find("'") == -1): make_button(entry[0], startx, starty, color_fg, entry[1], entry[2]) else: make_button(eval(entry[0]), startx, starty, color_fg, entry[1], entry[2]) starty = starty + btn_height + (btn_height / 2) font = pygame.font.Font(None,36) menu_title(str(menu_txt[menu_cur])) return def menu_title(mytitle): font = pygame.font.Font(None,36) label = font.render(str(mytitle), 1, color_fg) labelpos = label.get_rect() labelpos.centery = 25 labelpos.centerx = screen.get_rect().centerx screen.blit(label, labelpos) def menu_message(mymsg): msgbg = pygame.Surface((screen_width-4,46)) msgbg.fill(color_bg) screen.blit(msgbg, (2, screen_height-48)) font=pygame.font.Font(None,22) label=font.render(str(mymsg), 1, color_fg) screen.blit(label,(20,screen_height-35)) def FHEM_Value(dvc): tn = telnetlib.Telnet( fhem_host, fhem_port, 5 ) tn.write( "{Value('" + dvc + "')}\n" ) print "executing fhem: " + "{Value('" + dvc + "')}\n" #tn.read_until( "=" ) res=tn.read_until( "\n" )[ :-1 ] tn.close() return res def FHEM_Cmd(cmd): global menu_cur tn = telnetlib.Telnet( fhem_host, fhem_port, 5 ) tn.write( cmd + "\n" ) #tn.write( "{ '=' }\n" ) #tn.read_until( "=" ) tn.close() time.sleep(1) #menu_create() menu_display(menu_cur) menu_message("FHEM Set finished!") def FHEM_all_off(): FHEM_Cmd("set Alle_Steckdosen off") FHEM_Cmd("set Alle_Heizungen desired-temp off") menu_message("Alle Systeme wurden benachrichtigt!") def cli_run(cmdtorun): global cli_out, cli_offset, menu_mode, cli_lastcmd cli_lastcmd = cmdtorun cli_out = [] menu_mode = "cli" menu_layout() menu_title(str(cmdtorun)) font_size = 18 font = pygame.font.Font(None,40) btn_font = font.render("<<", 32, color_fg) screen.blit(btn_font, (10, screen_height-44)) btn_font = font.render("<", 32, color_fg) screen.blit(btn_font, (60, screen_height-44)) btn_font = font.render(">>", 32, color_fg) screen.blit(btn_font, (screen_width-42, screen_height-44)) btn_font = font.render(">", 32, color_fg) screen.blit(btn_font, (screen_width-76, screen_height-44)) btn_font = font.render("ZURUECK", 32, color_fg) btn_pos = btn_font.get_rect() btn_pos.centery = screen_height-28 btn_pos.centerx = screen.get_rect().centerx screen.blit(btn_font, btn_pos) proc = subprocess.Popen(cmdtorun, shell=True, stdout=subprocess.PIPE) font = pygame.font.Font(None,font_size) for line in iter(proc.stdout.readline, ''): cli_out.append(line.rstrip('\n')) tmp_index = 0 for line in cli_out: print "index, offset: " + str(tmp_index) + ", " + str(cli_offset) if tmp_index >= cli_offset: label = font.render(str(line), font_size, color_fg) screen.blit(label, (5, 52+((tmp_index-cli_offset)*font_size))) if tmp_index >= lines_page*((cli_offset/lines_page)+1): break tmp_index += 1 def cli_click(): global cli_offset, menu_mode, menu_cur click_pos = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1]) if 0 < click_pos[0] < 48 and screen_height-50 < click_pos[1] < screen_height: #click on << cli_offset = 0 cli_run(cli_lastcmd) if 48 < click_pos[0] < 96 and screen_height-50 < click_pos[1] < screen_height: # click on < cli_offset -= lines_page cli_run(cli_lastcmd) if screen_width-96 < click_pos[0] < screen_width-48 and screen_height-50 < click_pos[1] < screen_height: # click on > cli_offset += lines_page cli_run(cli_lastcmd) if screen_width-48 < click_pos[0] < screen_width and screen_height-50 < click_pos[1] < screen_height: # click on >> cli_offset += len(cli_out) - lines_page cli_run(cli_lastcmd) if 96 < click_pos[0] < screen_width-96 and screen_height-50 < click_pos[1] < screen_height: # click on back menu_mode = "menu" cli_offset = 0 menu_display(menu_cur) def temp_display(tmpstr, fhemdevice, displaystatus): global temp_txt, temp_last, menu_mode, temp_fhem menu_mode = "temp" temp_txt = tmpstr temp_fhem = fhemdevice menu_layout() menu_title(str(tmpstr)) if displaystatus > 0: menu_message("Status: " + FHEM_Value(fhemdevice)) eingabe_cols = 3 eingabe_cur = 1 starty = 80 startx = (screen_width/2)+10 pygame.draw.rect(screen, color_fg, (80,80,(screen_width/2)-80-10,80+30),2) font = pygame.font.Font(None, 120) lbl_font = font.render(str(temp_last), 120, color_fg) screen.blit(lbl_font, (85, 85)) font = pygame.font.Font(None, 32) pygame.draw.rect(screen, color_fg, (80, 200, 90, 50),1) lbl_font = font.render("An", 1, color_fg) screen.blit(lbl_font, (85,205)) temp_pos.append([80, 200, 80+90, 200+50, "on"]) pygame.draw.rect(screen, color_fg, (180, 200, 90, 50),1) lbl_font = font.render("Aus", 1, color_fg) screen.blit(lbl_font, (185,205)) temp_pos.append([180, 200, 180+90, 200+50, "off"]) pygame.draw.rect(screen, color_fg, (280, 200, (screen_width/2)-280-10, 50),1) lbl_font = font.render("Abbruch", 1, color_fg) screen.blit(lbl_font, (285,205)) temp_pos.append([280, 200, 280+(screen_width/2)-280-10, 200+50, "CANCEL"]) eingabe_temp = array([["1"], ["2"], ["3"], ["4"], ["5"], ["6"], ["7"], ["8"], ["9"], ["<"], ["0"], ["OK"]]) for entry in eingabe_temp: if eingabe_cur > eingabe_cols: startx = (screen_width/2)+10 starty += 60 eingabe_cur = 1 pygame.draw.rect(screen, color_fg, (startx, starty, 50, 50), 1) font = pygame.font.Font(None,32) btn_font = font.render(str(entry[0]), 32, color_fg) screen.blit(btn_font, (startx+5, starty+5)) temp_pos.append([startx, starty, startx+50, starty+50, str(entry[0])]) startx += 60 eingabe_cur += 1 time.sleep(2) pygame.display.update() def temp_click(): global temp_last, menu_mode, temp_fhem click_pos = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1]) for entry in temp_pos: if entry[0] <= click_pos[0] <= entry[2] and entry[1] <= click_pos[1] <= entry[3]: click_pos = [] if entry[4] == "CANCEL": menu_mode = "menu" menu_display(menu_cur) return if entry[4] == "<": temp_last = temp_last[:-1] temp_display(temp_txt, temp_fhem, 0) return if entry[4] == "OK": menu_mode = "menu" FHEM_Cmd('set ' + temp_fhem + ' desired-temp ' + temp_last + '.0') print "executing: " + 'set ' + temp_fhem + ' desired-temp ' + temp_last + '.0' return if entry[4] == "on" or entry[4] == "off": menu_mode = "menu" FHEM_Cmd('set ' + temp_fhem + ' controlManu ' + str(entry[4])) print "executing: " + 'set ' + temp_fhem + ' controlManu ' + str(entry[4]) return temp_last = temp_last + str(entry[4]) temp_display(temp_txt, temp_fhem, 0) return def multiarray_getfield(_array, _field): for field in _array: if field[0] == _field: return field[1] return "" def multiarray_delfield(_array, _field): _out_array = [] for field in _array: if field[0] != _field: _out_array.append(field) return _out_array def fahrplan_display(_attr = []): global fahrplan_attributes, menu_mode menu_mode = "fahrplan" now = datetime.now() fahrplan_baseurl = "http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?" fahrplan_attributes = array([["country", "DEU"], ["rt", "1"], ["GUIREQProduct_0", "on"], # ICE ["GUIREQProduct_1", "on"], # Intercity- und Eurocityzuege ["GUIREQProduct_2", "on"], # Interregio- und Schnellzuege ["GUIREQProduct_3", "on"], # Nahverkehr, sonstige Zuege ["GUIREQProduct_4", "on"], # S-Bahn ["GUIREQProduct_5", "on"], # BUS ["GUIREQProduct_6", "on"], # Schiffe ["GUIREQProduct_7", "on"], # U-Bahn ["GUIREQProduct_8", "on"], # Strassenbahn ["REQ0JourneyStopsSID", ""], ["REQTrain_name", ""], ["REQTrain_name_filterSelf", "1"], ["advancedProductMode", ""], ["boardType", "dep"], # dep = Abfahrt, arr = Ankunft ["date", str(now.day) + "." + str(now.month) + "." + str(now.year)], # Datum ["input", "Hannover Hbf"], # Bahnhof/Haltestelle ["start", "Suchen"], ["time", str(now.hour) + ":" + str(now.minute)]]) # Uhrzeit for val in _attr: for attr in fahrplan_attributes: if val[0] == attr[0]: fahrplan_attributes = multiarray_delfield(fahrplan_attributes, attr[0]) fahrplan_attributes.append(val) break print fahrplan_attributes menu_layout() menu_title(multiarray_getfield(fahrplan_attributes, "input")) fahrplan_query_url = fahrplan_baseurl for attr in fahrplan_attributes: fahrplan_query_url = fahrplan_query_url + str(attr[0]).replace(" ", "%20") + "=" + str(attr[1]).replace(" ", "%20") + "&" fahrplan_query_url = fahrplan_query_url.rstrip("&") fahrplan_query_request = urllib2.Request(fahrplan_query_url) fahrplan_query_request.add_header("User-Agent", "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko") fahrplan_query_opener = urllib2.build_opener() fahrplan_response = lxml.etree.HTML(fahrplan_query_opener.open(fahrplan_query_request).read().replace("ü","ue").replace("ä", "ae").replace("ö", "oe").replace("ß", "ss")) fahrplan_response_suchstring = "" fahrplan_response_felder = array(["time", "train", "route", "platform", "ris"]) for feld in fahrplan_response_felder: fahrplan_response_suchstring = fahrplan_response_suchstring + "@class='" + str(feld) + "' or " fahrplan_response_suchstring = fahrplan_response_suchstring.rstrip(" or ") fahrplan_verbindungen = [] for fahrplan_verbindung in fahrplan_response.xpath("//tr[@id]"): tmp_verbindung = [] tmp_wert0 = lxml.etree.HTML(lxml.etree.tostring(fahrplan_verbindung)) for row in tmp_wert0.xpath("//td[" + str(fahrplan_response_suchstring) + "]"): tmp_wert = lxml.etree.tostring(row).replace("\n","").replace(" ", "") if tmp_wert != "" and re.sub('<[^<]+?>', '', tmp_wert) != "": tmp_wert = lxml.etree.HTML(tmp_wert) for feld in fahrplan_response_felder: if tmp_wert.xpath("//td[@class='" + str(feld) + "']"): if feld == "route": tmp_ziel = lxml.etree.tostring(lxml.etree.HTML(lxml.etree.tostring(tmp_wert)).xpath("//span[@class='bold']")[0]) tmp_route = lxml.etree.tostring(tmp_wert).replace(tmp_ziel, "") tmp_verbindung.append([str(feld), str(re.sub('<[^<]+?>', '', tmp_ziel)) + "-" + str(re.sub('<[^<]+?>', '', tmp_route))]) else: tmp_verbindung.append([str(feld), str(re.sub('<[^<]+?>', '', lxml.etree.tostring(tmp_wert.xpath("//td[@class='" + str(feld) + "']")[0])))]) fahrplan_verbindungen.append(tmp_verbindung) startx = 52 for verbindung in fahrplan_verbindungen: if startx >= (screen_height-50): break font = pygame.font.Font(None,20) btn_font = font.render(multiarray_getfield(verbindung, "time"), 20, color_fg) screen.blit(btn_font, (10, startx)) btn_font = font.render(multiarray_getfield(verbindung, "train"), 20, color_fg) screen.blit(btn_font, (80, startx)) btn_font = font.render(multiarray_getfield(verbindung, "route").split('-')[0], 20, color_fg) screen.blit(btn_font, (180, startx)) btn_font = font.render(multiarray_getfield(verbindung, "plattform"), 20, color_fg) screen.blit(btn_font, (340, startx)) btn_font = font.render(multiarray_getfield(verbindung, "ris"), 20, color_fg) screen.blit(btn_font, (500, startx)) startx += 20 def fahrplan_click(): global menu_mode, fahrplan_attributes click_pos = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1]) if 0 < click_pos[0] < screen_width/2 and screen_height-50 < click_pos[1] < screen_height: #click on back menu_mode = "menu" menu_display(menu_cur) return if screen_width/2 < click_pos[0] < screen_width and screen_height-50 < click_pos[1] < screen_height: #click on next 10 min cur_time = multiarray_getfield(fahrplan_attributes, "time").split(':') cur_time_now = datetime.now() cur_time_now = datetime.strptime(multiarray_getfield(fahrplan_attributes, "time"), "%H:%M") print str(multiarray_getfield(fahrplan_attributes, "time")) fahrplan_attributes = multiarray_delfield(fahrplan_attributes, "time") cur_time_plus = cur_time_now + timedelta(minutes = 10) print str(cur_time_plus) fahrplan_attributes.append(["time", str(cur_time_plus.hour) + ":" + str(cur_time_plus.minute)]) fahrplan_display(fahrplan_attributes) return return def menu_create(): # MAIN MENU menu_txt[0] = "HAUPTMENUE" menu[0] = array([["Alles AUS", "python", "FHEM_all_off()"], ["Alle Steckdosen AUS", "python", "FHEM_Cmd('set Alle_Steckdosen off')"], ["Alle Heizungen AUS", "python", "FHEM_Cmd('set Alle_Heizungen desired-temp off')"], ["Alle Heizungen", "python", "temp_display('Alle Heizungen','Alle_Heizungen',0)"], ["Steckdosen", "python", "menu_display(4)"], ["Heizungen", "python", "menu_display(5)"], ["Abfahrten", "python", "menu_display(6)"], ["Einstellungen", "python", "menu_display(2)"], ["System", "python", "menu_display(1)"]]) # SUB MENU 1 menu_txt[1] = "SYSTEM" menu[1] = array([["/var/log/messages", "python", "cli_run('cat /var/log/messages')"], ["/var/log/dmesg", "python", "cli_run('cat /var/log/dmesg')"], ["ifconfig", "python", "cli_run('ifconfig')"], ["route -n", "python", "cli_run('route -n')"], ["Sync FS", "system", "sync"], ["Reset WLAN", "python", "cli_run('modprobe -r 8192cu && usbreset /dev/bus/usb/001/004 && modprobe 8192cu && ifconfig wlan0 down && ifconfig wlan0 up')"], ["ping gw", "python", "cli_run('ping -c 4 192.168.101.1')"], ["Reboot", "system", "reboot"], ["Shutdown", "system", "shutdown -h now"], ["Exit Python", "python", "sys.exit()"], ["HAUPTMENUE", "python", "menu_display(0)"]]) # SUB MENU 2 menu_txt[2] = "EINSTELLUNGEN" menu[2] = array([["Farben", "python", "menu_display(3)"], ["ZURUECK", "python", "menu_display(0)"]]) # SUB MENU 3 tmp_index = 0 menu_txt[3] = "EINSTELLUNGEN / FARBEN" menu[3] = [] for entry in colors: menu[3].append(array([entry[0], "python", "system_color(" + str(tmp_index) + ")"])) tmp_index += 1 menu[3].append(array(["ZURUECK", "python", "menu_display(2)"])) # SUB MENU 4 menu_txt[4] = "STECKDOSEN" menu[4] = array([["'Schlafzimmer: ' + str(FHEM_Value('SW.Licht_Sw'))", "python", "FHEM_Cmd('set SW.Licht_Sw toggle')"], ["HAUPTMENUE", "python", "menu_display(0)"]]) # SUB MENU 5 menu_txt[5] = "HEIZUNGEN" menu[5] = array([["Bad", "python", "temp_display('Heizung Bad', 'HZ.Bad.Temp', 1)"], ["Wohnzimmer Gross", "python", "temp_display('Heizung Wohnzimmer Gross', 'HZ.Wohnzimmer.Gross.Temp', 1)"], ["Wohnzimmer Klein", "python", "temp_display('Heizung Wohnzimmer Klein', 'HZ.Wohnzimmer.Klein.Temp', 1)"], ["HAUPTMENUE", "python", "menu_display(0)"]]) # SUB MENU 6 menu_txt[6] = "ABFAHRTEN" menu[6] = array([["Hannover Hbf", "python", "fahrplan_display(array([['input','Hannover Hbf']]))"], ["Peine Hbf", "python", "fahrplan_display(array([['input','Peine Hbf']]))"], ["HAUPTMENUE", "python", "menu_display(0)"]]) #set size of the screen system_settings("load") size = width, height = screen_width, screen_height screen = pygame.display.set_mode(size) menu_create() menu_display(0) #thread_refresh = threading.Thread(target=menu_refresh, args=(), kwargs={}) #thread_refresh.start() while 1: for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: print "screen pressed" #for debugging purposes pos = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1]) print pos #for checking if menu_mode == "menu": menu_click() if menu_mode == "cli": cli_click() if menu_mode == "temp": temp_click() if menu_mode == "fahrplan": fahrplan_click() if event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() pygame.display.update()