Ejemplo n.º 1
0
 def send(self, phone, msg):
     """ Send SMS message to phone number """
     try:
         self.write('AT+CMGS="' + str(phone) + '"')
         self.write(str(msg) + "\x1A")
     except Exception as ex:
         fct.log("ERROR send Exception: " + str(ex))
Ejemplo n.º 2
0
 def stop(self):
     """ Stop polling loop """
     fct.log("Stopping " + self.node_name + " thread...")
     self.is_loop_enabled = False
     time.sleep(1.0)
     fct.log("Closing " + self.node_name + " node...")
     if self.is_open() is True:
         self.fd_port.close()
Ejemplo n.º 3
0
 def close(self):
     """ Close the serial port """
     try:
         if self.is_open() is True:
             fct.log("Closing " + self.node_name)
             self.fd_port.close()
     except Exception as ex:
         fct.log_exception(ex)
Ejemplo n.º 4
0
 def run(self):
     """ Cyclic execution to poll for received characters """
     loop_nb = 1
     while self.is_loop_enabled is True:
         try:
             #fct.log("DEBUG: " + self.node_name + " loop " + str(loop_nb))
             if self.is_open() is False:
                 self.open()
                 time.sleep(1.0)
             if self.is_open() is True:
                 line = ""
                 cserial = " "
                 read_iter_ = 0
                 while (len(cserial) > 0) and (self.is_loop_enabled is
                                               True):
                     try:
                         cserial = self.fd_port.read(1)
                         if cserial is None:
                             cserial = ""
                         else:
                             #if len(cserial) > 0:
                             #    print(cserial.hex(), end='')
                             cserial = cserial.decode(encoding='utf-8',
                                                      errors='ignore')
                         if len(cserial) > 0:
                             read_iter_ = read_iter_ + 1
                             if ord(cserial) == 0:
                                 cserial = ""
                             print(cserial, end='')
                         else:
                             cserial = ""
                         if (self.line != "") and (cserial == "\n"
                                                   or cserial == "\r"):
                             line = self.line
                             self.line = ""
                             # fct.log("DEBUG New line create=" + line)
                             break
                         else:
                             if (cserial != "\n") and (cserial != "\r"):
                                 self.line = self.line + cserial
                     except Exception as ex:
                         self.line = ""
                         cserial = ""
                         fct.log_exception(
                             ex,
                             msg="ERROR while decoding data on " +
                             self.node_name)
                         self.close()
                 if read_iter_ > self.read_iter:
                     self.read_iter = read_iter_
                 if line != "":
                     line_array = line.split(" ")
                     fct.log("DEBUG: line_array=" + str(line_array))
         except Exception as ex:
             fct.log_exception(ex)
             self.close()
         loop_nb += 1
         time.sleep(0.001)
Ejemplo n.º 5
0
 def write(self, msg):
     """ Write the serial port if already open """
     try:
         if self.is_open() is True:
             self.fd_port.write((msg + "\r\n").encode('utf-8'))
             fct.log("Write serial to node " + self.node_name + ": " + msg)
             self.fd_port.flush()
     except Exception as ex:
         fct.log("ERROR write_serial Exception: " + str(ex))
Ejemplo n.º 6
0
 def open(self):
     """ Open the serial port """
     try:
         fct.log("Opening " + self.node_name)
         self.fd_port = open(self.port, "rb+", buffering=0)
         fd_port = self.fd_port.fileno()
         flag = fcntl.fcntl(fd_port, fcntl.F_GETFL)
         fcntl.fcntl(fd_port, fcntl.F_SETFL, flag | os.O_NONBLOCK)
         self.open_cnt += 1
     except Exception as ex:
         fct.log_exception(ex)
Ejemplo n.º 7
0
def exit():
    """ Stop HTTP server, stop serial threads and monitoring thread """
    global http2serial
    global monitoring
    global presence
    fct.log("Stopping HTTP server")
    http2serial.server_close()
    for key_node, value_node in settings.node_list.items():
        value_node.stop()
    monitoring.stop()
    presence.stop()
    settings.rts.stop()
    sms.stop()
    settings.ups.stop()
    time.sleep(2.0)
Ejemplo n.º 8
0
 def open(self):
     """ Open the serial port """
     try:
         fct.log("Opening " + self.node_name)
         self.fd_port = open(self.port, "rb+", buffering=0)
         fd_port = self.fd_port.fileno()
         flag = fcntl.fcntl(fd_port, fcntl.F_GETFL)
         fcntl.fcntl(fd_port, fcntl.F_SETFL, flag | os.O_NONBLOCK)
         self.write("ATZ")
         time.sleep(0.1)
         self.write("ATE0")
         time.sleep(0.1)
         self.write("AT+CFUN=1")
         time.sleep(0.1)
         self.write("AT+CMGF=1")
     except Exception as ex:
         fct.log_exception(ex)
