# 仕様書(アプリ・サーバ側) 作成者:掘井元貴 作成日:2023年10月16日 最終更新日:2023年10月30日 仕様書の参考:https://fallacious-packet-325.notion.site/ffe775e764bb4ac4810c83aeeb1972a5 ,ChatGPT ## 1. 概要 ### 1.1 目的 エアコンのIoT化を行うシステムの開発を行い、既存エアコンの自動運転と遠隔制御を行う、シンプルな機能でお年寄りにも積極的にエアコンを使ってもらえるようにし熱中症にかかる人を削減する ### 1.2 背景 お年寄りの熱中症による死亡率が高い。スマートエアコンの普及率が低い。詳細は企画書参考。以上の課題を解決するシステムの作成を行う ## 2. システム全体構成 ### 2.1 システム構成図 スマホアプリ、IoT機器、AWSサーバレスの関係を示す構成図を挿入。 ![](https://hackmd.io/_uploads/SyFUN9JG6.png) ### 2.2 システムコンポーネント詳細 スマホアプリ 機能概要 - 対応OS/バージョン android/~~api level 27/Version8.1~~ -> api level 31/Version12 ->googleplayの対応APIレベル制限により2023年9月1日よりapi31以降を対象にする必要があるため - 使用技術・ライブラリ AndroidStudio: Python:Flask,OpenAI,Wisper,Zappa, AWS:Lambda,APIGateway,AWSIoTCore 通信方式:MQTT,HTTPS 使用技術 サーバレスアーキテクチャの概要 ## 3. 機能要件 ### 3.1 スマホアプリ #### 3.1.1 認証機能 概要:アプリとIoT機器をWiFiを通して認証し他人のスマホが外部からIoT機器にアクセスできないようにする ・認証に用いるコードは英数大文字小文字といくつかの記号を使用可能にする ・認証の入力時は、空文字チェック、正誤チェックを行いそのメッセージを下部に表示する #### 3.1.2 運転モード選択 概要:不快度指数に基づいた3つの運転モードを選択し、運転モードの命令をサーバに送信、サーバは受け取った命令をIoT機器に送信することでその運転モードでエアコンを運転する ・運転モードが選択されてから5秒以内に操作が開始される ・運転モードは不快度指数の60~65、65~70、70~75の3つのモードで運転を行う![](https://hackmd.io/_uploads/SyIBwK1fp.png) ・運転モードの終了は、エアコンの運転をOFFにするか設定の運転時間を終了するまで続く ・運転終了後運転を再開した場合次回設定した運転モードで運転を開始する? #### 3.1.3 遠隔操作 概要:WiFiを通してIoT機器に通信を行うことで外出先からでもエアコンの操作を行うことができる ・操作できることは運転のON/OFF、温度の設定、運転モードの選択 ・認証済みでないと操作できない #### 3.1.4 運転時間の指定 概要:不快度指数に合わせた自動で運転を開始する時間を指定しそれ以外の時間では指定した不快度指数の運転モードから外れていても自動で運転を開始せず、また指定時間を過ぎると運転を終了する ・開始時間と終了時間が同じ場合は設定できない ・時間の指定は開始時間と終了時間を0時00分から24時00分の間で指定できる ・開始時間が0時00分で終了時間24時00分の場合1日中運転モードに従って自動で運転の制御を行う ・上記で設定しなくても1日中という選択肢を設定する #### 3.1.5 音声操作 概要:ボタンを押して音声認識モードにしスマホのマイクで音声操作できる機能 ・操作できる機能は運転のONOFFと温度の設定 ・音声の入力の終了は音声の入力が一定時間無いことで判定する ・入力された音声はサーバに送信し文字起こしされ、その文字をOpenAIのAPIを用いて運転命令として数列の形式に変換しIoT機器に送信する ・命令が正しく変換できない形式の場合命令が正しくない旨をアプリに送信する ・認識を終了するボタンをつける ### 3.2 サーバ #### 3.2.1 遠隔操作 サービス:AWSLambda,APIGatewayまたはAWSIoTCore 動作:ユーザはアプリから運転のONOFF、温度設定、運転モードの選択、運転時間の指定などの命令を送信できる、APIGatewayを通じてLambda関数がトリガーされ命令がIoT機器に送信される。アプリの状態が認証済みでないと命令は送信できない。 #### 3.2.2 音声操作 サービス:AWSLambda,APIGatewayまたはAWSIoTCore 動作:ユーザがアプリで入力したマイクでの運転命令の音声データを送信しAPIGatewayを通じてLambda関数がトリガーされる。Lambda関数では音声データを文字起こししテキストに変換したのちOpenAIのAPIを通して数列に変換する。正しく命令が数値に変換できている場合はIoT機器に送信し、正しく変換できていない場合はスマホアプリに正しくない旨を送信する ## 4. 非機能要件 ### レスポンスタイム: アプリの操作完了からエアコンの操作開始まで5秒以内を目指す ### 同時接続数: 機器1個につき同時接続は1つのアプリ ### セキュリティ要件: 機器とアプリを認証し認証済みでなければ外部からの操作ができないようにする。 認証に使うデフォルトのコードはIoT機器に記述し認証済みの機器でのみ別のコードに変更可。 コードは16桁で英数大文字小文字といくつかの記号を使用可能にする。 アプリごとにランダムに設定したIDを同時に登録する その他システム全体の品質に関する要件 ## 5. インターフェース仕様 ### 5.1 スマホアプリとAWSサーバレス間のAPI仕様 以下の内容は見本、実装を行いながら記述予定 #### エンドポイントのURL: AWS Lambda関数にアクセスするためのAPI GatewayのURL。 #### HTTPメソッド: GET, POST, PUT, DELETEなどのHTTPメソッド。 #### リクエストヘッダー: 必要なヘッダー情報(例:Content-Type, Authorizationなど)。 #### リクエストボディ: 必要な場合、リクエストの内容や形式を記述。 #### レスポンスボディ: 返されるデータの内容や形式。 #### エラーコードとメッセージ: エラーが発生した場合のHTTPステータスコードとエラーメッセージ。 #### 認証: APIキー、OAuthトークン、IAMロールなどの認証方法。 これらは後程実装を行いつつ記述を行う ### 5.2 IoT機器とAWSサーバレス間の通信仕様 #### 5.2.1 IoT機器の特性: データ: 温度(摂氏) 通信の頻度: 5分ごと 電源: バッテリー駆動 ネットワーク: Wi-Fi #### 5.2.2 通信プロトコル: MQTTやHTTP, WebSockets #### 5.2.3 認証・認可: AWS IoT Coreの証明書ベースの認証 IAMポリシーでのアクセス制御 #### 5.2.4 データの形式: { "device_id": "sensor123", "timestamp": "2023-10-19T12:34:56Z", "temperature": 22.5 } #### 5.2.5 AWSサービスの利用: AWS IoT Core: IoT機器からのデータ受信 AWS Lambda: データの処理や変換 Amazon DynamoDB: データの保存 #### エラーハンドリング: 通信エラー: 再試行ポリシーの適用 データ処理エラー: CloudWatch Logsにエラーログを出力 WiFI ## 6. エラー処理 ### 認証機能 - エラーカテゴリ: 認証エラー - エラーメッセージ: 使用できない文字が含まれる場合は使用できない文字が含まれる旨を表示、空白の場合は何も入力されていない旨を表示、正しくない文字列の場合は入力が正しくない旨を表示する - エラーロギング: エラーの詳細情報、発生時の状況、スタックトレースをロギング。 - エラー対応のアクション: エラーメッセージを表示後、再入力を促す - ユーザーガイダンス: "認証コードを確認し、問題が解決しない場合はサポートチームに連絡してください。" 他は実装しながら記述 ## 7. その他 テストシナリオ - アプリと機器の認証 - 前提条件 アプリは未認証状態 IoT機器はWiFiに接続されている AWSに構築したサーバが稼働している - テスト手順 1.認証画面をタップする 2.IoT機器に付属する認証コードを入力する 3.正しい入力か確認する 4.認証コードが正しければ認証完了 5.認証完了のメッセージが表示される - 期待結果 認証画面が表示される コードが正しい入力であるかチェックされる 正しい入力である場合認証が完了する 認証完了メッセージが表示される - 運転モード選択 - 前提条件 アプリは認証が完了している IoT機器はWiFiに接続されている AWSに構築したサーバが稼働している - テスト手順 1.運転モードを選択ボタンをタップする 2.運転モードをタップする 3.5秒以内にエアコンの運転モードが変更される - 期待結果 運転モードメニューが表示される エアコンの運転モードは5秒以内に変更される - 遠隔操作 - 前提条件 アプリは認証が完了している IoT機器はWiFiに接続されている AWSに構築したサーバが稼働している - テスト手順 - 期待結果 - 運転時間の指定 - 前提条件 アプリは認証が完了している IoT機器はWiFiに接続されている AWSに構築したサーバが稼働している - テスト手順 - 期待結果 - 音声操作 - 前提条件 アプリは認証が完了している IoT機器はWiFiに接続されている AWSに構築したサーバが稼働している - テスト手順 - 期待結果 デプロイ手順 アプリはAndroidstudioを通して実機にデプロイされる サーバはAWSCLIを通してPythonのZappaライブラリを使用してデプロイを行う メンテナンス情報 現時点では運用保守は考えていない