Skip to content

Commit

Permalink
Merge pull request #8 from PinoutLTD/rrs-0.1
Browse files Browse the repository at this point in the history
Send all warnings every 4 hours
  • Loading branch information
LoSk-p authored Jul 2, 2024
2 parents 66de076 + a3be343 commit 3c8588f
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,34 +1,61 @@
import logging
import asyncio
from datetime import timedelta

_LOGGER = logging.getLogger(__name__)

from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.event import async_track_time_interval

from .error_source import ErrorSource
from .utils.message_formatter import MessageFormatter
from ...const import DOMAIN

WARNING_SENDING_TIMEOUT = timedelta(hours=4)

class LoggerHandler(logging.Handler, ErrorSource):
def __init__(self, hass: HomeAssistant):
logging.Handler.__init__(self)
ErrorSource.__init__(self, hass)
self.unsub_timer = None
self.root_logger = None
self._warning_messages = []

@callback
def setup(self):
self.root_logger = logging.getLogger()
self.root_logger.addHandler(self)
self.unsub_timer = async_track_time_interval(
self.hass,
self._send_warnings,
WARNING_SENDING_TIMEOUT,
)

@callback
def remove(self):
self.root_logger.removeHandler(self)
if self.unsub_timer is not None:
self.unsub_timer()

def emit(self, record):
if DOMAIN not in record.name:
if record.levelname == "ERROR" or record.levelname == "CRITICAL" or record.levelname == "WARNING":
if record.levelname == "ERROR" or record.levelname == "CRITICAL":
_LOGGER.debug(f"New error message: {record.msg}")
error_msg = f"{record.name} - {record.levelname}: {record.msg}"
asyncio.run_coroutine_threadsafe(
self._run_report_service(error_msg), self.hass.loop
)
elif record.levelname == "WARNING":
self._warning_messages.append(f"{record.name} - {record.levelname}: {record.msg}")

async def _send_warnings(self, _ = None) -> None:
if len(self._warning_messages) > 0:
_LOGGER.debug(f"Got {len(self._warning_messages)} warning messages, start sending report")
warnings = self._warning_messages.copy()
self._warning_messages.clear()
message = MessageFormatter.format_warnins_message(warnings)
await self._run_report_service(message)
else:
_LOGGER.debug("Haven't got any warning messages during timeout")


Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import typing as tp

class MessageFormatter:
@staticmethod
def format_devices_list(data: dict, first_line_string: str) -> str:
message = first_line_string
message += "\nDevices:\n"
for device in data["devices"]:
message += f" * {data["devices"][device]['device_name']}\n"
message += f" * Entities:\n"
message += " * Entities:\n"
for entity_name in data["devices"][device]["entities"]:
message += f" * {entity_name}\n"
if len(data["entities"]) > 0:
Expand All @@ -17,3 +19,10 @@ def format_devices_list(data: dict, first_line_string: str) -> str:
@staticmethod
def concatinate_messages(message1: str, message2: str) -> str:
return f"{message1}\n{message2}"

@staticmethod
def format_warnins_message(warnings: tp.List[str]) -> str:
message = "Following warninds were detected:\n"
for warning in warnings:
message += f"*{warning}\n"
return message

0 comments on commit 3c8588f

Please sign in to comment.