From 69dae9248582bbec92e6036531459ceb29a44521 Mon Sep 17 00:00:00 2001 From: Javier Aranda Date: Sun, 21 Jan 2024 23:28:34 +0100 Subject: [PATCH] Refactor dailies and energy prices --- app/lib/solaris/daily_archive.rb | 32 ------- app/lib/solaris/daily_archives/base.rb | 34 ------- .../daily_archives/energy_price_export.rb | 25 ------ .../daily_archives/energy_price_import.rb | 25 ------ .../daily_archives/grid_energy_export.rb | 35 -------- .../daily_archives/grid_energy_import.rb | 35 -------- .../daily_archives/grid_power_export.rb | 17 ---- .../daily_archives/grid_power_import.rb | 17 ---- .../solaris/daily_archives/solar_energy.rb | 35 -------- app/lib/solaris/daily_archives/solar_power.rb | 17 ---- app/models/archive.rb | 4 +- .../archive_daily_energy_price_export.rb | 3 - .../archive_daily_energy_price_import.rb | 3 - .../archive_daily_grid_energy_export.rb | 3 - .../archive_daily_grid_energy_import.rb | 3 - app/models/archive_daily_grid_power_export.rb | 3 - app/models/archive_daily_grid_power_import.rb | 3 - app/models/archive_daily_solar_energy.rb | 3 - app/models/archive_daily_solar_power.rb | 3 - app/models/dailies/energy_price_export.rb | 35 ++++++++ app/models/dailies/energy_price_import.rb | 35 ++++++++ app/models/dailies/grid_energy_export.rb | 43 +++++++++ app/models/dailies/grid_energy_import.rb | 47 ++++++++++ app/models/dailies/grid_power_export.rb | 16 ++++ app/models/dailies/grid_power_import.rb | 26 ++++++ app/models/dailies/solar_energy.rb | 35 ++++++++ app/models/dailies/solar_power.rb | 16 ++++ app/models/daily.rb | 31 +++++++ app/models/energy_price.rb | 39 ++++++++ app/models/energy_prices/pvpc.rb | 11 +++ app/models/pvpc.rb | 18 ---- app/services/store_pvpc.rb | 34 ------- config/scheduler.rb | 8 +- ...=> 20230805145711_create_energy_prices.rb} | 4 +- db/migrate/20230805174919_create_archive.rb | 10 +-- ...183244_create_archive_daily_solar_power.rb | 8 -- ...20230806183244_create_daily_solar_power.rb | 8 ++ ...72241_create_archive_daily_solar_energy.rb | 9 -- ...0230807072241_create_daily_solar_energy.rb | 9 ++ ..._create_archive_daily_grid_power_export.rb | 8 -- ...07181438_create_daily_grid_power_export.rb | 8 ++ ..._create_archive_daily_grid_power_import.rb | 8 -- ...07181440_create_daily_grid_power_import.rb | 10 +++ ...create_archive_daily_grid_energy_import.rb | 9 -- ...7181444_create_daily_grid_energy_import.rb | 11 +++ ...create_archive_daily_grid_energy_export.rb | 9 -- ...7182537_create_daily_grid_energy_export.rb | 9 ++ ...reate_archive_daily_energy_price_import.rb | 11 --- ...184043_create_daily_energy_price_import.rb | 11 +++ ...reate_archive_daily_energy_price_export.rb | 11 --- ...185034_create_daily_energy_price_export.rb | 11 +++ db/schema.rb | 88 ++++++++++--------- test/fixtures/archives.yml | 7 -- test/fixtures/{pvpc.yml => energy_prices.yml} | 60 ++++++++----- .../dailies/energy_price_export_test.rb | 60 +++++++++++++ .../dailies/energy_price_import_test.rb | 60 +++++++++++++ test/models/dailies/grid_power_export_test.rb | 46 ++++++++++ test/models/dailies/grid_power_import_test.rb | 67 ++++++++++++++ test/models/dailies/solar_energy_test.rb | 58 ++++++++++++ test/models/dailies/solar_power_test.rb | 48 ++++++++++ test/models/energy_price_test.rb | 24 +++++ test/models/pvpc_test.rb | 24 ----- 62 files changed, 870 insertions(+), 530 deletions(-) delete mode 100644 app/lib/solaris/daily_archive.rb delete mode 100644 app/lib/solaris/daily_archives/base.rb delete mode 100644 app/lib/solaris/daily_archives/energy_price_export.rb delete mode 100644 app/lib/solaris/daily_archives/energy_price_import.rb delete mode 100644 app/lib/solaris/daily_archives/grid_energy_export.rb delete mode 100644 app/lib/solaris/daily_archives/grid_energy_import.rb delete mode 100644 app/lib/solaris/daily_archives/grid_power_export.rb delete mode 100644 app/lib/solaris/daily_archives/grid_power_import.rb delete mode 100644 app/lib/solaris/daily_archives/solar_energy.rb delete mode 100644 app/lib/solaris/daily_archives/solar_power.rb delete mode 100644 app/models/archive_daily_energy_price_export.rb delete mode 100644 app/models/archive_daily_energy_price_import.rb delete mode 100644 app/models/archive_daily_grid_energy_export.rb delete mode 100644 app/models/archive_daily_grid_energy_import.rb delete mode 100644 app/models/archive_daily_grid_power_export.rb delete mode 100644 app/models/archive_daily_grid_power_import.rb delete mode 100644 app/models/archive_daily_solar_energy.rb delete mode 100644 app/models/archive_daily_solar_power.rb create mode 100644 app/models/dailies/energy_price_export.rb create mode 100644 app/models/dailies/energy_price_import.rb create mode 100644 app/models/dailies/grid_energy_export.rb create mode 100644 app/models/dailies/grid_energy_import.rb create mode 100644 app/models/dailies/grid_power_export.rb create mode 100644 app/models/dailies/grid_power_import.rb create mode 100644 app/models/dailies/solar_energy.rb create mode 100644 app/models/dailies/solar_power.rb create mode 100644 app/models/daily.rb create mode 100644 app/models/energy_price.rb create mode 100644 app/models/energy_prices/pvpc.rb delete mode 100644 app/models/pvpc.rb delete mode 100644 app/services/store_pvpc.rb rename db/migrate/{20230805145711_create_pvpc.rb => 20230805145711_create_energy_prices.rb} (57%) delete mode 100644 db/migrate/20230806183244_create_archive_daily_solar_power.rb create mode 100644 db/migrate/20230806183244_create_daily_solar_power.rb delete mode 100644 db/migrate/20230807072241_create_archive_daily_solar_energy.rb create mode 100644 db/migrate/20230807072241_create_daily_solar_energy.rb delete mode 100644 db/migrate/20230807181438_create_archive_daily_grid_power_export.rb create mode 100644 db/migrate/20230807181438_create_daily_grid_power_export.rb delete mode 100644 db/migrate/20230807181440_create_archive_daily_grid_power_import.rb create mode 100644 db/migrate/20230807181440_create_daily_grid_power_import.rb delete mode 100644 db/migrate/20230807181444_create_archive_daily_grid_energy_import.rb create mode 100644 db/migrate/20230807181444_create_daily_grid_energy_import.rb delete mode 100644 db/migrate/20230807182537_create_archive_daily_grid_energy_export.rb create mode 100644 db/migrate/20230807182537_create_daily_grid_energy_export.rb delete mode 100644 db/migrate/20230808184043_create_archive_daily_energy_price_import.rb create mode 100644 db/migrate/20230808184043_create_daily_energy_price_import.rb delete mode 100644 db/migrate/20230808185034_create_archive_daily_energy_price_export.rb create mode 100644 db/migrate/20230808185034_create_daily_energy_price_export.rb delete mode 100644 test/fixtures/archives.yml rename test/fixtures/{pvpc.yml => energy_prices.yml} (78%) create mode 100644 test/models/dailies/energy_price_export_test.rb create mode 100644 test/models/dailies/energy_price_import_test.rb create mode 100644 test/models/dailies/grid_power_export_test.rb create mode 100644 test/models/dailies/grid_power_import_test.rb create mode 100644 test/models/dailies/solar_energy_test.rb create mode 100644 test/models/dailies/solar_power_test.rb create mode 100644 test/models/energy_price_test.rb delete mode 100644 test/models/pvpc_test.rb diff --git a/app/lib/solaris/daily_archive.rb b/app/lib/solaris/daily_archive.rb deleted file mode 100644 index 846d8c5..0000000 --- a/app/lib/solaris/daily_archive.rb +++ /dev/null @@ -1,32 +0,0 @@ -module Solaris - class DailyArchive - def self.run(date = Date.yesterday) - new(date).run - end - - def initialize(date) - @date = date - end - - def run - classes.each do |klass| - klass.new(@date, Archive.by_date(@date)).run - end - end - - private - - def classes - [ - Solaris::DailyArchives::SolarEnergy, - Solaris::DailyArchives::SolarPower, - Solaris::DailyArchives::GridPowerImport, - Solaris::DailyArchives::GridPowerExport, - Solaris::DailyArchives::GridEnergyImport, - Solaris::DailyArchives::GridEnergyExport, - Solaris::DailyArchives::EnergyPriceImport, - Solaris::DailyArchives::EnergyPriceExport - ] - end - end -end diff --git a/app/lib/solaris/daily_archives/base.rb b/app/lib/solaris/daily_archives/base.rb deleted file mode 100644 index 59356f2..0000000 --- a/app/lib/solaris/daily_archives/base.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Solaris - module DailyArchives - class Base - attr_reader :date, :archives - - def initialize(date, archives) - @date = date - @archives = archives - end - - def run - instance = model.find_or_initialize_by(date: @date) - instance.assign_attributes(aggregations) - instance.save! - end - - private - - def aggregations_columns - %i[max maxtime min mintime sum avg] - end - - def aggregations - aggregations_columns.each_with_object({}) do |column, hash| - hash[column] = send(column) if respond_to?(column) - end - end - - def model - "ArchiveDaily#{self.class.name.demodulize}".constantize - end - end - end -end diff --git a/app/lib/solaris/daily_archives/energy_price_export.rb b/app/lib/solaris/daily_archives/energy_price_export.rb deleted file mode 100644 index 1aab39e..0000000 --- a/app/lib/solaris/daily_archives/energy_price_export.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Solaris - module DailyArchives - class EnergyPriceExport < Base - def max - ::EnergyPrice.by_date(date).maximum(:export) - end - - def maxtime - ::EnergyPrice.by_date(date).where(export: max).first.datetime - end - - def min - ::EnergyPrice.by_date(date).minimum(:export) - end - - def mintime - ::EnergyPrice.by_date(date).where(export: min).first.datetime - end - - def avg - ::EnergyPrice.by_date(date).average(:export).round(4) - end - end - end -end diff --git a/app/lib/solaris/daily_archives/energy_price_import.rb b/app/lib/solaris/daily_archives/energy_price_import.rb deleted file mode 100644 index db90f16..0000000 --- a/app/lib/solaris/daily_archives/energy_price_import.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Solaris - module DailyArchives - class EnergyPriceImport < Base - def max - ::EnergyPrice.by_date(date).maximum(:import) - end - - def maxtime - ::EnergyPrice.by_date(date).where(import: max).first.datetime - end - - def min - ::EnergyPrice.by_date(date).minimum(:import) - end - - def mintime - ::EnergyPrice.by_date(date).where(import: min).first.datetime - end - - def avg - ::EnergyPrice.by_date(date).average(:import).round(4) - end - end - end -end diff --git a/app/lib/solaris/daily_archives/grid_energy_export.rb b/app/lib/solaris/daily_archives/grid_energy_export.rb deleted file mode 100644 index 345fca2..0000000 --- a/app/lib/solaris/daily_archives/grid_energy_export.rb +++ /dev/null @@ -1,35 +0,0 @@ -module Solaris - module DailyArchives - class GridEnergyExport < Base - def max - sum_by_hour.values.max.round(2) - end - - def maxtime - date.to_time.change(hour: sum_by_hour.max_by { |a| a[1] }.first) - end - - def sum - (archives_array.last.grid_energy_export - archives_array.first.grid_energy_export).round(2) - end - - private - - def archives_array - @archives_array ||= archives.to_a - end - - def group_by_hour - @group_by_hour ||= archives_array.group_by do |archive| - archive.created_at.hour - end - end - - def sum_by_hour - @sum_by_hour ||= group_by_hour.transform_values do |archives| - archives.last.grid_energy_export - archives.first.grid_energy_export - end - end - end - end -end diff --git a/app/lib/solaris/daily_archives/grid_energy_import.rb b/app/lib/solaris/daily_archives/grid_energy_import.rb deleted file mode 100644 index 60965b1..0000000 --- a/app/lib/solaris/daily_archives/grid_energy_import.rb +++ /dev/null @@ -1,35 +0,0 @@ -module Solaris - module DailyArchives - class GridEnergyImport < Base - def max - sum_by_hour.values.max.round(2) - end - - def maxtime - date.to_time.change(hour: sum_by_hour.max_by { |a| a[1] }.first) - end - - def sum - (archives_array.last.grid_energy_import - archives_array.first.grid_energy_import).round(2) - end - - private - - def archives_array - @archives_array ||= archives.to_a - end - - def group_by_hour - @group_by_hour ||= archives_array.group_by do |archive| - archive.created_at.hour - end - end - - def sum_by_hour - @sum_by_hour ||= group_by_hour.transform_values do |archives| - archives.last.grid_energy_import - archives.first.grid_energy_import - end - end - end - end -end diff --git a/app/lib/solaris/daily_archives/grid_power_export.rb b/app/lib/solaris/daily_archives/grid_power_export.rb deleted file mode 100644 index f71c8e9..0000000 --- a/app/lib/solaris/daily_archives/grid_power_export.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Solaris - module DailyArchives - class GridPowerExport < Base - def max - _max.round(2) - end - - def maxtime - archives.where(grid_power: _max).first&.created_at - end - - def _max - archives.where("grid_power >= 0").maximum(:grid_power) || 0.0 - end - end - end -end diff --git a/app/lib/solaris/daily_archives/grid_power_import.rb b/app/lib/solaris/daily_archives/grid_power_import.rb deleted file mode 100644 index a9f465c..0000000 --- a/app/lib/solaris/daily_archives/grid_power_import.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Solaris - module DailyArchives - class GridPowerImport < Base - def max - _max.abs.round(2) - end - - def maxtime - archives.where(grid_power: _max).first&.created_at - end - - def _max - archives.where("grid_power <= 0").minimum(:grid_power) || 0.0 - end - end - end -end diff --git a/app/lib/solaris/daily_archives/solar_energy.rb b/app/lib/solaris/daily_archives/solar_energy.rb deleted file mode 100644 index 1e62927..0000000 --- a/app/lib/solaris/daily_archives/solar_energy.rb +++ /dev/null @@ -1,35 +0,0 @@ -module Solaris - module DailyArchives - class SolarEnergy < Base - def max - sum_by_hour.values.max.round(2) - end - - def maxtime - date.to_time.change(hour: sum_by_hour.max_by { |a| a[1] }.first) - end - - def sum - (archives_array.last.solar_energy - archives_array.first.solar_energy).round(2) - end - - private - - def archives_array - @archives_array ||= archives.to_a - end - - def group_by_hour - @group_by_hour ||= archives_array.group_by do |archive| - archive.created_at.hour - end - end - - def sum_by_hour - @sum_by_hour ||= group_by_hour.transform_values do |archives| - archives.last.solar_energy - archives.first.solar_energy - end - end - end - end -end diff --git a/app/lib/solaris/daily_archives/solar_power.rb b/app/lib/solaris/daily_archives/solar_power.rb deleted file mode 100644 index 7345b84..0000000 --- a/app/lib/solaris/daily_archives/solar_power.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Solaris - module DailyArchives - class SolarPower < Base - def max - _max.round(2) - end - - def maxtime - archives.where(solar_power: _max).first.created_at - end - - def _max - archives.maximum(:solar_power) - end - end - end -end diff --git a/app/models/archive.rb b/app/models/archive.rb index bf5e9ee..5db923d 100644 --- a/app/models/archive.rb +++ b/app/models/archive.rb @@ -1,5 +1,7 @@ class Archive < ApplicationRecord self.table_name = "archive" - scope :by_date, ->(date) { where(created_at: date.all_day).order(created_at: :asc) } + delegate :hour, to: :datetime + + scope :by_date, ->(date) { where(datetime: date.all_day).order(datetime: :asc) } end diff --git a/app/models/archive_daily_energy_price_export.rb b/app/models/archive_daily_energy_price_export.rb deleted file mode 100644 index 448acfd..0000000 --- a/app/models/archive_daily_energy_price_export.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailyEnergyPriceExport < ApplicationRecord - self.table_name = "archive_daily_energy_price_export" -end diff --git a/app/models/archive_daily_energy_price_import.rb b/app/models/archive_daily_energy_price_import.rb deleted file mode 100644 index 8cd4b82..0000000 --- a/app/models/archive_daily_energy_price_import.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailyEnergyPriceImport < ApplicationRecord - self.table_name = "archive_daily_energy_price_import" -end diff --git a/app/models/archive_daily_grid_energy_export.rb b/app/models/archive_daily_grid_energy_export.rb deleted file mode 100644 index 1f39559..0000000 --- a/app/models/archive_daily_grid_energy_export.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailyGridEnergyExport < ApplicationRecord - self.table_name = "archive_daily_grid_energy_export" -end diff --git a/app/models/archive_daily_grid_energy_import.rb b/app/models/archive_daily_grid_energy_import.rb deleted file mode 100644 index cc6487f..0000000 --- a/app/models/archive_daily_grid_energy_import.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailyGridEnergyImport < ApplicationRecord - self.table_name = "archive_daily_grid_energy_import" -end diff --git a/app/models/archive_daily_grid_power_export.rb b/app/models/archive_daily_grid_power_export.rb deleted file mode 100644 index cdbae5c..0000000 --- a/app/models/archive_daily_grid_power_export.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailyGridPowerExport < ApplicationRecord - self.table_name = "archive_daily_grid_power_export" -end diff --git a/app/models/archive_daily_grid_power_import.rb b/app/models/archive_daily_grid_power_import.rb deleted file mode 100644 index 5cc246e..0000000 --- a/app/models/archive_daily_grid_power_import.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailyGridPowerImport < ApplicationRecord - self.table_name = "archive_daily_grid_power_import" -end diff --git a/app/models/archive_daily_solar_energy.rb b/app/models/archive_daily_solar_energy.rb deleted file mode 100644 index 7f223c3..0000000 --- a/app/models/archive_daily_solar_energy.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailySolarEnergy < ApplicationRecord - self.table_name = "archive_daily_solar_energy" -end diff --git a/app/models/archive_daily_solar_power.rb b/app/models/archive_daily_solar_power.rb deleted file mode 100644 index 70178e3..0000000 --- a/app/models/archive_daily_solar_power.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ArchiveDailySolarPower < ApplicationRecord - self.table_name = "archive_daily_solar_power" -end diff --git a/app/models/dailies/energy_price_export.rb b/app/models/dailies/energy_price_export.rb new file mode 100644 index 0000000..46deafc --- /dev/null +++ b/app/models/dailies/energy_price_export.rb @@ -0,0 +1,35 @@ +module Dailies + class EnergyPriceExport < Daily + self.table_name = "daily_energy_price_export" + + validates :max, presence: true, numericality: true + validates :maxhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :min, presence: true, numericality: true + validates :minhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :avg, presence: true, numericality: true + + def compute_max + EnergyPrice.by_date(date).maximum(:export) + end + + def compute_maxhour + EnergyPrice.by_date(date).max_by(&:export).try(:datetime).try(:hour) + end + + def compute_min + EnergyPrice.by_date(date).minimum(:export) + end + + def compute_minhour + EnergyPrice.by_date(date).min_by(&:export).try(:datetime).try(:hour) + end + + def compute_avg + EnergyPrice.by_date(date).average(:export).try(:round, 4) + end + end +end diff --git a/app/models/dailies/energy_price_import.rb b/app/models/dailies/energy_price_import.rb new file mode 100644 index 0000000..9b5b575 --- /dev/null +++ b/app/models/dailies/energy_price_import.rb @@ -0,0 +1,35 @@ +module Dailies + class EnergyPriceImport < Daily + self.table_name = "daily_energy_price_import" + + validates :max, presence: true, numericality: true + validates :maxhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :min, presence: true, numericality: true + validates :minhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :avg, presence: true, numericality: true + + def compute_max + EnergyPrice.by_date(date).maximum(:import) + end + + def compute_maxhour + EnergyPrice.by_date(date).max_by(&:import).try(:datetime).try(:hour) + end + + def compute_min + EnergyPrice.by_date(date).minimum(:import) + end + + def compute_minhour + EnergyPrice.by_date(date).min_by(&:import).try(:datetime).try(:hour) + end + + def compute_avg + EnergyPrice.by_date(date).average(:import).try(:round, 4) + end + end +end diff --git a/app/models/dailies/grid_energy_export.rb b/app/models/dailies/grid_energy_export.rb new file mode 100644 index 0000000..ccc8777 --- /dev/null +++ b/app/models/dailies/grid_energy_export.rb @@ -0,0 +1,43 @@ +module Dailies + class GridEnergyExport < Daily + self.table_name = "daily_grid_energy_export" + + validates :max, presence: true, numericality: { greater_than_or_equal_to: 0 } + validates :maxhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :sum, presence: true, numericality: { greater_than_or_equal_to: 0 } + + def compute_max + sum_by_hour.values.max.round(2) + end + + def compute_maxhour + sum_by_hour.max_by(&:last).first + end + + def compute_min + sum_by_hour.values.min.round(2) + end + + def compute_minhour + sum_by_hour.min_by(&:last).first + end + + def compute_sum + Archive.by_date(date).maximum(:grid_energy_export) - Archive.by_date(date).minimum(:grid_energy_export) + end + + private + + def group_by_hour + @group_by_hour ||= Archive.by_date(date).group_by(&:hour) + end + + def sum_by_hour + @sum_by_hour ||= group_by_hour.transform_values do |archives| + archives.map(&:grid_energy_export).max - archives.map(&:grid_energy_export).min + end + end + end +end diff --git a/app/models/dailies/grid_energy_import.rb b/app/models/dailies/grid_energy_import.rb new file mode 100644 index 0000000..4c710b4 --- /dev/null +++ b/app/models/dailies/grid_energy_import.rb @@ -0,0 +1,47 @@ +module Dailies + class GridEnergyImport < Daily + self.table_name = "daily_grid_energy_import" + + validates :max, presence: true, numericality: { greater_than_or_equal_to: 0 } + validates :maxhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :min, presence: true, numericality: { greater_than_or_equal_to: 0 } + validates :minhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :sum, presence: true, numericality: { greater_than_or_equal_to: 0 } + + def compute_max + sum_by_hour.values.max.round(2) + end + + def compute_maxhour + sum_by_hour.max_by(&:last).first + end + + def compute_min + sum_by_hour.values.min.round(2) + end + + def compute_minhour + sum_by_hour.min_by(&:last).first + end + + def compute_sum + Archive.by_date(date).maximum(:grid_energy_import) - Archive.by_date(date).minimum(:grid_energy_import) + end + + private + + def group_by_hour + @group_by_hour ||= Archive.by_date(date).group_by(&:hour) + end + + def sum_by_hour + @sum_by_hour ||= group_by_hour.transform_values do |archives| + archives.map(&:solar_energy).max - archives.map(&:solar_energy).min + end + end + end +end diff --git a/app/models/dailies/grid_power_export.rb b/app/models/dailies/grid_power_export.rb new file mode 100644 index 0000000..c6e7367 --- /dev/null +++ b/app/models/dailies/grid_power_export.rb @@ -0,0 +1,16 @@ +module Dailies + class GridPowerExport < Daily + self.table_name = "daily_grid_power_export" + + validates :max, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } + validates :maxtime, presence: true + + def compute_max + Archive.by_date(date).where("grid_power >= 0").maximum(:grid_power).try(:round, 2) || 0 + end + + def compute_maxtime + Archive.by_date(date).where("grid_power >= 0").max_by(&:grid_power).try(:datetime) + end + end +end diff --git a/app/models/dailies/grid_power_import.rb b/app/models/dailies/grid_power_import.rb new file mode 100644 index 0000000..54d7604 --- /dev/null +++ b/app/models/dailies/grid_power_import.rb @@ -0,0 +1,26 @@ +module Dailies + class GridPowerImport < Daily + self.table_name = "daily_grid_power_import" + + validates :max, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } + validates :maxtime, presence: true + validates :min, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } + validates :mintime, presence: true + + def compute_max + Archive.by_date(date).where("grid_power <= 0").minimum(:grid_power).try(:abs).try(:round, 2) || 0 + end + + def compute_maxtime + Archive.by_date(date).where("grid_power <= 0").min_by(&:grid_power).try(:datetime) + end + + def compute_min + Archive.by_date(date).where("grid_power <= 0").maximum(:grid_power).try(:abs).try(:round, 2) || 0 + end + + def compute_mintime + Archive.by_date(date).where("grid_power <= 0").max_by(&:grid_power).try(:datetime) + end + end +end diff --git a/app/models/dailies/solar_energy.rb b/app/models/dailies/solar_energy.rb new file mode 100644 index 0000000..eb26e29 --- /dev/null +++ b/app/models/dailies/solar_energy.rb @@ -0,0 +1,35 @@ +module Dailies + class SolarEnergy < Daily + self.table_name = "daily_solar_energy" + + validates :max, presence: true, numericality: { greater_than_or_equal_to: 0 } + validates :maxhour, presence: true, numericality: { + only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 23 + } + validates :sum, presence: true, numericality: { greater_than_or_equal_to: 0 } + + def compute_max + sum_by_hour.values.max.round(2) + end + + def compute_maxhour + sum_by_hour.max_by(&:last).first + end + + def compute_sum + Archive.by_date(date).maximum(:solar_energy) + end + + private + + def group_by_hour + @group_by_hour ||= Archive.by_date(date).group_by(&:hour) + end + + def sum_by_hour + @sum_by_hour ||= group_by_hour.transform_values do |archives| + archives.map(&:solar_energy).max - archives.map(&:solar_energy).min + end + end + end +end diff --git a/app/models/dailies/solar_power.rb b/app/models/dailies/solar_power.rb new file mode 100644 index 0000000..648b174 --- /dev/null +++ b/app/models/dailies/solar_power.rb @@ -0,0 +1,16 @@ +module Dailies + class SolarPower < Daily + self.table_name = "daily_solar_power" + + validates :max, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } + validates :maxtime, presence: true + + def compute_max + Archive.by_date(date).maximum(:solar_power) + end + + def compute_maxtime + Archive.by_date(date).max_by(&:solar_power).try(:datetime) + end + end +end diff --git a/app/models/daily.rb b/app/models/daily.rb new file mode 100644 index 0000000..ba918f9 --- /dev/null +++ b/app/models/daily.rb @@ -0,0 +1,31 @@ +class Daily < ApplicationRecord + self.abstract_class = true + + before_validation :compute + + def self.run(date = Date.current.yesterday) + dailies.map do |klass| + klass.find_or_initialize_by(date:).tap(&:save) + end + end + + private_class_method def self.dailies + [ + Dailies::EnergyPriceImport, + Dailies::EnergyPriceExport, + Dailies::SolarPower + ] + end + + private + + def compute + %i[max maxtime maxhour min mintime minhour sum avg].each do |column| + send("#{column}=", send("compute_#{column}")) if respond_to?("compute_#{column}") + end + end + + def to_hourly(time) + time.present? ? date.to_time.change(hour: time.hour) : nil + end +end diff --git a/app/models/energy_price.rb b/app/models/energy_price.rb new file mode 100644 index 0000000..a93e0ae --- /dev/null +++ b/app/models/energy_price.rb @@ -0,0 +1,39 @@ +class EnergyPrice < ApplicationRecord + validates :import, presence: true, numericality: true + validates :export, presence: true, numericality: true + + scope :by_date, ->(date) { where(datetime: date.all_day).order(datetime: :asc) } + + before_validation :set_factor, on: :create + + def self.import(date) + raise NotImplementedError + end + + def self.export(date) + raise NotImplementedError + end + + def self.read(date = Date.current) + { import: import(date) || {}, export: export(date) || {} } + end + + def self.store(date = Date.current) + read(date).tap do |values| + values[:import].each_pair do |datetime, value| + find_or_create_by(datetime:) do |ep| + ep.import = value + ep.export = values[:export][datetime] + end + end + end + end + + private + + def set_factor + return unless import.present? && export.present? + + self.factor = [(import / export).round(2), 99].min + end +end diff --git a/app/models/energy_prices/pvpc.rb b/app/models/energy_prices/pvpc.rb new file mode 100644 index 0000000..4a034bd --- /dev/null +++ b/app/models/energy_prices/pvpc.rb @@ -0,0 +1,11 @@ +module EnergyPrices + class PVPC < EnergyPrice + def self.import(date) + ESIOS::Import.for_date(date) + end + + def self.export(date) + ESIOS::Export.for_date(date) + end + end +end diff --git a/app/models/pvpc.rb b/app/models/pvpc.rb deleted file mode 100644 index a9c6ee2..0000000 --- a/app/models/pvpc.rb +++ /dev/null @@ -1,18 +0,0 @@ -class PVPC < ApplicationRecord - self.table_name = "pvpc" - - validates :import, presence: true - validates :export, presence: true - - scope :by_date, ->(date) { where(datetime: date.all_day).order(datetime: :asc) } - - before_validation :set_factor, on: :create - - private - - def set_factor - return unless import.present? && export.present? - - self.factor = [(import / export).round(2), 99].min - end -end diff --git a/app/services/store_pvpc.rb b/app/services/store_pvpc.rb deleted file mode 100644 index b700992..0000000 --- a/app/services/store_pvpc.rb +++ /dev/null @@ -1,34 +0,0 @@ -class StorePVPC - def self.run(date = Date.current) - new(date).run - end - - def initialize(date) - @date = date - end - - def run - read[:import].each_pair do |datetime, value| - PVPC.find_or_create_by(datetime:) do |pvpc| - pvpc.import = value - pvpc.export = read[:export][datetime] - end - end - - read - end - - private - - def read - @read ||= { import: import || {}, export: export || {} } - end - - def import - ESIOS::Import.for_date(@date) - end - - def export - ESIOS::Export.for_date(@date) - end -end diff --git a/config/scheduler.rb b/config/scheduler.rb index 809f635..ec83597 100644 --- a/config/scheduler.rb +++ b/config/scheduler.rb @@ -6,13 +6,13 @@ end if Rails.configuration.x.esios.api_key.present? - scheduler.cron "0 21 * * * Europe/Madrid", name: "solaris.energy_price" do - StorePVPC.run(Date.tomorrow) + scheduler.cron "0 21 * * * Europe/Madrid", name: "solaris.energy_prices.pvpc" do + EnergyPrices::PVPC.store(Date.current.tomorrow) end end -scheduler.cron "1 0 * * * #{Rails.application.config.time_zone}", name: "solaris.archive.daily" do - Solaris::DailyArchive.run +scheduler.cron "1 0 * * * #{Rails.application.config.time_zone}", name: "solaris.daily" do + Daily.run end scheduler.join diff --git a/db/migrate/20230805145711_create_pvpc.rb b/db/migrate/20230805145711_create_energy_prices.rb similarity index 57% rename from db/migrate/20230805145711_create_pvpc.rb rename to db/migrate/20230805145711_create_energy_prices.rb index 290bd2c..6d8715b 100644 --- a/db/migrate/20230805145711_create_pvpc.rb +++ b/db/migrate/20230805145711_create_energy_prices.rb @@ -1,6 +1,6 @@ -class CreatePVPC < ActiveRecord::Migration[7.1] +class CreateEnergyPrices < ActiveRecord::Migration[7.1] def change - create_table :pvpc, id: { type: :datetime, precision: 0 }, primary_key: :datetime do |t| + create_table :energy_prices, id: { type: :datetime, precision: 0 }, primary_key: :datetime do |t| t.decimal :import, precision: 8, scale: 6, null: false t.decimal :export, precision: 8, scale: 6, null: false t.decimal :factor, precision: 4, scale: 2, null: false diff --git a/db/migrate/20230805174919_create_archive.rb b/db/migrate/20230805174919_create_archive.rb index 7cbde35..14e8ada 100644 --- a/db/migrate/20230805174919_create_archive.rb +++ b/db/migrate/20230805174919_create_archive.rb @@ -1,11 +1,11 @@ class CreateArchive < ActiveRecord::Migration[7.1] def change create_table :archive, id: { type: :datetime, precision: 0 }, primary_key: :datetime do |t| - t.float :solar_power, null: false - t.float :solar_energy, null: false - t.float :grid_power, null: false - t.float :grid_energy_export, null: false - t.float :grid_energy_import, null: false + t.integer :solar_power, null: false + t.decimal :solar_energy, precision: 4, scale: 2, null: false + t.integer :grid_power, null: false + t.decimal :grid_energy_export, precision: 8, scale: 2, null: false + t.decimal :grid_energy_import, precision: 8, scale: 2, null: false end end end diff --git a/db/migrate/20230806183244_create_archive_daily_solar_power.rb b/db/migrate/20230806183244_create_archive_daily_solar_power.rb deleted file mode 100644 index 194ae3d..0000000 --- a/db/migrate/20230806183244_create_archive_daily_solar_power.rb +++ /dev/null @@ -1,8 +0,0 @@ -class CreateArchiveDailySolarPower < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_solar_power, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime, null: false - end - end -end diff --git a/db/migrate/20230806183244_create_daily_solar_power.rb b/db/migrate/20230806183244_create_daily_solar_power.rb new file mode 100644 index 0000000..598623b --- /dev/null +++ b/db/migrate/20230806183244_create_daily_solar_power.rb @@ -0,0 +1,8 @@ +class CreateDailySolarPower < ActiveRecord::Migration[7.1] + def change + create_table :daily_solar_power, id: :date, primary_key: :date do |t| + t.integer :max, null: false + t.datetime :maxtime, null: false + end + end +end diff --git a/db/migrate/20230807072241_create_archive_daily_solar_energy.rb b/db/migrate/20230807072241_create_archive_daily_solar_energy.rb deleted file mode 100644 index 912c6bb..0000000 --- a/db/migrate/20230807072241_create_archive_daily_solar_energy.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateArchiveDailySolarEnergy < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_solar_energy, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime, null: false - t.float :sum, null: false - end - end -end diff --git a/db/migrate/20230807072241_create_daily_solar_energy.rb b/db/migrate/20230807072241_create_daily_solar_energy.rb new file mode 100644 index 0000000..9275bf7 --- /dev/null +++ b/db/migrate/20230807072241_create_daily_solar_energy.rb @@ -0,0 +1,9 @@ +class CreateDailySolarEnergy < ActiveRecord::Migration[7.1] + def change + create_table :daily_solar_energy, id: :date, primary_key: :date do |t| + t.decimal :max, precision: 4, scale: 2, null: false + t.integer :maxhour, null: false + t.decimal :sum, precision: 8, scale: 2, null: false + end + end +end diff --git a/db/migrate/20230807181438_create_archive_daily_grid_power_export.rb b/db/migrate/20230807181438_create_archive_daily_grid_power_export.rb deleted file mode 100644 index cc9cfe5..0000000 --- a/db/migrate/20230807181438_create_archive_daily_grid_power_export.rb +++ /dev/null @@ -1,8 +0,0 @@ -class CreateArchiveDailyGridPowerExport < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_grid_power_export, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime - end - end -end diff --git a/db/migrate/20230807181438_create_daily_grid_power_export.rb b/db/migrate/20230807181438_create_daily_grid_power_export.rb new file mode 100644 index 0000000..f039751 --- /dev/null +++ b/db/migrate/20230807181438_create_daily_grid_power_export.rb @@ -0,0 +1,8 @@ +class CreateDailyGridPowerExport < ActiveRecord::Migration[7.1] + def change + create_table :daily_grid_power_export, id: :date, primary_key: :date do |t| + t.integer :max, null: false + t.datetime :maxtime, null: false + end + end +end diff --git a/db/migrate/20230807181440_create_archive_daily_grid_power_import.rb b/db/migrate/20230807181440_create_archive_daily_grid_power_import.rb deleted file mode 100644 index 98fa1b4..0000000 --- a/db/migrate/20230807181440_create_archive_daily_grid_power_import.rb +++ /dev/null @@ -1,8 +0,0 @@ -class CreateArchiveDailyGridPowerImport < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_grid_power_import, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime - end - end -end diff --git a/db/migrate/20230807181440_create_daily_grid_power_import.rb b/db/migrate/20230807181440_create_daily_grid_power_import.rb new file mode 100644 index 0000000..0ae5687 --- /dev/null +++ b/db/migrate/20230807181440_create_daily_grid_power_import.rb @@ -0,0 +1,10 @@ +class CreateDailyGridPowerImport < ActiveRecord::Migration[7.1] + def change + create_table :daily_grid_power_import, id: :date, primary_key: :date do |t| + t.integer :max, null: false + t.datetime :maxtime, null: false + t.integer :min, null: false + t.datetime :mintime, null: false + end + end +end diff --git a/db/migrate/20230807181444_create_archive_daily_grid_energy_import.rb b/db/migrate/20230807181444_create_archive_daily_grid_energy_import.rb deleted file mode 100644 index ab4be47..0000000 --- a/db/migrate/20230807181444_create_archive_daily_grid_energy_import.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateArchiveDailyGridEnergyImport < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_grid_energy_import, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime, null: false - t.float :sum, null: false - end - end -end diff --git a/db/migrate/20230807181444_create_daily_grid_energy_import.rb b/db/migrate/20230807181444_create_daily_grid_energy_import.rb new file mode 100644 index 0000000..3db6834 --- /dev/null +++ b/db/migrate/20230807181444_create_daily_grid_energy_import.rb @@ -0,0 +1,11 @@ +class CreateDailyGridEnergyImport < ActiveRecord::Migration[7.1] + def change + create_table :daily_grid_energy_import, id: :date, primary_key: :date do |t| + t.decimal :max, precision: 8, scale: 2, null: false + t.integer :maxhour, null: false + t.decimal :min, precision: 8, scale: 2, null: false + t.integer :minhour, null: false + t.decimal :sum, precision: 8, scale: 2, null: false + end + end +end diff --git a/db/migrate/20230807182537_create_archive_daily_grid_energy_export.rb b/db/migrate/20230807182537_create_archive_daily_grid_energy_export.rb deleted file mode 100644 index dbb0222..0000000 --- a/db/migrate/20230807182537_create_archive_daily_grid_energy_export.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateArchiveDailyGridEnergyExport < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_grid_energy_export, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime, null: false - t.float :sum, null: false - end - end -end diff --git a/db/migrate/20230807182537_create_daily_grid_energy_export.rb b/db/migrate/20230807182537_create_daily_grid_energy_export.rb new file mode 100644 index 0000000..1d300b7 --- /dev/null +++ b/db/migrate/20230807182537_create_daily_grid_energy_export.rb @@ -0,0 +1,9 @@ +class CreateDailyGridEnergyExport < ActiveRecord::Migration[7.1] + def change + create_table :daily_grid_energy_export, id: :date, primary_key: :date do |t| + t.decimal :max, precision: 8, scale: 2, null: false + t.integer :maxhour, null: false + t.decimal :sum, precision: 8, scale: 2, null: false + end + end +end diff --git a/db/migrate/20230808184043_create_archive_daily_energy_price_import.rb b/db/migrate/20230808184043_create_archive_daily_energy_price_import.rb deleted file mode 100644 index 22b77b4..0000000 --- a/db/migrate/20230808184043_create_archive_daily_energy_price_import.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateArchiveDailyEnergyPriceImport < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_energy_price_import, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime, null: false - t.float :min, null: false - t.datetime :mintime, null: false - t.float :avg, null: false - end - end -end diff --git a/db/migrate/20230808184043_create_daily_energy_price_import.rb b/db/migrate/20230808184043_create_daily_energy_price_import.rb new file mode 100644 index 0000000..68982e7 --- /dev/null +++ b/db/migrate/20230808184043_create_daily_energy_price_import.rb @@ -0,0 +1,11 @@ +class CreateDailyEnergyPriceImport < ActiveRecord::Migration[7.1] + def change + create_table :daily_energy_price_import, id: :date, primary_key: :date do |t| + t.decimal :max, precision: 8, scale: 6, null: false + t.integer :maxhour, null: false + t.decimal :min, precision: 8, scale: 6, null: false + t.integer :minhour, null: false + t.decimal :avg, precision: 8, scale: 6, null: false + end + end +end diff --git a/db/migrate/20230808185034_create_archive_daily_energy_price_export.rb b/db/migrate/20230808185034_create_archive_daily_energy_price_export.rb deleted file mode 100644 index 5768c72..0000000 --- a/db/migrate/20230808185034_create_archive_daily_energy_price_export.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateArchiveDailyEnergyPriceExport < ActiveRecord::Migration[7.1] - def change - create_table :archive_daily_energy_price_export, id: :date, primary_key: :date do |t| - t.float :max, null: false - t.datetime :maxtime, null: false - t.float :min, null: false - t.datetime :mintime, null: false - t.float :avg, null: false - end - end -end diff --git a/db/migrate/20230808185034_create_daily_energy_price_export.rb b/db/migrate/20230808185034_create_daily_energy_price_export.rb new file mode 100644 index 0000000..cbf05c7 --- /dev/null +++ b/db/migrate/20230808185034_create_daily_energy_price_export.rb @@ -0,0 +1,11 @@ +class CreateDailyEnergyPriceExport < ActiveRecord::Migration[7.1] + def change + create_table :daily_energy_price_export, id: :date, primary_key: :date do |t| + t.decimal :max, precision: 8, scale: 6, null: false + t.integer :maxhour, null: false + t.decimal :min, precision: 8, scale: 6, null: false + t.integer :minhour, null: false + t.decimal :avg, precision: 8, scale: 6, null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 0f6d56f..0a7b3e2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,60 +12,70 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_09_182558) do create_table "archive", primary_key: "datetime", id: { type: :datetime, precision: 0 }, force: :cascade do |t| - t.float "solar_power", null: false - t.float "solar_energy", null: false - t.float "grid_power", null: false - t.float "grid_energy_export", null: false - t.float "grid_energy_import", null: false + t.integer "solar_power", null: false + t.decimal "solar_energy", precision: 4, scale: 2, null: false + t.integer "grid_power", null: false + t.decimal "grid_energy_export", precision: 8, scale: 2, null: false + t.decimal "grid_energy_import", precision: 8, scale: 2, null: false end - create_table "archive_daily_energy_price_export", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false - t.datetime "maxtime", null: false - t.float "min", null: false - t.datetime "mintime", null: false - t.float "avg", null: false + create_table "daily_energy_price_export", primary_key: "date", id: :date, force: :cascade do |t| + t.decimal "max", precision: 8, scale: 6, null: false + t.integer "maxhour", null: false + t.decimal "min", precision: 8, scale: 6, null: false + t.integer "minhour", null: false + t.decimal "avg", precision: 8, scale: 6, null: false end - create_table "archive_daily_energy_price_import", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false - t.datetime "maxtime", null: false - t.float "min", null: false - t.datetime "mintime", null: false - t.float "avg", null: false + create_table "daily_energy_price_import", primary_key: "date", id: :date, force: :cascade do |t| + t.decimal "max", precision: 8, scale: 6, null: false + t.integer "maxhour", null: false + t.decimal "min", precision: 8, scale: 6, null: false + t.integer "minhour", null: false + t.decimal "avg", precision: 8, scale: 6, null: false end - create_table "archive_daily_grid_energy_export", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false - t.datetime "maxtime", null: false - t.float "sum", null: false + create_table "daily_grid_energy_export", primary_key: "date", id: :date, force: :cascade do |t| + t.decimal "max", precision: 8, scale: 2, null: false + t.integer "maxhour", null: false + t.decimal "sum", precision: 8, scale: 2, null: false end - create_table "archive_daily_grid_energy_import", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false + create_table "daily_grid_energy_import", primary_key: "date", id: :date, force: :cascade do |t| + t.decimal "max", precision: 8, scale: 2, null: false + t.integer "maxhour", null: false + t.decimal "min", precision: 8, scale: 2, null: false + t.integer "minhour", null: false + t.decimal "sum", precision: 8, scale: 2, null: false + end + + create_table "daily_grid_power_export", primary_key: "date", id: :date, force: :cascade do |t| + t.integer "max", null: false t.datetime "maxtime", null: false - t.float "sum", null: false end - create_table "archive_daily_grid_power_export", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false - t.datetime "maxtime" + create_table "daily_grid_power_import", primary_key: "date", id: :date, force: :cascade do |t| + t.integer "max", null: false + t.datetime "maxtime", null: false + t.integer "min", null: false + t.datetime "mintime", null: false end - create_table "archive_daily_grid_power_import", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false - t.datetime "maxtime" + create_table "daily_solar_energy", primary_key: "date", id: :date, force: :cascade do |t| + t.decimal "max", precision: 4, scale: 2, null: false + t.integer "maxhour", null: false + t.decimal "sum", precision: 8, scale: 2, null: false end - create_table "archive_daily_solar_energy", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false + create_table "daily_solar_power", primary_key: "date", id: :date, force: :cascade do |t| + t.integer "max", null: false t.datetime "maxtime", null: false - t.float "sum", null: false end - create_table "archive_daily_solar_power", primary_key: "date", id: :date, force: :cascade do |t| - t.float "max", null: false - t.datetime "maxtime", null: false + create_table "energy_prices", primary_key: "datetime", id: { type: :datetime, precision: 0 }, force: :cascade do |t| + t.decimal "import", precision: 8, scale: 6, null: false + t.decimal "export", precision: 8, scale: 6, null: false + t.decimal "factor", precision: 4, scale: 2, null: false end create_table "holidays", id: false, force: :cascade do |t| @@ -76,12 +86,6 @@ t.index ["date"], name: "index_holidays_on_date", unique: true end - create_table "pvpc", primary_key: "datetime", id: { type: :datetime, precision: 0 }, force: :cascade do |t| - t.decimal "import", precision: 8, scale: 6, null: false - t.decimal "export", precision: 8, scale: 6, null: false - t.decimal "factor", precision: 4, scale: 2, null: false - end - create_table "settings", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false diff --git a/test/fixtures/archives.yml b/test/fixtures/archives.yml deleted file mode 100644 index 50af2ef..0000000 --- a/test/fixtures/archives.yml +++ /dev/null @@ -1,7 +0,0 @@ -one: - datetime: 2023-03-19T00:00:00+01:00 - solar_power: 0.0 - solar_energy: 0.0 - grid_power: 0.0 - grid_energy_export: 0.0 - grid_energy_import: 0.0 diff --git a/test/fixtures/pvpc.yml b/test/fixtures/energy_prices.yml similarity index 78% rename from test/fixtures/pvpc.yml rename to test/fixtures/energy_prices.yml index 67041f5..a1aa850 100644 --- a/test/fixtures/pvpc.yml +++ b/test/fixtures/energy_prices.yml @@ -1,143 +1,155 @@ -pvpc0: +energy_price0: + datetime: 2023-12-31T23:00:00+01:00 + import: 0.1052 + export: 0.0703 + factor: 1.5 + +energy_price1: datetime: 2024-01-01T00:00:00+01:00 import: 0.1238 export: 0.0611 factor: 2.03 -pvpc1: +energy_price2: datetime: 2024-01-01T01:00:00+01:00 import: 0.1111 export: 0.0482 factor: 2.3 -pvpc2: +energy_price3: datetime: 2024-01-01T02:00:00+01:00 import: 0.1108 export: 0.0453 factor: 2.45 -pvpc3: +energy_price4: datetime: 2024-01-01T03:00:00+01:00 import: 0.1093 export: 0.0415 factor: 2.63 -pvpc4: +energy_price5: datetime: 2024-01-01T04:00:00+01:00 import: 0.1102 export: 0.0401 factor: 2.75 -pvpc5: +energy_price6: datetime: 2024-01-01T05:00:00+01:00 import: 0.1115 export: 0.04 factor: 2.79 -pvpc6: +energy_price7: datetime: 2024-01-01T06:00:00+01:00 import: 0.11 export: 0.0403 factor: 2.73 -pvpc7: +energy_price8: datetime: 2024-01-01T07:00:00+01:00 import: 0.1069 export: 0.0404 factor: 2.65 -pvpc8: +energy_price9: datetime: 2024-01-01T08:00:00+01:00 import: 0.1073 export: 0.0414 factor: 2.59 -pvpc9: +energy_price10: datetime: 2024-01-01T09:00:00+01:00 import: 0.1033 export: 0.0404 factor: 2.56 -pvpc10: +energy_price11: datetime: 2024-01-01T10:00:00+01:00 import: 0.0764 export: 0.0234 factor: 3.26 -pvpc11: +energy_price12: datetime: 2024-01-01T11:00:00+01:00 import: 0.0476 export: 0.002 factor: 23.8 -pvpc12: +energy_price13: datetime: 2024-01-01T12:00:00+01:00 import: 0.0464 export: 0.0016 factor: 29 -pvpc13: +energy_price14: datetime: 2024-01-01T13:00:00+01:00 import: 0.0447 export: 0.0005 factor: 89.4 -pvpc14: +energy_price15: datetime: 2024-01-01T14:00:00+01:00 import: 0.0442 export: 0.0002 factor: 99 -pvpc15: +energy_price16: datetime: 2024-01-01T15:00:00+01:00 import: 0.0513 export: 0.0041 factor: 12.51 -pvpc16: +energy_price17: datetime: 2024-01-01T16:00:00+01:00 import: 0.0683 export: 0.0169 factor: 4.04 -pvpc17: +energy_price18: datetime: 2024-01-01T17:00:00+01:00 import: 0.0886 export: 0.0356 factor: 2.49 -pvpc18: +energy_price19: datetime: 2024-01-01T18:00:00+01:00 import: 0.0962 export: 0.046 factor: 2.09 -pvpc19: +energy_price20: datetime: 2024-01-01T19:00:00+01:00 import: 0.1033 export: 0.0533 factor: 1.94 -pvpc20: +energy_price21: datetime: 2024-01-01T20:00:00+01:00 import: 0.1101 export: 0.0593 factor: 1.86 -pvpc21: +energy_price22: datetime: 2024-01-01T21:00:00+01:00 import: 0.11 export: 0.0584 factor: 1.88 -pvpc22: +energy_price23: datetime: 2024-01-01T22:00:00+01:00 import: 0.0941 export: 0.0459 factor: 2.05 -pvpc23: +energy_price24: datetime: 2024-01-01T23:00:00+01:00 import: 0.0885 export: 0.0405 factor: 2.19 + +energy_price25: + datetime: 2024-01-02T00:00:00+01:00 + import: 0.0915 + export: 0.0362 + factor: 2.53 diff --git a/test/models/dailies/energy_price_export_test.rb b/test/models/dailies/energy_price_export_test.rb new file mode 100644 index 0000000..dc2606d --- /dev/null +++ b/test/models/dailies/energy_price_export_test.rb @@ -0,0 +1,60 @@ +require "test_helper" + +module Dailies + class EnergyPriceExportTest < ActiveSupport::TestCase + test "create daily energy price export without max" do + model = EnergyPriceExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:max, :blank) + end + end + + test "create daily energy price export without maxhour" do + model = EnergyPriceExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:maxhour, :blank) + end + end + + test "create daily energy price export without min" do + model = EnergyPriceExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:min, :blank) + end + end + + test "create daily energy price export without minhour" do + model = EnergyPriceExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:minhour, :blank) + end + end + + test "create daily energy price export without avg" do + model = EnergyPriceExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:avg, :blank) + end + end + + test "create daily energy price export" do + model = EnergyPriceExport.new(date: Date.parse("2024-01-01")) + + assert_in_delta 0.0611, model.compute_max + assert_in_delta 0, model.compute_maxhour + assert_in_delta 0.0002, model.compute_min + assert_in_delta 14, model.compute_minhour + assert_in_delta 0.0344, model.compute_avg + end + end +end diff --git a/test/models/dailies/energy_price_import_test.rb b/test/models/dailies/energy_price_import_test.rb new file mode 100644 index 0000000..2f0b6ed --- /dev/null +++ b/test/models/dailies/energy_price_import_test.rb @@ -0,0 +1,60 @@ +require "test_helper" + +module Dailies + class EnergyPriceImportTest < ActiveSupport::TestCase + test "create daily energy price import without max" do + model = EnergyPriceImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:max, :blank) + end + end + + test "create daily energy price import without maxhour" do + model = EnergyPriceImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:maxhour, :blank) + end + end + + test "create daily energy price import without min" do + model = EnergyPriceImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:min, :blank) + end + end + + test "create daily energy price import without minhour" do + model = EnergyPriceImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:minhour, :blank) + end + end + + test "create daily energy price import without avg" do + model = EnergyPriceImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:avg, :blank) + end + end + + test "create daily energy price import" do + model = EnergyPriceImport.new(date: Date.parse("2024-01-01")) + + assert_in_delta 0.1238, model.compute_max + assert_in_delta 0, model.compute_maxhour + assert_in_delta 0.0442, model.compute_min + assert_in_delta 14, model.compute_minhour + assert_in_delta 0.0906, model.compute_avg + end + end +end diff --git a/test/models/dailies/grid_power_export_test.rb b/test/models/dailies/grid_power_export_test.rb new file mode 100644 index 0000000..2c5ec2d --- /dev/null +++ b/test/models/dailies/grid_power_export_test.rb @@ -0,0 +1,46 @@ +require "test_helper" + +module Dailies + class GridPowerExportTest < ActiveSupport::TestCase + test "create daily grid power export without max" do + model = GridPowerExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:max, :blank) + end + end + + test "create daily grid power export without maxtime" do + model = GridPowerExport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:maxtime, :blank) + end + end + + test "create daily grid power export" do + populate_archives + + model = GridPowerExport.new(date: Date.parse("2024-01-01")) + + assert_in_delta 800, model.compute_max + assert_in_delta Time.zone.parse("2024-01-01 15:15:00"), model.compute_maxtime + end + + private + + def create_archive(attributes = {}) + Archive.create( + attributes.reverse_merge(solar_power: 0, solar_energy: 0, grid_energy_export: 0, grid_energy_import: 0) + ) + end + + def populate_archives + create_archive(datetime: Time.zone.parse("2024-01-01 09:09:00"), grid_power: -1500) + create_archive(datetime: Time.zone.parse("2024-01-01 11:11:00"), grid_power: 500) + create_archive(datetime: Time.zone.parse("2024-01-01 15:15:00"), grid_power: 800) + end + end +end diff --git a/test/models/dailies/grid_power_import_test.rb b/test/models/dailies/grid_power_import_test.rb new file mode 100644 index 0000000..61b3ecf --- /dev/null +++ b/test/models/dailies/grid_power_import_test.rb @@ -0,0 +1,67 @@ +require "test_helper" + +module Dailies + class GridPowerImportTest < ActiveSupport::TestCase + test "create daily grid power import without max" do + model = GridPowerImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:max, :blank) + end + end + + test "create daily grid power import without maxtime" do + model = GridPowerImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:maxtime, :blank) + end + end + + test "create daily grid power import without min" do + model = GridPowerImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:min, :blank) + end + end + + test "create daily grid power import without mintime" do + model = GridPowerImport.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:mintime, :blank) + end + end + + test "create daily grid power import" do + populate_archives + + model = GridPowerImport.new(date: Date.parse("2024-01-01")) + + assert_in_delta 2500, model.compute_max + assert_in_delta Time.zone.parse("2024-01-01 19:09:00"), model.compute_maxtime + assert_in_delta 1500, model.compute_min + assert_in_delta Time.zone.parse("2024-01-01 09:09:00"), model.compute_mintime + end + + private + + def create_archive(attributes = {}) + Archive.create( + attributes.reverse_merge(solar_power: 0, solar_energy: 0, grid_energy_export: 0, grid_energy_import: 0) + ) + end + + def populate_archives + create_archive(datetime: Time.zone.parse("2024-01-01 09:09:00"), grid_power: -1500) + create_archive(datetime: Time.zone.parse("2024-01-01 10:09:00"), grid_power: 300) + create_archive(datetime: Time.zone.parse("2024-01-01 16:09:00"), grid_power: 3000) + create_archive(datetime: Time.zone.parse("2024-01-01 19:09:00"), grid_power: -2500) + end + end +end diff --git a/test/models/dailies/solar_energy_test.rb b/test/models/dailies/solar_energy_test.rb new file mode 100644 index 0000000..d305c5c --- /dev/null +++ b/test/models/dailies/solar_energy_test.rb @@ -0,0 +1,58 @@ +require "test_helper" + +module Dailies + class SolarEnergyTest < ActiveSupport::TestCase + test "create daily solar energy without max" do + model = SolarEnergy.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:max, :blank) + end + end + + test "create daily solar energy without maxhour" do + model = SolarEnergy.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:maxhour, :blank) + end + end + + test "create daily solar energy without sum" do + model = SolarEnergy.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:sum, :blank) + end + end + + test "create daily solar energy" do + populate_archives + + model = SolarEnergy.new(date: Date.parse("2024-01-01")) + + assert_in_delta 2, model.compute_max + assert_in_delta 12, model.compute_maxhour + assert_in_delta 4.5, model.compute_sum + end + + private + + def create_archive(attributes = {}) + Archive.create( + attributes.reverse_merge(solar_power: 0, grid_power: 0, grid_energy_export: 0, grid_energy_import: 0) + ) + end + + def populate_archives + create_archive(datetime: Time.zone.parse("2024-01-01 12:12:00"), solar_energy: 1) + create_archive(datetime: Time.zone.parse("2024-01-01 12:24:00"), solar_energy: 3) + create_archive(datetime: Time.zone.parse("2024-01-01 16:16:00"), solar_energy: 4) + create_archive(datetime: Time.zone.parse("2024-01-01 16:32:00"), solar_energy: 4.5) + create_archive(datetime: Time.zone.parse("2024-01-02 16:20:00"), solar_energy: 6) + end + end +end diff --git a/test/models/dailies/solar_power_test.rb b/test/models/dailies/solar_power_test.rb new file mode 100644 index 0000000..1702779 --- /dev/null +++ b/test/models/dailies/solar_power_test.rb @@ -0,0 +1,48 @@ +require "test_helper" + +module Dailies + class SolarPowerTest < ActiveSupport::TestCase + test "create daily solar power without max" do + model = SolarPower.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:max, :blank) + end + end + + test "create daily solar power without maxtime" do + model = SolarPower.new(date: Date.parse("2024-01-01")) + + model.stub(:compute, true) do + assert_not model.save + assert model.errors.added?(:maxtime, :blank) + end + end + + test "create daily solar power" do + populate_archives + + model = SolarPower.new(date: Date.parse("2024-01-01")) + + assert_in_delta 2078, model.compute_max + assert_in_delta Time.zone.parse("2024-01-01 14:14:00"), model.compute_maxtime + end + + private + + def create_archive(attributes = {}) + Archive.create( + attributes.reverse_merge(solar_energy: 0, grid_power: 0, grid_energy_export: 0, grid_energy_import: 0) + ) + end + + def populate_archives + create_archive(datetime: Time.zone.parse("2023-12-31 10:10:00"), solar_power: 2100) + create_archive(datetime: Time.zone.parse("2024-01-01 12:12:00"), solar_power: 1546) + create_archive(datetime: Time.zone.parse("2024-01-01 14:14:00"), solar_power: 2078) + create_archive(datetime: Time.zone.parse("2024-01-01 18:18:00"), solar_power: 897) + create_archive(datetime: Time.zone.parse("2024-01-02 15:15:00"), solar_power: 2526) + end + end +end diff --git a/test/models/energy_price_test.rb b/test/models/energy_price_test.rb new file mode 100644 index 0000000..c06df22 --- /dev/null +++ b/test/models/energy_price_test.rb @@ -0,0 +1,24 @@ +require "test_helper" + +class EnergyPriceTest < ActiveSupport::TestCase + test "create energy price without import" do + energy_price = EnergyPrice.new + + assert_not energy_price.save + assert energy_price.errors.added?(:import, :blank) + end + + test "create energy price without export" do + energy_price = EnergyPrice.new + + assert_not energy_price.save + assert energy_price.errors.added?(:export, :blank) + end + + test "create energy price with valid attributes" do + energy_price = EnergyPrice.new(datetime: Time.current, import: 0.1, export: 0.05) + + assert energy_price.save + assert_equal 2, energy_price.factor + end +end diff --git a/test/models/pvpc_test.rb b/test/models/pvpc_test.rb deleted file mode 100644 index fb55f19..0000000 --- a/test/models/pvpc_test.rb +++ /dev/null @@ -1,24 +0,0 @@ -require "test_helper" - -class PVPCTest < ActiveSupport::TestCase - test "create without import" do - pvpc = PVPC.new - - assert_not pvpc.save - assert pvpc.errors.added?(:import, :blank) - end - - test "create without export" do - pvpc = PVPC.new - - assert_not pvpc.save - assert pvpc.errors.added?(:export, :blank) - end - - test "create with valid attributes" do - pvpc = PVPC.new(datetime: Time.current, import: 0.1, export: 0.05) - - assert pvpc.save - assert_equal 2, pvpc.factor - end -end