Intern

STM550Jからドングル経由で送られてきたデータをNode-Redで解析する

使用したデータシート

今回使用したデータシート

D2-14-41.pdf

https://tools.enocean-alliance.org/EEPViewer/profiles/D2/14/41/D2-14-41.pdf

送られてくるデータの確認

まずこのようにserial inノードとdebugノードを接続し、送られてくるデータを確認する。

今回はこのようなデータが送信されたのでこれを基にデータを解析していく。

デバイスIDの確認

使用するSTM550Jの裏面にIDが書いてあるのでそのIDの下8桁を控えておく。

先ほど送られてきた24バイトのデータのうちIDの下8桁と一致する場所を探す。今回はBuffer7からBuffer10の数値がIDの下8桁と一致するためこちら使用する。

送られてきた値のデコーディング

今回作成したデコーディング部分のfunctionノードの内容はこのようになっている。

今回送られてきたデータ部分の大きさは68ビットであるためIDから17文字後ろの数字までを使用する。

[{"id":"1dc242df91ae0766","type":"function","z":"5409fb978207031b","name":"Decoding","func":"//送られてきたバッファを16進数の文字列に変換してコピーする\nvar Copy = msg.payload.toString(\"hex\");\n//IDの部分を抜き出す\nvar ID = Copy.substr(14,8);\n//データの部分を抜き出す\nvar Data = Copy.substr(14+8,18);\n//作業場として仮で作っておく\nvar DataBit = \"\";\nvar DataCopy;\nvar DataLength = Data.length;\nfor(var i =0;i < DataLength;i++){\n    //先頭から1文字ずつ切り取る\n    DataCopy = Data.substr(i,1);\n    //切り取った文字列を16進数の数値に変換する\n    DataCopy = parseInt(DataCopy,16);\n    //変換した16進数の数値を4桁の2進数の文字列に変換して結合する\n    DataBit += DataCopy.toString(2).padStart(4,\"0\");\n\n}\n//msg.payloadに格納する\nmsg.payload = {\n    ID : ID,\n    Data : Data,\n    DataLength : Data.length,\n    DataBit : DataBit\n};\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":60,"wires":[["eb18fee8696fcd13"]]}]Code language: JSON / JSON with Comments (json)

エンコーディングした値の一時保存

今回作成した一時保存部分のfunctionノードの内容はこのようになっている。

[{"id":"8b58a14a29bb1a2d","type":"function","z":"5409fb978207031b","name":"Data_Storage","func":"//データの2進数での値をコピーする\nvar DataBit = msg.payload.DataBit;\n//変数宣言をしておく\nvar Temperature;\nvar Humidity;\nvar Illumination;\nvar Acceleration_Status;\nvar Acceleration_X;\nvar Acceleration_Y;\nvar Acceleration_Z;\nvar Contact;\n//データシートをもとにデータを切り取る\nTemperature = DataBit.substr(0,10);\nHumidity = DataBit.substr(10,8);\nIllumination = DataBit.substr(18,17);\nAcceleration_Status = DataBit.substr(35,2);\nAcceleration_X = DataBit.substr(37,10);\nAcceleration_Y = DataBit.substr(47,10);\nAcceleration_Z = DataBit.substr(57,10);\nContact = DataBit.substr(67,1);\n//msg.payloadに格納する\nmsg.payload = {\n    Temperature : Temperature,\n    Humidity : Humidity,\n    Illumination : Illumination,\n    Acceleration_Status :Acceleration_Status,\n    Acceleration_X : Acceleration_X,\n    Acceleration_Y : Acceleration_Y,\n    Acceleration_Z : Acceleration_Z,\n    Contact : Contact\n};\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":720,"y":60,"wires":[["023eeea911ea8294"]]}]Code language: JSON / JSON with Comments (json)

デコーディングした値を10進数に変換する

今回使用したSTM550Jは

  • Temperature
  • Humidity
  • Illumination
  • Acceleration Status
  • Acceleration X
  • Acceleration Y
  • Acceleration Z
  • Contact

以上8つの値を読み取ることができる。

コードが100行を超えるため画像は省略する。

