Tsukiji Systems

RSS1.0


googleで
サイト内検索
このブログ
を検索!
  help

巻き戻し中。



2020-02-12(水) IoT [長年日記] この日を編集

_ PC 家の鍵

sesamiでIoT化してみた。

もちろん、スマホから操作可能。

WiFiアダプタもセットしたのでBluetoothでの近場の操作だけじゃなくてネット経由で操作可能。

開閉よりも、実は外部から鍵の状態が分かる方がありがたい。

「アレ?鍵ちゃんと閉めたっけ?」と言うときにすぐ確認できる。

それだけじゃ面白くないので、せっかくネットに繋がってるしAWSのIoTエンタープライズボタンでコントロールできるようにしてみた。

クリック一発動作だけならメーカーの解説にあるサンプルコードで十分。

で、ウチの場合は

・玄関は鍵が2つ

・クリックで開くだけだと不便、ポケット内で押しちゃう誤動作も気になる

と言うことで、一発で2個のsesamiにコマンド投げるのと「クリック/ダブルクリック/長押し」を使い分けることにした。

誤動作防止と利便性を考えて

-シングルクリック:施錠

-ダブルクリック:解錠

-長押し:トグル

にしてみた。

これなら、間違って押したぐらいなら鍵が閉まるだけ。

もちろん、AWSIoTボタンのネットワークは自宅の無線LANにしか繋がらないようにしてあるのでとんでもないところからうっかり施錠や解錠することはない。

あと、print文を何カ所かに入れてあるので、AWSのログに変数/コマンドの履歴が残って確認が楽&開閉記録になるはず。

【Works with Alexa認定製品】 セサミ mini スマートロック本体 シャンパンシルバー 取付簡単 スマートフォンでドアを施錠解錠 Google Assistant/Siriショートカット/Apple Watch/IFTTT対応

キャンディハウス(Candy House)
¥ 14,800

【Works with Alexa認定製品】 セサミ スマートロック用 Wi-Fiアクセスポイント 外出先からドアを解錠施錠 Google Assistant/Siriショートカット/Apple Watch/IFTTT対応

キャンディハウス(Candy House)
¥ 5,590

AWS IoTエンタープライズボタンはこちら

_ PC Lambdaのコードはこんな感じ

切り貼りだったり、実験で使ったのも含んでるので余計なimportとかスマソ。  
from http.client import HTTPSConnection
import json
import os
import boto3
import logging
  
def get_command(conn, url, headers):
    conn.request('GET', url, headers=headers)
    ret = conn.getresponse()
    if ret.getcode() == 200:
        sesame_status = json.loads(ret.read().decode('ascii', 'ignore'))
        return 'unlock' if sesame_status['locked'] else 'lock'
    else:
        raise RuntimeError('Server return error: %s' % ret.read())
  
def get_clicktype(event):
    try:
        clicktype = event['deviceEvent']['buttonClicked']['clickType']
    except KeyError as err:
        clicktype = 'other'
        print(clicktype)
    return clicktype
        
def lambda_handler(event, context):
    if 'DEVICE_ID1' not in os.environ:
        raise RuntimeError('DEVICE_ID1 not given')
    if 'DEVICE_ID2' not in os.environ:
        raise RuntimeError('DEVICE_ID2 not given')
    if 'APIKEY' not in os.environ:
        raise RuntimeError('APIKEY not given')
    if os.environ.get('COMMAND_L') not in ('lock', 'unlock', 'toggle'):
        raise RuntimeError('COMMAND_L must be "lock", "unlock" or "toggle"')
    if os.environ.get('COMMAND_S') not in ('lock', 'unlock', 'toggle'):
        raise RuntimeError('COMMAND_S must be "lock", "unlock" or "toggle"')
    if os.environ.get('COMMAND_D') not in ('lock', 'unlock', 'toggle'):
        raise RuntimeError('COMMAND_D must be "lock", "unlock" or "toggle"')
        
    click_type = get_clicktype(event)
    print(click_type)
    if click_type == "SINGLE":
        COMMAND = os.environ['COMMAND_S']
    elif click_type == "DOUBLE":
        COMMAND = os.environ['COMMAND_D']
    elif click_type == "LONG":
        COMMAND = os.environ['COMMAND_L']
    else:
        COMMAND = ""
