diff --git a/README.md b/README.md index 42a5dbb..ce6db4b 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ TeslaMateApi is a RESTful API to get data collected by self-hosted data logger * - Written in **[Golang](https://golang.org/)** - Data is collected from TeslaMate **Postgres** database and local **MQTT** Broker - Endpoints return data in JSON format +- Send commands to your Tesla through the TeslaMateApi ### Table of Contents @@ -108,6 +109,28 @@ Basically the same environment variables for the database, mqqt and timezone nee - **MQTT_NAMESPACE** string *(default: )* - **MQTT_SLEEPTIME** integer *(default: 100)* +**Commands** environment variables + +- **ENABLE_COMMANDS** boolean *(default: false)* +- **COMMANDS_ALL** boolean *(default: false)* +- **COMMANDS_ALLOWLIST** string *(default: allow_list.json)* +- **COMMANDS_WAKE** boolean *(default: false)* +- **COMMANDS_ALERT** boolean *(default: false)* +- **COMMANDS_REMOTESTART** boolean *(default: false)* +- **COMMANDS_HOMELINK** boolean *(default: false)* +- **COMMANDS_SPEEDLIMIT** boolean *(default: false)* +- **COMMANDS_VALET** boolean *(default: false)* +- **COMMANDS_SENTRYMODE** boolean *(default: false)* +- **COMMANDS_DOORS** boolean *(default: false)* +- **COMMANDS_TRUNK** boolean *(default: false)* +- **COMMANDS_WINDOWS** boolean *(default: false)* +- **COMMANDS_SUNROOF** boolean *(default: false)* +- **COMMANDS_CHARGING** boolean *(default: false)* +- **COMMANDS_CLIMATE** boolean *(default: false)* +- **COMMANDS_MEDIA** boolean *(default: false)* +- **COMMANDS_SHARING** boolean *(default: false)* +- **COMMANDS_SOFTWAREUPDATE** boolean *(default: false)* + ## API documentation More detailed documentation of every endpoint will come.. @@ -118,10 +141,13 @@ More detailed documentation of every endpoint will come.. - GET `/api/v1/cars/:CarID` - GET `/api/v1/cars/:CarID/charges` - GET `/api/v1/cars/:CarID/charges/:ChargeID` +- GET `/api/v1/cars/:CarID/command` +- POST `/api/v1/cars/:CarID/command/:Command` - GET `/api/v1/cars/:CarID/drives` - GET `/api/v1/cars/:CarID/drives/:DriveID` - GET `/api/v1/cars/:CarID/status` - GET `/api/v1/cars/:CarID/updates` +- POST `/api/v1/cars/:CarID/wake_up` - GET `/api/v1/globalsettings` - GET `/api/ping` diff --git a/src/v1_TeslaMateAPICarsCommand.go b/src/v1_TeslaMateAPICarsCommand.go index 6ff64cc..5cd0103 100644 --- a/src/v1_TeslaMateAPICarsCommand.go +++ b/src/v1_TeslaMateAPICarsCommand.go @@ -43,7 +43,9 @@ func TeslaMateAPICarsCommandV1(c *gin.Context) { CarID = convertStringToInteger(ParamCarID) } + // validating that CarID is not zero if CarID == 0 { + log.Println("[error] TeslaMateAPICarsCommand CarID is invalid (zero)!") c.JSON(http.StatusBadRequest, gin.H{"error": "CarID invalid"}) return } @@ -159,7 +161,7 @@ func getCommandToken() string { func getAllowList() []string { - var allowAll bool = getEnvAsBool("COMMANDS_ALL", false) + allowAll := getEnvAsBool("COMMANDS_ALL", false) // https://tesla-api.timdorr.com/vehicle/commands/wake if getEnvAsBool("COMMANDS_WAKE", false) || allowAll { @@ -224,7 +226,7 @@ func getAllowList() []string { } // https://tesla-api.timdorr.com/vehicle/commands/sunroof - if getEnvAsBool("COMMAND_SUNROOF", false) || allowAll { + if getEnvAsBool("COMMANDS_SUNROOF", false) || allowAll { allowList = append(allowList, "/command/sun_roof_control") } diff --git a/src/webserver.go b/src/webserver.go index 28acd8b..5ee5b20 100644 --- a/src/webserver.go +++ b/src/webserver.go @@ -75,16 +75,16 @@ func main() { v1.GET("/cars/:CarID", TeslaMateAPICarsV1) v1.GET("/cars/:CarID/charges", TeslaMateAPICarsChargesV1) v1.GET("/cars/:CarID/charges/:ChargeID", TeslaMateAPICarsChargesDetailsV1) + v1.GET("/cars/:CarID/commands", TeslaMateAPICarsCommandV1) + v1.POST("/cars/:CarID/commands/:Command", TeslaMateAPICarsCommandV1) v1.GET("/cars/:CarID/drives", TeslaMateAPICarsDrivesV1) v1.GET("/cars/:CarID/drives/:DriveID", TeslaMateAPICarsDrivesDetailsV1) v1.GET("/cars/:CarID/status", TeslaMateAPICarsStatusV1) + v1.GET("/cars/:CarID/updates", TeslaMateAPICarsUpdatesV1) - v1.GET("/globalsettings", TeslaMateAPIGlobalsettingsV1) - v1.GET("/cars/:CarID/command", TeslaMateAPICarsCommandV1) - - v1.POST("/cars/:CarID/command/:Command", TeslaMateAPICarsCommandV1) v1.POST("/cars/:CarID/wake_up", TeslaMateAPICarsCommandV1) + v1.GET("/globalsettings", TeslaMateAPIGlobalsettingsV1) } // /api/ping endpoint