Advertisement
Guest User

Untitled

a guest
Jun 27th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.17 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import *
  3. from tkinter import ttk
  4.  
  5. import socket
  6.  
  7. import threading
  8. from threading import *
  9.  
  10. import json # Import json module
  11. import logging # Import logging module
  12. import random
  13. import time
  14.  
  15.  
  16. logging.basicConfig(level=logging.DEBUG, format='[%(threadName)-10s] %(message)s',)
  17.  
  18.  
  19.  
  20.  
  21. class MyLabel(tk.Label):
  22.  
  23. def __init__(self, root, func, **kwargs):
  24. tk.Label.__init__(self, root, **kwargs)
  25. self.func = func
  26. self.update()
  27.  
  28.  
  29. def update(self):
  30. self.configure(text=str(self.func()))
  31. self.after(500, self.update)
  32.  
  33.  
  34. # To be implemented as an interface
  35. class MyFrame(ttk.Frame):
  36.  
  37. def __init__(self, root):
  38. super().__init__(root)
  39.  
  40.  
  41. def read(self):
  42. pass
  43.  
  44.  
  45. def write(self):
  46. pass
  47.  
  48.  
  49. def update(self):
  50. pass
  51.  
  52.  
  53.  
  54. class MyInfoFrame(MyFrame):
  55.  
  56. def __init__(self, root, func):
  57. super().__init__(root)
  58.  
  59. dictionary = func()
  60. self.func = func
  61. self.values = {}
  62.  
  63. row = 0
  64.  
  65. ###############
  66. print('**************')
  67. print(dictionary)
  68. ##############
  69.  
  70. try:
  71.  
  72. for sensor in dictionary['sensor']:
  73. tk.Label(self, text = sensor['name']).grid(row=row, column=0)
  74. self.values[sensor['name']] = tk.Label(self, text = sensor['value'], relief=SUNKEN, width=5)
  75. self.values[sensor['name']].grid(row=row, column=1)
  76. tk.Label(self, text = sensor['unit']).grid(row=row, column=2)
  77. row = row + 1
  78.  
  79. for handler in dictionary['handler']:
  80. tk.Label(self, text = handler['name']).grid(row=row, column=0)
  81. self.values[handler['name']] = tk.Label(self, text = handler['status'], relief=SUNKEN, width=5)
  82. self.values[handler['name']].grid(row=row,column=1)
  83. row = row + 1
  84.  
  85. except:
  86.  
  87. print('MyInfoFrame.__init__ reading error...')
  88. pass
  89.  
  90.  
  91. self.update()
  92.  
  93.  
  94.  
  95. def update(self):
  96.  
  97. dictionary = self.func()
  98.  
  99. try:
  100.  
  101. #################
  102. print('n **************')
  103. print(dictionary['sensor'])
  104. print('**************n')
  105. #################
  106.  
  107. for sensor in dictionary['sensor']:
  108. self.values[sensor['name']].configure(text=sensor['value'])
  109.  
  110. for handler in dictionary['handler']:
  111. self.values[handler['name']].configure(text=handler['status'])
  112.  
  113. except:
  114.  
  115. #print('MyInfoFrame.update reading error...')
  116. logging.error('MyInfoFrame.update reading error...')
  117. pass
  118.  
  119.  
  120. self.after(500, self.update)
  121.  
  122.  
  123.  
  124. class MySettingsFrame(MyFrame):
  125.  
  126. def __init__(self, root, **kwargs):
  127. super().__init__(root)
  128.  
  129. self.systemOn = False
  130. self.getOutboundMessage = kwargs['func_2']
  131. self.outboundMessage = self.getOutboundMessage()
  132.  
  133. tk.Label(self, text='Encendido').grid(row=0,column=0)
  134. ttk.Radiobutton(self, text='ON', value='ON', command=self.setSystemOn).grid(row=0,column=1)
  135. offButton = ttk.Radiobutton(self, text='OFF', value='OFF', command=self.setSystemOff)
  136. offButton.grid(row=0,column=2)
  137. offButton.invoke()
  138.  
  139.  
  140. self.scaleValue = 15.0
  141. self.scale = ttk.Scale(self, orient=HORIZONTAL, length=200, from_=self.scaleValue, to=35.0, command=self.setScaleValue)
  142. self.scale.set(self.scaleValue)
  143. self.scale.grid(row=2,column=1)
  144.  
  145.  
  146. tk.Label(self, text='Temp. Consigna').grid(row=1,column=0)
  147. MyLabel(self, func=self.getScaleValue, relief=SUNKEN, width=5).grid(row=1,column=1)
  148. tk.Label(self, text='ºC').grid(row=1,column=2)
  149.  
  150. self.update()
  151.  
  152.  
  153. def setSystemOn(self):
  154. self.systemOn = True
  155.  
  156.  
  157. def setSystemOff(self):
  158. self.systemOn = False
  159.  
  160.  
  161. def setScaleValue(self, *args):
  162. self.scaleValue = round(self.scale.get(), 1)
  163.  
  164.  
  165. def getScaleValue(self):
  166. return self.scaleValue
  167.  
  168.  
  169. def write(self):
  170. self.outboundMessage['timestamp'] = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
  171. self.outboundMessage['origin'] = 'front-end'
  172. self.outboundMessage['action'] = 'set'
  173. self.outboundMessage['setup'] = self.scaleValue
  174.  
  175. if self.systemOn:
  176. self.outboundMessage['system'] = 'ON'
  177. else:
  178. self.outboundMessage['system'] = 'OFF'
  179.  
  180.  
  181. def update(self):
  182. self.write()
  183. self.after(500, self.update)
  184.  
  185.  
  186.  
  187. class MyAdvancedFrame(MyFrame):
  188.  
  189. def __init__(self, root, **kwargs):
  190. super().__init__(root)
  191.  
  192. self.tempIntSimulated = False
  193. self.tempExtSimulated = False
  194.  
  195. self.getInboundMessage = kwargs['func_1']
  196. self.getOutboundMessage = kwargs['func_2']
  197.  
  198. self.tempInt = self.getInboundMessage()['sensor'][0]['value']
  199. self.tempExt = self.getInboundMessage()['sensor'][1]['value']
  200.  
  201. self.bridgeVar = StringVar()
  202. tk.Label(self, text='Marcha/Paro').grid(row=0,column=0)
  203. self.bridge_button_on = ttk.Radiobutton(self, text='ON', value='ON', variable=self.bridgeVar, command=self.setBridge)
  204. self.bridge_button_on.grid(row=0,column=1)
  205. self.bridge_button_off = ttk.Radiobutton(self, text='OFF', value='OFF', variable=self.bridgeVar, command=self.setBridge)
  206. self.bridge_button_off.grid(row=0,column=2)
  207. self.bridge_button_auto = ttk.Radiobutton(self, text='AUTO', value='AUTO', variable=self.bridgeVar, command=self.setBridge)
  208. self.bridge_button_auto.grid(row=0,column=3)
  209. self.bridge_button_auto.invoke()
  210.  
  211.  
  212. tk.Label(self, text='Temp. Interior').grid(row=1,column=0)
  213. self.t_int_label = MyLabel(self, func=self.getTempInt, relief=SUNKEN, width=5)
  214. self.t_int_label.grid(row=1,column=1)
  215.  
  216. self.tempInt = StringVar()
  217. self.temp_int_entry = ttk.Entry(self, textvariable=self.tempInt, width=5)
  218. self.temp_int_entry.grid(row=1,column=2)
  219. #temp_int_entry.config(state='disabled')
  220. self.t_int_checkbutton = tk.Checkbutton(self, text='Simulado', command=self.setTempIntSimulated)
  221. self.t_int_checkbutton.grid(row=1,column=3)
  222.  
  223.  
  224. tk.Label(self, text='Temp. Exterior').grid(row=2,column=0)
  225. MyLabel(self, func=self.getTempExt, relief=SUNKEN, width=5).grid(row=2,column=1)
  226.  
  227. self.tempExt = StringVar()
  228. temp_ext_entry = ttk.Entry(self, textvariable=self.tempExt, width=5)
  229. temp_ext_entry.grid(row=2,column=2)
  230. self.t_ext_checkbutton = tk.Checkbutton(self, text='Simulado', command=self.setTempExtSimulated)
  231. self.t_ext_checkbutton.grid(row=2,column=3)
  232.  
  233. self.update()
  234.  
  235.  
  236.  
  237. def setBridge(self):
  238.  
  239. outboundMessage = self.getOutboundMessage()
  240. outboundMessage['forced']['bridge'] = self.bridgeVar.get()
  241.  
  242.  
  243.  
  244. def setTempIntSimulated(self):
  245.  
  246. if self.tempIntSimulated:
  247. self.tempIntSimulated = False
  248. self.temp_int_entry.config(state='normal')
  249. #self.temp_int_entry.delete(0, END)
  250. outboundMessage = self.getOutboundMessage()
  251. outboundMessage['forced']['int'] = ''
  252.  
  253. else:
  254. self.tempIntSimulated = True
  255. outboundMessage = self.getOutboundMessage()
  256. outboundMessage['forced']['int'] = self.tempInt.get()
  257. self.temp_int_entry.config(state='disabled')
  258.  
  259.  
  260.  
  261.  
  262. def setTempExtSimulated(self):
  263.  
  264. if self.tempExtSimulated:
  265. self.tempExtSimulated = False
  266.  
  267. else:
  268. self.tempExtSimulated = True
  269. outboundMessage = self.getOutboundMessage()
  270. outboundMessage['forced']['ext'] = self.tempExt.get()
  271.  
  272.  
  273. def update(self):
  274.  
  275. self.readTempInt()
  276. self.readTempExt()
  277.  
  278. self.after(500, self.update)
  279.  
  280.  
  281.  
  282. def readTempInt(self):
  283.  
  284. inboundMessage = self.getInboundMessage()
  285.  
  286. try:
  287. self.tempInt = inboundMessage['sensor'][0]['value']
  288.  
  289. except:
  290. pass
  291.  
  292.  
  293.  
  294. def readTempExt(self):
  295.  
  296. inboundMessage = self.getInboundMessage()
  297.  
  298. try:
  299. self.tempExt = inboundMessage['sensor'][1]['value']
  300.  
  301. except:
  302. pass
  303.  
  304.  
  305.  
  306. def getTempInt(self):
  307. return self.tempInt
  308.  
  309.  
  310.  
  311. def getTempExt(self):
  312. return self.tempExt
  313.  
  314.  
  315.  
  316. class Application(ttk.Frame): #, socket.socket):
  317.  
  318. def __init__(self, main_window, targetServer, bufferSizeMsg):
  319.  
  320. ttk.Frame.__init__(self, main_window) # Iniciando clase como Frame
  321. #socket.socket.__init__(self, socket.AF_INET, socket.SOCK_STREAM) # Iniciando clase como socket
  322. self.socket = None
  323.  
  324. # Parametros de comunicacion con el servidor
  325. self.targetServer = targetServer
  326. self.bufferSizeMsg = bufferSizeMsg
  327.  
  328. main_window.title("GRUPO A3I - Panel de control")
  329.  
  330. # Mensaje entrante desde el backend
  331. self.inboundMessage = {}
  332.  
  333. # Mensage saliente. Settea consignas y valores forzados. Se envía al backend
  334. self.outboundMessage = {'origin':'front-end', 'action':'none', 'forced':{'bridge':'AUTO','int':'','ext':''}}
  335.  
  336. # Threading la comunicación como cliente con el backend (servidor)
  337. '''
  338. self.thread = threading.Thread(target=self.communicate)
  339. self.thread.daemon = True
  340. self.thread.start()
  341. '''
  342. self.createCommThread()
  343. while self.inboundMessage == {}:
  344. pass
  345. #time.sleep(1)
  346. ############
  347.  
  348. #self.thread = threading.Thread(target=self.communicate)
  349. #self.thread.daemon = False #True
  350. #self.thread.start()
  351.  
  352. #self.thread.join()
  353. #############
  354.  
  355. # Crear el panel de pestañas.
  356. self.notebook = ttk.Notebook(self)
  357.  
  358. # Crear el contenido de cada una de las pestañas.
  359. self.frame_info = MyInfoFrame(self, func=self.getInboundMessage)
  360. self.frame_settings = MySettingsFrame(self, func_2=self.getOutboundMessage)
  361. self.frame_advanced = MyAdvancedFrame(self, func_1=self.getInboundMessage, func_2=self.getOutboundMessage)
  362.  
  363. # Añadirlas al panel con su respectivo texto.
  364. self.notebook.add(self.frame_info, text="Info", padding=20)
  365. self.notebook.add(self.frame_settings, text="Settings", padding=20)
  366. self.notebook.add(self.frame_advanced, text="Avanzado", padding=20)
  367.  
  368. # Margenes
  369. self.notebook.pack(padx=10, pady=10)
  370. self.pack()
  371.  
  372.  
  373. def __del__(self):
  374. if self.socket != None:
  375. self.socket.close()
  376.  
  377.  
  378. def getInboundMessage(self):
  379. return self.inboundMessage
  380.  
  381.  
  382. def getOutboundMessage(self):
  383. return self.outboundMessage
  384.  
  385.  
  386. def setOutboundMessage(self, outboundMessage):
  387. self.outboundMessage = outboundMessage
  388.  
  389.  
  390. def createCommThread(self):
  391. self.thread = threading.Thread(target=self.communicate)
  392. self.thread.daemon = False #True
  393. self.thread.start()
  394. #self.thread.join()
  395.  
  396.  
  397.  
  398. def communicate(self):
  399.  
  400. try:
  401.  
  402. self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  403.  
  404. logging.debug('Connecting to %s', self.targetServer)
  405. self.socket.connect(self.targetServer)
  406.  
  407.  
  408. logging.debug('Sending message %s', self.outboundMessage) self.socket.sendall(json.dumps(self.outboundMessage).encode('utf-8'))
  409.  
  410.  
  411. inboundMessage = self.socket.recv(self.bufferSizeMsg)
  412.  
  413. logging.debug('Inbound Message %s', inboundMessage)
  414.  
  415. self.inboundMessage = json.loads(inboundMessage)
  416.  
  417. #self.close()
  418.  
  419.  
  420. except socket.timeout as errorTimeoutMsg:
  421. time.sleep(2)
  422. print(errorTimeoutMsg)
  423. #input("Socket Timeout...")
  424.  
  425.  
  426. except socket.gaierror as errorGaiMsg:
  427. time.sleep(2)
  428. print(errorGaiMsg)
  429. #input("Socket Gaierror")
  430.  
  431.  
  432. except socket.error as errorMsg:
  433. time.sleep(2)
  434. print(errorMsg)
  435. #input("Socket Error...")
  436.  
  437. finally:
  438. self.socket.close()
  439. #self.after(2000, self.communicate)
  440. self.after(500, self.createCommThread)
  441.  
  442.  
  443. #self.after(2000, self.communicate)
  444.  
  445.  
  446.  
  447.  
  448. main_window = tk.Tk()
  449. targetServer = ('raspberrypi.local', 5005)
  450. bufferSizeMsg = 2048
  451.  
  452. app = Application(main_window, targetServer, bufferSizeMsg)
  453. app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement