Giter Site home page Giter Site logo

carwings's Introduction

[github.com]
Login: joeshaw                   Name: Joe Shaw
Directory: /home/joeshaw         Shell: /bin/bash
On since Thu Dec 11 10:16 2008 (EST) on :0 from :0
Unread mail since Sun Dec 22 19:40:55 1996
Project:
Developing software at @fastly.  Some personal open source projects can 
be found below.  Please visit my World Wide Web "home page" at
https://joeshaw.org.
No Plan.

carwings's People

Contributors

andig avatar joeshaw avatar jrester avatar karora avatar ple34 avatar pnlrogue1 avatar stelian42 avatar winterhalder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

carwings's Issues

Json error on status

I'm not sure if this is related to issue #3 or not but I'm getting an error when running status. This is on an 2013 SL in North America.

output.txt

Timed climate control

I'd like to implement the scheduled start of climate control (you can tell its getting colder here!).

The additional API calls required can be plagerised from https://gitlab.com/tobiaswkjeldsen/dartcarwings

So then the commands need to be created. The climate-on command could be reused - if it has a timespec added then it i scheduled rather than immediate. However I am tending more towards climate-on-at, or possibly climate-scheduled-at which is long and hard to type (but then leads naturally to the additional commands climate-schedule-status and climate-schedule-cancel

Ideally I'd like the timespec to be handled in a similar fashion to the unix at command (see Specifying Time in https://www.computerhope.com/unix/uat.htm ), but that really needs a usable go module that does mostly the right thing - any suggestions?

Any comments before I go ahead?

-- Nigel

-2010 (INVALID PARAMS)

I just started using this a couple days ago and it was working fine for me in the US but using the "NE" region code. Now starting yesterday I'm getting this error when trying to perform an update.

ERROR: received status code -2010 (INVALID PARAMS)

However, if I place the program in debug mode it seems to be getting the proper JSON data back but keeps looping the same request over and over again. Maybe the response from the API has slightly changed and you need to update your program accordingly?

I have tried the default US region code and that has always given me a "timed out" error.

Here's an example of the debug response I'm seeing:

+POST https://gdcportalgw.its-mo.com/api_v190426_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[REMOVED] custom_sessionid:[REMOVED] tz:[America/New_York]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Mon, 30 Sep 2019 12:25:32 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

2fe
{"status":200,"VoltLabel":{"HighVolt":"240","LowVolt":"120"},"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/09\/30 08:23","BatteryStatus":{"BatteryChargingStatus":"NOT_CHARGING","BatteryCapacity":"240","BatteryRemainingAmount":"216","BatteryRemainingAmountWH":"34960","BatteryRemainingAmountkWH":"","SOC":{"Value":"90"}},"PluginState":"NOT_CONNECTED","CruisingRangeAcOn":"222000","CruisingRangeAcOff":"242000","TimeRequiredToFull":{"HourRequiredToFull":"5","MinutesRequiredToFull":"30"},"TimeRequiredToFull200":{"HourRequiredToFull":"2","MinutesRequiredToFull":"30"},"TimeRequiredToFull200_6kW":{"HourRequiredToFull":"1","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/09\/30 12:23","TargetDate":"2019\/09\/30 12:23"}}
0

INVALID PARAMS again in EU

I know this was recently addressed in #34 , something seems fishy again. I'm not sure if it's me, although I'm not trying to do anything complicated.

Setup:
New docker container, Go 1.15.12

$ go get -v github.com/joeshaw/carwings/cmd/carwings2

$ /root/go/bin/carwings -username 'XXXXX' -password 'XXXXX' -region NE -debug battery
Logging into Carwings...
POST /api_v200413_NE/gdc/InitialApp_v2.php HTTP/1.1
Host: gdcportalgw.its-mo.com
Content-Length: 38
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip

initial_app_str=9s5rfKVuMrT03RtzajWNcA

HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Wed, 12 May 2021 17:04:01 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"88dSp7wWnV3bvv9Z88zEwg"}
0



Error loading session from /root/.carwings-session: open /root/.carwings-session: no such file or directory
POST /api_v200413_NE/gdc/UserLoginRequest.php HTTP/1.1
Host: gdcportalgw.its-mo.com
Content-Length: 128
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip

Password=XXXXX&RegionCode=NE&UserId=XXXXX&initial_app_str=9s5rfKVuMrT03RtzajWNcA

HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Wed, 12 May 2021 17:04:02 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

2d
{"status":"-2010","message":"INVALID PARAMS"}
0



ERROR: received status code -2010 (INVALID PARAMS)

Happy to do lots of debugging and digging, just not sure where to start :)

BatteryStatus() fails because BatteryRemainingAmountWH is an empty string

Error

When calling BatteryStatus the function returns an error with the message ERROR: json: invalid use of ,string struct tag, trying to unmarshal "" into int. This happens because the BatteryRemainingAmountWH field of the response for my nissan leaf is an empty string which cannot be parsed to an valid integer.

Response

I am receiving this response:

{
   "OperationResult":"START",
   "OperationDateAndTime":"2021\/06\/01 16:39",
   "BatteryStatus":{
      "BatteryChargingStatus":"NOT_CHARGING",
      "BatteryCapacity":"10",
      "BatteryRemainingAmount":"9",
      "BatteryRemainingAmountWH":"",
      "BatteryRemainingAmountkWH":""
   },
   "PluginState":"CONNECTED",
   "CruisingRangeAcOn":"78848.0",
   "CruisingRangeAcOff":"85888.0",
   "TimeRequiredToFull":{
      "HourRequiredToFull":"3",
      "MinutesRequiredToFull":"0"
   },
   "TimeRequiredToFull200":{
      "HourRequiredToFull":"1",
      "MinutesRequiredToFull":"30"
   },
   "NotificationDateAndTime":"2021\/06\/01 14:39",
   "TargetDate":"2021\/06\/01 14:39"
}

Possible Fix

A possible fix could be to remove the struct tag which tries to unmarshal the string and instead check afterwards if the string is empty and set the value of RemainingWH for BatteryStatus accordingly.
I would be happy to implement a fix, if you approve.

Units issue in monthly report

The daily efficiency figure in the monthly report is incorrect - I think it is reporting in units of "10Wh/mile" rather than "kWh/mile"

Example day output:-

  Trips on 2019-07-01 Monday
    06:58 25 miles   0.3 kWh/mile
    12:55 0 miles   0.3 kWh/mile
    17:38 27 miles   0.2 kWh/mile
          =======  =======
           52.9miles  23.6 kWh/mile

That last line I think should have "0.236 kWh/mile" (or the truncated form of it).

However there is likely some general reworking of the report lines in there - I may have a go at reworking it when I get a little time.

incorrect trip efficiency in monthly stats

Hi, as a new Leaf driver, I'm quite interested in tracking efficiency. (I live at the top of a short but steep hill, which shows up quite dramatically in the figures for short outbound vs return trips.) The individual trip efficiencies look wrong, though the daily summary is fine. I'm in the UK, using miles as units. Eg

  Trips on 2021-10-08 Friday
    19:45   10.3 miles   0.3 kWh/mile    1.9 kWh
    22:03    7.0 miles   0.3 kWh/mile    1.4 kWh
          =========== ============== ==========
            17.3 miles   0.2 kWh/mile    3.4 kWh

1.9kWh for 10 miles clearly ought to be 0.19kWh/mile yet it reports 0.3. And it makes no sense for the overall day rate to be lower than all of the individual rates.

I'm pretty sure the problem is just that the code assumes that the efficiency in the json struct is in kWh/km whereas it looks like it's actually kWh/mile. If I hack to specify "kWh/mile" in main.go line 489 (and also print 2dp), I get:

  Trips on 2021-10-08 Friday
    19:45   10.3 miles  0.19 kWh/mile    1.9 kWh
    22:03    7.0 miles  0.21 kWh/mile    1.4 kWh
          =========== ============== ==========
            17.3 miles   0.2 kWh/mile    3.4 kWh

(which happens to be the original "ElectricMileage" values for these two trips in the json record. The total for the daily distance is correct since the two individual trips were rounded down, but their sum rounded up.)

