Skip to content

Commit

Permalink
Merge pull request #4 from HappyTobi/start_charging
Browse files Browse the repository at this point in the history
[NEW] charge start stop command
  • Loading branch information
HappyTobi authored Jun 12, 2023
2 parents 367bbeb + 3f36040 commit f9e80ac
Show file tree
Hide file tree
Showing 38 changed files with 698 additions and 251 deletions.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ The cli tool brings the http api to the terminal.
| `warp charge-tracker` | Get information about the charge tracker |
| `warp charge-tracker log` | Get the charge tracker log (csv or pdf) |
| `warp version` | Get the version of the warp cli |
| `warp charge start` | Start charging for a user with or without a specific power |
| `warp charge stop` | Stops the current charging |

Each command has a help page, which can be accessed with the `-h` or `--help` flag.
The help page prints the usage of the command and the available flags.
Expand Down Expand Up @@ -63,6 +65,13 @@ cd build/

## Example usage

### Start charging
```console
$ warp charge start -c "http://mywarp.ip -u "username" -p "password" -r "warp-user" -a 6000

"Charging started for user warp-user with 6000 ampere"
```

### Info version
```console
$ warp info name -c "http://mywarp.ip -u "username" -p "password"
Expand Down
43 changes: 43 additions & 0 deletions cmd/charge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package cmd

import (
"github.com/HappyTobi/warp/pkg/cmd/charge"
"github.com/spf13/cobra"
)

func ChargeCmd() *cobra.Command {
users := &cobra.Command{
Use: "charge",
Short: "Charge command",
}
users.AddCommand(StartCmd())
users.AddCommand(StopCmd())

return users
}

func StartCmd() *cobra.Command {
startCmd := &cobra.Command{
Use: "start",
Short: "Start charging for a specified user",
RunE: charge.Start,
PreRunE: ValidateChargeStart,
}

startCmd.Flags().StringP("user", "r", "", "User to start charging")
startCmd.Flags().IntP("charge-power", "a", -1, "Ampere to charge with")
_ = startCmd.MarkFlagRequired("user")

return startCmd
}

func StopCmd() *cobra.Command {
stopCmd := &cobra.Command{
Use: "stop",
Short: "Stop charging",
RunE: charge.Stop,
PreRunE: ValidateChargeStop,
}

return stopCmd
}
14 changes: 8 additions & 6 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func Root() *cobra.Command {
root.PersistentFlags().StringP("password", "p", "", "Password to authenticate (required if username is set)")
root.MarkFlagsRequiredTogether("username", "password")

root.AddCommand(ChargeCmd())
root.AddCommand(InfoCmd())
root.AddCommand(UserCmd())
root.AddCommand(ChargeTrackerCmd())
Expand Down Expand Up @@ -88,18 +89,19 @@ func initConfig() {
imagePath := filepath.Join(configPath, "logo.png")
viper.SetDefault("pdf.image_path", imagePath)

if err := settings.StoreImage(imagePath); err != nil {
fmt.Print("Error while storing image")
os.Exit(1)
}

if _, err := os.Stat(configFilePath); os.IsNotExist(err) {
if err := os.WriteFile(configFilePath, []byte{}, 0644); err != nil {
_ = os.MkdirAll(configPath, os.ModePerm)
if err := os.WriteFile(configFilePath, []byte{}, os.ModePerm); err != nil {
fmt.Print("Error while creating config file")
os.Exit(1)
}
}

if err := settings.StoreImage(imagePath); err != nil {
fmt.Print("Error while storing image")
os.Exit(1)
}

if err := viper.WriteConfig(); err != nil {
fmt.Print(err)
os.Exit(1)
Expand Down
46 changes: 46 additions & 0 deletions cmd/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"fmt"

"github.com/HappyTobi/warp/pkg/cmd/validation"
"github.com/spf13/cobra"
)

Expand All @@ -18,3 +19,48 @@ func ValidateOutputformat(cmd *cobra.Command, args []string) error {

return nil
}

// validate charge start command
func ValidateChargeStart(cmd *cobra.Command, args []string) error {
chargePower, err := cmd.Flags().GetInt("charge-power")
if err != nil {
return err
}
//validate charge-power flag if it is between 6000 and 32000
if chargePower != -1 && (chargePower < 6000 || chargePower > 32000) {
return fmt.Errorf("invalid charge-power: %d, value has to be between 6000 and 32000", chargePower)
}

if err := validation.ValidateWarpFeatures(cmd, args, "nfc", "evse"); err != nil {
return err
}

connectionState, err := validation.ValidateChargerConnected(cmd, args)
if err != nil {
return err

}
if connectionState == 0 {
return fmt.Errorf("Charger is not connected to a car, charging can't be started")
}

return nil
}

// validate charge stop command
func ValidateChargeStop(cmd *cobra.Command, args []string) error {
if err := validation.ValidateWarpFeatures(cmd, args, "nfc", "evse"); err != nil {
return err
}

connectionState, err := validation.ValidateChargerConnected(cmd, args)
if err != nil {
return err
}

if connectionState > 1 {
return nil
}

return fmt.Errorf("Charger is not in correct state to stop charging")
}
74 changes: 74 additions & 0 deletions pkg/cmd/charge/start.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package charge

import (
"fmt"
"strings"

"github.com/HappyTobi/warp/pkg/cmd/middleware"
"github.com/HappyTobi/warp/pkg/internal/evse"
"github.com/HappyTobi/warp/pkg/internal/nfc"
"github.com/HappyTobi/warp/pkg/internal/users"
"github.com/spf13/cobra"
)

func Start(cmd *cobra.Command, args []string) error {
request, err := middleware.LoadWarpRequest(cmd)
if err != nil {
return err
}

nfcTagService := nfc.NewNfcTagsService(request)
nfcTags, err := nfcTagService.Config()
if err != nil {
return err
}

userService := users.NewUsersService(request)
allUsers, err := userService.AllUsernames()
if err != nil {
return err
}

evseService := evse.NewEvseService(request)
chargePower, err := evseService.CurrentChargePower()
if err != nil {
return err
}

//validate passed user
userTag := nfc.UserTag{}
userFilter, _ := cmd.Flags().GetString("user")
for _, user := range allUsers {
if strings.EqualFold(user.Username, userFilter) {
for _, tag := range nfcTags.AuthorizedTags {
if tag.UserId == user.Id {
userTag = tag
break
}
}
}
}

if len(userTag.Id) == 0 {
return fmt.Errorf("The passed user is not valid or has no valid nfc tag")
}

//check if chargepower is set and changed
cPowerArg, _ := cmd.Flags().GetInt("charge-power")
if cPowerArg > 0 && cPowerArg != chargePower.Current {
//update chargepower at warp charger
if err := evseService.UpdateChargePower(cPowerArg); err != nil {
return err
}

chargePower.Current = cPowerArg
}

if err := nfcTagService.StartCharging(userTag); err != nil {
return err
}

//fmt.Printf(request.OutputRenderer.Render()
fmt.Printf("Charge started for user %s with %d Ampere", userFilter, chargePower.Current)
return nil
}
24 changes: 24 additions & 0 deletions pkg/cmd/charge/stop.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package charge

import (
"fmt"

"github.com/HappyTobi/warp/pkg/cmd/middleware"
"github.com/HappyTobi/warp/pkg/internal/nfc"
"github.com/spf13/cobra"
)

func Stop(cmd *cobra.Command, args []string) error {
request, err := middleware.LoadWarpRequest(cmd)
if err != nil {
return err
}

nfcTagService := nfc.NewNfcTagsService(request)
if err := nfcTagService.StopCharging(); err != nil {
return err
}

fmt.Printf("Charge stopped")
return nil
}
17 changes: 8 additions & 9 deletions pkg/cmd/chargeTracker/chargeLog.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"strings"
"time"

"github.com/HappyTobi/warp/pkg/cmd/tools"
"github.com/HappyTobi/warp/pkg/cmd/middleware"
"github.com/HappyTobi/warp/pkg/internal/chargeTracker"
"github.com/HappyTobi/warp/pkg/internal/renderer"
"github.com/HappyTobi/warp/pkg/internal/users"
Expand All @@ -18,17 +18,16 @@ import (
func ChargeLog(cmd *cobra.Command, args []string) error {
requests := make([]*warp.Request, 0, 2)

request := &warp.Request{
chargeTrackerRequest := &warp.Request{
Path: "charge_tracker/charge_log",
ContentType: warp.JSON,
}

userRequest := &warp.Request{
Path: "users/all_usernames",
request := &warp.Request{
ContentType: warp.JSON,
}

requests = append(requests, request, userRequest)
requests = append(requests, chargeTrackerRequest, request)

/*
get filter params
Expand All @@ -45,7 +44,7 @@ func ChargeLog(cmd *cobra.Command, args []string) error {

outputFlag, _ := cmd.Flags().GetString("output")

if err := tools.LoadGlobalParams(cmd, func(charger, username, password, output string) {
if err := middleware.LoadGlobalParams(cmd, func(charger, username, password, output string) {
for _, req := range requests {
req.Warp = charger

Expand All @@ -62,9 +61,9 @@ func ChargeLog(cmd *cobra.Command, args []string) error {
return err
}

chargeLog := chargeTracker.NewChargeLog(request)
user := users.NewUsersList(userRequest)
users, _ := user.Load()
chargeLog := chargeTracker.NewChargeLog(chargeTrackerRequest)
user := users.NewUsersService(*request)
users, _ := user.AllUsernames()

charges, err := chargeLog.Load(users, filters)
if err != nil {
Expand Down
26 changes: 6 additions & 20 deletions pkg/cmd/info/displayName.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,19 @@ package info
import (
"fmt"

"github.com/HappyTobi/warp/pkg/cmd/tools"
"github.com/HappyTobi/warp/pkg/internal/renderer"
"github.com/HappyTobi/warp/pkg/internal/warp"
"github.com/HappyTobi/warp/pkg/cmd/middleware"
"github.com/HappyTobi/warp/pkg/internal/info"
"github.com/spf13/cobra"
)

func DisplayName(cmd *cobra.Command, args []string) error {
request := &warp.Request{
Path: "info/display_name",
ContentType: warp.JSON,
}

if err := tools.LoadGlobalParams(cmd, func(charger, username, password, output string) {
request.Warp = charger

if len(username) > 0 && len(password) > 0 {
request.Username = username
request.Password = password
}

request.OutputRenderer = renderer.NewRenderer(output)

}); err != nil {
request, err := middleware.LoadWarpRequest(cmd)
if err != nil {
return err
}

js, err := request.GetJson()
infoService := info.NewInfoService(request)
js, err := infoService.DisplayName()
if err != nil {
return err
}
Expand Down
26 changes: 6 additions & 20 deletions pkg/cmd/info/features.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,19 @@ package info
import (
"fmt"

"github.com/HappyTobi/warp/pkg/cmd/tools"
"github.com/HappyTobi/warp/pkg/internal/renderer"
"github.com/HappyTobi/warp/pkg/internal/warp"
"github.com/HappyTobi/warp/pkg/cmd/middleware"
"github.com/HappyTobi/warp/pkg/internal/info"
"github.com/spf13/cobra"
)

func Features(cmd *cobra.Command, args []string) error {
request := &warp.Request{
Path: "info/features",
ContentType: warp.JSON,
}

if err := tools.LoadGlobalParams(cmd, func(charger, username, password, output string) {
request.Warp = charger

if len(username) > 0 && len(password) > 0 {
request.Username = username
request.Password = password
}

request.OutputRenderer = renderer.NewRenderer(output)

}); err != nil {
request, err := middleware.LoadWarpRequest(cmd)
if err != nil {
return err
}

data, err := request.Get()
infoService := info.NewInfoService(request)
data, err := infoService.Features()
if err != nil {
return err
}
Expand Down
Loading

0 comments on commit f9e80ac

Please sign in to comment.