diff --git a/homeassistant/actors.py b/homeassistant/actors.py index 74cc0fe6cb2..d5b4329ead0 100644 --- a/homeassistant/actors.py +++ b/homeassistant/actors.py @@ -193,12 +193,17 @@ class HueLightControl(object): except ImportError: logging.getLogger(__name__).error(("HueLightControl:" "Unable to init due to missing dependency phue.")) + + self.success_init = False + return self.bridge = phue.Bridge(host) self.lights = self.bridge.get_light_objects() self.light_ids = [light.light_id for light in self.lights] + self.success_init = True + def is_light_on(self, light_id=None): """ Returns if specified or all light are on. """ @@ -249,7 +254,7 @@ def setup_file_downloader(eventbus, download_path): "Download path {} does not exist. File Downloader not active."). format(download_path)) - return + return False def download_file(event): """ Downloads file specified in the url. """ @@ -303,6 +308,8 @@ def setup_file_downloader(eventbus, download_path): eventbus.listen(EVENT_DOWNLOAD_FILE, download_file) + return True + def setup_webbrowser(eventbus): """ Listen for browse_url events and open the url in the default webbrowser. """ @@ -312,6 +319,8 @@ def setup_webbrowser(eventbus): eventbus.listen(EVENT_BROWSE_URL, lambda event: webbrowser.open(event.data['url'])) + return True + def setup_chromecast(eventbus, host): """ Listen for chromecast events. """ from homeassistant.packages import pychromecast @@ -325,6 +334,8 @@ def setup_chromecast(eventbus, host): eventbus.listen(EVENT_CHROMECAST_YOUTUBE_VIDEO, lambda event: pychromecast.play_youtube_video(host, event.data['video'])) + return True + def setup_media_buttons(eventbus): """ Listen for keyboard events. """ try: @@ -332,7 +343,8 @@ def setup_media_buttons(eventbus): except ImportError: logging.getLogger(__name__).error(("MediaButtons:" "Unable to setup due to missing dependency PyUserInput.")) - return + + return False keyboard = pykeyboard.PyKeyboard() keyboard.special_key_assignment() @@ -348,3 +360,5 @@ def setup_media_buttons(eventbus): eventbus.listen(EVENT_KEYBOARD_MEDIA_PLAY_PAUSE, lambda event: keyboard.tap_key(keyboard.media_play_pause_key)) + + return True diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index a5e64046b9d..fb4642a9abb 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -3,16 +3,20 @@ Provides methods to bootstrap a home assistant instance. """ import ConfigParser +import logging import homeassistant as ha import homeassistant.observers as observers import homeassistant.actors as actors import homeassistant.httpinterface as httpinterface +# pylint: disable=too-many-branches def from_config_file(config_path): """ Starts home assistant with all possible functionality based on a config file. """ + statusses = [] + # Read config config = ConfigParser.SafeConfigParser() config.read(config_path) @@ -34,6 +38,14 @@ def from_config_file(config_path): config.get('tomato','password'), config.get('tomato','http_id')) + if device_scanner.success_init: + statusses.append(("Device Scanner - Tomato", True)) + + else: + statusses.append(("Device Scanner - Tomato", False)) + + device_scanner = None + else: device_scanner = None @@ -42,6 +54,9 @@ def from_config_file(config_path): if device_scanner: device_tracker = observers.DeviceTracker(eventbus, statemachine, device_scanner) + + statusses.append(("Device Tracker", True)) + else: device_tracker = None @@ -50,19 +65,21 @@ def from_config_file(config_path): if config.has_option("common", "latitude") and \ config.has_option("common", "longitude"): - observers.track_sun(eventbus, statemachine, - config.get("common","latitude"), - config.get("common","longitude")) + statusses.append(("Weather - Ephem", + observers.track_sun(eventbus, statemachine, + config.get("common","latitude"), + config.get("common","longitude")))) + # Init actors # Light control - if config.has_section("hue"): - if config.has_option("hue", "host"): - hue_host = config.get("hue", "host") - else: - hue_host = None + if config.has_section("hue") and config.has_option("hue", "host"): + light_control = actors.HueLightControl(config.get("hue", "host")) - light_control = actors.HueLightControl(hue_host) + statusses.append(("Light Control - Hue", light_control.success_init)) + + else: + light_control = None # Light trigger @@ -70,22 +87,38 @@ def from_config_file(config_path): actors.LightTrigger(eventbus, statemachine, device_tracker, light_control) + statusses.append(("Light Trigger", True)) + if config.has_option("chromecast", "host"): - actors.setup_chromecast(eventbus, config.get("chromecast", "host")) + statusses.append(("Chromecast", actors.setup_chromecast(eventbus, + config.get("chromecast", "host")))) if config.has_option("downloader", "download_dir"): - actors.setup_file_downloader(eventbus, + result = actors.setup_file_downloader(eventbus, config.get("downloader", "download_dir")) - actors.setup_webbrowser(eventbus) - actors.setup_media_buttons(eventbus) + statusses.append(("Downloader", result)) + + + statusses.append(("Webbrowser", actors.setup_webbrowser(eventbus))) + + statusses.append(("Media Buttons", actors.setup_media_buttons(eventbus))) + # Init HTTP interface if config.has_option("httpinterface", "api_password"): httpinterface.HTTPInterface(eventbus, statemachine, config.get("httpinterface","api_password")) + statusses.append(("HTTPInterface", True)) + + logger = logging.getLogger(__name__) + + for component, success_init in statusses: + status = "initialized" if success_init else "Failed to initialize" + + logger.info("{}: {}".format(component, status)) ha.start_home_assistant(eventbus) diff --git a/homeassistant/observers.py b/homeassistant/observers.py index c809c878330..1f00f76798d 100644 --- a/homeassistant/observers.py +++ b/homeassistant/observers.py @@ -52,7 +52,7 @@ def track_sun(eventbus, statemachine, latitude, longitude): except ImportError: logger.error(("TrackSun:" "Unable to setup due to missing dependency ephem.")) - return + return False sun = ephem.Sun() # pylint: disable=no-member @@ -89,6 +89,7 @@ def track_sun(eventbus, statemachine, latitude, longitude): update_sun_state(None) + return True class DeviceTracker(object): """ Class that tracks which devices are home and which are not. """ @@ -278,6 +279,8 @@ class TomatoDeviceScanner(object): self.date_updated = None self.last_results = {"wldev": [], "dhcpd_lease": []} + self.success_init = self._update_tomato_info() + def scan_devices(self): """ Scans for new devices and return a list containing found device ids. """ @@ -331,22 +334,30 @@ class TomatoDeviceScanner(object): self.date_updated = datetime.now() + return True + elif response.status_code == 401: # Authentication error self.logger.exception(("Tomato:Failed to authenticate, " "please check your username and password")) + return False + except requests.ConnectionError: # We get this if we could not connect to the router or # an invalid http_id was supplied self.logger.exception(("Tomato:Failed to connect to the router" "or invalid http_id supplied")) + return False + except ValueError: # If json decoder could not parse the response self.logger.exception(("Tomato:Failed to parse response " "from router")) + return False + finally: self.lock.release() @@ -354,3 +365,5 @@ class TomatoDeviceScanner(object): # We acquired the lock before the IF check, # release it before we return True self.lock.release() + + return True