@Gadgets wrote:
As-Salaam and good day.
I am trying to make the islamic_prayer_time sensor.py accept “school” as a parameter.
I took the original sensor.py code from GitHub, but I cant get it to work. Can anyone help. Here is my code:
`
“”“Platform to retrieve Islamic prayer times information for Home Assistant.”""
import logging
from datetime import datetime, timedeltaimport voluptuous as vol
import homeassistant.helpers.config_validation as cv
import homeassistant.util.dt as dt_util
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import DEVICE_CLASS_TIMESTAMP
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.event import async_track_point_in_time_LOGGER = logging.getLogger(name)
PRAYER_TIMES_ICON = “mdi:calendar-clock”
SENSOR_TYPES = [“fajr”, “sunrise”, “dhuhr”, “asr”, “maghrib”, “isha”, “midnight”]
CONF_CALC_METHOD = “calculation_method”
CONF_CALC_SCHOOL = “calculation_school”
CONF_SENSORS = “sensors”CALC_METHODS = [“karachi”, “isna”, “mwl”, “makkah”]
DEFAULT_CALC_METHOD = “isna”
CALC_SCHOOL = [“0”, “1”]
DEFAULT_CALC_SCHOOL =“0”
DEFAULT_SENSORS = [“fajr”, “dhuhr”, “asr”, “maghrib”, “isha”]PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Optional(CONF_CALC_METHOD, default=DEFAULT_CALC_METHOD): vol.In(
CALC_METHODS
),
vol.Optional(CONF_CALC_SCHOOL, default=DEFAULT_CALC_SCHOOL): vol.In(
CALC_SCHOOL
),
vol.Optional(CONF_SENSORS, default=DEFAULT_SENSORS): vol.All(
cv.ensure_list, vol.Length(min=1), [vol.In(SENSOR_TYPES)]
),
}
)async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
“”“Set up the Islamic prayer times sensor platform.”""
latitude = hass.config.latitude
longitude = hass.config.longitude
calc_method = config.get(CONF_CALC_METHOD)
calc_school = config.get(CONF_CALC_SCHOOL)if None in (latitude, longitude): _LOGGER.error("Latitude or longitude not set in Home Assistant config") return prayer_times_data = IslamicPrayerTimesData(latitude, longitude, calc_method, calc_school) prayer_times = prayer_times_data.get_new_prayer_times() sensors = [] for sensor_type in config[CONF_SENSORS]: sensors.append(IslamicPrayerTimeSensor(sensor_type, prayer_times_data)) async_add_entities(sensors, True) # schedule the next update for the sensors await schedule_future_update( hass, sensors, prayer_times["Midnight"], prayer_times_data )
async def schedule_future_update(hass, sensors, midnight_time, prayer_times_data):
“”"Schedule future update for sensors.Midnight is a calculated time. The specifics of the calculation depends on the method of the prayer time calculation. This calculated midnight is the time at which the time to pray the Isha prayers have expired. Calculated Midnight: The Islamic midnight. Traditional Midnight: 12:00AM Update logic for prayer times: If the Calculated Midnight is before the traditional midnight then wait until the traditional midnight to run the update. This way the day will have changed over and we don't need to do any fancy calculations. If the Calculated Midnight is after the traditional midnight, then wait until after the calculated Midnight. We don't want to update the prayer times too early or else the timings might be incorrect. Example: calculated midnight = 11:23PM (before traditional midnight) Update time: 12:00AM calculated midnight = 1:35AM (after traditional midnight) update time: 1:36AM. """ _LOGGER.debug("Scheduling next update for Islamic prayer times") now = dt_util.as_local(dt_util.now()) today = now.date() midnight_dt_str = "{}::{}".format(str(today), midnight_time) midnight_dt = datetime.strptime(midnight_dt_str, "%Y-%m-%d::%H:%M") if now > dt_util.as_local(midnight_dt): _LOGGER.debug( "Midnight is after day the changes so schedule update " "for after Midnight the next day" ) next_update_at = midnight_dt + timedelta(days=1, minutes=1) else: _LOGGER.debug( "Midnight is before the day changes so schedule update for the " "next start of day" ) tomorrow = now + timedelta(days=1) next_update_at = dt_util.start_of_local_day(tomorrow) _LOGGER.debug("Next update scheduled for: %s", str(next_update_at)) async def update_sensors(_): """Update sensors with new prayer times.""" # Update prayer times prayer_times = prayer_times_data.get_new_prayer_times() _LOGGER.debug("New prayer times retrieved. Updating sensors.") # Update all prayer times sensors for sensor in sensors: sensor.async_schedule_update_ha_state(True) # Schedule next update await schedule_future_update( hass, sensors, prayer_times["Midnight"], prayer_times_data ) async_track_point_in_time(hass, update_sensors, next_update_at)
class IslamicPrayerTimesData:
“”“Data object for Islamic prayer times.”""def __init__(self, latitude, longitude, calc_method, calc_school): """Create object to hold data.""" self.latitude = latitude self.longitude = longitude self.calc_method = calc_method self.calc_school = calc_school self.prayer_times_info = None def get_new_prayer_times(self): """Fetch prayer times for today.""" from prayer_times_calculator import PrayerTimesCalculator today = datetime.today().strftime("%Y-%m-%d") calc = PrayerTimesCalculator( latitude=self.latitude, longitude=self.longitude, calculation_method=self.calc_method, calculation_school=self.calc_school, date=str(today), ) self.prayer_times_info = calc.fetch_prayer_times() return self.prayer_times_info
class IslamicPrayerTimeSensor(Entity):
“”“Representation of an Islamic prayer time sensor.”""ENTITY_ID_FORMAT = "sensor.islamic_prayer_time_{}" def __init__(self, sensor_type, prayer_times_data): """Initialize the Islamic prayer time sensor.""" self.sensor_type = sensor_type self.entity_id = self.ENTITY_ID_FORMAT.format(self.sensor_type) self.prayer_times_data = prayer_times_data self._name = self.sensor_type.capitalize() self._device_class = DEVICE_CLASS_TIMESTAMP prayer_time = self.prayer_times_data.prayer_times_info[self._name] pt_dt = self.get_prayer_time_as_dt(prayer_time) self._state = pt_dt.isoformat() @property def name(self): """Return the name of the sensor.""" return self._name @property def icon(self): """Icon to display in the front end.""" return PRAYER_TIMES_ICON @property def state(self): """Return the state of the sensor.""" return self._state @property def should_poll(self): """Disable polling.""" return False @property def device_class(self): """Return the device class.""" return self._device_class @staticmethod def get_prayer_time_as_dt(prayer_time): """Create a datetime object for the respective prayer time.""" today = datetime.today().strftime("%Y-%m-%d") date_time_str = "{} {}".format(str(today), prayer_time) pt_dt = dt_util.parse_datetime(date_time_str) return pt_dt async def async_update(self): """Update the sensor.""" prayer_time = self.prayer_times_data.prayer_times_info[self.name] pt_dt = self.get_prayer_time_as_dt(prayer_time) self._state = pt_dt.isoformat()
`
Posts: 1
Participants: 1