From 007d1ffa1007361258685a2d81f956487ebd8852 Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 11 Jan 2022 21:27:35 +0100 Subject: [PATCH] Improve demo mode and config dump to log (#2266) --- cmd/demo.yaml | 50 +++++++++++++++++++++++++++++--------------------- cmd/dump.go | 2 +- cmd/root.go | 2 +- core/site.go | 39 ++++++++++++++++++--------------------- server/mqtt.go | 3 +-- 5 files changed, 50 insertions(+), 46 deletions(-) diff --git a/cmd/demo.yaml b/cmd/demo.yaml index bea85d1d0..4154bdfc8 100644 --- a/cmd/demo.yaml +++ b/cmd/demo.yaml @@ -1,24 +1,21 @@ log: info +interval: 3s + javascript: - vm: shared script: | state = { - residualpower: 200, - pvpower: -3000, - batterypower: 200, - gridpower: -2000, + residualpower: 300, + batterypower: 0, + pvpower: 6200, + gridpower: 0, chargepower: 0, maxcurrent: 0, battery: 63, // car }; - function get() { - console.log("state:", JSON.stringify(state)); - } - function set() { - console.log(param+":", val); - console.log("state:", JSON.stringify(state)); - } + function log() { console.log("state:", JSON.stringify(state)); } + function set() { console.log("set "+param+"=", val); } meters: - name: grid @@ -26,14 +23,31 @@ meters: power: type: js vm: shared - script: state.gridpower = state.pvpower + state.chargepower + state.residualpower + state.batterypower; + script: | + state.pvpower += 200*(Math.random()-0.5); + state.chargepower = 0; + if (state.enabled) { + state.chargepower = state.maxcurrent * 3 * 230; + state.batterypower = 0; + } + state.gridpower = -state.pvpower + state.chargepower + state.residualpower + state.batterypower; + // if (state.gridpower < 0) { + // state.batterypower = -state.gridpower; + // if (state.batterypower > 1000) { + // state.batterypower = 1000; + // } + // state.gridpower += state.batterypower; + // } else { + // state.batterypower = 0; + // } + state.gridpower; - name: pv type: custom power: type: js vm: shared - script: state.pvpower += 100*Math.random(); + script: state.pvpower - name: battery type: custom @@ -62,10 +76,7 @@ chargers: enable: type: js vm: shared - script: | - set(); - state.enabled = val; - if (state.enabled) state.chargepower = state.maxcurrent * 230; else state.chargepower = 0; + script: set(); state.enabled = val; enabled: type: js vm: shared @@ -79,10 +90,7 @@ chargers: maxcurrent: type: js vm: shared - script: | - set(); - state.maxcurrent = val; - if (state.enabled) state.chargepower = state.maxcurrent * 230; + script: set(); state.maxcurrent = val; vehicles: - name: demo diff --git a/cmd/dump.go b/cmd/dump.go index 080cc9491..fb6dd4998 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -69,7 +69,7 @@ func runDump(cmd *cobra.Command, args []string) { } else { for id, name := range site.Meters.BatteryMetersRef { if name != "" { - d.DumpWithHeader(fmt.Sprintf("Battery %d: %s", id, name), cp.Meter(name)) + d.DumpWithHeader(fmt.Sprintf("battery %d: %s", id, name), cp.Meter(name)) } } } diff --git a/cmd/root.go b/cmd/root.go index f1f0ecc59..4d266d384 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -226,8 +226,8 @@ func run(cmd *cobra.Command, args []string) { pushChan := configureMessengers(conf.Messaging, cache) // set channels - site.Prepare(valueChan, pushChan) site.DumpConfig() + site.Prepare(valueChan, pushChan) stopC := make(chan struct{}) exitC := make(chan struct{}) diff --git a/core/site.go b/core/site.go index f2158faad..4228e7e16 100644 --- a/core/site.go +++ b/core/site.go @@ -149,7 +149,7 @@ func meterCapabilities(name string, meter interface{}) string { _, currents := meter.(api.MeterCurrent) name += ":" - return fmt.Sprintf(" %-8s power %s energy %s currents %s", + return fmt.Sprintf(" %-10s power %s energy %s currents %s", name, presence[power], presence[energy], @@ -159,28 +159,23 @@ func meterCapabilities(name string, meter interface{}) string { // DumpConfig site configuration func (site *Site) DumpConfig() { - site.publish("siteTitle", site.Title) - site.log.INFO.Println("site config:") - site.log.INFO.Printf(" meters: grid %s pv %s battery %s", + site.log.INFO.Printf(" meters: grid %s pv %s battery %s", presence[site.gridMeter != nil], presence[len(site.pvMeters) > 0], presence[len(site.batteryMeters) > 0], ) - site.publish("gridConfigured", site.gridMeter != nil) if site.gridMeter != nil { site.log.INFO.Println(meterCapabilities("grid", site.gridMeter)) } - site.publish("pvConfigured", len(site.pvMeters) > 0) if len(site.pvMeters) > 0 { for i, pv := range site.pvMeters { site.log.INFO.Println(meterCapabilities(fmt.Sprintf("pv %d", i), pv)) } } - site.publish("batteryConfigured", len(site.batteryMeters) > 0) if len(site.batteryMeters) > 0 { for i, battery := range site.batteryMeters { _, ok := battery.(api.Battery) @@ -188,45 +183,40 @@ func (site *Site) DumpConfig() { meterCapabilities(fmt.Sprintf("battery %d", i), battery), fmt.Sprintf("soc %s", presence[ok]), ) - - if ok { - site.publish("prioritySoC", site.PrioritySoC) - } } } for i, lp := range site.loadpoints { lp.log.INFO.Printf("loadpoint %d:", i+1) - - lp.log.INFO.Printf(" mode: %s", lp.GetMode()) + lp.log.INFO.Printf(" mode: %s", lp.GetMode()) _, power := lp.charger.(api.Meter) _, energy := lp.charger.(api.MeterEnergy) _, currents := lp.charger.(api.MeterCurrent) - _, timer := lp.charger.(api.ChargeTimer) + _, phases := lp.charger.(api.ChargePhases) - lp.log.INFO.Printf(" charger: power %s energy %s currents %s timer %s", + lp.log.INFO.Printf(" charger: power %s energy %s currents %s phases %s", presence[power], presence[energy], presence[currents], - presence[timer], + presence[phases], ) - lp.log.INFO.Printf(" meters: charge %s", presence[lp.HasChargeMeter()]) + lp.log.INFO.Printf(" meters: charge %s", presence[lp.HasChargeMeter()]) lp.publish("chargeConfigured", lp.HasChargeMeter()) if lp.HasChargeMeter() { lp.log.INFO.Printf(meterCapabilities("charge", lp.chargeMeter)) } - lp.log.INFO.Printf(" vehicles: %s", presence[len(lp.vehicles) > 0]) + lp.log.INFO.Printf(" vehicles: %s", presence[len(lp.vehicles) > 0]) for i, v := range lp.vehicles { _, rng := v.(api.VehicleRange) _, finish := v.(api.VehicleFinishTimer) _, status := v.(api.ChargeState) _, climate := v.(api.VehicleClimater) - lp.log.INFO.Printf(" car %d: range %s finish %s status %s climate %s", + lp.log.INFO.Printf(" vehicle %d: range %s finish %s status %s climate %s", i, presence[rng], presence[finish], presence[status], presence[climate], ) } @@ -278,6 +268,8 @@ func (site *Site) updateMeters() error { return err } + err := retryMeter("grid", site.gridMeter, &site.gridPower) + if len(site.pvMeters) > 0 { site.pvPower = 0 @@ -300,8 +292,6 @@ func (site *Site) updateMeters() error { site.publish("pvPower", site.pvPower) } - err := retryMeter("grid", site.gridMeter, &site.gridPower) - if len(site.batteryMeters) > 0 { site.batteryPower = 0 @@ -431,6 +421,13 @@ func (site *Site) update(lp Updater) { // prepare publishes initial values func (site *Site) prepare() { + site.publish("siteTitle", site.Title) + + site.publish("gridConfigured", site.gridMeter != nil) + site.publish("pvConfigured", len(site.pvMeters) > 0) + site.publish("batteryConfigured", len(site.batteryMeters) > 0) + site.publish("prioritySoC", site.PrioritySoC) + site.publish("currency", site.tariffs.Currency.String()) site.publish("savingsSince", site.savings.Since().Unix()) } diff --git a/server/mqtt.go b/server/mqtt.go index 7669f75d4..5126cea43 100644 --- a/server/mqtt.go +++ b/server/mqtt.go @@ -104,8 +104,7 @@ func (m *MQTT) Run(site site.API, in <-chan util.Param) { // site setters m.Handler.ListenSetter(fmt.Sprintf("%s/site/prioritySoC/set", m.root), func(payload string) { - soc, err := strconv.Atoi(payload) - if err == nil { + if soc, err := strconv.Atoi(payload); err == nil { _ = site.SetPrioritySoC(float64(soc)) } })