Ejemplo n.º 9
0
 def run(self):
     """ Cyclic execution to poll for received characters """
     loop_nb = 1
     while self.is_loop_enabled is True:
         try:
             #fct.log("DEBUG: " + self.node_name + " loop " + str(loop_nb))
             if self.is_open() is False:
                 self.open()
                 time.sleep(1.0)
             if self.is_open() is True:
                 line = ""
                 cserial = " "
                 read_iter_ = 0
                 while (len(cserial) > 0) and (self.is_loop_enabled is True):
                     try:
                         cserial = self.fd_port.read(1)
                         if cserial is None:
                             cserial = ""
                         else:
                             cserial = cserial.decode(encoding='utf-8', errors='ignore')
                         if len(cserial) > 0:
                             read_iter_ = read_iter_ + 1
                             if ord(cserial) == 0:
                                 cserial = ""
                         else:
                             cserial = ""
                         if (self.line != "") and (cserial == "\n" or cserial == "\r"):
                             line = self.line
                             self.line = ""
                             # fct.log("DEBUG New line create=" + line)
                             break
                         else:
                             if (cserial != "\n") and (cserial != "\r"):
                                 self.line = self.line + cserial
                     except Exception as ex:
                         self.line = ""
                         cserial = ""
                         fct.log_exception(ex, msg="ERROR while decoding data on " + self.node_name)
                         self.close()
                 if read_iter_ > self.read_iter:
                     self.read_iter = read_iter_
                 if line != "":
                     line_array = line.split(" ")
                     # fct.log("DEBUG: line_array=" + str(line_array))
                     if len(line_array) > 2:
                         node = line_array[0]
                         cmd = line_array[1]
                         if node in settings.acq:
                             if cmd in settings.acq[node]:
                                 arg_map = line_array[2:]
                                 if 'fct' in settings.acq[node][cmd]:
                                     try:
                                         fct_to_run = getattr(fct, settings.acq[node][cmd]['fct'])
                                         fct_to_run(node, cmd, arg_map)
                                     except Exception as ex:
                                         fct.log_exception(ex)
                                 else:
                                     if len(arg_map) == 2:
                                         if arg_map[0] in settings.acq[node][cmd]:
                                             settings.acq[node][cmd][arg_map[0]] = type(settings.acq[node][cmd][arg_map[0]])(arg_map[1])
                                         else:
                                             fct.log("ERROR: " + arg_map[0] + " is not in cmd " + node + "." + cmd)
                                     else:
                                         if len(arg_map) == 3:
                                             if arg_map[0] in settings.acq[node][cmd]:
                                                 if arg_map[1] in settings.acq[node][cmd][arg_map[0]]:
                                                     settings.acq[node][cmd][arg_map[0]][arg_map[1]] = type(settings.acq[node][cmd][arg_map[0]][arg_map[1]])(arg_map[2])
                                                 else:
                                                     fct.log("ERROR: " + arg_map[1] + " is not in cmd " + node + "." + cmd + "." + arg_map[0])
                                             else:
                                                 fct.log("ERROR: " + arg_map[0] + " is not in cmd " + node + "." + cmd)
                                         else:
                                             fct.log("ERROR: incorrect number of arguments in '" + str(arg_map) + "'. Got " + str(len(arg_map)) + ", expected 2")
                                 self.cmd_rx_cnt += 1
                             else:
                                 fct.log("ERROR: " + cmd + " is not in node " + node)
                         else:
                             fct.log("ERROR: node '" + node + "' is unknown")
                     else:
                         fct.log("ERROR: line '" + line + "' is too short")
                 if loop_nb % 500 == 0:
                     self.write("ping get")
                     # fct.log("DEBUG PING to node " + node)
                     self.ping_tx_cnt += 1
         except Exception as ex:
             fct.log_exception(ex)
             self.close()
         self.timeout_check()
         loop_nb += 1
         if loop_nb >= 1000000:
             loop_nb = 0
         time.sleep(0.001)
