環境光センサー

W3C作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-ambient-light-20250212/
最新公開バージョン:
https://www.w3.org/TR/ambient-light/
編集者ドラフト:
https://w3c.github.io/ambient-light/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/ambient-light/
フィードバック:
public-device-apis@w3.org 件名 “[ambient-light] … メッセージトピック …” (アーカイブ)
GitHub
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/ambient-light
編集者:
Anssi Kostiainen (Intel Corporation)
Rijubrata Bhaumik (Intel Corporation)
以前の編集者:
Tobie Langel (Codespeaks、元Intel Corporation代表)
Doug Turner (Mozilla Corporation)
課題管理:
Level 2の課題

概要

本仕様は、デバイスの周辺環境の環境光レベル(照度)を監視するための具体的なセンサーインターフェースを定義します。

この文書のステータス

このセクションは、公開時点での本書のステータスについて説明しています。現在のW3C出版物および最新の技術レポートの改訂版は、W3C技術レポート一覧(https://www.w3.org/TR/)でご覧いただけます。

本文書はDevices and Sensors Working Groupによって、勧告プロセスを用いて作業草案として公開されました。本書はW3C勧告となることを目的としています。

本書に関するコメントがある場合は、public-device-apis@w3.org購読, アーカイブ)へお送りください。 メール送信時は、件名に“ambient-light”と記載してください。例:“[ambient-light] …コメント要約…”。 すべてのコメントを歓迎します。

作業草案として公開された文書は、W3Cおよびそのメンバーによる承認を意味するものではありません。本書はドラフト文書であり、いつでも更新、差し替え、または廃止される可能性があります。進行中の作業以外の目的で引用することは不適切です。

本書はW3C特許ポリシーの下で活動するグループにより作成されました。 W3Cは、グループの成果物に関連する公的な特許開示リストを管理しています。 また、そのページには特許開示の手続きも記載されています。 個人が、本書に関連する必須請求項を含む特許について知っている場合は、W3C特許ポリシー第6節に従い開示する必要があります。

本書は2023年11月3日W3Cプロセス文書に従って管理されています。

Devices and Sensors Working Groupは、本仕様およびプライバシー・セキュリティレビューの実施方法が変化していることを踏まえ、現代的なセキュリティ・プライバシーレビューを進めています。2017年10月3日に実施された水平レビュー以降の変更も考慮しています。同様に、最新のアーキテクチャレビューの実施方法に対応するため、Technical Architecture Groupレビューの更新も進めています。

1. はじめに

Ambient Light SensorはGeneric Sensor API [GENERIC-SENSOR]を拡張し、デバイスのメイン光検出器によって検出された環境光レベル(lux単位)に関する情報を提供します。

1.1. 対象範囲

本書は、低レイテンシで高頻度のサンプリングが可能な、詳細な照度データを必要とするユースケース向けに設計されたAPIを規定します。

コントラストレベルやデバイスの測定した環境光レベルに基づく推奨カラースキームなど、少数の照度値に依存する一般的なユースケースには、prefers-contrastおよびprefers-color-scheme CSSメディア特性 [MEDIAQUERIES-5]、並びにmatchMedia API [CSSOM-VIEW-1]の利用が推奨され、本APIの対象外となります。

注: [MEDIAQUERIES-5]仕様には、かつて環境光の測定値に直接対応するlight-levelメディア特性が含まれていましたが、より高レベルなprefers-color-schemeおよびprefers-contrastメディア特性が推奨されることとなり、仕様から削除されました。

2.

この簡単な例では、ambient light sensorがデフォルト設定で作成されます。新しい読み取り値が利用可能になるたび、コンソールに出力されます。
const sensor = new AmbientLightSensor();
sensor.onreading = () => console.log(sensor.illuminance);
sensor.onerror = event => console.log(event.error.name, event.error.message);
sensor.start();
この例では、ISO 100での露出値(EV)を環境光センサーの読み取り値から計算します。最初に、ユーザーエージェントが環境光センサーの読み取り値にアクセスする権限があるか確認します。 その後、illuminance の値を最も近い露出値に変換します。
navigator.permissions.query({ name: 'ambient-light-sensor' }).then(result => {
    if (result.state === 'denied') {
        console.log('Permission to use ambient light sensor is denied.');
        return;
    }

    const als = new AmbientLightSensor({frequency: 20});
    als.addEventListener('activate', () => console.log('Ready to measure EV.'));
    als.addEventListener('error', event => console.log(`Error: ${event.error.name}`));
    als.addEventListener('reading', () => {
        // デフォルトISO値
        const ISO = 100;
        // 入射光較正定数
        const C = 250;

        let EV = Math.round(Math.log2((als.illuminance * ISO) / C));
        console.log(`露出値(EV)は: ${EV}`);
    });

    als.start();
});
この例は、環境光センサーの読み取り値を推奨される作業環境の照度レベルにマッピングする方法を示します。
const als = new AmbientLightSensor();

