Appdaemon - Better discord logger
This commit is contained in:
parent
dadf0735d1
commit
deacafcd4b
@ -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))
|
||||
|
@ -3,3 +3,8 @@ logger:
|
||||
class: Logger
|
||||
global_dependencies:
|
||||
- base
|
||||
|
||||
channels:
|
||||
log: !secret discord_log
|
||||
info: !secret discord_info
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user