예제 #1
0
class Server:
    def __init__(self):
        Log.info("Server.init()")

        self.webServer = WebServer()

    def start(self):
        Log.info("Server.start()")

        self.webServer.start()

    def stop(self):
        Log.info("Server.stop()")

        self.webServer.stop()
예제 #2
0
class MicroWifi:
    def __init__(self, ap_name='MicroWifi', ap_password=''):
        self.web_server = WebServer()
        self.wifi_man = WifiManager(ap_name=ap_name, ap_password=ap_password)
        # setup web server routes
        self.setup_routes(self.web_server, self.wifi_man)

    def start(self):
        # try to auto connect
        self.wifi_man.auto_connect()
        if self.wifi_man.is_access_point_mode():
            # start our web server to allow the user to configure the device
            self.web_server.start()

    def stop(self):
        try:
            self.web_server.stop()
        except Exception as exc:
            print('Error stopping {}'.format(exc))

    def setup_routes(self, server, wifi_manager):
        @server.route("/")
        def home(client, request):
            try:
                html = ""
                try:
                    with open('www/index.html') as f:
                        html = f.read()
                except OSError:
                    pass
                server.send_response(client, html)
            except Exception as exc:
                print('Error in home route {}'.format(exc))

        @server.route("/scan")
        def scan(client, request):
            try:
                network_ssids = [
                    network[0] for network in wifi_manager.access_point_scan()
                ]
                payload = {'networks': network_ssids}
                server.send_response(client,
                                     json.dumps(payload),
                                     content_type='application/json')
            except Exception as exc:
                print('Error in scan route {}'.format(exc))

        @server.route("/connect", 'POST')
        def connect(client, request):
            params = server.get_form_data(request)
            ssid = params.get('ssid')
            password = params.get('password')
            # try to connect to the network
            status = wifi_manager.connect(ssid, password)
            payload = {
                'status':
                status,
                'msg':
                'Successfully connected to {}'.format(ssid)
                if status else 'Error connecting to {}'.format(ssid)
            }
            server.send_response(client,
                                 json.dumps(payload),
                                 content_type='application/json')
예제 #3
0
class SecuritySystem:

  SENSOR = 'sensor'
  GLASS_BREAK = 'glass_break'
  CONTROLLER = 'controller'
  SYSTEM = 'system'
  SIREN = 'SIREN'

  ALARM_ON_FILE = './alarm_on'

  node_ids = {1 : {"name": "Controller", "type": CONTROLLER},
      255 : {'name': "OpenZWave System", 'type': SYSTEM},
      3 : {'name': "Living Room Right Window", 'type': SENSOR},
      4 : {'name': "Living Room Middle Window", 'type': SENSOR},
      5 : {'name': "Front Door", 'type': SENSOR},
      7 : {'name': '2nd Bedroom Window', 'type': SENSOR},
      12 : {'name': '2nd Bedroom Glass Break', 'type': GLASS_BREAK},
      13 : {'name': 'Bedroom Glass Break', 'type': GLASS_BREAK},
      14 : {'name': 'Living Room Glass Break', 'type': GLASS_BREAK},
      15 : {'name': 'Living Room Siren', 'type': SIREN},
      17 : {'name': 'Hallway Siren', 'type': SIREN},
      18 : {'name': 'Bedroom Siren', 'type': SIREN},
      19 : {'name': 'Bedroom Window', 'type': SENSOR}
      }

  nodes_in_alarm = set()

  def __init__(self, network):
    self.done = False
    self.network = network
    self.in_alarm_state = False
    self.alarm_on = open(self.ALARM_ON_FILE).readline().rstrip() == 'true'
    if self.alarm_on:
      self.turn_alarm_on()

    self.web_server = WebServer(self)

  def run(self):
    self.web_server_thread = Thread(target=self.web_server.start)
    self.web_server_thread.start()
    try:
      while not self.done:
        time.sleep(1)
    except KeyboardInterrupt as e:
      self.stop()
      raise e

  def stop(self):
    self.done = True
    self.web_server.stop()
    #self.web_server_thread.join()

  def turn_alarm_on(self):
    print "Turning alarm on"
    self.in_alarm_state = False
    self.alarm_on = True
    self.turn_sirens_off()

    open(self.ALARM_ON_FILE, 'w').write('true')

    self.nodes_in_alarm.clear()
    for node_id, node_info in self.node_ids.iteritems():
      if node_info['type'] == self.SENSOR:
        if not self.network.nodes[node_id].get_values_by_command_classes()[48].values()[0].data:
          self.nodes_in_alarm.add(node_id)
      elif node_info['type'] == self.GLASS_BREAK:
        self.nodes_in_alarm.add(node_id)
    print "Nodes in alarm: " + str(self.nodes_in_alarm)


        

  def turn_alarm_off(self):
    print "Turning alarm off"
    self.turn_sirens_off()
    self.in_alarm_state = False
    self.alarm_on = False
    open(self.ALARM_ON_FILE, 'w').write('false')

  def turn_sirens_on(self):
    print "Turning sirens on"
    self.network.nodes[15].set_switch(72057594294386688, True)
    self.network.nodes[17].set_switch(72057594327941120, True)
    self.network.nodes[18].set_switch(72057594344718336, True)
    Timer(30.0, self.turn_sirens_off).start()

  def turn_sirens_off(self):
    print "Turning sirens off"
    self.network.nodes[15].set_switch(72057594294386688, False)
    self.network.nodes[17].set_switch(72057594327941120, False)
    self.network.nodes[18].set_switch(72057594344718336, False)

  def handle_node_event(self, network, node, value):
    if self.alarm_on and not self.in_alarm_state and node.node_id in self.nodes_in_alarm and self.node_ids[node.node_id]['type'] == self.SENSOR and value > 0:
      self.in_alarm_state = True
      self.turn_sirens_on()
      send_mail(self.node_ids[node.node_id]['name'])
    elif self.node_ids[node.node_id]['type'] != self.SENSOR:
      print('Louie signal : Node event : {0}. value: {1}'.format(node, value))

  def handle_scene_event(self, network, node, scene_id):
    if scene_id == 1:
      self.turn_alarm_on()
    elif scene_id == 3:
      self.turn_alarm_off()



###############################################################################################################################################

  def louie_node_update(self, network, node):
      print('Louie signal : Node update : %s.' % node)

  def louie_value_update(self, network, node, value):
    if self.alarm_on and not self.in_alarm_state and node.node_id in self.nodes_in_alarm and self.node_ids[node.node_id]['type'] == self.GLASS_BREAK and value.label=='General' and value.data == 255:
      self.in_alarm_state = True
      self.turn_sirens_on()
      send_mail(self.node_ids[node.node_id]['name'])
    print('Louie signal : Value update : %s.' % value)

  def louie_ctrl_message(self, state, message, network, controller):
      print('Louie signal : Controller message : %s.' % message)