2021年8月22日日曜日

【SESAMEサイクル(SESAMEシリーズ)】 NFCタグをエミュレートするアプリをつくった (Android)


セサミのNFCタグ機能を実際のタグなしで自由に発動させたくて、アプリを作った話。

ページ下部よりAPKダウンロードできます



 【まえがき】

うちでは玄関のセサミ3は前回記事で書いたGASで運用していてNFCタグ機能は使っていないのだけど、最近セサミサイクル(ママチャリ)を導入したことでうちにもNFCタグの出番がやってきた。

さっそくハンドルラバーの側面にタグを貼りつけ(ちょうど円くてピッタリ)、快適さをテストしたところ、どうも本体との接続に時間がかかった場合に解錠が作動せずセサミアプリの起動のみで終わってしまうことがある模様。


ただでさえAndroidはNFC読み取りにロック解除が必要なため、これでは一連の動作が

  • 自転車の手前でスマホを取り出す
  • スマホロックを解除
  • NFCタグにかざす
  • スタンドを外す
  • 自転車にまたがってスマホを見ながら解錠を待機(ダメなら手動で開ける)
  • スマホをしまい、Go!

となってしまい、スマートさにかける印象だった。

普通の物理鍵なら、これで済む話。
  • (たまに鍵を探す)
  • 鍵を取り出す
  • 鍵を挿す
  • スタンドを外し、Go!

ウィジェット運用も考えたけれど、たまの自転車に乗る時のために常に存在感を放たれてもちょっと…邪魔かも…ということで却下となった。


【対策を思案】

当初、全く別のアプローチ(Termux + pysesameos2)で途中まで進めてしまったが、Bluetooth関連の制約(?)でAndroid上ではうまく実装できず断念。
次にsesame_bridgeを検討したものの出先では使えなさそうだったためこちらも断念した。(ローカルループバックアドレスを使えば可能と後で知る)

ただ収穫はあり、sesame_bridgeのソースコードを参考に(というか丸パクリ)すればNFCタグインテントをエミュレートするアプリの作成はさほど難しくないのでは?と思い至り、急遽開発環境を整えた。(Androidアプリ初挑戦)



そして出来上がったのがこちら。

【アプリ概要 - EmuNFCtag】

初期設定を済ませると、次回から起動するだけでセサミのNFCタグ動作をエミュレートする単機能アプリ。SESAME3等にも使用可能。





【使用方法】

使い方としては、Taskerなどのマクロアプリを用いての「好みのトリガー → アプリ新規起動」という運用を想定。


実際の使用例

1. 環境に合わせて、EmuNFCtagを適切に設定しておく。

(自分の環境では4秒間隔、2回リトライに落ち着いた。)


2. MacroDroidでマクロ作成。(一例)





【解説】

・トリガー

可能な限りシンプルかつ誤操作の恐れが少ないものを考えて設定。
画面操作は個人的にめんどうなので、画面を見る必要がないものにしてみた。

・アクション

なぜか稀にサイクルとの接続が BleLogining で止まってしまうことがあったため、安定性重視でセサミアプリも毎回新規起動させることにした。こうしてからは今のところ発生していない。

すぐさまポケットにしまうことを想定し、画面を消すようにしている。


【使用感】

自分の環境では、これでかなり快適になった。

動作としては、

  • 自転車へ向かう良きタイミングでスマホを取り出す
  • スマホロックを解除
  • ジェスチャートリガー
  • スマホをしまう
  • スタンドを外し、Go!


箇条書きだと動作数こそなお物理鍵に劣るものの、実際には快適感が比ではない。タイミングを掴んだら大抵は自転車の数歩手前で、遅くてもハンドルを握ったくらいで作動してくれるようになった。

【SESAME 3での使用】

このアプリはもちろんセサミ3(セサミ4)に使用することもできる。ただリトライするとトグルで逆戻りしかねないため、一発を遠くから実行するという使い方になると思う。

たとえば、Wi-Fiモジュール+玄関先に貼り付けたNFCタグで運用しているのであれば「玄関前での数秒の待機がストレス」という問題の解消には使えそうだ。(ウィジェットとどちらが便利かは個人差)


2021年6月16日水曜日

【SESAME4 / SESAME3】 GAS から Web API を利用するサンプル (Sesame OS2)

2021/10/30 更新

複数台操作の不具合の指摘をうけ、修正がてらプロパティ周りの仕様を大幅変更。


 【まえがき:APIが刷新されていた】


SESAME3用のAPI* がひっそりと上がっていた(正式発表はまだ?)ので、Google Apps Script からいじれるようにしてみた。
*追記:セサミ4を含むSesame OS2の入ったデバイスに対応。

