技術・販売指針情報
last update: Fri, 22 Mar 2024 08:51:12 GMT ( 1 years ago )

      Care Bird のこと

      ・Carebird開発時のメモへのリンク
      http://www.east-cloud.co.jp/docs/yomoyama/?synquery とりあえず、ここに全部貼っておいて、あとで整理 ・mac上にダミーのGWを作る方法は、上のリンク内にあります。
      • CareBird とは

        業務の軽減と見守りの重要性 介護人材が不足する中で、クオリティの高いケアを継続しておこなう為には、
        点在する課題・問題を如何に解決していくか?を考えなければならない。

        その1つに介護者の業務負担の軽減が挙げられる。

        “介護業務は全てを人の手で行う”という従来の作法に限界を迎えており、“人の手で行うべきコト”と
        “機械が代わって出来るコト”を明確に区切り
        介護業務の効率化を図ることが急務となってきている。

        “見守り”に例えると、ケアはあくまでも人が実施すべきことであり、まだまだ機械に委ねることが難しい領域です。
        しかし、睡眠中の容態急変を把握するためのセンシング技術と情報共有基盤に関しては、機械に代行させることが
        汎用化してきており、
        当社はこの様な技術をクラウドに構築することで必要な時にだけ設置工事不要でセンシング
        とアラート配信を可能にした新たなサービスをリリースしました。

        ◆ 本サービスの特徴
         1.ご入居者に負担のかからない“非装着”の機器
         2.必要なときに限定的に利用可能な“レンタルサービス” ※18年
         3.クラウドだからできる遠隔操作による補助
         ☞施設経営者の皆様には本サービスを活用した保険外サービスを 新たな視点で検討されてみては如何でしょうか。

         サービス内容 提供機能:
         ① 生体活動停止時のe-mail即時配信 ※通知先は複数登録可
         ② webブラウザによるリアルタイムモニター

         運営者:介護保険サービス事業(施設系サービス・訪問系サービス)
         利用者:介護職員またはご家族
         対象者:要介護者

          コンタクト


      • 機器構成

        ステークホルダー

        株式会社ミオ・コーポレーション 【仕入先コード:73770-551

         【バイタル生体センサー】


        アールエスコンポーネンツ株式会社  【仕入先コード:10144-551
        株式会社スイッチサイエンス 【仕入先コード:36830-551】

         【RaspberryPi2 modelB ※BCM2836プロセッサ版】
         【ACアダプタ 5.1V/3A MicroUSB出力】
         【wifiレシーバー PLANEX GW-USNANO2A】
         【MicroSDカード TOSHIBA MSDBR48N08G】

        株式会社ソラコム(決済代行:株式会社ネットプロテクションズ 【仕入先コード:59300-551】)

         【3GUSBモデム AK-020】

        株式会社IoTコンサルティング

         【SIMカード 神プラン 298円/月】

      • 知っておくべきこと


        • ミオセンサー

          ◆センシング原理
          <環境設置型の電波型センサによる状況認識技術> 2017/11/7 出所Mio
          電波が人などの物体にあたり反射すると、物体の動きによる揺らぎが生じる。

          この揺らぎを分析することで状況を認識する技術が、電波型センサにおる状況認識技術である。
          室内に壁掛け等で設置したアンテナから空間に電波を放射し、空間中の様々な物体で反射した
          電波を受信すると、そこには複数の物体の動き による周波数変化(ドップラー効果)や振幅変化
          が観測できる。これに周波数解析による信号分離や統計的なモデリング手法を用いることで、
          様々な状況の認識を行う。

          呼吸や心拍などのバイタル情報を一種の状況と捉えると、呼吸は0.3Hz前後の周期性をもつ
          胸腹部の振動現象であり、心拍は1Hz前後の周期性をもつ微細振動現象である。

          電波に波長の短い10.5GHz帯や24GHz帯を用いると、これらの微細な変動を受信信号の
          位相変化として捉えやすく、実際に数m程度の遠隔から効率よく捉え得ることを確認している。
          またドップラー効果はスピードガン等で利用される原理であり、対象の速度を検知可能である。

          これを応用し、物体の落下や人の転倒などが発生し た際に観測できる速度変化のパターンから、
          それら事象の発生を検知することも可能である。

          脈拍・呼吸の算出アルゴリズム 出所Mio
          ・脈成分の拍数の表示値は、16秒間の平均値です。
          波数の計測は連続的に行われており、表示値は16秒前から現在までの平均値を表示。

          ・呼吸成分の拍数の表示値は、10周期分の平均値です。
          表示値は現在から遡って10周期分の平均値を表示。

          ・脈拍数(呼吸数) = 波数 = 1分間(60秒間)の波の数です。
          看護師らも、脈を1分間測定している訳はなく、10~15秒間の測定に6~4倍しています。

          ・1秒間の波数は周波数といいます。周期は周波数の逆数で、単位は秒です。
          マイコンでは「分」ではなく「秒」単位で計算しています。

          拍数(呼吸数)= 周波数 x 60、周期 = 1 ÷ 周波数 = 1/周波数

          従って、1周期に5秒掛かったとすると、
          拍数(呼吸数)= 周波数 x 60 = (1/周期)x 60 =  1 ÷ 5 x 60 = 12となる。

          10周期分の平均とは、1周期事の計算した拍数(上の例では12)を10周期分足して
          10で割った値です。 例:(12+11+12+13+12+13+11+11+12+13)/10 = 12

          安全性
          電磁環境調査報告 バイタル生体センサー LS汎用
          http://www.denjihabougo-hyoka.org/c/00002/206/199/206-199-00003.pdf
      • アクティベート

        • 1.マスタ登録 (所要目安:10分)

            ・自社権限でCareBirdにログイン
            ・CareBirdアプリのメニューより管理タブを押下
            ・取引先タブより登録
              - 取引先コード:
                0 + クライアントの電話番号下4桁の5桁とする
               (本来はsophie上の取引先コードを用いるべき)

              - 取引先種別:「法人」を選択
                ▽取引先と施設が同一(1拠点)の場合はそのまま保存
                ▽施設が複数の場合は「施設追加」で施設毎にログイン情報を登録する
                  施設単位で閲覧権限を限定するために用いられる

            ・通信機器管理タブより登録
              - 機器No.
                本アプリ内で識別するためのユニークキーです

                ▽命名ルール:
                ゲートウェイ >> GWxxxx
                SIMモデム >> AP-xxxx
                SIMカード >> USIM-xxxx
                ミオベッドセンサー >> VSxxxx
                ミオルームセンサー >> VSxxxx
                新ミオルームセンサー >> VSxxxx
               (※xxxxは0001より追番)

              - 機器タイプを選択
                1. ゲートウェイ >> コントローラー
                2. アクセスポイント >> 任意で貸出/販売する際に登録
                3. ミオベッドセンサー >> LS106シリーズ
                4. ミオルームセンサー >> MS106シリーズ
                5. 新ミオルームセンサー >> MS116シリーズ(近づく・離れる)
               (※SIMカードおよびモデムはアクセスポイントに属する)

              - IPアドレス
                1.2 不要
                3.4.5 必須(IPv4アドレス) 例:192.168.1.110
               (※クライアントのネットワークを相乗りして利用する場合は、
                   コントローラーおよびセンサー個数分の固定IPアドレスを事前に確認しておく)

              - ポート番号
                1.2 必須 固定:80
                3.4.5 必須 固定:10001

            ・契約管理タブより登録
              - 契約No.
                追番管理 0001~

              - 事業所名
               「参照ボタン」より取引先リストに該当する法人を選択

              - 期間
                開始および終了年月日の指定(必須)
                ※デモ利用の場合は期間を3週間に設定する

              - 契約状態
                試用:デモ利用
                本契約:有償利用(個別契約書に準ずる)

              - 割当
                ゲートウェイとセンサーそれぞれ「割当ボタン」よりリストの中から対象を選択

            ・メニュー画面左上のプルダウンリストより上記で登録した顧客を選択
            ・管理ボタンの通信機器管理タブの割当内容を確認

            ・センサーとコントローラーの情報連携
                ▽リスト内のセンサーを選択して修正ボタンを押下
                ▽接続GWの参照ボタンより対象のコントローラーを選択
                ▽通信機器登録ダイアログを保存
                ※全てのセンサーに対して上記手順で連携する

           以上でマスタ登録が完了
        • 2.クライアント画面の作成 (所要目安:10分)

           ・リスト作成ボタンより新規で利用者マスタを作成
           ・運用設定ボタンより割当一覧ダイアログで新規登録
              ▽リスト割当ダイアログより利用者、通信機器を選択

           以降の学習は項5にて説明

        • 3.センサーのwifi登録 (所要目安:10分)

           ・シリアルケーブルで対象センサーとPCを接続
           ・VR-BBアプリを起動
           ・接続ボタン下のプルダウンリストよりCOM(Serial)を選択
           ・接続ボタン押下
           ・一時停止ボタン押下
           ・WCボタン押下

              ▽wifi module configration
                ・Net.Type   >> INFRASTRUCTURE
                ・Infra.Mode >> STA MODE
                ・SSID       >> ネットワーク名を指定
                ・Security   >> 固定 WPA2(AES)SECURITY
                ・KEY        >> ネットワークパスワードを指定
                ・UDP/TCP    >> 固定:TCP
                ・DHCP       >> 固定:STATIC
                ・DNS Addr.  >> 指定(次項GatewayIPと同じ)
                ・GatewayIP  >> 指定(マスタ登録で登録したセンサーIPアドレスに属するデフォルトゲートウェイ)
                ・IP Mask    >> 指定(ネットワークのサブネットマスク 例:255.255.255.0)
                ・HOSTIP     >> 固定:10001
                ・SensorIP   >> 指定(前項のマスタ登録で登録したセンサーのIPアドレス)
                ・Sensorport >> 固定:10001

           ・書込ボタン押下

              書込中...

             “done”のメッセージで完了

           以上でネットワーク登録が完了

        • 4.コントローラーのOS作成 (所要目安:70分)

           イメージファイルの書き込み

            ・未開封のMicroSDカードをPCに挿入
              - 同梱のSD変換アダプタにMicroSDカードをセット
           
            ・Win32DiscImager.exeを起動する
              - Image Fileタイトル右のファイルアイコンよりimgファイルを指定
              - imgファイル保管場所:“CareBird”<“RaspberryPi”<img
              - Deviceのプルダウンが[E:\]SDであることを確認
              - Write ボタン押下
              - Confirm Overwrite 画面は “Yes”を選択
              - 書込開始

            ・書込
              - 30分~1時間程度の時間を要する
              - 書込が完了するとComplete 画面が表示されるため“ok”を押下
              - MicroSDカードを取り出して作業終了

          ゲートウェイ情報の更新

            ・Tera Termの準備
              - PCとコントローラをUARTケーブルで接続
              - Tera Termの起動
              - 新しい接続で「シリアル」のポートを選択
              - 設定 > シリアルポート > ボー・レート値を115200 に変更して“ok”を押下

            ・ログインパスワードの変更
              - 初期ログインID user:root
              - 初期パスワード password:root

              root@raspberrypi:~# passwd (enter)
              root@raspberrypi:~# 変更パスワードを入力(enter)
              変更完了

            ・最新のEmbedファイルを取得(コントローラがinternetに接続している状態)
              root@raspberrypi:~#
                curl https://synquery.com/PRAMWj57/f/fw/ssk-init.sh > ssk-init.sh (enter押下)
                chmod 755 ssk-init.sh (enter押下)
                ./ssk-init.sh (enter押下)
                ./ssk-setup.sh "GW****" "sifr3gdJ" (enter押下)

              DownLoad中...


             “...all done”のメッセージで完了
             (※GW**** はマスタ登録で登録したゲートウェイのユニークキー)

            ・固定IPアドレス設定【施設のネットワークに相乗りする場合は必須】
              root@raspberrypi:~#
                /etc/network(enter押下)
                nano interfaces(enter押下)

                以下を削除
                iface eth0 inet manual

                以下を追加
                iface eth0 inet static
                address ***.***.**.**
                netmask 255.255.255.0
                gateway ***.***.**.**
               (入力後enter)
                 
            ・再起動
              root@raspberrypi:~#
                reboot(enter押下)

        • 5.動作確認

           ・コントローラおよびセンサーを設置する
           ・コントローラおよびセンサーに電源が投入されていることを確認
           ・前3項の割当一覧より対象リストの「設定」を押下
           ・センサー設定ダイアログよりプリセットを選択(例:ターミナル通知)
           ・無人であること確認のうえ「無人環境登録」を実行
           ・45秒程度の待機
           ・学習完了

           ・メニュー > モニターボタンより動作を確認

          確認するポイント
          ・アイコンが緑または赤に表示切替されているか?
          ・アイコン > インフォメーションボタン > ログ一覧に遷移
          ▽10秒ごとにデータが取得できているか?
          ▽臥床して2~3分経過した際にMIO_Fが「1」を示しているか?
      • サービスレベル合意書

        • 稼働管理

          ・サービスの稼働
          確認頻度:1日/1回 (出社後AM)
          確認方法:コントローラーのセッション情報をSynqueryAPIより収集する

          手順:
           ① 右記URLへアクセスする 
          https://led.synquery.com/exist-embed.html?p=sifr3gdJ
           ② ctrl + A(全選択)でctrl + C(コピー)する
           ③ 顧客管理表【オリジナル】.xlsを開く
           ④ セッションチェックシートに
          貼り付け元の書式に合わせて貼付
           ⑤ 確認不要 〇列に該当をチェック
           ⑥ 要チェック列の「要確認」を把握する

           ⑦ 客先窓口へTELのうえ状況を通知する

          記録方法:
           ① .xls形式で新規保存または.pdfにて新規保存

           ② オリジナルと混同しないよう年月日をブック名で保存
           ③ チェック済みフォルダに格納
        • リリース管理

          ・バージョンアップ対応
          ☞基本的には常に最新状態を目指すものとする
           確認頻度:ファイルリリース時
           確認方法:機能追加・修正情報による
           確認対象:稼働中の全コントローラー

          手順:
           ① リリースにあわせてセッションチェックで稼働中のコントローラーを把握する
           ② 右記URLへアクセスする 
          https://www.synquery.com/synquery/sifr3gdJ#vD9xxXLu
           ③ ゲートウェイをプルダウンより指定する
           ④ コマンドリストより対象のコマンドをPOSTする

          【SSK-special : 01 : Collector.js個別ファイル置き換え(操作注意)

          【SSK-special : 01 : fwupdator.jsファイル置き換え(操作注意)
          【SSK-special : 01 : mioAdaptor.js個別ファイル置き換え(操作注意)

          【SSK-special : 01 : mioFuncs.js個別ファイル取得(操作注意)
           
           ⑤ ファイルが正しく置き換わったかを確認するコマンドを送る
           ・cat /root/mioVital/Collector.js
           ・cat /root/synquery-embed/lib-ext/fwupdator.js
           ・cat /root/synquery-embed/lib-ext/mioAdaptor.js
           ・cat /root/synquery-embed/lib-ext/mioFuncs.js

           ⑥ 確認完了後、入力内容をクリアして下記(再起動コマンド)を送る
            reboot

           ⑦ 
          顧客管理表【オリジナル】.xlsにリリース情報を更新する
           ⑧ 更新できなかった休眠中のコントローラーは折をみて実施する
        • バックアップ管理

          ・プラットフォームのバックアップ
           確認頻度:毎月初毎
           対象データ:CareBirdアプリに保存されるセンサーデータを除くコレクションデータ
           コレクション名
           SSK.commeqp SSK.cont  SSK.orgacct  SSK.rectml  SSK.sensor
           SSK.setting SSK.supp  SSK.synacct  SSK.user  計9件

          手順:
           ① 本ポータル リソース管理(MongoDB)より左上プルダウンで[sifr3gdJ]CareBirdを選択
           ② タブを[コマンド]に切り替える
           ③ 左上プルダウン「ダウンロード(mongodump)」
           ④ 同右は保存したいコレクションを左ペインから選択
           ⑤ 左下プルダウン「Unicode(UTF-8)」を選択
           ⑥ 同右プルダウンは「出力タイプ:json」を選択
           ⑦ 画面下部の送信ボタンでダウンロード完了

          ※2回目から④コレクションを選択して⑦を実行する

          保存先:
           ・バックアップフォルダの中に、取得日時のフォルダを作成のうえダウンロードしたデータを格納
           ・世代管理しないため、古いフォルダは削除して最新日時のフォルダのみ保存する

          //////////////////////////////////////////////////////////////////////////////////////////////////////
          ※以下、DB圧迫によるデータの一時退避および削除方法について記述する

          手順:
           ① 対象センサーのモニター画面でデバッカーを起動
           ② Console欄にスクリプトをコピーペーストする
           ③ 対象データの開始年月日と終了年月日を指定する
              var start_date = new Date("2019/**/**");
              var end_date = new Date("2019/**/**");
           ④ スクリプトを実行する

          ・センサーデータのDB一括取得(ローカル保存)
              fn = AppSpace.fn;
              var sensors = $(".panelbase .sensors .sensor");
              var start_date = new Date("2019/01/31");
              var end_date = new Date();
              end_date = fn.sync.riseOfTheDay(end_date,0,end_date.getDate(),false);
              var date_ary = [];
              var idx = 0;
              while(true){
                var dt = new Date(start_date.setDate(start_date.getDate()+1));
                dt = fn.sync.riseOfTheDay(dt,0,dt.getDate(),false);
                if(dt.getTime() > end_date.getTime()) break;
                date_ary.push(dt);
                idx ++;
              }
              Promise.resolve().then(function(){
                var when = Promise.resolve();
                $.each(sensors,function(j,sensor){
                  date_ary.forEach(function(dt){
                    when = when.then(function(){
                      var param = {};
                      param.id = $(sensor).attr("id");
                      param.dt = dt;
                      param.$sensor = $(sensor);
                      return fn._dumpdata(null,param);
                    });
                  })    
                });
                return when.then(function (){
                  console.log("done");
                });
              })

          ・センサーデータのDB一括削除
              fn = AppSpace.fn;
              var sensors = $(".panelbase .sensors .sensor");
              var start_date = new Date("2019/02/10");
              var end_date = new Date("2019/02/20");
              end_date = fn.sync.riseOfTheDay(end_date,0,end_date.getDate(),false);
              var date_ary = [];
              var idx = 0;
              while(true){
                var dt = new Date(start_date.setDate(start_date.getDate()+1));
                dt = fn.sync.riseOfTheDay(dt,0,dt.getDate(),false);
                if(dt.getTime() > end_date.getTime()) break;
                date_ary.push(dt);
                idx ++;
              }
              Promise.resolve().then(function(){
                var when = Promise.resolve();
                $.each(sensors,function(j,sensor){
                  date_ary.forEach(function(dt){
                    var id = $(sensor).attr("id");
                    when = when.then(function(){
                      var sel = {};
                      var date = dt;
                      var y = date.getFullYear();
                      var m = date.getMonth()+1;
                      var d = date.getDate();
                      var ymd = [y,m,d].join("/");
                      sel["datetime"] = {$gte:new Date(ymd + " 00:00:00.000"),$lte:new Date(ymd + " 23:59:59.999")}
                      debugger;
                      return fn._promiseTalk("SSK."+id, "remove", sel, {});
                    }).then(function(r){
                      console.log(fn.sync.YMDHMS(dt,"Y/M/D")+"_"+ id +":"+ r)
                      debugger;
                    });
                  })   
                });
                return when.then(function (){
                  console.log("done");
                });
              })


        • 性能管理

          ・コントローラーのCPU使用率の確認
           ☞使用率85%以内に維持することを目指す
           確認頻度:1ヵ月/1回
           確認方法:前回の最終チェック日より1ヵ月以内

           確認対象:稼働中の全コントローラー

          手順:
           ① リリースにあわせてセッションチェックで稼働中のコントローラーを把握する
           ② 右記URLへアクセスする 
          https://www.synquery.com/synquery/sifr3gdJ#vD9xxXLu
           ③ ゲートウェイをプルダウンより指定する
           ④ POST:コマンド送信 より入力エリアで下記(
          確認コマンド)を送信する
            変更前:ls -l
            変更後:df -h

           ⑤ 85%未満の場合は、
          顧客管理表【オリジナル】.xlsに確認年月日を上書きする
           ⑥ 85%以上の場合はデータの消去をおこなう

          データの消去手順:
           a.プルダウンより、【SSK-log : 05 : root/mioVitalログ一覧(行数制限あり)
          を送信する
           b.送信結果より
          “Collector***.***.*.***.log”ファイル名をコピーする
           c.コマンド内容を変更して送信する

            変更前:ls -l /root/mioVital
            変更後:
          echo "" > /root/mioVital/Collector***.***.*.***.log
            ***はセンサー毎に異なるため打ち換える

           d.メモリがどの程度改善されたか確認するために df -h を送信する

        • その他オペレーション

          ・原則的にはクライアント側だけで完結できるよう支援するが、
          本項ではデモおよび導入初期段階の対応を定義する

          三昌商事は、導入3日目に使用状況を電話で確認する旨を予め伝え、確認する
          ・その際に、おおまかな離床記録を実施するようをお願いする
          ・確認の電話を入れる前に確認しておくべきこと
           1.離床データの時間帯
           2.離床データの回数
           3.バイタル低下時間
           4.離床と異常の反復度合い

          □考えられる性能不発揮

          ①誤報(在床健在にも関わらず離床になる)
           123.次のパラメータで学習をおこなう :Pre-Gainを1段階上げる(2.5 → 3.0)

           4.
          復旧時間を延長する(180秒 → 300秒)
           

          ②未発報(離床にも関わらず在床健在になる)
           123.普段使用する動体物が無いか確認する
           【無ければ
          次のパラメータで学習をおこなう :Pre-Gainを1段階下げる(2.5 → 2.0)
           【有れば】動体物を排除してもらう。排除できない動体物(カーテン等)がある場合、
          誤判定が発生する旨を了承いただく。

          □正しい設置方法を以下に定義する
           10cm以上のマットレスである
           ・オプションマットを用いて上側の収容スペースにセンサーを配置する
             ☞ 枕の位置や対象者の寝相を考慮して必要に応じて収容場所を下部にすることができるが常用外
           ・直上に扇風機がないことを確認する
           ・カーテンがないことを確認する

          □クライアントの順守事項

           ・オプションマットを使用してください
           ・直上に扇風機がある場合、首振りモードとわず性能を発揮できません
           ・ベッドサイドにカーテンがある場合、常時揺れによる環境下では性能を発揮できません
      • CareBird 技術情報

        • Gateway(node.js導入)

          参考リンク:
          Raspberry Piのあれこれ
        • ファイルの配置

          CareBirdを運用するためには、Web SiteとGateway(Raspberry pi)が必要です。

          それぞれの構造は以下になります。
          • Gateway(Raspberry pi)

                ラズベリーパイにおける設置環境
                /root
                    /synquery-embed
                        /CA
                        /etc
                            config.fwupdator.json : 本機構のコンフィグレーションファイル
                        /lib
                        embed.js : Embedが頻繁にリブートするトラブルに対応したファイル
                        /lib-ext
                        fwrlbk.sh : fwのファイル置換を元に戻すための処理ファイル
                        fwupd.sh : fwのファイルを置き換えるための処理ファイル
                            fwupdator.js : クラウドとデバイスの中継をするファイル
                            mioadaptor.js : MIO用クラウドとデバイスの中継をするファイル
                        /log
                            各ログファイル : プログラム起動時のタイムスタンプで作成されます。
                    /mioVital
                        Collector.js
                        configCollector.json
                        defines.js
                        mio_control.js
                        models.js
                    start_miocontrol.sh : MIOコントローラーを実行するファイル(自動起動では未利用)
                readUpd.js       : configファイルの更新用プログラム
                ssk-config.sh    : config.fwupdator.js の GW_IDとPROJECT_IDを編集するプログラム
                  ssk-gwmonitor.sh : gwmonitor のセットアップを行うファイル
                  ssk-init.sh      : GWの初期環境設定ファイル(関連ファイルのダウンロード等)
                  ssk-setup.sh     : CareBirdの実行環境を構築するファイル
                  ssk-setwifi.sh   : Wi-Fiの設定を簡単にするファイル
                    start_embed.sh      : Synqeury-Embed を実行するファイル(通常はこちらをサービスとして実行)
                  writeCfg.js : configファイルの更新用プログラム

          • Web Site

        • コレクション削除

          ◆センサー
          目的:CareBird DBサーバ領域拡張のための整理(デフラグと同義)
          実行頻度:年1回(計画停止前)
          確認対象:未使用センサーのコレクション(機器登録した架空のセンサー)

          1.アプリ画面でのdom情報取得
          a=[]; //管理画面 > 通信機器管理タブconsoleにて(代理店の資産はここに含まれないため注意!)
          $.each($("[aria-describedby=commeqpList__id]"),function(i, elem) {
            a.push($(elem).text());
          })

          2.mongo画面 > 左ペインの機器リストHTML情報取得
          mongo=[]; //mongo
          $.each($($0).find(".pointer"),function(i,elem){
            var txt = $(elem).text();
            if(txt.indexOf("SSK")==0 && txt.indexOf("_graph")==-1){
              mongo.push(txt.replace("SSK.",""));
            }
          })

          JSON.stringify(mongo);

          mongo = ["19w34YIc","1QOKK0en","1UNL8yZq","3iLm9FKs","42EfA30b","56MjHGgL",
          "6NfqEztE","8fTCMB2d","8ryz8qP7","8ryz8qP7.graph","8vZX0JRu","8y3nzrlp",
          "B06g2J8G","B680gAo9","Bo509Hq4","C54MBCbo","CBphUiac","CZ6xzdXS",
          "D56J2yAy","EacpoUfa","GhDb4oIa","Gx6vbe6c","HIBSyIR6","HeomCQh2",
          "IMkcVe2x","IOclgjcZ","IVkhoc7e","J5x6ey2z","JD3dzuPk","JPysY9vW",
          "Jx4URNQS","KZUyxaoh","L3VSidfM","LYxYZlOq","LbtokyQ9","MYZap7MY",
          "NaesODK2","Nqg96D6x","NtiKCwXg","ODUauMLU","PNkxD8Dp","PhDS65PB",
          "REkjbXfF","SQylEep0","SaatWVY9","SmHJNpGJ","TD3Y71g8","Uwh6Z0N3",
          "VC79sNVd","Vapq1qQU","WZ62Wvjr","Wdali6lA","Wk8NJVh2","XHthVtW4",
          "XIl1SnnF","XnkuCACY","YsGuyLFI","ZDa6UANK","ZDqGXPm0","awDNzfHI",
          "bZQVweIi","bapIY2QG","beXQm2vz","blF4r8nw","bnadJ3P4","cFUJW1QL",
          "dIRmhtII","hKZMeZuI","iHMBYRiZ","iKNxt2rb","iZQfyXPm","itwOYnoE",
          "jnWtw2Rn","kO7f8ui1","kzs6HOFU","lXXUD3cf","lu5YPfSP","m93gI12D",
          "mWHSfvF2","n9lYkMAO","nXYbSeo6","oJFc4W3x","orgacct","p1URHqN2",
          "pLDXVdTN","pNhTT0xX","piHjiyIg","q4m13mu1","qFXFbd0n","rADchwHi",
          "rCf8YHdJ","rHvdZe00","sEFl4trd","sHdPEbku","ssB1UPDH","ssB1UPDH_2019",
          "tWEAS54r","vX56zq9p","vgTkTZC2","vsXU6TOr","wBoRuJoT","wSEtYqIc",
          "wvdWwMRr","xAtphEMd","xdNbxcAS","xq0ji7EM","y9szdzIy","yEdJ4CR2",
          "yl3yk9Fe","ywJkuUIQ","zNvmdELv","zeL9GJWG"]


          3.mongo画面とアプリの画面を比較
          //これをアプリ画面のconsoleに貼付け(上でmongoを実行した結果の配列)

          mongo = ["19w34YIc","1QOKK0en","1UNL8yZq","3iLm9FKs","42EfA30b","56MjHGgL",
          "6NfqEztE","8fTCMB2d","8ryz8qP7","8ryz8qP7.graph","8vZX0JRu","8y3nzrlp",
          "B06g2J8G","B680gAo9","Bo509Hq4","C54MBCbo","CBphUiac","CZ6xzdXS",
          "D56J2yAy","EacpoUfa","GhDb4oIa","Gx6vbe6c","HIBSyIR6","HeomCQh2",
          "IMkcVe2x","IOclgjcZ","IVkhoc7e","J5x6ey2z","JD3dzuPk","JPysY9vW",
          "Jx4URNQS","KZUyxaoh","L3VSidfM","LYxYZlOq","LbtokyQ9","MYZap7MY",
          "NaesODK2","Nqg96D6x","NtiKCwXg","ODUauMLU","PNkxD8Dp","PhDS65PB",
          "REkjbXfF","SQylEep0","SaatWVY9","SmHJNpGJ","TD3Y71g8","Uwh6Z0N3",
          "VC79sNVd","Vapq1qQU","WZ62Wvjr","Wdali6lA","Wk8NJVh2","XHthVtW4",
          "XIl1SnnF","XnkuCACY","YsGuyLFI","ZDa6UANK","ZDqGXPm0","awDNzfHI",
          "bZQVweIi","bapIY2QG","beXQm2vz","blF4r8nw","bnadJ3P4","cFUJW1QL",
          "dIRmhtII","hKZMeZuI","iHMBYRiZ","iKNxt2rb","iZQfyXPm","itwOYnoE",
          "jnWtw2Rn","kO7f8ui1","kzs6HOFU","lXXUD3cf","lu5YPfSP","m93gI12D",
          "mWHSfvF2","n9lYkMAO","nXYbSeo6","oJFc4W3x","orgacct","p1URHqN2",
          "pLDXVdTN","pNhTT0xX","piHjiyIg","q4m13mu1","qFXFbd0n","rADchwHi",
          "rCf8YHdJ","rHvdZe00","sEFl4trd","sHdPEbku","ssB1UPDH","ssB1UPDH_2019",
          "tWEAS54r","vX56zq9p","vgTkTZC2","vsXU6TOr","wBoRuJoT","wSEtYqIc",
          "wvdWwMRr","xAtphEMd","xdNbxcAS","xq0ji7EM","y9szdzIy","yEdJ4CR2",
          "yl3yk9Fe","ywJkuUIQ","zNvmdELv","zeL9GJWG"]

          mongo.forEach(function(id,i){
            if(a.indexOf(id) == -1){
              console.log(id)
            }
          })

          4.データの存在確認
          mongoDBに存在して機器一覧に存在しないセンサーidを把握したら、
          mongoDBのデータベースよりSSK.commeqpのコレクションを取得。

          中身を確認することで機器No.・割当ゲートウェイNo.が判別可能となるが、
          機器自体がアプリより削除されているため同コレクションの再利用は不可。
          あくまでも参考情報として収集。

          5.コレクションの削除
          mongoDBのコマンドタブより対象センサーidを指定して
          以下のパラメータでコレクションの削除を実行する。

          セレクタ:クエリの発行
          セレクタ:drop

          以上で完了
        • データサイズの確認

          データベースのコレクションのデータサイズと割り当てられたストレージサイズの確認方法

          1.File/Database Managerを開き、開発者ツールのコンソールを起動する。

          2.コンソールに以下のスクリプトを張り付け、得られた値を右クリック⇒「objectをコピー」を選択しクリップボードにコピーする。

          mongo=[]; //mongo   
          $.each($(".collections").find(".pointer"),function(i,elem){   
            var txt = $(elem).text();   
            if(txt.indexOf("SSK")==0){   
              mongo.push(txt.replace("SSK.",""));   
            }   
          })   
          mongo;

          3.該当の環境のCareBirdアプリを開き、開発者ツールのコンソールを起動する。

          4.コンソールで任意の変数に「2.」でコピーした値を格納し以下のスクリプトを実行する。

          fn = AppSpace.fn;
          fn.readSize(<任意の変数>);

          5.コンソールを確認し、受け取ったデータの件数と取得したデータの件数が一致するか確認する。
           一致した場合は、出力されたtxtファイルの中身をスプレッドシートに移すなどして確認する。


        • コレクションのデフラグメント

          データ領域が膨れ上がった場合のコレクションのストレージサイズ圧縮手順

          1.該当のコレクションをバックアップする
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「ダウンロード」を選択する
           ※文字コードはUnicode(UTF-8)に設定
           ↓
           ◆コレクション名を入力し、出力タイプをJSONに設定し送信を押下する
           ※タイムアウトしたり、データがうまく取得できない場合は、
           「最小 1000 件ずつに分けてダウンロードする。」を設定したうえで、
           以下のような引数を与えて複数回に分けて取得する
          1回目:
          {},{"limit": <任意の件数>}
          2回目以降:
          {},{"limit":<任意の件数>,"skip":<すでに取得した件数>}

          2.該当のコレクションのインデックスをバックアップする
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「クエリの発行」と「index」をそれぞれ選択する ↓
           ↓
           ◆コレクション名を入力し「送信」を押下する
           ↓
           ◆送信結果の< Download as a file >をクリックしJSON形式でダウンロードする

          3.コレクションをdropする
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「クエリの発行」と「drop」をそれぞれ選択する ↓
           ↓
           ◆コレクション名を入力し「送信」を押下し完了。

          4.コレクションが削除されていることを確認する
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「クエリの発行」と「run」をそれぞれ選択する ↓
           ↓
           ◆コレクション名を入力し、以下の引数を与えて「送信」を押下し完了。
          {"collStats": <コレクション名>} 
           ↓
           ◆送信結果がエラーとなれば削除されていることが確認できる
          ※稼働中のコレクションの場合は、データが保存される際にコレクションが作成されるため確認不要

           5.indexを生成する
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「クエリの発行」と「index」をそれぞれ選択する
           ↓ 
           ◆「2」でバックアップしたファイルを参照して、以下のような引数を与え「送信」を押下する
                    [
                        {"value": [["id", 1]], "options": {"name": "_id_"}},
                        {"value": [["id", 1], ["datetime", -1]], "options": {"name": "id_1_datetime_-1"}}, ...
                    ]
          配列の中に、生成したいインデックスの数のオブジェクト
          ・"value"のプロパティは配列の中に二次元配列の形式で、
          二次元配列の中には「2」のファイルの"key"のキーとプロパティをそれぞれ指定
          ・"options"の中はオブジェクト形式で"name"のプロパティに「2」のファイルの"name"プロパティを指定
          ・上記のオブジェクトをインデックスの数だけ記述する

          6.バックアップしたデータを復元する
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「アップロード」を選択する
           ※文字コードはUnicode(UTF-8)に設定
           ↓
           ◆コレクション名を入力し、入力タイプをJSONに設定する。
           ↓
           ◆アップロードしたいファイルを選択し「送信」を押下する
          ※エラーが出る場合は 
          最大 500 件ずつアップロードする。」と指定し再度アップロード
          ※アップロードによるデータの重複は起こらない 

          7.カウントして正しくデータがアップロードされているかを確認
           ◆File/Database Manager⇒「コマンド」タブにて、プルダウンから「クエリの発行」と「count」をそれぞれ選択する
           ↓ 
           ◆コレクション名を入力し送信を押下する

          8.データサイズを確認し、スプレッドシートにマージする
           ◆製品情報版のデータサイズの確認の項の手順でデータを取得する
           ↓
           ◆CareBirdポータルの「リレーサーバー変更」のシート「最新データサイズ」に形式を合わせて上書きする
        • トレーサビリティ管理

          本項では障害トラブル等における調査材料に有効なゲートウェイの
          システムログを回収する方法について説明する

          syslogファイルのダウンロードの仕方

          CommandSenderにて調査対象のゲートウェイを選択して以下コマンドを実行
          (1) 下記のコマンドで LEDv2_embed_xxx.tgz ファイルを作成 (POST) ※
          xxxは日付(yymmdd)

          curl https://synquery.com/LBbufZz6/f/dist/base64.js > base64.js
          cp /var/log/syslog LEDv2_embed_yymmdd.tgz
          node ./base64.js embed yymmdd

          (2) サイズを把握 (POST)

          wc -c LEDv2_embed_yymmdd_b64.txt  // => 3389796

          (2) で把握した数値をsizeに直してロジックをコピー(ctrl + C)

          //コピーここから

          var file = 'LEDv2_embed_yymmdd_b64.txt';
          var size = 3389796, once = 200000; // <= sizeは(2)の値、失敗したらonceを調整

          var cmd = [ ]
          cmd.push( (function(resl) {
            window.base64 = "";
          }).toString() );

          var i, len = Math.ceil(size / once);
          for(i = 0; i<len; i++) {
            cmd.push('cut -c ' + (i * once + 1) + '-' + Math.min(size, (i + 1) * once) + ' ' + file);
            cmd.push( (function(resl) {
              window.base64 += $.trim(resl[0].stdout).slice(0, -2);
            }).toString() )
          }

          cmd.push( (function(resl) { 
            debugger;
            var bin = atob(window.base64.replace(/^.*,/, ''));
            var buffer = new Uint8Array(bin.length);
            for (var i = 0; i < bin.length; i++) { buffer[i] = bin.charCodeAt(i); }
            var blob = new Blob([buffer.buffer], { type: 'application/x-gzip' })
            window.open(URL.createObjectURL(blob));
          }).toString() );

          window.open(URL.createObjectURL( new Blob([ cmd.join("\n") ], { type: "text/plain" }) ));

          //ここまでコピー

          # 上記をデバッカーConsoleに貼付
          # 別ウィンドウに表示されたスクリプトをコピー

          # CommandSenderの「SEQ(ゲートウェイファイルダウンロード)」を選択して入力エリアを全選択(ctrl + A)する
          # ペースト(ctrl + V)を実行してファイルをダウンロード

          # デスクトップに保存後、拡張子を.txtに変更して閲覧する
        • 社内運用Q&A

          • show error対策

            事象:一覧データの読み込み時間が以前よりも遅く「data show error」ダイアログが出現する。

            ◆考えられるポイント

            (1)センサーにIndex登録がされていない。

            Indexとは、データベースを効率よく検索するためのキー。
            管理ボタンの通信機器登録画面にて、初回のミオベッドセンサー(ミオルームセンサー)登録時に、
            自動でIndexを設定するようになっている。ただし、2019年5月以前に登録したセンサーは対象外のため
            Indexの状況確認を行う必要があります。

            【作業手順】
            管理画面にて
            ① Index 設定状況を確認する。
            ・Ctrl + Shift + J で検証ツール起動 >> Console より以下スクリプトを実行

              <スクリプトコピーここから>

            fn = AppSpace.fn;
            var errs = [];
            Promise.resolve().then(function() {
                return fn.promiseTalk("find", ["SSK.commeqp", {type:{$in:[2, 3, 7]}}]);
              }).then(function(sensors) {
                var when = Promise.resolve();
                sensors.forEach(function(sensor, i) {
                  when = when.then(function() {
                    var sel = {ns: "sifr3gdJ.SSK."+sensor._id};
                    return fn.promiseTalk("find", ["system.indexes", sel]);
                  }).then(function(r) {
                    if (r.length != 4) {
                      var keys = [];
                      r.forEach(function(d, i) { keys.push(Object.keys(d.key).join(","));});
                      errs.push(sensor._id+"のインデックス数が足りません。key="+ (sensor.no) +": 機器登録日 ="+fn.sync.YMDHMS(fn.sync.newDate(sensor.created, true), "Y/M/D"));
                      return;
                    }
                    var keycheckmap = {
                      _id: false,
                      "id,datetime": false,
                      "mdh": false,
                      "datetime": false
                    }
                    r.forEach(function(d, i) {
                      var key = Object.keys(d.key).join(",");
                      keycheckmap[key] = true;
                    });
                    $.each(keycheckmap, function(key, val) {
                      if (!val) errs.push(sensor._id+"の"+sensor.no+"のインデックス定義がありません。");
                    });
                    if (errs.length > 0) return;
                  });
                });
                return when.then(function() {
                  console.log(errs);
                });
              });

              <ここまで>

            ・実行後にコンソールログをメモ帳にコピーする。

              コンソールログの例:
              0: "LYxYZlOqのインデックス数が足りません。key=VS0005:機器登録日=2016/09/02"
              1: "SxKHFURJのインデックス数が足りません。key=00001:機器登録日=2015/11/09"
              2: "QUMlzqvDのインデックス数が足りません。key=dammy_s3:機器登録日=2018/02/21"
              3: "qFXFbd0nのインデックス数が足りません。key=VS0003:機器登録日=2016/08/02"
              4: "xAtphEMdのインデックス数が足りません。key=VS0006:機器登録日=2016/11/22"
              5: "L3VSidfMのインデックス数が足りません。key=VS0011:機器登録日=2016/12/08"
              6: "wBoRuJoTのインデックス数が足りません。key=VS0001:機器登録日=2016/07/15"
              7: "J5x6ey2zのインデックス数が足りません。key=VS9999:機器登録日=2018/06/19"
              8: "blF4r8nwのインデックス数が足りません。key=VS_oyako:機器登録日=2019/05/27"
              9: "YsGuyLFIのインデックス数が足りません。key=VSmamuro03:機器登録日=2019/05/29"

            ② Index 数の足りないセンサー(key = 機器No.)を選択して「Index登録」ボタン押下 ※この作業は1台ずつ行うこと
          • 一括ダウンロード

            要望:モニターに割り当てられている複数のセンサーログを一括でダウンロードできるようにしてほしい。

            現時点では、SSKが代行して取得する。
            送付方法は、クライアントにGoogleアカウントを作成してもらいドライブに格納する。(実績:ケアコム)

            【作業手順】

            取得対象のモニター画面にて
            ① スクリプトの実行
            ・Ctrl + Shift + J で検証ツール起動 >> Console より以下スクリプトを実行

             特記事項:
             ✓start_dateのnew Date()内には、取得開始年月日の前日を文字列で指定する。
             ✓end_dateのnew Date()内には、取得終了年月日を文字列で指定する。
             ✓csvファイルは1日単位で出力されます。
             ✓csvファイル名は、プロジェクトID + 部屋番号 + センサー設定

            <ここから>

                fn = AppSpace.fn;
                var sensors = $(".panelbase .sensors .sensor");
                var start_date = new Date("2019/01/31"); //左記は2019年12月1日から取得される
                var end_date = new Date(); //空の場合は本日分まで取得される
                end_date = fn.sync.riseOfTheDay(end_date,0,end_date.getDate(),false);
                var date_ary = [];
                var idx = 0;
                while(true){
                  var dt = new Date(start_date.setDate(start_date.getDate()+1));
                  dt = fn.sync.riseOfTheDay(dt,0,dt.getDate(),false);
                  if(dt.getTime() > end_date.getTime()) break;
                  date_ary.push(dt);
                  idx ++;
                }
                Promise.resolve().then(function(){
                  var when = Promise.resolve();
                  $.each(sensors,function(j,sensor){
                    date_ary.forEach(function(dt){
                      when = when.then(function(){
                        var param = {};
                        param.id = $(sensor).attr("id");
                        param.dt = dt;
                        param.$sensor = $(sensor);
                        return fn._dumpdata(null,param);
                      });
                    })
                
                  });
                  return when.then(function (){
                    console.log("done");
                  });
                })

            <ここまで>
        • 代理店Q&A

          代理店向け取り扱いマニュアル 
          【クライアント側】
           ◆利用者や居室情報を新規に追加登録したい(ソフト)
           使用するツール
           ・CareBirdアプリ
           手順 1.利用者リスト >> 新規登録-入力->保存 

          ◆利用者や居室情報を変更したい(ソフト)
           使用するツール
           ・CareBirdアプリ
           手順 1.利用者リスト >> 編集-入力->保存 

          ◆E-mail通知先を変更したい(ソフト)
           使用するツール
           ・CareBirdアプリ
           手順 1.受信端末リスト >> 編集-入力->保存 

          ◆センサーの設定カテゴリを変更したい(ソフト)
           使用するツール 
          ・CareBirdアプリ
           手順 1.運用設定 >> センサー設定 >> 編集-選択-学習->保存 

          【販売店側】
           ◆取引先を新規登録したい
           使用するツール 
          ・CareBirdアプリ
           手順 1.管理ボタン >> 取引先リスト >> 新規-入力->保存 >> 編集-入力->保存

           ◆取引先にセンサー機器の割当をしたい
           使用するツール
           ・CareBirdアプリ
           手順 1.管理ボタン >> 契約先リスト >> 新規-入力->保存 >> 編集-入力->保存

           ◆センサーを追加したい(ソフト) 
          使用するツール 
          ・CareBirdアプリ
           手順 1.管理ボタン >> 機器登録

           ◆ゲートウェイを追加したい(ソフト)
           使用するツール ・CareBirdアプリ
           手順 1.管理ボタン >> 機器登録
           ◆Wifiネットワークの登録(変更)がしたい(ハード)
           1.VitalSensor
           使用するツール
           ・UARTケーブル
           ・LsXB-consig or VR-BB
           手順 sensor接続 > 停止 > SSID・IPアドレス他パラメータ登録

           2.RaspberryPi
           使用するツール
           ・Teratarmソフト
           ・miniBコネクタ付USBケーブル
           手順 ファイル直接入力 wpa_supplicant.conf または シェルスクリプト実行

           ◆3G回線のプロバイダーを変更したい(ハード)
           1. Rokemoba
           ・SIMカードアクティベート
           ・カードセット、USBモデム接続
           ・RaspberryPiよりシェルスクリプト実行

           2. WirelessGate
           ・SIMカードアクティベート
           ・カードセット、USBモデム接続
           ・RaspberryPiよりシェルスクリプト実行

           ◆センサーをゲートウェイに割当したい(ソフト)
           1.利用者の割当 運用設定 > 新規登録-割当保存

           ◆センサーを別のゲートウェイに割当を変更したい(ソフト)
           1.利用者の割当解除 運用設定 > 編集-解除
           2.端末の割当解除 機器管理 > 編集-割当変更
           3.あとは、1.の利用者の割当と同じ