From 72e7a05957bd0bb1a2aeb00aacfa7f795db5df9f Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Thu, 4 Nov 2021 14:16:17 +0100 Subject: [PATCH 1/7] Query for most recent schedule only --- flexmeasures/api/v1_3/implementations.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/flexmeasures/api/v1_3/implementations.py b/flexmeasures/api/v1_3/implementations.py index c9fe70e9c..f1c7c032d 100644 --- a/flexmeasures/api/v1_3/implementations.py +++ b/flexmeasures/api/v1_3/implementations.py @@ -8,6 +8,7 @@ import numpy as np import pandas as pd from rq.job import Job, NoSuchJobError +from sqlalchemy import and_ from flexmeasures.utils.entity_address_utils import ( parse_entity_address, @@ -149,6 +150,25 @@ def get_device_message_response(generic_asset_name_groups, duration): .filter(Power.datetime >= schedule_start) .filter(Power.datetime < schedule_start + planning_horizon) .order_by(Power.datetime.asc()) + .join( + ( + db.session.query( + Power.datetime, + Power.data_source_id, + Power.min(Power.horizon).label( + "most_recent_belief_horizon" + ), + ) + .filter(Power.asset_id == asset.id) + .group_by(Power.datetime, Power.data_source_id) + .subquery() + ), + and_( + Power.datetime == Power.c.datetime, + Power.data_source_id == Power.c.data_source_id, + Power.horizon == Power.c.most_recent_belief_horizon, + ), + ) .all() ) consumption_schedule = pd.Series( From 2026898ed4eda7c6820848d0bd8abc2a58b8aad9 Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Thu, 4 Nov 2021 14:42:40 +0100 Subject: [PATCH 2/7] Fix subquery in get_device_message --- flexmeasures/api/v1_3/implementations.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/flexmeasures/api/v1_3/implementations.py b/flexmeasures/api/v1_3/implementations.py index f1c7c032d..57a749310 100644 --- a/flexmeasures/api/v1_3/implementations.py +++ b/flexmeasures/api/v1_3/implementations.py @@ -8,7 +8,7 @@ import numpy as np import pandas as pd from rq.job import Job, NoSuchJobError -from sqlalchemy import and_ +from sqlalchemy import and_, func from flexmeasures.utils.entity_address_utils import ( parse_entity_address, @@ -155,9 +155,7 @@ def get_device_message_response(generic_asset_name_groups, duration): db.session.query( Power.datetime, Power.data_source_id, - Power.min(Power.horizon).label( - "most_recent_belief_horizon" - ), + func.min(Power.horizon).label("most_recent_belief_horizon"), ) .filter(Power.asset_id == asset.id) .group_by(Power.datetime, Power.data_source_id) From 778486e16ea7a07d0a857a47840c26732e2696e2 Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Thu, 4 Nov 2021 14:53:22 +0100 Subject: [PATCH 3/7] One more fix of subquery in get_device_message --- flexmeasures/api/v1_3/implementations.py | 27 ++++++++++++------------ 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/flexmeasures/api/v1_3/implementations.py b/flexmeasures/api/v1_3/implementations.py index 57a749310..4f65e9b96 100644 --- a/flexmeasures/api/v1_3/implementations.py +++ b/flexmeasures/api/v1_3/implementations.py @@ -144,6 +144,16 @@ def get_device_message_response(generic_asset_name_groups, duration): return unknown_schedule( message + f'no data is known from "{schedule_data_source_name}".' ) + subq = ( + db.session.query( + Power.datetime, + Power.data_source_id, + func.min(Power.horizon).label("most_recent_belief_horizon"), + ) + .filter(Power.asset_id == asset.id) + .group_by(Power.datetime, Power.data_source_id) + .subquery() + ) power_values = ( Power.query.filter(Power.asset_id == asset.id) .filter(Power.data_source_id == scheduler_source.id) @@ -151,20 +161,11 @@ def get_device_message_response(generic_asset_name_groups, duration): .filter(Power.datetime < schedule_start + planning_horizon) .order_by(Power.datetime.asc()) .join( - ( - db.session.query( - Power.datetime, - Power.data_source_id, - func.min(Power.horizon).label("most_recent_belief_horizon"), - ) - .filter(Power.asset_id == asset.id) - .group_by(Power.datetime, Power.data_source_id) - .subquery() - ), + subq, and_( - Power.datetime == Power.c.datetime, - Power.data_source_id == Power.c.data_source_id, - Power.horizon == Power.c.most_recent_belief_horizon, + Power.datetime == subq.c.datetime, + Power.data_source_id == subq.c.data_source_id, + Power.horizon == subq.c.most_recent_belief_horizon, ), ) .all() From 9004a231b714ad21447dafaa436a1054b5b0fecc Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Sat, 6 Nov 2021 09:56:48 +0100 Subject: [PATCH 4/7] Add inline comment --- flexmeasures/api/v1_3/implementations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/flexmeasures/api/v1_3/implementations.py b/flexmeasures/api/v1_3/implementations.py index 4f65e9b96..0435c70f7 100644 --- a/flexmeasures/api/v1_3/implementations.py +++ b/flexmeasures/api/v1_3/implementations.py @@ -144,6 +144,7 @@ def get_device_message_response(generic_asset_name_groups, duration): return unknown_schedule( message + f'no data is known from "{schedule_data_source_name}".' ) + # Subquery to get the most recent schedule only subq = ( db.session.query( Power.datetime, From 6f2984fb69f89d83435097ed4b4fbd3cbc7dd3e7 Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Sat, 6 Nov 2021 22:22:50 +0100 Subject: [PATCH 5/7] Add todo for moving to the new data model --- flexmeasures/api/v1_3/implementations.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/flexmeasures/api/v1_3/implementations.py b/flexmeasures/api/v1_3/implementations.py index 0435c70f7..62054ab95 100644 --- a/flexmeasures/api/v1_3/implementations.py +++ b/flexmeasures/api/v1_3/implementations.py @@ -144,6 +144,16 @@ def get_device_message_response(generic_asset_name_groups, duration): return unknown_schedule( message + f'no data is known from "{schedule_data_source_name}".' ) + + # todo: after moving the Asset's Power data to the corresponding Sensor's TimedBeliefs, + # the query below should be replaced by: + # sensor.search_beliefs( + # event_starts_after=schedule_start, + # event_ends_before=schedule_start + planning_horizon, + # source=scheduler_source, + # most_recent_only=True, + # ) + # Subquery to get the most recent schedule only subq = ( db.session.query( From 767e13fc283ce7236f06d607a9d78280f8e8b364 Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Sun, 7 Nov 2021 22:24:37 +0100 Subject: [PATCH 6/7] Changelog entry --- documentation/changelog.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/documentation/changelog.rst b/documentation/changelog.rst index 46548b382..4f8b10cb5 100644 --- a/documentation/changelog.rst +++ b/documentation/changelog.rst @@ -18,6 +18,14 @@ Infrastructure / Support * Improve data specification for forecasting models using timely-beliefs data [see `PR #154 `_] +v0.7.1 | November XX, 2021 +=========================== + +Bugfixes +----------- +* Fix device messages, which were mixing up older and more recent schedules [see `PR #231 `_] + + v0.7.0 | October 26, 2021 =========================== From cb9379835ececcaa22dd8102dde1571e370c15cb Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Mon, 8 Nov 2021 09:59:17 +0100 Subject: [PATCH 7/7] API changelog entry --- documentation/api/change_log.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/documentation/api/change_log.rst b/documentation/api/change_log.rst index 77a990c1c..4a76a5a54 100644 --- a/documentation/api/change_log.rst +++ b/documentation/api/change_log.rst @@ -39,7 +39,14 @@ v2.0-0 | 2020-11-14 - REST endpoints for managing assets: `/assets/` (GET, POST) and `/asset/` (GET, PATCH, DELETE). -v1.3.9 | 2021-04-21 +v1.3-10 | 2021-11-08 +"""""""""""""""""""" + +*Affects all versions since v1.3*. + +- Fixed the *getDeviceMessage* endpoint for cases in which there are multiple schedules available, by returning only the most recent one. + +v1.3-9 | 2021-04-21 """"""""""""""""""" *Affects all versions since v1.0*.