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))
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))
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))
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)}
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))
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), }
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)
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, }
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)
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))
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))
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)))
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>")