From deacafcd4b1e4c632d121478ce76bfc2941cb109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Wed, 3 Apr 2019 22:52:50 +0200 Subject: [PATCH] Appdaemon - Better discord logger --- appdaemon/apps/logger.py | 47 ++++++++++++++++++++++++++++++++------ appdaemon/apps/logger.yaml | 5 ++++ packages/logging.yaml | 39 ++++++++++++------------------- 3 files changed, 60 insertions(+), 31 deletions(-) diff --git a/appdaemon/apps/logger.py b/appdaemon/apps/logger.py index e124ef2..568f714 100644 --- a/appdaemon/apps/logger.py +++ b/appdaemon/apps/logger.py @@ -1,25 +1,58 @@ from base import Base +import collections +import requests +import datetime class Logger(Base): def initialize(self): super().initialize() + self.q = collections.deque() + self.listen_event(self.log_event, 'LOG_WRITE') + self.listen_event(self.event) self.listen_state(self.state) - self.log_out("Appdaemon logger started") - def log_out(self, message): - self.call_service('notify/discord_log', message=message) - def info_out(self, message): - self.call_service('notify/discord_info', message=message) + self.log_write("Appdaemon logger started") + + def send(self, kwargs): + # Send messages from the queue, but keep track of the rate limit + while len(self.q): + msg = self.q.popleft() + url = self.args['channels'][msg['channel']] + if url: + res = requests.post(url, json={ + "content": msg['message'], + "username": "Appdaemon", + }) + if res.status_code == 429 or res.headers['X-RateLimit-Remaining'] == 0: + # If rate limit exceeded or nearly so + if res.status_code == 429: + self.q.appendleft(msg) + next_try = datetime.datetime.fromtimestamp(int(res.headers['X-RateLimit-Reset'])) + self.run_at(self.send, next_try) + break + + def log_write(self, message, channel = 'log'): + if not message: + return + self.q.append({ + 'message': message, + 'channel': channel, + }) + if len(self.q) == 1: + self.run_in(self.send, 1) + def log_event(self, ev, data, kwargs): + self.log_write(data['message'], data['channel']) + def event(self, name, data, kwargs): if name == 'call_service' and data['service'] == 'discord_log': return - self.log_out("EVENT: {} {}".format(name, data)) + self.log_write("EVENT: {} {}".format(name, data)) def state(self, entity, attribute, old, new, kwargs): tracked_domains = ['light', 'switch', 'device_tracker', 'binary_sensor'] domain = entity.split('.')[0] if domain in tracked_domains: - self.log_out("STATE: {} {} {} =>{}".format(entity, attribute, old, new)) + self.log_write("STATE: {} {} {} =>{}".format(entity, attribute, old, new)) diff --git a/appdaemon/apps/logger.yaml b/appdaemon/apps/logger.yaml index d17d8c2..f8a7ac8 100644 --- a/appdaemon/apps/logger.yaml +++ b/appdaemon/apps/logger.yaml @@ -3,3 +3,8 @@ logger: class: Logger global_dependencies: - base + + channels: + log: !secret discord_log + info: !secret discord_info + diff --git a/packages/logging.yaml b/packages/logging.yaml index 6566c72..c0413c4 100644 --- a/packages/logging.yaml +++ b/packages/logging.yaml @@ -4,41 +4,32 @@ homeassistant: common: &common package: "logging" -notify: - - platform: rest - name: discord_log - method: POST - message_param_name: content - title_param_name: username - data: - username: Åvägen - resource: !secret discord_log - - platform: rest - name: discord_info - method: POST - message_param_name: content - title_param_name: username - data: - username: Åvägen - resource: !secret discord_info - + script.log_message: + <<: *common + script.info_message: + <<: *common + automation.log_home_assistant_starting: + <<: *common script: log_message: sequence: - - service: notify.discord_log - data_template: + - event: LOG_WRITE + event_data_template: message: "{{ message }}" info_message: sequence: - - service: notify.discord_info - data_template: + - event: LOG_WRITE + event_data_template: message: "{{ message }}" - - service: notify.discord_log - data_template: + channel: "info" + - event: LOG_WRITE + event_data_template: message: "INFO: {{ message }}" automation: + alias: LOG - Home Assistant Starting + initial_state: true trigger: platform: homeassistant event: start