I also think there might be a benefit in reporting values to 2 significant figures (which means the number of decimal places depends on the unit being used). Eg energy/mile or energy/km might want 2dp, whereas energy/100km probably wants an integer (or maybe 1dp). I'm new to golang, but happy to have a "go" at implementing that. (I'd probably make efficiencyToUnits return a string rather than a float, and then that can make an informed decision about how many decimal places to use.)

My car dashboard reports efficiecy as miles/kWh rather than kWh/mile (which also seems to be the way efficiency is discussed in the UK ? Similar to miles/gallon rather than litres per distance.) I'll try implementing that as a separate change. (That's why I'd want 2dp in the report for kWh/mile - with only 1dp, taking the reciprocal can give only 10, 5, 3.33 or 2.5 whereas I'd want rather better precision than that.)

Stale session?

Sometimes I get a 408 status return from carwings:-

$ carwings update 
Logging into Carwings...
Requesting update from Carwings...
ERROR: received status code 408

Repeating the command will give the same result.
Deleting the ~/.carwings-session file allows the next invocation to work.

Will explore this more when I next see it. I am using the NE region.

Error when getting battery

Hi Joe,

First off thank you for creating this utility and the home kit one!

I'm wondering if something may have changed with what carwings is returning when the battery is quarried. When I run the battery command I get the following:

carwings -email <email> -password <password> battery (with my user name and password of course)
Logging into Carwings...
Getting latest retrieved battery status...
ERROR: json: invalid use of ,string struct tag, trying to unmarshal "" into int

I'm brand new to the go language so have not dug into the source yet. I'll try to take a look and see if there is anything obvious.

Thanks in advance
Galen

Monthly statistics show incorrect daily summary with unit being kWh/100km

Example:

Trips on 2019-09-02 Monday
07:49 37.1 km 11.5 kWh/100km 4.3 kWh
17:32 36.9 km 13.5 kWh/100km 5.0 kWh
============ ============== ============
74.0 km 0.1 kWh/100km 9.2 kWh

The total consumption per 100km is not correct. I think its this line in the code:

efficiency := (power / metersToUnits(cfg.units, distance)) / 1000

which is wrong in this case. Maybe it works if a different "ms.EfficiencyScale" is in effect. I have no idea how to handle this the correct way. Simply dividing by 10 instead of 1000 would fix it for me and probably break it for others.

Is there a more elegant way than to check the string content of "ms.EfficiencyScale"?

Locate vehicle not working after API updates

Late July API update (reflected in 1d31d1a) broke the vehicle location API.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /api_v190426_NE/gdc/MyCarFinderRequest.php was not found on this server.</p>
</body></html>

I haven't found an alternative yet.

daily report misinterprets energy numbers

The output from the 'daily' command seems to misinterpret some of the fields. Eg.

Daily Driving Statistics for 2021-10-27
  Driving efficiency:   0.2 kWh/mile   **** 
  Acceleration:       268.1 kWh        **** 
  Regeneration:        81.6 kWh        ***  
  Auxilliary usage:    17.6 Wh         *****

(Acceleration - Regeneration) is far in excess of the 30kWh capacity of the car, and of the expected usage for a 30-mile trip. When I display the same data using the official Nissan app, the 268.1 figure is Wh per mile, so they're actually efficiency numbers rather than usage numbers. (268.1 - 81.6 + 17.6)Wh/mile matches the summary of 0.2kWh/mile.

Battery SOC is always 1%

Hello. First many, many thanks for your work. This is a really great module!

With my Nissan Leaf 2015 I've a problem when reading the Battery SOC. I always get 1%.

'''carwings -username xxxx -password xxxx -region NE -debug battery'''

results in:

{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2022\/02\/25 13:16","BatteryStatus":{"BatteryChargingStatus":"NOT_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"9","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"NOT_CONNECTED","CruisingRangeAcOn":"95256.0","CruisingRangeAcOff":"101304.0","TimeRequiredToFull":{"HourRequiredToFull":"5","MinutesRequiredToFull":"30"},"TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"0"},"TimeRequiredToFull200_6kW":{"HourRequiredToFull":"2","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2022\/02\/25 12:16","TargetDate":"2022\/02\/25 12:16"}}

