Beispiel #1
0
    def update_sun_state(now):    # pylint: disable=unused-argument
        """ Method to update the current state of the sun and
            set time of next setting and rising. """
        observer = ephem.Observer()
        observer.lat = latitude  # pylint: disable=assigning-non-slot
        observer.long = longitude  # pylint: disable=assigning-non-slot

        next_rising_dt = ephem.localtime(observer.next_rising(sun))
        next_setting_dt = ephem.localtime(observer.next_setting(sun))

        if next_rising_dt > next_setting_dt:
            new_state = STATE_ABOVE_HORIZON
            next_change = next_setting_dt

        else:
            new_state = STATE_BELOW_HORIZON
            next_change = next_rising_dt

        logger.info(
            "{}. Next change: {}".format(new_state,
                                         next_change.strftime("%H:%M")))

        state_attributes = {
            STATE_ATTR_NEXT_RISING: util.datetime_to_str(next_rising_dt),
            STATE_ATTR_NEXT_SETTING: util.datetime_to_str(next_setting_dt)
        }

        hass.states.set(ENTITY_ID, new_state, state_attributes)

        # +10 seconds to be sure that the change has occured
        hass.track_point_in_time(update_sun_state,
                                 next_change + timedelta(seconds=10))
Beispiel #2
0
    def update_sun_state(now):  # pylint: disable=unused-argument
        """ Method to update the current state of the sun and
            set time of next setting and rising. """
        observer = ephem.Observer()
        observer.lat = latitude  # pylint: disable=assigning-non-slot
        observer.long = longitude  # pylint: disable=assigning-non-slot

        next_rising_dt = ephem.localtime(observer.next_rising(sun))
        next_setting_dt = ephem.localtime(observer.next_setting(sun))

        if next_rising_dt > next_setting_dt:
            new_state = STATE_ABOVE_HORIZON
            next_change = next_setting_dt

        else:
            new_state = STATE_BELOW_HORIZON
            next_change = next_rising_dt

        logger.info("%s. Next change: %s", new_state,
                    next_change.strftime("%H:%M"))

        state_attributes = {
            STATE_ATTR_NEXT_RISING: util.datetime_to_str(next_rising_dt),
            STATE_ATTR_NEXT_SETTING: util.datetime_to_str(next_setting_dt)
        }

        hass.states.set(ENTITY_ID, new_state, state_attributes)

        # +10 seconds to be sure that the change has occured
        hass.track_point_in_time(update_sun_state,
                                 next_change + timedelta(seconds=10))
Beispiel #3
0
 def __repr__(self):
     if self.attributes:
         return "<state {}:{} @ {}>".format(
             self.state, util.repr_helper(self.attributes),
             util.datetime_to_str(self.last_changed))
     else:
         return "<state {} @ {}>".format(
             self.state, util.datetime_to_str(self.last_changed))
Beispiel #4
0
 def __repr__(self):
     if self.attributes:
         return "<state {}:{} @ {}>".format(
             self.state, util.repr_helper(self.attributes),
             util.datetime_to_str(self.last_changed))
     else:
         return "<state {} @ {}>".format(
             self.state, util.datetime_to_str(self.last_changed))
Beispiel #5
0
    def as_dict(self):
        """ Converts State to a dict to be used within JSON.
        Ensures: state == State.from_dict(state.as_dict()) """

        return {'entity_id': self.entity_id,
                'state': self.state,
                'attributes': self.attributes,
                'last_changed': util.datetime_to_str(self.last_changed),
                'last_updated': util.datetime_to_str(self.last_updated)}
Beispiel #6
0
    def __repr__(self):
        attr = "; {}".format(util.repr_helper(self.attributes)) \
               if self.attributes else ""

        return "<state {}={}{} @ {}>".format(
            self.entity_id, self.state, attr,
            util.datetime_to_str(self.last_changed))
