Closed cgraf closed 1 year ago
what car and which vendor and what region ?
can you control your car with one of the following sites ?
Fiat: https://myuconnect.fiat.com/ Jeep: https://myuconnect.jeep.com/ Ram: https://connect.ramtrucks.com/ Dodge: https://connect.dodge.com/ AlfaRomeo: https://myalfaconnect.alfaromeo.com/
Jeep Grand Cherokee 4xe.
Yes with the Jeep site, although flow of hitting https://myuconnect.jeep.com/ goes to https://connect.jeep.com/ -> North America -> US and finally to https://connect.jeep.com/us/en/dashboard. Works there though.
I would be interested to see what response could not be deserialized to JSON from the API request. Usually that is some kind of higher level HTTP error like 401 or 503 prior to the api isn't it?
Hitting https://channels.sdpr-02.fcagcv.com/v4/accounts/<removed>/vehicles?stage=ALL
actually produces a "FORBIDDEN" JSON response, because I don't have a session token in a normal browser session, but it looks like the API is up.
Happy to do some external testing in Postman if you could point me to some API documentation.
Happy to do some external testing in Postman if you could point me to some API documentation.
@cgraf π unfortunately they do not have any docs. im using some internal undocumented apis that have been reverse engineered from the app and website. if you want to dig deeper you can use the browser dev tools and inspect the requests on the uconnect site or the android app with proxy in the middle. for this case browser tools should be sufficient. you cannot use postman because they use a extremely complicated login mechanism with different urls, tokens and even amazon aws identity service is involed. you should see all in the browser dev tools including a request for listing vehicles.
last week there was a issue with jeep in brazil https://github.com/wubbl0rz/FiatChamp/issues/17 maybe they use a different aws region or url for north america. for better debugging i could extend the error message in debug mode with the actual response. let me know what you find out π
edit: it would be great if we can make this work together because i dont have any other car than my fiat 500e (europe). so its difficult for me to test anything else.
if we can make this work together
Sure. I'm committed to trying whatever I can and feeding back anything I find.
inspect the requests on the uconnect site
I'm not sure I'll have time to do a deep dive into reverse engineering this weekend, but might have a look through some of your Cs to figure out what I can. :)
for better debugging i could extend the error message in debug mode with the actual response
That would be a great next step. Let me know when that is ready. Are you going to commit that to main and distribute through normal update, or will I need to do some local hijinks?
yes next update. i think its useful for all π should be easy and only active when debug logging is enabled.
Cool. I'll be watching for it. Maybe also in the debug show the request URL and method if possible.
I'm having the same issue with my Jeep in North America. Same credentials work on the uconnect site, but not via FiatChamp. I am seeing the same API error in the log
I did go ahead and get through the first four steps in Postman. I got everything working up to the Congnito part. Now I understand what the existing debug means, and why the whole thing can't be done in Postman. On Saturday I'll put it in code with some Cognito support and see how much further I get. I did notice in another FIat API project, they were using the real AWS region names in Cognito, like appear in the beginning it IdentityId in the tokenURL response, such as eu-west-1, rather than EUWest1, but I don't know enough about CS to even know what the name is doing there. My IdentityID starts with us-east-1. Probably nothing. I'll play with it some more in a few hours.
3.0.4 now has more debug logs. should now log error message, status code and response body. i suspect that jeep send back "bugged" json thats different from fiat. if you get a json response in the error message pls post it here anonymized :smile:
Just a quick result while I go through it. Response is 200 and JSON is valid. Error persists. It's in this order:
[09:34:53 DBG] {
"IdentityId": "<removed>",
"Token": "<removed>"
}
[09:34:54 WRN] Error connecting to the FIAT API.
This can happen from time to time. Retrying in 15 minutes.
[09:34:54 INF] ERROR: Response could not be deserialized to JSON: GET https://channels.sdpr-02.fcagcv.com/v4/accounts/<removed>/vehicles?stage=ALL
[09:34:54 INF] STATUS: 200
[09:34:54 INF] RESPONSE: <validated JSON>
[09:34:54 INF] Fetching COMPLETED. Next update in 15 minutes.
Ah. The "could not be deserialized" error looks like a Flurl error. Like maybe it is trying to convert something in the response or treating something like an array that is actually a string or vice versa. Appears the comms are fine. Let me compare code and output.
Looks to be something with VehicleResponse, but the only thing you seem to be doing with that is getting the VIN.
vehicleResponse.Vehicles.First().Vin
(object)->vehicles[0]->vin is present in the output, so nothing glaring there except for them being all lowercase in the JSON, but I don't think that matters in Microsoft land.
I think I got the more sensitive bits (UserID and VIN) out of this output, but I may have to come back and edit if I missed something. You should be able to run this through the Flurl parser manually and see where it is complaining.
{
"userid": "12345678901234567890123456789012",
"version": 1667772713470,
"vehicles": [
{
"regStatus": "COMPLETED_STAGE_3",
"color": "BALTIC GREY",
"tsoBodyCode": "",
"year": 2022,
"isCompanyCar": "",
"navEnabledHU": false,
"language": "",
"customerRegStatus": "Y",
"radio": "",
"activationSource": "DEALER",
"nickname": "",
"company": "FCA",
"model": "WLXT74",
"vin": "12345678901234567",
"tcuType": "2",
"make": "Jeep",
"brandCode": "57",
"soldRegion": "NAFTA",
"svla": {
"status": "INACTIVE",
"timestamp": 0
},
"tc": {
"activation": {
"version": "v1.23",
"status": "Accepted"
},
"registration": {
"version": "1.0.0",
"status": "Accepted"
}
},
"market": "US",
"modelDescription": "Grand Cherokee 4xe",
"fuelType": "H",
"tsoModelYear": "",
"sdp": "IGNITE",
"regTimestamp": 1666471789686,
"services": [
{
"vehicleCapable": true,
"service": "SVLAAPP",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "SVLA",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "ROC",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "RDU",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "RDL",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "HUC",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "AOTAC",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "BCALL",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "SOS",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ASSIST",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ECALL",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "HBLF",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ASOS",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "DTC",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_FUEL_FINDER",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_PARKING_FINDER",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_ROUTE_DRM",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_SEARCH",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_SPEED_CAMERA",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_TRAFFIC",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_WEATHER",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "PARENT",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "REOFF",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "REON",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "SDV",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "SQDF",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "TA",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "VF",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "VHSG",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "VRC",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "WIFIHOTSPOT",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "FTD",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "IVA",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "IVM",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "PHEV",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "ALEXAVA",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "WIFIP",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "VHS",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "CNOW",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "CSL",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "CP",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "EVNOT",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ELECPAGES",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ORP",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "GSKILLL",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "LASTMILE",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "AOTACI",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ROAD",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "CARE",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ROCRANKINHIBITON",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ROCRANKINHIBITOFF",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "TA_SUP",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "DRIVEMODES",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "RACEOPTIONS",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "NAV_OB_MOTA_CELL",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_MOTA_WIFI",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_OB_MOTA_WIFI_CELL",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "BRAND",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "DUMMY",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "DEEPREFRESH",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "FRONTSEAT",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "MACMEDIAAPP",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "L2DATALOG",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "L2MAPSGEO",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "L2GPSCORRECTION",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "TUTORIALS",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ORPPLUS",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ADA_TBM",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "NAV_TOMTOM",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ROCLRPERSDATA",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ROC2",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "ADA_UBI",
"serviceEnabled": true
},
{
"vehicleCapable": true,
"service": "CPCHRG2",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "CPA",
"serviceEnabled": false
},
{
"vehicleCapable": true,
"service": "CSEV",
"serviceEnabled": true
},
{
"vehicleCapable": false,
"service": "TRAILERTP",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "KNGLNKOUT",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "DUMMY_EVAS",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "DUMMY_ENHDCAM",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "DUMMY_TECHFEE",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "DUMMY_WIRECAM",
"serviceEnabled": false
},
{
"vehicleCapable": false,
"service": "DUMMY_TRAILERTP",
"serviceEnabled": false
}
],
"privacyMode": "INACTIVE",
"cslProvider": "TOMTOM",
"subMake": "Jeep",
"pp": {
"activation": {
"version": "1.0.0",
"status": "Accepted"
}
},
"enrollmentStatus": "COMPLETE",
"channelFeatures": [
{
"featureCode": "100",
"channels": [
"CWP",
"GMA"
]
},
{
"featureCode": "f_0097_N",
"channels": [
"CWP",
"GMA"
]
}
]
}
]
}
thx for the json output. i think the error is at line 566 when the http client tried to deserialize the response ( https://github.com/wubbl0rz/FiatChamp/blob/master/FiatChampAddon/FiatClient/FiatClient.cs#L566 )
should not be that hard to figure out. i will try to deserialize it by hand as VehicleResponse and see what the actual error from the serializer is.
thats the problem
Error converting value "WLXT74" to type 'System.Int64'. Path 'vehicles[0].model',
fiat model is always a number :smile: sould be easy to fix ... switch from int to string should not break anything.
should work now. pls try 3.0.5.
Just updated to 3.05 and it's working for me. Really appreciate the work to fix this. Thank you! :) FYI I am west coast USA and have 2022 Jeep Grand Cherokee L
Hmm. Not for me I don't think. Got further but still erroring. Looking...
Something related to location it seems. I changed my actual long/lat below, but fairly close
[10:43:24 WRN] Error connecting to the FIAT API.
This can happen from time to time. Retrying in 15 minutes.
[10:43:24 DBG] ERROR: Response could not be deserialized to JSON: GET https://channels.sdpr-02.fcagcv.com/v1/accounts/<removed>/vehicles/<removed>/location/lastknown
[10:43:24 DBG] STATUS: 200
[10:43:24 DBG] RESPONSE: {"timeStamp":1670076291636,"longitude":-95.707932,"latitude"32.536167:,"altitude":null,"bearing":null,"isLocationApprox":false}
[10:43:24 INF] Fetching COMPLETED. Next update in 15 minutes.
Maybe not expecting NULL for altitude and bearing?
I do have refresh location configured off. Retrying.
let me check. but good you find all this bugs :grin:
altitude is a double so null might be a problem ... i dont want to know how many workarounds they have implemented in their app to get all this working :smile: refresh location off does not matter its only for automatic querying new location from the car every N minutes.
No change when location refresh configured ON. Error persists. Altitude and bearing are still NULL.
pls try with 3.0.6
Yuck. I don't have PIN configured in the add-on.
[11:22:13 ERR] Command: DEEPREFRESH ERROR. Maybe wrong pin?
[11:22:13 DBG] Flurl.Http.FlurlHttpException: Call failed with status code 403 (Forbidden): POST https://mfa.fcl-01.fcagcv.com/v1/accounts/<removed>/ignite/pin/authenticate
at Flurl.Http.FlurlRequest.HandleExceptionAsync(FlurlCall call, Exception ex, CancellationToken token)
at Flurl.Http.FlurlRequest.SendAsync(HttpMethod verb, HttpContent content, CancellationToken cancellationToken, HttpCompletionOption completionOption)
at Flurl.Http.FlurlRequest.SendAsync(HttpMethod verb, HttpContent content, CancellationToken cancellationToken, HttpCompletionOption completionOption)
at Flurl.Http.ResponseExtensions.ReceiveJson[T](Task`1 response)
at FiatChamp.FiatClient.SendCommand(String vin, String command, String pin, String action) in /home/runner/work/FiatChamp/FiatChamp/FiatChampAddon/FiatClient/FiatClient.cs:line 529
at Program.<>c__DisplayClass0_0.<<<Main>$>g__TrySendCommand|1>d.MoveNext() in /home/runner/work/FiatChamp/FiatChamp/FiatChampAddon/FiatClient/Program.cs:line 259
[11:22:13 INF] SEND COMMAND VF:
[11:22:13 ERR] Command: VF ERROR. Maybe wrong pin?
[11:22:13 DBG] Flurl.Http.FlurlHttpException: Call failed with status code 403 (Forbidden): POST https://mfa.fcl-01.fcagcv.com/v1/accounts/<removed>/ignite/pin/authenticate
at Flurl.Http.FlurlRequest.HandleExceptionAsync(FlurlCall call, Exception ex, CancellationToken token)
at Flurl.Http.FlurlRequest.SendAsync(HttpMethod verb, HttpContent content, CancellationToken cancellationToken, HttpCompletionOption completionOption)
at Flurl.Http.FlurlRequest.SendAsync(HttpMethod verb, HttpContent content, CancellationToken cancellationToken, HttpCompletionOption completionOption)
at Flurl.Http.ResponseExtensions.ReceiveJson[T](Task`1 response)
at FiatChamp.FiatClient.SendCommand(String vin, String command, String pin, String action) in /home/runner/work/FiatChamp/FiatChamp/FiatChampAddon/FiatClient/FiatClient.cs:line 529
at Program.<>c__DisplayClass0_0.<<<Main>$>g__TrySendCommand|1>d.MoveNext() in /home/runner/work/FiatChamp/FiatChamp/FiatChampAddon/FiatClient/Program.cs:line 259
disable "refresh battery status" and "refresh location"
I have data for the first time! Location and battery have data in HA, so I'm not sure what those refresh settings do, or why changing them fixed the issue.
Documentation says PIN is only needed for write ops.
It looks like HA still creates switches for write ops, but I dare not click them.
nice :+1: i should rename "refresh battery status" and "refresh location" to "FORCE refresh" or something like that. it will actively request new values from the car and consume more battery power. thats why it needs the pin. fiat calls this "commands". if you leave them disabled new data will arrive when the car thinks its a good time to update :smile:
if you like we can make commands work ? thats the only thing i cannot lookup myself without owning a car. because one need to send a command to a real car to see which url and api key is used. all can be seen in browser dev tools i can post a screenshot where to look at.
PS: if no pin is set a "PIN NOT SET" exception should be raised but it looks like thats not the case. i will fix this with next update.
I'll probably mess around with commands.
I think it is cool as a developer to understand user's use-cases, I will tell you that I sought out this add-on because I wanted HA to send a reminder when the EV is at home, battery is not full, and EV is not plugged in. Sometimes we forget to plug it in. Seems like a fairly common use case for people that make it this far in their life instrumentation and automation journey. Strangely it seems like the reminder portion is not yet a commercial feature, at least not for the Stellantis group.
I think it is ok to close this bug, as long as you want me to open new ones for other stuff I find.
alright nice that t works π if you want to lookup command urls and api keys in the browser tools let me know π
Hello,
This looks really cool, but I'm not able to get a successful response. Not sure if there is a way to tell if the problem is on my end or somewhere else. Logging in to Uconnect works fine with my credentials.