Web based Jalousie control.

simple_server.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. '''
  2. Created on 24.06.2014
  3. @author: volkma_s
  4. '''
  5. import os, sys
  6. import urllib
  7. sys.path.append(os.path.join(os.path.dirname(__file__), "./../"))
  8. #import daemon
  9. from http.server import BaseHTTPRequestHandler, HTTPServer
  10. from socketserver import ThreadingMixIn
  11. import time
  12. from urllib.parse import urlparse
  13. from utils.web import handle_file_request, get_my_ip
  14. from mc_control.mc_statemachine import mc_state_machine, mc_event
  15. from gpiozero import LED
  16. from gpiozero.pins.pigpio import PiGPIOFactory
  17. HOST_NAME = '' #'localhost'
  18. PORT_NUMBER = 8000
  19. def HandleQeury(query):
  20. global sm
  21. print("HandleQuery query={}".format(query))
  22. query_components = urllib.parse.parse_qs(query)
  23. port = int(query_components['port'][0])
  24. action = query_components['action'][0]
  25. if action == 'up':
  26. print("UP Request")
  27. sm[port].MailBox.put(mc_event.Up)
  28. elif action == 'stop':
  29. print("Stop Request")
  30. sm[port].MailBox.put(mc_event.Stop)
  31. elif action == 'down':
  32. print("Down Request")
  33. sm[port].MailBox.put(mc_event.Down)
  34. else:
  35. print("Unknown query: {}".format(query))
  36. def GetState():
  37. global sm
  38. state = "{}".format(sm[0].position.position)
  39. return state
  40. def GetStates():
  41. global sm
  42. state = "{},{},{},{}".format( sm[0].position.position,
  43. sm[1].position.position,
  44. sm[2].position.position,
  45. sm[3].position.position )
  46. return state
  47. class myhandler(BaseHTTPRequestHandler):
  48. def do_HEAD(self):
  49. self.send_response(200)
  50. self.send_header('Content-type','text/html')
  51. self.end_headers()
  52. def do_GET(self):
  53. parsed_path = urlparse(self.path)
  54. path = parsed_path[2]
  55. query = parsed_path[4]
  56. if(query):
  57. HandleQeury(query)
  58. print("do_GET path=" + path)
  59. if(path.endswith('.html')):
  60. self.send_response(200)
  61. self.send_header('Content-type','text/html')
  62. self.end_headers()
  63. data = handle_file_request(path,'utf-8')
  64. elif(path.endswith('.css')):
  65. self.send_response(200)
  66. self.send_header('Content-type','text/css')
  67. self.end_headers()
  68. data = handle_file_request(path,'utf-8')
  69. elif(path.endswith('.js')):
  70. self.send_response(200)
  71. self.send_header('Content-type','text/javascript')
  72. self.end_headers()
  73. data = handle_file_request(path,'utf-8')
  74. elif(path.endswith('cmd')):
  75. self.send_response(200)
  76. self.send_header('Content-type','text/html')
  77. self.end_headers()
  78. out = GetStates()
  79. data = out.encode('utf-8')
  80. else:
  81. self.send_response(200)
  82. self.send_header('Content-type','text/html')
  83. self.end_headers()
  84. data = handle_file_request('index.html','utf-8')
  85. self.wfile.write(data)
  86. return
  87. def do_POST(self):
  88. self.send_response(200)
  89. self.send_header('Content-type','text/html')
  90. self.end_headers()
  91. parsed_path = urlparse(self.path)
  92. path = parsed_path[2]
  93. query = parsed_path[4]
  94. if(query):
  95. HandleQeury(query)
  96. class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
  97. ''' '''
  98. def StartStateMachines(factory):
  99. global sm
  100. sm = list()
  101. up_1 = LED(16, pin_factory=factory)
  102. down_1 = LED(12, pin_factory=factory)
  103. up_2 = LED(6, pin_factory=factory)
  104. down_2 = LED(20, pin_factory=factory)
  105. up_3 = LED(13, pin_factory=factory)
  106. down_3 = LED(21, pin_factory=factory)
  107. up_4 = LED(19, pin_factory=factory)
  108. down_4 = LED(26, pin_factory=factory)
  109. sm.append( mc_state_machine(up_1, down_1))
  110. sm.append( mc_state_machine(up_2, down_2))
  111. sm.append( mc_state_machine(up_3, down_3))
  112. sm.append( mc_state_machine(up_4, down_4))
  113. def CloseStateMachines():
  114. global sm
  115. sm[0].Stop()
  116. sm[1].Stop()
  117. sm[2].Stop()
  118. sm[3].Stop()
  119. if __name__ == '__main__':
  120. global sm
  121. factory = PiGPIOFactory(host='jalousiecontrol')
  122. StartStateMachines(factory)
  123. httpd = ThreadedHTTPServer((HOST_NAME,PORT_NUMBER),myhandler)
  124. print('{} - http Server started - http://{}:{}'.format(time.asctime(), get_my_ip(), PORT_NUMBER))
  125. try:
  126. httpd.serve_forever()
  127. except KeyboardInterrupt:
  128. print("end")
  129. pass
  130. CloseStateMachines()
  131. print('{}http Server stopped '.format(time.asctime()))
  132. import unittest
  133. class WebServer_UnitTest(unittest.TestCase):
  134. def setUp(self):
  135. StartStateMachines()
  136. def tearDown(self):
  137. CloseStateMachines()
  138. def test_HandleQuery(self):
  139. # state changed from idle over move down to down
  140. HandleQeury('action=up&port=0')
  141. HandleQeury('action=down&port=0')
  142. HandleQeury('action=stop&port=0')
  143. HandleQeury('action=up&port=1')
  144. HandleQeury('action=down&port=1')
  145. HandleQeury('action=stop&port=1')
  146. HandleQeury('action=up&port=2')
  147. HandleQeury('action=down&port=2')
  148. HandleQeury('action=stop&port=2')
  149. HandleQeury('action=up&port=3')
  150. HandleQeury('action=down&port=3')
  151. HandleQeury('action=stop&port=3')
  152. pass