Closed dlpMSR closed 5 months ago
これ何やろうとしてたか調べてmergeしないとダメっぽい おそらく基本的には #14 の修正、 #8 の修正も含まれている模様。
CO2、温度・湿度の値が常に少数第一位まで表示されるようにした。
最新の各計測値を返すAPI。 Redisにキャッシュされた計測値を返すようにした。これまではMariaDBに記録された最新の計測値を返していた。この変更によりAPIが叩かれた時に一々MariaDBにクエリを投げなくなった。メモリ内で処理が完結するのでレスポンスが少し高速になる。(未検証) また、環境データの計測が停止している時はエラーを返すようにした。これまでは計測が停止しているときもMariaDBに保存された最新の値を返していた。この仕様で返される値は正常に計測されたものと、そうでないものとの区別がつかない問題があった。そのため、エラーを返して計測の不備を早期発見できるようにした。
EnvValueモデルのマネージャクラスとして EnvValueManager を追加した。 独自のマネージャクラスには、よく使う絞り込みクエリなどをメソッドとしてまとめられる。メソッドにすると再利用が簡単になる。EnvValueManager にはメソッド get_last_12_hours_values() を用意した。具体に的には、これまでは views.py で次のロジックを3回書いていた。
now_utc = datetime.datetime.now(datetime.timezone.utc) six_hours_ago = now_utc - datetime.timedelta(hours=12) values = EnvValue.objects.order_by('-created_at') \ .filter(created_at__range=[six_hours_ago, now_utc])
これを EnvValueManager の get_last_12_hours_values() にまとめて、次の1行を3回書けば済むようにした。
values = EnvValue.objects.get_last_12_hours_values()
参考: https://selfs-ryo.com/detail/model_methods
計測デーモンに機能を追加した(#8 の内容)。毎回のループの中で行う処理を2つ追加した。
補正値を計算してRedisにキャッシュする 過去30分内のレコードが25件より多いとき、補正値を計算しRedisにキャッシュする。キャッシュされた値はAPIやwebsocketでの配信に利用される(上のbackend:views.pyの説明を参照)。いまのところ、実際には補正値を計算しているのはCO2濃度[ppm]だけである。温度・湿度は最新の計測値がキャッシュされる。センサはたまに誤差の大きな値を出力してしまう。このため、掲載する値としては過去の複数のデータから適当に調整したものを用いる。これが補正値である。CO2濃度の補正値としては過去30分の値の平均を使用している。
Teamsへ通知を発報する 室内のCO2濃度の上昇をお知らせする。前回の発報から3時間以上経過かつ、5分以上連続で計測値が閾値を超えた場合に通知する。発報の目安となる閾値は1200とした。これは、新型コロナウイルス感染症対策に有効な1000ppm以下という基準を元に実際に運用しながら調整した値である。(参考) https://www.teitannso.jp/article/16273746.html また、通知の送信先はdaemonの .env のWEBHOOK_URL という値で設定するようにした。
WEBHOOK_URL
これ何やろうとしてたか調べてmergeしないとダメっぽい おそらく基本的には #14 の修正、 #8 の修正も含まれている模様。
主な変更点
frontend
CO2、温度・湿度の値が常に少数第一位まで表示されるようにした。
backend
environment/views.py
class EnvValueList
最新の各計測値を返すAPI。
Redisにキャッシュされた計測値を返すようにした。これまではMariaDBに記録された最新の計測値を返していた。この変更によりAPIが叩かれた時に一々MariaDBにクエリを投げなくなった。メモリ内で処理が完結するのでレスポンスが少し高速になる。(未検証)
また、環境データの計測が停止している時はエラーを返すようにした。これまでは計測が停止しているときもMariaDBに保存された最新の値を返していた。この仕様で返される値は正常に計測されたものと、そうでないものとの区別がつかない問題があった。そのため、エラーを返して計測の不備を早期発見できるようにした。
environment/models.py
EnvValueモデルのマネージャクラスとして EnvValueManager を追加した。 独自のマネージャクラスには、よく使う絞り込みクエリなどをメソッドとしてまとめられる。メソッドにすると再利用が簡単になる。EnvValueManager にはメソッド get_last_12_hours_values() を用意した。具体に的には、これまでは views.py で次のロジックを3回書いていた。
これを EnvValueManager の get_last_12_hours_values() にまとめて、次の1行を3回書けば済むようにした。
参考: https://selfs-ryo.com/detail/model_methods
daemon
daemon/office_environment_logger.py 及び、daemon/dummy.py
計測デーモンに機能を追加した(#8 の内容)。毎回のループの中で行う処理を2つ追加した。
補正値を計算してRedisにキャッシュする 過去30分内のレコードが25件より多いとき、補正値を計算しRedisにキャッシュする。キャッシュされた値はAPIやwebsocketでの配信に利用される(上のbackend:views.pyの説明を参照)。いまのところ、実際には補正値を計算しているのはCO2濃度[ppm]だけである。温度・湿度は最新の計測値がキャッシュされる。センサはたまに誤差の大きな値を出力してしまう。このため、掲載する値としては過去の複数のデータから適当に調整したものを用いる。これが補正値である。CO2濃度の補正値としては過去30分の値の平均を使用している。
Teamsへ通知を発報する 室内のCO2濃度の上昇をお知らせする。前回の発報から3時間以上経過かつ、5分以上連続で計測値が閾値を超えた場合に通知する。発報の目安となる閾値は1200とした。これは、新型コロナウイルス感染症対策に有効な1000ppm以下という基準を元に実際に運用しながら調整した値である。(参考) https://www.teitannso.jp/article/16273746.html また、通知の送信先はdaemonの .env の
WEBHOOK_URL
という値で設定するようにした。