Timezoned (#19960)
	
		
	
				
					
				
			* untested code * add to manager * whitespace * only save on fix * cleanup * fix typo * add to ignored processes * import tici * fix param name * cleanup * only run offroad * use itertools * wait for thermald * simpler * fall back to api call * add param to override timezone Co-authored-by: Comma Device <device@comma.ai>pull/59/head
							parent
							
								
									3dc45554d7
								
							
						
					
					
						commit
						4c04e220a1
					
				
				 7 changed files with 732 additions and 568 deletions
			
			
		
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,78 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import time | ||||||
|  | import json | ||||||
|  | import subprocess | ||||||
|  | 
 | ||||||
|  | import requests | ||||||
|  | from timezonefinder import TimezoneFinder | ||||||
|  | 
 | ||||||
|  | from common.params import Params | ||||||
|  | from selfdrive.swaglog import cloudlog | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def set_timezone(valid_timezones, timezone): | ||||||
|  |   if timezone not in valid_timezones: | ||||||
|  |     cloudlog.error(f"Timezone not supported {timezone}") | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  |   cloudlog.info(f"Setting timezone to {timezone}") | ||||||
|  |   try: | ||||||
|  |     subprocess.check_call(f'sudo timedatectl set-timezone {timezone}', shell=True) | ||||||
|  |   except subprocess.CalledProcessError: | ||||||
|  |     cloudlog.exception(f"Error setting timezone to {timezone}") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |   params = Params() | ||||||
|  |   tf = TimezoneFinder() | ||||||
|  | 
 | ||||||
|  |   # Get allowed timezones | ||||||
|  |   valid_timezones = subprocess.check_output('timedatectl list-timezones', shell=True, encoding='utf8').strip().split('\n') | ||||||
|  | 
 | ||||||
|  |   while True: | ||||||
|  |     time.sleep(60) | ||||||
|  | 
 | ||||||
|  |     is_onroad = params.get("IsOffroad") != b"1" | ||||||
|  |     if is_onroad: | ||||||
|  |       continue | ||||||
|  | 
 | ||||||
|  |     # Set based on param | ||||||
|  |     timezone = params.get("Timezone", encoding='utf8') | ||||||
|  |     if timezone is not None: | ||||||
|  |       cloudlog.info("Setting timezone based on param") | ||||||
|  |       set_timezone(valid_timezones, timezone) | ||||||
|  |       continue | ||||||
|  | 
 | ||||||
|  |     location = params.get("LastGPSPosition", encoding='utf8') | ||||||
|  | 
 | ||||||
|  |     # Find timezone based on IP geolocation if no gps location is available | ||||||
|  |     if location is None: | ||||||
|  |       cloudlog.info("Setting timezone based on IP lookup") | ||||||
|  |       try: | ||||||
|  |         r = requests.get("https://ipapi.co/timezone", timeout=10) | ||||||
|  |         if r.status_code == 200: | ||||||
|  |           set_timezone(valid_timezones, r.text) | ||||||
|  |         else: | ||||||
|  |           cloudlog.error(f"Unexpected status code from api {r.status_code}") | ||||||
|  |       except requests.exceptions.RequestException: | ||||||
|  |         cloudlog.exception("Error getting timezone based on IP") | ||||||
|  |         continue | ||||||
|  | 
 | ||||||
|  |     # Find timezone by reverse geocoding the last known gps location | ||||||
|  |     else: | ||||||
|  |       cloudlog.info("Setting timezone based on GPS location") | ||||||
|  |       try: | ||||||
|  |         location = json.loads(location) | ||||||
|  |       except Exception: | ||||||
|  |         cloudlog.exception("Error parsing location") | ||||||
|  |         continue | ||||||
|  | 
 | ||||||
|  |       timezone = tf.timezone_at(lng=location['longitude'], lat=location['latitude']) | ||||||
|  |       if timezone is None: | ||||||
|  |         cloudlog.error(f"No timezone found based on location, {location}") | ||||||
|  |         continue | ||||||
|  |       set_timezone(valid_timezones, timezone) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |   main() | ||||||
					Loading…
					
					
				
		Reference in new issue