MOKO GPS Tracker LW001 BG PRO Dashboard

Hi,

Does anybody have a functional dashboard for this MOKO device?

I’m having a bad experience here with this device and all its variables.

Tks

Hi Jpouza,

We have some dashboard template examples on our website, take a look here: https://tago.io/dashboard-templates/.

NOTE: You will need to update the widget variable to display the variables that your device sends to TagoIO.

Thanks, but I really do not know the location variable for this moko pro device. I tried a lot of variables with no success.

You can see what variables are coming in the bucket section.

NOTE: Pay attention that the location variable must contain LAT and LNG in the JSON, e.g:

{
 "variable": "location",
  "value": "sensor location",
  "location": { "lat": 3404.7041778, "lng": 07044.3966270 }
}

In the bucket only “hotspot_0_location” gives me latitude and longitude values.

Do I need to insert a decoder before Helium flow integration to TagoIO?

This is what the device maker provides as decoder:

var packet_type = [“heart”,“fix_success”,“fix_false”,“sys_close_info”,“shake_info”,“idle_info”,“demolish_alarm”,“event”,“battery_consume”,“config”,“store_data”,“limit_gps_data”];
var dev_mode = [“standby”,“period”,“timing”,“motion”];
var dev_fix_type = [“work_mode_fix”,“down_request_fix”];
function substringBytes(bytes, start, len)
{
var char = ;
for(var i = 0; i < len; i++)
{
char.push(“0x”+ bytes[start+i].toString(16) < 0X10 ? (“0”+bytes[start+i].toString(16)) : bytes[start+i].toString(16) );
}
return char.join(“”);
}
function BytestoInt(bytes,start) {
var value = ((bytes[start] << 24) | (bytes[start+1] << 16) | (bytes[start+2] << 8) | (bytes[start+3]));
return value;
}
function Decoder(bytes, port)
{
var dev_info = {};
dev_info.pack_type = packet_type[port-1];
//common frame head
if(port<=10)
{
dev_info.work_mode = dev_mode[bytes[0]&0x03];
dev_info.low_power_state = (bytes[0]>>2)&0x01;
dev_info.demolish_state = (bytes[0]>>3)&0x01;
dev_info.idle_state = (bytes[0]>>4)&0x01;
dev_info.motion_state = (bytes[0]>>5)&0x01;
if(port==2 || port ==3)
{
dev_info.fix_type = dev_fix_type[(bytes[0]>>6)&0x01];
}

    if(bytes\[1\]>0x80)  
    {  
        dev\_info.temperature = bytes\[1\] - 0x100 + "°C";  
    }  
    else  
    {  
        dev\_info.temperature = bytes\[1\] + "°C";  
    }  

    dev\_info.lorawan\_downlink\_count = bytes\[2\]&0x0f;  
    dev\_info.battery = (22+((bytes\[2\]>>4)&0x0f))/10 + "V";  
}  
if(port == 1)  
{  
    var restart\_reason = \["power\_restart","ble\_cmd\_restart","lorawan\_cmd\_restart","switch\_off\_mode\_restart"\];  
    dev\_info.pre\_restart\_reason = restart\_reason\[bytes\[3\]\];  

      
    ver\_major = (bytes\[4\]>>6)&0x03;  
    ver\_mijor = (bytes\[4\]>>4)&0x03;  
    ver\_patch = bytes\[4\]&0x0f;  
    dev\_info.ver = "V" + ver\_major+"."+ver\_mijor+"."+ver\_patch;  

    dev\_info.motion\_count = BytestoInt(bytes,5);  
}  
else if(port == 2)  
{  
    var  fix\_tech = \["wifi","ble","gps"\];  
    var parse\_len = 3; // common head is 3 byte  
    var datas = \[\];  
    tech = bytes\[parse\_len++\];  
    dev\_info.fix\_tech = fix\_tech\[tech\];  

    year = bytes\[parse\_len\]\*256 + bytes\[parse\_len+1\];  
    parse\_len += 2;  
    mon = bytes\[parse\_len++\];  
    days = bytes\[parse\_len++\];  
    hour = bytes\[parse\_len++\];  
    minute = bytes\[parse\_len++\];  
    sec = bytes\[parse\_len++\];  
    timezone = bytes\[parse\_len++\];  

    if(timezone>0x80)  
    {  
        dev\_info.utc\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" +  (timezone-0x100);  
    }  
    else  
    {  
        dev\_info.utc\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" + timezone;  
    }  
    datalen =  bytes\[parse\_len++\];  

    if(tech==0 || tech ==1)  
    {  
        for(var i=0 ; i<(datalen/7) ; i++)  
        {  
          var data = {};  
            data.mac = substringBytes(bytes, parse\_len, 6);  
            parse\_len += 6;  
            data.rssi = bytes\[parse\_len++\]-256 +"dBm";  
            datas.push(data);  
        }  
        dev\_info.mac\_data = datas;  
    }  
    else  
    {  
        lat =BytestoInt(bytes,parse\_len);  
        parse\_len += 4;  
        lon =BytestoInt(bytes,parse\_len);  
        parse\_len += 4;  

        if(lat>0x80000000)  
            lat = lat-0x100000000;  
        if(lon>0x80000000)  
            lon = lon-0x100000000;  

        dev\_info.latitude = lat/10000000;  
        dev\_info.longitude = lon/10000000;  
        dev\_info.altitude=0;  
        dev\_info.accuracy=3;  
        dev\_info.pdop = bytes\[parse\_len\] /10;  
    }  
}  
else if(port == 3)  
{  

    var fix\_false\_reason = \["wifi\_fix\_time\_timeout","wifi\_fix\_tech\_timeout","wifi\_module\_nofind","ble\_fix\_time\_timeout","ble\_fix\_tech\_timeout","ble\_adv","gps\_no\_budget","gps\_coarse\_acc\_timeout","gps\_fine\_acc\_timeout","gps\_fix\_timeout","gps\_assistnow\_timeout","gps\_cold\_start\_timeout","down\_request\_fix\_interrupt","motion\_start\_fix\_false\_by\_motion\_end","motion\_end\_fix\_false\_by\_motion\_start"\];  
    var parse\_len = 3;   
    var datas = \[\];  
    reason = bytes\[parse\_len++\];  
    dev\_info.fix\_false\_reason = fix\_false\_reason\[reason\];  
    datalen =  bytes\[parse\_len++\];  
    if(reason<=5) //wifi and ble reason  
    {  
      if(datalen)  
      {  
          for(var i=0 ; i<(datalen/7) ; i++)  
          {  
            var data = {};  
              data.mac = substringBytes(bytes, parse\_len, 6);  
              parse\_len += 6;  
              data.rssi = bytes\[parse\_len++\]-256 +"dBm";  
              datas.push(data);  
          }  
          dev\_info.mac\_data = datas;  
      }  
    }  
    else if(reason<=11) //gps reason  
    {      
        pdop = bytes\[parse\_len++\];  
        if(pdop!=0xff)  
            dev\_info.pdop = pdop/10  
        else  
            dev\_info.pdop = "unknow";  
        dev\_info.gps\_satellite\_cn = bytes\[parse\_len\] +"-" + bytes\[parse\_len+1\] +"-" + bytes\[parse\_len+2\] +"-" + bytes\[parse\_len+3\] ;  
    }  
}  
else if(port == 4)  
{  
    var sys\_close\_reason = \["ble\_cmd\_close","lorawan\_cmd\_close","reed\_switch\_close"\];  
    dev\_info.sys\_close\_reason = sys\_close\_reason\[bytes\[3\]\];  
}  
else if(port == 5)  
{  
    dev\_info.shake\_num = bytes\[3\]\*256+ bytes\[4\];  
}  
else if(port == 6)  
{  
    dev\_info.idle\_time = bytes\[3\]\*256+ bytes\[4\];  
}  
else if(port == 7)  
{  
    var parse\_len = 3; // common head is 3 byte  
    year = bytes\[parse\_len\]\*256 + bytes\[parse\_len+1\];  
    parse\_len += 2;  
    mon = bytes\[parse\_len++\];  
    days = bytes\[parse\_len++\];  
    hour = bytes\[parse\_len++\];  
    minute = bytes\[parse\_len++\];  
    sec = bytes\[parse\_len++\];  
    timezone = bytes\[parse\_len++\];  

    if(timezone>0x80)  
    {  
        dev\_info.alarm\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" +  (timezone-0x100);  
    }  
    else  
    {  
        dev\_info.alarm\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" + timezone;  
    }  
}  
else if(port == 8)  
{  
    var event = \["motion start","moving fix start","motion end","lorawan downlink trigger uplink"\];  
    dev\_info.event\_info = event\[bytes\[3\]\];  
}  
else if(port == 9)  
{  
    var parse\_len = 3;  
    dev\_info.gps\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.wifi\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.ble\_scan\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.ble\_adv\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.lorawan\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
}  
else if(port == 10)  
{  
    //  
}  
else if(port == 11)  
{  
    //  
}  
else if(port == 12)  
{  

    dev\_info.work\_mode = dev\_mode\[bytes\[0\]&0x03\];  
    dev\_info.low\_power\_state = bytes\[0\]&0x04;  
    dev\_info.demolish\_state = bytes\[0\]&0x08;  
    dev\_info.idle\_state = bytes\[0\]&0x10;  
    dev\_info.motion\_state = bytes\[0\]&0x20;  
    dev\_info.fix\_type = dev\_fix\_type\[(bytes\[0\]>>6)&0x01\];  

    dev\_info.lorawan\_downlink\_count = bytes\[1\]&0x0f;  
    dev\_info.battery = (22+((bytes\[2\]>>4)&0x0f))/10 + "V";  

    var parse\_len = 2;  
    lat =BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    lon =BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  

    if(lat>0x80000000)  
        lat = lat-0x100000000;  
    if(lon>0x80000000)  
        lon = lon-0x100000000;  

    **dev\_info.latitude = lat/10000000 ;  
    dev\_info.longitude = lon/10000000;  
    dev\_info.altitude=0;  
    dev\_info.accuracy=3;**  
    dev\_info.pdop = bytes\[parse\_len\]/10;  
}  
return dev\_info;  

}