Beispiel #7
0
    def __repr__(self):
        attr = "; {}".format(util.repr_helper(self.attributes)) \
               if self.attributes else ""

        return "<state {}={}{} @ {}>".format(
            self.entity_id, self.state, attr,
            util.datetime_to_str(self.last_changed))
Beispiel #8
0
 def as_dict(self):
     """ Returns a dict representation of this Event. """
     return {
         'event_type': self.event_type,
         'data': dict(self.data),
         'origin': str(self.origin),
         'time_fired': util.datetime_to_str(self.time_fired),
     }
Beispiel #9
0
    def busy_callback(current_jobs, pending_jobs_count):
        """ Callback to be called when the pool queue gets too big. """

        _LOGGER.error("WorkerPool:All %d threads are busy and %d jobs pending",
                      thread_count, pending_jobs_count)

        for start, job in current_jobs:
            _LOGGER.error("WorkerPool:Current job from %s: %s",
                          util.datetime_to_str(start), job)
Beispiel #10
0
 def as_dict(self):
     """ Convert Entry to a dict to be used within JSON. """
     return {
         'when': util.datetime_to_str(self.when),
         'name': self.name,
         'message': self.message,
         'domain': self.domain,
         'entity_id': self.entity_id,
     }
Beispiel #11
0
    def busy_callback(worker_count, current_jobs, pending_jobs_count):
        """ Callback to be called when the pool queue gets too big. """

        _LOGGER.warning(
            "WorkerPool:All %d threads are busy and %d jobs pending",
            worker_count, pending_jobs_count)

        for start, job in current_jobs:
            _LOGGER.warning("WorkerPool:Current job from %s: %s",
                            util.datetime_to_str(start), job)
Beispiel #12
0
    def busy_callback(current_jobs, pending_jobs_count):
        """ Callback to be called when the pool queue gets too big. """
        log_error = logger.error

        log_error(
            "WorkerPool:All {} threads are busy and {} jobs pending".format(
                thread_count, pending_jobs_count))

        for start, job in current_jobs:
            log_error("WorkerPool:Current job from {}: {}".format(
                util.datetime_to_str(start), job))
Beispiel #13
0
    def update_sun_state(now):
        """ Method to update the current state of the sun and
            set time of next setting and rising. """
        utc_offset = datetime.utcnow() - datetime.now()
        utc_now = now + utc_offset

        observer = ephem.Observer()
        observer.lat = latitude  # pylint: disable=assigning-non-slot
        observer.long = longitude  # pylint: disable=assigning-non-slot

        next_rising_dt = ephem.localtime(
            observer.next_rising(sun, start=utc_now))
        next_setting_dt = ephem.localtime(
            observer.next_setting(sun, start=utc_now))

        if next_rising_dt > next_setting_dt:
            new_state = STATE_ABOVE_HORIZON
            next_change = next_setting_dt

        else:
            new_state = STATE_BELOW_HORIZON
            next_change = next_rising_dt

        logger.info("%s. Next change: %s",
                    new_state, next_change.strftime("%H:%M"))

        state_attributes = {
            STATE_ATTR_NEXT_RISING: util.datetime_to_str(next_rising_dt),
            STATE_ATTR_NEXT_SETTING: util.datetime_to_str(next_setting_dt)
        }

        hass.states.set(ENTITY_ID, new_state, state_attributes)

        # +1 second so Ephem will report it has set
        hass.track_point_in_time(update_sun_state,
                                 next_change + timedelta(seconds=1))
