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