var packet_type = [“heart”,“fix_success”,“fix_false”,“sys_close_info”,“shake_info”,“idle_info”,“demolish_alarm”,“event”,“battery_consume”,“config”,“store_data”,“limit_gps_data”];
var dev_mode = [“standby”,“period”,“timing”,“motion”];
var dev_fix_type = [“work_mode_fix”,“down_request_fix”];
function substringBytes(bytes, start, len)
{
var char = ;
for(var i = 0; i < len; i++)
{
char.push(“0x”+ bytes[start+i].toString(16) < 0X10 ? (“0”+bytes[start+i].toString(16)) : bytes[start+i].toString(16) );
}
return char.join(“”);
}
function BytestoInt(bytes,start) {
var value = ((bytes[start] << 24) | (bytes[start+1] << 16) | (bytes[start+2] << 8) | (bytes[start+3]));
return value;
}
function Decoder(bytes, port)
{
var dev_info = {};
dev_info.pack_type = packet_type[port-1];
//common frame head
if(port<=10)
{
dev_info.work_mode = dev_mode[bytes[0]&0x03];
dev_info.low_power_state = (bytes[0]>>2)&0x01;
dev_info.demolish_state = (bytes[0]>>3)&0x01;
dev_info.idle_state = (bytes[0]>>4)&0x01;
dev_info.motion_state = (bytes[0]>>5)&0x01;
if(port==2 || port ==3)
{
dev_info.fix_type = dev_fix_type[(bytes[0]>>6)&0x01];
}

    if(bytes\[1\]>0x80)  
    {  
        dev\_info.temperature = bytes\[1\] - 0x100 + "°C";  
    }  
    else  
    {  
        dev\_info.temperature = bytes\[1\] + "°C";  
    }  

    dev\_info.lorawan\_downlink\_count = bytes\[2\]&0x0f;  
    dev\_info.battery = (22+((bytes\[2\]>>4)&0x0f))/10 + "V";  
}  
if(port == 1)  
{  
    var restart\_reason = \["power\_restart","ble\_cmd\_restart","lorawan\_cmd\_restart","switch\_off\_mode\_restart"\];  
    dev\_info.pre\_restart\_reason = restart\_reason\[bytes\[3\]\];  

      
    ver\_major = (bytes\[4\]>>6)&0x03;  
    ver\_mijor = (bytes\[4\]>>4)&0x03;  
    ver\_patch = bytes\[4\]&0x0f;  
    dev\_info.ver = "V" + ver\_major+"."+ver\_mijor+"."+ver\_patch;  

    dev\_info.motion\_count = BytestoInt(bytes,5);  
}  
else if(port == 2)  
{  
    var  fix\_tech = \["wifi","ble","gps"\];  
    var parse\_len = 3; // common head is 3 byte  
    var datas = \[\];  
    tech = bytes\[parse\_len++\];  
    dev\_info.fix\_tech = fix\_tech\[tech\];  

    year = bytes\[parse\_len\]\*256 + bytes\[parse\_len+1\];  
    parse\_len += 2;  
    mon = bytes\[parse\_len++\];  
    days = bytes\[parse\_len++\];  
    hour = bytes\[parse\_len++\];  
    minute = bytes\[parse\_len++\];  
    sec = bytes\[parse\_len++\];  
    timezone = bytes\[parse\_len++\];  

    if(timezone>0x80)  
    {  
        dev\_info.utc\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" +  (timezone-0x100);  
    }  
    else  
    {  
        dev\_info.utc\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" + timezone;  
    }  
    datalen =  bytes\[parse\_len++\];  

    if(tech==0 || tech ==1)  
    {  
        for(var i=0 ; i<(datalen/7) ; i++)  
        {  
          var data = {};  
            data.mac = substringBytes(bytes, parse\_len, 6);  
            parse\_len += 6;  
            data.rssi = bytes\[parse\_len++\]-256 +"dBm";  
            datas.push(data);  
        }  
        dev\_info.mac\_data = datas;  
    }  
    else  
    {  
        lat =BytestoInt(bytes,parse\_len);  
        parse\_len += 4;  
        lon =BytestoInt(bytes,parse\_len);  
        parse\_len += 4;  

        if(lat>0x80000000)  
            lat = lat-0x100000000;  
        if(lon>0x80000000)  
            lon = lon-0x100000000;  

        dev\_info.latitude = lat/10000000;  
        dev\_info.longitude = lon/10000000;  
        dev\_info.altitude=0;  
        dev\_info.accuracy=3;  
        dev\_info.pdop = bytes\[parse\_len\] /10;  
    }  
}  
else if(port == 3)  
{  

    var fix\_false\_reason = \["wifi\_fix\_time\_timeout","wifi\_fix\_tech\_timeout","wifi\_module\_nofind","ble\_fix\_time\_timeout","ble\_fix\_tech\_timeout","ble\_adv","gps\_no\_budget","gps\_coarse\_acc\_timeout","gps\_fine\_acc\_timeout","gps\_fix\_timeout","gps\_assistnow\_timeout","gps\_cold\_start\_timeout","down\_request\_fix\_interrupt","motion\_start\_fix\_false\_by\_motion\_end","motion\_end\_fix\_false\_by\_motion\_start"\];  
    var parse\_len = 3;   
    var datas = \[\];  
    reason = bytes\[parse\_len++\];  
    dev\_info.fix\_false\_reason = fix\_false\_reason\[reason\];  
    datalen =  bytes\[parse\_len++\];  
    if(reason<=5) //wifi and ble reason  
    {  
      if(datalen)  
      {  
          for(var i=0 ; i<(datalen/7) ; i++)  
          {  
            var data = {};  
              data.mac = substringBytes(bytes, parse\_len, 6);  
              parse\_len += 6;  
              data.rssi = bytes\[parse\_len++\]-256 +"dBm";  
              datas.push(data);  
          }  
          dev\_info.mac\_data = datas;  
      }  
    }  
    else if(reason<=11) //gps reason  
    {      
        pdop = bytes\[parse\_len++\];  
        if(pdop!=0xff)  
            dev\_info.pdop = pdop/10  
        else  
            dev\_info.pdop = "unknow";  
        dev\_info.gps\_satellite\_cn = bytes\[parse\_len\] +"-" + bytes\[parse\_len+1\] +"-" + bytes\[parse\_len+2\] +"-" + bytes\[parse\_len+3\] ;  
    }  
}  
else if(port == 4)  
{  
    var sys\_close\_reason = \["ble\_cmd\_close","lorawan\_cmd\_close","reed\_switch\_close"\];  
    dev\_info.sys\_close\_reason = sys\_close\_reason\[bytes\[3\]\];  
}  
else if(port == 5)  
{  
    dev\_info.shake\_num = bytes\[3\]\*256+ bytes\[4\];  
}  
else if(port == 6)  
{  
    dev\_info.idle\_time = bytes\[3\]\*256+ bytes\[4\];  
}  
else if(port == 7)  
{  
    var parse\_len = 3; // common head is 3 byte  
    year = bytes\[parse\_len\]\*256 + bytes\[parse\_len+1\];  
    parse\_len += 2;  
    mon = bytes\[parse\_len++\];  
    days = bytes\[parse\_len++\];  
    hour = bytes\[parse\_len++\];  
    minute = bytes\[parse\_len++\];  
    sec = bytes\[parse\_len++\];  
    timezone = bytes\[parse\_len++\];  

    if(timezone>0x80)  
    {  
        dev\_info.alarm\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" +  (timezone-0x100);  
    }  
    else  
    {  
        dev\_info.alarm\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" + timezone;  
    }  
}  
else if(port == 8)  
{  
    var event = \["motion start","moving fix start","motion end","lorawan downlink trigger uplink"\];  
    dev\_info.event\_info = event\[bytes\[3\]\];  
}  
else if(port == 9)  
{  
    var parse\_len = 3;  
    dev\_info.gps\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.wifi\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.ble\_scan\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.ble\_adv\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.lorawan\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
}  
else if(port == 10)  
{  
    //  
}  
else if(port == 11)  
{  
    //  
}  
else if(port == 12)  
{  

    dev\_info.work\_mode = dev\_mode\[bytes\[0\]&0x03\];  
    dev\_info.low\_power\_state = bytes\[0\]&0x04;  
    dev\_info.demolish\_state = bytes\[0\]&0x08;  
    dev\_info.idle\_state = bytes\[0\]&0x10;  
    dev\_info.motion\_state = bytes\[0\]&0x20;  
    dev\_info.fix\_type = dev\_fix\_type\[(bytes\[0\]>>6)&0x01\];  

    dev\_info.lorawan\_downlink\_count = bytes\[1\]&0x0f;  
    dev\_info.battery = (22+((bytes\[2\]>>4)&0x0f))/10 + "V";  

    var parse\_len = 2;  
    lat =BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    lon =BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  

    if(lat>0x80000000)  
        lat = lat-0x100000000;  
    if(lon>0x80000000)  
        lon = lon-0x100000000;  

    dev\_info.latitude = lat/10000000 ;  
    dev\_info.longitude = lon/10000000;  
    dev\_info.altitude=0;  
    dev\_info.accuracy=3;  
    dev\_info.pdop = bytes\[parse\_len\]/10;  
}  
return dev\_info;  

}