Beispiel #14
0
    def update_sun_state(now):
        """ Method to update the current state of the sun and
            set time of next setting and rising. """
        utc_offset = datetime.utcnow() - datetime.now()
        utc_now = now + utc_offset

        observer = ephem.Observer()
        observer.lat = latitude  # pylint: disable=assigning-non-slot
        observer.long = longitude  # pylint: disable=assigning-non-slot

        next_rising_dt = ephem.localtime(
            observer.next_rising(sun, start=utc_now))
        next_setting_dt = ephem.localtime(
            observer.next_setting(sun, start=utc_now))

        if next_rising_dt > next_setting_dt:
            new_state = STATE_ABOVE_HORIZON
            next_change = next_setting_dt

        else:
            new_state = STATE_BELOW_HORIZON
            next_change = next_rising_dt

        logger.info("%s. Next change: %s",
                    new_state, next_change.strftime("%H:%M"))

        state_attributes = {
            STATE_ATTR_NEXT_RISING: datetime_to_str(next_rising_dt),
            STATE_ATTR_NEXT_SETTING: datetime_to_str(next_setting_dt)
        }

        hass.states.set(ENTITY_ID, new_state, state_attributes)

        # +1 second so Ephem will report it has set
        hass.track_point_in_time(update_sun_state,
                                 next_change + timedelta(seconds=1))
 def test_datetime_to_str(self):
     """ Test datetime_to_str. """
     self.assertEqual("12:00:00 09-07-1986",
                      util.datetime_to_str(datetime(1986, 7, 9, 12, 0, 0)))