Ejemplo n.º 10
0
 def run(self):
     """ Cyclic execution to poll for received characters """
     loop_nb = 1
     while self.is_loop_enabled is True:
         try:
             #fct.log("DEBUG: " + self.node_name + " loop " + str(loop_nb))
             if self.is_open() is False:
                 self.open()
                 time.sleep(1.0)
             if self.is_open() is True:
                 line = ""
                 cserial = " "
                 read_iter_ = 0
                 while (len(cserial) > 0) and (self.is_loop_enabled is
                                               True):
                     try:
                         cserial = self.fd_port.read(1)
                         if cserial is None:
                             cserial = ""
                         else:
                             cserial = cserial.decode(encoding='utf-8',
                                                      errors='ignore')
                         if len(cserial) > 0:
                             read_iter_ = read_iter_ + 1
                             if ord(cserial) == 0:
                                 cserial = ""
                         else:
                             cserial = ""
                         if (self.line != "") and (cserial == "\n"
                                                   or cserial == "\r"):
                             line = self.line
                             self.line = ""
                             # fct.log("DEBUG New line create=" + line)
                             break
                         else:
                             if (cserial != "\n") and (cserial != "\r"):
                                 self.line = self.line + cserial
                     except Exception as ex:
                         self.line = ""
                         cserial = ""
                         fct.log_exception(
                             ex,
                             msg="ERROR while decoding data on " +
                             self.node_name)
                         self.close()
                 if read_iter_ > self.read_iter:
                     self.read_iter = read_iter_
                 if line != "":
                     if line.startswith("ZIA33"):
                         try:
                             resp = json.loads(line[5:])
                             #fct.log("DEBUG: line_array=" + str(json.dumps(resp)))
                             if resp["frame"]["header"][
                                     "protocolMeaning"] == "CHACON":
                                 if resp["frame"]["infos"][
                                         "id"] == "1060074882":
                                     if resp["frame"]["infos"][
                                             "subTypeMeaning"] == "ON":
                                         #fct.log("DEBUG: CHACON cmd ON")
                                         fct.http_request(
                                             'http://localhost:' +
                                             str(settings.HTTPD_PORT) +
                                             '/api/ext/waterMainRelay/set/1'
                                         )
                                         fct.http_request(
                                             'http://localhost:' +
                                             str(settings.HTTPD_PORT) +
                                             '/api/ext/waterGardenRelay/set/1'
                                         )
                                     elif resp["frame"]["infos"][
                                             "subTypeMeaning"] == "OFF":
                                         #fct.log("DEBUG: CHACON cmd OFF")
                                         fct.http_request(
                                             'http://localhost:' +
                                             str(settings.HTTPD_PORT) +
                                             '/api/ext/waterMainRelay/set/0'
                                         )
                                         fct.http_request(
                                             'http://localhost:' +
                                             str(settings.HTTPD_PORT) +
                                             '/api/ext/waterGardenRelay/set/0'
                                         )
                                     else:
                                         fct.log(
                                             "WARNING: CHACON type unknown")
                                 else:
                                     fct.log("WARNING: CHACON id unknown")
                             else:
                                 fct.log(
                                     "WARNING: RfPlayer protocol unknown")
                         except Exception as ex:
                             fct.log_exception(ex)
                     else:
                         fct.log(
                             "WARNING: RfPlayer line does not start with 'ZIA33': "
                             + str(line))
         except Exception as ex:
             fct.log_exception(ex)
             self.close()
         loop_nb += 1
         time.sleep(0.001)
Ejemplo n.º 11
0
 def stop(self):
     """ Stop polling loop """
     fct.log("Stopping presence thread...")
     self.is_loop_enabled = False
     time.sleep(1.0)
