Dev and simulator fixes

- Export ParameterEnum from __init__
- Add flask and numpy to dev dependencies
- Fix sim: remove run() call from test fixture, handle WEBSERVER_LIST_VARIABLES and WEBSERVER_BATCH_GET, normalize variable names to uppercase
- Remove RODS params from sim state (no longer part of sim model)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dominik Moritz Roth 2026-03-12 16:27:48 +01:00
parent c180fe4434
commit 5cfedceab7
4 changed files with 22 additions and 27 deletions

View File

@ -1 +1 @@
from nucon.core import Nucon, PumpStatus, PumpDryStatus, PumpOverloadStatus, PumpOverloadStatus, CoreState, CoolantCoreState, RodsState, NuconParameter, BreakerStatus from nucon.core import Nucon, ParameterEnum, PumpStatus, PumpDryStatus, PumpOverloadStatus, CoreState, CoolantCoreState, RodsState, NuconParameter, BreakerStatus

View File

@ -57,16 +57,6 @@ class OperatingState(Enum):
'COOLANT_CORE_CIRCULATION_PUMP_1_SPEED': [0.0], 'COOLANT_CORE_CIRCULATION_PUMP_1_SPEED': [0.0],
'COOLANT_CORE_CIRCULATION_PUMP_2_SPEED': [0.0], 'COOLANT_CORE_CIRCULATION_PUMP_2_SPEED': [0.0],
'RODS_STATUS': ['INACTIVE'], 'RODS_STATUS': ['INACTIVE'],
'RODS_MOVEMENT_SPEED': [0.0],
'RODS_MOVEMENT_SPEED_DECREASED_HIGH_TEMPERATURE': [False],
'RODS_DEFORMED': [False],
'RODS_TEMPERATURE': (18.0, 22.0),
'RODS_MAX_TEMPERATURE': [1000.0],
'RODS_POS_ORDERED': [0.0],
'RODS_POS_ACTUAL': [0.0],
'RODS_POS_REACHED': [True],
'RODS_QUANTITY': [100],
'RODS_ALIGNED': [True],
'GENERATOR_0_KW': [0.0], 'GENERATOR_0_KW': [0.0],
'GENERATOR_1_KW': [0.0], 'GENERATOR_1_KW': [0.0],
'GENERATOR_2_KW': [0.0], 'GENERATOR_2_KW': [0.0],
@ -140,16 +130,6 @@ class OperatingState(Enum):
'COOLANT_CORE_CIRCULATION_PUMP_1_SPEED': (95.0, 100.0), 'COOLANT_CORE_CIRCULATION_PUMP_1_SPEED': (95.0, 100.0),
'COOLANT_CORE_CIRCULATION_PUMP_2_SPEED': (95.0, 100.0), 'COOLANT_CORE_CIRCULATION_PUMP_2_SPEED': (95.0, 100.0),
'RODS_STATUS': ['ACTIVE'], 'RODS_STATUS': ['ACTIVE'],
'RODS_MOVEMENT_SPEED': (0.9, 1.1),
'RODS_MOVEMENT_SPEED_DECREASED_HIGH_TEMPERATURE': [False],
'RODS_DEFORMED': [False],
'RODS_TEMPERATURE': (290.0, 310.0),
'RODS_MAX_TEMPERATURE': [1000.0],
'RODS_POS_ORDERED': [50.0],
'RODS_POS_ACTUAL': (49.5, 50.5),
'RODS_POS_REACHED': [True],
'RODS_QUANTITY': [100],
'RODS_ALIGNED': [True],
'GENERATOR_0_KW': (950.0, 1050.0), 'GENERATOR_0_KW': (950.0, 1050.0),
'GENERATOR_1_KW': (950.0, 1050.0), 'GENERATOR_1_KW': (950.0, 1050.0),
'GENERATOR_2_KW': (950.0, 1050.0), 'GENERATOR_2_KW': (950.0, 1050.0),
@ -279,19 +259,35 @@ class NuconSimulator:
raise ValueError(f"Invalid value specification for parameter {param_name}") raise ValueError(f"Invalid value specification for parameter {param_name}")
self.set(param, value, force=True) self.set(param, value, force=True)
def _run(self, port: int = 8786, host: str = 'localhost', debug: bool = False): def _run(self, host: str = 'localhost', port: int = 8786, debug: bool = False):
app = Flask(__name__) app = Flask(__name__)
@app.route('/', methods=['GET']) @app.route('/', methods=['GET'])
def get_parameter(): def get_parameter():
variable = request.args.get('variable') variable = request.args.get('variable', '').upper()
if not variable: if not variable:
return jsonify({"error": "No variable specified"}), 400 return jsonify({"error": "No variable specified"}), 400
if variable == 'WEBSERVER_LIST_VARIABLES':
return '\n'.join(self._nucon._parameters.keys()), 200
if variable == 'WEBSERVER_BATCH_GET':
value_arg = request.args.get('value', '')
names = [n.strip().upper() for n in value_arg.split(',') if n.strip()]
if not names:
names = list(self._nucon._parameters.keys())
result = {}
for name in names:
try:
result[name] = str(self.get(name))
except (KeyError, AttributeError):
pass
return jsonify(result), 200
try: try:
value = self.get(variable) value = self.get(variable)
return str(value), 200 return str(value), 200
except KeyError: except (KeyError, AttributeError):
return jsonify({"error": f"Unknown variable: {variable}"}), 404 return jsonify({"error": f"Unknown variable: {variable}"}), 404
@app.route('/', methods=['POST']) @app.route('/', methods=['POST'])

View File

@ -28,7 +28,7 @@ dependencies = [
Homepage = "https://git.dominik-roth.eu/dodox/nucon" Homepage = "https://git.dominik-roth.eu/dodox/nucon"
[project.optional-dependencies] [project.optional-dependencies]
dev = ["pytest"] dev = ["pytest", "flask", "numpy"]
rl = ["gymnasium", "numpy"] rl = ["gymnasium", "numpy"]
sim = ["torch", "flask"] sim = ["torch", "flask"]
model = ["torch", "numpy"] model = ["torch", "numpy"]

View File

@ -6,7 +6,6 @@ from nucon.sim import NuconSimulator, OperatingState
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
def simulator_setup(): def simulator_setup():
simulator = NuconSimulator(port=8786) simulator = NuconSimulator(port=8786)
simulator.run()
time.sleep(1) # Give the simulator time to start time.sleep(1) # Give the simulator time to start
nucon = Nucon(port=8786) nucon = Nucon(port=8786)
return simulator, nucon return simulator, nucon