Skip to content

Commit

Permalink
Add connect/disconnect events (evcc-io#237)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored Jul 21, 2020
1 parent fc3be70 commit d2feaca
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 13 deletions.
3 changes: 3 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ issues:
- .regOverchargeProtect. is unused
- .regReset. is unused
- "`routeLogger` is unused"
- field `connectedTime` is unused
- func `..LoadPoint..evVehicleConnectHandler` is unused
- func `..LoadPoint..evVehicleDisconnectHandler` is unused
40 changes: 29 additions & 11 deletions core/loadpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ import (
)

const (
evChargeStart = "start" // update chargeTimer
evChargeStop = "stop" // update chargeTimer
evChargeCurrent = "current" // update fakeChargeMeter
evChargePower = "power" // update chargeRater
evChargeStart = "start" // update chargeTimer
evChargeStop = "stop" // update chargeTimer
evChargeCurrent = "current" // update fakeChargeMeter
evChargePower = "power" // update chargeRater
evVehicleConnect = "connect" // vehicle connected
evVehicleDisconnect = "disconnect" // vehicle disconnected

minActiveCurrent = 1 // minimum current at which a phase is treated as active
)
Expand Down Expand Up @@ -58,9 +60,10 @@ type LoadPoint struct {
vehicle api.Vehicle // Vehicle

// cached state
status api.ChargeStatus // Charger status
charging bool // Charging cycle
chargePower float64 // Charging power
status api.ChargeStatus // Charger status
charging bool // Charging cycle
chargePower float64 // Charging power
connectedTime time.Time // time vehicle was connected

pvTimer time.Time
}
Expand Down Expand Up @@ -170,15 +173,32 @@ func (lp *LoadPoint) publish(key string, val interface{}) {

// evChargeStartHandler sends external start event
func (lp *LoadPoint) evChargeStartHandler() {
lp.log.INFO.Println("start charging ->")
lp.notify(evChargeStart)
}

// evChargeStopHandler sends external stop event
func (lp *LoadPoint) evChargeStopHandler() {
lp.log.INFO.Println("stop charging <-")
lp.publishChargeProgress()
lp.notify(evChargeStop)
}

// evVehicleConnectHandler sends external start event
func (lp *LoadPoint) evVehicleConnectHandler() {
lp.log.INFO.Printf("car connected")
connectedDuration := lp.clock.Since(lp.connectedTime)
lp.publish("connectedDuration", connectedDuration)
lp.notify(evVehicleConnect)
}

// evVehicleDisconnectHandler sends external start event
func (lp *LoadPoint) evVehicleDisconnectHandler() {
lp.log.INFO.Println("car disconnected")
lp.connectedTime = lp.clock.Now()
lp.notify(evVehicleDisconnect)
}

// evChargeCurrentHandler updates the dummy charge meter's charge power. This simplifies the main flow
// where the charge meter can always be treated as present. It assumes that the charge meter cannot consume
// more than total household consumption. If physical charge meter is present this handler is not used.
Expand Down Expand Up @@ -242,25 +262,23 @@ func (lp *LoadPoint) updateChargeStatus() error {

// changed from A - connected
if prevStatus == api.StatusA {
lp.log.INFO.Printf("car connected (%s)", string(status))
lp.bus.Publish(evVehicleConnect)
}

// changed to A - disconnected
if status == api.StatusA {
lp.log.INFO.Println("car disconnected")
lp.bus.Publish(evVehicleDisconnect)
}

// update whenever there is a state change
lp.bus.Publish(evChargeCurrent, lp.handler.TargetCurrent())

// start/stop charging cycle
if lp.charging = status == api.StatusC; lp.charging {
lp.log.INFO.Println("start charging ->")
lp.bus.Publish(evChargeStart)
} else {
// omit initial stop event before started
if prevStatus != api.StatusNone {
lp.log.INFO.Println("stop charging <-")
lp.bus.Publish(evChargeStop)
}
}
Expand Down
8 changes: 7 additions & 1 deletion evcc.dist.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,13 @@ messaging:
msg: Started charging in "${mode}" mode
stop: # charge stop event
title: Charge finished
msg: Finished charging ${energy:%.1fk}kWh in ${duration}.
msg: Finished charging ${chargedEnergy:%.1fk}kWh in ${chargeDuration}.
connect: # vehicle connect event
title: Car connected
msg: "Car connected at ${pvPower:%.1fk}kW PV"
disconnect: # vehicle connected event
title: Car disconnected
msg: Car disconnected after ${connectedDuration}
services:
- type: pushover
app: # app id
Expand Down
1 change: 0 additions & 1 deletion push/hub.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ func (h *Hub) Run(events <-chan Event) {

definition, ok := h.definitions[ev.Event]
if !ok {
log.ERROR.Printf("invalid event %v", ev.Event)
continue
}

Expand Down

0 comments on commit d2feaca

Please sign in to comment.