使用したデータシート
今回使用したデータシート
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)