Appdaemon - Better discord logger

This commit is contained in:
Thomas Lovén 2019-04-03 22:52:50 +02:00
parent dadf0735d1
commit deacafcd4b
3 changed files with 60 additions and 31 deletions

View File

@ -1,25 +1,58 @@
from base import Base from base import Base
import collections
import requests
import datetime
class Logger(Base): class Logger(Base):
def initialize(self): def initialize(self):
super().initialize() super().initialize()
self.q = collections.deque()
self.listen_event(self.log_event, 'LOG_WRITE')
self.listen_event(self.event) self.listen_event(self.event)
self.listen_state(self.state) self.listen_state(self.state)
self.log_out("Appdaemon logger started")
def log_out(self, message): self.log_write("Appdaemon logger started")
self.call_service('notify/discord_log', message=message)
def info_out(self, message): def send(self, kwargs):
self.call_service('notify/discord_info', message=message) # 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): def event(self, name, data, kwargs):
if name == 'call_service' and data['service'] == 'discord_log': if name == 'call_service' and data['service'] == 'discord_log':
return return
self.log_out("EVENT: {} {}".format(name, data)) self.log_write("EVENT: {} {}".format(name, data))
def state(self, entity, attribute, old, new, kwargs): def state(self, entity, attribute, old, new, kwargs):
tracked_domains = ['light', 'switch', 'device_tracker', 'binary_sensor'] tracked_domains = ['light', 'switch', 'device_tracker', 'binary_sensor']
domain = entity.split('.')[0] domain = entity.split('.')[0]
if domain in tracked_domains: if domain in tracked_domains:
self.log_out("STATE: {} {} {} =>{}".format(entity, attribute, old, new)) self.log_write("STATE: {} {} {} =>{}".format(entity, attribute, old, new))

View File

@ -3,3 +3,8 @@ logger:
class: Logger class: Logger
global_dependencies: global_dependencies:
- base - base
channels:
log: !secret discord_log
info: !secret discord_info

View File

@ -4,41 +4,32 @@ homeassistant:
common: &common common: &common
package: "logging" package: "logging"
notify: script.log_message:
- platform: rest <<: *common
name: discord_log script.info_message:
method: POST <<: *common
message_param_name: content automation.log_home_assistant_starting:
title_param_name: username <<: *common
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: script:
log_message: log_message:
sequence: sequence:
- service: notify.discord_log - event: LOG_WRITE
data_template: event_data_template:
message: "{{ message }}" message: "{{ message }}"
info_message: info_message:
sequence: sequence:
- service: notify.discord_info - event: LOG_WRITE
data_template: event_data_template:
message: "{{ message }}" message: "{{ message }}"
- service: notify.discord_log channel: "info"
data_template: - event: LOG_WRITE
event_data_template:
message: "INFO: {{ message }}" message: "INFO: {{ message }}"
automation: automation:
alias: LOG - Home Assistant Starting
initial_state: true
trigger: trigger:
platform: homeassistant platform: homeassistant
event: start event: start