var packet_type = [“heart”,“fix_success”,“fix_false”,“sys_close_info”,“shake_info”,“idle_info”,“demolish_alarm”,“event”,“battery_consume”,“config”,“store_data”,“limit_gps_data”];
var dev_mode = [“standby”,“period”,“timing”,“motion”];
var dev_fix_type = [“work_mode_fix”,“down_request_fix”];
function substringBytes(bytes, start, len)
{
var char = ;
for(var i = 0; i < len; i++)
{
char.push(“0x”+ bytes[start+i].toString(16) < 0X10 ? (“0”+bytes[start+i].toString(16)) : bytes[start+i].toString(16) );
}
return char.join(“”);
}
function BytestoInt(bytes,start) {
var value = ((bytes[start] << 24) | (bytes[start+1] << 16) | (bytes[start+2] << 8) | (bytes[start+3]));
return value;
}
function Decoder(bytes, port)
{
var dev_info = {};
dev_info.pack_type = packet_type[port-1];
//common frame head
if(port<=10)
{
dev_info.work_mode = dev_mode[bytes[0]&0x03];
dev_info.low_power_state = (bytes[0]>>2)&0x01;
dev_info.demolish_state = (bytes[0]>>3)&0x01;
dev_info.idle_state = (bytes[0]>>4)&0x01;
dev_info.motion_state = (bytes[0]>>5)&0x01;
if(port==2 || port ==3)
{
dev_info.fix_type = dev_fix_type[(bytes[0]>>6)&0x01];
}

    if(bytes\[1\]>0x80)  
    {  
        dev\_info.temperature = bytes\[1\] - 0x100 + "°C";  
    }  
    else  
    {  
        dev\_info.temperature = bytes\[1\] + "°C";  
    }  

    dev\_info.lorawan\_downlink\_count = bytes\[2\]&0x0f;  
    dev\_info.battery = (22+((bytes\[2\]>>4)&0x0f))/10 + "V";  
}  
if(port == 1)  
{  
    var restart\_reason = \["power\_restart","ble\_cmd\_restart","lorawan\_cmd\_restart","switch\_off\_mode\_restart"\];  
    dev\_info.pre\_restart\_reason = restart\_reason\[bytes\[3\]\];  

      
    ver\_major = (bytes\[4\]>>6)&0x03;  
    ver\_mijor = (bytes\[4\]>>4)&0x03;  
    ver\_patch = bytes\[4\]&0x0f;  
    dev\_info.ver = "V" + ver\_major+"."+ver\_mijor+"."+ver\_patch;  

    dev\_info.motion\_count = BytestoInt(bytes,5);  
}  
else if(port == 2)  
{  
    var  fix\_tech = \["wifi","ble","gps"\];  
    var parse\_len = 3; // common head is 3 byte  
    var datas = \[\];  
    tech = bytes\[parse\_len++\];  
    dev\_info.fix\_tech = fix\_tech\[tech\];  

    year = bytes\[parse\_len\]\*256 + bytes\[parse\_len+1\];  
    parse\_len += 2;  
    mon = bytes\[parse\_len++\];  
    days = bytes\[parse\_len++\];  
    hour = bytes\[parse\_len++\];  
    minute = bytes\[parse\_len++\];  
    sec = bytes\[parse\_len++\];  
    timezone = bytes\[parse\_len++\];  

    if(timezone>0x80)  
    {  
        dev\_info.utc\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" +  (timezone-0x100);  
    }  
    else  
    {  
        dev\_info.utc\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" + timezone;  
    }  
    datalen =  bytes\[parse\_len++\];  

    if(tech==0 || tech ==1)  
    {  
        for(var i=0 ; i<(datalen/7) ; i++)  
        {  
          var data = {};  
            data.mac = substringBytes(bytes, parse\_len, 6);  
            parse\_len += 6;  
            data.rssi = bytes\[parse\_len++\]-256 +"dBm";  
            datas.push(data);  
        }  
        dev\_info.mac\_data = datas;  
    }  
    else  
    {  
        lat =BytestoInt(bytes,parse\_len);  
        parse\_len += 4;  
        lon =BytestoInt(bytes,parse\_len);  
        parse\_len += 4;  

        if(lat>0x80000000)  
            lat = lat-0x100000000;  
        if(lon>0x80000000)  
            lon = lon-0x100000000;  

        dev\_info.latitude = lat/10000000;  
        dev\_info.longitude = lon/10000000;  
        dev\_info.altitude=0;  
        dev\_info.accuracy=3;  
        dev\_info.pdop = bytes\[parse\_len\] /10;  
    }  
}  
else if(port == 3)  
{  

    var fix\_false\_reason = \["wifi\_fix\_time\_timeout","wifi\_fix\_tech\_timeout","wifi\_module\_nofind","ble\_fix\_time\_timeout","ble\_fix\_tech\_timeout","ble\_adv","gps\_no\_budget","gps\_coarse\_acc\_timeout","gps\_fine\_acc\_timeout","gps\_fix\_timeout","gps\_assistnow\_timeout","gps\_cold\_start\_timeout","down\_request\_fix\_interrupt","motion\_start\_fix\_false\_by\_motion\_end","motion\_end\_fix\_false\_by\_motion\_start"\];  
    var parse\_len = 3;   
    var datas = \[\];  
    reason = bytes\[parse\_len++\];  
    dev\_info.fix\_false\_reason = fix\_false\_reason\[reason\];  
    datalen =  bytes\[parse\_len++\];  
    if(reason<=5) //wifi and ble reason  
    {  
      if(datalen)  
      {  
          for(var i=0 ; i<(datalen/7) ; i++)  
          {  
            var data = {};  
              data.mac = substringBytes(bytes, parse\_len, 6);  
              parse\_len += 6;  
              data.rssi = bytes\[parse\_len++\]-256 +"dBm";  
              datas.push(data);  
          }  
          dev\_info.mac\_data = datas;  
      }  
    }  
    else if(reason<=11) //gps reason  
    {      
        pdop = bytes\[parse\_len++\];  
        if(pdop!=0xff)  
            dev\_info.pdop = pdop/10  
        else  
            dev\_info.pdop = "unknow";  
        dev\_info.gps\_satellite\_cn = bytes\[parse\_len\] +"-" + bytes\[parse\_len+1\] +"-" + bytes\[parse\_len+2\] +"-" + bytes\[parse\_len+3\] ;  
    }  
}  
else if(port == 4)  
{  
    var sys\_close\_reason = \["ble\_cmd\_close","lorawan\_cmd\_close","reed\_switch\_close"\];  
    dev\_info.sys\_close\_reason = sys\_close\_reason\[bytes\[3\]\];  
}  
else if(port == 5)  
{  
    dev\_info.shake\_num = bytes\[3\]\*256+ bytes\[4\];  
}  
else if(port == 6)  
{  
    dev\_info.idle\_time = bytes\[3\]\*256+ bytes\[4\];  
}  
else if(port == 7)  
{  
    var parse\_len = 3; // common head is 3 byte  
    year = bytes\[parse\_len\]\*256 + bytes\[parse\_len+1\];  
    parse\_len += 2;  
    mon = bytes\[parse\_len++\];  
    days = bytes\[parse\_len++\];  
    hour = bytes\[parse\_len++\];  
    minute = bytes\[parse\_len++\];  
    sec = bytes\[parse\_len++\];  
    timezone = bytes\[parse\_len++\];  

    if(timezone>0x80)  
    {  
        dev\_info.alarm\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" +  (timezone-0x100);  
    }  
    else  
    {  
        dev\_info.alarm\_time =  year + "-" + mon + "-" + days + " " + hour + ":" + minute + ":" + sec + "  TZ:" + timezone;  
    }  
}  
else if(port == 8)  
{  
    var event = \["motion start","moving fix start","motion end","lorawan downlink trigger uplink"\];  
    dev\_info.event\_info = event\[bytes\[3\]\];  
}  
else if(port == 9)  
{  
    var parse\_len = 3;  
    dev\_info.gps\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.wifi\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.ble\_scan\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.ble\_adv\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    dev\_info.lorawan\_work\_time = BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
}  
else if(port == 10)  
{  
    //  
}  
else if(port == 11)  
{  
    //  
}  
else if(port == 12)  
{  

    dev\_info.work\_mode = dev\_mode\[bytes\[0\]&0x03\];  
    dev\_info.low\_power\_state = bytes\[0\]&0x04;  
    dev\_info.demolish\_state = bytes\[0\]&0x08;  
    dev\_info.idle\_state = bytes\[0\]&0x10;  
    dev\_info.motion\_state = bytes\[0\]&0x20;  
    dev\_info.fix\_type = dev\_fix\_type\[(bytes\[0\]>>6)&0x01\];  

    dev\_info.lorawan\_downlink\_count = bytes\[1\]&0x0f;  
    dev\_info.battery = (22+((bytes\[2\]>>4)&0x0f))/10 + "V";  

    var parse\_len = 2;  
    lat =BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  
    lon =BytestoInt(bytes,parse\_len);  
    parse\_len += 4;  

    if(lat>0x80000000)  
        lat = lat-0x100000000;  
    if(lon>0x80000000)  
        lon = lon-0x100000000;  

    dev\_info.latitude = lat/10000000 ;  
    dev\_info.longitude = lon/10000000;  
    dev\_info.altitude=0;  
    dev\_info.accuracy=3;  
    dev\_info.pdop = bytes\[parse\_len\]/10;  
}  
return dev\_info;  

}

Try to edit your map and display the variable “hotspot_0_location”.

This shows the last hotspot which received the tracker signal, it is not the tracker location.

I think it is time to me gave up of lora and helium, a gps tracker device that does not do the job, it is a joke, I’m not a java developer, just a normal guy.

Hi, jpsouza,

Yes, hotspot_0_location probably is the position of the closest hotspot.

So, look for “location” in your bucket. It’s the tracker position that TagoIO receives from Helium, if there is not a location or the location is not being updated, it seems that your hardware/network is not sending it to TagoIO.

I didn´t find the solution, this MOKO device does not work at all, total piece of crap, decoder does not have a location variable, only locates the hotspots LOL… changed to a Dragino and it worked flawlessly.