Skip to content

Commit

Permalink
Send Check First & Separate Out Errors
Browse files Browse the repository at this point in the history
  • Loading branch information
Snuffy2 committed Oct 9, 2023
1 parent 955aa16 commit 4d32a45
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 48 deletions.
79 changes: 51 additions & 28 deletions custom_components/healthchecksio/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,24 @@
For more details about this component, please refer to
https://github.com/custom-components/healthchecksio
"""
import os
import async_timeout
import asyncio
import json
import os
from datetime import timedelta

import aiohttp
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import voluptuous as vol
from homeassistant import config_entries
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers import discovery
from homeassistant.util import Throttle

from integrationhelper.const import CC_STARTUP_VERSION
from integrationhelper import Logger
from integrationhelper.const import CC_STARTUP_VERSION

from .const import (
DOMAIN_DATA,
DOMAIN,
ISSUE_URL,
REQUIRED_FILES,
DOMAIN_DATA,
INTEGRATION_VERSION,
ISSUE_URL,
OFFICIAL_SITE_ROOT,
REQUIRED_FILES,
)

MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=300)
Expand Down Expand Up @@ -95,28 +92,54 @@ def __init__(self, hass, api_key, check, self_hosted, site_root, ping_endpoint):
@Throttle(MIN_TIME_BETWEEN_UPDATES)
async def update_data(self):
"""Update data."""
Logger("custom_components.healthchecksio").debug("Running update")
Logger("custom_components.healthchecksio").debug("Running Update")
# This is where the main logic to update platform data goes.
verify_ssl = not self.self_hosted or self.site_root.startswith("https")
session = async_get_clientsession(self.hass, verify_ssl)
timeout10 = aiohttp.ClientTimeout(total=10)
headers = {"X-Api-Key": self.api_key}
if self.self_hosted:
check_url = f"{self.site_root}/{self.ping_endpoint}/{self.check}"
else:
check_url = f"https://hc-ping.com/{self.check}"
await asyncio.sleep(1) # needed for self-hosted instances
try:
verify_ssl = not self.self_hosted or self.site_root.startswith("https")
session = async_get_clientsession(self.hass, verify_ssl)
headers = {"X-Api-Key": self.api_key}
async with async_timeout.timeout(10):
data = await session.get(
f"{self.site_root}/api/v1/checks/", headers=headers
check_response = await session.get(check_url, timeout=timeout10)
except (aiohttp.ClientError, asyncio.TimeoutError) as error:
Logger("custom_components.healthchecksio").error(
f"Could Not Send Check: {error}"
)
else:
if check_response.ok:
Logger("custom_components.healthchecksio").debug(
f"Send Check HTTP Status Code: {check_response.status}"
)
self.hass.data[DOMAIN_DATA]["data"] = await data.json()

if self.self_hosted:
check_url = f"{self.site_root}/{self.ping_endpoint}/{self.check}"
else:
check_url = f"https://hc-ping.com/{self.check}"
await asyncio.sleep(1) # needed for self-hosted instances
await session.get(check_url)
except Exception as error: # pylint: disable=broad-except
else:
Logger("custom_components.healthchecksio").error(
f"Error: Send Check HTTP Status Code: {check_response.status}"
)
try:
data = await session.get(
f"{self.site_root}/api/v1/checks/", headers=headers, timeout=timeout10
)
self.hass.data[DOMAIN_DATA]["data"] = await data.json()
except (aiohttp.ClientError, asyncio.TimeoutError) as error:
Logger("custom_components.healthchecksio").error(
f"Could Not Update Data: {error}"
)
except (ValueError, json.decoder.JSONDecodeError) as error:
Logger("custom_components.healthchecksio").error(
f"Could not update data - {error}"
f"Data JSON Decode Error: {error}"
)
else:
if data.ok:
Logger("custom_components.healthchecksio").debug(
f"Get Data HTTP Status Code: {data.status}"
)
else:
Logger("custom_components.healthchecksio").error(
f"Error: Get Data HTTP Status Code: {data.status}"
)


async def check_files(hass):
Expand Down
74 changes: 54 additions & 20 deletions custom_components/healthchecksio/config_flow.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
"""Adds config flow for Blueprint."""
import async_timeout
import asyncio
import json
from collections import OrderedDict

import aiohttp
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from integrationhelper import Logger
from homeassistant import config_entries

from .const import DOMAIN, DOMAIN_DATA, OFFICIAL_SITE_ROOT

Expand Down Expand Up @@ -123,23 +125,55 @@ async def _test_credentials(
self, api_key, check, self_hosted, site_root, ping_endpoint
):
"""Return true if credentials is valid."""
Logger("custom_components.healthchecksio").debug("Testing Credentials")
verify_ssl = not self_hosted or site_root.startswith("https")
session = async_get_clientsession(self.hass, verify_ssl)
timeout10 = aiohttp.ClientTimeout(total=10)
headers = {"X-Api-Key": api_key}
if self_hosted:
check_url = f"{site_root}/{ping_endpoint}/{check}"
else:
check_url = f"https://hc-ping.com/{check}"
await asyncio.sleep(1) # needed for self-hosted instances
try:
verify_ssl = not self_hosted or site_root.startswith("https")
session = async_get_clientsession(self.hass, verify_ssl)
headers = {"X-Api-Key": api_key}
async with async_timeout.timeout(10):
Logger("custom_components.healthchecksio").info("Checking API Key")
data = await session.get(f"{site_root}/api/v1/checks/", headers=headers)
self.hass.data[DOMAIN_DATA] = {"data": await data.json()}

Logger("custom_components.healthchecksio").info("Checking Check ID")
if self_hosted:
check_url = f"{site_root}/{ping_endpoint}/{check}"
else:
check_url = f"https://hc-ping.com/{check}"
await asyncio.sleep(1) # needed for self-hosted instances
await session.get(check_url)
check_response = await session.get(check_url, timeout=timeout10)
except (aiohttp.ClientError, asyncio.TimeoutError) as error:
Logger("custom_components.healthchecksio").error(
f"Could Not Send Check: {error}"
)
return False
else:
if check_response.ok:
Logger("custom_components.healthchecksio").debug(
f"Send Check HTTP Status Code: {check_response.status}"
)
else:
Logger("custom_components.healthchecksio").error(
f"Error: Send Check HTTP Status Code: {check_response.status}"
)
return False
try:
data = await session.get(
f"{site_root}/api/v1/checks/", headers=headers, timeout=timeout10
)
self.hass.data[DOMAIN_DATA] = {"data": await data.json()}
except (aiohttp.ClientError, asyncio.TimeoutError) as error:
Logger("custom_components.healthchecksio").error(
f"Could Not Update Data: {error}"
)
return False
except (ValueError, json.decoder.JSONDecodeError) as error:
Logger("custom_components.healthchecksio").error(
f"Data JSON Decode Error: {error}"
)
return False
else:
if not data.ok:
Logger("custom_components.healthchecksio").error(
f"Error: Get Data HTTP Status Code: {data.status}"
)
return False
Logger("custom_components.healthchecksio").debug(
f"Get Data HTTP Status Code: {data.status}"
)
return True
except Exception as exception: # pylint: disable=broad-except
Logger("custom_components.healthchecksio").error(exception)
return False

0 comments on commit 4d32a45

Please sign in to comment.