Files
mysubaru/consts.go
Alex Savin 152eb2c7b7
All checks were successful
Golan Testing / testing (1.24.x, ubuntu-latest) (push) Successful in 26s
Refactor code structure and remove redundant sections for improved readability and maintainability
2025-07-06 14:23:35 -04:00

414 lines
22 KiB
Go

package mysubaru
var MOBILE_API_VERSION = "/g2v30"
var MOBILE_API_SERVER = map[string]string{
"USA": "https://mobileapi.prod.subarucs.com",
"CAN": "https://mobileapi.ca.prod.subarucs.com",
"TEST": "http://127.0.0.1:56765",
}
var MOBILE_APP = map[string]string{
"USA": "com.subaru.telematics.app.remote",
"CAN": "ca.subaru.telematics.remote",
}
var WEB_API_SERVER = map[string]string{
"USA": "https://www.mysubaru.com",
"CAN": "https://www.mysubaru.ca",
}
var apiURLs = map[string]string{
"WEB_API_LOGIN": "/login",
"WEB_API_LIST_DEVICES": "/listMyDevices.json", // TODO
"WEB_API_AUTHORIZE_DEVICE": "/profile/updateDeviceEntry.json",
"WEB_API_NAME_DEVICE": "/profile/addDeviceName.json",
"WEB_API_EDIT_NAME_DEVICE": "/profile/editDeviceName.json",
"WEB_API_VERIFY_NAME_DEVICE": "/profile/verifyDeviceName.json",
"API_2FA_CONTACT": "/twoStepAuthContacts.json",
"API_2FA_SEND_VERIFICATION": "/twoStepAuthSendVerification.json",
"API_2FA_AUTH_VERIFY": "/twoStepAuthVerify.json",
"API_LOGIN": "/login.json", // Same API for g1 and g2
"API_REFRESH_VEHICLES": "/refreshVehicles.json",
"API_SELECT_VEHICLE": "/selectVehicle.json", // Covered by test
"API_VALIDATE_SESSION": "/validateSession.json", // Covered by test
"API_VEHICLE_STATUS": "/vehicleStatus.json", // Covered by test
"API_AUTHORIZE_DEVICE": "/authenticateDevice.json",
"API_NAME_DEVICE": "/nameThisDevice.json",
"API_VEHICLE_HEALTH": "/vehicleHealth.json", // Covered by test
"API_CONDITION": "/service/api_gen/condition/execute.json", // Similar API for g1 and g2 -- controller should replace 'api_gen' with either 'g1' or 'g2'
"API_LOCATE": "/service/api_gen/locate/execute.json", // Get the last location the vehicle has reported to Subaru
"API_LOCK": "/service/api_gen/lock/execute.json",
"API_LOCK_CANCEL": "/service/api_gen/lock/cancel.json",
"API_UNLOCK": "/service/api_gen/unlock/execute.json",
"API_UNLOCK_CANCEL": "/service/api_gen/unlock/cancel.json",
"API_HORN_LIGHTS": "/service/api_gen/hornLights/execute.json",
"API_HORN_LIGHTS_CANCEL": "/service/api_gen/hornLights/cancel.json",
"API_HORN_LIGHTS_STOP": "/service/api_gen/hornLights/stop.json",
"API_LIGHTS": "/service/api_gen/lightsOnly/execute.json",
"API_LIGHTS_CANCEL": "/service/api_gen/lightsOnly/cancel.json",
"API_LIGHTS_STOP": "/service/api_gen/lightsOnly/stop.json",
"API_G1_LOCATE_UPDATE": "/service/g1/vehicleLocate/execute.json", // Different API for g1 and g2
"API_G1_LOCATE_STATUS": "/service/g1/vehicleLocate/status.json",
"API_G1_HORN_LIGHTS_STATUS": "/service/g1/hornLights/status.json", // g1-Only API
"API_G2_LOCATE_UPDATE": "/service/g2/vehicleStatus/execute.json",
"API_G2_LOCATE_STATUS": "/service/g2/vehicleStatus/locationStatus.json",
"API_REMOTE_SVC_STATUS": "/service/g2/remoteService/status.json",
"API_G2_SEND_POI": "/service/g2/sendPoi/execute.json", // g2-Only API
"API_G2_SPEEDFENCE": "/service/g2/speedFence/execute.json",
"API_G2_GEOFENCE": "/service/g2/geoFence/execute.json",
"API_G2_CURFEW": "/service/g2/curfew/execute.json",
"API_G2_REMOTE_ENGINE_START": "/service/g2/engineStart/execute.json",
"API_G2_REMOTE_ENGINE_START_CANCEL": "/service/g2/engineStart/cancel.json",
"API_G2_REMOTE_ENGINE_STOP": "/service/g2/engineStop/execute.json",
"API_G2_FETCH_RES_QUICK_START_SETTINGS": "/service/g2/remoteEngineQuickStartSettings/fetch.json",
"API_G2_FETCH_RES_USER_PRESETS": "/service/g2/remoteEngineStartSettings/fetch.json",
"API_G2_FETCH_RES_SUBARU_PRESETS": "/service/g2/climatePresetSettings/fetch.json",
"API_G2_SAVE_RES_SETTINGS": "/service/g2/remoteEngineStartSettings/save.json",
"API_G2_SAVE_RES_QUICK_START_SETTINGS": "/service/g2/remoteEngineQuickStartSettings/save.json",
"API_EV_CHARGE_NOW": "/service/g2/phevChargeNow/execute.json", // EV-Only API
"API_EV_FETCH_CHARGE_SETTINGS": "/service/g2/phevGetTimerSettings/execute.json",
"API_EV_SAVE_CHARGE_SETTINGS": "/service/g2/phevSendTimerSetting/execute.json",
"API_EV_DELETE_CHARGE_SCHEDULE": "/service/g2/phevDeleteTimerSetting/execute.json",
// "API_G2_FETCH_CLIMATE_SETTINGS": "/service/g2/remoteEngineStart/fetch.json",
// "API_G2_SAVE_CLIMATE_SETTINGS": "/service/g2/remoteEngineStart/save.json",
}
// TODO: Get back and add wrapper to support Feature List
// API_VEHICLE_FEATURES items that determine available functionality
// 11.6MMAN ABS_MIL ACCS AHBL_MIL ATF_MIL AWD_MIL BSD BSDRCT_MIL CEL_MIL EBD_MIL EOL_MIL EPAS_MIL EPB_MIL ESS_MIL EYESIGHT ISS_MIL NAV_TOMTOM OPL_MIL RAB_MIL RCC REARBRK RES RESCC RHSF RPOI RPOIA SRS_MIL TEL_MIL TIF_35 TIR_33 TPMS_MIL VDC_MIL WASH_MIL g2
// ABS_MIL ACCS AHBL_MIL ATF_MIL AWD_MIL BSD BSDRCT_MIL CEL_MIL EBD_MIL EOL_MIL EPAS_MIL EPB_MIL ESS_MIL EYESIGHT ISS_MIL OPL_MIL PANPM-TUIRWAOC PWAAADWWAP RAB_MIL RCC REARBRK RES RESCC RHSF RPOI RPOIA RTGU RVFS SRH_MIL SRS_MIL TEL_MIL TIF_35 TIR_33 TLD TPMS_MIL VALET VDC_MIL WASH_MIL g3
// var apiFeatures = map[string]string{
// "API_FEATURE_PHEV": "PHEV",
// "API_FEATURE_REMOTE_START": "RES",
// "API_FEATURE_REMOTE": "REMOTE",
// "API_FEATURE_SAFETY": "SAFETY",
// "API_FEATURE_ACTIVE": "ACTIVE",
// "API_FEATURE_MOONROOF_PANORAMIC": "PANPM-DG2G",
// "API_FEATURE_MOONROOF_POWER": "PANPM-TUIRWAOC",
// "API_FEATURE_POWER_WINDOWS": "PWAAADWWAP",
// "API_FEATURE_FRONT_TIRE_RECOMMENDED_PRESSURE_PREFIX": "TIF_",
// "API_FEATURE_REAR_TIRE_RECOMMENDED_PRESSURE_PREFIX": "TIR_",
// "API_FEATURE_G1_TELEMATICS": "g1",
// "API_FEATURE_G2_TELEMATICS": "g2",
// "API_FEATURE_G3_TELEMATICS": "g3",
// }
var API_ERRORS = map[string]string{
"403-soa-unableToParseResponseBody": "ERROR_SOA_403", // G2 Error Codes
"InvalidCredentials": "ERROR_INVALID_CREDENTIALS",
"ServiceAlreadyStarted": "ERROR_SERVICE_ALREADY_STARTED",
"invalidAccount": "ERROR_INVALID_ACCOUNT",
"passwordWarning": "ERROR_PASSWORD_WARNING",
"accountLocked": "ERROR_ACCOUNT_LOCKED",
"noVehiclesOnAccount": "ERROR_NO_VEHICLES",
"noVehiclesAvailable": "ERROR_NO_VEHICLE_AVAILABLE",
"VEHICLESETUPERROR": "ERROR_VEHICLE_SETUP_ERROR", // Vehicle Select
"accountNotFound": "ERROR_NO_ACCOUNT",
"tooManyAttempts": "ERROR_TOO_MANY_ATTEMPTS",
"vehicleNotInAccount": "ERROR_VEHICLE_NOT_IN_ACCOUNT",
"SXM40004": "ERROR_G1_NO_SUBSCRIPTION", // G1 Error Codes
"SXM40005": "ERROR_G1_STOLEN_VEHICLE",
"SXM40006": "ERROR_G1_INVALID_PIN",
"SXM40009": "ERROR_G1_SERVICE_ALREADY_STARTED",
"SXM40017": "ERROR_G1_PIN_LOCKED",
}
var APP_ERRORS = map[string]string{
"SUBSCRIBTION_REQUIRED": "active STARLINK Security Plus subscription required",
}
// TODO: Get back and add error wrapper
// var apiErrors = map[string]string{
// "ERROR_SOA_403": "403-soa-unableToParseResponseBody", // G2 Error Codes
// "ERROR_INVALID_CREDENTIALS": "InvalidCredentials",
// "ERROR_SERVICE_ALREADY_STARTED": "ServiceAlreadyStarted",
// "ERROR_INVALID_ACCOUNT": "invalidAccount",
// "ERROR_PASSWORD_WARNING": "passwordWarning",
// "ERROR_ACCOUNT_LOCKED": "accountLocked",
// "ERROR_NO_VEHICLES": "noVehiclesOnAccount",
// "ERROR_NO_ACCOUNT": "accountNotFound",
// "ERROR_TOO_MANY_ATTEMPTS": "tooManyAttempts",
// "ERROR_VEHICLE_NOT_IN_ACCOUNT": "vehicleNotInAccount",
// "ERROR_G1_NO_SUBSCRIPTION": "SXM40004", // G1 Error Codes
// "ERROR_G1_STOLEN_VEHICLE": "SXM40005",
// "ERROR_G1_INVALID_PIN": "SXM40006",
// "ERROR_G1_SERVICE_ALREADY_STARTED": "SXM40009",
// "ERROR_G1_PIN_LOCKED": "SXM40017",
// }
// ABS_MIL ACCS AHBL_MIL ATF_MIL AWD_MIL BSD BSDRCT_MIL CEL_MIL EBD_MIL EOL_MIL EPAS_MIL EPB_MIL ESS_MIL EYESIGHT ISS_MIL OPL_MIL PANPM-TUIRWAOC PWAAADWWAP RAB_MIL RCC REARBRK RES RESCC RHSF RPOI RPOIA RTGU RVFS SRH_MIL SRS_MIL TEL_MIL TIF_35 TIR_33 TLD TPMS_MIL VALET VDC_MIL WASH_MIL g3
// 11.6MMAN ABS_MIL ACCS AHBL_MIL ATF_MIL AWD_MIL BSD BSDRCT_MIL CEL_MIL EBD_MIL EOL_MIL EPAS_MIL EPB_MIL ESS_MIL EYESIGHT ISS_MIL NAV_TOMTOM OPL_MIL RAB_MIL RCC REARBRK RES RESCC RHSF RPOI RPOIA SRS_MIL TEL_MIL TIF_35 TIR_33 TPMS_MIL VDC_MIL WASH_MIL g2
var features = map[string]string{
"g1": "Generation #1",
"g2": "Generation #2",
"g3": "Generation #3",
"BSD": "Blind-Spot Detection",
"RHSF": "Rear High-Speed Function / Reverse Automatic Braking / Rear Cross-Traffic Alert",
"11.6MMAN": "11.6-inch Infotainment System",
"EYESIGHT": "EyeSight Exclusive Advanced Driver-Assist System",
"NAV_TOMTOM": "TomTom Navigation",
"PWAAADWWAP": "Power Windows",
"PANPM-TUIRWAOC": "Power Moonroof",
"PANPM-DG2G": "Panoramic Moonroof",
"PHEV": "Electric Vehicle",
"RES": "Remote Start",
"REARBRK": "Reverse Auto Braking",
"TIF_35": "Tire Pressure Front 35",
"TIR_33": "Tire Pressure Rear 35",
"VALET": "Valet Parking",
"RES_HVAC_HFS": "Heated Front Seats",
"RES_HVAC_VFS": "Vented Front Seats",
"RESCC": "Remote Engine Start with Climate Control",
"RCC": "Remote Climate Control",
"ACCS": "Adaptive Cruise Control",
"SXM360L": "SiriusXM with 360L",
}
var troubles = map[string]string{
"SRS_MIL": "Airbag System",
"AWD_MIL": "All-Wheel Drive / Symmetrical Full-Time ",
"ABS_MIL": "Anti-Lock Braking System",
"ISS_MIL": "Auto Start Stop (Idling Stop System)",
"AHBL_MIL": "Automatic Headlight Beam Leveler",
"ATF_MIL": "Automatic Transmission Oil Temperature",
"EBD_MIL": "Brake System / Electronic Brake Force Distribution",
"BSDRCT_MIL": "Blind-Spot Detection",
"CEL_MIL": "Check Engine Light",
"EOL_MIL": "Engine Oil Level",
"ESS_MIL": "EyeSight Exclusive Advanced Driver-Assist System",
"TEL_MIL": "MySubau Emergency Services",
"EPB_MIL": "Parking Brake",
"OPL_MIL": "Oil Pressure",
"EPAS_MIL": "Power Steering / Electric Power Assisted Steering",
"RAB_MIL": "Reverse Auto Braking",
"SRH_MIL": "Steering Responsive Headlights (SRH)",
"TPMS_MIL": "Tire Pressure",
"VDC_MIL": "Vehicle Dynamics Control",
"WASH_MIL": "Windshield Washer Fluid Level",
}
var badValues = []any{
"NOT_EQUIPPED",
"UNKNOWN",
"None",
"16383",
"65535",
"-64",
"",
0,
float64(0),
nil}
// var modelCodes = map[string]string{
// "PDL": "Subaru Outback Touring XT",
// "LDJ": "Subaru Outback Limited XT",
// "KDF": "Outback 2.5i Limited",
// "LDD": "Outback Premium",
// "PDG": "Outback Touring",
// "KFB": "Forester Base Model",
// "HFJ": "Forester 2.5i Touring",
// "KFJ": "Forester Touring",
// "KAF": "Legacy 2.5i Limited",
// "KLF": "Impreza 2.0i Sport",
// "LRD": "Crosstrek Premium",
// "KRD": "Crosstrek 2.0i Premium",
// "PCL": "Ascent Limited 7-Passenger",
// }
// var badValues = map[string]any{
// "remainingFuelPercent": 101,
// "tyreStatusFrontLeft": "UNKNOWN",
// "tyreStatusFrontRight": "UNKNOWN",
// "tyreStatusRearLeft": "UNKNOWN",
// "tyreStatusRearRight": "UNKNOWN",
// }
const (
GET = "GET"
POST = "POST"
SERVICE_REQ_ID = "serviceRequestId"
TEMP_F = "climateZoneFrontTemp" // Remote start constants
TEMP_F_MAX = 85
TEMP_F_MIN = 60
TEMP_C = "climateZoneFrontTempCelsius"
TEMP_C_MAX = 30
TEMP_C_MIN = 15
CLIMATE = "climateSettings"
CLIMATE_DEFAULT = "climateSettings"
RUNTIME = "runTimeMinutes"
RUNTIME_DEFAULT = "10"
MODE = "climateZoneFrontAirMode"
MODE_DEFROST = "WINDOW"
MODE_FEET_DEFROST = "FEET_WINDOW"
MODE_FACE = "FACE"
MODE_FEET = "FEET"
MODE_SPLIT = "FEET_FACE_BALANCED"
MODE_AUTO = "AUTO"
HEAT_SEAT_LEFT = "heatedSeatFrontLeft"
HEAT_SEAT_RIGHT = "heatedSeatFrontRight"
HEAT_SEAT_HI = "HIGH_HEAT"
HEAT_SEAT_MED = "MEDIUM_HEAT"
HEAT_SEAT_LOW = "LOW_HEAT"
HEAT_SEAT_OFF = "OFF"
REAR_DEFROST = "heatedRearWindowActive"
REAR_DEFROST_ON = "true"
REAR_DEFROST_OFF = "false"
FAN_SPEED = "climateZoneFrontAirVolume"
FAN_SPEED_LOW = "2"
FAN_SPEED_MED = "4"
FAN_SPEED_HI = "7"
FAN_SPEED_AUTO = "AUTO"
RECIRCULATE = "outerAirCirculation"
RECIRCULATE_OFF = "outsideAir"
RECIRCULATE_ON = "recirculation"
REAR_AC = "airConditionOn"
REAR_AC_ON = "true"
REAR_AC_OFF = "false"
START_CONFIG = "startConfiguration"
START_CONFIG_DEFAULT_EV = "start_Climate_Control_only_allow_key_in_ignition"
START_CONFIG_DEFAULT_RES = "START_ENGINE_ALLOW_KEY_IN_IGNITION"
WHICH_DOOR = "unlockDoorType" // Unlock doors constants
ALL_DOORS = "ALL_DOORS_CMD"
DRIVERS_DOOR = "FRONT_LEFT_DOOR_CMD"
HEADING = "heading" // Location data constants
LATITUDE = "latitude"
LONGITUDE = "longitude"
LOCATION_TIME = "locationTimestamp"
SPEED = "speed"
BAD_LATITUDE = 90.0
BAD_LONGITUDE = 180.0
AVG_FUEL_CONSUMPTION = "AVG_FUEL_CONSUMPTION" // Vehicle status constants
BATTERY_VOLTAGE = "BATTERY_VOLTAGE" // NO LONGER
DIST_TO_EMPTY = "DISTANCE_TO_EMPTY_FUEL"
DOOR_BOOT_POSITION = "DOOR_BOOT_POSITION"
DOOR_ENGINE_HOOD_POSITION = "DOOR_ENGINE_HOOD_POSITION"
DOOR_FRONT_LEFT_POSITION = "DOOR_FRONT_LEFT_POSITION"
DOOR_FRONT_RIGHT_POSITION = "DOOR_FRONT_RIGHT_POSITION"
DOOR_REAR_LEFT_POSITION = "DOOR_REAR_LEFT_POSITION"
DOOR_REAR_RIGHT_POSITION = "DOOR_REAR_RIGHT_POSITION"
EV_CHARGER_STATE_TYPE = "EV_CHARGER_STATE_TYPE"
EV_CHARGE_SETTING_AMPERE_TYPE = "EV_CHARGE_SETTING_AMPERE_TYPE"
EV_CHARGE_VOLT_TYPE = "EV_CHARGE_VOLT_TYPE"
EV_DISTANCE_TO_EMPTY = "EV_DISTANCE_TO_EMPTY"
EV_IS_PLUGGED_IN = "EV_IS_PLUGGED_IN"
EV_STATE_OF_CHARGE_MODE = "EV_STATE_OF_CHARGE_MODE"
EV_STATE_OF_CHARGE_PERCENT = "EV_STATE_OF_CHARGE_PERCENT"
EV_TIME_TO_FULLY_CHARGED = "EV_TIME_TO_FULLY_CHARGED"
EV_TIME_TO_FULLY_CHARGED_UTC = "EV_TIME_TO_FULLY_CHARGED_UTC"
EXTERNAL_TEMP = "EXT_EXTERNAL_TEMP"
ODOMETER = "ODOMETER"
POSITION_TIMESTAMP = "POSITION_TIMESTAMP"
TIMESTAMP = "TIMESTAMP"
TIRE_PRESSURE_FL = "TYRE_PRESSURE_FRONT_LEFT"
TIRE_PRESSURE_FR = "TYRE_PRESSURE_FRONT_RIGHT"
TIRE_PRESSURE_RL = "TYRE_PRESSURE_REAR_LEFT"
TIRE_PRESSURE_RR = "TYRE_PRESSURE_REAR_RIGHT"
VEHICLE_STATE = "VEHICLE_STATE_TYPE"
WINDOW_FRONT_LEFT_STATUS = "WINDOW_FRONT_LEFT_STATUS"
WINDOW_FRONT_RIGHT_STATUS = "WINDOW_FRONT_RIGHT_STATUS"
WINDOW_REAR_LEFT_STATUS = "WINDOW_REAR_LEFT_STATUS"
WINDOW_REAR_RIGHT_STATUS = "WINDOW_REAR_RIGHT_STATUS"
CHARGING = "CHARGING"
LOCKED_CONNECTED = "LOCKED_CONNECTED"
UNLOCKED_CONNECTED = "UNLOCKED_CONNECTED"
DOOR_OPEN = "OPEN"
DOOR_CLOSED = "CLOSED"
WINDOW_OPEN = "OPEN"
WINDOW_CLOSED = "CLOSE"
IGNITION_ON = "IGNITION_ON"
NOT_EQUIPPED = "NOT_EQUIPPED"
VS_AVG_FUEL_CONSUMPTION = "avgFuelConsumptionLitersPer100Kilometers" // vehicleStatus.json keys
VS_DIST_TO_EMPTY = "distanceToEmptyFuelKilometers"
VS_TIMESTAMP = "eventDate"
VS_LATITUDE = "latitude"
VS_LONGITUDE = "longitude"
VS_HEADING = "positionHeadingDegree"
VS_ODOMETER = "odometerValueKilometers"
VS_VEHICLE_STATE = "vehicleStateType"
VS_TIRE_PRESSURE_FL = "tirePressureFrontLeft"
VS_TIRE_PRESSURE_FR = "tirePressureFrontRight"
VS_TIRE_PRESSURE_RL = "tirePressureRearLeft"
VS_TIRE_PRESSURE_RR = "tirePressureRearRight"
BAD_AVG_FUEL_CONSUMPTION = "16383" // Erroneous Values
BAD_DISTANCE_TO_EMPTY_FUEL = "16383"
BAD_EV_TIME_TO_FULLY_CHARGED = "65535"
BAD_TIRE_PRESSURE = "32767"
BAD_ODOMETER = "None"
BAD_EXTERNAL_TEMP = "-64.0"
UNKNOWN = "UNKNOWN"
VENTED = "VENTED"
LOCATION_VALID = "location_valid"
TIMESTAMP_FMT = "%Y-%m-%dT%H:%M:%S%z" // "2020-04-25T23:35:55+0000" // Timestamp Formats
POSITION_TIMESTAMP_FMT = "%Y-%m-%dT%H:%M:%SZ" // "2020-04-25T23:35:55Z"
ERROR_SOA_403 = "403-soa-unableToParseResponseBody" // G2 Error Codes
ERROR_SOA_404 = "404-soa-unableToParseResponseBody" // Bad request body
ERROR_INVALID_CREDENTIALS = "InvalidCredentials"
ERROR_SERVICE_ALREADY_STARTED = "ServiceAlreadyStarted"
ERROR_INVALID_ACCOUNT = "invalidAccount"
ERROR_PASSWORD_WARNING = "passwordWarning"
ERROR_ACCOUNT_LOCKED = "accountLocked"
ERROR_NO_VEHICLES = "noVehiclesOnAccount"
ERROR_NO_ACCOUNT = "accountNotFound"
ERROR_TOO_MANY_ATTEMPTS = "tooManyAttempts"
ERROR_VEHICLE_NOT_IN_ACCOUNT = "vehicleNotInAccount"
ERROR_G1_NO_SUBSCRIPTION = "SXM40004" // G1 Error Codes
ERROR_G1_STOLEN_VEHICLE = "SXM40005"
ERROR_G1_INVALID_PIN = "SXM40006"
ERROR_G1_SERVICE_ALREADY_STARTED = "SXM40009"
ERROR_G1_PIN_LOCKED = "SXM40017"
VEHICLE_ATTRIBUTES = "attributes" // Controller Vehicle Data Dict Keys
VEHICLE_STATUS = "status"
VEHICLE_ID = "id"
VEHICLE_NAME = "nickname"
VEHICLE_API_GEN = "api_gen"
VEHICLE_LOCK = "lock"
VEHICLE_LAST_UPDATE = "last_update_time"
VEHICLE_LAST_FETCH = "last_fetch_time"
VEHICLE_FEATURES = "features"
VEHICLE_SUBSCRIPTION_FEATURES = "subscriptionFeatures"
VEHICLE_SUBSCRIPTION_STATUS = "subscriptionStatus"
FEATURE_PHEV = "PHEV"
FEATURE_REMOTE_START = "RES"
FEATURE_G1_TELEMATICS = "g1" // Vehicle has 2016-2018 telematics version.
FEATURE_G2_TELEMATICS = "g2" // Vehicle has 2019+ telematics version.
FEATURE_G3_TELEMATICS = "g3" // Vehicle has 2019+ telematics version.
FEATURE_REMOTE = "REMOTE"
FEATURE_SAFETY = "SAFETY"
FEATURE_ACTIVE = "ACTIVE"
DEFAULT_UPDATE_INTERVAL = 7200
DEFAULT_FETCH_INTERVAL = 300
// VALID_CLIMATE_OPTIONS = {
// CLIMATE: [CLIMATE_DEFAULT],
// TEMP_C: [str(_) for _ in range(TEMP_C_MIN, TEMP_C_MAX + 1)],
// TEMP_F: [str(_) for _ in range(TEMP_F_MIN, TEMP_F_MAX + 1)],
// FAN_SPEED: [FAN_SPEED_AUTO, FAN_SPEED_LOW, FAN_SPEED_MED, FAN_SPEED_HI],
// HEAT_SEAT_LEFT: [HEAT_SEAT_OFF, HEAT_SEAT_LOW, HEAT_SEAT_MED, HEAT_SEAT_HI],
// HEAT_SEAT_RIGHT: [HEAT_SEAT_OFF, HEAT_SEAT_LOW, HEAT_SEAT_MED, HEAT_SEAT_HI],
// MODE: [
// MODE_DEFROST,
// MODE_FEET_DEFROST,
// MODE_FACE,
// MODE_FEET,
// MODE_SPLIT,
// MODE_AUTO,
// ],
// RECIRCULATE: [RECIRCULATE_OFF, RECIRCULATE_ON],
// REAR_AC: [REAR_AC_OFF, REAR_AC_ON],
// REAR_DEFROST: [REAR_DEFROST_OFF, REAR_DEFROST_ON],
// START_CONFIG: [START_CONFIG_DEFAULT_EV, START_CONFIG_DEFAULT_RES],
// RUNTIME: [str(RUNTIME_DEFAULT)],
// }
// BAD_SENSOR_VALUES = [
// BAD_AVG_FUEL_CONSUMPTION,
// BAD_DISTANCE_TO_EMPTY_FUEL,
// BAD_EV_TIME_TO_FULLY_CHARGED,
// BAD_TIRE_PRESSURE,
// BAD_ODOMETER,
// BAD_EXTERNAL_TEMP,
// ]
// BAD_BINARY_SENSOR_VALUES = [UNKNOWN, VENTED, NOT_EQUIPPED]
)