LoginSignup
0
0

[7日目] 学校の食堂をIT化させる話 混雑度カメラの状況をリアルタイムで見れるようにする

Last updated at Posted at 2023-12-06

こんにちは、なりかくんと申します。
この記事はなりかくん Advent Calender 2023の7日目の記事です。

この話は、1日目から始めた学校の食堂をIT化させる話の続きとなります。前回でカメラの映像をリアルタイムに送信する部分が出来ました。

今回は、ウェブページからリアルタイムにカメラの映像と人数・混雑度を確認できるようにしたいと思います。

どのようにリアルタイムに取得するか

まず、前回も話しましたがリアルタイムに取得する手順はポーリングでリアルタイム風に取得したいと思います。
今回のカメラでは、1秒間隔でデータを更新するので、ウェブページ側では2秒ごとの情報更新を行っていこうと思います。

image.png

ページを作る

今回は、Nuxt3でページを作っていこうと思います。
最終的な取得するコードがこのようになります。

カメラは現時点で1台しかセットアップしていませんが、複数台に対応できるように配列で定義しています。
また、カメラのデータに関しては、キャッシュを無視したいのでタイムスタンプをパラメーターに設定しています。

const cameraList = ref([
  {
    name: "Camera 1",
    data: {
      count: 0,
      timestamp: 0
    },
    max: 120,
    imgId: "camera-1"
  }
])
onMounted(() => {
  for (const cameraKey in cameraList.value) {
    setInterval(async () => {
      const { pending, data: getData } = await useLazyFetch(`https://<domain>/${cameraList.value[cameraKey].imgId}/data.json?t=${new Date().getTime()}`, {
        key: String(new Date().getTime())
      });
      cameraList.value[cameraKey].data = getData.value;
    }, 1000);
  }
});

表示部分はこのようになっています。(Tailwindcssを使ってます。クソ長いクラス部分はすべて排除してます。)

シンプルに表示するだけです。なお、画像のリンクはキャッシュが効くように最終データのタイムスタンプを活用しています。

<div v-for="camera in cameraList">
  <img :src="`https://<domain>/${camera.imgId}/image.png?t=${camera.data.timestamp}`" v-if="camera.data.timestamp"/>
  <div>
    <div class="flex flex-row justify-between">
      <p class="font-bold text-2xl">{{ camera.name }}</p>
      <div class="flex flex-row text-gray-500">
        <p>データ更新時間: </p>
        <p>{{ new Date(camera.data.timestamp).toLocaleDateString() }} {{ new Date(camera.data.timestamp).toLocaleTimeString() }}</p>
      </div>
    </div>
    <div class="grid grid-cols-2">
      <div class="flex flex-col">
        <p class="text-xl py-1">人数</p>
        <div class="flex flex-row flex-nowrap">
          <p class="text-4xl">{{ camera.data.count }}</p>
          <p class="text-2xl ml-2 mt-2"></p>
        </div>
      </div>
      <div class="flex flex-col">
        <p class="text-xl py-1">混雑度</p>
        <div class="flex flex-row flex-nowrap">
          <p class="text-4xl">{{ (( Number(camera.data.count) / camera.max ) * 100).toFixed(2) }}</p>
          <p class="text-2xl ml-2 mt-2">%</p>
        </div>
      </div>
    </div>
  </div>
</div>

ページの認証

今回、学校の生徒だけがページを見れるようにしたいのでGoogleアカウントで認証を設けました。
内部としては、Firebase Authenticationを使ってメールアドレスのドメイン部分が学校のメールアドレスであれば認証を通すようにしています。

コードは、まあネットにありふれているようなコードなので省略します。

最後に

最近ちょっと時間が無くて、記事の内容が大分大雑把になっていますが、書きたいことはかけたので満足です。
最後までお読みいただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0