From 41c3f695b476137eabe2d42cfa7edf695ce8b879 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sun, 10 Apr 2016 17:44:57 -0700 Subject: [PATCH 1/3] UPnP port mapping component --- .coveragerc | 2 ++ homeassistant/components/upnp.py | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 homeassistant/components/upnp.py diff --git a/.coveragerc b/.coveragerc index 2f6e7a9adf8..26b6413b4c0 100644 --- a/.coveragerc +++ b/.coveragerc @@ -65,6 +65,8 @@ omit = homeassistant/components/scsgate.py homeassistant/components/*/scsgate.py + homeassistant/components/upnp.py + homeassistant/components/binary_sensor/arest.py homeassistant/components/binary_sensor/rest.py homeassistant/components/browser.py diff --git a/homeassistant/components/upnp.py b/homeassistant/components/upnp.py new file mode 100644 index 00000000000..0a2c02666e2 --- /dev/null +++ b/homeassistant/components/upnp.py @@ -0,0 +1,45 @@ +""" +This module will attempt to open a port in your router for Home Assistant. + +For more details about UPnP, please refer to the documentation at +https://home-assistant.io/components/upnp/ +""" +import logging + +from homeassistant.const import (EVENT_HOMEASSISTANT_STOP) + +DEPENDENCIES = ["api"] + +_LOGGER = logging.getLogger(__name__) + +DOMAIN = "upnp" + + +def setup(hass, config): + """Register a port mapping for Home Assistant via UPnP.""" + import miniupnpc + + # Miniupnpc dynamically includes UPnP + # pylint: disable=no-name-in-module, no-member + upnp = miniupnpc.UPnP() + + upnp.discoverdelay = 200 + upnp.discover() + try: + upnp.selectigd() + # pylint: disable=broad-except + except Exception: + _LOGGER.exception("Error when attempting to discover a UPnP IGD") + return False + + upnp.addportmapping(hass.config.api.port, "TCP", + hass.config.api.host, hass.config.api.port, + "Home Assistant", "") + + def deregister_port(event): + """De-register the UPnP port mapping.""" + upnp.deleteportmapping(hass.config.api.port, "TCP") + + hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, deregister_port) + + return True From 5b51f682cad25e4d6db14c1de32b5331ad1237d9 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sun, 10 Apr 2016 17:49:07 -0700 Subject: [PATCH 2/3] Remove unnecessary disable=no-name-in-module --- homeassistant/components/upnp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/upnp.py b/homeassistant/components/upnp.py index 0a2c02666e2..4a34b0697cb 100644 --- a/homeassistant/components/upnp.py +++ b/homeassistant/components/upnp.py @@ -19,8 +19,7 @@ def setup(hass, config): """Register a port mapping for Home Assistant via UPnP.""" import miniupnpc - # Miniupnpc dynamically includes UPnP - # pylint: disable=no-name-in-module, no-member + # pylint: disable=no-member upnp = miniupnpc.UPnP() upnp.discoverdelay = 200 From 6f149d414aebbfa923d303abd775c7438ad9913e Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sun, 10 Apr 2016 18:19:32 -0700 Subject: [PATCH 3/3] Disable import-error on upnp --- homeassistant/components/upnp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/upnp.py b/homeassistant/components/upnp.py index 4a34b0697cb..bb4dbe8fe86 100644 --- a/homeassistant/components/upnp.py +++ b/homeassistant/components/upnp.py @@ -17,6 +17,7 @@ DOMAIN = "upnp" def setup(hass, config): """Register a port mapping for Home Assistant via UPnP.""" + # pylint: disable=import-error import miniupnpc # pylint: disable=no-member