From d5a021282492997b179810a7c76862b3eb52bd37 Mon Sep 17 00:00:00 2001 From: Dominik Roth Date: Tue, 18 Feb 2025 21:22:43 +0100 Subject: [PATCH] Update exposed vars to match game V2 --- nucon/core.py | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/nucon/core.py b/nucon/core.py index 5e717a2..ccf3d20 100644 --- a/nucon/core.py +++ b/nucon/core.py @@ -105,7 +105,7 @@ class NuconParameter: return self.id class Nucon: - def __init__(self, host: str = 'localhost', port: int = 8786): + def __init__(self, host: str = 'localhost', port: int = 8785): self.base_url = f'http://{host}:{port}/' self.dummy_mode = False self._parameters = self._create_parameters() @@ -159,16 +159,16 @@ class Nucon: 'COOLANT_CORE_CIRCULATION_PUMP_1_SPEED': (float, False), 'COOLANT_CORE_CIRCULATION_PUMP_2_SPEED': (float, False), 'RODS_STATUS': (RodsState, False), - 'RODS_MOVEMENT_SPEED': (float, False), - 'RODS_MOVEMENT_SPEED_DECREASED_HIGH_TEMPERATURE': (bool, False), - 'RODS_DEFORMED': (bool, False), - 'RODS_TEMPERATURE': (float, False), - 'RODS_MAX_TEMPERATURE': (float, False), - 'RODS_POS_ORDERED': (float, True), - 'RODS_POS_ACTUAL': (float, False), - 'RODS_POS_REACHED': (bool, False), - 'RODS_QUANTITY': (int, False), - 'RODS_ALIGNED': (bool, False), + #'RODS_MOVEMENT_SPEED': (float, False), + #'RODS_MOVEMENT_SPEED_DECREASED_HIGH_TEMPERATURE': (bool, False), + #'RODS_DEFORMED': (bool, False), + #'RODS_TEMPERATURE': (float, False), + #'RODS_MAX_TEMPERATURE': (float, False), + #'RODS_POS_ORDERED': (float, True), + #'RODS_POS_ACTUAL': (float, False), + #'RODS_POS_REACHED': (bool, False), + #'RODS_QUANTITY': (int, False), + #'RODS_ALIGNED': (bool, False), 'GENERATOR_0_KW': (float, False), 'GENERATOR_1_KW': (float, False), 'GENERATOR_2_KW': (float, False), @@ -210,16 +210,22 @@ class Nucon: value = self._query(parameter) if parameter.enum_type: - return parameter.enum_type(value) + try: + return parameter.enum_type(value) + except ValueError as e: + raise ValueError(f"Failed to convert {value} to {parameter.enum_type.__name__} for parameter {parameter.id}: {e}") elif parameter.param_type == bool: if isinstance(value, str): if value.lower() not in ('true', 'false'): - raise ValueError(f"Invalid boolean value: {value}") + raise ValueError(f"Invalid boolean value for parameter {parameter.id}: {value}") return value.lower() == 'true' else: - raise ValueError(f"Expected string for boolean parameter, got {type(value)}") + raise ValueError(f"Expected string for boolean parameter {parameter.id}, got {type(value)}") else: - return parameter.param_type(value) + try: + return parameter.param_type(value) + except ValueError as e: + raise ValueError(f"Failed to convert {value} to {parameter.param_type.__name__} for parameter {parameter.id}: {e}") def set(self, parameter: Union[str, NuconParameter], value: Union[float, int, bool, str, Enum], force: bool = False) -> None: if isinstance(parameter, str): @@ -240,12 +246,20 @@ class Nucon: self._set_value(parameter, str(value)) + def get_type(self, parameter: Union[str, NuconParameter]) -> Type: + if isinstance(parameter, str): + parameter = self._parameters[parameter] + return parameter.param_type + def _query(self, parameter: NuconParameter) -> str: response = requests.get(self.base_url, params={"variable": parameter.id}) if response.status_code != 200: raise Exception(f"Failed to query parameter {parameter.id}. Status code: {response.status_code}") + if response.text.strip() == 'NOT FOUND': + raise Exception(f"Failed to query parameter {parameter.id}. Returned 'NOT FOUND'") + return response.text.strip() def _set_value(self, parameter: NuconParameter, value: str) -> None: @@ -301,6 +315,8 @@ class Nucon: self.dummy_mode = dummy_mode def __getattr__(self, name): + if isinstance(name, int): + return self.__getattr__(list(self._parameters.keys())[name]) if name in self._parameters: return self._parameters[name] raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")