|
@@ -65,13 +65,16 @@ class MeasurementController:
|
|
|
logging.warning(f"Device {device.id}, Slot {slot.id} is empty, but status is {status}")
|
|
logging.warning(f"Device {device.id}, Slot {slot.id} is empty, but status is {status}")
|
|
|
continue
|
|
continue
|
|
|
|
|
|
|
|
- # Check for unconfigured cell
|
|
|
|
|
- if status is DeviceStatus.INSERTED and not slot.get_cell().limits_transmitted:
|
|
|
|
|
|
|
+ # Check for unconfigured cell (could also be when the device resets)
|
|
|
|
|
+ cell = slot.get_cell()
|
|
|
|
|
+ if status is DeviceStatus.INSERTED and cell and not cell.limits_transmitted:
|
|
|
self._update_cell_limits(device, slot)
|
|
self._update_cell_limits(device, slot)
|
|
|
|
|
+ cell.limits_transmitted = True
|
|
|
continue
|
|
continue
|
|
|
# Check for state transitions to "DONE"
|
|
# Check for state transitions to "DONE"
|
|
|
- if prev_state is DeviceStatus.MEASURING and status is DeviceStatus.DONE:
|
|
|
|
|
|
|
+ if prev_state is DeviceStatus.MEASURING and status is DeviceStatus.DONE and cell:
|
|
|
self._process_done(device, slot)
|
|
self._process_done(device, slot)
|
|
|
|
|
+ cell.limits_transmitted = False
|
|
|
continue
|
|
continue
|
|
|
# Check for state transitions to "ERROR"
|
|
# Check for state transitions to "ERROR"
|
|
|
if status is DeviceStatus.ERROR and prev_state is not DeviceStatus.ERROR:
|
|
if status is DeviceStatus.ERROR and prev_state is not DeviceStatus.ERROR:
|
|
@@ -91,7 +94,6 @@ class MeasurementController:
|
|
|
if cell is None:
|
|
if cell is None:
|
|
|
raise ValueError(f"No cell inserted in device {device.id}, slot {slot.id}")
|
|
raise ValueError(f"No cell inserted in device {device.id}, slot {slot.id}")
|
|
|
self.i2c_service.send_cell_limits(device.i2c_address, slot.id, cell.limits)
|
|
self.i2c_service.send_cell_limits(device.i2c_address, slot.id, cell.limits)
|
|
|
- cell.limits_transmitted = True
|
|
|
|
|
|
|
|
|
|
def _collect_measurement(self, device: Device, slot: Slot):
|
|
def _collect_measurement(self, device: Device, slot: Slot):
|
|
|
"""Collect measurement data from active slots."""
|
|
"""Collect measurement data from active slots."""
|
|
@@ -106,15 +108,19 @@ class MeasurementController:
|
|
|
cell_info = self.http_service.fetch_cell_info(insertion_info.cell_id)
|
|
cell_info = self.http_service.fetch_cell_info(insertion_info.cell_id)
|
|
|
min_volt = max(cell_info['cell_type']['min_voltage'], self.config['measurement']['min_voltage'])
|
|
min_volt = max(cell_info['cell_type']['min_voltage'], self.config['measurement']['min_voltage'])
|
|
|
max_volt = min(cell_info['cell_type']['max_voltage'], self.config['measurement']['max_voltage'])
|
|
max_volt = min(cell_info['cell_type']['max_voltage'], self.config['measurement']['max_voltage'])
|
|
|
- max_current = cell_info['cell_type']['capacity'] * self.config['measurement']['c_rate']
|
|
|
|
|
- limits = CellLimits(min_volt, max_volt, max_current)
|
|
|
|
|
- nom_capacity = cell_info['cell_type']['capacity']
|
|
|
|
|
- self.devices[insertion_info.device_id].slots[insertion_info.slot_id].insert_cell(Cell(insertion_info.cell_id, limits, nom_capacity))
|
|
|
|
|
|
|
+ charge_fraction = self.config['measurement']['c_rate']
|
|
|
|
|
+ capacity = cell_info['cell_type']['capacity']
|
|
|
|
|
+ cut_off_curr = self.config['measurement']['cut_off_curr']
|
|
|
|
|
+ limits = CellLimits(min_volt, max_volt, charge_fraction, capacity, cut_off_curr, 0)
|
|
|
|
|
+ self.devices[insertion_info.device_id].slots[insertion_info.slot_id].insert_cell(Cell(insertion_info.cell_id, limits, capacity))
|
|
|
|
|
|
|
|
def _process_done(self, device: Device, slot: Slot):
|
|
def _process_done(self, device: Device, slot: Slot):
|
|
|
"""Execute measurement cycles for a Cell."""
|
|
"""Execute measurement cycles for a Cell."""
|
|
|
|
|
|
|
|
cell = slot.get_cell()
|
|
cell = slot.get_cell()
|
|
|
|
|
+ if cell is None:
|
|
|
|
|
+ raise ValueError(f"No cell inserted in device {device.id}, slot {slot.id}")
|
|
|
|
|
+
|
|
|
# Calculate health and capacity
|
|
# Calculate health and capacity
|
|
|
estimated_capacity = cell.estimate_capacity()
|
|
estimated_capacity = cell.estimate_capacity()
|
|
|
|
|
|
|
@@ -124,7 +130,9 @@ class MeasurementController:
|
|
|
|
|
|
|
|
def _process_error(self, device: Device, slot: Slot):
|
|
def _process_error(self, device: Device, slot: Slot):
|
|
|
"""Handle errors during measurement."""
|
|
"""Handle errors during measurement."""
|
|
|
- logger.error(f"Error detected for device {device.id}, slot {slot.id}")
|
|
|
|
|
- self.mqtt_service.cell_finished(device.id, slot.id, slot.get_cell().id, 0.0, DeviceStatus.ERROR)
|
|
|
|
|
|
|
+ cell = slot.get_cell()
|
|
|
|
|
+ cell_id = cell.id if cell else -1
|
|
|
|
|
+ logger.error(f"Error detected for device {device.id}, slot {slot.id}, cell {cell_id}")
|
|
|
|
|
+ self.mqtt_service.cell_finished(device.id, slot.id, cell_id, 0.0, DeviceStatus.ERROR)
|
|
|
slot.remove_cell()
|
|
slot.remove_cell()
|
|
|
|
|
|