als.onreading = () => {
    let str = luxToWorkplaceLevel(als.illuminance);
    if (str) {
        console.log(`照度レベルは以下に適しています: ${str}.`);
    }
};

als.start();

function luxToWorkplaceLevel(lux) {
    if (lux > 20 && lux < 100) {
        return '共用エリアや短時間の滞在';
    } else if (lux > 100 && lux < 150) {
        return '時々行う視覚作業';
    } else if (lux > 150 && lux < 250) {
        return '簡単な事務作業、授業、家庭、劇場';
    } else if (lux > 250 && lux < 500) {
        return '通常の事務作業、食料品店、研究室';
    } else if (lux > 500 && lux < 1000) {
        return '機械工場、製図、スーパーマーケット';
    } else if (lux > 1000 && lux < 5000) {
        return '詳細な製図作業、コントラストの低い視覚作業';
    }

    return;
}

3. セキュリティとプライバシーに関する考慮事項

トラッキングベクトルがあります。 Ambient Light Sensorはデバイス周辺の照明状況に関する情報を提供します。潜在的なプライバシーリスクには以下が含まれます:

[ALSPRIVACYANALYSIS][PINSKIMMINGVIASENSOR][STEALINGSENSITIVEDATA][VIDEORECOGNITIONAMBIENTLIGHT]、および [IMAGINGPRIVACY] などの研究で、これらの問題がさらに深く検討されています。

Ambient Light Sensor固有の脅威を軽減するため、ユーザーエージェントはセンサーの読み取り値の精度を低減しなければなりません。また、ユーザーエージェントは最大サンプリング周波数を制限してもよいです。

これらの緩和策は、Generic Sensor APIで定義される汎用的な緩和策を補完するものです。[GENERIC-SENSOR]

3.1. センサー読み取り値の精度低減

センサーの読み取り値の精度を低減するため、本仕様はしきい値チェックアルゴリズムambient lightしきい値チェックアルゴリズム)と、 読み取り量子化アルゴリズムambient light読み取り量子化アルゴリズム)を定義します。

これらのアルゴリズムはilluminance rounding multipleおよびilluminance threshold valueを利用します。実装はそれらの値に関して以下の要件を遵守しなければなりません:

注: illuminance rounding multipleの値の選定は、読み取り値があまりにも精密にならないようにしつつ、API利用者にとって有用な値を提供するバランスが必要です。illuminance rounding multipleの最小値50ルクスは、異なる照明条件下での環境光レベルの測定が収集され、[STEALINGSENSITIVEDATA]で記述された攻撃を防げることがGitHub issue #13で示されました。また、50ルクスは、環境光センサー読み取り値を使った[VIDEORECOGNITIONAMBIENTLIGHT]によるビデオ認識を不可能にするために必要な5ルクスより高い値です。

注: illuminance threshold valueは、読み取り値が特定の値付近で量子化されて切り替わる事実が漏洩するのを防ぐために使われます。例えば、illuminance rounding multipleが50の場合、生の読み取り値が24から26の間で変動しても、illuminance値が0と50の間で切り替わることを防げます。threshold check algorithmの補助的なフィンガープリント緩和策としての有効性は数学的に証明されていませんが、実装経験に基づき本仕様に追加されています。詳細はChromium bug 1332536およびChromium review 3666917をご覧ください。

4. モデル

Ambient Light Sensor センサータイプに関連するSensor のサブクラスはAmbientLightSensorクラスです。

Ambient Light Sensorには、デバイスのメイン光検出器であるdefault sensorがあります。

Ambient Light Sensorは、強力な機能であり、名前は"ambient-light-sensor"です。これがセンサーの権限名にもなります。その権限取り消しアルゴリズムは、 generic sensor permission revocation algorithmを"ambient-light-sensor"で呼び出した結果です。

