sungrow/tariff.go
2022-08-23 05:19:43 +00:00

76 lines
1.6 KiB
Go

package main
import (
"time"
)
const (
//dailySupplyCharge = 105.750 / 100 // 1 July 2020 - 30 June 2021
//dailySupplyCharge = 98.234 / 100 // 1 July 2021 - 30 June 2022
//dailySupplyCharge = 98.234 / 100 // 1 July 2021 - 30 June 2022
dailySupplyCharge = 1.099030 // 1 July 2021 - 30 June 2022
//solarFeedInTariff = fixedTariff(8.471 / 100) // 1 July 2020 - 30 June 2021
//solarFeedInTariff = fixedTariff(6.501 / 100) // 1 July 2021 - 30 June 2022
solarFeedInTariff = fixedTariff(0.088830) // 1 July 2022 - 30 June 2023
)
var tariff93 = &onOffPeakTariff{
// 1 July 2020 - 30 June 2021:
//onPeak: 32.137 / 100,
//offPeak: 14.963 / 100,
// 1 July 2021 - 30 June 2022:
//onPeak: 29.852 / 100,
//offPeak: 13.9 / 100,
// 1 July 2022 - 30 June 2023:
onPeak: 0.333990,
offPeak: 0.155510,
isPeak: (&weekdayHours{
zone: time.FixedZone("UTC+10", +10*60*60),
on: [24]bool{
7: true,
8: true,
9: true,
16: true,
17: true,
18: true,
19: true,
20: true,
},
}).isPeak,
}
type tariff interface {
pricePerKWh(time.Time) float64
}
type fixedTariff float64
func (f fixedTariff) pricePerKWh(time.Time) float64 { return float64(f) }
type onOffPeakTariff struct {
onPeak, offPeak float64
isPeak func(time.Time) bool
}
func (o *onOffPeakTariff) pricePerKWh(t time.Time) float64 {
if o.isPeak(t) {
return o.onPeak
}
return o.offPeak
}
type weekdayHours struct {
zone *time.Location
on [24]bool
}
func (w *weekdayHours) isPeak(t time.Time) bool {
t = t.In(w.zone)
switch t.Weekday() {
case time.Saturday, time.Sunday:
return false
default:
return w.on[t.Hour()]
}
}