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/214/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