diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index cef98805cc..e5b2f69e6d 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -94,6 +94,8 @@ class Get: charging_power: Optional[float] = 0 charging_voltage: Optional[float] = 0 connected_vehicle: ConnectedVehicle = field(default_factory=connected_vehicle_factory) + current_branch: Optional[str] = None + current_commit: Optional[str] = None currents: List[float] = field(default_factory=currents_list_factory) daily_imported: float = 0 daily_exported: float = 0 @@ -115,6 +117,7 @@ class Get: soc_timestamp: Optional[int] = None state_str: Optional[str] = None vehicle_id: Optional[str] = None + version: Optional[str] = None voltages: List[float] = field(default_factory=voltages_list_factory) diff --git a/packages/helpermodules/command.py b/packages/helpermodules/command.py index d9e91d4a54..262bcbc12d 100644 --- a/packages/helpermodules/command.py +++ b/packages/helpermodules/command.py @@ -687,6 +687,12 @@ def chargepointShutdown(self, connection_id: str, payload: dict) -> None: hostname=SubData.cp_data[payload["data"]["chargepoint"] ].chargepoint.chargepoint_module.config.configuration.ip_address) + def secondaryChargepointUpdate(self, payload: dict) -> None: + pub.pub_single("openWB/set/command/primary/todo", + {"command": "systemUpdate", "data": {}}, + hostname=SubData.cp_data[payload["data"]["chargepoint"] + ].chargepoint.chargepoint_module.config.configuration.ip_address) + def systemReboot(self, connection_id: str, payload: dict) -> None: pub_user_message(payload, connection_id, "Neustart wird ausgeführt.", MessageType.INFO) parent_file = Path(__file__).resolve().parents[2] @@ -728,6 +734,16 @@ def systemUpdate(self, connection_id: str, payload: dict) -> None: run_command([ str(parent_file / "runs" / "update_self.sh"), SubData.system_data["system"].data["current_branch"]]) + if not SubData.general_data.data.extern and SubData.system_data["system"].data["secondary_auto_update"]: + for cp in SubData.cp_data.values(): + # if chargepoint is external_openwb and not the second CP of duo and version is Release + if ( + cp.chargepoint.chargepoint_module.config.type == 'external_openwb' and + cp.chargepoint.chargepoint_module.config.configuration.duo_num == 0 and + cp.chargepoint.data.get.current_branch == "Release" + ): + time.sleep(2) + self.secondaryChargepointUpdate({"data": {"chargepoint": f"cp{cp.chargepoint.num}"}}) def systemFetchVersions(self, connection_id: str, payload: dict) -> None: log.info("Fetch versions requested") diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index 2f3b090e55..a87cdf3e39 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -628,6 +628,10 @@ def process_chargepoint_get_topics(self, msg): elif ("/get/evse_current" in msg.topic or "/get/max_evse_current" in msg.topic): self._validate_value(msg, float, [(0, 0), (6, 32), (600, 3200)]) + elif ("/get/version" in msg.topic or + "/get/current_branch" in msg.topic or + "/get/current_commit" in msg.topic): + self._validate_value(msg, str) elif ("/get/error_timestamp" in msg.topic or "/get/rfid_timestamp" in msg.topic): self._validate_value(msg, float) @@ -1073,6 +1077,8 @@ def process_system_topic(self, msg: mqtt.MQTTMessage): self._validate_value(msg, "json") elif "openWB/set/system/mqtt/valid_partner_ids" == msg.topic: self._validate_value(msg, str, collection=list) + elif "openWB/set/system/secondary_auto_update" == msg.topic: + self._validate_value(msg, bool) elif "configurable" in msg.topic: self._validate_value(msg, None) elif "device" in msg.topic: diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 62b9eb0287..7a2a7e2ebf 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -105,6 +105,8 @@ class UpdateConfig: "^openWB/chargepoint/[0-9]+/control_parameter/timestamp_switch_on_off$", "^openWB/chargepoint/[0-9]+/get/charge_state$", "^openWB/chargepoint/[0-9]+/get/currents$", + "^openWB/chargepoint/[0-9]+/get/current_branch$", + "^openWB/chargepoint/[0-9]+/get/current_commit$", "^openWB/chargepoint/[0-9]+/get/evse_current$", "^openWB/chargepoint/[0-9]+/get/fault_state$", "^openWB/chargepoint/[0-9]+/get/fault_str$", @@ -120,6 +122,7 @@ class UpdateConfig: "^openWB/chargepoint/[0-9]+/get/powers$", "^openWB/chargepoint/[0-9]+/get/power_factors$", "^openWB/chargepoint/[0-9]+/get/vehicle_id$", + "^openWB/chargepoint/[0-9]+/get/version$", "^openWB/chargepoint/[0-9]+/get/voltages$", "^openWB/chargepoint/[0-9]+/get/serial_number$", "^openWB/chargepoint/[0-9]+/get/soc$", @@ -444,6 +447,7 @@ class UpdateConfig: "^openWB/system/mqtt/bridge/[0-9]+$", "^openWB/system/mqtt/valid_partner_ids$", "^openWB/system/release_train$", + "^openWB/system/secondary_auto_update$", "^openWB/system/time$", "^openWB/system/update_in_progress$", "^openWB/system/usage_terms_acknowledged$", @@ -540,6 +544,7 @@ class UpdateConfig: ("openWB/system/ip_address", "unknown"), ("openWB/system/mqtt/valid_partner_ids", []), ("openWB/system/release_train", "master"), + ("openWB/system/secondary_auto_update", True), ("openWB/system/serial_number", get_serial_number()), ) invalid_topic = ( diff --git a/packages/modules/common/component_state.py b/packages/modules/common/component_state.py index b676ecceb6..97dc9f9cf9 100644 --- a/packages/modules/common/component_state.py +++ b/packages/modules/common/component_state.py @@ -174,7 +174,10 @@ def __init__(self, soc_timestamp: Optional[int] = None, evse_current: Optional[float] = None, vehicle_id: Optional[str] = None, - max_evse_current: Optional[int] = None): + max_evse_current: Optional[int] = None, + current_branch: Optional[str] = None, + current_commit: Optional[str] = None, + version: Optional[str] = None): self.currents, self.powers, self.voltages = _calculate_powers_and_currents(currents, powers, voltages) self.frequency = frequency self.imported = imported @@ -200,6 +203,9 @@ def __init__(self, self.evse_current = evse_current self.max_evse_current = max_evse_current self.vehicle_id = vehicle_id + self.current_branch = current_branch + self.current_commit = current_commit + self.version = version @auto_str diff --git a/packages/modules/common/store/_chargepoint.py b/packages/modules/common/store/_chargepoint.py index 608408c0fb..7b818fce0c 100644 --- a/packages/modules/common/store/_chargepoint.py +++ b/packages/modules/common/store/_chargepoint.py @@ -52,6 +52,9 @@ def update(self): pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/evse_current", self.state.evse_current) pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/vehicle_id", self.state.vehicle_id) pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/max_evse_current", self.state.max_evse_current) + pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/version", self.state.version) + pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/current_branch", self.state.current_branch) + pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/current_commit", self.state.current_commit) def get_chargepoint_value_store(id: int) -> ValueStore[ChargepointState]: diff --git a/packages/modules/common/store/_chargepoint_internal.py b/packages/modules/common/store/_chargepoint_internal.py index e1ab78736d..339220a1e5 100644 --- a/packages/modules/common/store/_chargepoint_internal.py +++ b/packages/modules/common/store/_chargepoint_internal.py @@ -33,6 +33,11 @@ def update(self): "/get/evse_current", self.state.evse_current, 2) pub_to_broker("openWB/set/internal_chargepoint/" + str(self.num) + "/get/max_evse_current", self.state.max_evse_current, 2) + pub_to_broker("openWB/set/internal_chargepoint/" + str(self.num) + "/get/version", self.state.version) + pub_to_broker("openWB/set/internal_chargepoint/" + str(self.num) + + "/get/current_branch", self.state.current_branch) + pub_to_broker("openWB/set/internal_chargepoint/" + str(self.num) + + "/get/current_commit", self.state.current_commit) def get_internal_chargepoint_value_store(id: int) -> ValueStore[ChargepointState]: diff --git a/packages/modules/internal_chargepoint_handler/chargepoint_module.py b/packages/modules/internal_chargepoint_handler/chargepoint_module.py index 863f03a3b4..e1d9d2a752 100644 --- a/packages/modules/internal_chargepoint_handler/chargepoint_module.py +++ b/packages/modules/internal_chargepoint_handler/chargepoint_module.py @@ -10,6 +10,7 @@ from modules.common.fault_state import ComponentInfo, FaultState from modules.common.store import get_internal_chargepoint_value_store, get_chargepoint_value_store from modules.internal_chargepoint_handler.clients import ClientHandler +from helpermodules.subdata import SubData log = logging.getLogger(__name__) @@ -54,6 +55,9 @@ def __init__(self, local_charge_point_num: int, self._client.evse_client.activate_precise_current() self._precise_current = self._client.evse_client.is_precise_current_active() self.max_evse_current = self._client.evse_client.get_max_current() + self.version = SubData.system_data["system"].data["version"] + self.current_branch = SubData.system_data["system"].data["current_branch"] + self.current_commit = SubData.system_data["system"].data["current_commit"] def set_current(self, current: float) -> None: with SingleComponentUpdateContext(self.fault_state, update_always=False): @@ -116,7 +120,10 @@ def store_state(chargepoint_state: ChargepointState) -> None: rfid=last_tag, evse_current=self.set_current_evse, serial_number=serial_number, - max_evse_current=self.max_evse_current + max_evse_current=self.max_evse_current, + version=self.version, + current_branch=self.current_branch, + current_commit=self.current_commit ) if self.client_error_context.error_counter_exceeded(): chargepoint_state = ChargepointState() diff --git a/packages/modules/internal_chargepoint_handler/update_values_test.py b/packages/modules/internal_chargepoint_handler/update_values_test.py index ff614fd7cb..44e5317532 100644 --- a/packages/modules/internal_chargepoint_handler/update_values_test.py +++ b/packages/modules/internal_chargepoint_handler/update_values_test.py @@ -24,7 +24,7 @@ @pytest.mark.parametrize( "old_chargepoint_state, published_topics", - [(None, 44), + [(None, 50), (OLD_CHARGEPOINT_STATE, 2)] )