# Deployment record — wonder-app-vd03 · Makino Pro 5 (Z-34184) FOCAS

**Date configured:** 2026-06-25
**Host:** `wonder-app-vd03.zmr.zimmer.com` (OtOpcUaHost Windows service, single fused admin+driver node)
**Status:** Configured + deployed + served. **Live values blocked** by the FOCAS PDU-v3 driver gap —
see [`docs/plans/2026-06-25-focas-pdu-v3-30i-b-support.md`](../plans/2026-06-25-focas-pdu-v3-30i-b-support.md).

## Equipment

| Field | Value |
|---|---|
| Machine | **Makino Pro 5** (FANUC **30i-B** control) |
| **IP / FOCAS endpoint** | **`10.201.31.5:8193`** (FOCAS Ethernet, TCP) — reachable from the host (and from VPN clients) |
| **ZTag** | **`Z-34184`** |
| Manufacturer / Model | `Makino` / `Pro 5` |
| CNC series (driver) | `Thirty_i` (30i) |

## OtOpcUa host endpoints

- AdminUI: `http://wonder-app-vd03.zmr.zimmer.com:9000` (login disabled — `Security__Auth__DisableLogin=true`)
- OPC UA: `opc.tcp://wonder-app-vd03.zmr.zimmer.com:4840/OtOpcUa`
- Akka cluster: `:4053` · ConfigDb: SQL `OtOpcUaConfig` on `:1433`

## Deployed configuration (cluster `DEV`, Enterprise `zb` / Site `wonder-app-vd03`)

First config ever deployed on this node. All authored via the AdminUI.

| Object | Value |
|---|---|
| Namespace | `dev-equipment` (Equipment), URI `urn:zb:wonder-app-vd03:equipment` |
| UNS path | `zb / wonder-app-vd03 / machining / makino` |
| FOCAS driver instance | `focas-z-34184` ("Makino Pro 5 Z-34184 (FOCAS)"), backend `wire`, FixedTree enabled |
| Device | `10.201.31.5:8193`, series `Thirty_i` |
| Equipment | `z-34184` → `EquipmentId = EQ-3686c0272279`, MachineCode `Z-34184`, ZTag `Z-34184` |
| Tags | `parts-count` → `MACRO:3901` (Float64/Double, Read); `parts-required` → `MACRO:3902` (Float64/Double, Read) |
| Deployment | `0c2db588` (rev `924b59097eba…`) — **Sealed / "In sync"** |

OPC UA node IDs (verified served via the OtOpcUa CLI client):
- Equipment: `ns=2;s=EQ-3686c0272279`
- `ns=2;s=EQ-3686c0272279/parts-count`
- `ns=2;s=EQ-3686c0272279/parts-required`

## Host change required to deploy at all (Akka cluster roles)

This node was joining the Akka cluster **role-less**, so no deployment could ever complete
("a task was canceled"; Fleet status: "no driver-role nodes are Up"). Root cause: `OTOPCUA_ROLES`
(set to `admin,driver`) drives Program.cs actor wiring but does **not** populate the Akka member roles —
those come from config `Cluster:Roles`, which was unset (no `Cluster__Roles` env var; no `Cluster`
section in any appsettings). No code bridges `OTOPCUA_ROLES` → `AkkaClusterOptions.Roles`.

**Fix applied to the host service** (`HKLM\SYSTEM\CurrentControlSet\Services\OtOpcUaHost` → `Environment`):
added `Cluster__Roles__0=admin` and `Cluster__Roles__1=driver`, then restarted the service. The member
now joins **UP with roles ADMIN+DRIVER** and deployments seal. Prior env backed up on the host at
`E:\ApiInstall\OtOpcUa\_envbak-20260625T145303.txt`.

> Product follow-up: either wire `OTOPCUA_ROLES` → `AkkaClusterOptions.Roles`, or bake `Cluster:Roles`
> into the deploy template, so a node redeploy doesn't regress to role-less.

## Live verification (OtOpcUa CLI client → server)

`connect` + `browse` confirm the equipment + both tags are served at the node IDs above.

**Driver fix shipped (2026-06-25):** the wire client now accepts PDU v3 (see the linked plan). Validated
directly against `10.201.31.5` — `MACRO:3901`/`3902` read **Good** from the live 30i-B. **However, the
OtOpcUaHost on this box is still running the pre-v3 driver binary**, so the live OPC UA tags will keep
returning `Bad_WaitingForInitialData` until the rebuilt `ZB.MOM.WW.OtOpcUa.Driver.FOCAS.dll` (or a fresh
self-contained host publish) is deployed to `E:\ApiInstall\OtOpcUa\` and `OtOpcUaHost` is restarted. Once
redeployed, `parts-count`/`parts-required` should go Good (FixedTree + PMC/Parameter still pending the
follow-on v3 command work).

## FixedTree under the Equipment node (feature built 2026-06-26)

The FOCAS **FixedTree** (Identity / Axes / Spindle / Program / Timers) now surfaces under the equipment as
read-only value nodes, via a generic post-connect `ITagDiscovery` injection feature (branch
`feat/focas-fixedtree-equipment-injection`; design + plan at
[`docs/plans/2026-06-26-otopcua-fixedtree-equipment-injection-design.md`](../plans/2026-06-26-otopcua-fixedtree-equipment-injection-design.md)
and [`…-injection.md`](../plans/2026-06-26-otopcua-fixedtree-equipment-injection.md)). After the driver
connects and its `FixedTreeCache` populates (~0–2 s), nodes are grafted at e.g.
`ns=2;s=EQ-3686c0272279/FOCAS/Identity/SeriesNumber` and `…/FOCAS/Axes/X/AbsolutePosition`, carrying live
values through the same path as the authored `parts-count`/`parts-required` tags, and survive redeploys.

**✅ LIVE-VALIDATED 2026-06-26.** A full self-contained Host overlay built from
`feat/focas-fixedtree-equipment-injection` @ `37cac5de` was deployed to `E:\ApiInstall\OtOpcUa`
(stop → full backup `E:\ApiInstall\OtOpcUa_bak-20260626111416` → robocopy overlay preserving
`appsettings*.json` + `pki\` → restart; `/healthz` 200 Healthy, member Up ADMIN+DRIVER, OPC `:4840`
listening). After the FOCAS driver reconnected, the host log recorded
`DriverHost …: injected 57 discovered node(s) for driver focas-z-34184 under EQ-3686c0272279` and
`AddressSpaceApplier: discovered nodes materialised under EQ-3686c0272279 (folders=14, vars=57)` —
no `Exception`/`NotSupportedException`. Verified via the OtOpcUa CLI from a remote client:

- `browse --recursive ns=2;s=EQ-3686c0272279` → new `FOCAS` subtree (`Identity`, `Axes` X/Y/Z/B/C/AA
  + `Actual`, `Spindle/S1`, `Program`, `OperationMode`, `Timers`), stable + idempotent across repeat
  browses (no churn); the device-host folder (`10.201.31.5:8193`) was collapsed as designed.
- Sample reads, all **Good** (`Status 0x0`) with fresh/advancing source times:
  `FOCAS/Identity/SeriesNumber=G431`, `CncType=31`, `AxisCount=7`,
  `FOCAS/Axes/X/AbsolutePosition=2801574` (live), `FOCAS/OperationMode/ModeText=TJOG`.
- Authored `parts-count`/`parts-required` still Good — no regression.

Rollback point retained at `E:\ApiInstall\OtOpcUa_bak-20260626111416`.