[{"id":"023eeea911ea8294","type":"function","z":"5409fb978207031b","name":"Data_Convert","func":"//Temperatureの値をコピーする\nvar T = msg.payload.Temperature;\n//Humidityの値をコピーする\nvar H = msg.payload.Humidity;\n//Illuminationの値をコピーする\nvar I = msg.payload.Illumination;\n//Acceleration_Statusの値をコピーする\nvar AS = msg.payload.Acceleration_Status;\n//Acceleration_Xの値をコピーする\nvar AX = msg.payload.Acceleration_X;\n//Acceleration_Yの値をコピーする\nvar AY = msg.payload.Acceleration_Y;\n//Acceleration_Xの値をコピーする\nvar AZ = msg.payload.Acceleration_Z;\n//Contactの値をコピーする\nvar C = msg.payload.Contact;\n\n//データの値を二進数の文字列から十進数の数値に変換する\nT = parseInt(T, 2);\nH = parseInt(H, 2);\nI = parseInt(I, 2);\nAS = parseInt(AS, 2);\nAX = parseInt(AX, 2);\nAY = parseInt(AY, 2);\nAZ = parseInt(AZ, 2);\nC = parseInt(C, 2);\n\n//Tの値の処理\n//値が低すぎる場合の処理\nif (T == 1021) {\n    T = \"Out of range negative\";\n}\n//値が高すぎる場合の処理\nelse if (T == 1022) {\n    T = \"Out of range pisitive\";\n}\n//エラーが発生した場合の処理\nelse if (T == 1023) {\n    T = \"Error\";\n}\n//データが正常に読み取れた場合の処理\nelse {\n    //データシートを基に計算を行う\n    T = T / 10 - 40;\n    //少数第二位で四捨五入する\n    T = Math.round(T * 10) / 10;\n}\nmsg.payload.Temperature = T;\n\n//Hの値の処理\n//データが正常に読み取れた場合の処理\nif (H <= 200) {\n    //データシートを基に計算を行う\n    H = H / 2;\n}\n//サポートされていない場合の処理\nelse if (H == 255) {\n    H = \"not Supported\";\n}\n//無効になっている場合の処理\nelse if (H == 254) {\n    H = \"Invalid\";\n}\n//エラーが発生した場合の処理\nelse {\n    H = \"Error\";\n}\nmsg.payload.Humidity = H;\n\n//Iの値の処理\n//エラーが発生した場合の処理\nif (I == 131071) {\n    I = \"Error\";\n}\n//データが正常に読み取れた場合はそのまま\nmsg.payload.Illumination = I;\n\n//ASの値の処理\n//Periodic Updateを返す\nif (AS == 0) {\n    AS = \"Periodic Update\";\n}\n//Threshould 1 exceededを返す\nelse if (AS == 1) {\n    AS = \"Threshould 1 exceeded\";\n}\n//Threshould 2 exceededを返す\nelse {\n    AS = \"Threshould 2 exceeded\";\n}\nmsg.payload.Acceleration_Status = AS;\n\n//AXの値の処理\n//値が低すぎる場合の処理\nif (AX == 1021) {\n    AX = \"Out of range negative\";\n}\n//値が高すぎる場合の処理\nelse if (AX == 1022) {\n    AX = \"Out of range positive\";\n}\n//エラーが発生した場合の処理\nelse if (AX == 1023) {\n    AX = \"Error\";\n}\n//データが正常に読み取れた場合の処理\nelse {\n    AX = AX / 200;\n    AX = Math.round(AX * 1000) / 1000;\n    AX -= 2.5;\n}\nmsg.payload.Acceleration_X = AX;\n\n//AYの値の処理\n//値が低すぎる場合の処理\nif (AY == 1021) {\n    AY = \"Out of range negative\";\n}\n//値が高すぎる場合の処理\nelse if (AY == 1022) {\n    AY = \"Out of range positive\";\n}\n//エラーが発生した場合の処理\nelse if (AY == 1023) {\n    AY = \"Error\";\n}\n//データが正常に読み取れた場合の処理\nelse {\n    AY = AY / 200;\n    AY = Math.round(AY * 1000) / 1000;\n    AY -= 2.5;\n}\nmsg.payload.Acceleration_Y = AY;\n\n//AZの値の処理\n//値が低すぎる場合の処理\nif (AZ == 1021) {\n    AZ = \"Out of range negative\";\n}\n//値が高すぎる場合の処理\nelse if (AZ == 1022) {\n    AZ = \"Out of range positive\";\n}\n//エラーが発生した場合の処理\nelse if (AZ == 1023) {\n    AZ = \"Error\";\n}\n//データが正常に読み取れた場合の処理\nelse {\n    AZ = AZ / 200;\n    AZ = Math.round(AZ * 1000) / 1000;\n    AZ -= 2.5;\n}\nmsg.payload.Acceleration_Z = AZ;\n\n//Cの値の処理\n//Openを返す\nif (C == 0) {\n    C = \"Open\";\n}\n//Closeを返す\nelse {\n    C = \"Close\";\n}\nmsg.payload.Contact = C;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":900,"y":60,"wires":[["1c948b9849f3fe6c","8aed9d5c7d069897","3fa93a574d0d4bc8","0875308e8e6f56aa","6e24670b36ec1e0c","ad214bfc6dbb6937","88ba41da3beac37b","a9715adb3896cd26"]]}]Code language: JSON / JSON with Comments (json)