71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package telemetry
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/evcc-io/evcc/util"
|
|
"github.com/evcc-io/evcc/util/machine"
|
|
"github.com/evcc-io/evcc/util/request"
|
|
"github.com/evcc-io/evcc/util/sponsor"
|
|
)
|
|
|
|
const api = "https://api.evcc.io"
|
|
|
|
var instanceID string
|
|
|
|
func Enabled() bool {
|
|
return instanceID != ""
|
|
}
|
|
|
|
func Create(token, machineID string) error {
|
|
if token == "" {
|
|
return errors.New("telemetry requires sponsorship")
|
|
}
|
|
|
|
if machineID == "" {
|
|
var err error
|
|
if machineID, err = machine.ProtectedID("evcc-api"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
instanceID = machineID
|
|
|
|
return nil
|
|
}
|
|
|
|
func UpdateChargeProgress(log *util.Logger, power, deltaCharged, deltaGreen float64) {
|
|
log.DEBUG.Printf("telemetry: charge: Δ%.0f/%.0fWh @ %.0fW", deltaGreen*1e3, deltaCharged*1e3, power)
|
|
|
|
data := InstanceChargeProgress{
|
|
InstanceID: instanceID,
|
|
ChargeProgress: ChargeProgress{
|
|
ChargePower: power,
|
|
GreenPower: power * deltaGreen / deltaCharged,
|
|
ChargeEnergy: deltaCharged,
|
|
GreenEnergy: deltaGreen,
|
|
},
|
|
}
|
|
|
|
uri := fmt.Sprintf("%s/v1/charge", api)
|
|
req, err := request.New(http.MethodPost, uri, request.MarshalJSON(data), map[string]string{
|
|
"Authorization": "Bearer " + sponsor.Token,
|
|
})
|
|
|
|
var res struct {
|
|
Error string
|
|
}
|
|
|
|
if err == nil {
|
|
client := request.NewHelper(log)
|
|
if err = client.DoJSON(req, &res); err == nil && res.Error != "" {
|
|
err = errors.New(res.Error)
|
|
}
|
|
}
|
|
|
|
if err != nil {
|
|
log.ERROR.Printf("telemetry: charge: %v", err)
|
|
}
|
|
}
|