#pass
    
    print(COMMAND)
    url_1 = '/public/sesame/%s' % os.environ['DEVICE_ID1']
    url_2 = '/public/sesame/%s' % os.environ['DEVICE_ID2']
    
    headers = {
        'Authorization': os.environ['APIKEY'],
        'Content-Type': 'application/json'
    }
    conn = HTTPSConnection('api.candyhouse.co')
    
    if COMMAND == "toggle":
        body1 = json.dumps({'command': get_command(conn, url_1, headers)})
    else:
        body1 = json.dumps({'command': COMMAND})
    conn.request('POST', url_1, headers=headers, body=body1)
    ret1 = conn.getresponse()
    
    conn = HTTPSConnection('api.candyhouse.co')
    
    if COMMAND == "toggle":
        body2 = json.dumps({'command': get_command(conn, url_2, headers)})
    else:
        body2 = json.dumps({'command': COMMAND})
    conn.request('POST', url_2, headers=headers, body=body2)
    print(body2)
    ret2 = conn.getresponse()
  
    try:
        response_body1 = json.loads(ret1.read().decode('ascii', 'ignore'))
        response_body2 = json.loads(ret2.read().decode('ascii', 'ignore'))
  
        if ret1.getcode() == 200:
            print('[SESAME1] Request successed with task_id=%(task_id)s' % response_body1)
            return response_body1
        elif ret2.getcode() == 200:
            print('[SESAME2] Request successed with task_id=%(task_id)s' % response_body2)
            return response_body2
        else:
            raise RuntimeError('Server return error for ID_1: %(error)s' % response_body1)
            raise RuntimeError('Server return error for ID_2: %(error)s' % response_body2)
    except json.decoder.JSONDecodeError:
        raise RuntimeError('Can not parse response for ID_1: %s' % response_body1)
        raise RuntimeError('Can not parse response for ID_2: %s' % response_body2)

_ PC 変数

Lambdaの環境変数は以下を指定

-----------------------------------------

APIKEY

:sesamiのサイトで取得

DEVICE_ID1

:1個目の鍵のID

DEVICE_ID2

:2個目の鍵のID

COMMAND_L

:toggle:長押し時のコマンド

COMMAND_S

:lock:シングルクリック時のコマンド

COMMAND_D

:unlock:ダブルクリック時のコマンド

-----------------------------------------


2020-02-07(金) 今年も [長年日記] この日を編集

_ 福岡

講演

去年は「福岡-サンフランシスコ-福岡」なスケジュールだったけど、今年は普通に出張で。

それにしても資料よく間に合ったわい(;^ω^)

業務多忙で本当に原稿落とすところだったよ。

_ PC くっそw

昨日、ようやくできた資料をノートPCに置こうと思ってデスクトップの外付けHDDをノートに繋いだら全然認識しなかった。

で、1時間ぐらいHPのデバイス制御とか疑ってたけど、線をたぐったらHDDじゃなくて扇風機だった話する?

Keynice USB扇風機 卓上 & クリップ型 静音 ミニ扇風機 風量2段階調節 360度角度調整 4枚羽根 USBファン

KEYNICE
¥ 1,380


2019-11-24(日) メンテ [長年日記] この日を編集

_ 車 シフトレバー

ここ半年ぐらい、SG9のシフトレバーの遊びがエライ事になってるなと思ってた。

事前にネットで調べておそらくシフトのブッシュ関連が劣化して消滅してると思われる。

先々週にDラーへ行って確認と修理の予約をしていた。

具体的にはシフトレバーのところのブッシュと、ロッドの先のブッシュなのだが、後者は分解できないのでロッドごと交換。

どうやらDラーでも手間が掛かるらしく、10時に入庫して19時まで掛かるお仕事。

代車も出るし、工賃と部品代がそれぞれ半々ぐらいで合計2万円なら、お任せした方が安上がり。

自宅でやると、多分夕方あたりに泣きながら内装バラした状態のままで晩飯の買い出しに行くことになりそうw

クスコ ( CUSCO )【シフトリンケージブッシュ】(強化ゴムタイプ) スバル インプレッサ WRX STI 692 940 A

クスコ(Cusco)
¥ 2,705


2019-09-02(月) 初めての [長年日記] この日を編集

_ おフランス

出張ですわ。

ストラスブールまで一人旅。

しかも、空路はフランクフルトまでで残りは高速バス&タクシー。

ちゃんと行けるのかしら。。。


2019-07-28(日) 基幹スイッチ [長年日記] この日を編集

_ PC 更改

自宅の基幹スイッチだったCisco3750E、さすがにサポ切れだし消費電力がバカにならず。設定中(・∀・)

もちろん、消費電力なりにファンの音も盛大。

と言うことで、CiscoのSG350X(1Gx24+10Gx4)を調達していた。

メーカでのリフレッシュ品なのでお安い。

品番が「SG350X-24-K9-NA-RF」となっており、末尾のRFでリファービッシュ品と言うことになっている模様。