Ambient Light Sensorは、"ambient-light-sensor"という文字列で識別されるポリシー制御機能です。そのデフォルト許可リスト'self'です。

Ambient Light Sensorには仮想センサータイプがあり、その値は"ambient-light"です。

現在の照度レベルまたは照度は、ホストデバイスの周辺環境光レベルを表す値です。単位はルクス(lx)です[SI]

注: 同じ照明下でも、異なるデバイスが報告する正確なルクス値は検出方法やセンサー構造などの違いにより異なります。

Ambient Light Sensorには、ルクス単位のilluminance rounding multipleがあり、その倍数に照度の読み取り値が切り上げられます。

Ambient Light Sensorには、ルクス単位のilluminance threshold valueがあり、ambient lightしきい値チェックアルゴリズムで利用されます。

注: 上記値の最小要件については§ 3.1 センサー読み取り値の精度低減を参照してください。

5. API

5.1. AmbientLightSensor インターフェース

[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
  constructor(optional SensorOptions sensorOptions = {});
  readonly attribute double? illuminance;
};

AmbientLightSensor オブジェクトを構築するには、ユーザーエージェントは ambient light sensor オブジェクトの構築 抽象操作を実行しなければなりません。

5.1.1. illuminance 属性

illuminance の getter の手順は次の通りです:

  1. illuminanceget value from latest readingthis と "illuminance" を引数として呼び出した結果とする。

  2. illuminance を返す。

6. 抽象的な操作

6.1. ambient light sensor オブジェクトの構築

input

optionsSensorOptions オブジェクト。

output

AmbientLightSensor オブジェクト。

  1. allowedcheck sensor policy-controlled featuresAmbientLightSensor で呼び出した結果とする。

  2. allowed が false なら、

    1. 例外を投げるSecurityError DOMException

  3. ambient_light_sensor を新しい AmbientLightSensor オブジェクトとする。

  4. ambient_light_sensoroptions を引数として initialize a sensor object を呼び出す。

  5. ambient_light_sensor を返す。

6.2. ambient light しきい値チェックアルゴリズム

Ambient Light Sensorセンサータイプは以下の しきい値チェックアルゴリズムを定義します:

input

newReadingsensor reading

latestReadingsensor reading

output

差分が十分に大きいかどうかを示す boolean

  1. newReading["illuminance"] が null なら true を返す。

  2. latestReading["illuminance"] が null なら true を返す。

  3. newIlluminancenewReading["illuminance"] とする。

  4. latestIlluminancelatestReading["illuminance"] とする。

  5. abs(latestIlluminance - newIlluminance) が illuminance threshold value より小さいなら false を返す。

  6. roundedNewReadingambient light 読み取り量子化アルゴリズムnewIlluminance で呼び出した結果とする。

  7. roundedLatestReadingambient light 読み取り量子化アルゴリズムlatestIlluminance で呼び出した結果とする。

  8. roundedNewReading["illuminance"] と roundedLatestIlluminance["illuminance"] が等しいなら false を返す。

  9. それ以外の場合は true を返す。

注: このアルゴリズムは ambient light 読み取り量子化アルゴリズム を呼び出し、同じ値に切り上げられる読み取り値ではメインの update latest reading アルゴリズムの更新をトリガーしないことを保証します。そうしなければ、生の照度値が illuminance threshold value 以上の範囲で異なることをユーザーに示してしまい、異なる illuminance rounding multiple に切り上げられない場合でも情報が漏れることになります。

6.3. ambient light 読み取り量子化アルゴリズム

Ambient Light Sensorセンサータイプは以下の 読み取り量子化アルゴリズムを定義します:

input

readingsensor reading

output

sensor reading

  1. quantizedReadingreading とする。

  2. quantizedReading["illuminance"] を illuminance rounding multiple の倍数で reading["illuminance"] に最も近い値に設定する。

  3. quantizedReading を返す。

7. 自動化

このセクションは、Generic Sensor API § 9 自動化を拡張し、Ambient Light Sensor固有の仮想センサーメタデータを提供します。

illuminance 読み取り値解析アルゴリズムは、JSON Object parametersが与えられたとき、parse single-value number readingparametersと"illuminance"で呼び出した結果を返さなければなりません。

タイプごとの仮想センサーメタデータ マップには、以下のエントリを含めなければなりません:

キー

"ambient-light"

