Skip to Content
IoT 앱 개발첫 번째 앱 구축

첫 번째 앱 구축

이 가이드는 엣지 디바이스에서 데이터를 수집하여 실시간 대시보드에 표시하는 IronFlock 앱을 구축하는 일반적인 워크플로우를 안내합니다. 이 과정을 마치면 데이터 모델, 엣지 로직, 사용자용 구성 양식, 라이브 차트 — 모두 프로젝트 데이터베이스를 통해 연결된 — 가 완성됩니다.

1. 데이터 모델 설계

.ironflock/data-template.yml 파일에서 시작합니다. 두 가지 테이블 카테고리를 고려하십시오:

  • 엔티티 테이블 — 사물의 현재 상태를 추적합니다 (디바이스, 기계, 연결). 변경 시마다 행을 추가하고, maintainLatestFlagFor가 어떤 컬럼이 엔티티를 식별하는지 선언하므로 필요할 때 엔티티별 최신 행을 조회할 수 있습니다.
  • 시계열 테이블 — 시간에 따른 측정값을 수집합니다 (센서 판독값, 메트릭). 모든 행은 타임스탬프가 있는 새 데이터 포인트입니다.
data: tables: # 엔티티 테이블: 디바이스당 하나의 행, 최신 상태 항상 조회 가능 - tablename: devices maintainLatestFlagFor: ['device_key'] columns: - id: tsp dataType: timestamp - id: device_key dataType: string - id: status dataType: string - id: device_name dataType: string - id: deleted dataType: boolean # 엔티티 테이블: 사용자가 구성한 Modbus 서버 - tablename: modbus_servers maintainLatestFlagFor: ['server_id'] columns: - id: tsp dataType: timestamp - id: server_id dataType: string - id: host dataType: string - id: port dataType: numeric - id: deleted dataType: boolean # 시계열 테이블: 연결된 하드웨어의 주기적 판독값 - tablename: readings columns: - id: tsp dataType: timestamp - id: server_id dataType: string - id: metric dataType: string - id: value dataType: numeric

2. 테스트 환경 설정

앱을 테스트하려면 온라인 디바이스가 하나 이상 있는 프로젝트의 개발 환경이 필요합니다:

  1. 앱 상세 페이지에서 Develop를 클릭하여 클라우드 IDE를 엽니다.
Develop 버튼이 있는 앱 상세 페이지
  1. 접근 권한이 있는 프로젝트의 온라인 디바이스를 선택합니다.
프로젝트 전체에서 사용 가능한 디바이스를 보여주는 디바이스 선택기
  1. 사이드 패널에서 Create Backend를 클릭하여 해당 프로젝트의 데이터베이스에 개발 환경을 생성합니다.
엣지 개발 컨트롤과 Create Backend 버튼이 있는 사이드 패널

이렇게 하면 data-template.yml에 정의된 테이블이 프로젝트의 데이터베이스에 인스턴스화됩니다. 프로젝트의 Fleet Database 뷰에서 이를 확인할 수 있습니다.

클라우드 IDE는 파일 탐색기, 편집기, 터미널, 디바이스에 빌드 및 배포를 위한 엣지 개발 패널이 있는 전체 VS Code 환경을 제공합니다.

코드 편집기와 엣지 개발 패널이 있는 클라우드 IDE

3. 엣지 코드 작성

Docker 컨테이너가 디바이스에서 실행되며 IronFlock SDK를 사용하여 프로젝트 데이터베이스와 상호작용합니다.

시작 시 디바이스 등록

엣지 컴포넌트가 시작될 때 devices 엔티티 테이블에 행을 추가하여 대시보드가 디바이스 온라인 상태를 알 수 있도록 합니다:

import asyncio from ironflock import IronFlock async def main(): # 이 디바이스를 온라인으로 등록 await flock.append_to_table("devices", { "device_key": os.environ.get('DEVICE_KEY'), "tsp": now, "status": "online", "device_name": os.environ.get('DEVICE_NAME'), "deleted": False }) # ... 나머지 로직 flock = IronFlock(mainFunc=main) flock.run()

devicesmaintainLatestFlagFor: ['device_key']를 사용하기 때문에 이 디바이스의 이전 상태 행이 자동으로 교체됩니다. latest 필터가 활성화된 위젯은 항상 현재 상태를 표시합니다.

사용자 구성에 반응

사용자는 보드의 양식을 통해 Modbus 서버를 추가할 수 있습니다(4단계 참조). 엣지 코드는 modbus_servers 테이블을 구독하고 새 항목에 반응합니다:

async def main(): # ... 디바이스 등록 ... # 기존 Modbus 서버 읽기 existing = await flock.getHistory("modbus_servers", { "limit": 1000, "filterAnd": [ # "latest": True는 server_id별 최신 행만 반환합니다 {"latest": True}, {"column": "deleted", "operator": "IS", "value": None} ] }) for server in existing: create_modbus_connection(server) # 실시간으로 새 서버에 반응 def on_server_change(*args, **kwargs): server = args[0] if args else kwargs if server.get("deleted"): delete_modbus_connection(server["server_id"]) else: create_modbus_connection(server) await flock.subscribe_to_table("modbus_servers", on_server_change)

시계열 데이터 수집

Modbus 연결이 설정되면 주기적으로 폴링하고 판독값을 readings 테이블에 씁니다:

async def modbus_poll_loop(server_id, client): while True: values = client.read_registers() for metric, value in values.items(): await flock.publish_to_table("readings", { "server_id": server_id, "metric": metric, "value": value }) await asyncio.sleep(5)

4. 보드 구축

보드 에디터를 열고 데이터 백엔드 테이블에 연결된 위젯을 추가합니다.

디바이스 상태 표시

devices 테이블에 연결된 Table 위젯을 추가합니다. 위젯의 필터 설정에서 latest 토글을 켜면 항상 각 디바이스의 현재 상태를 표시합니다. 디바이스가 온라인 또는 오프라인이 될 때 테이블이 자동으로 업데이트됩니다.

사용자가 Modbus 서버를 구성하도록 허용

modbus_servers 테이블에 연결된 Form 위젯을 추가합니다. hostport에 대한 필드를 구성합니다. 사용자가 양식을 작성하고 제출하면 새 행이 modbus_servers 테이블에 자동으로 삽입됩니다 — 양식 제출을 처리하는 백엔드 코드가 필요 없습니다.

엣지 코드가 subscribeToTable을 통해 새 행을 감지하고(3단계 참조) Modbus 연결을 설정합니다.

시계열 데이터 시각화

readings 테이블에 연결된 Line Chart 위젯을 추가합니다. tsp를 X축에, value를 Y축에 매핑합니다. 디바이스에서 새 판독값이 도착하면 차트가 실시간으로 업데이트됩니다 — 폴링이나 수동 새로 고침이 필요 없습니다.

전체 구조

┌─────────────────────────────────────────────────────────┐ │ 보드 (대시보드) │ │ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │ │ │ 테이블 │ │ 양식 │ │ 라인 차트 │ │ │ │ devices │ │ modbus_servers │ │ readings │ │ │ └────┬─────┘ └──────┬───────┘ └────────┬──────────┘ │ │ │ │ │ │ └───────┼───────────────┼───────────────────┼─────────────┘ │ │ │ ┌────▼───────────────▼───────────────────▼────┐ │ 프로젝트 데이터베이스 │ │ devices │ modbus_servers │ readings │ └────▲───────────────▲───────────────────▲────┘ │ │ │ ┌────┴───────────────┴───────────────────┴────┐ │ 엣지 코드 (디바이스에서) │ │ 디바이스 등록 → 구성 읽기 → 데이터 폴링 │ └─────────────────────────────────────────────┘

프로젝트 데이터베이스가 단일 진실 소스입니다. 엣지 코드가 여기에 쓰고, 보드가 실시간으로 읽고, 양식을 통한 사용자 작업이 다시 여기에 씁니다. 엣지 코드가 이러한 변경 사항을 구독하여 루프를 완성합니다 — 커스텀 API 엔드포인트가 필요 없습니다.

  • 엔티티 테이블부터 시작하세요. 시계열 수집을 추가하기 전에 디바이스 등록과 상태 테이블을 먼저 완성하십시오.
  • 현재 상태 조회가 필요한 테이블에는 maintainLatestFlagFor를 사용하세요. 이력을 추가하면서도 추가 코드 없이 엔티티별 최신 행을 조회할 수 있습니다 — 위젯의 latest 토글을 켜거나 SDK 필터에 {"latest": true}를 넣으면 됩니다.
  • 사용자가 양식으로 관리하는 엔티티 테이블에는 deleted 컬럼을 추가하세요. 이력을 보존하면서 레코드를 소프트 삭제할 수 있습니다.
  • 확인이 필요한 쓰기에는 appendToTable을 사용하세요 (예: 초기 디바이스 등록). 고주파 텔레메트리에는 fire-and-forget 방식이 허용될 때 publishToTable을 사용하세요.
  • 시계열 테이블은 단순하게 유지하세요. 타임스탬프 하나, 소스 식별자, 측정값으로 구성합니다. 집계는 변환 테이블을 사용하세요.

다음 단계

하드웨어가 웹 기반 HMI 또는 구성 인터페이스를 노출하는 경우 Embed 위젯과 디바이스 터널을 사용하여 IronFlock 보드에 직접 임베드할 수 있습니다. 자세한 내용은 외부 HMI 임베드를 참조하십시오.

Last updated on