Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Embedded Swift & Matterでスマートホーム対応デバイスを操作してみよう!

Avatar for tussy5969 tussy5969
September 20, 2025
59

Embedded Swift & Matterでスマートホーム対応デバイスを操作してみよう!

Avatar for tussy5969

tussy5969

September 20, 2025
Tweet

Transcript

  1. 宮地 篤⼠ / @tussy5969 iOSDC Japan 2025 ルーキーズLT Track B

    Embedded Swift & Matterで スマートホーム対応デバイスを操作してみよう!
  2. Matterの⽤語 • Node: デバイス全体 • Endpoint: デバイス内の機能単位 • Cluster: Endpointが持つ機能のまとまり

    • Attribute: Cluster内の具体的な値・状態 Node Endpoint1: LEDライト Cluster: OnOff Attribute: On,Off状態 Cluster: LevelControl Attribute: 現在のレベル Endpoint2: 温湿度センサ Cluster: TemperatureMeasurement Attribute: 現在の温度
  3. 1. LEDオブジェクト、rootノードを作成 1. フルカラーLEDの制御 let led = LED() let rootNode

    = Matter.Node() rootNode.identifyHandler = { print("identify") } LEDオブジェクトの作成(GPIOの設定など) Matterプロトコルの rootノードを作成 Node
  4. 1. フルカラーLEDの制御 let lightEndpoint = Matter.ExtendedColorLight(node: rootNode) lightEndpoint.eventHandler = {

    event in switch event.attribute { case .onOff: led.enabled = (event.value == 1) case .levelControl: led.brightness = Int(Float(event.value) / 255.0 * 100.0) case .colorControl(.currentHue): let newHue = Int(Float(event.value) / 255.0 * 360.0) led.color = .hueSaturation(newHue, led.color.saturation) default: break } } ON/OFF制御 明るさ制御 カラー制御 Node Endpoint ON/OFF Level Color 2. Endpointを作成
  5. 1. フルカラーLEDの制御 rootNode.addEndpoint(lightEndpoint) let app = Matter.Application() app.rootNode = rootNode

    app.start() 2.で作成したEndpointを rootノードに追加 Matterアプリの起動 Node Endpoint ON/OFF Level Color 3. Endpointをrootノードに追加、Matterアプリの起動
  6. 2. 温湿度センサの値の取得 let temp_result = bme280_read_temperature( bme280, &temperature) let hum_result

    = bme280_read_humidity( bme280, &humidity) if temp_result == ESP_OK && hum_result == ESP_OK { temperatureEndpoint.updateTemperature(temperature) humidityEndpoint.updateHumidity(humidity) } Node Endpoint: 温度 Endpoint: 湿度 CurrentValue # CurrentValue # センサ値の取得 値の更新 4. センサの値の取得、更新
  7. 1. センサの初期化、rootノードを作成 var i2c_bus: i2c_bus_handle_t? = nil i2c_bus = i2c_bus_create(I2C_MASTER_NUM,

    &conf) var bme280: bme280_handle_t? = nil bme280 = bme280_create(i2c_bus, UInt8(BME280_I2C_ADDRESS_DEFAULT)) let init_result = bme280_default_init(bme280) let rootNode = Matter.Node() rootNode.identifyHandler = { print("identify") } Node 2. 温湿度センサの値の取得 センサの初期化 Matterプロトコルの rootノードを作成
  8. 2. 温湿度⽤のエンドポイントを作成 温度のエンドポイント Node 2. 温湿度センサの値の取得 let temperatureEndpoint = Matter.ExtendedTemperature(node:

    rootNode) let humidityEndpoint = Matter.ExtendedHumidity(node: rootNode) 湿度のエンドポイント CurrentValue Endpoint: 温度 CurrentValue Endpoint: 湿度
  9. 2.で作成したエンドポイン トをrootノードに追加 2. 温湿度センサの値の取得 rootNode.addEndpoint(temperatureEndpoint) rootNode.addEndpoint(humidityEndpoint) let matterApp = Matter.Application()

    matterApp.rootNode = rootNode matterApp.start() Matterアプリの起動 Node CurrentValue Endpoint: 温度 CurrentValue Endpoint: 湿度 3. エンドポイントをrootノードに追加、 Matterアプリの起動