はじめに
社内で暑さと乾燥がひどいという話をうけて、IoTがハヤっているようで先日ビックカメラでMESH(温度・湿度)というものみつけましたのでこれを使って計測しようと思いました。 https://meshprj.com/jp/ ソニーが発売しているIoTビーコンタグで人感や動作や明るさなどを検知し、専用のアプリへ情報を送信するそうです。 (けっこう前からあるらしいんですが最近まで知りませんでした。)

アプリの画面はこんな感じ。
設計
とりあえず設計です。 インフルエンザウイルスは空気中の水分量が11グラム以上あれば死滅するとのこと。 よって温度と湿度がわかれば水分量を計算して今安全か危険かが判断できるはずです。 まずAugustの式で飽和水蒸気圧を算出します。
august = (t)-> Math.ceil(6.1078 * 10 ** ( (7.5 * t) / (t + 237.3) ) * 1000, 2) / 1000
飽和水蒸気圧をもとにTetensの式で飽和水蒸気量を求めます
tetens = (t)-> Math.ceil( (217 * august(t)) / (t + 273.15) * 1000, 2) / 1000
今回は気圧は1とします。 こんな感じに設計しました。

実装
ではやってみましょうとのことでであれこれ進めたのですが、ビーコンから値は受け取れるけどその値を算術演算することはできませんでした。 調べてみると開発者向けにSDKが提供されていて慣れてる人ならJavaScriptでバリバリ書けるよ!ってことなので利用しました。

こんな感じのブラウザベースの開発画面です。しんどそう。 さっぱりわからないのでドキュメントを見てみたんですがどうにも情報が少ないです。 なにができてなにができないのかわかりませんし、ビルトインな関数やら変数の情報がまったくありません。
結局、 ・iPhoneなどがないと動作しない(ビーコン単体では動作しない) ・カスタムタグから引数を他の既存のタグへ渡せない(カスタムタグ同士はOK) ・IFTTTというサービスでSlackなどへ連携できるっぽいけど引数を渡せないから使えない
という感じでてんでダメダメな課題だらけでした。
なのでもう全部自分で作ればいいじゃんということでSDKのなかでバリバリJavaScriptを描くことにしました。 で。書いたのがこちら。
var august = function(t) { return Math.ceil(6.1078 * Math.pow(10, (7.5 * t) / (t + 237.3)) * 1000, 2) / 1000;};
var tetens = function(t) { return Math.ceil((217 * august(t)) / (t + 273.15) * 1000, 2) / 1000;};
var checkInfluenza = function(t, h) {
var hm, hn, msg, res, status, wa, wm;
res = {};
wm = tetens(t);
wa = wm * (h / 100);
hm = Math.ceil((11 / wm) * 100);
hn = hm - h;
msg = "";
if (wa >= 11) {
status = "安全";
} else {
status = "危険";
msg = hn + "%不足しています";
}
res.wm = Math.floor(wm);
res.wa = Math.floor(wa);
res.hm = hm;
res.hn = hn;
res.status = status;
res.msg = msg;
return res;
};
param = checkInfluenza(messageValues.temperature, messageValues.humidity);
string = param.status + "です\n";
string += "温度:" + messageValues.temperature + "/湿度:" + messageValues.humidity + "\n";
string += "水分量:" + param.wa + "/" + param.wm + "→" + "必要湿度:" + param.hm + "%";
if (param.msg !== "") {
string += "\n" + param.msg;
}
ajax( {
url : "https://slack.com/services/hooks/slackbot?token=xxxxxxxxxxxxxxxxx" + properties.channel,
type : "POST",
data : string,
timeout : 5000,
success : function (data, dataType) {
callbackSuccess( {
resultType : "continue",
runtimeValues : runtimeValues
} );
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
runtimeValues.outputIndex = -1;
callbackSuccess( {
resultType : "continue",
runtimeValues : runtimeValues
} );
}
} );
resultType : "pause"
いろいろと雑ですが心が折れてしまいました。 RuntimeValue(実行時の共通変数的なもの)だとかInitializeとかいろいろあったんですがぜんぜん使えなかったんで全部Executeで処理しました。
運用
Slackチャンネルに投稿するようにしました。

これで現在やばいかそうでないかがわかります。 Enjoy influenza check life!
鈴木
和服とvapeとСистемаと醗酵とたまごふわふわとカッティングシェイプスとジャージークラブとjuke/fwkに傾倒する人です