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
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))

View File

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

View File

@ -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