Matter
Matter 드라이버 참고 자료입니다. 장치가 가입하는 Wi-Fi와 Thread 네트워크, Bluetooth로 로컬 Fabric에 커미셔닝하기, 장치 페어링 흐름, 노드 신원, 장치에서 오는 태그와 각 태그에 쓰면 일어나는 일.
Matter 드라이버는 Matter 장비를 읽습니다. Matter 표준 인증을 받은 스마트 센서와 플러그와 조명과 비슷한 장치들이며, 네트워크에 Wi-Fi로 가입하든 Thread로 가입하든 상관없습니다. 둘 다 드라이버 하나로 다룹니다. 네트워크는 들어가는 길일 뿐이고, 장치가 그 안에 들어온 뒤에는 Ganter Lab이 로컬 네트워크를 거쳐 똑같은 방식으로 읽습니다.
Ganter Lab은 자기 로컬 Fabric을 가진 Matter 컨트롤러로 동작합니다. 이 컴퓨터에서 Bluetooth Low Energy로 장치를 한 번 커미셔닝하고, 드라이버의 네트워크 카드에 등록된 네트워크의 자격 증명을 건네준 다음, 그때부터는 로컬 네트워크로 이야기합니다. Wi-Fi 장치라면 사용자의 라우터를 거치고, Thread 장치라면 사용자의 Thread Border Router를 거칩니다.
장치가 Wi-Fi인지 Thread인지 Ganter Lab에 알려 줄 필요는 없습니다. 장치가 스스로 말합니다. Bluetooth 세션이 열리면 Ganter Lab은 장치에 무엇이든 쓰기 전에 장치가 어떤 종류의 네트워크에 가입하는지 장치에서 읽고, 고른 네트워크가 다른 종류이면 그 사실을 말하는 메시지와 함께 멈춥니다.
그래서 설정 순서가 보통과 뒤집힙니다. Matter 장치는 호스트와 포트에서 시작하지 않습니다. 페어링 절차에서 시작하고, 그 뒤에는 커미셔닝된 노드의 변하지 않는 신원만 저장됩니다.
페어링하기 전에 갖추어야 할 것은 이렇습니다.
- 이 컴퓨터에 켜져 있는 Bluetooth Low Energy 어댑터가 있고, Windows가 Ganter Lab에 그것을 쓰도록 허용하고 있어야 합니다.
- 장치가 가입할 네트워크가 네트워크 카드에 등록되어 있어야 합니다. Wi-Fi 장치라면 Wi-Fi 이름과 그 비밀번호, Thread 장치라면 Border Router가 있는 기존 Thread 네트워크와 그 완전한 활성 운영 데이터셋입니다. Ganter Lab은 장치를 사용자의 네트워크에 넣어 줄 뿐, 그 네트워크의 자격 증명을 만들어 낼 수는 없습니다.
- 장치나 그 포장에 인쇄된 장치의 설정 코드가 있어야 하고, 장치가 페어링 모드에 있어야 합니다.
네트워크
Matter 드라이버의 패널에는 네트워크라는 제목의 카드가 있습니다. 장치가 가입하는 Wi-Fi와 Thread 네트워크이며 한 줄에 하나씩입니다. 네트워크는 첫 장치보다 먼저 한 번 등록하고, 그 안에 페어링하는 모든 장치에 쓰입니다. 그래서 같은 Wi-Fi에 두 번째 조명을 페어링할 때는 더 묻는 것이 없습니다. 이 카드는 Connector를 구성할 수 있는 역할에만 그려집니다. 네트워크의 비밀 값을 담고 있고 페어링 말고는 쓰이는 데가 없기 때문입니다.
카드의 머리에는 그 명령이 이 순서로 놓입니다.
| 명령 | 하는 일 | 하지 않는 일 |
|---|---|---|
| Wi-Fi 네트워크 추가 | Wi-Fi 네트워크를 하나 추가하고 선택합니다. 이 컴퓨터가 연결된 Wi-Fi의 이름이 아직 등록되지 않았다면 새 네트워크는 그 이름을 받습니다. 그렇지 않으면 이름 없이 시작하며, 이름은 사용자가 입력합니다. Windows는 이름만 건네주며, 그것도 앱이 이 컴퓨터의 위치를 알도록 허용할 때뿐입니다(Windows 11은 그 권한을 묻습니다). 비밀번호는 언제나 사용자가 입력합니다. | Windows에서 비밀번호를 읽지 않고, 그 네트워크가 실제로 있는지 확인하지도 않습니다. |
| Thread 네트워크 추가 | Thread 네트워크를 하나 추가하고 선택합니다. 사용자가 이름을 붙이기 전까지는 임시 이름(이미 쓰이고 있으면 번호가 붙습니다)을 가지며, 데이터셋을 기다립니다. | Border Router와 이야기하지 않습니다. Ganter Lab은 Border Router가 만든 네트워크의 데이터셋만 씁니다. |
| 네트워크 제거 | 선택한 네트워크를 제거합니다. 그 전에 그 네트워크의 이름을 밝히고 이미 페어링된 장치는 영향을 받지 않는다고 말하는 확인이 나옵니다. 선택한 네트워크가 없으면 그려진 채로 흐리게 남고, 도구 설명이 그 이유를 말합니다. | 그 네트워크에 이미 페어링된 장치는 건드리지 않습니다. 장치들은 계속 동작하고, 자기 네트워크 칸에 그 이름을 간직합니다. |
표는 네트워크마다 이름, 네트워크 종류(Wi-Fi 네트워크 또는 Thread 네트워크), 상태를 보여 줍니다. 상태는 페어링 준비됨이거나, 그 네트워크에 아직 모자란 것입니다. 이름이 아직 적히지 않은 네트워크는 이름 없는 네트워크로 보입니다.
선택한 네트워크의 칸은 표 아래에서 바로 고치며, 저절로 저장됩니다. 아래 규칙이 거부하는 값은 기록되지 않고, 칸이 그 이유를 말합니다.
| 종류 | 칸 | 무엇인가 | 형식 |
|---|---|---|---|
| Wi-Fi | Wi-Fi 이름 | 장치에 건네주는 이름(SSID)이며, 라우터가 내보내는 그대로 씁니다. 대문자와 소문자를 구별합니다. Wi-Fi 이름은 저마다 한 번만 등록됩니다. | 1바이트에서 32바이트까지의 문구(UTF-8). |
| Wi-Fi | 비밀번호 | 장치에 건네주는 Wi-Fi 비밀번호. | 개방된 네트워크라면 비워 둡니다. 그 밖에는 인쇄할 수 있는 ASCII 문자 8자에서 63자(WPA 암호 문구), 또는 정확히 16진수 64자리(원시 키)입니다. |
| Thread | 이름 | 페어링할 때와 각 장치에서 그 네트워크를 알아보기 위해 사용자가 붙이는 이름. Thread 네트워크 이름은 저마다 한 번만 등록됩니다. | 자유 입력. |
| Thread | Thread 운영 데이터셋 | 네트워크 관리자나 그 Border Router에서 받은, Thread 네트워크의 완전한 활성 데이터셋입니다. Home Assistant는 보여 주지만 Alexa와 Apple은 보여 주지 않습니다. | 16진수 문구이며(공백과 hex: 앞머리는 눈감아 줍니다) 해독한 뒤 254바이트를 넘지 않아야 합니다. 완전한 데이터셋이어야 합니다. Active Timestamp, Channel, Channel Mask, Extended PAN ID, Mesh-Local Prefix, Network Key, Network Name, PAN ID, PSKc, Security Policy가 모두 있어야 하며, 일부만 있거나 형태가 깨진 데이터셋은 빠진 요소를 밝히며 거부됩니다. |
Wi-Fi 장치를 애초에 페어링할 수 있는지는 두 가지가 정하며, 카드는 칸 옆에 그 둘을 모두 말합니다.
- 대부분의 장치는 2.4GHz 네트워크에만 가입합니다. 같은 이름을 2.4GHz와 5GHz 모두로 내보내는 라우터라면 쓸 수 있고, 5GHz에만 있는 네트워크는 쓸 수 없습니다.
- 이 컴퓨터와 장치들은 같은 로컬 네트워크에 있어야 합니다. 게스트 네트워크나, 라우터에서 켠 클라이언트 격리가 있으면 장치가 가입한 뒤에 이 컴퓨터가 장치를 찾지 못합니다.
네트워크는 그 비밀 값이 이 규칙을 지키는 동안에만 페어링에 쓰입니다. Wi-Fi 네트워크라면 올바른 이름과 올바른 비밀번호(빈 값 포함), Thread 네트워크라면 올바른 데이터셋입니다.
네트워크를 고치면 다음 페어링이 건네주는 것이 바뀔 뿐, 장치가 이미 받은 것은 바뀌지 않습니다. 다른 네트워크로 옮겨야 하는 장치나 라우터 비밀번호가 바뀐 장치는 초기화한 뒤 다시 페어링합니다.
장치 페어링 흐름
Matter 드라이버에서는 다른 드라이버가 장치 추가를 내놓는 자리에 명령 모음이 장치 페어링을 내놓습니다. 열의 새로 만들기… 메뉴의 Matter 항목에도 같은 것이 있습니다. 페어링에 쓸 수 있는 네트워크가 하나도 없는 동안에는 그려진 채로 흐리게 남고, 도구 설명은 "장치가 들어갈 네트워크를 먼저 추가하십시오."입니다. 쓸 수 있는 네트워크가 있으면 양식을 엽니다.
| 칸 | 무엇인가 | 형식 | 기본값 |
|---|---|---|---|
| 장치 이름 | 그 장치가 Connector에서 가지게 될, 고칠 수 있는 이름. | 자유 입력 | Matter 장치 |
| Matter 설정 코드 | 정식 수동 페어링 코드이거나 QR 페이로드 전체입니다. 가려진 채로 입력하며 드러내는 조작이 함께 있습니다. | 11자리나 21자리 수동 코드(붙임표와 공백은 무시하고 검사 숫자를 확인합니다), 또는 MT:로 시작하는 QR 페이로드 전체입니다. Bluetooth 커미셔닝을 광고하지 않는 QR 페이로드는 거부되며, 예약된 암호나 범위를 벗어난 암호도 마찬가지입니다. |
비어 있음 |
| 네트워크 | 장치가 가입할, 등록된 네트워크입니다. 쓸 수 있는 네트워크가 하나뿐이면 양식은 어느 네트워크이고 어떤 종류인지 한 줄로 말하며 고를 것이 없습니다. 둘 이상이면 고르는 목록입니다. | 네트워크 카드에 있는, 쓸 수 있는 네트워크 가운데 하나 | 하나뿐일 때는 그것 |
| 넣을 폴더 | 폴더의 새 장치가 양식을 열었을 때만 나옵니다. 페어링한 장치가 들어갈 폴더입니다. 장치 페어링으로 열었을 때는 이 줄이 없고, 장치는 드라이버 자신의 단계에 들어갑니다. | 읽기 전용 | 양식을 연 폴더 |
Matter 드라이버의 폴더에는 새 장치가 있습니다(그 장치 표, 그 오른쪽 단추 메뉴, 새로 만들기… > Matter > <폴더>). 이것은 같은 양식을 열고, 쓸 수 있는 네트워크가 없는 동안에는 똑같이 회색이 되며, 페어링한 장치는 그 폴더에 들어갑니다.
양식의 장치 페어링은 이름과 설정 코드가 채워지고 쓸 수 있는 네트워크가 있기 전까지 쓸 수 없습니다. 페어링이 도는 동안 양식은 자기 단계를 알립니다. 검사(코드와 네트워크의 비밀 값을 확인합니다), 찾기(Bluetooth로 장치를 찾습니다), 페어링(설정 코드로 인증하고, 장치가 어떤 종류의 네트워크에 가입하는지 읽습니다), 네트워크 가입(네트워크를 장치에 보낸 뒤, 장치가 응답할 때까지 로컬 네트워크에서 장치를 찾는 질의를 보냅니다. 상태 줄은 그 네트워크가 Wi-Fi인지 Thread인지 말합니다), 저장(로컬 네트워크의 장치와 보안 세션을 열고, 커미셔닝을 마친 뒤 노드를 로컬 Fabric에 기록합니다)입니다.
취소는 실제 장치가 아직 바뀌지 않은 동안 쓸 수 있습니다. 커미셔닝이 장치를 바꾼 뒤로는 단추가 Ganter Lab이 안전하게 마무리하는 중이라고 알리고, 흐름은 반쯤 커미셔닝된 노드를 버리는 대신 기록을 끝냅니다. 페어링은 한 번에 하나만 돕니다. 하나가 도는 동안의 두 번째 시도는 거부됩니다.
새 장치는 자기가 가입한 네트워크의 이름을 기록하고, 자기 네트워크 칸에 보여 줍니다. 같은 네트워크에 다음 장치를 페어링할 때는 그 이름과 설정 코드만 묻습니다.
페어링이 실패할 때
페어링이 실패하면 메시지가 원인과 할 일을 말합니다.
| 원인 | 뜻 | 장비 | 할 일 |
|---|---|---|---|
| 설정 코드가 올바르지 않음 | 코드가 정식 11자리나 21자리 수동 코드도 아니고, 완전한 MT: QR 페이로드도 아닙니다. |
손대지 않음 | 인쇄된 코드를 다시 읽습니다. |
| Thread 데이터셋이 올바르지 않음 | 고른 Thread 네트워크의 데이터셋이 완전하고 올바른 형태가 아닙니다. | 손대지 않음 | 네트워크 카드에서 그 네트워크에 완전한 활성 데이터셋을 다시 복사해 넣습니다. |
| Wi-Fi 이름이나 비밀번호가 올바르지 않음 | 고른 Wi-Fi 네트워크의 이름이나 비밀번호가 네트워크 카드의 규칙을 어깁니다. | 손대지 않음 | 카드에서 고칩니다. |
| Bluetooth가 없거나 꺼졌거나 거부됨 | 이 컴퓨터에 쓸 수 있는 Bluetooth Low Energy 어댑터가 없거나, Bluetooth가 꺼져 있거나, Windows가 Ganter Lab의 접근을 거부했습니다. | 손대지 않음 | Bluetooth를 켜거나 Windows에서 Ganter Lab이 쓰도록 허용한 뒤 다시 시도합니다. |
| 맞는 장치를 찾지 못함 | 이 설정 코드에 응답한, 페어링 모드의 장치가 없습니다. | 손대지 않음 | 장치를 페어링 모드로 두고, 이 컴퓨터 가까이에 둔 채 다시 시도합니다. |
| 설정 코드가 거부됨 | 장치가 코드를 거부했습니다. | 손대지 않음 | 인쇄된 코드를 다시 읽고 장치를 다시 페어링 모드로 둡니다. |
| 장치가 Wi-Fi로 가입함 | 고른 네트워크는 Thread입니다. | 손대지 않음. 읽기만 했고 아무것도 쓰지 않았습니다 | 장치가 가입할 Wi-Fi 네트워크를 등록하고, 그것을 골라 다시 페어링합니다. |
| 장치가 Thread로 가입함 | 고른 네트워크는 Wi-Fi입니다. | 손대지 않음. 읽기만 했고 아무것도 쓰지 않았습니다 | Thread 네트워크를 등록하고, 그것을 골라 다시 페어링합니다. |
| 장치가 유선(Ethernet)임 | Bluetooth 페어링은 유선 장치에 쓰이지 않습니다. | 손대지 않음. 읽기만 했고 아무것도 쓰지 않았습니다 | Ganter Lab은 이 장치를 페어링할 수 없습니다. |
| 장치가 자기 네트워크를 말하지 않음 | 장치가 Wi-Fi도, Thread도, Ethernet도 알리지 않습니다. | 손대지 않음. 읽기만 했고 아무것도 쓰지 않았습니다 | Ganter Lab은 이 장치를 페어링할 수 없습니다. |
| Wi-Fi 네트워크를 찾지 못함 | 장치가 그 이름의 Wi-Fi를 찾지 못했다고 응답했습니다. 철자나 대소문자의 실수, 5GHz에만 있는 네트워크, 또는 닿지 않는 거리의 장치입니다. | 아무것도 남기지 않음. 받은 것을 버리고 페어링 모드로 돌아갑니다. 노드 ID 없음. | 네트워크 카드에서 이름을 고치고, 라우터가 그 이름을 2.4GHz로 내보내는지 확인한 뒤 다시 페어링합니다. |
| Wi-Fi 비밀번호가 거부됨 | 장치가 Wi-Fi에서 비밀번호를 거부당했다고 응답했습니다. | 아무것도 남기지 않음. 받은 것을 버리고 페어링 모드로 돌아갑니다. 노드 ID 없음. | 네트워크 카드에서 비밀번호를 고치고 다시 페어링합니다. |
| 장치가 네트워크에 가입할 수 없음 | 장치가 위의 두 가지가 아닌 다른 이유로 네트워크에 가입할 수 없다고 응답했습니다(Thread에서는 찾지 못한 네트워크를 포함해 모든 거부가 여기에 해당합니다). | 아무것도 남기지 않음. 받은 것을 버리고 페어링 모드로 돌아갑니다. 노드 ID 없음. | 네트워크 카드에서 네트워크를 확인하고(Thread라면 지금의 활성 데이터셋을 다시 복사하고 Border Router가 켜져 있는지 확인합니다) 다시 페어링합니다. |
| 장치가 네트워크에 나타나지 않음 | 장치가 네트워크에 대해 아무 응답도 하지 않았거나, 그 뒤 로컬 네트워크에 끝내 나타나지 않았습니다. 네트워크에 가입하려고 Bluetooth를 떠나서 아예 응답할 수 없는 장치도 있습니다. | 커미셔닝됨. 메시지가 노드 ID를 보여 줍니다 | Wi-Fi라면 이 컴퓨터와 장치가 같은 로컬 네트워크에 있고, 그 사이에 게스트 네트워크나 클라이언트 격리가 없는지 확인합니다. Thread라면 Border Router가 켜져 있고 닿을 수 있는지 확인합니다. 그런 다음 장치 검색으로 노드를 되찾습니다. |
| 보안 세션이 열리지 않음 | 장치가 네트워크에 참여했고 거기서 발견되었지만, 장치와의 보안 세션 또는 그 세션을 통한 페어링 완료에 실패했습니다. 진단 로그에 멈춘 단계와 장치의 응답이 남습니다. | 커미셔닝됨. 메시지가 노드 ID를 보여 줍니다 | 장치 검색으로 노드를 되찾습니다. 장치가 켜져 있는데도 장치 검색에서 값 없이 나타나면 장치를 다시 페어링 모드로 둔 뒤 다시 페어링합니다. |
| 다른 페어링이 진행 중 | 페어링은 한 번에 하나만 돕니다. | 손대지 않음 | 그것이 끝나기를 기다렸다가 다시 시도합니다. |
| 로컬 Fabric을 저장할 수 없음 | Ganter Lab이 Fabric을 안전하게 보관하지 못했습니다. | 페어링이 시작되기 전이면 손대지 않음. 시작된 뒤면 노드 ID와 함께 커미셔닝됨 | 무엇이든 초기화하기 전에 저장 문제를 해결합니다. |
장비가 이미 커미셔닝된 뒤에 실패가 올 때는 메시지가 그렇게 말하고 노드 ID를 보여 줍니다. 그 노드는 Fabric에 남아 있으며, 네트워크에 닿기만 하면 나중에 장치 검색으로 추가할 수 있습니다. 그런 경우에는 장치를 초기화하지 마십시오. 아무것도 저장되지 않았다고 말하는 메시지만이 장비가 손대지지 않았다는 뜻입니다.
네트워크에 가입할 수 없다고 응답한 장치는 예외입니다. 그 장치에는 남겨 둘 만한 것이 없습니다. Ganter Lab은 장치에서 페어링을 끝내고, 장치는 받은 것을 버린 뒤 곧바로 페어링 모드로 돌아갑니다. 동시에 그 노드를 Fabric에서 빼므로, 메시지에는 노드 ID가 없고 장치 검색은 응답할 수 없는 노드를 결코 나열하지 않습니다. 네트워크를 고치고 다시 페어링하십시오. 노드를 남기는 것은 아무 응답도 하지 않은 장치뿐입니다. 가입했는지는 로컬 네트워크에 나타나야 알 수 있기 때문입니다.
저장되는 것
| 무엇 | 두는 곳 | 방식 |
|---|---|---|
| 네트워크의 이름과 종류 | 스테이션의 구성 | 쓴 그대로. |
| Wi-Fi 비밀번호와 Thread 운영 데이터셋 | 스테이션의 구성 | 장치 비밀번호처럼, 입력한 Windows 사용자를 위해 보호됩니다. 다른 Windows 계정에서는 빈 값으로 읽히므로 다시 입력해야 합니다. 백업에는 담기지 않고, 다른 컴퓨터로 내보내기는 그 자체의 비밀번호로 봉인해서 가져갑니다. |
| 설정 코드 | 어디에도 없음 | 페어링이 도는 동안 양식에만 있고, 페어링이 끝나거나 실패하거나 취소되면 지워집니다. |
| 장치가 가입한 네트워크 | 장치의 구성 | 그 이름이며, 장치의 네트워크 칸에 보입니다. |
| 장치의 신원 | 장치의 구성과 로컬 Fabric | 노드 ID. |
Wi-Fi 비밀번호와 데이터셋은 진단 로그에도, 장치의 주소에도, 그 Thing Description에도 나타나지 않습니다. 네트워크와 페어링은 MCP 서버를 통해 에이전트에게 제공되지 않습니다. 페어링에는 장치 곁에 있는 사람이 필요하고, 네트워크는 비밀 값을 담고 있기 때문입니다.
노드 신원
페어링된 장치는 장비의 변하지 않는 64비트 노드 ID에 묶이며, 그 값은 연결 카드에 16진수 열여섯 자리로 장치 상태 옆에 읽기 전용으로 나옵니다. 고칠 수 있는 표시 이름은 사용자의 것이지만 노드 ID는 그렇지 않습니다. 저장된 신원을 더 이상 읽을 수 없는 장치는 그 자리에 다시 페어링 필요를 보여 줍니다.
장치의 패널에는 읽기 전용 네트워크 칸도 있습니다. 페어링할 때 장치가 가입한 네트워크의 이름입니다. 그것을 기록하지 않던 버전으로 페어링한 장치는 기록된 것이 없다고 말합니다. 이 칸은 기록이지 설정이 아닙니다. 네트워크 카드에서 그 네트워크를 고치거나 제거해도 장치에서는 아무것도 바뀌지 않습니다.
신원이 노드 ID이므로 Matter 장치들은 서로 독립된 연결 상태를 가집니다. 노드 하나를 끄거나 삭제하거나 잃어도 다른 노드가 쓸 수 없게 되지는 않고, 장치를 삭제하는 일은 그 장치가 쓰던 보안 세션만 놓아 줄 뿐 장비를 로컬 Fabric에서 없애지는 않습니다.
장치 검색
Matter 드라이버의 장치 검색은 이 애플리케이션의 로컬 Fabric에 이미 커미셔닝된 노드를 나열하고, 노드마다 그 노드가 공개하는 값을 읽습니다. 값을 읽으려고 노드마다 보안 세션을 열기 때문에, 네트워크에 없는 노드도 세션이 열리지 못한 뒤에 값 없이 목록에 남습니다. 장치 검색의 후보는 노드 신원을 담고, 설정 비밀은 담지 않습니다. 장치 검색의 전체 흐름은 장치 검색에 설명되어 있습니다.
| 노드 | 그 카드 | 그 동사 |
|---|---|---|
| 여기에 장치가 없음: 장치가 삭제되었거나, 페어링이 장치 없이 끝남 | 공개하는 값이 하나하나 체크된 채 나열됩니다 | 장치 추가가 체크한 값을 태그로 삼아 장치를 만듭니다. 새 절차는 필요 없습니다. |
| 설정된 장치이며, 아직 태그가 없는 값이 있음 | 이미 설정됨으로 표시되고, 공개하는 값 중 아직 태그가 아닌 것의 개수와 그 값이 체크된 채 나열됩니다 | 태그로 추가가 체크한 값을 그 장치에 추가하고, 열기가 그 장치를 엽니다. |
| 설정된 장치이며, 모든 값에 태그가 있음 | "이미 설정됨. 장치가 공개하는 모든 값에 태그가 있습니다." | 열기가 그 장치를 엽니다. |
| 설정된 장치이며, 값을 보고하지 않음 | "이미 설정됨. 장치가 값을 보고하지 않았습니다. 장치가 온라인이 되면 장치 검색을 다시 실행하십시오." | 열기가 그 장치를 엽니다. |
설정된 장치의 값은 이름이 아니라 출력, 클러스터, 특성으로 그 태그와 비교합니다. 이름을 바꾼 태그도 계속 셈에 들어가고, 같은 값이 두 번 추가되는 일은 없습니다.
장치 자신의 페이지에서도 떠나지 않고 같은 일을 합니다. 태그 카드 머리의 태그 검색은 그 노드만 읽고 아직 태그가 없는 값을 체크된 채로 나열하며 태그로 추가를 함께 둡니다(장치의 태그 검색 참고).
태그
Matter 장치의 태그는 장치 자신에게서 옵니다. 그 태그를 위해 클러스터나 특성 번호를 입력하는 사람은 없습니다. 잘 끝난 페어링은 곧바로 태그로 이어집니다. 작업 기록 줄은 "Matter 장치 '주방 조명'을(를) 페어링했습니다."라고 읽히고, 페이지가 Matter 드라이버를 열어 장치 표에서 새 장치를 강조 표시하며, 그 장치 하나만의 스캔이 바로 돕니다. 페어링이 만든 장치는 공개하는 값이 모두 체크된 채 검색된 장치에 나타나고, 스캔은 "'주방 조명'에서 태그로 만들 값을 체크한 다음 태그로 추가를 누르십시오."로 끝납니다. 원하지 않는 것의 체크를 풀고 태그로 추가를 누르면 작업 기록 줄은 "'주방 조명'에 태그 5개를 추가했습니다."라고 읽힙니다. 아직 응답하지 않은 장치는 아무것도 보고하지 않습니다. "'주방 조명'이(가) 아직 값을 보고하지 않았습니다. 장치가 온라인이 되면 장치 검색을 다시 실행하십시오." 같은 카드는 그 뒤의 장치 검색마다, 장치에 아직 태그가 없는 값과 함께 다시 나옵니다.
태그로 추가는 Connector 구성 권한이 있는 역할에만 그려집니다. 스캔이나 페어링이 도는 동안, 스테이션이 변경을 거부하는 동안, 아무것도 체크되지 않은 동안("추가할 값을 하나 이상 체크하십시오.")에는 이유를 도구 설명으로 단 채 흐리게 남습니다. 장치가 이미 출력, 클러스터, 특성을 읽고 있는 값은 다시 추가되지 않습니다. 체크한 값이 모두 이미 있으면 아무것도 저장되지 않습니다. "'주방 조명'에는 체크한 모든 값의 태그가 이미 있어 아무것도 추가하지 않았습니다." 장치의 다른 태그가 이미 쓰는 이름에는 밝기 (2)처럼 뒤에 번호가 붙습니다.
스캔은 장치가 공개하는 것을 Matter 사양이 늘어놓는 대로 읽습니다.
| 무엇을 | 장치가 어디에서 알리는지 |
|---|---|
| 장치의 출력(endpoint) | endpoint 0의 Descriptor 클러스터(0x001D), 특성 PartsList |
| 출력마다의 클러스터 | 그 출력의 Descriptor, 특성 ServerList |
| 클러스터마다의 값 | 그 클러스터의 특성 AttributeList(0xFFFB) |
| 클러스터마다 받아들이는 명령 | 그 클러스터의 특성 AcceptedCommandList(0xFFF9) |
| 클러스터마다 구현하는 선택 기능 | 그 클러스터의 특성 FeatureMap(0xFFFC) |
| 값마다의 현재 읽기 값 | 값 자체를 한 번 읽습니다 |
스캔이 무엇을 어떤 이름으로 내놓는지:
| 값 | 내놓는 모습 |
|---|---|
| 드라이버가 아는 값(다음 절) | 스테이션 언어의 알기 쉬운 이름과 사양이 주는 형식으로 내놓습니다. 사양이 정한 바꾸는 방법을 장치가 받아들일 때만 쓸 수 있고, 그렇지 않으면 읽기 전용입니다 |
| 드라이버가 아는 값 가운데 클러스터가 구현하지 않은 기능의 것: Hue and Saturation 기능이 없는 색조와 채도, Color Temperature 기능이 없는 색온도 | 내놓지 않습니다 |
| 드라이버가 모르는 값 | 읽기 전용으로, Matter 사양의 이름(Level Control OnLevel)으로, 드라이버가 특성을 모르면 클러스터와 특성 번호(On/Off attribute 0x131B0001)로 내놓습니다. 형식은 장치가 돌려준 읽기 값의 형식입니다 |
| 둘 이상의 출력에 있는 같은 값 | 밝기 (출력 2)처럼 이름이 어느 출력인지 알립니다 |
| 전역 특성(0xFFF8부터 0xFFFD까지)이나 노드 자신(endpoint 0)의 값 | 내놓지 않습니다 |
| 목록이나 구조체, 드라이버가 다루지 않는 형식의 값, 장치가 읽기 값을 돌려주지 않은 값 | 빼고, 스캔을 마무리하는 줄에서 셉니다 |
쓸 수 있는 것으로 내놓은 태그는 읽기와 쓰기 접근으로 도착하고, 나머지는 모두 읽기 전용으로 도착합니다.
드라이버가 아는 값
드라이버는 Matter 사양에서 가져온 표를 하나 가지고 있습니다. 이름으로 아는 값과 각 값이 바뀌는 방법의 표입니다. 값은 세 가지 방법 가운데 하나로 바뀝니다. 드라이버가 보내는 명령으로 바뀌며 장치는 그 명령을 받아들이는 명령 가운데 하나로 나열해야 합니다. 사양이 쓸 수 있게 한 특성이고 장치가 그 특성을 나열하면 특성 자체에 쓰는 것으로 바뀝니다. 장치가 보고만 하는 값은 전혀 바뀌지 않습니다.
| 값 | 클러스터와 특성 | 형식 | 쓰면 장치에서 일어나는 일 | 사양이 정한 범위 |
|---|---|---|---|---|
| 켜짐 | On/Off(0x0006), OnOff(0x0000) |
Boolean | true는 명령 On(0x01)을, false는 Off(0x00)를 보냅니다. 장치가 둘 다 받아들일 때만 쓸 수 있습니다 |
true 또는 false |
| 밝기 | Level Control(0x0008), CurrentLevel(0x0000) |
UInt32 | 수준과 전환 시간 0, 옵션 덮어쓰기 없음으로 MoveToLevelWithOnOff(0x04)를 보냅니다. 출력은 그 수준으로 켜지고 최솟값에서 꺼집니다 |
0부터 254까지 |
| 색조 | Color Control(0x0300), CurrentHue(0x0000) |
UInt32 | 가장 짧은 방향, 전환 시간 0으로 MoveToHue(0x00)를 보냅니다. Hue and Saturation 기능이 있을 때만입니다 |
0부터 254까지 |
| 채도 | Color Control(0x0300), CurrentSaturation(0x0001) |
UInt32 | 전환 시간 0으로 MoveToSaturation(0x03)을 보냅니다. Hue and Saturation 기능이 있을 때만입니다 |
0부터 254까지 |
| 색온도 | Color Control(0x0300), ColorTemperatureMireds(0x0007) |
UInt32 | 전환 시간 0으로 MoveToColorTemperature(0x0A)를 보냅니다. Color Temperature 기능이 있을 때만입니다. 장치는 값을 자기 한계 안에 둡니다 |
0부터 65279까지, 단위는 미레드 |
| 블라인드 위치 | Window Covering(0x0102), CurrentPositionLiftPercent100ths(0x000E) |
UInt32 | GoToLiftPercentage(0x05)를 보냅니다 |
0(열림)부터 10000(닫힘)까지, 단위는 1/100 퍼센트 |
| 실내 온도 | Thermostat(0x0201), LocalTemperature(0x0000) |
Float(°C) | 아무 일도 없음: 읽기 전용 | -27315부터 32767까지, 단위는 1/100 ℃. 읽는 값은 -273.15부터 327.67까지 °C |
| 냉방 설정값 | Thermostat(0x0201), OccupiedCoolingSetpoint(0x0011) |
Float(°C) | 특성에 씁니다. 장치는 자기 한계 밖의 설정값을 거부합니다 | -27315부터 32767까지, 단위는 1/100 ℃. 읽는 값은 -273.15부터 327.67까지 °C |
| 난방 설정값 | Thermostat(0x0201), OccupiedHeatingSetpoint(0x0012) |
Float(°C) | 특성에 씁니다. 장치는 자기 한계 밖의 설정값을 거부합니다 | -27315부터 32767까지, 단위는 1/100 ℃. 읽는 값은 -273.15부터 327.67까지 °C |
| 팬 모드 | Fan Control(0x0202), FanMode(0x0000) |
UInt32 | 특성에 씁니다 | 0 꺼짐, 1 약, 2 중, 3 강, 4 켜짐, 5 자동, 6 스마트 |
| 팬 속도 설정 | Fan Control(0x0202), PercentSetting(0x0002) |
UInt32 | 특성에 씁니다 | 0부터 100퍼센트까지 |
| 팬 속도 | Fan Control(0x0202), PercentCurrent(0x0003) |
UInt32 | 아무 일도 없음: 읽기 전용 | 0부터 100퍼센트까지 |
| 온도 | Temperature Measurement(0x0402), MeasuredValue(0x0000) |
Float(°C) | 아무 일도 없음: 읽기 전용 | -27315부터 32767까지, 단위는 1/100 ℃. 읽는 값은 -273.15부터 327.67까지 °C |
| 습도 | Relative Humidity Measurement(0x0405), MeasuredValue(0x0000) |
Float(%) | 아무 일도 없음: 읽기 전용 | 0부터 10000까지, 단위는 1/100 퍼센트. 읽는 값은 0부터 100까지 % |
| 조도 | Illuminance Measurement(0x0400), MeasuredValue(0x0000) |
UInt32 | 아무 일도 없음: 읽기 전용 | 0부터 65534까지, 곧 10000 × log10(럭스) + 1 |
| 압력 | Pressure Measurement(0x0403), MeasuredValue(0x0000) |
Float(kPa) | 아무 일도 없음: 읽기 전용 | -32767부터 32767까지, 단위는 1/10 킬로파스칼. 읽는 값은 -3276.7부터 3276.7까지 kPa |
| 재실 | Occupancy Sensing(0x0406), Occupancy(0x0000) |
Boolean | 아무 일도 없음: 읽기 전용 | 누군가 있으면 true |
| 상태 | Boolean State(0x0045), StateValue(0x0000) |
Boolean | 아무 일도 없음: 읽기 전용 | true 또는 false |
사양은 온도, 습도, 압력을 고정된 단위로 보냅니다. 1/100 ℃, 1/100 %, 1/10 킬로파스칼입니다. 장치 검색은 이 값들을 처음부터 °C, %, kPa로 내놓습니다. 태그는 스케일링 단계에 계수(온도와 습도는 0.01, 압력은 0.1)와 단위를 담아 도착하므로, 장치가 2150을 보내면 21.5 °C로 읽힙니다. 쓰기는 값이 나가기 전에 그 단계를 되돌리므로, 21.5로 쓴 설정값은 2150으로 장치에 도착합니다. 조도는 로그값(10000 × log10(lux) + 1)이라 어떤 계수로도 변환되지 않고, 장치가 보내는 숫자 그대로 읽힙니다. 다른 모든 값도 장치가 보내는 그대로 읽힙니다.
도어록, X와 Y 좌표로 정하는 색, 장면, 그룹, Toggle 명령은 표에 없습니다. Matter 장치에는 자기 명령도 없습니다. 모든 변경은 그 태그 가운데 하나에 쓰는 것입니다.
값 쓰기
접근이 읽기와 쓰기인 Matter 태그는 쓰일 때 장치를 바꿉니다. 그 태그의 실시간 값 카드, 대시보드 조작 요소, Logic, 에이전트 어디에서든 그렇습니다. 쓰기는 어느 드라이버와 마찬가지로 장치의 대기열에 들어가 장치의 읽기와 번갈아 진행되고, 그 응답은 장치 자신의 응답입니다. 드라이버가 표에서 Matter 명령이나 특성 쓰기를 고르며, 명령을 고르는 사람은 없습니다. 쓰인 것으로 세는 것은 장치의 SUCCESS뿐입니다. 나머지는 모두 이유와 함께 거부됩니다.
| 무슨 일이 생겼는지 | 어디에서 정해지는지 | 주어지는 이유 |
|---|---|---|
| 그 지점이 드라이버 표의 값이 아님 | 무엇이든 보내기 전 | 장치가 그 값을 어떻게 바꾸는지 드라이버가 모르므로 태그는 읽기만 합니다. |
| 그 지점이 표가 읽기 전용으로 표시한 값임 | 무엇이든 보내기 전 | 장치가 그 값을 보고하며 바깥에서 정하는 것은 없습니다. |
| 쓴 값이 true도 false도 아니거나(Boolean 값일 때) 정수가 아님 | 무엇이든 보내기 전 | 그 값이 받는 것과 쓴 것. |
| 값이 사양이 정한 범위 밖에 있음 | 무엇이든 보내기 전 | 위 표가 주는 범위. |
| 태그가 클러스터를 가리키지 않음 | 무엇이든 보내기 전 | Matter 값은 출력, 클러스터, 특성으로 찾는다는 것. |
| 장치가 SUCCESS 말고 다른 상태로 응답함 | 장치 | 장치가 준 그대로의 상태입니다. 사양에서의 이름과 번호로, 예를 들어 CONSTRAINT_ERROR, 0x87(값이 장치가 받아들이는 범위 밖에 있음)이나 UNSUPPORTED_COMMAND, 0x81(이 값을 바꾸는 명령을 장치가 받아들이지 않음)입니다. 클러스터가 덧붙이는 상태는 그 뒤에 오고(FAILURE, 0x01, cluster 0x02), 사양이 이름을 붙이지 않은 상태는 번호만으로 읽힙니다. |
| 장치가 제시간에 응답하지 않음 | 장치 | 응답 없음. |
거부된 쓰기가 쓰인 것으로 알려지는 일은 없고, 현장 장비에 닿지 못한 것으로 알려지는 일도 없습니다. 태그 페이지의 상태 줄은 장치가 거부했을 때 "현장 장비가 쓰기를 거부했습니다: CONSTRAINT_ERROR, 0x87."이라고 읽히며, 무엇이든 보내기 전에 정해진 거부라면 상태 대신 이유가 들어갑니다. 답이 오지 않았을 때는 "쓰기가 확인되지 않았습니다: 현장 장비가 제시간에 응답하지 않았습니다."라고 읽힙니다. "쓰기에 실패했습니다: 현장 장비에 닿지 못했습니다."는 접속되어 있지 않은 장치의 몫입니다. 이유는 쓰기와 함께도 전달됩니다. 그 쓰기의 로그 줄이 상태의 뜻과 함께 이유를 밝히고, 에이전트의 tag_write가 그 이유를 돌려줍니다.
손으로 만드는 태그
스캔이 내놓을 수 있는 모습으로 장치가 공개하지 않는 드문 값을 위해, Matter 장치의 태그 추가가 손으로 채울 태그를 만듭니다. 그 태그의 신호원 카드는 칸 셋을 한 줄에 보이고, 그 아래 주소 미리 보기가 이를 10진수로 <endpoint>/<cluster>/<attribute>로 조립합니다(1/8/0은 첫 출력의 밝기입니다). 클러스터를 고르기 전에는 태그가 저장되지 않으며, 패널은 이렇게 알립니다. "이 태그가 읽을 클러스터를 고르십시오. 클러스터가 없으면 장치에 아무것도 묻지 않습니다."
| 칸 | 하는 일 | 값 | 기본값 |
|---|---|---|---|
| 출력 (endpoint) | 태그가 장치의 어느 출력을 읽는지. | 0부터 65535까지. 1이 첫 제어 가능 출력, 0이 노드 자신 | 1 |
| Matter 클러스터 | 태그가 그 출력의 어느 클러스터를 읽는지. | Matter 카탈로그의 클러스터를 사양의 이름과 번호로 나열합니다(Level Control (0x0008)처럼). 카탈로그에 이름이 없고 스캔으로 찾은 클러스터는 번호로 맨 앞에 나옵니다 |
없음 |
| 특성 | 태그가 클러스터의 어느 특성을 읽는지. | 0 이상. 0이 클러스터 자신의 값 | 0 |
태그 이름은 자유입니다. 태그에 이름을 붙일 뿐 장치에서 아무것도 고르지 않습니다. 데이터 형식은 Boolean, Int32, UInt32, Float, Double, String 가운데에서 고르며, 선언한 형식으로 나타낼 수 없는 읽기 값은 대신하는 숫자가 아니라 오류로 읽힙니다. 값은 장치가 보내는 그대로 도착합니다. 손으로 만든 온도, 습도, 압력 태그는 스케일링 단계에 위 표의 계수와 단위를 넣을 때까지 1/100이나 1/10 단위로 읽힙니다.
접근 칸은 드라이버의 표가 값을 바꾸는 지점에만 쓰기를 내놓습니다. 그렇지 않은 지점에는 읽기 전용을 내놓고, 그 아래에 이유를 밝힙니다.
| 지점 | 접근 칸이 내놓는 것 | 밝히는 문장 |
|---|---|---|
| 명령이나 속성 쓰기로 바뀌는 표의 값 | 읽기 전용, 쓰기 전용, 읽기와 쓰기 | 없음 |
| 아직 클러스터를 고르지 않음 | 읽기 전용 | "태그가 장치의 값을 가리킬 때까지 읽기 전용입니다: 클러스터를 고르십시오." |
| 표가 모르는 값 | 읽기 전용 | "읽기 전용: 장치가 이 값을 어떻게 바꾸는지 드라이버가 알지 못합니다." |
| 표가 읽기 전용으로 표시한 값 | 읽기 전용 | "읽기 전용: 이 값은 장치가 보고하는 값이며, 외부에서 설정하지 않습니다." |
출력, 클러스터, 속성을 편집해 태그가 드라이버가 쓸 수 없는 값을 가리키면, 그 접근은 읽기 전용으로 돌아갑니다. 장치 검색이 내놓은 태그는 장치 검색이 준 접근을 그대로 지닙니다. 장치가 어떤 명령을 받아들이는지 묻는 것은 장치 검색뿐이기 때문입니다. 장치가 나열하지 않은 값은 읽기 전용으로 남고, 칸은 쓰기도 내놓습니다.
이전 버전이 저장한 태그
이전 버전은 Matter 태그의 클러스터를 태그 이름으로만 나타냈고, 주소는 <endpoint>/<attribute>였습니다. 이 버전이 처음 시작하면, 이름이 Matter 카탈로그의 클러스터인 Matter 장치의 태그(마지막 콜론 뒤의 부분을 앞뒤 공백 없이, 대소문자를 무시하고 봅니다)가 그 클러스터를 받아, 읽던 값을 정확히 그대로 계속 읽습니다. 이름은 그대로 남고, 주소 미리 보기는 이제 <endpoint>/<cluster>/<attribute>를 보여 줍니다. 이름이 어느 클러스터와도 맞지 않던 태그는 아무것도 읽은 적이 없습니다. 클러스터 없이 남고, 읽기는 그렇다고 알리는 이유와 함께 거부되며, 그 페이지가 클러스터를 요구합니다. 변환된 태그는 원래 접근인 읽기 전용을 유지합니다. 그 버전들이 내놓던 것은 그것뿐이었습니다. 쓰려면 읽기와 쓰기를 고르십시오. 위 표의 값에서 동작합니다.