Battery status as of 2022-02-25 13:16:00 +0100 CET:
  Capacity: 9 / 12 (1%) 0.0kWh
  Cruising range: 62 miles (59 miles with AC)
  Plug-in state: not connected
  Charging status: not charging
  Time to full:
    Level 1 charge: 5h30m0s
    Level 2 charge: 4h0m0s
    Level 2 at 6 kW: 2h30m0s

You can see the Battery is charged to 9 of 12 bars what means 75% SOC. As you also can see in the HTTP Response there is no SOC. So this line is called:

soc = int(math.Round(float64(remaining) / float64(batrec.BatteryStatus.BatteryCapacity)))

And the calculation in this line is (with my data):
Math.Round(9/12) -> 1

The correct calculation has to be:
soc = int(math.Round(float64(remaining) * 100 / float64(batrec.BatteryStatus.BatteryCapacity)))

Then I get the right value. But the question is also why the carwings API does not deliver the SOC.

"update" polling seems to miss an actual update arriving

I've been using carwings to poll my car every hour & log its battery level.

Quite often it times out (in Europe at least), and I'm used to the actual service being unreliable.

But does this debug log show carwings missing an actual update when the service was working as expected? I've not looked at the protocol but it looks like it polls and the TargetDate parameters changes from 12:06 to 12:09, but it carries on "waiting for update to complete" and exits with an error.

When I subsequently request the cached battery state, it shows the update that definiedly arrived within about 5s.

