ecodash/src/ecodash/database.go

123 lines
3.4 KiB
Go
Raw Normal View History

2023-05-01 17:39:12 +00:00
package ecodash
2022-10-15 17:58:44 +00:00
import (
2023-05-01 17:25:16 +00:00
"database/sql"
"errors"
2023-05-01 16:33:15 +00:00
"log"
2022-10-15 17:58:44 +00:00
"time"
)
type HistoryEntry struct {
Date int64
GreenEnergyPercentage float32
PolledSmartEnergySummation float32
2022-10-15 17:58:44 +00:00
}
type History []HistoryEntry
2022-10-15 17:58:44 +00:00
2023-05-01 17:39:12 +00:00
func (config *Config) UpdateHistory() {
greenEnergyPercentage, err := config.historyAverageAndConvertToGreen(config.Sensors.FossilPercentage, time.Now())
if err != nil {
return
}
historyPolledSmartEnergySummation, err := config.historyDelta(config.Sensors.PolledSmartEnergySummation, time.Now())
if err != nil {
return
}
2023-05-01 16:33:15 +00:00
_, err = config.db.Exec("INSERT OR REPLACE INTO cache(time,green_energy_percentage,energy_consumption) VALUES (?,?,?);", dayStart(time.Now()).Unix(), greenEnergyPercentage.Value, historyPolledSmartEnergySummation.Value)
if err != nil {
log.Println("Error inserting into cache", err.Error())
}
2022-10-15 17:58:44 +00:00
cached, err := config.readHistory()
2022-10-15 17:58:44 +00:00
if err != nil {
return
}
2023-05-01 16:33:15 +00:00
if len(cached) != 8 && time.Since(config.HomeAssistant.InstallationDate) > 8*time.Hour*24 {
err := config.refreshCacheFromPast(time.Now().Add(-8 * time.Hour * 24))
if err != nil {
2023-05-01 16:33:15 +00:00
log.Println("Error refreshing cache", err.Error())
return
}
}
}
2023-05-01 16:33:15 +00:00
func (config *Config) refreshCacheFromInstall() error {
return config.refreshCacheFromPast(config.HomeAssistant.InstallationDate)
}
2023-05-01 16:33:15 +00:00
var errNoInstallDate = errors.New("installation date not set")
2023-05-01 16:33:15 +00:00
func (config *Config) refreshCacheFromPast(pastTime time.Time) error {
// in order to avoid querying and storing each day's data from 0001-01-01 in future versions
if config.HomeAssistant.InstallationDate.IsZero() {
2023-05-01 16:33:15 +00:00
return errNoInstallDate
}
greenEnergyPercentage, err := config.historyBulkAverageAndConvertToGreen(config.Sensors.FossilPercentage, pastTime, time.Now())
2022-10-15 17:58:44 +00:00
if err != nil {
return err
}
historyPolledSmartEnergySummation, err := config.historyBulkDelta(config.Sensors.PolledSmartEnergySummation, pastTime, time.Now())
if err != nil {
return err
2022-10-15 17:58:44 +00:00
}
2023-05-01 17:25:16 +00:00
stmtReplace, err := config.db.Prepare("INSERT OR REPLACE INTO cache(time, green_energy_percentage, energy_consumption) values(?,?,?)")
if err != nil {
return err
}
defer stmtReplace.Close()
stmtIgnore, err := config.db.Prepare("INSERT OR IGNORE INTO cache(time, green_energy_percentage, energy_consumption) values(?,?,?)")
if err != nil {
return err
}
defer stmtIgnore.Close()
for key, day := range greenEnergyPercentage {
2023-05-01 17:25:16 +00:00
var stmt *sql.Stmt
if greenEnergyPercentage[key].Value != 0 && historyPolledSmartEnergySummation[key].Value != 0 {
2023-05-01 17:25:16 +00:00
stmt = stmtReplace
} else {
2023-05-01 17:25:16 +00:00
stmt = stmtIgnore
}
_, err = stmt.Exec(day.DayTime.Unix(), greenEnergyPercentage[key].Value, historyPolledSmartEnergySummation[key].Value)
if err != nil {
return err
}
2022-10-15 17:58:44 +00:00
}
return nil
2022-10-15 17:58:44 +00:00
}
2023-05-01 16:33:15 +00:00
func (config *Config) readHistory() (History, error) {
start := dayStart(time.Now()).AddDate(0, 0, -8)
rows, err := config.db.Query("SELECT time, green_energy_percentage, energy_consumption FROM cache WHERE time > ?", start.Unix())
2022-10-15 17:58:44 +00:00
if err != nil {
return History{}, err
2022-10-15 17:58:44 +00:00
}
defer rows.Close()
var ret History
2022-10-15 17:58:44 +00:00
for rows.Next() {
var (
date int64
greenEnergyPercentage float32
polledSmartEnergyConsumption float32
)
err = rows.Scan(&date, &greenEnergyPercentage, &polledSmartEnergyConsumption)
2023-05-01 16:33:15 +00:00
if err != nil {
2023-05-01 17:25:16 +00:00
return History{}, err
2023-05-01 16:33:15 +00:00
}
ret = append(ret, HistoryEntry{date, greenEnergyPercentage, polledSmartEnergyConsumption})
2022-10-15 17:58:44 +00:00
}
2023-05-01 17:25:16 +00:00
if rows.Err() != nil {
return History{}, rows.Err()
}
2022-10-15 17:58:44 +00:00
return ret, nil
2022-10-15 17:58:44 +00:00
}