콘텐츠로 이동

출력 데이터소스

출력 데이터소스는 데이터를 외부 시스템 — PLC, 브로커 또는 제어 애플리케이션 —으로 내보냅니다. Output Mapping을 사용해 예측 채널을 대상 태그나 컬럼에 매핑하세요. 온디맨드 테스트 쓰기로 페이로드를 직접 전송할 수도 있습니다.

프로토콜기능
OPC-UA노드에 쓰기 (동기)
MQTTQoS 1로 토픽에 게시, 기본값은 retain 꺼짐
CSV회전되는 파일에 행 추가 — 매핑된 태그당 한 컬럼, 그리고 timestamp_utc
  1. Datasources → Output 으로 이동하여 + Create 를 클릭하고 프로토콜을 선택합니다.

  2. 각 프로토콜에는 고유한 필드가 있습니다. 시크릿 필드는 저장 후 *** 로 마스킹됩니다.

    {
    "endpoint": "opc.tcp://your-plc-host:4840",
    "securityPolicy": "None",
    "authentication": "Anonymous"
    }
  3. 행에서 Output Mapping을 열고 예측 채널 하나 이상을 대상 태그 — MQTT 토픽, CSV 컬럼, 또는 OPC-UA 노드 주소 — 에 매핑하세요. 매핑된 태그는 싱크 고유 주소 그대로 사용됩니다: test라는 MQTT 태그는 접두사 없이 test 토픽에 그대로 게시됩니다.

  4. 출력을 저장한 다음 활성화합니다. 출력은 예측값을 전달하거나 테스트 쓰기를 받기 전에 반드시 활성화되어 있어야 합니다.

MQTT 싱크는 QoS 0이 아니라 QoS 1로 게시합니다. QoS 0에서는 브로커가 아무것도 확인하지 않으므로, 누락된 메시지(가장 흔하게는 ACL이 거부한 토픽)도 알림 없이 성공한 쓰기로 반환됩니다. QoS 1은 브로커로부터 실제 확인 응답(또는 사유 코드)을 받습니다.

retainfalse로 유지됩니다: 유지된 메시지는 이후 모든 구독자에게 재생되므로, 몇 시간 뒤 열린 대시보드가 오래된 값을 현재 값으로 읽게 됩니다 — 추측 가능한 기본값이 아니라 배포마다 의도적으로 선택하는 값입니다.

MQTT: 재연결, 클라이언트 ID, Test Connection 진단

섹션 제목: “MQTT: 재연결, 클라이언트 ID, Test Connection 진단”

브로커가 연결을 끊으면 MQTT 싱크는 백오프로 재연결합니다 — 게시 전용 연결은 다시 구독할 것이 없으므로 복구는 재연결 자체로 끝납니다. 이 기능이 없었을 때는 일시적인 장애가 영구 장애가 되곤 했습니다.

명시적으로 지정한 Client ID는 이제 연결 시점에 역할 접미사가 붙습니다(입력은 <id>-in, 출력은 <id>-out). 이는 예전에 공유 기본값이던 aiboard를 그대로 저장하고 있는 구성을 포함해 저장된 모든 구성에 적용됩니다 — 따라서 동일한 구성으로 만들어진 입력과 출력은 더 이상 브로커에서 서로를 축출하지 않으며, 이 조합에는 편집이 필요 없습니다. id를 비워두면 여전히 고유 id를 자동 생성합니다.

축출(SessionTakenOver)은 다음과 같은 경우에 여전히 발생합니다: 하나의 Client ID를 동일한 역할의 데이터소스 두 개(입력 두 개, 또는 출력 두 개)에서 명시적으로 재사용하거나, 외부 MQTT 클라이언트가 여러분의 데이터소스 중 하나와 동일한 id로 연결하는 경우 — 이런 경우에는 각각에 서로 다른 값을 부여하거나 필드를 비워두세요.

Test Connection은 원시 예외 이름을 보여주는 대신 소켓 수준 실패를 분류합니다: 연결 불가/거부/DNS 실패는 connect_failed로, 취소된 연결 시도는 timeout으로 매핑됩니다. Docker에서는 localhost가 여러분의 머신이 아니라 백엔드 컨테이너를 가리킵니다 — 데스크톱 클라이언트에서는 연결되지만 AIBOARD에서는 연결되지 않는 브로커의 가장 흔한 원인입니다. 대신 브로커의 서비스 이름을 사용하세요(예: 랩에서는 mqtt://mosquitto:1883).

출력 연결은 입력과 동일한 보안 필드 및 단계를 사용합니다 — 벤치에는 Insecure, 스테이징에는 자격 증명을 갖춘 TLS, 프로덕션에는 상호 인증서 인증. 인증서는 /certs 마운트에서 읽습니다. 프로토콜별 필드 표는 보안 모드: Insecure, TLS, Secure를 참조하세요; 출력에도 그대로 적용됩니다.

출력에만 해당하는 두 가지 참고 사항:

  • MQTT는 프로덕션 경로에서 QoS 1로 게시하므로, 브로커가 메시지를 드롭하는 경우(ACL이 거부한 토픽이 대표적인 사례) 조용한 성공이 아니라 실패로 드러납니다. 싱크 계정에 매핑된 토픽에 대해서만 정확히 게시 권한을 부여하세요.
  • CSV 출력은 격리된 출력 디렉터리 안에만 기록하며, 회전 상한이 디스크 사용량을 제한합니다. 프로토콜이 아니라 볼륨을 보호하세요.

테스트 쓰기는 API로 전송합니다 — POST /api/datasources/output/{id}/test-write, 관리자 전용입니다. UI에는 Test Write 버튼이 없습니다. 각 싱크는 고유한 페이로드 형식을 검증합니다 — MQTT는 topic을, CSV는 columns/values를, OPC-UA는 writes 배열을 요구합니다. 아래의 해당 예시를 사용하세요.

{
"writes": [
{ "nodeId": "ns=2;s=Temperature", "value": 42.5 }
]
}

쓰기에 성공하면 성공 결과가 반환되고, 프로토콜 오류 시 OPC UA: node not found 또는 MQTT: publish refused 같은 메시지가 반환됩니다.

증상가능한 원인
Test Connection에서 connect_failed브로커/엔드포인트에 연결할 수 없거나, 거부되었거나, DNS 실패입니다 — 네트워크 경로, 호스트, 포트(MQTT 1883, OPC-UA 4840)를 확인하세요. Docker에서는 localhost가 여러분의 머신이 아니라 백엔드 컨테이너를 의미합니다.
Test Connection에서 timeout연결 시도가 끝나기 전에 취소되었습니다 — 네트워크 경로와 포트를 확인하세요.
no_output_tags_mapped로 활성화 실패먼저 Output Mapping을 통해 최소 하나의 출력 채널을 태그에 매핑하세요.
데이터소스 비활성화 오류테스트 쓰기를 보내기 전에 출력을 활성화하세요.
Node not found (OPC-UA)NodeId 형식과 해당 노드가 서버에 존재하는지 확인하세요.
Admin only (403)테스트 쓰기에는 관리자 계정이 필요합니다.
MQTT 입력 두 개(또는 출력 두 개)가 계속 서로 연결을 끊음둘이 동일한 명시적 Client ID를 공유하고 있습니다 — 하나를 비우거나 서로 다른 값을 지정하세요. MQTT 입력과 출력이 동일한 구성일 때는 영향이 없습니다: 연결 시점에 예전 aiboard 기본값을 포함해 각각 자동으로 접미사(-in/-out)가 붙습니다.

자세한 내용은 문제 해결 런북을 참조하세요.