Why did we make the IoT-Wind weather station message format public?

We decided to release the IoT-Wind message format for the IoT-Wind LoRaWAN and Sigfox wireless transmitter and its Java-Script decoder code as open-source because of specific customer requests for a robust, low-cost solution for WMO quality wind speed and wind direction data.

We will keep offering our allMETEO web portal platform as the default data solution for the MeteoWind Compact with IoT-Wind wireless transmitter. Making the IoT-Wind weather station message format public will enable 3rd parties, which to not wish to use the allMETEO cloud, to build their own software applications and mobile apps as they see fit.

Being the only compact anemometer to meet the World Meteorological Organization (WMO) measurement precision standards for climatology and meteorology makes the MeteoHelix an ideal platform for research and high-density climatic networks. Its data can be reliably used by national weather services for precision weather forecasting. Opening up the communication protocol will enable meteorological, oceanographic and private organizations to bring real benefits to their customers.

MeteoWind Compact with WindIoT transmitter for environmental monitoring

MeteoWind Compact with WindIoT transmitter for environmental monitoring


Build your own wind vector map App with the IoT-Wind wind transmitter

Type = 3, IoT-Wind wireless message format (9 byte for 10min transmit intervals)
bits2 bits5 bits9 bits9 bits7 bits9 bits9 bits9 bits7 bits6 bits
Physical
property
Message
type
BatteryWind_ave10Wind_max10Wind_stdev10Wdir_ave10Wdir_max10Wdir_min10Wdir_stdev10free
UnitsVm/sm/sm/sdegreesdegreesdegreesdegrees 
Resolution 0.050.10.10.11111 
Minimum value000000000 
  • Wind#_Max values are added to the Wind# values which are set to be 2 minute averages of 1 second measuring intervals.

  • Sensor Error or N/A = Maximum possible value for the physical property which in binary = 111111…. (FFFFF…. In hex)


Web based & Excel spreadsheet weather data message decoder/verifier


The Things Network Payload Decoder

MeteoHelix weather station payload message decoder JavaScript code can be pasted directly into your application on The Things Network LoRaWAN console.

Paste the unmodified javascript code into the decoder section of your the things network application.

Paste the unmodified javascript code into the decoder section of your the things network application.


Sigfox Network Payload Decoder

For Sigfox wireless network based MeteoHelix weather stations, this JavaScript code can be integrated into your application which receives the MeteoHelix message payload from the Sigfox Backend.


Open-Source Decoder JavaScript Code

Decoder for LoRaWAN and Sigfox IoT-Wind weather stations for message type = 3.

var pos = 0;
var bindata = "";

var ConvertBase = function (num) {
    return {
        from : function (baseFrom) {
            return {
                to : function (baseTo) {
                    return parseInt(num, baseFrom).toString(baseTo);
                }
            };
        }
    };
};

function pad(num) {
    var s = "0000000" + num;
    return s.slice(-8);
}

ConvertBase.dec2bin = function (num) {
    return pad(ConvertBase(num).from(10).to(2));
};

ConvertBase.bin2dec = function (num) {
    return ConvertBase(num).from(2).to(10);
};

function data2bits(data) {
    var binary = "";
    for(var i=0; i<data.length; i++) {
        binary += ConvertBase.dec2bin(data[i]);
    }
    return binary;
}

function bitShift(bits) {
    var num = ConvertBase.bin2dec(bindata.substr(pos, bits));
    pos += bits;
    return Number(num);
}

function precisionRound(number, precision) {
  var factor = Math.pow(10, precision);
  return Math.round(number * factor) / factor;
}

function Decoder(bytes, port) {
  bindata = data2bits(bytes);
  
  //if(bytes.length != 12) return {"status": "ERROR", "describtion": "11 bytes are required"}
    Type =  bitShift(2);
    Battery = precisionRound(bitShift(5)*0.05+3, 1);
    Wind_ave10 = precisionRound(bitShift(9)*0.1, 1);
    Wind_max10 = precisionRound(bitShift(9)*0.1, 1);
    Wind_stdev10 = precisionRound(bitShift(7)*0.1, 1);
    Wdir_ave10 = precisionRound(bitShift(9)*1, 1);
    Wdir_max10 = precisionRound(bitShift(9)*1, 1);
    Wdir_min10 = precisionRound(bitShift(9)*1, 1);
    Wdir_stdev10 = precisionRound(bitShift(7)*1, 1);
 
  decoded = {
    "Type": Type,
    "Battery": Battery,
    "Wind_ave10": Wind_ave10,
    "Wind_max10": Wind_max10,
    "Wind_stdev10": Wind_stdev10,
    "Wdir_ave10": Wdir_ave10,
    "Wdir_max10": Wdir_max10,
    "Wdir_min10": Wdir_min10,
    "Wdirstdev10": Wdir_stdev10,
  };

  return decoded;
}