import Foundation @MainActor final class DeviceViewModel: ObservableObject { @Published var snapshot: DeviceSnapshot? @Published var isLoading = false @Published var errorMessage: String? @Published private(set) var connectionStatus: ConnectionStatus = .unknown let instance: Instance private let service: DeviceService private let probe: ConnectionProbe? init(instance: Instance, service: DeviceService, probe: ConnectionProbe? = nil) { self.instance = instance self.service = service self.probe = probe } func refresh() async { isLoading = true errorMessage = nil do { snapshot = try await service.snapshot(instance) } catch DeviceServiceError.unauthorized, UpstreamError.unauthorized { errorMessage = "需要实例密码登录后才能读取设备数据。" } catch let error as UpstreamError { errorMessage = ErrorMessage.describe(error, nodeName: instance.name) } catch { errorMessage = "节点无响应,请确认地址可访问、设备已开机且端口未被拦截。" } guard let probe else { connectionStatus = .offline isLoading = false return } let result = try? await probe.test(instance) connectionStatus = result?.status ?? .offline isLoading = false } }