Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
180 commits
Select commit Hold shift + click to select a range
fc02695
feat: add stubs for tests and initial code structure
Flix6x Jan 20, 2025
8548047
Joule profile for target profile and original data
VladIftime Jan 20, 2025
c9468dc
Added the device state as ported from Java
VladIftime Jan 21, 2025
e0694ca
Added serialised JSON for FRBC device state
VladIftime Jan 22, 2025
20ef8c8
Added the target joule profile
VladIftime Jan 24, 2025
05bd40e
Created the first version of the python version
VladIftime Jan 31, 2025
85c98f9
Added the congestion point and root planner and a Device Planner class
VladIftime Feb 5, 2025
b95a3a9
Chore: type hints for easier debugging; removed profile insight, add …
VladIftime Feb 7, 2025
82900f2
Created pytest for FRBC
VladIftime Feb 7, 2025
10c28e5
Adding unit test
VladIftime Feb 7, 2025
108c0a8
Profile_metadata
VladIftime Feb 10, 2025
de03441
Profile_metadata
VladIftime Feb 10, 2025
e29b40d
Fixed all errors
VladIftime Feb 11, 2025
4731690
test returns null joule profile but it returns
VladIftime Feb 12, 2025
f305431
Created more robust testing. Still fails.
VladIftime Feb 14, 2025
b59e50e
Need to discuss the change to the s2-python FRBC library
VladIftime Feb 14, 2025
5f17892
Need to discuss FRBC change in s2-python
VladIftime Feb 14, 2025
7f5c99c
Need to discuss FRBC change in s2-python
VladIftime Feb 14, 2025
4d593f9
Problems at the final generation step
VladIftime Feb 19, 2025
6b2dbd4
The algorithm works with slight deviations probably due to rounding e…
VladIftime Feb 22, 2025
a0ada05
The algorithm works
VladIftime Feb 24, 2025
4d2eedb
Chore:removed prints and files used for debuggin
VladIftime Feb 24, 2025
a0915b9
Created planning service implementation that takes a device state and…
VladIftime Mar 14, 2025
2fbda15
Plan is being created
VladIftime Mar 14, 2025
d335f6a
Planning service provides initial plan
VladIftime Mar 14, 2025
047e796
Added cluster plan and global target
VladIftime Mar 19, 2025
db6728a
Root and cluster point produce a improved plan close to the target.
VladIftime Apr 2, 2025
102a239
The Planning schedule works right now. The profiling resutls are also…
VladIftime May 19, 2025
dad9e94
Scheduling 10 EVs
VladIftime Jun 2, 2025
f0e31b4
Scheduling 10 EVs
VladIftime Jun 2, 2025
7345e28
Revert "Scheduling 10 EVs"
Flix6x Jun 2, 2025
f36a85f
Dev/various planner code suggestions (#11)
Flix6x Jun 2, 2025
169fd81
refactor: fewer getters
Flix6x Jun 2, 2025
fe2ef53
revert: keep benchmark parameter values
Flix6x Jun 2, 2025
971bd35
refactor: even fewer GETters
Flix6x Jun 2, 2025
9e7bb61
dev: update benchmark parameter values
Flix6x Jun 2, 2025
dd70cb3
refactor: ever fewer GETters
Flix6x Jun 2, 2025
b7e7de2
dev: add todo
Flix6x Jun 2, 2025
f8739c3
Removed simple getters that get lost
VladIftime Jun 3, 2025
c063972
Removed simple getters that get lost
VladIftime Jun 3, 2025
3e2a6e8
Merge branch 'feat/frbc-planner' into dev/planner-speed-up-attempts
VladIftime Jun 3, 2025
8fb47cb
Merge feat/frbc-planner into dev/planner-speed-up-attempts
VladIftime Jun 3, 2025
8f32313
Speed up
VladIftime Jul 3, 2025
74332aa
revert: keep benchmark parameter values
Flix6x Jun 2, 2025
0ff0f76
fix: stop using get_profile_start and get_profile_end
Flix6x Jul 3, 2025
720d907
fix: stop using get_nr_of_timesteps
Flix6x Jul 3, 2025
e45aadd
fix: stop using get_timestep_duration
Flix6x Jul 3, 2025
75c2b12
refactor: rewrite timing parameters as planning window and resolution…
Flix6x Jul 3, 2025
eb1eb3b
dev: add todo
Flix6x Jul 3, 2025
53c51c7
fix: stop using get_elements
Flix6x Jul 3, 2025
087aa61
dev: add todos
Flix6x Jul 3, 2025
e44daeb
fix: stop using get_joules
Flix6x Jul 4, 2025
c27a71f
fix: stop using get_profile_metadata
Flix6x Jul 4, 2025
a44fd84
fix: use @property decorator on JouleProfile
Flix6x Jul 4, 2025
5369204
fix: stop using get_device_id
Flix6x Jul 4, 2025
8dd67f4
fix: stop using get_device_name
Flix6x Jul 4, 2025
aaf7a67
fix: remove unused duplicate class
Flix6x Jul 4, 2025
823c154
fix: switch DevicePlanner from getters to properties
Flix6x Jul 4, 2025
b60c506
fix: switch more getters to properties
Flix6x Jul 4, 2025
93da9cf
fix: no more get_priority_class and no more get_device_controllers
Flix6x Jul 4, 2025
1d21188
fix: missing property decorators
Flix6x Jul 4, 2025
ab6b19a
fix: stop using get_old_plan, get_proposed_plan and get_energy
Flix6x Jul 4, 2025
7afac94
fix: stop using get_origin
Flix6x Jul 4, 2025
0a78f0c
fix: stop using get_fill_level
Flix6x Jul 4, 2025
258468b
fix: stop using get_fill_level_target_profiles
Flix6x Jul 4, 2025
a476654
fix: stop using get_usage_forecasts
Flix6x Jul 4, 2025
19b0e48
fix: stop using get_connection_id
Flix6x Jul 4, 2025
dd8fda3
fix: stop using get_device_id
Flix6x Jul 4, 2025
03f12bb
fix: stop using _is_online
Flix6x Jul 4, 2025
e18a1e4
fix: stop using get_storage_status and get_actuator_statuses
Flix6x Jul 4, 2025
45934ea
fix: stop using get_energy_profile
Flix6x Jul 4, 2025
1f4a853
fix: stop using get_fill_level_profile
Flix6x Jul 4, 2025
0044e12
fix: stop using get_instruction_profile
Flix6x Jul 4, 2025
2c3e6bd
refactor: use Pydantic for DevicePlan, a pure data container
Flix6x Jul 4, 2025
f3c9533
Threading attempt
VladIftime Jul 9, 2025
480edd1
Chore:remove plots added by accident
VladIftime Jul 9, 2025
06ecf7c
Speed up of the S2FrbcDeviceStateWrapper
VladIftime Jul 21, 2025
6f9623c
Merge branch 'dev/planner-speed-up-attempts' of github.com:FlexMeasur…
VladIftime Jul 21, 2025
5f4ccb6
Speed up of the S2FrbcDeviceStateWrapper
VladIftime Jul 21, 2025
5b7c013
Revert "Speed up of the S2FrbcDeviceStateWrapper"
VladIftime Jul 21, 2025
dc789bb
Revert "Merge branch 'dev/planner-speed-up-attempts' of github.com:Fl…
VladIftime Jul 21, 2025
8270155
Speed up searches in frbc device wrapper and frbc timestep
VladIftime Jul 21, 2025
198edf0
Speed up by paralel. the device planning
VladIftime Jul 22, 2025
0418892
Removed the pngs
VladIftime Jul 29, 2025
b4df3dc
fixed flake and black problems. Still need to fix mypy
VladIftime Jul 29, 2025
09b398a
Chore: under 100 errors on mypy. Added ignores for arg-type due to li…
VladIftime Jul 31, 2025
1db26d3
Chore: Update variable initialization to use float and Optional types…
VladIftime Jul 31, 2025
13a25b4
Fix: Ensure safe return values for optional attributes in ClusterPlan…
VladIftime Jul 31, 2025
8834c9d
Chore: Enhance type safety and clarity in ClusterPlan and CongestionP…
VladIftime Jul 31, 2025
aae08ff
Refactor: Move DevicePlan class to a new module and clean up imports …
VladIftime Jul 31, 2025
0f6c432
Refactor: Introduce priority_class property in DevicePlanner and S2Fr…
VladIftime Jul 31, 2025
3e264d5
Chore: Enhance type safety in CongestionPointPlanner and S2FrbcDevice…
VladIftime Jul 31, 2025
9fceffa
Chore: Improve type safety in FrbcState and OperationModeProfileTree …
VladIftime Jul 31, 2025
6832bf5
Refactor: Update type annotations in DevicePlanner and related classe…
VladIftime Jul 31, 2025
14a789f
Refactor: Update type annotations in CongestionPointPlanner and relat…
VladIftime Jul 31, 2025
7c77ce3
Chore: Improve code readability by formatting multi-line function def…
VladIftime Jul 31, 2025
ae047a5
Chore: No more mypy errors
VladIftime Jul 31, 2025
bb516dc
Chore: Add C901 to ignore list in setup.cfg to allow for more complex…
VladIftime Jul 31, 2025
4498460
Enhance type safety in S2FrbcDeviceState by allowing arbitrary types …
VladIftime Aug 1, 2025
008a7df
Solved a weird error with flake8
VladIftime Aug 3, 2025
457e094
Update dependencies in requirements: bump flexmeasures to version 0.2…
VladIftime Aug 3, 2025
e0976c8
Refactor: Replace BaseModel with ReflexBaseModel in DevicePlan and S2…
VladIftime Aug 3, 2025
65261a3
Refactor: Remove obsolete test files.
VladIftime Aug 7, 2025
c231e74
- Introduced new energy profile JSON files for device configurations …
VladIftime Aug 11, 2025
9770f36
Refactor: Fixed pydantic version error for BaseModel arbitrart_types
VladIftime Aug 11, 2025
25497ca
MacOs gitignore
VladIftime Aug 18, 2025
5117d46
Check for correctnes of the algo
VladIftime Aug 18, 2025
47540c7
Added the plotting for cost
VladIftime Aug 18, 2025
070e188
Full pipeline attempt. Still need test.
VladIftime Aug 25, 2025
1f3031c
Full pipeline: fixing the scheduler class
VladIftime Aug 26, 2025
723c1ed
Full pipeline: removed the stand alone test
VladIftime Aug 26, 2025
a5474c1
dev: log traceback in S2Scheduler.compute() for debugging
Flix6x Sep 12, 2025
7e8aae8
fix: do not type-ignore a potential None value for congestion_point_t…
Flix6x Sep 12, 2025
c9e4446
style: mypy complains with `error: X | Y syntax for unions requires P…
Flix6x Sep 12, 2025
3447cf1
fix: upgrading s2-python to use pydantic 2
Flix6x Sep 12, 2025
4b0ccf5
dev: debug statement for DevicePlan initialization
Flix6x Sep 15, 2025
77665d7
fix: use app logger
Flix6x Sep 17, 2025
df874c5
dev: add minimum requirement for inflect package
Flix6x Sep 17, 2025
ee9a5ba
Merge branch 'dev/cost-target-porting' of github.com:FlexMeasures/fle…
VladIftime Sep 17, 2025
8c23baa
feat: support switching to costs minimizing mode, and fetch prices
Flix6x Sep 17, 2025
c16f136
feat: forward fill missing prices, while logging a warning
Flix6x Sep 17, 2025
fca1f92
fix: remove breakpoint accidentally committed
Flix6x Sep 17, 2025
a1fb028
fix: condition
Flix6x Sep 17, 2025
159a01d
feat: use a positive price in case of no prices, while logging a warning
Flix6x Sep 17, 2025
b168e8b
refactor: only log one of the two warnings
Flix6x Sep 17, 2025
a58468a
Merge branch 'dev/cost-target-porting' of github.com:FlexMeasures/fle…
VladIftime Sep 22, 2025
ae59602
Missing db-option and rate-limiting the scheduler
VladIftime Sep 22, 2025
082614b
feat: Add Flask-compatible scheduler and fix standalone operation
VladIftime Sep 23, 2025
39c1816
fix: Handle FRBCDeviceData object in Flask scheduler
VladIftime Sep 23, 2025
67f2693
Check and set device data
VladIftime Sep 23, 2025
a84efd7
dev: get price sensor from app config
Flix6x Sep 23, 2025
880fb61
fix: get price sensor before checking for whether the price sensor ex…
Flix6x Sep 23, 2025
8bd601d
fix: remove debugging statement
Flix6x Sep 23, 2025
52cdb3c
dev: revert implementation of transforming beliefs about prices into …
Flix6x Sep 23, 2025
7f93d84
dev: debug missing actuator ID in actuator configurations
Flix6x Sep 23, 2025
e945207
dev: remove buggy code
Flix6x Sep 23, 2025
d17bf08
dev: merge actuator configurations
Flix6x Sep 23, 2025
189aa07
fix: raise instead of continuining with previous_operation_mode_id se…
Flix6x Sep 24, 2025
9b2bd50
dev: log current and previous actuator configurations
Flix6x Sep 24, 2025
d955134
Actuator status now gets a list of values instead of just one
VladIftime Sep 24, 2025
19bfbd5
Merge branch 'dev/flask_compatible_scheduler' of github.com:FlexMeasu…
VladIftime Sep 24, 2025
b064732
dev: remove debug log statements that were overflowing the logs
Flix6x Oct 1, 2025
aa2d4bc
Added re-caluclation of start and end for scheduler everytime is called
VladIftime Oct 15, 2025
7732a90
Fixed timezone aware
VladIftime Oct 15, 2025
b381905
fix: timezone aware now
Flix6x Oct 15, 2025
dec75cc
fix: floor start to self.resolution
Flix6x Oct 15, 2025
5eea677
refactor: move cluster_plan.instructions
Flix6x Oct 23, 2025
bb7085e
Revert "refactor: move cluster_plan.instructions"
Flix6x Oct 23, 2025
9169a92
feat: add energy data entry for potential storage
Flix6x Oct 23, 2025
6331fe0
fix: add data unit
Flix6x Oct 23, 2025
a603bd3
fix: instructions counter
Flix6x Oct 23, 2025
d791920
Added improved logging
VladIftime Oct 28, 2025
b6f978e
Added improved logging
VladIftime Oct 28, 2025
5ab1c5d
Cost target validated (#16)
VladIftime Oct 28, 2025
f5c98f4
feat: return scheduled fill level
Flix6x Oct 29, 2025
ac0590e
Merge remote-tracking branch 'origin/dev/flask_compatible_scheduler' …
Flix6x Oct 29, 2025
c006c55
dev: log device state
Flix6x Oct 29, 2025
c2658a0
dev: log present fill level used for scheduler
Flix6x Oct 29, 2025
637cddb
Initial implementatation of ddbc
VladIftime Nov 3, 2025
a829362
Added a local itho example
VladIftime Nov 5, 2025
0183480
Changes to loging and flask scheduler
VladIftime Nov 5, 2025
9ec2b6f
clean logs
VladIftime Nov 6, 2025
ce0ce00
alignment for fill level profile and usage profile
VladIftime Nov 6, 2025
20ca50c
Upadte to the itho example
VladIftime Nov 14, 2025
e6dcacf
Merge branch 'dev/itho_schedule' of github.com:FlexMeasures/flexmeasu…
VladIftime Nov 14, 2025
201ca1b
Fix all flake8 issues in example_schedule_itho_flask.py
VladIftime Nov 14, 2025
46d7f7e
Fixed no control import
VladIftime Nov 18, 2025
c2ddbd6
The itho example works
VladIftime Nov 19, 2025
7a40ac8
The itho example works
VladIftime Nov 19, 2025
168c73e
Itho schedule works
VladIftime Nov 19, 2025
a694933
Merge branch 'dev/itho_schedule' of github.com:FlexMeasures/flexmeasu…
VladIftime Nov 19, 2025
a7aeec0
Moved itho example to new branch dev/itho_schedule
VladIftime Nov 19, 2025
5f4a000
FRBC example runs but needs changing in system description
VladIftime Nov 19, 2025
1e98939
Merge branch 'dev/itho_schedule' of github.com:FlexMeasures/flexmeasu…
VladIftime Nov 19, 2025
6187cca
dev: INFO logging level
Flix6x Nov 19, 2025
e01db3f
Merge remote-tracking branch 'refs/remotes/origin/dev/flask_compatibl…
Nov 19, 2025
61717f4
feat: clarify timing configuration in DDBC example
Flix6x Nov 20, 2025
c98a2a5
feat: set gas prices explicitly
Flix6x Nov 20, 2025
6dd03a9
Initial implementation of the No Control type (#17)
VladIftime Nov 20, 2025
b121d8f
Merge branch 'dev/itho_schedule' into dev/flask_compatible_scheduler
VladIftime Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .flake8
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ exclude = .git,__pycache__,documentation
max-line-length = 160
max-complexity = 13
select = B,C,E,F,W,B9
ignore = E501, W503, E203
ignore = E501, W503, E203, E231

7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,3 +176,10 @@ cython_debug/
.vscode
*.pickle
flexmeasures.log
*.png

#MacOS
.DS_Store
flexmeasures_s2/profile_steering/examples/example_schedule_itho_flask.py
flexmeasures_s2/profile_steering/examples/run_itho_with_debug.sh
flexmeasures_s2/profile_steering/examples/instructions/
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions .idea/flexmeasures-s2.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,14 @@
using the FLEXMEASURES_PLUGINS setting (a list).
Alternatively, if you installed this plugin as a package (e.g. via `python setup.py install`, `pip install -e` or `pip install flexmeasures_s2` should this project be on Pypi), then "flexmeasures_s2" suffices.

2.
2. Config settings (during development)

In your `flexmeasures.cfg`, you can set the following config settings for this plugin:

- `FLEXMEASURES_S2_TARGET_MODE`: "energy" or "costs"
- `FLEXMEASURES_S2_PRICE_SENSOR`: sensor ID of the price sensor

To do: move these settings to the db asset (preferred scheduler and flex-context).


## Development
Expand All @@ -29,3 +36,7 @@ or:
Try it:

pre-commit run --all-files --show-diff-on-failure

For profiling, use:

pyinstrument -o profiling_results.html test_frbc_device.py
2 changes: 1 addition & 1 deletion flexmeasures_s2/api/somedata.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from flask_security import auth_token_required
from flask_json import as_json
from flask_security import auth_token_required

from .. import flexmeasures_s2_api_bp

Expand Down
58 changes: 47 additions & 11 deletions flexmeasures_s2/api/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,52 @@
from flask import url_for
from flask_security import decorators as fs_decorators
from rq.job import Job

from flexmeasures.api.tests.test_auth_token import patched_check_token
from flexmeasures.api.tests.utils import UserContext
from flexmeasures.data.services.scheduling import (
handle_scheduling_exception,
get_data_source_for_job,
)
from flexmeasures.data.tests.utils import work_on_rq

def test_get_somedata_needs_authtoken(client):
response = client.get(
url_for("flexmeasures-s2 API.somedata"),
headers={"content-type": "application/json"},
follow_redirects=True,
)
assert response.status_code == 401 # HTTP error code 401 Unauthorized.
assert "application/json" in response.content_type
assert "not be properly authenticated" in response.json["message"]

def test_s2_frbc_api(monkeypatch, app, setup_frbc_asset):
sensor = setup_frbc_asset.sensors[0]

# TODO: The somedata endpoint requires authentication to be testes successfully.
# We'll need to add a user in conftest, which also requires us to add a db to testing
with UserContext("test_admin_user@seita.nl") as admin:
auth_token = admin.get_auth_token()

monkeypatch.setattr(fs_decorators, "_check_token", patched_check_token)
with app.test_client() as client:
trigger_schedule_response = client.post(
url_for("SensorAPI:trigger_schedule", id=sensor.id),
json={
"flex-context": {
"target-profile": {}, # add target profile
}
},
headers={"Authorization": auth_token},
)
print("Server responded with:\n%s" % trigger_schedule_response.json)
assert trigger_schedule_response.status_code == 200
job_id = trigger_schedule_response.json["schedule"]

# Now that our scheduling job was accepted, we process the scheduling queue
work_on_rq(app.queues["scheduling"], exc_handler=handle_scheduling_exception)
job = Job.fetch(job_id, connection=app.queues["scheduling"].connection).is_finished
assert job.is_finished is True

# First, make sure the expected scheduler data source is now there
job.refresh() # catch meta info that was added on this very instance
scheduler_source = get_data_source_for_job(job)
assert scheduler_source.model == "S2Scheduler"

# try to retrieve the schedule through the /sensors/<id>/schedules/<job_id> [GET] api endpoint
# todo: to be discussed: the response from the S2Scheduler might get a different format than the FM default
# get_schedule_response = client.get(
# url_for("SensorAPI:get_schedule", id=sensor.id, uuid=job_id),
# query_string={"duration": "PT48H"},
# )
# print("Server responded with:\n%s" % get_schedule_response.json)
# assert get_schedule_response.status_code == 200
50 changes: 48 additions & 2 deletions flexmeasures_s2/conftest.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
import pytest

from flask_sqlalchemy import SQLAlchemy

from flexmeasures import Asset, AssetType, Sensor, Account
from flexmeasures.app import create as create_flexmeasures_app
from flexmeasures.auth.policy import ADMIN_ROLE
from flexmeasures.conftest import ( # noqa F401
db,
fresh_db,
) # Use these fixtures to rely on the FlexMeasures database.
) # Use these fixtures to rely on the FlexMeasures database. There might be others in flexmeasures/conftest you want to also re-use
from flexmeasures.data.services.users import create_user

# There might be others in flexmeasures/conftest you want to also re-use
from flexmeasures_s2 import S2_SCHEDULER_SPECS
from flexmeasures_s2.models.const import FRBC_TYPE


@pytest.fixture(scope="session")
Expand All @@ -25,3 +31,43 @@ def app():
ctx.pop()

print("DONE WITH APP FIXTURE")


@pytest.fixture(scope="module")
def setup_admin(db: SQLAlchemy): # noqa: F811
account = Account(name="Some FlexMeasures host")
db.session.add(account)
create_user(
username="Test Admin User",
email="test_admin_user@seita.nl",
account_name=account.name,
password="testtest",
user_roles=dict(name=ADMIN_ROLE, description="A user who can do everything."),
)
yield account


@pytest.fixture(scope="module")
def setup_frbc_asset(db: SQLAlchemy, setup_admin): # noqa: F811
asset_type = AssetType(name=FRBC_TYPE)
asset = Asset(
name="Test FRBC asset",
generic_asset_type=asset_type,
owner=setup_admin,
)
asset.attributes = {
"custom-scheduler": S2_SCHEDULER_SPECS,
"flex-model": {
"S2-FRBC-device-state": None, # ?todo: add serialized state
},
}
db.session.add(asset)
sensor = Sensor(
name="power",
unit="kW",
event_resolution="PT5M",
generic_asset=asset,
)
db.session.add(sensor)
db.session.flush() # assign (asset and sensor) IDs
yield asset
Empty file.
2 changes: 2 additions & 0 deletions flexmeasures_s2/models/const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
NAMESPACE = "fm-s2"
FRBC_TYPE = f"{NAMESPACE}.FRBC"
Empty file.
Loading
Loading