From 7593ecb870932a739f2af0937ee3c58d73013a2c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Apr 2015 00:53:36 +0200 Subject: [PATCH 1/4] initial instapush notification --- homeassistant/components/notify/instapush.py | 141 +++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 homeassistant/components/notify/instapush.py diff --git a/homeassistant/components/notify/instapush.py b/homeassistant/components/notify/instapush.py new file mode 100644 index 00000000000..cce57c1b3c2 --- /dev/null +++ b/homeassistant/components/notify/instapush.py @@ -0,0 +1,141 @@ +""" +homeassistant.components.notify.instapush +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Instapush notification service. + +Configuration: + +To use the Instapush notifier you will need to add something like the following +to your config/configuration.yaml + +notify: + platform: instapush + api_key: YOUR_APP_KEY + app_secret: YOUR_APP_SECRET + event: YOUR_EVENT + tracker: YOUR_TRACKER + +VARIABLES: + +api_key +*Required +To retrieve this value log into your account at https://instapush.im and go +to 'APPS'. + +app_secret +*Required +To get this value log into your account at https://instapush.im and go to +'APPS'. The 'Application ID' can be found under 'Basic Info'. Make sure that +you have at least one event for your app. + +event +*Required +To retrieve this value log into your account at https://instapush.im and go +to 'APPS'. + +tracker +*Required +To retrieve this value log into your account at https://instapush.im and go +to 'APPS'. + +Example usage of Instapush if you have an event 'notification' and a tracker +'home-assistant'. + +curl -X POST \ + -H "x-instapush-appid: YOUR_APP_KEY" \ + -H "x-instapush-appsecret: YOUR_APP_SECRET" \ + -H "Content-Type: application/json" \ + -d '{"event":"notification","trackers":{"home-assistant":"Switch 1"}}' \ + https://api.instapush.im/v1/post + +Details for the API : https://instapush.im/developer/rest + +""" +import logging +import json + +from homeassistant.helpers import validate_config +from homeassistant.components.notify import ( + DOMAIN, ATTR_TITLE, BaseNotificationService) +from homeassistant.const import CONF_API_KEY + +_LOGGER = logging.getLogger(__name__) +_RESOURCE = 'https://api.instapush.im/v1/post' + + +def get_service(hass, config): + """ Get the instapush notification service. """ + + if not validate_config(config, + {DOMAIN: [CONF_API_KEY, 'app_secret', \ + 'event', 'tracker']}, + _LOGGER): + return None + + try: + import requests + + except ImportError: + _LOGGER.exception( + "Unable to import requests. " + "Did you maybe not install the 'Requests' package?") + + return None + + # pylint: disable=unused-variable + try: + response = requests.get(_RESOURCE) + + except requests.ConnectionError: + _LOGGER.error( + "Connection error " + "Please check if https://instapush.im is available.") + + return None + + return InstapushNotificationService( + config[DOMAIN].get(CONF_API_KEY), + config[DOMAIN]['app_secret'], + config[DOMAIN]['event'], + config[DOMAIN]['tracker'] + ) + + +# pylint: disable=too-few-public-methods +class InstapushNotificationService(BaseNotificationService): + """ Implements notification service for Instapush. """ + + def __init__(self, api_key, app_secret, event, tracker): + # pylint: disable=no-name-in-module, unused-variable + from requests import Request, Session + + self._api_key = api_key + self._app_secret = app_secret + self._event = event + self._tracker = tracker + self._headers = { + 'X-INSTAPUSH-APPID' : self._api_key, + 'X-INSTAPUSH-APPSECRET' : self._app_secret, + 'Content-Type' : 'application/json'} + + self.instapush = Session() + + + def send_message(self, message="", **kwargs): + """ Send a message to a user. """ + + title = kwargs.get(ATTR_TITLE) + + data = {"event":self._event, + "trackers":{self._tracker:title + " : " + message}} + + response = self.instapush.post( + _RESOURCE, + data=json.dumps(data), + headers=self._headers) + + if response.json()['error'] == 'True': + _LOGGER.error( + "Wrong details supplied. " + "Get them at https://instapush.im/") From 94e004a828d1771b5072bb108a8ca780010620bb Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 27 Apr 2015 19:34:34 +0200 Subject: [PATCH 2/4] rework to include checks on boot --- homeassistant/components/notify/instapush.py | 74 +++++++++++++------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/notify/instapush.py b/homeassistant/components/notify/instapush.py index cce57c1b3c2..39df8f290d3 100644 --- a/homeassistant/components/notify/instapush.py +++ b/homeassistant/components/notify/instapush.py @@ -21,23 +21,23 @@ VARIABLES: api_key *Required To retrieve this value log into your account at https://instapush.im and go -to 'APPS'. +to 'APPS', choose an app, and check 'Basic Info'. app_secret *Required To get this value log into your account at https://instapush.im and go to -'APPS'. The 'Application ID' can be found under 'Basic Info'. Make sure that -you have at least one event for your app. +'APPS'. The 'Application ID' can be found under 'Basic Info'. event *Required -To retrieve this value log into your account at https://instapush.im and go -to 'APPS'. +To retrieve a valid event log into your account at https://instapush.im and go +to 'APPS'. If you have no events to use with Home Assistant, create one event for +your app. tracker *Required -To retrieve this value log into your account at https://instapush.im and go -to 'APPS'. +To retrieve the tracker value log into your account at https://instapush.im and go +to 'APPS', choose the app, and check the event entries. Example usage of Instapush if you have an event 'notification' and a tracker 'home-assistant'. @@ -61,15 +61,17 @@ from homeassistant.components.notify import ( from homeassistant.const import CONF_API_KEY _LOGGER = logging.getLogger(__name__) -_RESOURCE = 'https://api.instapush.im/v1/post' +_RESOURCE = 'https://api.instapush.im/v1/' def get_service(hass, config): """ Get the instapush notification service. """ if not validate_config(config, - {DOMAIN: [CONF_API_KEY, 'app_secret', \ - 'event', 'tracker']}, + {DOMAIN: [CONF_API_KEY, + 'app_secret', + 'event', + 'tracker']}, _LOGGER): return None @@ -94,12 +96,31 @@ def get_service(hass, config): return None - return InstapushNotificationService( - config[DOMAIN].get(CONF_API_KEY), - config[DOMAIN]['app_secret'], - config[DOMAIN]['event'], - config[DOMAIN]['tracker'] - ) + instapush = requests.Session() + headers = {'x-instapush-appid': config[DOMAIN][CONF_API_KEY], + 'x-instapush-appsecret': config[DOMAIN]['app_secret']} + response = instapush.get(_RESOURCE + 'events/list', + headers=headers) + + try: + if response.json()['error']: + _LOGGER.error("{}".format(response.json()['msg'])) + # pylint: disable=bare-except + except: + try: + next(events for events in response.json() + if events['title'] == config[DOMAIN]['event']) + except StopIteration: + _LOGGER.error( + "No event match your given value. " + "Please create an event at https://instapush.im") + else: + return InstapushNotificationService( + config[DOMAIN].get(CONF_API_KEY), + config[DOMAIN]['app_secret'], + config[DOMAIN]['event'], + config[DOMAIN]['tracker'] + ) # pylint: disable=too-few-public-methods @@ -108,34 +129,33 @@ class InstapushNotificationService(BaseNotificationService): def __init__(self, api_key, app_secret, event, tracker): # pylint: disable=no-name-in-module, unused-variable - from requests import Request, Session + from requests import Session self._api_key = api_key self._app_secret = app_secret self._event = event self._tracker = tracker self._headers = { - 'X-INSTAPUSH-APPID' : self._api_key, - 'X-INSTAPUSH-APPSECRET' : self._app_secret, - 'Content-Type' : 'application/json'} + 'x-instapush-appid': self._api_key, + 'x-instapush-appsecret': self._app_secret, + 'Content-Type': 'application/json'} self.instapush = Session() - def send_message(self, message="", **kwargs): """ Send a message to a user. """ title = kwargs.get(ATTR_TITLE) - data = {"event":self._event, - "trackers":{self._tracker:title + " : " + message}} + data = {"event": self._event, + "trackers": {self._tracker: title + " : " + message}} response = self.instapush.post( - _RESOURCE, + _RESOURCE + 'post', data=json.dumps(data), headers=self._headers) - if response.json()['error'] == 'True': + if response.json()['status'] == 401: _LOGGER.error( - "Wrong details supplied. " - "Get them at https://instapush.im/") + response.json()['msg'], + "Please check your details at https://instapush.im/") From 5ca1a80ad505789654e07043b061e2e968df1173 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 27 Apr 2015 19:47:27 +0200 Subject: [PATCH 3/4] fix pylint errors --- homeassistant/components/notify/instapush.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/notify/instapush.py b/homeassistant/components/notify/instapush.py index 39df8f290d3..d679444cc52 100644 --- a/homeassistant/components/notify/instapush.py +++ b/homeassistant/components/notify/instapush.py @@ -31,13 +31,13 @@ To get this value log into your account at https://instapush.im and go to event *Required To retrieve a valid event log into your account at https://instapush.im and go -to 'APPS'. If you have no events to use with Home Assistant, create one event for -your app. +to 'APPS'. If you have no events to use with Home Assistant, create one event +for your app. tracker *Required -To retrieve the tracker value log into your account at https://instapush.im and go -to 'APPS', choose the app, and check the event entries. +To retrieve the tracker value log into your account at https://instapush.im and +go to 'APPS', choose the app, and check the event entries. Example usage of Instapush if you have an event 'notification' and a tracker 'home-assistant'. From 234669f469902367bb4e1a6b3a9481be191cd6f0 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 28 Apr 2015 09:43:53 +0200 Subject: [PATCH 4/4] fix format --- homeassistant/components/notify/instapush.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/notify/instapush.py b/homeassistant/components/notify/instapush.py index d679444cc52..531ef758e05 100644 --- a/homeassistant/components/notify/instapush.py +++ b/homeassistant/components/notify/instapush.py @@ -104,7 +104,7 @@ def get_service(hass, config): try: if response.json()['error']: - _LOGGER.error("{}".format(response.json()['msg'])) + _LOGGER.error(response.json()['msg']) # pylint: disable=bare-except except: try: