姿勢監視チェッカー作ってみた by JINS MEME

by JINS MEME × Philips Hue 
姿勢監視チェッカー作ってみた



![姿勢監視.gif](https://qiita-image-store.s3.amazonaws.com/0/8972/29be6166-de97-5f9e-d43a-62e0fe3a845b.gif "姿勢監視.gif")

##JinsMEME ×　PhilipsHue

JinsMEMEの加速度センサーをインプットとして使って、アウトプット先をPhilipsHueのLEDライトにして、猫背になったら赤く点滅し、正しい姿勢になるとアラートなしの通常のライトに戻るというのを作ってみました。

<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/Ok5e2bnnWtQ" width="560"></iframe>



##デスクワーカーのために
ホワイトカラー、デスクワーカーのために。
PCでの長時間の仕事をするとなるとどうしても、背中が曲がってきがちです。
猫背になると赤く点滅させるという物理的な現象を発生させ、まわりの人の迷惑にならないように、自分にとっても気が散らないようにするためにも便利なものです。
猫背にも前傾猫背や後傾猫背などがありますが、今回は前傾になった際に加速度センサーx軸のある一定の敷居値を超えたらという判定でアラートしています。

日常的に姿勢を観察し、正しい姿勢を維持することによって、腰痛の予防や、日々の姿勢を見直すきっかけになればなと思い作ってみました。


##仕組み
JINS MEME→iOS→Philips Hue
JINS MEMEからiOSにBluetoothでデータを送信、
iOS側データを取得、iOSからwifi経由でPhilips Hueを操作

言語はSwiftで書き、Hueを操作するためのSDKを利用しています。
The hue Apple SDK by Philips
https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX


##必要なもの、環境
- JINS MEME ES or MT https://jins-meme.com/ja/collection/es/
- Philips Hue LED http://www2.meethue.com/ja-jp/
- iOS 9.0+
- Bluetooth 4.0（BLE）
- Xcode 7



##実装　

- 新規プロジェクト作成（Swift）
- Philips Hue SDKをダウンロード
https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX
こちらのSDKをベースにHueのbridgeと接続します。
- HueSDK_iOS.frameworkとSDKWizardフォルダ（Obj-C）をインポート
- JinsMEME developerサイトからアプリを作成
https://developers.jins.com/ja/login/?goto=/apps/create/


作成したAppCilentIDとClientSecretを以下の****の場所にセットします。

```AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        MEMELib.setAppClientId("*********************", clientSecret: "*********************")
        return true
    }
```

- SwiftからObjective-Cのクラスを利用するためにBridging-Header.hを作成
HueSDK_iOSとSDKWizardの中のPHLoadingViewController,PHBridgeSelectionViewController,PHBridgePushLinkViewController
 プラス
 Meme用にMEMELibを記述

```Bridging-Header.h

#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "PHLoadingViewController.h"
#import "PHBridgeSelectionViewController.h"
#import "PHBridgePushLinkViewController.h"
#import <HueSDK_iOS/HueSDK.h>

#import <MEMELib/MEMELib.h>


#endif /* Bridging_Header_h */

```


- AppDelegate.swiftを以下の通りに
 中身はHueの初期化、bridgeとの接続などです。
 長いのでGistにしています。こちらをご覧ください
 https://gist.github.com/manchan/106f4b6108c737df15dc
- Jins Memeのサンプルはこちら（Swift）https://github.com/manchan/JinsMeme-Swift-Sample



###Hue bridgeとの接続

詳細に関してはこちらをご覧ください。
http://www.developers.meethue.com/documentation/apple-api-guide



###猫背になったら、アラート

  MEMEからのリアルタイムデータ取得の部分と、Hueのライト変更箇所を抜粋

```MMDataViewController.swift

    var memeRealTimeData:MEMERealTimeData?

    func memeRealTimeModeDataReceived(data: MEMERealTimeData!) {

        self.memeRealTimeData = data
        if let d = self.memeRealTimeData as MEMERealTimeData?{

            // 猫背判定
            let accX = d.accX
            if  (Int(accX) <= -3){
                                    
                // red
                self.updateLight(0, isAlert: true, isRandom: false)
            }
		 }
	}

    func updateLight(hueValue:Int, isAlert:Bool, isRandom:Bool){
        
        let cache = PHBridgeResourcesReader.readBridgeResourcesCache()
        let bridgeSendAPI = PHBridgeSendAPI()
        
        for light in cache!.lights!.values {
            // don't update state of non-reachable lights
            if light.lightState!.reachable == 0 {
                continue
            }
            
            let lightState = PHLightState()
            if light.type == DIM_LIGHT {
                // Lux bulbs just get a random brightness
                lightState.brightness = Int(arc4random()) % 254
            } else {
                
                // アラートの場合
                if isAlert {
                    // 点滅中
                    if lightState.alert == ALERT_SELECT {
                        break
                    }
                    lightState.alert = ALERT_SELECT
                }
                
                // ランダム点灯
                if isRandom {
                    lightState.hue = Int(arc4random()) % 65535
                }else{
                    lightState.hue = hueValue
                }
                
                lightState.brightness = 254
                lightState.saturation = 254
            }
            
            // Send lightstate to light
            bridgeSendAPI.updateLightStateForId(light.identifier, withLightState: lightState, completionHandler: { (errors: [AnyObject]!) -> () in
                
                if errors != nil {
                    let message = String(format: NSLocalizedString("Errors %@", comment: ""), errors)
                    print("Response: \(message)")
                }
            })
        }
    }


```


###ビルド実行
初期ロード時にHueとの接続、Scanして、MEMEと接続。
MEMEをかけた状態で、前傾姿勢になってみてください。


##今後の展開
今回もJINS MEMEで遊んでみました。JINS MEME × Something（Thing to Thing）というのはいくらでもあります。
今回はローカルでのアラート点灯ですが、インターネット越しにリモートのデバイスを動かすようなことも可能で実装済みですので、公開していきたいと考えています。
AWS IoTでデバイス間の状態を検知して、M2M（Machine to Machine）の世界を実現できるのではないかと、わくわくしています。