従来のものとは仕様が変更され、導入のハードルがすこし上がった感じ。
GASにこだわらないなら pysesame3 が便利。

今回は、以前書いたセサミミニ用のスクリプトから乗り換えやすいよう、使用方法を極力継承してセサミ3に対応した新しいスクリプトを書いてみた。



【事前準備1:必要な各種データを入手】


1. 公式のユーザーページ(https://partners.candyhouse.co/)にログインし、APIキーを取得。


2. 以下のいずれかを行う。(現在はB推奨)

  A. セサミアプリでマネジャー権限のQRコードを発行し、好みのQRコードリーダーで読み取り、中身のテキスト(ssm://UI? から始まる長い文字列)をコピーしておく。
(以前はSecret Keyなどを簡単に取得できなかったためこのようにするしかなかった。もしBでうまくいかない場合はこちらで。)


  B. ユーザーページの user devicesボタンから任意のデバイスを選択し、UUIDSecret Keyを取得。





 


【事前準備2:外部JavaScriptを追加】


施解錠操作用の署名生成がややこしくて自力では困難なため、artjombさんの cryptojs-extension を拝借する。

1. まずはスクリプトファイルを新規作成
(Googleドライブ 新規→その他→Google Apps Script)

  • lib/cryptojs-aes.min.js
  • build/cmac.min.js
の内容をそれぞれ丸ごとスクリプトファイルに追加(コピペ)する。





ファイル + からスクリプトを追加できる。
※初期状態で表示されるテキストは不要なので、テキストエリアを空白にしてから貼り付け

名前はなんでも良いけれどわかりやすくそのまま。


【汎用サンプルコード】

ようやくメインのコード。

はじめに、「プロジェクトの設定」でChrome V8 ランタイムが有効になっていることを確認。(多分デフォルトでなっている。)

コード.gsに戻り、テキストエリアを空白にしてから以下をコピペ。

const prop = PropertiesService.getScriptProperties();
const myKey = prop.getProperty('myKey');
const apiKey = prop.getProperty('apiKey');

// プロパティ登録 (*****部分を書き換えて初回のみ実行する。実行後は消してもOK)
function prepare(){
  prop.deleteAllProperties();
  prop.setProperty('myKey', '*****'); // 任意のパスキー。自由に設定する
  prop.setProperty('apiKey', '*****'); // ダッシュボードで取得したAPIキー
  
  // 事前準備A組は↓に、QRから取得したテキスト全文を入れる
  analyzeQR('*****');
  //analyzeQR('*****'); // デバイスが複数ある場合、適宜追加

  // 事前準備B組は↓に、セサミに付けた名前, UUID, SecretKey の順で入れる
  analyzeQR('*****', '*****', '*****');
  //analyzeQR('*****', '*****', '*****'); // デバイスが複数ある場合、適宜追加
  
  showProps();
}

//プロパティ確認
function showProps(){
   console.log(prop.getProperties());
}

// 動作テスト。成功したら200が返り、セサミが動く
function test() {
  main(myKey, "セサミの名前", 2, "GAS");
  /*
  説明:
  "セサミの名前" を実際のセサミの名前に変更する
  "GAS" はアプリの通知と履歴に表示される名前。変更可
  
  セサミの名前について補足説明:
  将来もしアプリ上でセサミの名前を変更したとしても、このスクリプトの運用に影響はありません 
  設定を更新する必要はなく、逆に言えば、prepare()実行時点の名前を使い続ける必要があります
  新しい名前をGASでも使いたい場合は、新しい情報で再度prepare()を実行します
  */
}

function doPost(e) {
  const p = JSON.parse(e.postData.contents);
  main(p.myKey, p.deviceName, p.command, p.user);
}

function doGet(e) {
  const p = e.parameter;
  main(p.myKey, p.deviceName, p.command, p.user);
}

// 施解錠操作
function main(key, device, command, user='ウェブアプリ') {
  if(key != myKey) return;
  const c = [83, 82, 88][parseInt(command)]; // lock:82,unlock:83,toggle:88
  const h = Utilities.base64Encode(user, Utilities.Charset.UTF_8);
  const devices = device.split(',');
  devices.forEach(function(name) {
    const data = JSON.parse(prop.getProperty(name));
    const body = {
      'cmd': c,
      'history': h,
      'sign': generateCmacSign(data.secKey)
    }
    const options = {
      headers: {'x-api-key': apiKey},
      method: 'POST',
      muteHttpExceptions: true,
      payload: JSON.stringify(body)
    }
    const url = `https://app.candyhouse.co/api/sesame2/${data.uuid}/cmd`;
    const response = UrlFetchApp.fetch(url, options).getResponseCode();
    console.log(response);
  });
}

// CMAC認証
function generateCmacSign(secKey) {
  const date = Math.floor(Date.now() / 1000);
  const dateDate = new DataView(new ArrayBuffer(4));
  dateDate.setUint32(0, date, true);
  const msg = dateDate.getUint32(0).toString(16).slice(2, 8);  
  const hex = CryptoJS.enc.Hex.parse;
  return CryptoJS.CMAC(hex(secKey), hex(msg)).toString();
}

// QR情報デコード
function analyzeQR(p1, p2, p3){
  if(p1 == '' || p1.indexOf('*') == 0) return;
  let name;
  let data = {};
  if(p2){ // デコード済みデータが来てる
    name = p1;
    data = {'uuid':p2, 'secKey':p3};
  }
  else{ // 生データが来てる
    const ssm = decodeURIComponent(p1)
    const params = ssm.slice(ssm.indexOf('?') + 1).split('&');
    params.forEach(function(p) {
      if (p.indexOf('sk=') == 0){
        const sk = p.slice(3);
        const uuid = `${hx(sk,83,86)}-${hx(sk,87,88)}-${hx(sk,89,90)}-${hx(sk,91,92)}-${hx(sk,93,98)}`;
        data.uuid = uuid.toUpperCase();
        data.secKey = hx(sk, 1, 16);
      }
      else if(p.indexOf('n=') == 0){
        name = p.slice(2);
      }
    });
  }
  prop.setProperty(name, JSON.stringify(data));
}

// QR情報デコード Core
let hx = (data, start, end) => {
  return Utilities.base64Decode(data).slice(start, end + 1)
  .map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
}



【使用方法】


【1. プロパティを登録】

まず初回のみプロパティを登録する。
  1. function prepare() 内の *****部分を自前の情報に書き換え、保存ボタンを押す。
  2. 関数メニューで「prepare」を選択し、実行ボタンを押す。

【2. 動作チェック】

  1. function test() 内の情報を適宜書き換える。
  2.  関数メニューで「test」を選択し、実行ボタンを押す。

成功したら200が返り、セサミが動く。

うまく行かない場合は…
主な返り値と原因の可能性
404:サーバーダウン OR ルーターやWi-Fiモジュール等の問題かも。
403:APIキーが間違っているかも。
502:UUIDが間違っているかも。
200なのに動作しない:SecretKeyが間違っているかも。


【3. ウェブアプリ化】

  1. 「デプロイ」 → 「新しいデプロイ」
  2. 「種類の選択」で「ウェブアプリ」を選択
  3. 「次のユーザーとして実行」を自分、「アクセスできるユーザー」を全員にする。
  4. デプロイ実行






















途中で「承認が必要」と出た場合は流れに従って承認する。
(ログイン→詳細→安全ではないページに移動→許可)

最後に表示されたウェブアプリURLをコピーしておく。


【4. 運用】

あとは従来同様、このURLに適切にリクエストを送れば良い。
より汎用的にするためPOST、GET両方用意しているけれど、基本的にはPOSTでOK。

パラメータは従来からひとつ増え、myKeydeviceNamecommanduserの4つ。
  • myKey:prepareで準備した任意のパスキー。一致しないとはじかれる。

  • deviceName:セサミの名前。複数台同時に動かしたい場合は、カンマ区切りで「玄関,玄関2,倉庫」のように。

  • command:数字で、0~2のいずれか
    0=解錠 1=施錠 2=トグル
    (新しいAPIにはトグル機能が標準で備えられているため、従来のコマンド2および3は2に集約された。)

  • user:通知や履歴に表示される名前。省略可。省略した場合「ウェブアプリ」となる。
    ※userに特定の文字列を指定すると一部が文字化けする事象を確認済み。特定の文字というわけでなく、規則性をつかめず。現時点で詳細不明。



【最後に:スクリプトをあとから編集した場合】

スクリプトの編集をウェブアプリに反映させるには再デプロイが必要。

1. 編集を保存
2. 「デプロイ」→「デプロイを管理」
3. 編集ボタン(右上のペンアイコン)を押して、「バージョン」から新バージョンを選択
4. デプロイ実行


以上。

(注意・免責)リスクを管理し、あくまで自己責任で使用してください。

【余談】

今回は施解錠のみのスクリプトのため以上となるけれど、新APIはGETも刷新されていて、履歴やバッテリ電圧、サムターン角度なども取得できるようになっていた。アイデア次第で便利に使えそうだ。


2020年8月2日日曜日

【言語】【日本語アクセント】単語の一拍目の平板化(高音化)

日常の実際の発話において一拍目が高くなる単語とそのルールについての研究メモ

 

   ・・・ ・・・・

  ・

例:おんせん→おんせん



変化が起こりうる語の種類

  • 一拍目が低く二拍目が高い型(つまり1型以外
  • おそらく品詞は問わない
  • 複合語活用変化も対象(ルール3の例を参照)

ルール1.二拍目が撥音の場合

例:安全 林檎 運転手 延長 温泉

ルール2.二拍目が長音の場合

例:黄色 新潟 言い分 小さい

  英語 携帯 性格 映画館

  教室 証言 風船 ニューヨーク

ルール3.二拍目が「い」の場合

例:階段 大会 来客 買いたい

  水田 追放 初陣 縫い目

  恋文 お暇 追いかける

  (「黄色」などは2と重複)


考察

  • 必ずしも変化するわけではなく個人差がある。変化の具合にも個人差があり、二目と同じ高さまで上げる人もいれば、二目の若干下でとどめる人もいる。
  • おそらく無意識の人が多く、単語単位で質問すると平板化しない(教科書的に正しい)アクセントを教えてくれる日本人もいて、音感の良い外国人(日本語学習者)は体感との差に混乱してしまう可能性がある。

 

追記:辞書の凡例に同様の解説を見つけた(つまりあってた)

 

 

"コーリ、トーリ、ハンシャ、カイシャなど、二拍目がのばす音、はねる音、アイ/オイなどの後半のイという独立性の弱い拍の場合は、(i)のように普通は一拍目から高く発音する。一方、さらに弱いつまる音が二拍目にくるバッタなどでは、(j)のように三拍目から高くするのが一般的である。これらの弱い拍は、その直後で下げることも通常ない。○ー○、○ッ○などに型は欠けている。"

 画像元および引用元  <http://www.sanseido.biz/main/Dictionary/Hanrei/meikoku_accent.aspx>

 

 

もうひとつルールがあった。

文中の場合

 

(a) ス ミ レ 
(b) コ ノ ス ミ レ ガ 
(c) キ ノ ー サ イ タ コ ノ ス ミ レ オ ア ゲ ル 
( い す れ も 一 ま と ま り に 発 音 し た も の )

"スミレのスからミへの上げは、それを単独で発音したため、つまりスミレが最初に位置しているために現われたもので、スミレという単語にいつも決まって出てくる性質ではない。"

 

画像元および引用元  <http://www.sanseido.biz/main/Dictionary/Hanrei/meikoku_accent.aspx>


あとがき

複数の友人から同じ質問をされたため、ちょっと研究してみたのだけれど、結局辞典にしっかり解説が出ていたことが判明。ならばなぜ知られていないのか…。国語研究者にとっての常識であって、外国人向け日本語教材にあまり反映されていない情報なのかもしれない。


2020年1月1日水曜日

【Amazon Dashボタン】意外と今後も大丈夫

【果報】
対策が功を奏したか2020年もダッシュボタンたちは問題なく動作している。

同じような対策をしている人の記事も見つけた。
しかも、Amazonアプリが提供を止めたWi-Fiセットアップも単純な方法でできるとのこと。

https://blog.christophermullins.com/2019/12/20/rescue-your-amazon-dash-buttons/

大まかにまとめると、

.今後Amazonに接続したダッシュボタンはファームウェアが書き換えられ、文鎮化するらしい。

.ルーターの設定でインターネットアクセスを遮断しておけばいい。

.(文鎮化した場合の話?)特定の音声を聞かせると復活する。(ただしファームウェアのバージョンが3以下から始まる端末のみ。うちのは6始まり。国内販売品はダメかも)

.セットアップモード(青点滅)で、他端末(スマホやPC)からダッシュボタンのWi-Fi(Amazon ConfigureMe)に接続し、ブラウザに以下を入力でWi-Fi設定できちゃう。

http://192.168.0.1/?amzn_ssid=自宅のSSID&amzn_pw=パスワード

残念ながら非対応端末‥‥と思いきや、どうやらWi-Fiセットアップ自体は4のみで可能のよう。実際ひとつ試したところ成功した。うっかり文鎮化させてしまうと3も必要なのかもしれない。

すでにネット遮断しているダッシュボタンなら、ファームウェアを問わず、Wi-Fiを再設定でき、今後ルーターの買い替えやパスワード変更があっても安心ということか。
AWS IoTボタンへの乗り換えも考えていたけど、まだまだダッシュボタンと仲良くやれそう。


追記(重要)

こちらの記事のコメント欄によれば、上記の方法によるWi-Fi再設定は、一度以上セットアップをしたことのある端末でのみ有効とのこと。また、電池残量が一定以上低下した状態で起動すると自動的に工場出荷状態に戻る。つまり、「一度もセットアップしていない端末」に逆戻りしてしまい、あとの祭りとなる。
…まさか電池残量をトリガーに電池切れを待たず自害するなんていう武士よろしくな爆弾を抱えているとは、ちょっと厄介だ。

【早めの電池交換で延命】
ボタン押下時、初めに一瞬赤LEDが点滅するようになったら電池残量低下のサイン。それ以上押さず電池交換すること。あるいは余裕を持った交換サイクルにしたほうが賢明かもしれない。

2019年12月27日金曜日

【Amazon Dashボタン】リセット回避延命措置

【ダッシュボタン臨終の刻迫る】
ついにダッシュボタンに宣告が。
公式ページによると、
「端末は2019年12月31日に自動的に登録解除およびリセットされるため、お客様による操作は必要ありません。」
とのこと。

このリセットが何を意味しているのか現時点(2019年12月)で不明だが、仮に端末のWi-Fi設定までリセットされるとなれば困ったことになる。(すでにAmazonアプリ内の端末再設定ページは死んでいる模様)


【対策】
ひとまず落ち着いてダッシュボタンの仕様を改めて考えてみる。
  • ボタンが押された時に電源が入る仕様
  • 常時ネット接続されているわけではない
  • 通常の利用では、ボタンが押されるとAmazonのサーバーにアクセスして該当商品を注文してくれる
  • ハック利用は、ダッシュボタンがルーター(LAN)にアクセスしてきたことを検知する原理(のはず)

では、2019年12月31日に自動的に登録解除およびリセットというのはどういうことか。
おそらくは、31日以降初めてダッシュボタンが押された際、サーバーにアクセスした段階で、遠隔で端末が操作されると思われる。ならばアクセスしなければ良い。

そこで、ルーターのIPv4パケットフィルタ設定で、ダッシュボタンのインターネット接続を遮断してみることにした。(ルーターの機種によって名称が異なるかもしれない。要は端末のIPごとに通信を制限する設定)

【ルーター設定手順】
※設定の詳細は機種ごとに異なるため、大まかな流れ

  1. まず、使用しているすべてのダッシュボタンのMACアドレスにそれぞれ固定IPを割り当てる

  2. 次に、以下の設定でIPv4パケットフィルタを新規作成。

    フィルタ:拒否
    通信方向:LAN→WAN(または両方向)
    送信元IPアドレス/マスク長:ダッシュボタンの固定IP / 32

    その他のよくわからない項目はなるべく何でも適用されるようにしておく。

    これをダッシュボタンの個数分作成。
    ※マスク長を調整して範囲指定可。よくわからない場合はマスク長32にして一つずつ作成

  3. ルーターを再起動し、ダッシュボタンを押してみる。

【確認】
成功していれば、ハック動作は問題なく行われ、本体LEDが赤点滅せず、いつもより長く白点滅して止まる。

失敗した方法
逆にAmazonサーバー側のIPをルーターで遮断してやれば事足りるかと思い、こちらの記事を参考に設定してみたけれど、うまくいかず赤点滅。

追記】Wi-Fiセットアップできた 2020年1月 追記


2019年10月3日木曜日

Googleカレンダーで中国の祝日を中国語表示にする方法

【経緯】
日本語設定のGoogleカレンダーに中国の祝日を追加すると、通常の方法*では英語表示になってしまうらしい。

*設定 → カレンダーを追加 → 関心のあるカレンダーを探す → 地域限定の祝日 → 中国の祝日

【中国語表示にしてしまおう】
おそらく日本語表示は無理なので、中国語表示にする。

設定 → カレンダーを追加 → カレンダーに登録 →
以下を入力
zh.china#holiday@group.v.calendar.google.com

以上。

最初のzhが言語設定。jaだと英語になってしまう。

2019年9月20日金曜日

【スマートリモコン】テレビの電源 トグル問題

【まえがき】

テレビのリモコンはたいてい電源オンオフが同じ信号のため、部屋の外から確実にテレビを消したい、またはつけたい場合、スマートリモコンを普通に使うのでは不可能である。

これに関して、Nature Remoの公式記事に対策のひとつが紹介されていて、そういえばと思い、うちで使用中のその他の方法を書いておくことにした。


【1.ひとつのボタンに2倍学習させる】


原理は上の記事と同じで、適切なタイミングで電源の信号を二回送信してやる。
記事ではシーンを利用しているが、うちでは学習機能の待機時間が長めであることを利用し、ひとつのボタンに連打の信号を登録している。

手順はまずリモコンで電源ボタンを連打し、テレビがオフの時はついて消えない、かつオンの時は消えて再びつく間隔を調べる。それをそのままスマートリモコンのボタンに登録する。(一つのボタンに2連打を収める)

※パナソニックVIERAとシャープAQUOSで検証済み

ちなみにこの方法を使えば、音量などは長押し信号を一つのボタンに学習させることで、一度押すだけで「n上げる」「n下げる」なども可能になる。


【2.オンオフ独立信号】


SHARPアクオス(全機種かは不明)にはオン、オフ独立したコードが密かに存在しており、それを登録してやればいい。他メーカーもあるかも? あった(追記済み)

オフ AA5A8F124B62
オン AA5A8F124B72
このコードは以前ネットで見つけたもので、実際そのとおりだったので驚いた。

使用手順

【USBリモコン編】
PCなどと接続できるUSB赤外線リモコンキットを利用すれば、この信号を直接他のスマートリモコンに学習させることができる。
送信コードは013000を付加し、
オフ 013000AA5A8F124B62
オン 013000AA5A8F124A72
となる。

ただ、なかなかこれを持っている人は少ないと思う。

【Nature Remo編】
Nature RemoであればローカルAPIを叩いて、少々二度手間だが、別の学習リモコン(スマートリモコンである必要はない)経由で登録できる。

うちで取得したRemo独自のローカルAPI用コードはこちら

オフ
{"format":"us","freq":38,"data":[3425,1828,372,544,377,1348,376,537,378,1348,378,539,375,1352,374,542,375,1351,374,541,375,1351,366,548,377,1350,374,1351,376,541,375,1357,362,549,380,1345,377,1350,376,1350,376,1353,371,536,377,534,379,535,377,1349,375,544,371,1349,375,543,375,539,374,1349,368,552,370,539,374,538,373,1349,376,1353,374,537,375,1350,376,537,378,534,378,1351,372,541,371,538,375,1352,373,539,381,532,375,537,376,1351,367,1364,373,544,399]}

オン
{"format":"us","freq":36,"data":[3457,1794,399,513,422,1311,392,519,424,1303,398,515,421,1311,392,514,406,1327,379,532,426,1305,400,512,424,1310,404,1328,399,518,423,1308,396,516,423,1309,421,1316,424,1304,426,1314,396,520,378,531,397,511,421,1310,399,515,422,1303,400,517,399,514,421,1309,381,532,401,507,398,514,397,511,423,1309,377,537,422,1307,399,517,393,516,425,1304,399,512,398,514,422,1309,399,510,401,511,409,1322,424,1311,423,1305,398,514,424]}

これをまずRemoで送信し、学習リモコンに登録する。次に学習リモコンの信号を逆にRemoアプリで学習。これでグローバルに使えるようになる。

【ラトックシステム(RS-WFIREX3 / RS-WFIREX4)編】
ラトックシステムの場合はIFTTT連携の「赤外線コマンド送信」というアクションが活用できる。

うちで取得したラトックシステム独自のコードはこちら

オフ 23120405040d0405040d0405040e0405040d0405040d0405040e040d0405040d0405040e040d040d040d040504050406030e0405040d04050405040d040604050405040d040d0405040d04060405040d04050405040d040504060306040d040d040504

オン 23120405040d0405040d0405050d0405040d0405040d0405050d040d0405040d0406040d040d040d050d040504050405040d0405040d04060405040d0405040504050405040d0406040d04050405040d04050405050d04050405040d040d050d040504

IFTTTのアクションで、「赤外線データ」にこのコードを入力。
「赤外線データフォーマット」はデフォルト(0) 。

ただし、このアクションは将来予告なしに削除される予定とのこと。早めにNature Remoと同様の方法で学習リモコン経由でアプリに登録したほうが良さそう。

もしくは家電リモコンアプリのインポート・エクスポート機能を使っても登録可能と思われる。適当にボタンを2つ追加しておき、エクスポートしたデータを書き換えてインポートすれば良いと思う。(未検証)


【追記】

ほかのメーカーのコードも見つけた。ディスクリートコードと呼ばれているようだ。
残念ながらラトックシステムは手放してしまったため、NatureRemo版のみ記載しておく。
(ビエラ以外未検証)

パナソニック(VIERA) オフ
{"format":"us","freq":38,"data":[3387,1709,428,427,427,1282,427,427,397,427,428,427,427,427,428,427,427,427,428,427,427,397,427,427,428,427,427,427,428,1281,428,427,427,397,427,427,427,428,427,427,427,428,427,427,427,428,427,397,427,1282,427,427,427,428,427,427,427,428,396,428,427,427,427,428,427,427,427,1282,427,1252,427,1282,427,1281,428,1251,427,1282,427,427,428,427,427,1282,427,1251,428,1281,428,1281,428,1251,427,1282,427,427,428,1281,428,65535,0,36180]}

パナソニック(VIERA) オン
{"format":"us","freq":38,"data":[3387,1709,428,427,427,1282,427,427,397,427,428,427,427,427,428,427,427,427,428,427,427,397,427,427,428,427,427,427,428,1281,428,427,427,397,427,427,427,428,427,427,427,428,427,427,427,428,427,397,427,1282,427,427,427,428,427,427,427,428,396,428,427,427,427,428,427,427,427,428,427,1282,396,1282,427,1282,427,1282,427,1251,428,427,427,427,428,427,427,1282,427,1251,428,1281,428,1281,428,1251,427,427,428,1281,428,65535,0,36180]}

ソニー(BRAVIA) オフ
{"format":"us","freq":38,"data":[2411,580,1220,580,1221,580,1221,579,1221,580,610,611,1190,610,580,610,1190,611,610,580,610,580,611,610,580,24627,2381,610,1190,611,1190,610,1190,611,1190,610,580,610,1191,610,610,580,1221,580,610,610,580,611,610,580,610,24597,2411,580,1221,580,1220,580,1221,580,1220,580,611,610,1190,610,580,611,1190,610,611,579,611,610,580,610,611,65535,0,36180]}

ソニー(BRAVIA) オン
{"format":"us","freq":38,"data":[2411,580,610,610,1191,610,1190,611,1190,610,580,610,1190,611,610,580,1221,579,611,610,580,610,580,611,610,25207,2381,610,611,579,1221,580,1190,610,1191,610,610,580,1221,580,610,610,1191,610,580,610,610,580,611,610,580,25207,2411,580,610,611,1190,610,1190,611,1190,610,580,611,1190,610,610,580,1221,580,610,611,579,611,610,580,610,65535,0,36180]}

LG オフ
{"format":"us","freq":38,"data":[8942,4577,550,549,580,549,580,1678,611,549,549,550,580,579,580,549,611,519,549,1709,549,1709,550,579,580,1679,610,1648,549,1679,580,1678,610,1648,611,1617,580,580,580,1648,579,550,580,518,580,550,579,1679,580,1678,580,549,580,1679,579,519,580,1709,580,1678,580,1648,580,549,580,549,550,40771,9003,2258,611,65535,0,31785,9003,2228,579,65535,0,31817,1251,65535,0,36180]}

LG オン
{"format":"us","freq":38,"data":[8972,4547,550,579,580,519,580,1709,580,549,610,519,550,579,611,518,580,550,579,1679,580,1709,549,549,580,1679,580,1647,611,1648,610,1648,580,1678,611,519,610,519,549,1739,550,580,549,580,610,519,580,1678,580,1679,579,1648,611,1648,610,519,549,1709,580,1709,549,1679,580,518,580,549,580,40741,8972,2289,580,65535,0,31816,2869,65535,0,36180]}


【3.HDMI経由】


Chromecastを挿してあれば、テレビの設定次第でGoogleアシスタントから「(テレビの名前)を消して/つけて」が可能。スマートリモコンは関係ない。

2019年6月23日日曜日

【SESAME mini】締め出されたら? ~公衆電話やインターホンからセサミを開ける~

スマートロックによる締め出しリスク対策 (2020.6 追記済)



【まえがき】

オートロックは諸刃の剣なので、うちでは使っていないのだけど、それでもスマホのアレコレと連携させて自動化している以上、不意にトリガーが暴発して閉め出される可能性はゼロではない。

そんな時、もっとも確実なのは家の外に物理鍵を保管しておくことだろう。実際考えてはいる。キーボックスなどを使えばいいのかもしれない。ただ、ボックス自体安全な場所に設置したいと思っていて、これがなかなか…どこがよいのやら。

そこで今回は、「セサミが壊れて動作しない!」という事態はひとまず置いて、セサミによって締め出されたケースの対策を考えてみた。

【その1.公衆電話で開ける】(検証済)

ドコモのSMSサービスを利用して、IFTTT経由で解錠する。
プログラミング不要。条件が多いのが難点。

【必要なもの】
  • Wi-Fiアクセスポイント
  • ドコモまたはドコモ回線MVNOSMSが受信できるAndroid
  • IFTTTアプリ
  • プッシュ式公衆電話(誰かに借りられるなら固定電話、携帯電話でもOK)
  • テレホンカード OR 100円玉 OR 10円玉数枚
  • 掛ける電話番号のメモ OR 記憶


【事前準備】
  • IFTTTアプリをインストールして、アプレットを作る。
    トリガー:Android SMS
    → New SMS received matches search

    任意の番号(パスコードになる)を入力
    アクション:セサミオープン
  • 最寄りの公衆電話を調べておく。
  • 郵便受けなどにテレカや硬貨を備えておく。

【実行方法】
  1. テレカや硬貨を握りしめ公衆電話へいく。
  2. 090-310-1655(ドコモSMSセンター)に電話する。
  3. 案内に従い、自分のスマホの電話番号 パスコード  ## を押す。
  4. うまくいったら間もなくセサミが開くので、急いで帰る。

【備考】
  • 携帯を借りられるなら普通にSMSでパスコードを送信してもらえば良い。
  • 普通に打つと最低でも20円は必要。打つ速さやパスコードの長さによる。
    打ち間違えるとやっかいなので、100円玉でゆっくりやるほうがいいかも。
  • スマホのモバイルネットワークが生きている必要がある。
  • センター番号の個人的な覚え方:
    090さいわい3101ロックここ655)で開けれるよ!」
  • パスコードは、実は記号や半角カタカナも送れる。詳細は
    https://www.nttdocomo.co.jp/service/sms/usage/


【その2.インターホン(対応機種限定)で開ける】(検証済)

先日うちのPanasonicのインターホンの取説を読み返していたら、たまたま見つけた方法。
インターホンから音声アシスタントを呼び出す。
こちらもプログラミング不要。

【必要なもの】
  • ただいまコール※対応のインターホン
  • Wi-Fiアクセスポイント
  • スマートスピーカー
※チャイムボタンを3秒間長押しすると、宅内からの操作不要で外の声が宅内に聞こえるようになる機能。(宅内の音声は外には聞こえない)

【事前準備】
  • スマートスピーカーからセサミを解錠できるよう設定しておく。
    Googleアシスタントの場合、IFTTT経由。
    Alexaの場合、IFTTT経由 OR 純正機能(暗証番号)
    ※IFTTTに設定する文言は誰にもばれない呪文にしておく。

  • スマートスピーカーをなるべくインターホン親機に近い場所に設置する。

【実行方法】
  • ただいまコールモードで、適度な声量でドア越しにスマートスピーカーを操作。

【備考】
うちは幸い周囲に雑音が多い環境のため他人に聞かれることは無いと思うけど、呪文や暗証番号はやはり使い捨てが賢明だろう。

ちなみに、Alexaの暗証番号解錠は通常アレクサの応答を待って暗証番号を言う流れだが、それだとタイミングが難しい。で、試したところ「アレクサ、セサミを開けて、1234」のように一言で言い切っても大丈夫だった。


2019年5月3日金曜日

【SESAME mini】リセットした時どうなるか

【経緯】
突然アプリでSESAMEを検出できなくなってしまった。
しかたなく本体のリセットボタンを押して再登録。無事復活した。

【再設定が必要だった項目】
ロックの角度
オートロックの設定
手ぶら解錠の設定
通知の有効無効
クラウド連携の有効無効
マネージャー、ゲストの設定
Google Home(Googleアシスタント)との連携

【再設定が不要だった項目】
IFTTTとの連携
Alexaとの連携
APIのデバイスID

【消えた項目】
履歴


あくまで当環境での一度限りの経験のメモ。




2019年3月28日木曜日

【Alexa】Blueprintsや定型アクションで、喋らせる文章を区切る方法

【症状】
定型アクションのカスタムおしゃべりや、Blueprintsのスキルで設定した返答で、句読点が読み方に反映されない。2019.3現在、日本語の句読点は無視され、流れるように読んでしまう。
例外として、「は」のあとに読点を入れた場合は少し間を開けてくれる(?詳細不明)

【対策】
半角ピリオドを入れてやればいい。
全角ピリオドやスペース、!、?等はすべて区切りとしては機能しない。

【裏技】
ちなみに、もっと長い待機時間を設定したい場合、半角ピリオドと小さい「っ」を連続で入力すると、無音をキープすることができる。

.っ.っ.っ.っ.っ.っ.っ.っ.っ.っ.っ.っ.っ.っ.

ピリオドの連続では無音時間は増えない。「っ」の連続ではちょっと増えるけどコスパが悪い。

【補足】
がっつり自分でスキルを作るなら、
<break time='5s'/>
のような挿入が可能。Blueprintでは無理みたい。

2019年3月14日木曜日

【SESAME・SESAME mini】 GAS から Web API を利用する。(サンプル)

【作成日:2019/3/14】
【更新日:2020/12/20】Google Apps Scriptの新エディタに関する補足を追加。
【更新日:2020/6/16】SESAME3(Sesame OS2)のAPIに対応したバージョンへの案内を追加。

【追記】
※GASがV8対応する前に作ったものですが、動くので更新はしてません。
※SESAME3ではAPIが刷新されたので、この方法は使用できません。新しい方法はこちら

【SESAMEサイクル(SESAMEシリーズ)】 NFCタグをエミュレートするアプリをつくった (Android)

セサミのNFCタグ機能を実際のタグなしで自由に発動させたくて、アプリを作った話。 ( ページ下部より APKダウンロードできます )  【まえがき】 うちでは玄関のセサミ3は前回記事で書いたGASで運用していてNFCタグ機能は使っていないのだけど、最近セサミサイクル(ママチャリ)...