Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 1 addition & 4 deletions .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,4 @@ ignore-paths=src/s2python/generated/
# avoid hangs.
jobs=1

disable=missing-class-docstring,missing-module-docstring,too-few-public-methods,missing-function-docstring,no-member

[Format]
max-line-length=120
disable=missing-class-docstring,missing-module-docstring,too-few-public-methods,missing-function-docstring,no-member,unsubscriptable-object,line-too-long
1 change: 1 addition & 0 deletions ci/typecheck.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@

. .venv/bin/activate
mypy --config-file mypy.ini src/ ./tests/unit/ examples/
pyright
91 changes: 45 additions & 46 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,27 @@ alabaster==0.7.13
# via sphinx
annotated-types==0.7.0
# via pydantic
argcomplete==3.5.0
argcomplete==3.5.3
# via datamodel-code-generator
astroid==3.2.4
# via pylint
babel==2.16.0
babel==2.17.0
# via sphinx
black==24.8.0
# via datamodel-code-generator
build==1.2.1
build==1.2.2.post1
# via pip-tools
cachetools==5.5.0
cachetools==5.5.2
# via tox
certifi==2024.8.30
certifi==2025.1.31
# via requests
cfgv==3.4.0
# via pre-commit
chardet==5.2.0
# via tox
charset-normalizer==3.3.2
charset-normalizer==3.4.1
# via requests
click==8.1.7
click==8.1.8
# via
# black
# pip-tools
Expand All @@ -37,38 +37,32 @@ colorama==0.4.6
# via tox
coverage[toml]==7.6.1
# via pytest-cov
datamodel-code-generator==0.26.0
datamodel-code-generator==0.27.3
# via s2-python (setup.cfg)
dill==0.3.8
dill==0.3.9
# via pylint
distlib==0.3.8
distlib==0.3.9
# via virtualenv
dnspython==2.6.1
# via email-validator
docutils==0.20.1
# via
# sphinx
# sphinx-rtd-theme
# sphinx-tabs
email-validator==2.2.0
# via pydantic
exceptiongroup==1.2.2
# via pytest
filelock==3.15.4
filelock==3.16.1
# via
# tox
# virtualenv
genson==1.3.0
# via datamodel-code-generator
identify==2.6.0
identify==2.6.1
# via pre-commit
idna==3.8
# via
# email-validator
# requests
idna==3.10
# via requests
imagesize==1.4.1
# via sphinx
importlib-metadata==8.4.0
importlib-metadata==8.5.0
# via
# build
# sphinx
Expand All @@ -80,23 +74,25 @@ isort==5.13.2
# via
# datamodel-code-generator
# pylint
jinja2==3.1.4
jinja2==3.1.5
# via
# datamodel-code-generator
# sphinx
markupsafe==2.1.5
# via jinja2
mccabe==0.7.0
# via pylint
mypy==1.11.2
mypy==1.14.1
# via s2-python (setup.cfg)
mypy-extensions==1.0.0
# via
# black
# mypy
nodeenv==1.9.1
# via pre-commit
packaging==24.1
# via
# pre-commit
# pyright
packaging==24.2
# via
# black
# build
Expand All @@ -109,7 +105,7 @@ pathspec==0.12.1
# via black
pip-tools==7.4.1
# via s2-python (setup.cfg)
platformdirs==4.2.2
platformdirs==4.3.6
# via
# black
# pylint
Expand All @@ -121,25 +117,27 @@ pluggy==1.5.0
# tox
pre-commit==3.5.0
# via s2-python (setup.cfg)
pydantic[email]==2.8.2
pydantic==2.10.6
# via
# datamodel-code-generator
# s2-python (setup.cfg)
pydantic-core==2.20.1
pydantic-core==2.27.2
# via pydantic
pygments==2.18.0
pygments==2.19.1
# via
# sphinx
# sphinx-tabs
pylint==3.2.7
# via s2-python (setup.cfg)
pyproject-api==1.7.1
pyproject-api==1.8.0
# via tox
pyproject-hooks==1.1.0
pyproject-hooks==1.2.0
# via
# build
# pip-tools
pytest==8.3.2
pyright==1.1.396
# via s2-python (setup.cfg)
pytest==8.3.5
# via
# pytest-cov
# pytest-timer
Expand All @@ -152,7 +150,7 @@ pytest-coverage==0.0
# via s2-python (setup.cfg)
pytest-timer==1.0.0
# via s2-python (setup.cfg)
pytz==2024.1
pytz==2025.1
# via
# babel
# s2-python (setup.cfg)
Expand All @@ -162,7 +160,7 @@ pyyaml==6.0.2
# pre-commit
requests==2.32.3
# via sphinx
six==1.16.0
six==1.17.0
# via sphinxcontrib-httpdomain
snowballstemmer==2.2.0
# via sphinx
Expand All @@ -179,9 +177,9 @@ sphinx-copybutton==0.5.2
# via s2-python (setup.cfg)
sphinx-fontawesome==0.0.6
# via s2-python (setup.cfg)
sphinx-rtd-theme==2.0.0
sphinx-rtd-theme==3.0.2
# via s2-python (setup.cfg)
sphinx-tabs==3.4.5
sphinx-tabs==3.4.7
# via s2-python (setup.cfg)
sphinxcontrib-applehelp==1.0.4
# via sphinx
Expand All @@ -199,13 +197,12 @@ sphinxcontrib-qthelp==1.0.3
# via sphinx
sphinxcontrib-serializinghtml==1.1.5
# via sphinx
toml==0.10.2
# via datamodel-code-generator
tomli==2.0.1
tomli==2.2.1
# via
# black
# build
# coverage
# datamodel-code-generator
# mypy
# pip-tools
# pylint
Expand All @@ -214,9 +211,9 @@ tomli==2.0.1
# tox
tomlkit==0.13.2
# via pylint
tox==4.18.0
tox==4.24.1
# via s2-python (setup.cfg)
types-pytz==2024.1.0.20240417
types-pytz==2024.2.0.20241221
# via s2-python (setup.cfg)
typing-extensions==4.12.2
# via
Expand All @@ -227,17 +224,19 @@ typing-extensions==4.12.2
# pydantic
# pydantic-core
# pylint
urllib3==2.2.2
# pyright
# tox
urllib3==2.2.3
# via requests
virtualenv==20.26.3
virtualenv==20.29.2
# via
# pre-commit
# tox
websockets==13.0.1
websockets==13.1
# via s2-python (setup.cfg)
wheel==0.44.0
wheel==0.45.1
# via pip-tools
zipp==3.20.1
zipp==3.20.2
# via importlib-metadata

