From d2feaca4d0b000b9a72a9b7c25be473e1826d54d Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 21 Jul 2020 08:35:27 +0200 Subject: [PATCH] Add connect/disconnect events (#237) --- .golangci.yml | 3 +++ core/loadpoint.go | 40 +++++++++++++++++++++++++++++----------- evcc.dist.yaml | 8 +++++++- push/hub.go | 1 - 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 93e7d7f4e..ccf149bd0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -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 diff --git a/core/loadpoint.go b/core/loadpoint.go index 15062f0e7..82f7c7046 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -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 ) @@ -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 } @@ -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. @@ -242,12 +262,12 @@ 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 @@ -255,12 +275,10 @@ func (lp *LoadPoint) updateChargeStatus() error { // 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) } } diff --git a/evcc.dist.yaml b/evcc.dist.yaml index 287361fe1..b6db30184 100644 --- a/evcc.dist.yaml +++ b/evcc.dist.yaml @@ -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 diff --git a/push/hub.go b/push/hub.go index 39dcd2b2d..5b6ca745f 100644 --- a/push/hub.go +++ b/push/hub.go @@ -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 }