Tiny View Plus v0.9.33より外部への通知機能が搭載されました。この機能はWTW香川からのリクエストに作者の浅野さんが答えてくださったものです。本来の目的はラップ毎にLEDを点灯させるなどのレースの演出に使うことでした。
通知のされるのはレースの開始、終了、ラップなどです。詳細はドキュメントをご覧ください。
ラップの通知にはラップ数とタイムの情報も含まれているので、これを利用して集計も出来そうなのでテストをしています。
テストの様子です。右側のラップ数をグラフ的に表示するアイデアはninjaMoonLightさんから頂きました。
TinyViewPlus v0.9.33、現在はbetaですが、イベントやラップの情報を外部に通知される様なりました。ラップ毎にLEDを光らせたり、自動集計システムが作れそうです。MacOSで情報を受けてGoogle Sheetに反映させるテストを行なっているところです。(タイムの数値欄は間違ってるので無視してください^_^) pic.twitter.com/xS4KHCaGm3
— コザック KozakFPV (@nkozawa) January 14, 2025
[ 私のテスト環境においての情報の流れ ]
– Windows上のTinyViewPlusからOSCプロトコルで通知を発信。
– macOS上のPythonで受信し、データをGoogle SheetにPOSTする。
– Google ScriptでPOSTを受けてSheetに書き込む。
ここでは、一番基本となる部分だけを紹介します。
[ Google Sheet側の設定 ]
– Googleドライブで新規のスプレッドシートを作ります。
– “拡張機能”から”Apps Script”を開きます。
– スクリプトは以下のようになります。
const spredSheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spredSheet.getSheetByName('シート1');
function doPost(e) {
var data = JSON.parse(e.postData.getDataAsString());
sheet.appendRow([data.timestamp, data.addr, data.arg0, data.arg1, data.arg2]);
}
– 左側のメニューの”サービス”で”Google Sheets API”を追加します。
– 上の方にある”デプロイ”から”新しいデプロイ”を実行します。種類の選択は”ウェブアプリ”にします。アクセスできるユーザーを全員にしておきます。
– デプロイ時にアクセスの確認が出ます。”アクセスの承認”を押します。
後は、いつもの手順ですが、少々ややこしいです。画面の流れだけ示しておきます。
– 完了するとウェブアプリのURLが払い出されますのでコピーしておきます。URLを知る人は誰でもPOST出来るので注意が必要です。
– スクリプトを変更した時は、”デプロイを管理”からバージョンを更新します。URLは変わりません。
[ パソコン側の設定 ]
Python3が動けば、どんなパソコンでも大丈夫なはずです。
OSCのためのライブラリーが必要です。
pip install python-osc
プログラムは以下の通りです。url=のところに先にコピーしたウェブアプリのURLを入れます。
from pythonosc import dispatcher
from pythonosc import osc_server
import json
import requests
import time
url = "https://script.google.com/macros/s/xxxxx/exec"
ip = ""
port = 4001
def oschandle(addr, *args):
print(addr)
print(*args)
timestamp = time.strftime('%Y/%m/%d %H:%M:%S')
data = {
"timestamp" : timestamp,
"addr" : addr,
"arg0" : args[0],
"arg1" : args[1] if (len(args) > 1) else "",
"arg2" : args[2] if (len(args) > 2) else ""
}
r = requests.post(url, data=json.dumps(data))
print(r)
if __name__ == "__main__":
dispatcher = dispatcher.Dispatcher()
dispatcher.map("/*", oschandle)
server = osc_server.ThreadingOSCUDPServer((ip, port), dispatcher)
print("Serving on {}".format(server.server_address))
server.serve_forever()
[ Tiny View Plusの設定 ]
最新のTiny View Plusを導入します。記事を作成時の最新版はv0.9.33-beta3です。
ドキュメントに書かれているように一度Tiny View Plusを起動後に作成されるdata/settings.xmlを編集してOSC通知の送信先IP Addressを変更します。
<oscMonitor>
<enabled>1</enabled>
<host>192.168.1.255</host>
<port>4001</port>
</oscMonitor>
IP Addressは私はサブネットに対するブロードキャストにしました。受信するパソコンのIP Addressを指定すべきかも知れませんが、サブネット内の複数の機器で同時に情報を受信できることを狙ってブロードキャストIP Addressを試しています。
IP Addressの設定後にTiny View Plusを起動します。
これで準備完了です。Pythonのプログラムを起動し、Tiny View Plusでレースの開始やラップを記録し、データがGoogleシートに記録されれば成功です。ここまでくれば後は、ゴリゴリとGASを書いていけば集計作業の省力化が可能と思います。ただしOSCはUDPで送られてきますので、データが必ず受信されるとは限りませんのでデータが欠損した場合のことは考慮しておく必要があります。また、OSの実装にもよると思いますがデータの処理される順序が入れ替わることもありますので注意が必要です。