iBS01Tの挙動につきまして



  • 長い期間iBS01Tのデータを受信して気になる点が幾つかございましたので、
    確認させてください。
    お客様よりクレームが入っており、早急な解決が必要です。

    ・丸め誤差
     温度で以下のような値がとれます。
     8.040000000000001
     4.76
     端末同じものではもタイミングによって桁数が多いデータがくることがあります。
     こちら仕様でしょうか。設定で桁数を固定できますでしょうか。 
    ・複数受信
     同じデバイスから同時刻・同タイミングに同じデータが3-6個送られてくることが
     ありました。こちら仕様でしょうか。設定で回避できますでしょうか。
    ・バッテリー値
     外部給電のバッテリー値についてはどのような表記で送られてきますか。
     おおよそ3.xxの値です。
     LogttaCO2の場合は固定表記になりますが、iBS01Tの場合は固定にならないでしょうか。
    ・データ受信数に差がある
     1分単位でデータ送出しておりますが、データの受信にばらつきが発生しております。
     この原因について考えられることはございますでしょうか。



  • データの受信数にばらつきがあるというのは、
    1分間隔で送出する様に設定しておりますが、例えば1時間での取得数は下記の様になっております。

         22 address=edf5e8b67264
         34 address=f049a3f01596
         28 address=f37b3e64c037
    

    本来であれば60回受信できることが期待されますが、
    実際は半分から半分以下の状態です。

    取得コードは以下の様になっております。Obnizゲートウェイは1台です。

    export const obnizObserve = (device: any) => {
      const logger = new Logger(Logger.DEBUG, "logs/ibs01t.log")
    
      let obniz: Obniz | undefined = undefined
      try {
        obniz = new Obniz(device.id)
      } catch (error) {
        throw new Error(error)
      }
    
      obniz.onconnect = async () => {
    
        if (!obniz || !obniz.ble) {
          throw new Error("obniz or obniz.ble is not defined.")
        }
    
        const LOGTTA_CO2 = Obniz.getPartsClass("Logtta_CO2")
        const IBS01T = Obniz.getPartsClass("iBS01T")
        const iBS02PIR = Obniz.getPartsClass("iBS02PIR")
        const iBS02IR = Obniz.getPartsClass("iBS02IR")
    
        await obniz.ble.initWait()
    
        obniz.ble.scan.onfind = (peripheral) => {
          if (LOGTTA_CO2.isAdvDevice(peripheral)) {
            // Logtta CO2 Beacon mode.
            try {
              const data = LOGTTA_CO2.getData(peripheral)
    
              if (data) {
                logger.info(
                  `obniz=${device.id} Logtta_CO2 address=${peripheral.address} co2=${data.co2} battery=${data.battery} rssi=${peripheral.rssi}`
                )
              } else {
                logger.info(`obniz=${device.id} iBS01T address=${peripheral.address} co2=0 battery=0`)
              }
            } catch (error) {
              logger.error(`obniz=${device.id} Logtta_CO2 address=${peripheral.address} co2=0`)
            }
          } else if (IBS01T.isDevice(peripheral)) {
            try {
              const data = IBS01T.getData(peripheral)
    
              if (data) {
                logger.info(
                  `obniz=${device.id} iBS01T address=${peripheral.address} temperature=${data.temperature} humidity=${data.humidity} battery=${data.battery} rssi=${peripheral.rssi}`
                )
              } else {
                logger.info(
                  `obniz=${device.id} iBS01T address=${peripheral.address} temperature=0 humidity=0 battery=0 rssi=${peripheral.rssi}`
                )
              }
            } catch (error) {
              logger.error(error)
            }
          } else if (iBS02PIR.isDevice(peripheral)) {
            try {
              const data = iBS02PIR.getData(peripheral)
    
              if (data) {
                logger.info(
                  `obniz=${device.id} iBS02PIR address=${peripheral.address} event=${data.event} battery=${data.battery} rssi=${peripheral.rssi}`
                )
              } else {
                logger.info(
                  `obniz=${device.id} iBS02PIR address=${peripheral.address} event=0 battery=0 rssi=${peripheral.rssi}`
                )
              }
            } catch (error) {
              logger.error(error)
            }
          } else if (iBS02IR.isDevice(peripheral)) {
            try {
              const data = iBS02IR.getData(peripheral)
    
              if (data) {
                logger.info(
                  `obniz=${device.id} iBS02IR address=${peripheral.address} event=${data.event} battery=${data.battery} rssi=${peripheral.rssi}`
                )
              } else {
                logger.info(
                  `obniz=${device.id} iBS02IR address=${peripheral.address} event=0 battery=0 rssi=${peripheral.rssi}`
                )
              }
            } catch (error) {
              logger.error(error)
            }
          } else {
            // console.log(`${now} obniz=${device.id} address=${peripheral.address} Other`)
          }
        }
    
        obniz.ble.scan.onfinish = async (peripherals, error) => {
          logger.debug(`scan timeout: ${device.id}`)
    
          if (error) {
            logger.debug(`scan onfinish: ${device.id}`)
            logger.error(error)
          }
    
          if (!obniz || !obniz.ble) {
            logger.error("obniz or obniz.ble is not defined.")
            throw new Error("obniz or obniz.ble is not defined.")
          }
    
          await obniz.ble.scan.startWait(null, { duplicate: true, duration: null })
          logger.debug(`Reconnect startWait: ${device.id}`)
        }
    
        await obniz.ble.scan.startWait(null, { duplicate: true, duration: null })
    
        logger.debug(`First startWait: ${device.id}`)
      }
    
      obniz.onclose = async () => {
        logger.debug(`onclose: ${device.id}`)
      }
    }
    


  • @JUNICHI-MASUKO さん

    ・丸め誤差

    演算結果に丸め誤差が出るのはJavaScriptとしての仕様となり、obnizjsでは特別な対応をしておりません。
    特定の桁数での数字が必要な場合は取得した数字をもとに変換いただければと思います。

    ・複数受信

    一般的にadvertisementは一度だけ出すということは少なく、受信側が読み取れないことも踏まえて何度か出すことが多くなっています。そのため、duplicate:trueの場合はいくつかのアドが同時に来たように見えることがあります。
    onfindにてフィルタリングを行うか、duplicate:falseをご検討ください。

    ・バッテリー値

    ibs01のドキュメント上、外部給電していたとしてもそちらの値は変化しないようですので、あくまでバッテリーの値となります。

    ・データ受信数に差がある

    周辺BLEの環境や、タイミング等によって受信できない場合があります。

    • obnizデバイスはwifiとBLEのアンテナが共有となり、wifiを使っている間は受信できない
    • BLEのアドは3chあるため、1/3の確率でしか受信できない
      などの要素があります。


  • @kido said in iBS01Tの挙動につきまして:

    周辺BLEの環境や、タイミング等によって受信できない場合があります。

    obnizデバイスはwifiとBLEのアンテナが共有となり、wifiを使っている間は受信できない
    BLEのアドは3chあるため、1/3の確率でしか受信できない
    などの要素があります。

    こちらの内容がわからないのですが、
    何が具体的な例はございますでしょうか。

    Obnizにこちらのアプリがアクセスしている段階で既にWiFiを利用していると思うのですが、
    それでもデータ受信はできております。
    さらにいうと、

    startWait(null, { duplicate: true, duration: null })
    

    にて基本的にはずっとつなぎっぱなしな状態です。

    ここでいうWiFiとBLEの切り替わりはどのタイミングで発生するのでしょうか。

    また、BLEが3chある為受信する確率が1/3とのことですが、

    • センサーは3ch持ち、そのうちどれか1つを利用してデータを送出する(ch指定はできない)
    • Obnizはセンサーの3chのうちどれか特定のchからしかデータを受信しない(ch指定はできない)
    • Obnizが受信するセンサーのchは変化しない(使うchはセンサー毎で固定?)

    という認識でよろしいでしょうか。
    ObnizというよりはBLEの仕様なのでしょうか。



  • これらはobnizのしようというよりはBLEの仕様になります。

    センサーは3ch持ち、そのうちどれか1つを利用してデータを送出する(ch指定はできない)

    はい、そうです。

    Obnizはセンサーの3chのうちどれか特定のchからしかデータを受信しない(ch指定はできない)

    はい、そうです。
    瞬間的にはいずれか1chのみの受信となります。

    Obnizが受信するセンサーのchは変化しない(使うchはセンサー毎で固定?)

    いいえ、こちらは時間とともに(ミリ秒単位で)変化します。
    切り替えが高速なため、長い時間を通してみるとすべてのチャンネルをスキャンしている状態になります。

    全体的に、BLEのアドは100%の受信はきないかもしれないという前提のもと、何度かアドを出したりすることで受信確率を上げていくことになります。
    (BLEに限らずwifiも同じで、wifiの場合は失敗したときの再送のアルゴリズム等が組み込まれています)

    BLEの場合で、確実性を求めるのであれば、コネクションを張る という行為がそれに該当します。コネクションを張っていただければ、再送等のアルゴリズムが適用され、確実な通信が可能となります。
    ※そのかわりに、1:1通信になるため別の目的が果たせなくなる可能性があります。

    アドのままで受信確率を上げる場合には、送信頻度を高めることで100%ではないものの、実用的な受信確率にすることができます。

    1/3の受信確率であるならば、3倍のアド頻度であれば目的が果たされるだろう、安全率をとってさらに2倍にして合計6倍のアド頻度を設定しておこう という考え方になります。


Log in to reply
 

SUGGESTED TOPICS

  • 1
  • 1
  • 1
  • 1
  • 21
  • 1
  • 3
  • 3