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))
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()
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)
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)
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))
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)
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)
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)
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)
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)
def stop(self): """ Stop polling loop """ fct.log("Stopping presence thread...") self.is_loop_enabled = False time.sleep(1.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")
def stop(self): """ Stop monitoring thread """ fct.log("Stopping Monitoring thread...") self.is_loop_enabled = False time.sleep(1.0)
def signal_term_handler(signal_, frame_): """ Capture Ctrl+C signal and exit program """ fct.log('Got SIGTERM, exiting...') exit() sys.exit(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()