# The following packages are considered to be unsafe in a requirements file:
Expand Down
27 changes: 14 additions & 13 deletions examples/example_frbc_rm.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import argparse
import re
from functools import partial
import logging
import sys
Expand Down Expand Up @@ -93,9 +92,7 @@ def activate(self, conn: S2Connection) -> None:
)
],
storage=FRBCStorageDescription(
fill_level_range=NumberRange(
start_of_range=0.0, end_of_range=100.0
),
fill_level_range=NumberRange(start_of_range=0.0, end_of_range=100.0),
fill_level_label="%",
diagnostic_label="Imaginary battery",
provides_fill_level_target_profile=True,
Expand All @@ -113,15 +110,11 @@ def activate(self, conn: S2Connection) -> None:
elements=[
FRBCFillLevelTargetProfileElement(
duration=Duration.from_milliseconds(30_000),
fill_level_range=NumberRange(
start_of_range=20.0, end_of_range=30.0
),
fill_level_range=NumberRange(start_of_range=20.0, end_of_range=30.0),
),
FRBCFillLevelTargetProfileElement(
duration=Duration.from_milliseconds(300_000),
fill_level_range=NumberRange(
start_of_range=40.0, end_of_range=50.0
),
fill_level_range=NumberRange(start_of_range=40.0, end_of_range=50.0),
),
],
)
Expand Down Expand Up @@ -153,10 +146,12 @@ def activate(self, conn: S2Connection) -> None:
def deactivate(self, conn: S2Connection) -> None:
print("The control type NoControl is now deactivated.")


def stop(s2_connection, signal_num, _current_stack_frame):
print(f"Received signal {signal_num}. Will stop S2 connection.")
s2_connection.stop()


def start_s2_session(url, client_node_id=str(uuid.uuid4())):
s2_conn = S2Connection(
url=url,
Expand All @@ -169,19 +164,25 @@ def start_s2_session(url, client_node_id=str(uuid.uuid4())):
roles=[Role(role=RoleType.ENERGY_CONSUMER, commodity=Commodity.ELECTRICITY)],
currency=Currency.EUR,
provides_forecast=False,
provides_power_measurements=[CommodityQuantity.ELECTRIC_POWER_L1]
provides_power_measurements=[CommodityQuantity.ELECTRIC_POWER_L1],
),
reconnect=True,
verify_certificate=False
verify_certificate=False,
)
signal.signal(signal.SIGINT, partial(stop, s2_conn))
signal.signal(signal.SIGTERM, partial(stop, s2_conn))

s2_conn.start_as_rm()


if __name__ == "__main__":
parser = argparse.ArgumentParser(description="A simple S2 reseource manager example.")
parser.add_argument('endpoint', type=str, help="WebSocket endpoint uri for the server (CEM) e.g. ws://localhost:8080/backend/rm/s2python-frbc/cem/dummy_model/ws")
parser.add_argument(
"endpoint",
type=str,
help="WebSocket endpoint uri for the server (CEM) e.g. "
"ws://localhost:8080/backend/rm/s2python-frbc/cem/dummy_model/ws",
)
args = parser.parse_args()

start_s2_session(args.endpoint)
10 changes: 10 additions & 0 deletions pyrightconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"include": [
"src",
"tests"
],

"defineConstant": {
"DEBUG": true
}
}
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ testing =
mypy
types-pytz
pylint
pyright


development =
Expand Down
32 changes: 32 additions & 0 deletions src/s2python/common/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,35 @@
from s2python.common.session_request import SessionRequest
from s2python.common.timer import Timer
from s2python.common.transition import Transition

__all__ = [
"RoleType",
"Currency",
"CommodityQuantity",
"Commodity",
"InstructionStatus",
"ReceptionStatusValues",
"EnergyManagementRole",
"SessionRequestType",
"ControlType",
"RevokableObjects",
"Duration",
"Role",
"Handshake",
"HandshakeResponse",
"InstructionStatusUpdate",
"NumberRange",
"PowerForecastValue",
"PowerForecastElement",
"PowerForecast",
"PowerValue",
"PowerMeasurement",
"PowerRange",
"ReceptionStatus",
"ResourceManagerDetails",
"RevokeObject",
"SelectControlType",
"SessionRequest",
"Timer",
"Transition",
]
4 changes: 3 additions & 1 deletion src/s2python/common/duration.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@


@catch_and_convert_exceptions
class Duration(GenDuration, S2MessageComponent["Duration"]):
class Duration( # pyright: ignore[reportIncompatibleMethodOverride]
GenDuration, S2MessageComponent
):
def to_timedelta(self) -> timedelta:
return timedelta(milliseconds=self.root)

Expand Down
Loading