Is this a bug? (time zone? I'm in the Europe/London which is 1h behind Europe/Paris).

(a few IDs redacted with ***)

$ ./go/bin/carwings -debug update
Logging into Carwings...
POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/InitialApp.php map[initial_app_strings:[geORNtsZe5I4lRGjG9GZiA]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Thu, 07 Mar 2019 12:09:04 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"uyI5Dj9g8VCOFDnBRUbr3g"}
0



Requesting update from Carwings...
POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusCheckRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:05 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

7c
{"status":200,"userId":"***USERNAME***","vin":"***VIN***","resultKey":"***RESULTKEY***"}
0



Waiting for update to complete... +POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:10 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:06","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"61376.0","CruisingRangeAcOff":"65760.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:06","TargetDate":"2019\/03\/07 12:06"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:15 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:06","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"61376.0","CruisingRangeAcOff":"65760.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:06","TargetDate":"2019\/03\/07 12:06"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:20 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:06","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"61376.0","CruisingRangeAcOff":"65760.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:06","TargetDate":"2019\/03\/07 12:06"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:25 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:30 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:35 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:40 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:45 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:50 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:09:55 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:10:00 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:10:06 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



+POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:10:11 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



! :-(
ERROR: timed out waiting for update
$ ./go/bin/carwings -debug battery
Logging into Carwings...
POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/InitialApp.php map[initial_app_strings:[geORNtsZe5I4lRGjG9GZiA]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Thu, 07 Mar 2019 12:10:35 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"uyI5Dj9g8VCOFDnBRUbr3g"}
0



Getting latest retrieved battery status...
POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/BatteryStatusRecordsRequest.php map[RegionCode:[NE] VIN:[***VIN***] custom_sessionid:[***SESSIONID***] tz:[Europe/Paris]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 07 Mar 2019 12:10:36 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

212
{"status":200,"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019\/03\/07 13:09","BatteryStatus":{"BatteryChargingStatus":"NORMAL_CHARGING","BatteryCapacity":"12","BatteryRemainingAmount":"6","BatteryRemainingAmountWH":"","BatteryRemainingAmountkWH":""},"PluginState":"CONNECTED","CruisingRangeAcOn":"63168.0","CruisingRangeAcOff":"67680.0","TimeRequiredToFull200":{"HourRequiredToFull":"4","MinutesRequiredToFull":"30"},"NotificationDateAndTime":"2019\/03\/07 12:09","TargetDate":"2019\/03\/07 12:09"}}
0



Battery status as of 2019-03-07 13:09:00 +0100 CET:
  Capacity: 6 / 12 (1%)
  Cruising range: 42 miles (39 miles with AC)
  Plug-in state: connected
  Charging status: charging
  Time to full:
    Level 2 charge: 4h30m0s

server endpoints

When running in server mode, what endpoints are exposed? I found http://server:8040/battery by chance, are there any others?

additional parameters to battery status

Hi Joe
I've managed to get carwings running and the debug gives me the following info from the Leaf:
20a
{"status":200,"VoltLabel":{"HighVolt":"240","LowVolt":"120"},"BatteryStatusRecords":{"OperationResult":"START","OperationDateAndTime":"2019/11/07 09:41","BatteryStatus":{"BatteryChargingStatus":"NOT_CHARGING","BatteryCapacity":"240","BatteryRemainingAmount":"240","BatteryRemainingAmountWH":"38480","BatteryRemainingAmountkWH":"","SOC":{"Value":"100"}},"PluginState":"CONNECTED","CruisingRangeAcOn":"223000","CruisingRangeAcOff":"246000","NotificationDateAndTime":"2019/11/07 09:41","TargetDate":"2019/11/07 09:41"}}

I'd love to get "BatteryRemainingAmountWH":"38480" parameter reported in the battery status query. Is this an easy fix? I looked at the code but to be honest it's left me a bit confused! I'm not a great programmer!

Cheers
Tim

ERROR: vehicle info unavailable

ERROR: vehicle info unavailable
Japan 2018 model (40kwh / ZE1 type).

EndPointAPI:NML(Japan)

The JP2018 model leaf is experiencing behavior that appears to be a failure of json analysis.
Since json is returning a normal response, it seems that the json parsing is not working.

Here is the output of the debug.
#Tokens and unique codes are replaced with dummy strings.

lezoid@hostname:~$ carwings -debug -region NML -username hogehoge -password Dummy locate
Logging into Carwings...
POST https://gdcportalgw.its-mo.com/api_v190426_NE/gdc/InitialApp_v2.php map[initial_app_str:[Dummy]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Thu, 24 Sep 2020 09:38:26 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"dummyprm"}
0



Error loading session from /home/lezoid/.carwings-session: json: cannot unmarshal number into Go value of type string
POST https://gdcportalgw.its-mo.com/api_v190426_NE/gdc/UserLoginRequest.php map[Password:[password==] RegionCode:[NML] UserId:[hogehoge] initial_app_str:[9s5rfKVuMrT03RtzajWNcA]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Thu, 24 Sep 2020 09:38:26 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45b
{"status":200,"EncAuthToken":"DummyToken","CustomerInfo":{"UserId":"hogehoge","Language":"ja-JP","Timezone":"Asia\/Tokyo","RegionCode":"NML","OwnerId":"000000000","EMailAddress":"[email protected]","Nickname":"hogehoge","Country":"JP","VehicleImage":"\/content\/language\/default\/images\/img\/ph_car.jpg","UserVehicleBoundDurationSec":"946771200","VehicleInfo":{"VIN":"ZE1-000000","DCMID":"000000000000","SIMID":"00000000000000F","NAVIID":"000000000000","EncryptedNAVIID":"FA000000000000000000000","MSN":"070000000000","LastVehicleLoginTime":"","UserVehicleBoundTime":"2018-12-16T02:47:57Z","LastDCMUseTime":"","custom_sessionid":"cusstomsessionid==","NonaviFlg":"false","CarName":"LEAF","CarImage":"carimg2.png"}},"UserInfoRevisionNo":"1","ngTapUpdatebtn":"300000","timeoutUpdateAnime":"300000","G1Lw":"5","G1Li":"2","G1Lt":"20","G1Uw":"15","G1Ui":"2","G1Ut":"20","G2Lw":"15","G2Li":"2","G2Lt":"20","G2Uw":"15","G2Ui":"2","G2Ut":"20","resultKey":""}
0



ERROR: vehicle info unavailable

Incorrect encrypted password value for 8 character password (INVALID PARAMS)

I'm trying to use this from Ireland, where I see the following response:

$ carwings -email [email protected] -password XXXXXXX -debug battery
Logging into Carwings...
POST https://gdcportalgw.its-mo.com/api_v180117_NE/gdc/InitialApp.php map[initial_app_strings:[geORNtsZe5I4lRGjG9GZiA]]
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Sat, 04 Aug 2018 19:41:42 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"uyI5Dj9g8VCOFDnBRUbr3g"}
0



POST https://gdcportalgw.its-mo.com/api_v180117_NE/gdc/UserLoginRequest.php map[initial_app_strings:[geORNtsZe5I4lRGjG9GZiA] UserId:[[email protected]] Password:[XXXXXXXXXXX] RegionCode:[NNA]]
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Sat, 04 Aug 2018 19:41:42 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

2d
{"status":"-2010","message":"INVALID PARAMS"}
0



ERROR: json: cannot unmarshal string into Go struct field .status of type int

Aside from the bug in their JSON response where they return a string "-2010" rather than a number, I'm not sure what the valid parms might be.

I've also tried using -region EU or -region NE (after I looked at the code a bit :-)

I'm keen to help out where I can.

Thanks,
Andrew.

Wrong stop time displayed in some circumstances

Nissan is very confused about my timezone, so this sort of thing seems to happen in a few places.

In my Carwings configuration file I have my timezone set to "Europe/Dublin" but it's not being used when I request carwings climate:

{
  "status":200,
  "RemoteACRecords":{
    "OperationResult":"START",
    "OperationDateAndTime":"2019\/12\/16 18:09",
    "RemoteACOperation":"START",
    "ACStartStopDateAndTime":"2019\/12\/16 17:09",
    "CruisingRangeAcOn":"101016.0",
    "CruisingRangeAcOff":"104328.0",
    "ACStartStopURL":"",
    "PluginState":"CONNECTED",
    "ACDurationBatterySec":"900",
    "ACDurationPluggedSec":"7200"
  }
}

The output is:

Climate status:
  Running: yes
  Will stop at: 2019-12-16 20:09:00 +0100 CET
  Plug-in state: connected
  Cruising range: 104 km (101 km with AC)

But of course it will stop at 2019-12-16 19:09:00 +0000 Europe/Dublin

I'll try and work out a patch...

panic: runtime error: index out of range

panic: runtime error: index out of range
Japan 2018 model (40kwh / ZE1 type).

UserLoginRequest.phpHTTP200, and it looks like the value is returned successfully.
The same error occurs even if you delete the URL option.

Is it related to issues #3 and #8?


./carwings -debug -region NML -url https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/ -username username -password password update
Logging into Carwings...
POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/InitialApp.php map[initial_app_strings:[hogehoge]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Mon, 13 May 2019 07:28:47 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"hogehoge"}
0



Error loading session from /root/.carwings-session: open /root/.carwings-session: no such file or directory
POST https://gdcportalgw.its-mo.com/api_v181217_NE/gdc/UserLoginRequest.php map[initial_app_strings:[hogehoge] UserId:[username] Password:[password] RegionCode:[NML]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Mon, 13 May 2019 07:28:47 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

3c1
{"status":200,"EncAuthToken":"Token","CustomerInfo":{"UserId":"username","Language":"ja-JP","Timezone":"Asia\/Tokyo","RegionCode":"NML","OwnerId":"1111111111","EMailAddress":"[email protected]","Nickname":"username","Country":"JP","VehicleImage":"\/content\/language\/default\/images\/img\/ph_car.jpg","UserVehicleBoundDurationSec":"946771200","VehicleInfo":{"VIN":"ZE1-000000","DCMID":"000000000000","SIMID":"0000000000000000000F","NAVIID":"000001000000","EncryptedNAVIID":"FFFFFFFFFFFFFFFFFFFFFFFFF","MSN":"00000000000","LastVehicleLoginTime":"","UserVehicleBoundTime":"2018-12-16T02:47:57Z","LastDCMUseTime":"","custom_sessionid":"0sessionid","NonaviFlg":"false","CarName":"LEAF","CarImage":"carimg2.png"}},"UserInfoRevisionNo":"1","ngTapUpdatebtn":"300000","timeoutUpdateAnime":"300000"}
0



panic: runtime error: index out of range

goroutine 1 [running]:
github.com/joeshaw/carwings.(*Session).Login(0xc000102000, 0xc00008c010, 0x706de7)
        /root/go/src/github.com/joeshaw/carwings/carwings.go:474 +0x565
github.com/joeshaw/carwings.(*Session).Connect(0xc000102000, 0x7ffe84ccc856, 0x6, 0x7ffe84ccc867, 0xa, 0x0, 0x3)
        /root/go/src/github.com/joeshaw/carwings/carwings.go:437 +0x1d4
main.main()
        /root/go/src/github.com/joeshaw/carwings/cmd/carwings/main.go:143 +0x82a

Run from saved configuration, save session between runs

Looks like we've both been doing the same thing today... :-)

After I figured the last issue I decided to add support for a configuration file and for saving of sessions, which means that my config file is different to your config file :-/

I'd obviously prefer if you chose to use my configuration setup because it allows for setting more than just username/password (I also wanted to save region and units, because: EU :-)

This issue is really by way of pointing out I've done this stuff. I've rebased my changes off the top of yours, so it removes your config file implementation in favour of mine.

Feel free to cherrypick what you think is appropriate - I won't do a pull request for this.

Europe API endpoints no longer available

Looks like the European API endpoints that were being used have been withdrawn:-

Logging into Carwings...
POST https://gdcportalgw.its-mo.com/gworchest_160803EC/gdc/InitialApp.php map[initial_app_strings:[geORNtsZe5I4lRGjG9GZiA]]
HTTP/1.1 404 Not Found

December 2020 Update to EU App/Servers Breaks Authentication

There was an update on 15 December of the IOS NissanConnect EV App - their changelog had:-

3.5.1
16 Dec 2020

· Security Update
· Updated screenshots.
· Versions prior to V3.5.1 are no longer supported. Please update your app to this latest version.

It looks like that broke user authentication - although I am currently working on a new laptop which did not have a working app on prior to trying this.

Debug looks like this (I have changed the identifiable bits but think those are irrelevant to the error)

Logging into Carwings...
POST https://gdcportalgw.its-mo.com/api_v200413_NE/gdc/InitialApp_v2.php map[initial_app_str:[9s5rfKVuMrT03RtzajWNcA]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Sat, 26 Dec 2020 19:21:36 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

45
{"status":200,"message":"success","baseprm":"88dSp7wWnV3bvv9Z88zEwg"}
0

Error loading session from /Users/xxxx/.carwings-session: open /Users/xxxx/.carwings-session: no such file or directory
POST https://gdcportalgw.its-mo.com/api_v200413_NE/gdc/UserLoginRequest.php map[Password:[?????????????????????==] RegionCode:[NE] UserId:[[email protected]] initial_app_str:[9s5rfKVuMrT03RtzajWNcA]]
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Date: Sat, 26 Dec 2020 19:21:37 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000

29
{"status":404,"message":"INVALID PARAMS"}
0

ERROR: received status code 404 (INVALID PARAMS)

It looks like the login parameters have changed.

I'll have a further poke at this as I have the time.

Use BatteryStatusCheckResultRequest result

BatteryStatusCheckResultRequest will actually return the refreshed battery status. Currently that's discarded instead of just being returned to the caller. It would be a breaking change though to modify this.

NE Region throwing error

Since the 19th of July, the NE region has been broken, the update did not help in this case.

Logging into Carwings...
POST https://gdcportalgw.its-mo.com/gworchest_160803EC/gdc/InitialApp.php map[initial_app_strings:[geORNtsZe5I4lRGjG9GZiA]]
HTTP/1.1 404 Not Found
Connection: close
Content-Length: 235
Content-Type: text/html; charset=iso-8859-1
Date: Sun, 04 Aug 2019 07:04:52 GMT
Server: Apache

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /gworchest_160803EC/gdc/InitialApp.php was not found on this server.</p>
</body></html>

Getting Login Error

Was working fine for a week or so, then 48 hours ago (28-May-2018) started getting:

Logging into Carwings...
ERROR: invalid character '<' looking for beginning of value

Research suggest this maybe a non-JSON response to the login, but I don't know enough to debug. ConnectEV and YOU+Nissan are working, so I think the service is up.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.