Beispiel #16
0
    def _handle_get_root(self, path_match, data):
        """ Renders the debug interface. """

        write = lambda txt: self.wfile.write((txt + "\n").encode("UTF-8"))

        self.send_response(HTTP_OK)
        self.send_header('Content-type', 'text/html; charset=utf-8')
        self.end_headers()

        write(("<html>"
               "<head><title>Home Assistant</title>"
               "<link rel='stylesheet' type='text/css' "
               "      href='/static/style.css'>"
               "<link rel='icon' href='/static/favicon.ico' "
               "      type='image/x-icon' />"
               "</head>"
               "<body>"
               "<div class='container'>"
               "<div class='page-header'><h1>Home Assistant</h1></div>"))

        # Flash message support
        if self.server.flash_message:
            write(("<div class='row'><div class='col-xs-12'>"
                   "<div class='alert alert-success'>"
                   "{}</div></div></div>").format(self.server.flash_message))

            self.server.flash_message = None

        # Describe state machine:
        write(("<div class='row'>"
               "<div class='col-xs-12'>"
               "<div class='panel panel-primary'>"
               "<div class='panel-heading'><h2 class='panel-title'>"
               "     States</h2></div>"
               "<form method='post' action='/change_state' "
               "     class='form-change-state'>"
               "<input type='hidden' name='api_password' value='{}'>"
               "<table class='table'><tr>"
               "<th>Entity ID</th><th>State</th>"
               "<th>Attributes</th><th>Last Changed</th>"
               "</tr>").format(self.server.api_password))

        for entity_id, state in \
            sorted(self.server.hass.states.all().items(),
                   key=lambda item: item[0].lower()):

            attributes = "<br>".join(
                ["{}: {}".format(attr, state.attributes[attr])
                 for attr in state.attributes])

            write(("<tr>"
                   "<td>{}</td><td>{}</td><td>{}</td><td>{}</td>"
                   "</tr>").format(
                  entity_id,
                  state.state,
                  attributes,
                  util.datetime_to_str(state.last_changed)))

        # Change state form
        write(("<tr><td><input name='entity_id' class='form-control' "
               "  placeholder='Entity ID'></td>"
               "<td><input name='new_state' class='form-control' "
               "  placeholder='New State'></td>"
               "<td><textarea rows='3' name='attributes' class='form-control' "
               "  placeholder='State Attributes (JSON, optional)'>"
               "</textarea></td>"
               "<td><button type='submit' class='btn btn-default'>"
               "Set State</button></td></tr>"

               "</table></form></div>"

               "</div></div>"))

        # Describe bus/services:
        write(("<div class='row'>"
               "<div class='col-xs-6'>"
               "<div class='panel panel-primary'>"
               "<div class='panel-heading'><h2 class='panel-title'>"
               "     Services</h2></div>"
               "<table class='table'>"
               "<tr><th>Domain</th><th>Service</th></tr>"))

        for domain, services in sorted(
                self.server.hass.services.services.items()):
            write("<tr><td>{}</td><td>{}</td></tr>".format(
                domain, ", ".join(services)))

        write(("</table></div></div>"

               "<div class='col-xs-6'>"
               "<div class='panel panel-primary'>"
               "<div class='panel-heading'><h2 class='panel-title'>"
               "     Call Service</h2></div>"
               "<div class='panel-body'>"
               "<form method='post' action='/call_service' "
               "     class='form-horizontal form-fire-event'>"
               "<input type='hidden' name='api_password' value='{}'>"

               "<div class='form-group'>"
               "  <label for='domain' class='col-xs-3 control-label'>"
               "     Domain</label>"
               "  <div class='col-xs-9'>"
               "     <input type='text' class='form-control' id='domain'"
               "       name='domain' placeholder='Service Domain'>"
               "  </div>"
               "</div>"

               "<div class='form-group'>"
               "  <label for='service' class='col-xs-3 control-label'>"
               "     Service</label>"
               "  <div class='col-xs-9'>"
               "    <input type='text' class='form-control' id='service'"
               "      name='service' placeholder='Service name'>"
               "  </div>"
               "</div>"

               "<div class='form-group'>"
               "  <label for='service_data' class='col-xs-3 control-label'>"
               "    Service data</label>"
               "  <div class='col-xs-9'>"
               "    <textarea rows='3' class='form-control' id='service_data'"
               "      name='service_data' placeholder='Service Data "
               "(JSON, optional)'></textarea>"
               "  </div>"
               "</div>"

               "<div class='form-group'>"
               "  <div class='col-xs-offset-3 col-xs-9'>"
               "    <button type='submit' class='btn btn-default'>"
               "    Call Service</button>"
               "  </div>"
               "</div>"
               "</form>"
               "</div></div></div>"
               "</div>").format(self.server.api_password))

        # Describe bus/events:
        write(("<div class='row'>"
               "<div class='col-xs-6'>"
               "<div class='panel panel-primary'>"
               "<div class='panel-heading'><h2 class='panel-title'>"
               "     Events</h2></div>"
               "<table class='table'>"
               "<tr><th>Event</th><th>Listeners</th></tr>"))

        for event, listener_count in sorted(
                self.server.hass.bus.listeners.items()):
            write("<tr><td>{}</td><td>{}</td></tr>".format(
                event, listener_count))

        write(("</table></div></div>"

               "<div class='col-xs-6'>"
               "<div class='panel panel-primary'>"
               "<div class='panel-heading'><h2 class='panel-title'>"
               "     Fire Event</h2></div>"
               "<div class='panel-body'>"
               "<form method='post' action='/fire_event' "
               "     class='form-horizontal form-fire-event'>"
               "<input type='hidden' name='api_password' value='{}'>"

               "<div class='form-group'>"
               "  <label for='event_type' class='col-xs-3 control-label'>"
               "     Event type</label>"
               "  <div class='col-xs-9'>"
               "     <input type='text' class='form-control' id='event_type'"
               "      name='event_type' placeholder='Event Type'>"
               "  </div>"
               "</div>"

               "<div class='form-group'>"
               "  <label for='event_data' class='col-xs-3 control-label'>"
               "     Event data</label>"
               "  <div class='col-xs-9'>"
               "     <textarea rows='3' class='form-control' id='event_data'"
               "      name='event_data' placeholder='Event Data "
               "(JSON, optional)'></textarea>"
               "  </div>"
               "</div>"

               "<div class='form-group'>"
               "   <div class='col-xs-offset-3 col-xs-9'>"
               "     <button type='submit' class='btn btn-default'>"
               "     Fire Event</button>"
               "   </div>"
               "</div>"
               "</form>"
               "</div></div></div>"
               "</div>").format(self.server.api_password))

        write("</div></body></html>")
Beispiel #17
0
 def test_datetime_to_str(self):
     """ Test datetime_to_str. """
     self.assertEqual("12:00:00 09-07-1986",
                      util.datetime_to_str(datetime(1986, 7, 9, 12, 0, 0)))