63,900円とお買い得。

新品はお高くて買えませんがなw

SG350X 24 Port Stackable Swtch

CISCO SYSTEMS - ENTERPRISE
¥ 159,770

_ 段ボール

それにしてもでけぇし、このサイズをサンノゼのCisco村から直送で送ってきた事を考えるとそれだけでもお安いのでは?(・∀・)外箱巨大(;^ω^)

箱は二重だし、密林並みに緩衝材も山盛り。本来の箱

緩衝材

_ 404

Ciscoの404ページ、センスがすこ(・∀・)ワロタw


2019-07-03(水) もうね [長年日記] この日を編集

_ PCスイッチ

ESXiと3750Eの10Gの相性が悪いのか、エジンバラに行ってる間も色々とトラブって頭にきたので、CiscoSG350Xのリファービッシュ品をポチった。

密林じゃなくてネットワーク機器専門のところ。

在庫なくて直接取り寄せとか。

気長に待つか・・・


2019-06-18(火) 落ちたorz [長年日記] この日を編集

_ PC

自宅鯖落ちたのでもう帰国したい。

うむぅ、なにもオイラが海外にいるときに限って自宅鯖落ちなくてもいいやろ・・・orz

まだ二日目だってのに日曜の夜まで手も足も出ず。

リモート息子に再起動と言っても北海道だし。

こっちから帰国するよりは近いけど。

_ PC 原因

多分、ESXiが紫画面で止まってんだろうな。

問題は10Gインターフェースのエラーカウンターあたりと思われる。

自動再起動設定しとけばよかった。。。

クラッシュして紫色の診断画面が表示されたESX/ESXi ホストを自動的に再起動するように設定する方法 (2042500)


2019-06-15(土) エジンバラ [長年日記] この日を編集

_ 初日

昨晩は、ブリュッセルで仮眠しなかったのでバタンキューで寝られたw


2019-06-14(金) 久しぶりの更新 [長年日記] この日を編集

_ 忙しくて

3月以降更新サボってましたが生きてます・・・

3月にRSAでサンフランシスコに行ったり、連休に肉焼いたりいろいろあったわけですが、おいおい追記で。

_

今回はエジンバラ(スコットランド)出張ですね。

金曜日出発にしたのはいいけど、前日帰宅したのが午前様という状態でもう色々あれ。

成田午前発でブリュッセル経由の予定。

機内映画は。。。あまり期待できるのないなぁ。


2019-02-17(日) そろそろ [長年日記] この日を編集

_ 車 車検の準備

土曜日にDラーで事前点検。

タイヤは1/6に近所のタイヤ交換屋さんで交換済み。

まぁ、大きな不具合はないのだけど何せ15年経過する車なんで「安全のために換えときましょ」がボチボチ出てくる。

今回はフューエルフィルタとその前後のパイプ。

_ 車 2発目

正月に喰らった飛び石、前回と違って修復で車検通すの難しそう。*1

でも交換すると、風切り音防止で加工したコーキングやり直しになっちゃう。

そもそも費用15マソだしドン引きだったのだが、どうやら車両保険が使えると聞いて交換する気になってきた。*2

自損事故は対象外で限定してるのだけど、飛来物は補償範囲だった。

免責5万円があるけど、交換しないで補修で挑戦するにしても2万から3万円の工賃が掛かるのでまぁいいかって感じではある。

カーメイト 車用 ガラスリペアセット プロ ウインドリペア システムセット PS300

カーメイト(CARMATE)
¥ 2,120

*1 前回は自分でリペアキットで埋めたのだけど、ヒビの入り方が中途半端でキレイにならなかった。

*2 Dラーのおじちゃん、ナイスアドバイス(゚∀゚)

_ 車 燃費

ところで、タイヤ換えてからガソリンが全然減らんのだけど・・・

もしかして、古いタイヤ猛烈に抵抗大きかったのか?

あるいはプラシーボ効果かもしれんがw

_

久しぶりに、屋根の高さまで伸びたギンモクセイの伐採。

長男と午後からチェーンソーも振り回して格闘。

切った枝は丸鋸で細切れにして燃えるゴミ仕様に。

結果ゴミ袋20袋弱。

一度には出せんな(;^ω^)

リョービ(RYOBI) チェンソー CS-3001 616301A

リョービ(Ryobi)
¥ 8,491


過去の写真!
(一覧はここをクリック)


電球と比較 キタ━━(゚∀゚)━━ヨ オヤジ号のBROS 長男号のVTR250
アクセスカウンター!


トータル:
本日:  
昨日:  
最近のツッコミ

(´・ω・`)ショボーン