def lockDoor(): logger.debug("Lock the door") try: r = requests.post(config.get("danalock", "openhab_lock_item"), 'ON') logger.debug(str(r)) except: logger.error("Danalock not available") sendMail("Danalock not available!: " + str(config.get("danalock", "openhab_lock_item")))
def openDoor(): # open the door logger.debug("Opening the door") payload = {"command": "OFF"} try: r = requests.post(config.get("danalock", "openhab_lock_item"), 'OFF') logger.debug(str(r)) except: logger.error("Danalock not available") sendMail("Danalock not available!: " + str(config.get("danalock", "openhab_lock_item")))
def sendMail(content, files=None): if str(config.get("mail", "smpt_use")) != "true": return s = smtplib.SMTP(host=config.get("mail", "smpt_host"), port=config.get("mail", "smtp_port")) s.starttls() logger.debug("Log in to " + config.get("mail", "smpt_host") + " for sending e-mail") try: s.login(config.get("mail", "smtp_user"), config.get("mail", "smtp_pass")) except smtplib.SMTPAuthenticationError: logger.error("Error in Login to SMTP Server") return msg = MIMEMultipart() # create a message msg['From'] = config.get("mail", "mail_from") msg['To'] = config.get("mail", "mail_receiver") msg['Subject'] = config.get("mail", "mail_subject") # add in the message body msg.attach(MIMEText(content, 'plain')) for f in files or []: with open(f, "rb") as fil: part = MIMEApplication( fil.read(), Name=basename(f) ) # After the file is closed logger.debug("Adding file to e-mail " + basename(f)) part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f) msg.attach(part) # send the message via the server set up earlier. s.send_message(msg) del msg
def downloadImage(): # request picture from API and save it door_bird_url = config.get("doorbird", "door_bird_url") currentdate = datetime.datetime.now().timestamp() filepath = config.get("data", "data_path_unknown_faces") filename = filepath + str(currentdate) + '.jpg' logger.debug("sending http request to: " + door_bird_url + " and saving to " + filename) try: urllib.request.URLopener().retrieve(door_bird_url, filename) return filename except: sendMail("Doorbird not available!: " + str(door_bird_url)) logger.debug("Doorbird not available: ") return "ERROR"
def waitForEventAndDownloadImage(): # bind socket udp_address = config.get("doorbird", "udp_ip_address") udp_port = config.get("doorbird", "udp_port") server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_sock.bind((udp_address, int(udp_port))) server_sock.settimeout(int(config.get("doorbird", "keep_alive_timeout"))) logger.info("UDP service started on address: {} and port: {}".format( udp_address, udp_port)) old_message = "" old_event = "" while True: try: data = server_sock.recvfrom(1024) except: # Timeout: No Keep Alive Packets sendMail( "No KeepAlive Pakcets from Doorbird! Check your Connection") logger.error( "No KeepAlive Pakcets from Doorbird! Check your Connection") continue try: #read received udp data message = data[0].decode() if message != old_message: logger.debug("Keep-alive msg: {}".format(message)) old_message = message except: hex_bytes = binascii.hexlify(data[0]) event = hex_bytes.decode("ascii") if event != old_event: logger.info("Message: An event has occured!") old_event = event return downloadImage() old_event = event
def test_qr_unregister(self): try: image = "test_unregister.png" qr_tuple = findQR(image) qr_detected = qr_tuple[0] qr_text = qr_tuple[1] qr_unregister = Configurator.get("machine_learning", "qr_unregister_key") self.assertEqual(qr_text, qr_unregister) except: self.fail("Error occured for deregistration code!")
def main(): # Login for Events logger.info("FaceID by HFU v" + version) failed_access = 0 # init ml = FaceML() # read qr-codes for registration and deregistration from config qr_register = Configurator.get("machine_learning", "qr_register_key") qr_unregister = Configurator.get("machine_learning", "qr_unregister_key") while True: # wait for doorbird event image = waitForEventAndDownloadImage() # get QR-code from image qrtuple = findQR(image) if image == "ERROR": logger.error("No Image was downloaded from the Doorbird") continue if qrtuple[0]: # check if qr-code from image equals register code if qrtuple[1] == qr_register: # Danalock.open() logger.info('Register face') currentdate = datetime.datetime.now().timestamp() final = Configurator.get("data", "data_path_known_faces") file_path = final + str(currentdate) + '.jpg' # crop face from image if crop(image, file_path): ml.load_new_face(file_path) sendMail("Add Known Face", [image]) openDoor() failed_access = 0 else: logger.error("No Face found in registering image " + image) # ml.load_known_faces() # check if qr-code from image equals deregistration code elif qrtuple[1] == qr_unregister: logger.info('Unregister face') results = ml.check_face(image) for result in results: if result: # find face in known faces and delete it sendMail("Remove known face!", [result]) os.remove(result) ml.load_known_faces() else: sendMail( "Wanted to remove a known face, but could not find the regarding face!", image) else: person_known = ml.check_face(image) if person_known: # open door logger.info("Open the door for authorised person...") openDoor() failed_access = 0 else: # do not open door logger.info("No access!") failed_access += 1 if failed_access > int( Configurator.get("general", "max_num_of_failed_access")): sendMail("5 failed attempts to access", image) lockDoor()
def run(): if Configurator().run(): Executor().execute()
import src.config.GlobalSettings as GS from src.config.Configurator import Configurator from src.Executor import Executor def run(): if Configurator().run(): Executor().execute() if __name__ == "__main__": print("Runner Executed") GS.API_MODE = False GS.IS_PREDICTION = False try: Configurator().run_basics() GS.LOGGER.write_to_logger("Runner executed", starter=True) # Updating API Mode import argparse ap = argparse.ArgumentParser() ap.add_argument("-i", "--userID", required=False, help="userID") ap.add_argument("-m", "--userModelSelection", required=False, help="userModelSelection") args = vars(ap.parse_args()) USER_ID = args["userID"] if "userID" in args else None MODEL_SELECTED = args[ "userModelSelection"] if "userModelSelection" in args else None if USER_ID and MODEL_SELECTED: GS.API_MODE = True
import logging.handlers from src.config.Configurator import Configurator as config logger = logging.getLogger() handler = logging.handlers.SysLogHandler(address='/dev/log') formatter = logging.Formatter( '%(asctime)s %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) level = logging.getLevelName(config.get("general", "debug_level")) logger.setLevel(level)
def __init__(self): config = Configurator.get("data", "data_path_known_faces") final = config # logger.warn(final) self.path = final self.load_known_faces()