Hello,
i got a Milesight UG65 Gateway to receive Lorawan Payloads from a heat meter.
The Gateway needs a payload decoder looks like that:
/**
* Payload Decoder for Chirpstack and Milesight network server
*
* Copyright 2022 Milesight IoT
*
* @product EM300-TH
* @params
* - fPort: 85
* - bytes: [0x01, 0x75, 0x64]
*/
function Decode(fPort, bytes) {
var decoded = {};
for (var i = 0; i < bytes.length;) {
var channel_id = bytes[i++];
var channel_type = bytes[i++];
// BATTERY
if (channel_id === 0x01 && channel_type === 0x75) {
decoded.battery = bytes[i];
i += 1;
}
// TEMPERATURE
else if (channel_id === 0x03 && channel_type === 0x67) {
// ℃
decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;
i += 2;
}
// HUMIDITY
else if (channel_id === 0x04 && channel_type === 0x68) {
decoded.humidity = bytes[i] / 2;
i += 1;
} else {
break;
}
}
return decoded;
}
/* ******************************************
* bytes to number
********************************************/
function readUInt16LE(bytes) {
var value = (bytes[1] << 8) + bytes[0];
return value & 0xffff;
}
function readInt16LE(bytes) {
var ref = readUInt16LE(bytes);
return ref > 0x7fff ? ref - 0x10000 : ref;
}
when i paste the Code and a Payload like this 03 67 AD 00 04 68 73
into this site https://tools.connect2lora.com/payload-decoder-ide/ the output is
{
“temperature”: 17.3,
“humidity”: 57.5
}
This is a working Payload Decoder from the Milesight Library.
Now i would like to create a Code for the Third Party Sensor i bought from Elvaco (CMI4140).
I got some code from Elvaco which works in “The ThingsNetwork” but not in my Milesight Gateway.
Here is the Code i got from Elvaco:
function readPlaintext(data) {
return String.fromCharCode.apply(null, data);
}
function readInt(bytes, data) {
return data.splice(0, bytes).reduce(function(a, v, i) {
return a | (v << (8*i));
}, 0) >>> 0;
}
function readBcd(digits, data) {
return data.splice(0, digits/2).reduce(function(a, v, i) {
var f = 1;
if ((v & 0xF0) == 0xF0) { f = -1; v = v & 0x0F; }
return f * (a + ((((v >> 4) & 0x0F) * 10) + (v & 0x0F)) * Math.pow(100, i));
}, 0);
}
function readDatetime(data) {
if (data[1] & 0x01) return "INVALID";
var year = 1900 + 100 * (data[1] >> 5);
year += ((data[3] >> 4) << 3) | (data[2] >> 5);
return year + "-" +
('0' + (data[3] & 0x0f)).substr(-2) + "-" +
('0' + (data[2] & 0x1f)).substr(-2) + "T" +
('0' + (data[1] & 0x1f)).substr(-2) + ":" +
('0' + (data[0] & 0x7f)).substr(-2) + "Z";
}
function scaledValue(v, e, u, o) {
return {
p: function(d, s, r) { return r(d) * Math.pow(10, v + o); }
};
}
function hexBytes() {
return { p: function(d) {
return '0x' + d.map(function(b) {
return ('0' + (b & 0xFF).toString(16)).slice(-2);
}).join('');
} };
}
function scaledUnit(v, e, u, o) {
var prefix = "";
var scale = v + (!isNaN(o) ? o : 0);
// Determine units based on VIF scaling only
if (scale >= 9){
scale -= 9;
prefix = "G";
} else if (scale >= 6) {
scale -= 6;
prefix = "M";
} else if (scale >= 3) {
scale -= 3;
prefix = "k";
}
// Check for VIF extensions modifying the scale of the value
for (var i = 0; i < e.length; i++) {
if (e[i] >= 0x70 && e[i] < 0x78) {
scale += (e[i] & 0x07) - 6;
break;
}
}
if (e.indexOf(0x7D) >= 0) scale += 3;
return {
p: function(d, s, r) { return r(d) * Math.pow(10, scale); },
u: prefix + u
};
}
function pfttParser(v, e) {
return { p: function(d) {
var ft = readInt(2, d) * 0.01;
var rt = readInt(2, d) * 0.01;
var flow = readInt(2, d) * Math.pow(10, (e[3] & 0x0F) - 6);
var power = readInt(2, d) * Math.pow(10, (e[3] & 0xF0 >> 4) - 3);
return {
ft: ft, ftUnit: '°C',
rt: rt, rtUnit: '°C',
flow: flow, flowUnit: 'm³/h',
power: power, powerUnit: 'W'
};
} };
}
function miefParser() {
return { p: function(d, s, r) {
var meterIdDigits = s == 8 || s == 6 ? 8 : 16;
return {
errorflags: '0x' + d.splice(0, d.length - (meterIdDigits/2))
.map(function (b) {
return ('0' + (b & 0xFF).toString(16)).slice(-2);
}).join(''),
meterid: readBcd(meterIdDigits, d)
};
} };
}
function onTimeUnit(v) {
return {
u: ["seconds", "minutes", "hours", "days"][v],
p: function(d, s, r) { return r(d); },
};
}
function dateTimeParser() {
return { p: function(d, s) {
if (s == 4) {
return readDatetime(d);
} else if (s == 2) {
return readDate(d);
}
} };
}
function passthroughParser() {
return { p: function(d, s, r) { return r(d); } };
}
function parseVifBytes(vif, vife) {
var vifs = {
251: [
{ k: 5, b: 0x7e, v: 0x0, u: "MWh", p: scaledValue, pa: [-1] },
{ k: 5, b: 0x7e, v: 0x8, u: "GJ", p: scaledValue, pa: [-1] },
{ k: 5, b: 0x7c, v: 0xc, u: "MCal", p: scaledValue, pa: [-1] },
{ k: 6, b: 0x7e, v: 0x10, u: "m³", p: scaledValue, pa: [2] },
{ k: 90, b: 0x7e, v: 0x1a, u: "%", p: scaledValue, pa: [-1] },
{ k: 6, b: 0x7f, v: 0x20, u: "feet³", p: scaledValue, pa: [0] },
{ k: 6, b: 0x7f, v: 0x21, u: "feet³", p: scaledValue, pa: [-1] },
{ k: 10, b: 0x7e, v: 0x28, u: "MW", p: scaledValue, pa: [-1] },
{ k: 10, b: 0x7e, v: 0x30, u: "GJ/h", p: scaledValue, pa: [-1] }
],
253: [
{ k: 4, b: 0x7f, v: 0x17, u: undefined, p: hexBytes, pa: [] }
],
255: [
{ k: 0, b: 0x7f, v: 0x7, u: "m³ * °C", p: scaledUnit, pa: [0] },
{ k: 1, b: 0x7f, v: 0x8, u: "m³ * °C", p: scaledUnit, pa: [0] },
{ k: 2, b: 0x7f, v: 0x20, u: undefined, p: pfttParser, pa: [] },
{ k: 3, b: 0x7f, v: 0x21, u: undefined, p: miefParser, pa: [] }
],
p: [
{ k: 5, b: 0x78, v: 0x0, u: "Wh", p: scaledUnit, pa: [-3] },
{ k: 5, b: 0x78, v: 0x8, u: "J", p: scaledUnit, pa: [0] },
{ k: 6, b: 0x78, v: 0x10, u: "m³", p: scaledValue, pa: [-6] },
{ k: 8, b: 0x7c, v: 0x20, u: undefined, p: onTimeUnit, pa: [] },
{ k: 10, b: 0x78, v: 0x28, u: "W", p: scaledUnit, pa: [-3] },
{ k: 10, b: 0x78, v: 0x30, u: "J/h", p: scaledUnit, pa: [0] },
{ k: 11, b: 0x78, v: 0x38, u: "m³/h", p: scaledValue, pa: [-6] },
{ k: 14, b: 0x7c, v: 0x58, u: "°C", p: scaledValue, pa: [-3] },
{ k: 15, b: 0x7c, v: 0x5c, u: "°C", p: scaledValue, pa: [-3] },
{ k: 17, b: 0x7c, v: 0x64, u: "°C", p: scaledValue, pa: [-3] },
{ k: 20, b: 0x7f, v: 0x6d, u: undefined, p: dateTimeParser, pa: [] },
{ k: 26, b: 0x7f, v: 0x78, u: undefined, p: passthroughParser, pa: [] },
{ k: 27, b: 0x7f, v: 0x79, u: undefined, p: passthroughParser, pa: [] }
],
};
function checkTable(b, k) {
for (var i = 0; i < vifs[k].length; i++) {
var item = vifs[k][i];
if ((b & item.b) == item.v) {
var obj = { k: item.k, u: item.u };
var repl = item.p.apply(null,
[b & ~item.b & 0x7F, vife, item.u].concat(item.pa));
for (var x in repl) { obj[x] = repl[x]; }
return obj;
}
}
}
var entry = {};
if (vif == 253) { entry = checkTable(vife[0], 253); }
else if (vif == 251) { entry = checkTable(vife[0], 251); }
else if (vif == 255) { entry = checkTable(vife[0], 255); }
else { entry = checkTable(vif, 'p'); }
var manSpec = vife.indexOf(0xFF);
if (manSpec >= 0) {
entry.m = vife.slice(manSpec+1);
}
return entry;
}
function parseDibs(data) {
var dibs = [];
while (data.length > 0) {
var dif = data.shift();
var error = (dif & 0x30) == 0x30;
var b;
if ((dif & 0x0F) == 0x0F) {
if (dif == 0x0F || dif == 0x1F) break;
continue;
}
var storagenumber = (dif & 0x40) >> 6;
var ext = (dif & 0x80) == 0x80;
var dife = [];
while (ext && dife.length < 10) {
b = data.shift();
ext = (b & 0x80) == 0x80;
storagenumber |= (b & 0x0F) << ((dife.length * 4) + 1);
dife.push(b);
}
var datatype = dif & 0x0F;
var datasize = [0,1,2,3,4,4,5,8,1,1,2,3,4,0,6][datatype];
var vif = data.shift();
var vext = (vif & 0x80) == 0x80;
var vife = [];
while (vext && vife.length < 10) {
b = data.shift();
vext = (b & 0x80) == 0x80;
vife.push(b);
}
var reader = function(a) { return a; };
if ((datatype > 0 && datatype < 5) || datatype == 6) {
reader = readInt.bind(null, datatype);
} else if (datatype == 7) {
reader = readInt.bind(null, 8);
} else if (datatype > 8 && datatype < 13) {
reader = readBcd.bind(null, (datatype - 8)*2);
} else if (datatype == 14) {
reader = readBcd.bind(null, 12);
}
var vifData = parseVifBytes(vif, vife);
if ((dif & 0x0F) == 13) {
b = data.shift();
if (b <= 0xBF) {
datasize = b;
reader = readPlaintext;
} else if (b >= 0xC0 && b <= 0xC9) {
datasize = (b - 0xC0);
reader = readBcd.bind(null, datasize*2);
} else if (b >= 0xD0 && b <= 0xD9) {
datasize = (b - 0xD0);
reader = readBcd.bind(null, datasize*2);
} else if (b >= 0xE0 && b <= 0xEF) {
datasize = (b - 0xE0);
reader = readInt.bind(null, datasize);
} else if (b >= 0xF0 && b <= 0xF4) {
datasize = 4*(b - 0xEC);
reader = readInt.bind(null, datasize);
} else if (b == 0xF5) {
datasize = 48;
reader = readInt.bind(null, datasize);
} else if (b == 0xF6) {
datasize = 64;
reader = readInt.bind(null, datasize);
}
}
var value = vifData.p(data.splice(0, datasize), datasize, reader);
dibs.push({
key: vifData.k,
value: value,
unit: vifData.u,
error: error,
manufacturer: vifData.m,
storagenumber: storagenumber,
});
}
return dibs;
}
function findDib(p, dibs) {
if (typeof p != "object") { p = { key: p }; }
function compareObj(a, b) {
return Object.keys(a).every(function(k) {
if (typeof a[k] == "object") {
if (typeof b[k] == "object") { return compareObj(a[k], b[k]); }
else { return false; }
} else { return a[k] == b[k]; }
});
}
for (var i = 0; i < dibs.length; i++) {
if (compareObj(p, dibs[i])) {
return dibs[i];
}
}
return {};
}
function transpile0(data) {
var dibs = parseDibs(data);
var et = findDib(17, dibs);
var rh = findDib(90, dibs);
return {
T: et.error ? null : et.value,
H: rh.error ? null : rh.value,
};
}
function transpile1(data) {
var temp = readInt(2, data) * 0.01;
var humidity = readInt(1, data);
return {
T: temp,
H: humidity,
};
}
function transpile2(data) {
return JSON.parse(readPlaintext(data));
}
function transpile3(data) {
var dibs = parseDibs(data);
var ts = findDib(20, dibs);
return {
TS: ts.value,
};
}
function transpile4(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var volume = findDib(6, dibs);
var power = findDib(10, dibs);
var volumeflow = findDib(11, dibs);
var ft = findDib(14, dibs);
var rt = findDib(15, dibs);
var meterid = findDib(26, dibs);
var ef = findDib(4, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
ID: meterid.error ? null : meterid.value,
P: power.error ? null : power.value,
PU: power.error ? null : power.unit,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
F: volumeflow.error ? null : volumeflow.value,
FU: volumeflow.error ? null : volumeflow.unit,
FT: ft.error ? null : ft.value,
FTU: ft.error ? null : ft.unit,
RT: rt.error ? null : rt.value,
RTU: rt.error ? null : rt.unit,
EF: ef.value,
};
}
function transpile5(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var meterid = findDib(26, dibs);
var ef = findDib(4, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
ID: meterid.error ? null : meterid.value,
EF: ef.value,
};
}
function transpile6(data) {
function nonSiUnits(d) {
if (d.error) { return { unit: null, value: null }; }
else if (d.unit == "kWh") { return { unit: "MWh", value: d.value * 0.001 }; }
else if (d.unit == "MJ") { return { unit: "GJ", value: d.value * 0.001 }; }
return d;
}
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var meterid = findDib(26, dibs);
var ef = findDib(4, dibs);
var ts = findDib(20, dibs);
var midnight = findDib({key: "5", storagenumber: 1}, dibs);
return {
E: nonSiUnits(energy).value,
U: nonSiUnits(energy).unit,
TS: ts.error ? null : ts.value,
ID: meterid.error ? null : meterid.value,
EF: ef.value,
ME: nonSiUnits(midnight).value,
MEU: nonSiUnits(midnight).unit,
};
}
function transpile7(data) {
function nonSiUnits(d) {
if (d.error) { return { unit: null, value: null }; }
else if (d.unit == "kWh") { return { unit: "MWh", value: d.value * 0.001 }; }
else if (d.unit == "MJ") { return { unit: "GJ", value: d.value * 0.001 }; }
return d;
}
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var volume = findDib(6, dibs);
var power = findDib(10, dibs);
var flow = findDib(11, dibs);
var ft = findDib(14, dibs);
var rt = findDib(15, dibs);
var id = findDib(26, dibs);
var ts = findDib(20, dibs);
var ef = findDib(4, dibs);
return {
E: nonSiUnits(energy).value,
U: nonSiUnits(energy).unit,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
P: power.error ? null : power.value,
PU: power.error ? null : power.unit,
F: flow.error ? null : flow.value,
FU: flow.error ? null : flow.unit,
FT: ft.error ? null : ft.value,
TU: ft.error ? null : ft.unit,
RT: rt.error ? null : rt.value,
RU: rt.error ? null : rt.unit,
EF: ef.value,
TS: ts.error ? null : ts.value,
ID: id.value,
};
}
function transpile8(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var volume = findDib(6, dibs);
var meterid = findDib(27, dibs);
var ef = findDib(4, dibs);
var ts = findDib(20, dibs);
var midnight = findDib({key: "5", storagenumber: 1}, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
TS: ts.error ? null : ts.value,
ID: meterid.error ? null : meterid.value,
EF: ef.value,
ME: midnight.error ? null : midnight.value,
MEU: midnight.error ? null : midnight.unit,
};
}
function transpile9(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var volume = findDib(6, dibs);
var pftt = findDib(2, dibs);
var mief = findDib(3, dibs);
var ts = findDib(20, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
TS: ts.error ? null : ts.value,
ID: mief.error ? null : (mief.value||{}).meterid,
EF: mief.error ? null : (mief.value||{}).errorflags,
P: pftt.error ? null : (pftt.value||{}).power,
PU: pftt.error ? null : (pftt.value||{}).powerUnit,
F: pftt.error ? null : (pftt.value||{}).flow,
FU: pftt.error ? null : (pftt.value||{}).flowUnit,
FT: pftt.error ? null : (pftt.value||{}).ft,
FTU: pftt.error ? null : (pftt.value||{}).ftUnit,
RT: pftt.error ? null : (pftt.value||{}).rt,
RTU: pftt.error ? null : (pftt.value||{}).rtUnit,
};
}
function transpile10(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var secEnergy = findDib({key: "5", manufacturer: [2]}, dibs);
var volume = findDib(6, dibs);
var flow = findDib(14, dibs);
var rt = findDib(15, dibs);
var meterid = findDib(27, dibs);
var ef = findDib(4, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
SE: secEnergy.error ? null : secEnergy.value,
SEU: secEnergy.error ? null : secEnergy.unit,
ID: meterid.error ? null : meterid.value,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
F: flow.error ? null : flow.value,
FU: flow.error ? null : flow.unit,
RT: rt.error ? null : rt.value,
RTU: rt.error ? null : rt.unit,
EF: ef.value,
};
}
function transpile11(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var meterid = findDib(26, dibs);
var ef = findDib(4, dibs);
var poserr = findDib({key: "5", manufacturer: [3]}, dibs);
var prevmonth = findDib({key: "5", storagenumber: 2}, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
ID: meterid.error ? null : meterid.value,
EF: ef.value,
EP: poserr.error ? null : poserr.value,
EPU: poserr.error ? null : poserr.unit,
PM: prevmonth.error ? null : prevmonth.value,
PMU: prevmonth.error ? null : prevmonth.unit,
};
}
function transpile12(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var meterid = findDib(26, dibs);
var ef = findDib(4, dibs);
var poserr = findDib({key: "5", manufacturer: [3]}, dibs);
var missingts = findDib(8, dibs);
var maxft = findDib(14, dibs);
var maxrt = findDib(15, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
ID: meterid.error ? null : meterid.value,
EF: ef.value,
EP: poserr.error ? null : poserr.value,
EPU: poserr.error ? null : poserr.unit,
MTS: missingts.value,
MTSU: missingts.unit,
MFT: maxft.error ? null : maxft.value,
MTU: maxft.error ? null : maxft.unit,
MRT: maxrt.error ? null : maxrt.value,
MRU: maxrt.error ? null : maxrt.unit,
};
}
function transpile13(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var volume = findDib(6, dibs);
var power = findDib(10, dibs);
var flow = findDib(11, dibs);
var ft = findDib(14, dibs);
var rt = findDib(15, dibs);
var meterid = findDib(26, dibs);
var ef = findDib(4, dibs);
var poserr = findDib({key: "5", manufacturer: [3]}, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
P: power.error ? null : power.value,
PU: power.error ? null : power.unit,
F: flow.error ? null : flow.value,
FU: flow.error ? null : flow.unit,
FT: ft.error ? null : ft.value,
TU: ft.error ? null : ft.unit,
RT: rt.error ? null : rt.value,
RU: rt.error ? null : rt.unit,
ID: meterid.error ? null : meterid.value,
EF: ef.value,
EP: poserr.error ? null : poserr.value,
EPU: poserr.error ? null : poserr.unit,
};
}
function transpile14(data) {
var dibs = parseDibs(data);
var energy = findDib(5, dibs);
var secEnergy = findDib({key: "5", manufacturer: [2]}, dibs);
var volume = findDib(6, dibs);
var mief = findDib(3, dibs);
var e8 = findDib(0, dibs);
var e9 = findDib(1, dibs);
return {
E: energy.error ? null : energy.value,
U: energy.error ? null : energy.unit,
SE: secEnergy.error ? null : secEnergy.value,
SEU: secEnergy.error ? null : secEnergy.unit,
V: volume.error ? null : volume.value,
VU: volume.error ? null : volume.unit,
ID: mief.error ? null : mief.value.meterid,
EF: mief.error ? null : mief.value.errorflags,
E8: e8.error ? null : e8.value,
E8U: e8.error ? null : e8.unit,
E9: e9.error ? null : e9.value,
E9U: e9.error ? null : e9.unit,
};
}
function Decoder(data) {
var fmt = data.shift();
if (fmt === 0) {
if (data.length > 20) { return transpile4(data); }
else { return transpile0(data); }
}
else if (fmt === 1) {
if (data.length > 15) { return transpile5(data); }
else { return transpile1(data); }
}
else if (fmt === 2) {
if (data.length > 15) { return transpile2(data); }
else { return transpile2(data); }
}
else if (fmt === 250) { return transpile3(data); }
else if (fmt === 3) { return transpile6(data); }
else if (fmt === 4) { return transpile7(data); }
else if (fmt === 250) { return transpile3(data); }
else if (fmt === 5) { return transpile4(data); }
else if (fmt === 6) { return transpile5(data); }
else if (fmt === 7) { return transpile2(data); }
else if (fmt === 8) { return transpile8(data); }
else if (fmt === 9) { return transpile9(data); }
else if (fmt === 10) { return transpile10(data); }
else if (fmt === 11) { return transpile11(data); }
else if (fmt === 12) { return transpile12(data); }
else if (fmt === 13) { return transpile13(data); }
else if (fmt === 250) { return transpile3(data); }
else if (fmt === 15) { return transpile4(data); }
else if (fmt === 16) { return transpile5(data); }
else if (fmt === 17) { return transpile2(data); }
else if (fmt === 18) { return transpile8(data); }
else if (fmt === 19) { return transpile9(data); }
else if (fmt === 20) { return transpile10(data); }
else if (fmt === 250) { return transpile3(data); }
else if (fmt === 21) { return transpile4(data); }
else if (fmt === 22) { return transpile5(data); }
else if (fmt === 23) { return transpile2(data); }
else if (fmt === 24) { return transpile8(data); }
else if (fmt === 25) { return transpile9(data); }
else if (fmt === 26) { return transpile10(data); }
else if (fmt === 27) { return transpile14(data); }
else if (fmt === 250) { return transpile3(data); }
else if (fmt === 30) { return transpile4(data); }
else if (fmt === 31) { return transpile5(data); }
else if (fmt === 32) { return transpile2(data); }
else if (fmt === 33) { return transpile8(data); }
else if (fmt === 34) { return transpile9(data); }
else if (fmt === 35) { return transpile10(data); }
else if (fmt === 250) { return transpile3(data); }
data.unshift(fmt);
return { error: "unknown format", data: data };
}
and a Payload from the Elvaco Sensor:
15040040ec08340412dcb21c13022bd417023b010402599527025d79250c781461998004fd1700000000
From the linked site from above i got no Output on that Code.
Can Someone help me to get this running?
Thank you a lot