仮想センサーメタデータであり、そのreading parsing algorithmilluminance 読み取り値解析アルゴリズムです。

8. ユースケースと要件

一部のユースケースは精密な環境光測定値の取得から恩恵を受ける可能性がありますが、環境光レベルの変動をユーザー入力イベントに変換するユースケースは、より高いサンプリング周波数が有用です。

9. 謝辞

Doug Turner(初期プロトタイプ)および Marcos Caceres(テストスイート)に感謝します。

Paul Bakaus(LightLevelSensorのアイディア)に感謝します。

Mikhail Pozdnyakov と Alexander Shalamov(ユースケースと要件)に感謝します。

Lukasz Olejnik(プライバシーリスク評価)に感謝します。

適合性

文書上の慣例

適合性要件は、記述的な主張とRFC 2119の用語の組み合わせで示されます。 この文書の規範的部分におけるキーワード「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」は、 RFC 2119に記載された意味で解釈されます。 ただし、可読性のため、これらの語は本仕様書ではすべて大文字で記載されていません。

この仕様書のすべてのテキストは規範的ですが、明示的に非規範であると記載されたセクション、例、および注記は除きます。[RFC2119]

この仕様書の例は「例えば」という語で始まるか、規範的テキストから class="example" を用いて区別されています。例えば:

これは情報例の一例です。

情報的な注記は「注:」で始まり、規範的テキストから class="note" を用いて区別されています。例えば:

注: これは情報的な注記です。

適合するアルゴリズム

アルゴリズムの一部として命令形で記載された要件(例:「先頭の空白文字をすべて削除する」「falseを返してこれらの手順を中止する」)は、そのアルゴリズムの導入部に用いられるキーワード("must"、"should"、"may"など)の意味で解釈されます。

アルゴリズムや特定の手順として記載された適合性要件は、最終結果が同等である限り、どのような方法で実装してもかまいません。 特に、この仕様で定義されるアルゴリズムは理解しやすいことを目的としており、パフォーマンスを意図したものではありません。 実装者は最適化することが推奨されます。

索引

本仕様で定義される用語

他で参照定義される用語

参考文献

規定参考文献

[ECMASCRIPT]
ECMAScript 言語仕様。URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron。Generic Sensor API。URL: https://w3c.github.io/sensors/
[INFRA]
Anne van Kesteren; Domenic Denicola。Infra Standard。現行標準。URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor。Permissions。URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland。Permissions Policy。URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner。RFCsで要求レベルを示すためのキーワード。1997年3月。現行最良慣行。URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu。Web IDL Standard。現行標準。URL: https://webidl.spec.whatwg.org/

参考情報文献

[ALSPRIVACYANALYSIS]
Lukasz Olejnik。Ambient Light Sensorのプライバシー分析。2016年8月31日。URL: https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/
[CSSOM-VIEW-1]
Simon Pieters。CSSOM View Module。URL: https://drafts.csswg.org/cssom-view/
[IMAGINGPRIVACY]
Yang Liu; 他。Ambient Light Sensorによる画像プライバシー脅威。2024年1月10日。URL: https://www.science.org/doi/10.1126/sciadv.adj3608
[MEDIAQUERIES-5]
Dean Jackson; 他。Media Queries Level 5。URL: https://drafts.csswg.org/mediaqueries-5/
[PINSKIMMINGVIASENSOR]
Raphael Spreitzer。PIN Skimming: モバイルデバイスのAmbient-Light Sensorの悪用。2014年5月15日。URL: https://arxiv.org/abs/1405.3760
[SI]
SIパンフレット: 国際単位系(SI)第8版。2014年。第8版。URL: http://www.bipm.org/en/publications/si-brochure/
[STEALINGSENSITIVEDATA]
Lukasz Olejnik。W3C Ambient Light Sensor APIによる機密ブラウザデータの盗難。2017年4月19日。URL: https://blog.lukaszolejnik.com/stealing-sensitive-browser-data-with-the-w3c-ambient-light-sensor-api/
[VIDEORECOGNITIONAMBIENTLIGHT]
Raphael Spreitzer。Ambient Light Sensorを用いたビデオ認識。2016年4月21日。URL: https://doi.org/10.1109/PERCOM.2016.7456511

IDL索引

[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
  constructor(optional SensorOptions sensorOptions = {});
  readonly attribute double? illuminance;
};