Workstation dev yb 260410#262
Draft
Xuwznln wants to merge 86 commits into
Draft
Conversation
- MagazineHolder: klasses=None,解耦极片子节点初始化 - Magazine: 重写 serialize/deserialize,截断旧极片脏数据 - bottle_carriers: 移除 YIHUA_Electrolyte_12VialCarrier 初始化填瓶 - decks.py: BIOYOND_YB_Deck→BioyondElectrolyteDeck,移除 setup 参数 - YB_YH_materials.py: CoincellDeck→YihuaCoinCellDeck,新增 electrolyte_buffer 槽位 - resource_tracker.py: Container 状态键预填 + 重复 UUID 自动修复 + 树级名称去重 - itemized_carrier.py: XY 近似坐标匹配,修复 Z 偏移问题 - bioyond_cell_workstation.py: 跨站转运改用真实资源 + 类型映射双模式查找 - station.py: sync_to_external 属性访问路径修复 - coin_cell_assembly.py: 新增 10 个 Modbus 余量属性 - CSV/JSON/YAML 配置同步更新(类名重命名 + 移除 setup) - 新增 changelog_2026-03-12.md
Made-with: Cursor
- 更新 neware_battery_test_system 驱动及设备配置 - 新增 generate_xml_content.py 工具脚本 - 更新 bioyond_cell_workstation 工作站实现 - 更新 coin_cell_assembly 扣式电池组装逻辑 - 更新相关注册表 YAML 配置:neware_battery_test_system、coin_cell_workstation、bioyond_cell
- add CSV export for order data in bioyond_cell - extract prep and vial bottles from order_finish report - update bioyond_cell registry with csv_export_path - update coin_cell_assembly to export new bottle barcodes and mass ratios - add 260415csv_export_walkthrough.md
bioyond_cell: Ensure order_name is cast to str and fix mix_time handling for single int/float values. YB_bottles: Fix max_volume capacity for 15mL and 60mL prep bottles to match their names.
Support unit in pylabrobot
- Expand neware_battery_test_system.py with new actions and logic - Update generate_xml_content.py with additional XML generation support - Extend neware_battery_test_system.yaml registry with new action schemas - Update OSS upload READMEs and device.json - Add electrode_sheet.py resource fields Made-with: Cursor
…V export
- coin_cell_assembly: align battery_info to 9 fields (Time/open_circuit_voltage/pole_weight/assembly_time/assembly_pressure/electrolyte_volume/data_coin_type/electrolyte_code/coin_cell_code); expose assembly_data single array; rename CSV column coin_num -> data_coin_type
- coin_cell_workstation.yaml: add assembly_data_output handle for auto-func_sendbottle_allpack_multi
- neware manual_confirm: accept formulations + assembly_data + csv_export_dir, unpack to parallel lists, export merged CSV to {csv_export_dir}/{date}/date_{date}.csv, output pole_weight for downstream
- neware transfer -> battery_transfer_confirm with manual_confirm node_type, timeout_seconds, assignee_user_ids
- neware test -> submit_auto_export_excel, accept pole_weight input; relabel battery_system as xml工步
Made-with: Cursor
- neware manual_confirm: drop formulations/assembly_data from result and output handles (they only feed internal CSV export and should not be passed downstream); return dict no longer carries those two keys - base_device_node.loop_find_with_uuid consumer: iterate all figured_resources instead of breaking after first attempt; raise explicit error when uuid cannot be resolved Made-with: Cursor
- neware_driver: default backup filetype="1" so Neware BTS produces Excel backups out of the box (matches submit_*_export_excel semantics). - submit_auto_export_excel: pass filetype=1 to align with function name and the newly default Excel backup. - manual_confirm: prefix Channel_Name with a single quote when writing the integrated CSV so Excel keeps it as text (e.g. "6-10-2") instead of auto-coercing to a date (e.g. "2006/10/2"). The on-disk value is archival only and submit_auto_export_excel never reads it, so the live workflow is unaffected either way. - neware yaml: declare explicit item properties for manual_confirm's formulations and assembly_data arrays so the orchestrator schema projection keeps the 7/9 upstream fields intact. Made-with: Cursor
…type kwarg 问题: - 日志中 submit_auto_export_excel 收到 resource=[](工作流本身不传成品电池资源, 电池由人工搬运),原代码 n = len(resource) = 0 → 整个循环跳过 → "共 0 颗电池,成功下发 0 颗"。 - neware_driver.start_test 原来不接收 filetype kwarg,导致 TypeError 阻塞下发。 修复: 1. submit_auto_export_excel 改为由 mount_resource 驱动循环长度: - 新签名以 mount_resource 为主,resource/pole_weight/coin_cell_code 均可选 - 新增 coin_cell_code 入参,coin_id 优先级 coin_cell_code > resource.name > fallback - n==0 时提前返回并给出明确错误信息 2. manual_confirm 的返回值与 YAML handles/output 新增 coin_cell_code (从已解包的 assembly_data 直接取) 3. submit_auto_export_excel YAML goal/schema/goal_default/handles.input 新增 coin_cell_code;required 中移除 resource(不再强制) 4. neware_driver.build_start_command / start_test 增加 filetype:int=1 参数, 动态嵌入 XML backup 配置,消除 TypeError Made-with: Cursor
…ctrolyte_code - Add output_dir param, backup dir derived from user input (xml_dir/backup_dir auto-created) - Add electrolyte_code param, backup file name format: coin_cell_code-electrolyte_code-devid-subdevid-chlid - manual_confirm return value adds electrolyte_code field for downstream passthrough - YAML: manual_confirm output handles add electrolyte_code - YAML: submit_auto_export_excel goal/schema/goal_default/handles add output_dir and electrolyte_code - YAML: battery_transfer_confirm output changed to empty list Made-with: Cursor
…fer_confirm" This reverts commit 2ebe35e.
* Add post process station and related resources - Created JSON configuration for post_process_station and its child post_process_deck. - Added YAML definitions for post_process_station, bottle carriers, bottles, and deck resources. - Implemented Python classes for bottle carriers, bottles, decks, and warehouses to manage resources in the post process. - Established a factory method for creating warehouses with customizable dimensions and layouts. - Defined the structure and behavior of the post_process_deck and its associated warehouses. * feat(post_process): add post_process_station and related warehouse functionality - Introduced post_process_station.json to define the post-processing station structure. - Implemented post_process_warehouse.py to create warehouse configurations with customizable layouts. - Added warehouses.py for specific warehouse configurations (4x3x1). - Updated post_process_station.yaml to reflect new module paths for OpcUaClient. - Refactored bottle carriers and bottles YAML files to point to the new module paths. - Adjusted deck.yaml to align with the new organizational structure for post_process_deck. * Add PLC communication guide for AI4M Add a comprehensive developer guide (docs/developer_guide/add_PLC.md) describing the PLC integration standard used by Uni-Lab for workstation devices, using the AI4M implementation as reference. Covers rationale for using OPC UA, the opcua_nodes_*.csv node-table format, communication base classes (BaseOpcUaClient / OpcUaClientWithSubscription), data types, and subscription/cache/reconnect behavior. Documents driver patterns for AI4MDevice, three handshake paradigms (pulse, parameter handshake, id-based), registry/graph configuration (YAML/JSON), debugging tips (KEPServerEX sim, standalone run), and a checklist for onboarding new PLC-controlled equipment.
Bumps [conda-incubator/setup-miniconda](https://github.com/conda-incubator/setup-miniconda) from 3 to 4. - [Release notes](https://github.com/conda-incubator/setup-miniconda/releases) - [Changelog](https://github.com/conda-incubator/setup-miniconda/blob/main/CHANGELOG.md) - [Commits](conda-incubator/setup-miniconda@v3...v4) --- updated-dependencies: - dependency-name: conda-incubator/setup-miniconda dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 4 to 5. - [Release notes](https://github.com/actions/upload-pages-artifact/releases) - [Commits](actions/upload-pages-artifact@v4...v5) --- updated-dependencies: - dependency-name: actions/upload-pages-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/configure-pages](https://github.com/actions/configure-pages) from 5 to 6. - [Release notes](https://github.com/actions/configure-pages/releases) - [Commits](actions/configure-pages@v5...v6) --- updated-dependencies: - dependency-name: actions/configure-pages dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5. - [Release notes](https://github.com/actions/deploy-pages/releases) - [Commits](actions/deploy-pages@v4...v5) --- updated-dependencies: - dependency-name: actions/deploy-pages dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Use the Windows mamba.bat entrypoint from Git Bash so the setup-miniconda wrapper does not break after recent runner updates.
Pass the mamba.bat command to cmd without nested escaped quotes so Git Bash does not produce an invalid program name.
Disable conda plugins in build jobs so anaconda-auth from anaconda-client does not break conda info or conda run on Windows.
Set CONDA_NO_PLUGINS only after mamba installs anaconda-client so setup-miniconda can initialize normally while later conda commands avoid the anaconda-auth plugin crash.
Enable UTF-8 for later conda run commands so anaconda-client version output does not fail under the Windows code page.
manual_confirm 出现"输出为空"难定位时,记录上游各 list 长度与 target_device, 再记录派生字段产出(coin_cell_code/electrolyte_code/pole_weight 仅来源于 assembly_data, 若上游未接入会全空,下游 submit_auto_export_excel 会拿不到数据)。 yaml result 中补 electrolyte_code 字段以便下游 handle 引用。 Co-authored-by: Cursor <cursoragent@cursor.com>
新增能力 - auto-create_orders_mock:配液 mock 入口(不跑 LIMS 实流程,仅生成与真实 create_orders 完全一致的 vial_plates / mass_ratios 数据结构,用于上下游联调) - auto-create_conductivity_orders_auto:5 号站电导自动新建实验 action, 接配液 handle 输出的 vial_plates,直连 LIMS material-info 拿真实瓶位 (X,Y) 后提交。 配液端 _submit_and_wait_orders 调整 - 把 batch_id 注入每个 vial_plates[i],删除 final_result 顶层独立 batch_id handle, 下游通过单一 vial_plates handle 即可拿到 batchId/orderCode/barCode/materialId 全套字段。 - 多个 dispensing order 共用同一物理板时按 materialId 去重 all_vial_plates, 每个唯一 plate 用 order_refs 列表保留所有引用过它的 (orderId, orderCode) 对。 _extract_vial_plate_from_report 重构 - 返回从 Optional[Dict] 改为 List[Dict],支持一个 order 对应多块 20ml 分液瓶板 (电导多温度场景)。 - 移除按 locationId 前缀的硬过滤;扫描所有 typemode=1 物料逐个查 material-info, 优先收集 typeName=="20ml分液瓶板",没有时回退到其它 *分液瓶板(带 warning)。 - plate dict 新增 orderId(GUID) 字段,供电导端按瓶子的 associateId 反查归属。 电导端 create_conductivity_orders_auto - 校验 vial_plates / temperature_points 入参(长度=1 广播 / 长度=N per-plate, 其它非法);强制板类型为 "20ml分液瓶板"。 - _query_plate_bottle_positions 不再按 typeName 过滤(实测 LIMS detail.typeName 经常 为空被误杀);只要 detail 项有 x/y 即视为孔位,与资源树创建 _populate_vial_bottles 对齐;返回值新增 associateId 字段(关联订单 GUID)。 - _resolve_order_code_for_bottle 新辅助:跨 order 共用板时按 bottle.associateId 在 plate.order_refs 中精确反查归属 orderCode;fallback 到首个 orderCode 并 warning。 - 不再做 scheduler stop/start 切换(实测调度 Running 时 LIMS 也接受电导订单创建, 与配液 _submit_and_wait_orders 行为一致);stop_scheduler_timeout 入参保留兼容 旧 yaml 但内部不使用,标 deprecated。 - 修 status 计算 bug:原先用 orderId != EMPTY_GUID 判断成功是错的,LIMS 创建阶段 始终返回 orderId=全 0 GUID(执行时才填);改为 errorMessage 为空 + orderCode 非空。 失败时打详细 errorMessage 日志,方便定位"板不在仓库"等业务错误。 返回值新增 new_order_codes 列表(LIMS 新建的电导单号 BSO20260604000XX)。 - create_conductivity_orders_from_excel 同步修 status 判据 + new_order_codes 输出。 辅助 - _wait_scheduler_status:轮询 scheduler-status 直到目标状态 / 超时(虽然 auto 入口不再使用,留作工具函数)。 Co-authored-by: Cursor <cursoragent@cursor.com>
移除: - bioyond_cell_workstation.py 中的 create_orders_mock 方法 - bioyond_cell.yaml 中的 auto-create_orders_mock action 定义 mock 入口当时是为了在配液虚拟机无法产出真实分液板条码时给下游联调用的, 现在真实流程已经跑通,留着会让 registry/handle 列表多一份易混淆条目。 Co-authored-by: Cursor <cursoragent@cursor.com>
create_conductivity_orders_auto 早先设计成 scheduler_stop → 等 Stop → POST → start, 为此加了这个轮询 /api/lims/scheduler/scheduler-status 的辅助。 后来确认调度 Running 时 LIMS 也接受电导订单创建,stop/start 切换被全部砍掉, 该函数已无任何调用方,删除。 Co-authored-by: Cursor <cursoragent@cursor.com>
5 个 output(total_entries / validated_barcodes / status / batch_id / new_order_codes) 没有任何下游 action 引用,UI 上还会列出来造成混淆,全部删除。 Python 函数仍然返回 dict,留作日志/调试输出用。 Co-authored-by: Cursor <cursoragent@cursor.com>
…eout 入参 之前因 scheduler stop/start 切换被砍掉而留作 deprecated 占位。 现在彻底从 yaml 的 goal_default / schema 中拆除,前端 UI 不再渲染该项。 Python 端把已弃用入参换成 **_legacy_kwargs 兜底,老 workflow JSON 若仍传 stop_scheduler_timeout=5.0 会被静默丢弃,避免 TypeError。 Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.