縁側 > その他 > 備忘録いろいろ
「縁側」-みんなが作る掲示板-からのお知らせ
縁側からのお知らせ

縁側をご利用いただく際のルール&マナー集を用意いたしました
ユーザーの皆様に楽しくご参加いただけるよう、主に投稿時の注意点などをまとめています。
ご投稿の前には必ずご一読をお願いいたします。詳しくはこちら⇒「縁側 ルール&マナー

紹介文

スマホのg07の不具合を確認する為に始めましたが、ログを眺めるのも飽きたので機器を限定せずに思う事を書いておきます。

カテゴリもその他に変更しましたが、過去の書込はそのままにしてあるので、違和感ありますが…

最近はGoogle Homeを手に入れたので気付いた事を書き留めておこうと思います。

  • 備忘録いろいろの掲示板
  • 備忘録いろいろの伝言板
  • 備忘録いろいろの投稿画像
この掲示板は閲覧専用です(運営者のみが投稿できます)。

久しぶりに…

その1(いくつまで続くか分かりませんが)

Google Homeの掲示板に在宅を条件に指定した時刻にスマートリモコンを動作させたいとの書込がありました。

Google Homeアプリのスケジュール設定では曜日や時刻指定は可能ですが現在地は利用できません。
普通に考えてGoogle Homeが存在する場所で実行なので当然ですけど。

IFTTTを利用すれば位置情報は入手可能ですが、指定エリアへの入出をトリガーにした動作しか出来ません。
常に同じ場所にいた場合にはトリガーは発動しないので利用できません。

基本的にスマホレベルで認識可能な位置情報には精度の問題があると思います。
実際の位置と検出位置のズレは当然としても、検出位置には多少ブレがあり本当の移動との区別ができません。
なので、IFTTTでもピンポイントや狭い範囲でのエリア指定はできない様になっています。

位置情報の精度については考えても解決しないので、とりあえず無視して考えます。

位置情報を認識する方法を考えてみました。

最初に考えたのは、Google Apps Scriptを利用しGoogle Maps APIで位置情報を取得する事です。

単純に考えるとスクリプトを常時動作させれば良い気もしますが、状態が変化しない場合でも無駄に動作しているって事になります。
スマホ上で動作しているならバッテリーが心配です。

結局、何かをトリガーにしてスクリプトを起動する方が合理的だと考えを改めました。
IFTTTで出来る範囲は最大限活用する事にしました。

IFTTTで出来るのは指定したエリアへの入出をトリガーとする事です。
このトリガーで入なら在宅、出なら不在であると記録しておけば良いと考えました。

記録先は何でも良いのですが、最終目的は指定した時刻のリモコン動作なので、時刻の記録も可能なカレンダーを利用する事にします。
単純に予定を記録するだけならIFTTTにはカレンダーへ記録するサービスが存在します。

なので、IFにはLocation、thatにはGoogle Calendarを指定します。

Locationの選択肢は以下の3種類ですが、単純に記述の通りです。
You enter an area
You exit an area
You enter or exit an area

Google Calendarには以下の2種類ですが、細かい時間指定は2番目の方しか出来ません。
Quick add event
Create a detailed event

今回は自宅にいるときの予定なので、以下のようにします。
IF
You enter an area
THEN
Create a detailed event

詳細は割愛しますが、実際に設定して記録できる事を確認しました。

この方法の利点と欠点は、以下の通りです。

利点
・カレンダーを見れば予定が一目瞭然
・カレンダーをトリガーとしたアプレットが利用可能

欠点
・カレンダーへの新規登録しか出来ない
・予定を自動記入する期間(当日だけか否か)が決められない?



2019/6/18 15:06  [2048-108]   

その1(続き)

IFTTTだけでは限界があるので、Googleカレンダーへのアクセス部分をGASで記述する事にしました。

準備としてはGASの開発環境…といってもChromeにアドインを加えるだけですが。
GAS自体はJAVA Scriptベースなので、その知識が多少は必要かも知れません。

エディタで記述して、デバッグまたは実行しながら確認出来ます。
今回はGoogleカレンダーへのアクセスなのでGASからのアクセスを許諾する必要があります。
まあ、IFTTTの場合も同じですけど。

新規登録は必定な項目をセットした上でcreateEvent、削除はdeleteEventで可能です。

流れとしては以下の通りです。

・新規登録
 getCalendarByIdメソッドでカレンダーを指定
 タイトル、開始時間、終了時間をセットしてcreateEventメソッドで予定書き込み

・削除
 getCalendarByIdメソッドでカレンダーを指定
 getEventsForDayメソッドで今日の予定を取得
 予定数分、以下の処理を繰り返す
  タイトル、開始時間、終了時間を取得
  タイトルが指定したものならdeleteEventで予定を削除

纏めて書くと簡単ですが、初めての利用なので試行錯誤してやっとって感じです。

記述したGASはエディタから実行できますが、実際の利用はIFTTTから呼ぶ必要があるのでWebアプリケーション化します。
それをIFTTTのWebhooksで指定して実行すれば連携完了です。

2019/6/18 15:27  [2048-109]   

試行錯誤しながら作成したのが下記です。

新規追加(18時に「帰宅」を記入)

function create_event(){

//カレンダーIDを取得
var myCalendar = CalendarApp.getCalend
arById('xxxxxx@gmail.com');

//予定名称を指定
var title = '帰宅'

//予定の開始時間を指定
//現在の日時を取得
var start_time = new Date();
var end_time = new Date();

//時間を変更
start_time.setHours(18);
start_time.setMinutes(00);
start_time.setSeconds(00);

//時間を変更
end_time.setHours(19);
end_time.setMinutes(00);
end_time.setSeconds(00);

//指定したタイトルと開始・終了時間で予定登録
myCalendar.createEvent(title, start_ti
me, end_time);
}

