Skip to content

Commit

Permalink
add some additional resiliency to API requests
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonmadigan committed Jun 26, 2024
1 parent 6a8e115 commit d5c065f
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 20 deletions.
44 changes: 25 additions & 19 deletions pyhkc/hkc_api.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import requests
import os
from tabulate import tabulate
import logging
from tenacity import retry, wait_exponential, stop_after_attempt

class HKCAlarm:
def __init__(self, panel_id, panel_password, user_code, base_url="https://hkc.api.securecomm.cloud"):
def __init__(self, panel_id, panel_password, user_code, base_url="https://hkc.api.securecomm.cloud", log_level=logging.INFO):
self.base_url = base_url
self.panel_id = panel_id
self.panel_password = panel_password
Expand All @@ -15,7 +17,12 @@ def __init__(self, panel_id, panel_password, user_code, base_url="https://hkc.ap
"user-agent": "okhttp/4.9.2"
}
self.securecomm_address = ""
self.hardware_id = ""
self.hardware_id = ""

logging.basicConfig(level=log_level, format='%(asctime)s - %(levelname)s - %(message)s')
self.logger = logging.getLogger(__name__)

self.logger.info("Initializing HKCAlarm")
self._initialize()

def _initialize(self):
Expand Down Expand Up @@ -113,26 +120,26 @@ def check_login(self):

def get_panel(self):
data = {
"panelId": self.panel_id,
"panelPassword": self.panel_password,
"keys": "",
"isKeypadEnabled": False,
"secureCommAddress": self.securecomm_address
"panelId": self.panel_id,
"panelPassword": self.panel_password,
"keys": "",
"isKeypadEnabled": False,
"secureCommAddress": self.securecomm_address
}
url = f"{self.base_url}/Panel/RemoteKeypad/"
response = requests.post(url, headers=self.headers, json=data)
keypad_data = response.json()
return keypad_data
return self._api_request("POST", f"{self.base_url}/Panel/RemoteKeypad/", data)

# Private methods for direct API calls

@retry(wait=wait_exponential(multiplier=1, min=4, max=30), stop=stop_after_attempt(5), reraise=True)
def _api_request(self, method, url, data=None):
try:
response = requests.request(method, url, headers=self.headers, json=data)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
return {"error": str(e)}
try:
self.logger.debug(f"Making {method} request to {url} with data: {data}")
response = requests.request(method, url, headers=self.headers, json=data)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
self.logger.error(f"Request to {url} failed: {str(e)}")
raise

def _mobile_register(self, data):
return self._api_request("POST", f"{self.base_url}/Registration/MobileRegister", data)
Expand Down Expand Up @@ -189,15 +196,14 @@ def _get_latest_event_id(self):
panel_id = int(os.environ.get("HKC_PANEL_ID", panel_id_sample))
panel_password = os.environ.get("HKC_PANEL_PASSWORD", panel_password_sample)
user_code = int(os.environ.get("HKC_USER_CODE", user_code_sample))
alarm_system = HKCAlarm(panel_id, panel_password, user_code)
alarm_system = HKCAlarm(panel_id, panel_password, user_code, log_level=logging.DEBUG)

panel_data = alarm_system.get_panel()
print(panel_data)

# Assuming HKCAlarm is already initialized as alarm_system
# login_check = alarm_system.check_login()
# print(login_check) # Outputs: True or False

status = alarm_system.get_system_status()

print("System Status:")
Expand Down
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
requests>=2.31.0,<3.0.0
tabulate==0.9.0
tabulate==0.9.0
tenacity==8.4.2

0 comments on commit d5c065f

Please sign in to comment.