Merge pull request #641 from balloob/pushbullet_email

Notify/pushbullet - adjustment in supported targets
This commit is contained in:
Paulus Schoutsen 2015-11-19 22:46:41 -08:00
commit 037bca041e

View file

@ -48,20 +48,22 @@ class PushBulletNotificationService(BaseNotificationService):
def refresh(self):
'''
Refresh devices, contacts, channels, etc
Refresh devices, contacts, etc
pbtargets stores all targets available from this pushbullet instance
into a dict. These are PB objects!. It sacrifices a bit of memory
for faster processing at send_message
As of sept 2015, contacts were replaced by chats. This is not
implemented in the module yet
'''
self.pushbullet.refresh()
self.pbtargets = {
'device':
{tgt.nickname: tgt for tgt in self.pushbullet.devices},
'contact':
{tgt.email: tgt for tgt in self.pushbullet.contacts},
'channel':
{tgt.channel_tag: tgt for tgt in self.pushbullet.channels},
'device': {
tgt.nickname.lower(): tgt for tgt in self.pushbullet.devices},
'channel': {
tgt.channel_tag.lower(): tgt for
tgt in self.pushbullet.channels},
}
def send_message(self, message=None, **kwargs):
@ -69,6 +71,8 @@ class PushBulletNotificationService(BaseNotificationService):
Send a message to a specified target.
If no target specified, a 'normal' push will be sent to all devices
linked to the PB account.
Email is special, these are assumed to always exist. We use a special
call which doesn't require a push object
"""
targets = kwargs.get(ATTR_TARGET)
title = kwargs.get(ATTR_TITLE)
@ -86,36 +90,36 @@ class PushBulletNotificationService(BaseNotificationService):
# Main loop, Process all targets specified
for target in targets:
# Allow for untargeted push, combined with other types
if target in ['device', 'device/']:
self.pushbullet.push_note(title, message)
_LOGGER.info('Sent notification to self')
continue
try:
ttype, tname = target.split('/', 1)
except ValueError:
_LOGGER.error('Invalid target syntax: %s', target)
continue
# Target is email, send directly, don't use a target object
# This also seems works to send to all devices in own account
if ttype == 'email':
self.pushbullet.push_note(title, message, email=tname)
_LOGGER.info('Sent notification to self')
continue
# Refresh if name not found. While awaiting periodic refresh
# solution in component, poor mans refresh ;)
if ttype not in self.pbtargets:
_LOGGER.error('Invalid target syntax: %s', target)
continue
if tname not in self.pbtargets[ttype] and not refreshed:
if tname.lower() not in self.pbtargets[ttype] and not refreshed:
self.refresh()
refreshed = True
# Attempt push_note on a dict value. Keys are types & target
# name. Dict pbtargets has all *actual* targets.
try:
self.pbtargets[ttype][tname].push_note(title, message)
self.pbtargets[ttype][tname.lower()].push_note(title, message)
except KeyError:
_LOGGER.error('No such target: %s.%s', ttype, tname)
_LOGGER.error('No such target: %s/%s', ttype, tname)
continue
except self.pushbullet.errors.PushError:
_LOGGER.error('Notify failed to: %s.%s', ttype, tname)
_LOGGER.error('Notify failed to: %s/%s', ttype, tname)
continue
_LOGGER.info('Sent notification to %s.%s', ttype, tname)
_LOGGER.info('Sent notification to %s/%s', ttype, tname)