削除(タイトル「帰宅」があれば削除)

function delete_event(){

//カレンダーIDを取得
var myCalendar = CalendarApp.getCalend
arById('xxxxxx@gmail.com');

 //本日のイベントを取得
var myEvents=myCalendar.getEventsForDa
y(new Date());

//イベント数の取得
var count_Events=myEvents.length;

//
for(i=0;i<count_Events;i++){
var title=myEvents[i].getTitle();
var start_time=myEvents[i].getStartT
ime();
var end_time=myEvents[i].getEndTime(
);

//指定したタイトルを削除
if(title=='帰宅'){

//指定したタイトルと開始時間で予定削除
myEvents[i].deleteEvent();
}
}
}

削除で悩んで後で気づきましたが、作成時も同様に検索すれば多重登録は防げますね。

また、今のままだと予定はソース内に書いているので、複数予定だと大変な事になるし、単純な時間変更等でも大事になります。

なので、記入する内容一覧は別途スプレッドシートに記入し、それを参照して追加や削除をする事にします。
スプレッドシートに関する記述を学ばないと駄目ですが、EXCEL VBAの知識は役に立つのかな…

2019/6/19 07:59  [2048-110]   

その2

予定を記入してあるスプレッドシートを参照してGoogleカレンダーへ転記する事が出来ました。

今まではGoogleドライブに独立したスクリプトを保存していたのですが、今回からは使用するスプレッドシートに付随する形で作成する事にしました。

最初は独立したスクリプトからスプレッドシートを参照すれば良いと考えたのですが、添付形式の方が指定が簡単だと判明したので方針転換しました。

最初に用意したシートの形式は、こんな感じ
タイトル,開始時間,終了時間
機器1,18,19
機器2,20,21
機器3,9,10

作成したスクリプトは3種類
1.カレンダーに予定を転記する
2.カレンダーから予定を削除する
3.前日のカレンダーを参照して予定があれば、当日にも予定を転記する

1は帰宅時、2は外出時、3は在宅時を想定した動作です。

それぞれはWebアプリケーション化して、IFTTTからWebhooksで呼び出します。
1.Locationで指定エリア内に入った時にカレンダーに予定を転記
2.Locationで指定エリア外に出た時にカレンダーから予定を削除
3.Date & Timeで毎日0時になった時に前日のカレンダーを参照して予定があれば当日も予定を転記

これで基本的な動作は記述できました。
細かい点では帰宅時にはカレンダーの予定を確認し、多重登録を回避しました。
これは、1または2の位置の移動が正常に認識できないケース(実際に発生するかどうかは?)への対応です。

現状の課題としては以下の通り
・毎日0時の実行に関しては位置情報と違い必ず実行されるものとして多重登録のチェックはしていない。
 → 多分問題なし
・平日と休日、曜日などの区別はしていない。
 → これは面倒そうなので当面は無視

他にもありそうな気もしますが、とりあえず…



2019/6/26 01:21  [2048-111]   

暫く毎日の動作状況を確認してみました。
意図した動作をする事は確認できましたが、課題が分かりました。

最大の課題はIFTTTのタイムラグです。
最大?15分程度の遅延が発生する可能性がある…というのが仕様らしいです。

確かに、エリア移動時にも時刻指定でもかなり遅れる事は分かりました。
実際に動作時にカレンダー記入に加えて動作時刻を記載したメール送信をしてみました。

結果は、殆どは30秒から数分程度でしたが、最短で15秒程度で最長で26分程度(1回だけ)でした。
全てがIFTTTの問題とは限りませんが、動作時刻に意味がある様なケース(例えば帰宅直後に動作)の利用には無理があります。

もう一つの課題はLocationのエリア設定範囲です。
アプリ上ではかなり広範囲しか指定できませんが、PCのブラウザ上では一軒家を囲む程度の指定が可能です。

ただ、本当に指定範囲を超えた場合に動作しているのか判断できませんでした。
なぜなら、前述の遅延がLocationでも発生するからです。
エリア外に出る際は動作確認できた時には指定範囲の遙か彼方って感じです。

ちなみに、GAS自体は動作指示から結果確認出来るまでは長くて数秒でした。

結論としては、IFTTTについては遅延が許容できる範囲で利用するしかないと思います。
より即応性を求めたいなら別の方法を考えるしかありません。

流行?のラズパイでそれが可能なのか試してみようか思案中。

2019/7/10 09:54  [2048-112]   

設定したまましばらくの動作状況を確認してました。

結論としてはIFTTTのLocationの動作はタイムラグだけじゃ無く不安定だと分かりました。
正確な位置情報の取得手段としては使えません。

具体的には、以下の事象が数回ありました。
・移動時に明らかに指定範囲からExitしてるのに動作しない
・移動していない時(就寝中)にExitしてEnterした形跡がある

また、Exitは未動作でも同範囲を指定したEnterは動作するなど、単純に境界を越えただけで判断されている訳じゃ無さそうです。
判断条件が分からないと使えないです。

2019/7/23 08:01  [2048-113]   


この掲示板の新着スレッド

運営者のみ投稿可
備忘録いろいろ
備忘録いろいろをお気に入り登録
運営者:
亜都夢さん
設立日:
2017年3月2日
  • 注目度:

    104(お気に入り登録数:2件)

タグの登録はありません

該当掲示板はありません

ページの先頭へ