Ejemplo n.º 12
0
 def do_GET(self):
     """ Callback on HTTP GET request """
     url_tokens = self.path.split('/')
     url_tokens_len = len(url_tokens)
     fct.log(str(url_tokens))
     if url_tokens_len > 1:
         api = url_tokens[1]
         if api == "api":
             if url_tokens_len > 2:
                 node = url_tokens[2]
                 if node in settings.node_list:
                     if url_tokens_len > 3:
                         cmd = url_tokens[3]
                         if url_tokens_len > 4:
                             for token in url_tokens[4:]:
                                 cmd = cmd + " " + token
                         settings.node_list[node].write(cmd)
                         self.ok200(node + " " + cmd)
                     else:
                         self.error404("No command for node: " + node)
                 elif node == "lbgate":
                     if url_tokens_len > 3:
                         if url_tokens[3] == "alarm":
                             if url_tokens_len > 4:
                                 if url_tokens[4] == "enable":
                                     alarm.enable()
                                     self.ok200("Alarm is enabled: ")
                                 elif url_tokens[4] == "disable":
                                     alarm.disable()
                                     self.ok200("Alarm is disabled")
                                 else:
                                     try:
                                         token_nbs = range(
                                             5, url_tokens_len)
                                         node_point = settings.alarm
                                         for token_index in token_nbs:
                                             node_point = node_point[
                                                 url_tokens[token_index]]
                                         self.ok200(
                                             json.dumps(node_point,
                                                        sort_keys=True,
                                                        indent=4),
                                             content_type="application/json"
                                         )
                                     except:
                                         self.error404(
                                             "Bad path in 'alarm'")
                             else:
                                 self.ok200(
                                     "Alarm is = " +
                                     str(settings.alarm['is_enabled']) +
                                     "\nTrigger = " +
                                     str(settings.alarm['triggered']) +
                                     "\nTimer = " +
                                     str(settings.alarm['timeout']) +
                                     "\nStop = " +
                                     str(settings.alarm['stopped']))
                         elif url_tokens[3] == "presence":
                             if url_tokens_len > 4:
                                 if url_tokens[4] == "enable":
                                     settings.presence_is_enabled = True
                                     self.ok200("Presence is enabled")
                                 elif url_tokens[4] == "disable":
                                     settings.presence_is_enabled = False
                                     self.ok200("Presence is disabled")
                                 else:
                                     self.ok200(
                                         "Presence is enabled = " +
                                         str(settings.presence_is_enabled))
                             else:
                                 self.ok200(
                                     "Presence is enabled = " +
                                     str(settings.presence_is_enabled))
                         elif url_tokens[3] == "move":
                             if url_tokens_len > 4:
                                 if url_tokens[4] == "enable":
                                     settings.move_is_enabled = True
                                     self.ok200("Move is enabled")
                                 elif url_tokens[4] == "disable":
                                     settings.move_is_enabled = False
                                     self.ok200("Move is disabled")
                                 else:
                                     self.ok200(
                                         "Move is enabled = " +
                                         str(settings.move_is_enabled) +
                                         "\nMove = ")
                             else:
                                 self.ok200("Move is enabled = " +
                                            str(settings.move_is_enabled) +
                                            "\nMove = ")
                         elif url_tokens[3] == "node":
                             self.ok200(str(settings.node_list))
                         elif url_tokens[3] == "json":
                             try:
                                 token_nbs = range(4, url_tokens_len)
                                 node_point = settings.acq
                                 for token_index in token_nbs:
                                     node_point = node_point[
                                         url_tokens[token_index]]
                                 self.ok200(json.dumps(node_point,
                                                       sort_keys=True,
                                                       indent=4),
                                            content_type="application/json")
                             except:
                                 self.error404("Bad path in 'acq'")
                         elif url_tokens[3] == "sendsms":
                             if url_tokens_len > 4:
                                 self.ok200("Sending SMS: " + url_tokens[4])
                                 fct.send_sms(url_tokens[4])
                         else:
                             self.error404("Bad command for node " + node +
                                           ": " + url_tokens[3])
                     else:
                         self.ok200(settings.log_msg)
                 elif node == "rts":
                     if url_tokens_len > 3:
                         cmd = url_tokens[3]
                         if url_tokens_len > 4:
                             for token in url_tokens[4:]:
                                 cmd = cmd + " " + token
                         settings.rts.write(cmd)
                         self.ok200(node + " " + cmd)
                     else:
                         self.error404("No command for node: " + node)
                 elif node == "sms":
                     if url_tokens_len > 3:
                         cmd = url_tokens[3]
                         if url_tokens_len > 4:
                             for token in url_tokens[4:]:
                                 cmd = cmd + " " + token
                         sms.write(cmd)
                         self.ok200(node + " " + cmd)
                     else:
                         self.error404("No command for node: " + node)
                 else:
                     self.error404("Bad node: " + node)
             else:
                 self.error404("Command too short: " + api)
         else:
             self.error404("Bad location: " + api)
     else:
         self.error404("Url too short")
Ejemplo n.º 13
0
 def stop(self):
     """ Stop monitoring thread """
     fct.log("Stopping Monitoring thread...")
     self.is_loop_enabled = False
     time.sleep(1.0)
Ejemplo n.º 14
0
def signal_term_handler(signal_, frame_):
    """ Capture Ctrl+C signal and exit program """
    fct.log('Got SIGTERM, exiting...')
    exit()
    sys.exit(0)
Ejemplo n.º 15
0
        value_node.stop()
    monitoring.stop()
    presence.stop()
    settings.rts.stop()
    sms.stop()
    settings.ups.stop()
    time.sleep(2.0)


def signal_term_handler(signal_, frame_):
    """ Capture Ctrl+C signal and exit program """
    fct.log('Got SIGTERM, exiting...')
    exit()
    sys.exit(0)


if __name__ == '__main__':
    signal.signal(signal.SIGTERM, signal_term_handler)
    #settings.ups.start()
    #sms.start()
    settings.rts.start()
    presence.start()
    monitoring.start()
    for key, value in settings.node_list.items():
        value.start()
    fct.log("Serving at port " + str(settings.HTTPD_PORT))
    try:
        http2serial.serve_forever()
    except KeyboardInterrupt:
        exit()