diff --git a/README.md b/README.md index f182523..7a2df11 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ ___ - **If you are running Home Assistant as a Docker container, the `TZ` environment variable must be set.** + ## Important - Please Read: ### Note About PetKit Account & Family Sharing Feature: @@ -106,7 +107,7 @@ and place it inside your Home Assistant Core installation's `custom_components` ## Setup ### Automatic Option -Click on the button below to add the integration: +Click on the button below to add the integration. Be sure to read #4 and #5 below. [![Open your Home Assistant instance and start setting up a new integration.](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=petkit) @@ -116,6 +117,7 @@ Click on the button below to add the integration: 2. Click the `+ ADD INTEGRATION` button in the lower right-hand corner 3. Search for `PetKit` 4. Be sure to select the country associated with your account (Hong Kong users should select Hong Kong, not China). +5. During setup, set the timezone option to `Set Automatically`. If the tzlocal library isn't able to fetch your timezone, please manually select your timezone. **The current polling interval is set to 2 minutes (120 seconds). If you would like to set a different polling interval, change the polling interval option (via the UI). Keep in mind, setting the polling interval too short may result in your account getting rate limited/blocked.** diff --git a/custom_components/petkit/__init__.py b/custom_components/petkit/__init__.py index f08d0ca..2f15d73 100644 --- a/custom_components/petkit/__init__.py +++ b/custom_components/petkit/__init__.py @@ -5,7 +5,7 @@ from homeassistant.const import CONF_EMAIL, CONF_PASSWORD from homeassistant.core import HomeAssistant -from .const import DOMAIN, LOGGER, PETKIT_COORDINATOR, PLATFORMS, POLLING_INTERVAL, REGION, UPDATE_LISTENER +from .const import DOMAIN, LOGGER, PETKIT_COORDINATOR, PLATFORMS, POLLING_INTERVAL, REGION, TIMEZONE, UPDATE_LISTENER from .coordinator import PetKitDataUpdateCoordinator from .util import async_validate_api, NoDevicesError @@ -44,7 +44,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: password = entry.data[CONF_PASSWORD] LOGGER.debug('Migrating PetKit config entry') - entry.version = 4 + entry.version = 5 hass.config_entries.async_update_entry( entry, @@ -54,6 +54,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: }, options={ REGION: None, + TIMEZONE: "Set Automatically", POLLING_INTERVAL: 120, }, ) @@ -65,7 +66,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: polling_interval = entry.options[POLLING_INTERVAL] LOGGER.debug('Migrating PetKit config entry') - entry.version = 4 + entry.version = 5 hass.config_entries.async_update_entry( entry, @@ -75,11 +76,34 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: }, options={ REGION: None, + TIMEZONE: "Set Automatically", POLLING_INTERVAL: polling_interval, }, ) LOGGER.error("PetKit API has changed. Please reauthenticate and select your country.") + if entry.version == 4: + email = entry.data[CONF_EMAIL] + password = entry.data[CONF_PASSWORD] + region = entry.options[REGION] + polling_interval = entry.options[POLLING_INTERVAL] + + LOGGER.debug('Migrating PetKit config entry') + entry.version = 5 + + hass.config_entries.async_update_entry( + entry, + data={ + CONF_EMAIL: email, + CONF_PASSWORD: password, + }, + options={ + REGION: region, + TIMEZONE: "Set Automatically", + POLLING_INTERVAL: polling_interval, + }, + ) + return True async def async_update_options(hass: HomeAssistant, entry: ConfigEntry) -> None: diff --git a/custom_components/petkit/config_flow.py b/custom_components/petkit/config_flow.py index 3dc5756..3e968a2 100644 --- a/custom_components/petkit/config_flow.py +++ b/custom_components/petkit/config_flow.py @@ -14,7 +14,8 @@ from homeassistant.helpers import selector import homeassistant.helpers.config_validation as cv -from .const import DEFAULT_NAME, DOMAIN, POLLING_INTERVAL, REGION, REGIONS_LIST +from .const import DEFAULT_NAME, DOMAIN, POLLING_INTERVAL, REGION, REGIONS_LIST, TIMEZONE +from .timezones import TIMEZONES from .util import NoDevicesError, async_validate_api @@ -24,6 +25,9 @@ vol.Required(CONF_PASSWORD): cv.string, vol.Required(REGION): selector.SelectSelector( selector.SelectSelectorConfig(options=REGIONS_LIST), + ), + vol.Required(TIMEZONE): selector.SelectSelector( + selector.SelectSelectorConfig(options=TIMEZONES), ) } @@ -33,7 +37,7 @@ class PetKitConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Handle a config flow for PetKit integration.""" - VERSION = 4 + VERSION = 5 entry: config_entries.ConfigEntry | None @@ -62,9 +66,10 @@ async def async_step_reauth_confirm( email = user_input[CONF_EMAIL] password = user_input[CONF_PASSWORD] region = user_input[REGION] if REGION else None + timezone = user_input[TIMEZONE] try: - await async_validate_api(self.hass, email, password, region) + await async_validate_api(self.hass, email, password, region, timezone) except RegionError: errors["base"] = "region_error" except TimezoneError: @@ -91,6 +96,7 @@ async def async_step_reauth_confirm( }, options={ REGION: region, + TIMEZONE: timezone, POLLING_INTERVAL: self.entry.options[POLLING_INTERVAL], } ) @@ -115,9 +121,10 @@ async def async_step_user( email = user_input[CONF_EMAIL] password = user_input[CONF_PASSWORD] region = user_input[REGION] if REGION else None + timezone = user_input[TIMEZONE] try: - await async_validate_api(self.hass, email, password, region) + await async_validate_api(self.hass, email, password, region, timezone) except RegionError: errors["base"] = "region_error" except TimezoneError: @@ -144,6 +151,7 @@ async def async_step_user( }, options={ REGION: region, + TIMEZONE: timezone, POLLING_INTERVAL: 120, } ) @@ -180,6 +188,14 @@ async def async_step_petkit_options(self, user_input=None): ): selector.SelectSelector( selector.SelectSelectorConfig(options=REGIONS_LIST) ), + vol.Required( + TIMEZONE, + default=self.config_entry.options.get( + TIMEZONE, "Set Automatically" + ), + ): selector.SelectSelector( + selector.SelectSelectorConfig(options=TIMEZONES) + ), vol.Required( POLLING_INTERVAL, default=self.config_entry.options.get( diff --git a/custom_components/petkit/const.py b/custom_components/petkit/const.py index cf30631..e65ee03 100644 --- a/custom_components/petkit/const.py +++ b/custom_components/petkit/const.py @@ -29,6 +29,7 @@ PETKIT_COORDINATOR = "petkit_coordinator" POLLING_INTERVAL = "polling_interval" TIMEOUT = 20 +TIMEZONE = "timezone" UPDATE_LISTENER = "update_listener" PETKIT_ERRORS = ( diff --git a/custom_components/petkit/coordinator.py b/custom_components/petkit/coordinator.py index 9f10e78..30e261c 100644 --- a/custom_components/petkit/coordinator.py +++ b/custom_components/petkit/coordinator.py @@ -15,7 +15,7 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed -from .const import DOMAIN, LOGGER, POLLING_INTERVAL, REGION, TIMEOUT +from .const import DOMAIN, LOGGER, POLLING_INTERVAL, REGION, TIMEOUT, TIMEZONE class PetKitDataUpdateCoordinator(DataUpdateCoordinator): @@ -26,12 +26,17 @@ class PetKitDataUpdateCoordinator(DataUpdateCoordinator): def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: """Initialize the PetKit coordinator.""" + if entry.options[TIMEZONE] == "Set Automatically": + tz = None + else: + tz = entry.options[TIMEZONE] try: self.client = PetKitClient( entry.data[CONF_EMAIL], entry.data[CONF_PASSWORD], session=async_get_clientsession(hass), region=entry.options[REGION], + timezone=tz, timeout=TIMEOUT, ) super().__init__( diff --git a/custom_components/petkit/manifest.json b/custom_components/petkit/manifest.json index cc48fca..2f52f35 100644 --- a/custom_components/petkit/manifest.json +++ b/custom_components/petkit/manifest.json @@ -11,8 +11,8 @@ "iot_class": "cloud_polling", "issue_tracker": "https://github.com/RobertD502/home-assistant-petkit/issues", "requirements": [ - "petkitaio==0.1.9", + "petkitaio==0.1.10", "tzlocal>=4.2" ], - "version": "0.1.9.1" + "version": "0.1.10" } diff --git a/custom_components/petkit/timezones.py b/custom_components/petkit/timezones.py new file mode 100644 index 0000000..b67ba9b --- /dev/null +++ b/custom_components/petkit/timezones.py @@ -0,0 +1,635 @@ +"""List of valid timezones that users can use as a fallback if their system timezone isn't recognized by the tzlocal library.""" + +TIMEZONES = [ +"Set Automatically", +"Africa/Abidjan", +"Africa/Accra", +"Africa/Addis_Ababa", +"Africa/Algiers", +"Africa/Asmara", +"Africa/Asmera", +"Africa/Bamako", +"Africa/Bangui", +"Africa/Banjul", +"Africa/Bissau", +"Africa/Blantyre", +"Africa/Brazzaville", +"Africa/Bujumbura", +"Africa/Cairo", +"Africa/Casablanca", +"Africa/Ceuta", +"Africa/Conakry", +"Africa/Dakar", +"Africa/Dar_es_Salaam", +"Africa/Djibouti", +"Africa/Douala", +"Africa/El_Aaiun", +"Africa/Freetown", +"Africa/Gaborone", +"Africa/Harare", +"Africa/Johannesburg", +"Africa/Juba", +"Africa/Kampala", +"Africa/Khartoum", +"Africa/Kigali", +"Africa/Kinshasa", +"Africa/Lagos", +"Africa/Libreville", +"Africa/Lome", +"Africa/Luanda", +"Africa/Lubumbashi", +"Africa/Lusaka", +"Africa/Malabo", +"Africa/Maputo", +"Africa/Maseru", +"Africa/Mbabane", +"Africa/Mogadishu", +"Africa/Monrovia", +"Africa/Nairobi", +"Africa/Ndjamena", +"Africa/Niamey", +"Africa/Nouakchott", +"Africa/Ouagadougou", +"Africa/Porto-Novo", +"Africa/Sao_Tome", +"Africa/Timbuktu", +"Africa/Tripoli", +"Africa/Tunis", +"Africa/Windhoek", +"America/Adak", +"America/Anchorage", +"America/Anguilla", +"America/Antigua", +"America/Araguaina", +"America/Argentina/Buenos_Aires", +"America/Argentina/Catamarca", +"America/Argentina/ComodRivadavia", +"America/Argentina/Cordoba", +"America/Argentina/Jujuy", +"America/Argentina/La_Rioja", +"America/Argentina/Mendoza", +"America/Argentina/Rio_Gallegos", +"America/Argentina/Salta", +"America/Argentina/San_Juan", +"America/Argentina/San_Luis", +"America/Argentina/Tucuman", +"America/Argentina/Ushuaia", +"America/Aruba", +"America/Asuncion", +"America/Atikokan", +"America/Atka", +"America/Bahia", +"America/Bahia_Banderas", +"America/Barbados", +"America/Belem", +"America/Belize", +"America/Blanc-Sablon", +"America/Boa_Vista", +"America/Bogota", +"America/Boise", +"America/Buenos_Aires", +"America/Cambridge_Bay", +"America/Campo_Grande", +"America/Cancun", +"America/Caracas", +"America/Catamarca", +"America/Cayenne", +"America/Cayman", +"America/Chicago", +"America/Chihuahua", +"America/Coral_Harbour", +"America/Cordoba", +"America/Costa_Rica", +"America/Creston", +"America/Cuiaba", +"America/Curacao", +"America/Danmarkshavn", +"America/Dawson", +"America/Dawson_Creek", +"America/Denver", +"America/Detroit", +"America/Dominica", +"America/Edmonton", +"America/Eirunepe", +"America/El_Salvador", +"America/Ensenada", +"America/Fort_Nelson", +"America/Fort_Wayne", +"America/Fortaleza", +"America/Glace_Bay", +"America/Godthab", +"America/Goose_Bay", +"America/Grand_Turk", +"America/Grenada", +"America/Guadeloupe", +"America/Guatemala", +"America/Guayaquil", +"America/Guyana", +"America/Halifax", +"America/Havana", +"America/Hermosillo", +"America/Indiana/Indianapolis", +"America/Indiana/Knox", +"America/Indiana/Marengo", +"America/Indiana/Petersburg", +"America/Indiana/Tell_City", +"America/Indiana/Vevay", +"America/Indiana/Vincennes", +"America/Indiana/Winamac", +"America/Indianapolis", +"America/Inuvik", +"America/Iqaluit", +"America/Jamaica", +"America/Jujuy", +"America/Juneau", +"America/Kentucky/Louisville", +"America/Kentucky/Monticello", +"America/Knox_IN", +"America/Kralendijk", +"America/La_Paz", +"America/Lima", +"America/Los_Angeles", +"America/Louisville", +"America/Lower_Princes", +"America/Maceio", +"America/Managua", +"America/Manaus", +"America/Marigot", +"America/Martinique", +"America/Matamoros", +"America/Mazatlan", +"America/Mendoza", +"America/Menominee", +"America/Merida", +"America/Metlakatla", +"America/Mexico_City", +"America/Miquelon", +"America/Moncton", +"America/Monterrey", +"America/Montevideo", +"America/Montreal", +"America/Montserrat", +"America/Nassau", +"America/New_York", +"America/Nipigon", +"America/Nome", +"America/Noronha", +"America/North_Dakota/Beulah", +"America/North_Dakota/Center", +"America/North_Dakota/New_Salem", +"America/Nuuk", +"America/Ojinaga", +"America/Panama", +"America/Pangnirtung", +"America/Paramaribo", +"America/Phoenix", +"America/Port-au-Prince", +"America/Port_of_Spain", +"America/Porto_Acre", +"America/Porto_Velho", +"America/Puerto_Rico", +"America/Punta_Arenas", +"America/Rainy_River", +"America/Rankin_Inlet", +"America/Recife", +"America/Regina", +"America/Resolute", +"America/Rio_Branco", +"America/Rosario", +"America/Santa_Isabel", +"America/Santarem", +"America/Santiago", +"America/Santo_Domingo", +"America/Sao_Paulo", +"America/Scoresbysund", +"America/Shiprock", +"America/Sitka", +"America/St_Barthelemy", +"America/St_Johns", +"America/St_Kitts", +"America/St_Lucia", +"America/St_Thomas", +"America/St_Vincent", +"America/Swift_Current", +"America/Tegucigalpa", +"America/Thule", +"America/Thunder_Bay", +"America/Tijuana", +"America/Toronto", +"America/Tortola", +"America/Vancouver", +"America/Virgin", +"America/Whitehorse", +"America/Winnipeg", +"America/Yakutat", +"America/Yellowknife", +"Antarctica/Casey", +"Antarctica/Davis", +"Antarctica/DumontDUrville", +"Antarctica/Macquarie", +"Antarctica/Mawson", +"Antarctica/McMurdo", +"Antarctica/Palmer", +"Antarctica/Rothera", +"Antarctica/South_Pole", +"Antarctica/Syowa", +"Antarctica/Troll", +"Antarctica/Vostok", +"Arctic/Longyearbyen", +"Asia/Aden", +"Asia/Almaty", +"Asia/Amman", +"Asia/Anadyr", +"Asia/Aqtau", +"Asia/Aqtobe", +"Asia/Ashgabat", +"Asia/Ashkhabad", +"Asia/Atyrau", +"Asia/Baghdad", +"Asia/Bahrain", +"Asia/Baku", +"Asia/Bangkok", +"Asia/Barnaul", +"Asia/Beirut", +"Asia/Bishkek", +"Asia/Brunei", +"Asia/Calcutta", +"Asia/Chita", +"Asia/Choibalsan", +"Asia/Chongqing", +"Asia/Chungking", +"Asia/Colombo", +"Asia/Dacca", +"Asia/Damascus", +"Asia/Dhaka", +"Asia/Dili", +"Asia/Dubai", +"Asia/Dushanbe", +"Asia/Famagusta", +"Asia/Gaza", +"Asia/Harbin", +"Asia/Hebron", +"Asia/Ho_Chi_Minh", +"Asia/Hong_Kong", +"Asia/Hovd", +"Asia/Irkutsk", +"Asia/Istanbul", +"Asia/Jakarta", +"Asia/Jayapura", +"Asia/Jerusalem", +"Asia/Kabul", +"Asia/Kamchatka", +"Asia/Karachi", +"Asia/Kashgar", +"Asia/Kathmandu", +"Asia/Katmandu", +"Asia/Khandyga", +"Asia/Kolkata", +"Asia/Krasnoyarsk", +"Asia/Kuala_Lumpur", +"Asia/Kuching", +"Asia/Kuwait", +"Asia/Macao", +"Asia/Macau", +"Asia/Magadan", +"Asia/Makassar", +"Asia/Manila", +"Asia/Muscat", +"Asia/Nicosia", +"Asia/Novokuznetsk", +"Asia/Novosibirsk", +"Asia/Omsk", +"Asia/Oral", +"Asia/Phnom_Penh", +"Asia/Pontianak", +"Asia/Pyongyang", +"Asia/Qatar", +"Asia/Qostanay", +"Asia/Qyzylorda", +"Asia/Rangoon", +"Asia/Riyadh", +"Asia/Saigon", +"Asia/Sakhalin", +"Asia/Samarkand", +"Asia/Seoul", +"Asia/Shanghai", +"Asia/Singapore", +"Asia/Srednekolymsk", +"Asia/Taipei", +"Asia/Tashkent", +"Asia/Tbilisi", +"Asia/Tehran", +"Asia/Tel_Aviv", +"Asia/Thimbu", +"Asia/Thimphu", +"Asia/Tokyo", +"Asia/Tomsk", +"Asia/Ujung_Pandang", +"Asia/Ulaanbaatar", +"Asia/Ulan_Bator", +"Asia/Urumqi", +"Asia/Ust-Nera", +"Asia/Vientiane", +"Asia/Vladivostok", +"Asia/Yakutsk", +"Asia/Yangon", +"Asia/Yekaterinburg", +"Asia/Yerevan", +"Atlantic/Azores", +"Atlantic/Bermuda", +"Atlantic/Canary", +"Atlantic/Cape_Verde", +"Atlantic/Faeroe", +"Atlantic/Faroe", +"Atlantic/Jan_Mayen", +"Atlantic/Madeira", +"Atlantic/Reykjavik", +"Atlantic/South_Georgia", +"Atlantic/St_Helena", +"Atlantic/Stanley", +"Australia/ACT", +"Australia/Adelaide", +"Australia/Brisbane", +"Australia/Broken_Hill", +"Australia/Canberra", +"Australia/Currie", +"Australia/Darwin", +"Australia/Eucla", +"Australia/Hobart", +"Australia/LHI", +"Australia/Lindeman", +"Australia/Lord_Howe", +"Australia/Melbourne", +"Australia/NSW", +"Australia/North", +"Australia/Perth", +"Australia/Queensland", +"Australia/South", +"Australia/Sydney", +"Australia/Tasmania", +"Australia/Victoria", +"Australia/West", +"Australia/Yancowinna", +"Brazil/Acre", +"Brazil/DeNoronha", +"Brazil/East", +"Brazil/West", +"CET", +"CST6CDT", +"Canada/Atlantic", +"Canada/Central", +"Canada/Eastern", +"Canada/Mountain", +"Canada/Newfoundland", +"Canada/Pacific", +"Canada/Saskatchewan", +"Canada/Yukon", +"Chile/Continental", +"Chile/EasterIsland", +"Cuba", +"EET", +"EST5EDT", +"Egypt", +"Eire", +"Etc/GMT", +"Etc/GMT+0", +"Etc/GMT+1", +"Etc/GMT+10", +"Etc/GMT+11", +"Etc/GMT+12", +"Etc/GMT+2", +"Etc/GMT+3", +"Etc/GMT+4", +"Etc/GMT+5", +"Etc/GMT+6", +"Etc/GMT+7", +"Etc/GMT+8", +"Etc/GMT+9", +"Etc/GMT-0", +"Etc/GMT-1", +"Etc/GMT-10", +"Etc/GMT-11", +"Etc/GMT-12", +"Etc/GMT-13", +"Etc/GMT-14", +"Etc/GMT-2", +"Etc/GMT-3", +"Etc/GMT-4", +"Etc/GMT-5", +"Etc/GMT-6", +"Etc/GMT-7", +"Etc/GMT-8", +"Etc/GMT-9", +"Etc/GMT0", +"Etc/Greenwich", +"Etc/UCT", +"Etc/UTC", +"Etc/Universal", +"Etc/Zulu", +"Europe/Amsterdam", +"Europe/Andorra", +"Europe/Astrakhan", +"Europe/Athens", +"Europe/Belfast", +"Europe/Belgrade", +"Europe/Berlin", +"Europe/Bratislava", +"Europe/Brussels", +"Europe/Bucharest", +"Europe/Budapest", +"Europe/Busingen", +"Europe/Chisinau", +"Europe/Copenhagen", +"Europe/Dublin", +"Europe/Gibraltar", +"Europe/Guernsey", +"Europe/Helsinki", +"Europe/Isle_of_Man", +"Europe/Istanbul", +"Europe/Jersey", +"Europe/Kaliningrad", +"Europe/Kiev", +"Europe/Kirov", +"Europe/Kyiv", +"Europe/Lisbon", +"Europe/Ljubljana", +"Europe/London", +"Europe/Luxembourg", +"Europe/Madrid", +"Europe/Malta", +"Europe/Mariehamn", +"Europe/Minsk", +"Europe/Monaco", +"Europe/Moscow", +"Europe/Nicosia", +"Europe/Oslo", +"Europe/Paris", +"Europe/Podgorica", +"Europe/Prague", +"Europe/Riga", +"Europe/Rome", +"Europe/Samara", +"Europe/San_Marino", +"Europe/Sarajevo", +"Europe/Saratov", +"Europe/Simferopol", +"Europe/Skopje", +"Europe/Sofia", +"Europe/Stockholm", +"Europe/Tallinn", +"Europe/Tirane", +"Europe/Tiraspol", +"Europe/Ulyanovsk", +"Europe/Uzhgorod", +"Europe/Vaduz", +"Europe/Vatican", +"Europe/Vienna", +"Europe/Vilnius", +"Europe/Volgograd", +"Europe/Warsaw", +"Europe/Zagreb", +"Europe/Zaporozhye", +"Europe/Zurich", +"GB", +"GB-Eire", +"GMT", +"GMT0", +"Greenwich", +"Hongkong", +"Iceland", +"Indian/Antananarivo", +"Indian/Chagos", +"Indian/Christmas", +"Indian/Cocos", +"Indian/Comoro", +"Indian/Kerguelen", +"Indian/Mahe", +"Indian/Maldives", +"Indian/Mauritius", +"Indian/Mayotte", +"Indian/Reunion", +"Iran", +"Israel", +"Jamaica", +"Japan", +"Kwajalein", +"Libya", +"MET", +"MST7MDT", +"Mexico/BajaNorte", +"Mexico/BajaSur", +"Mexico/General", +"NZ", +"NZ-CHAT", +"Navajo", +"PRC", +"PST8PDT", +"Pacific/Apia", +"Pacific/Auckland", +"Pacific/Bougainville", +"Pacific/Chatham", +"Pacific/Chuuk", +"Pacific/Easter", +"Pacific/Efate", +"Pacific/Enderbury", +"Pacific/Fakaofo", +"Pacific/Fiji", +"Pacific/Funafuti", +"Pacific/Galapagos", +"Pacific/Gambier", +"Pacific/Guadalcanal", +"Pacific/Guam", +"Pacific/Honolulu", +"Pacific/Johnston", +"Pacific/Kanton", +"Pacific/Kiritimati", +"Pacific/Kosrae", +"Pacific/Kwajalein", +"Pacific/Majuro", +"Pacific/Marquesas", +"Pacific/Midway", +"Pacific/Nauru", +"Pacific/Niue", +"Pacific/Norfolk", +"Pacific/Noumea", +"Pacific/Pago_Pago", +"Pacific/Palau", +"Pacific/Pitcairn", +"Pacific/Pohnpei", +"Pacific/Ponape", +"Pacific/Port_Moresby", +"Pacific/Rarotonga", +"Pacific/Saipan", +"Pacific/Samoa", +"Pacific/Tahiti", +"Pacific/Tarawa", +"Pacific/Tongatapu", +"Pacific/Truk", +"Pacific/Wake", +"Pacific/Wallis", +"Pacific/Yap", +"Poland", +"Portugal", +"ROK", +"Singapore", +"SystemV/AST4", +"SystemV/AST4ADT", +"SystemV/CST6", +"SystemV/CST6CDT", +"SystemV/EST5", +"SystemV/EST5EDT", +"SystemV/HST10", +"SystemV/MST7", +"SystemV/MST7MDT", +"SystemV/PST8", +"SystemV/PST8PDT", +"SystemV/YST9", +"SystemV/YST9YDT", +"Turkey", +"UCT", +"US/Alaska", +"US/Aleutian", +"US/Arizona", +"US/Central", +"US/East-Indiana", +"US/Eastern", +"US/Hawaii", +"US/Indiana-Starke", +"US/Michigan", +"US/Mountain", +"US/Pacific", +"US/Samoa", +"UTC", +"Universal", +"W-SU", +"WET", +"Zulu", +"EST", +"HST", +"MST", +"ACT", +"AET", +"AGT", +"ART", +"AST", +"BET", +"BST", +"CAT", +"CNT", +"CST", +"CTT", +"EAT", +"ECT", +"IET", +"IST", +"JST", +"MIT", +"NET", +"NST", +"PLT", +"PNT", +"PRT", +"PST", +"SST", +"VST" +] diff --git a/custom_components/petkit/util.py b/custom_components/petkit/util.py index 5799ee5..f3f507f 100644 --- a/custom_components/petkit/util.py +++ b/custom_components/petkit/util.py @@ -13,14 +13,19 @@ from .const import LOGGER, PETKIT_ERRORS, TIMEOUT -async def async_validate_api(hass: HomeAssistant, email: str, password: str, region: str) -> bool: +async def async_validate_api(hass: HomeAssistant, email: str, password: str, region: str, timezone: str) -> bool: """Get data from API.""" + if timezone == "Set Automatically": + tz = None + else: + tz = timezone client = PetKitClient( email, password, session=async_get_clientsession(hass), region=region, + timezone=tz, timeout=TIMEOUT, ) try: @@ -30,7 +35,7 @@ async def async_validate_api(hass: HomeAssistant, email: str, password: str, reg LOGGER.error(f'Could not authenticate on PetKit servers: {err}') raise AuthError(err) except TimezoneError: - error = 'A timezone could not be found. If you are running Home Assistant as a standalone Docker container, you must define the TZ environmental variable.' + error = 'A timezone could not be found. If you are running Home Assistant as a standalone Docker container, you must define the TZ environmental variable. If the TZ variable is defined or you are running Home Assistant OS, your timezone was not found in the tzlocal library - Please manually select a timezone during setup.' LOGGER.error(f'{error}') raise TimezoneError(error) except ServerError as err: