diff --git a/api/api.go b/api/api.go
index e03e57621..bf0d11438 100644
--- a/api/api.go
+++ b/api/api.go
@@ -201,26 +201,10 @@ type Resurrector interface {
WakeUp() error
}
-// Rate is a grid tariff rate
-type Rate struct {
- Start time.Time `json:"start"`
- End time.Time `json:"end"`
- Price float64 `json:"price"`
-}
-
-// IsEmpty returns is the rate is the zero value
-func (r Rate) IsEmpty() bool {
- return r.Start.IsZero() && r.End.IsZero() && r.Price == 0
-}
-
-// Rates is a slice of (future) tariff rates
-type Rates []Rate
-
// Tariff is a tariff capable of retrieving tariff rates
type Tariff interface {
- Unit() string
Rates() (Rates, error)
- IsDynamic() bool
+ Type() TariffType
}
// AuthProvider is the ability to provide OAuth authentication through the ui
diff --git a/api/rates.go b/api/rates.go
index 104948a70..2a942a03b 100644
--- a/api/rates.go
+++ b/api/rates.go
@@ -5,6 +5,21 @@ import (
"time"
)
+// Rate is a grid tariff rate
+type Rate struct {
+ Start time.Time `json:"start"`
+ End time.Time `json:"end"`
+ Price float64 `json:"price"`
+}
+
+// IsEmpty returns is the rate is the zero value
+func (r Rate) IsEmpty() bool {
+ return r.Start.IsZero() && r.End.IsZero() && r.Price == 0
+}
+
+// Rates is a slice of (future) tariff rates
+type Rates []Rate
+
// Current returns the rates current rate or error
func (r Rates) Current(now time.Time) (Rate, error) {
for _, rr := range r {
diff --git a/api/tariff.go b/api/tariff.go
new file mode 100644
index 000000000..c433506ba
--- /dev/null
+++ b/api/tariff.go
@@ -0,0 +1,12 @@
+package api
+
+//go:generate enumer -type TariffType -trimprefix TariffType -transform=lower
+
+type TariffType int
+
+const (
+ _ TariffType = iota
+ TariffTypePriceStatic
+ TariffTypePriceDynamic
+ TariffTypeCo2
+)
diff --git a/api/tarifftype_enumer.go b/api/tarifftype_enumer.go
new file mode 100644
index 000000000..ac0a6e744
--- /dev/null
+++ b/api/tarifftype_enumer.go
@@ -0,0 +1,83 @@
+// Code generated by "enumer -type TariffType -trimprefix TariffType -transform=lower"; DO NOT EDIT.
+
+package api
+
+import (
+ "fmt"
+ "strings"
+)
+
+const _TariffTypeName = "pricestaticpricedynamicco2"
+
+var _TariffTypeIndex = [...]uint8{0, 11, 23, 26}
+
+const _TariffTypeLowerName = "pricestaticpricedynamicco2"
+
+func (i TariffType) String() string {
+ i -= 1
+ if i < 0 || i >= TariffType(len(_TariffTypeIndex)-1) {
+ return fmt.Sprintf("TariffType(%d)", i+1)
+ }
+ return _TariffTypeName[_TariffTypeIndex[i]:_TariffTypeIndex[i+1]]
+}
+
+// An "invalid array index" compiler error signifies that the constant values have changed.
+// Re-run the stringer command to generate them again.
+func _TariffTypeNoOp() {
+ var x [1]struct{}
+ _ = x[TariffTypePriceStatic-(1)]
+ _ = x[TariffTypePriceDynamic-(2)]
+ _ = x[TariffTypeCo2-(3)]
+}
+
+var _TariffTypeValues = []TariffType{TariffTypePriceStatic, TariffTypePriceDynamic, TariffTypeCo2}
+
+var _TariffTypeNameToValueMap = map[string]TariffType{
+ _TariffTypeName[0:11]: TariffTypePriceStatic,
+ _TariffTypeLowerName[0:11]: TariffTypePriceStatic,
+ _TariffTypeName[11:23]: TariffTypePriceDynamic,
+ _TariffTypeLowerName[11:23]: TariffTypePriceDynamic,
+ _TariffTypeName[23:26]: TariffTypeCo2,
+ _TariffTypeLowerName[23:26]: TariffTypeCo2,
+}
+
+var _TariffTypeNames = []string{
+ _TariffTypeName[0:11],
+ _TariffTypeName[11:23],
+ _TariffTypeName[23:26],
+}
+
+// TariffTypeString retrieves an enum value from the enum constants string name.
+// Throws an error if the param is not part of the enum.
+func TariffTypeString(s string) (TariffType, error) {
+ if val, ok := _TariffTypeNameToValueMap[s]; ok {
+ return val, nil
+ }
+
+ if val, ok := _TariffTypeNameToValueMap[strings.ToLower(s)]; ok {
+ return val, nil
+ }
+ return 0, fmt.Errorf("%s does not belong to TariffType values", s)
+}
+
+// TariffTypeValues returns all values of the enum
+func TariffTypeValues() []TariffType {
+ return _TariffTypeValues
+}
+
+// TariffTypeStrings returns a slice of all String values of the enum
+func TariffTypeStrings() []string {
+ strs := make([]string, len(_TariffTypeNames))
+ copy(strs, _TariffTypeNames)
+ return strs
+}
+
+// IsATariffType returns "true" if the value is listed in the enum definition. "false" otherwise
+func (i TariffType) IsATariffType() bool {
+ for _, v := range _TariffTypeValues {
+ if i == v {
+ return true
+ }
+ }
+ return false
+}
diff --git a/assets/js/components/ChargingPlan.story.vue b/assets/js/components/ChargingPlan.story.vue
index b0589c0a2..5510b4566 100644
--- a/assets/js/components/ChargingPlan.story.vue
+++ b/assets/js/components/ChargingPlan.story.vue
@@ -16,13 +16,25 @@ const hoursFromNow = function (hours) {
-
+
-
+
-
+
diff --git a/assets/js/components/ChargingPlan.vue b/assets/js/components/ChargingPlan.vue
index 48494152b..59b799220 100644
--- a/assets/js/components/ChargingPlan.vue
+++ b/assets/js/components/ChargingPlan.vue
@@ -111,7 +111,8 @@ export default {
vehicleSoc: Number,
vehicleName: String,
smartCostLimit: Number,
- smartCostUnit: String,
+ smartCostType: String,
+ currency: String,
},
emits: ["target-time-updated", "target-time-removed", "minsoc-updated"],
data: function () {
diff --git a/assets/js/components/Energyflow/Energyflow.story.vue b/assets/js/components/Energyflow/Energyflow.story.vue
index 9bffe116c..d6dc9487a 100644
--- a/assets/js/components/Energyflow/Energyflow.story.vue
+++ b/assets/js/components/Energyflow/Energyflow.story.vue
@@ -16,7 +16,7 @@ import Energyflow from "./Energyflow.vue";
:tariffGrid="0.25"
:tariffFeedIn="0.08"
:tariffEffectivePrice="0.08"
- smartCostUnit="EUR"
+ smartCostType="price"
smartCostAvailable
currency="EUR"
siteTitle="Home"
@@ -147,7 +147,7 @@ import Energyflow from "./Energyflow.vue";
:tariffEffectivePrice="0.08"
:tariffCo2="723"
:tariffEffectiveCo2="0"
- smartCostUnit="gCO2eq"
+ smartCostType="co2"
smartCostAvailable
currency="EUR"
siteTitle="Home"
diff --git a/assets/js/components/Energyflow/Energyflow.vue b/assets/js/components/Energyflow/Energyflow.vue
index 3cd510afb..c0f2b67d4 100644
--- a/assets/js/components/Energyflow/Energyflow.vue
+++ b/assets/js/components/Energyflow/Energyflow.vue
@@ -164,7 +164,7 @@ import GridSettingsModal from "../GridSettingsModal.vue";
import formatter from "../../mixins/formatter";
import AnimatedNumber from "../AnimatedNumber.vue";
import settings from "../../settings";
-import { CO2_UNIT } from "../../units";
+import { CO2_TYPE, PRICE_DYNAMIC_TYPE } from "../../units";
import collector from "../../mixins/collector";
import BatterySettingsModal from "../BatterySettingsModal.vue";
@@ -197,9 +197,8 @@ export default {
tariffEffectivePrice: { type: Number },
tariffCo2: { type: Number },
tariffEffectiveCo2: { type: Number },
- smartCostAvailable: { type: Boolean },
smartCostLimit: { type: Number },
- smartCostUnit: { type: String },
+ smartCostType: { type: String },
currency: { type: String },
prioritySoc: { type: Number },
bufferSoc: { type: Number },
@@ -209,6 +208,9 @@ export default {
return { detailsOpen: false, detailsCompleteHeight: null, gridSettingsModal: null };
},
computed: {
+ smartCostAvailable: function () {
+ return [CO2_TYPE, PRICE_DYNAMIC_TYPE].includes(this.smartCostType);
+ },
gridImport: function () {
return Math.max(0, this.gridPower);
},
@@ -257,7 +259,7 @@ export default {
return this.collectProps(BatterySettingsModal);
},
co2Available() {
- return this.smartCostUnit === CO2_UNIT;
+ return this.smartCostType === CO2_TYPE;
},
},
mounted() {
diff --git a/assets/js/components/GridSettingsModal.vue b/assets/js/components/GridSettingsModal.vue
index d4173bdf8..3303f9378 100644
--- a/assets/js/components/GridSettingsModal.vue
+++ b/assets/js/components/GridSettingsModal.vue
@@ -104,7 +104,7 @@