import pigpio import time import logging import json import requests from wiegand import decoder class door: def __init__(self, api_key): self.api_key = api_key def unlock_door(self): body = {"entity_id": "lock.kwikset_smartcode_convert_gen1_bb8103fd_door_lock"} headers = {'authorization': f'Bearer {self.api_key}'} requests.post("https://ha.zoisite.xyz/api/services/lock/unlock", headers=headers, data=json.dumps(body)) print("unlocked") def lock_door(self): body = {"entity_id": "lock.kwikset_smartcode_convert_gen1_bb8103fd_door_lock"} headers = {'authorization': f'Bearer {self.api_key}'} requests.post("https://ha.zoisite.xyz/api/services/lock/lock", headers=headers, data=json.dumps(body)) print("locked") def load_secrets(): with open("./secrets.json") as secrets: return json.loads(secrets.read()) if __name__ == "__main__": secrets = load_secrets() pi = pigpio.pi() door = door(secrets['api_key']) current_code = "" def callback(bits, value): global current_code # indicates keypad press if bits == 4: print(value) current_code = current_code[-3:] + str(value) if value == 11: # lock door on # character door.lock_door() current_code = "" if len(current_code) == 4: # check if we have a valid code if current_code in secrets['codes']: door.unlock_door() current_code = "" # indicates a card swipe elif bits == 37: current_code = "" str_value = str(value) if str_value in secrets['cards']: door.unlock_door() logging.info("bits={} value={}".format(bits, value)) w = decoder(pi, 2, 3, callback) time.sleep(1000) w.cancel() pi.stop()