I built a widget for informing about a storm nearby. It using some Polish SOAP service (http://burze.dzis.net), but should work for most of Europe (just replace coords). And… you need API key.
async function fetchData(position) {
const DDtoDM = (coord) => {
const coordInt = Math.floor(coord)
return coordInt + (coord - coordInt) * 0.6;
}
const KEY = 'KEY_KEY_KEY';
const RADIUS = '12'; //km
const stormURL = 'https://burze.dzis.net/soap.php';
const requestXML = `
<soapenv:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:soap='https://burze.dzis.net/soap.php'>
<soapenv:Header/>
<soapenv:Body>
<soap:szukaj_burzy soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
<y xsi:type='xsd:string'>${DDtoDM(position.longitude).toFixed(2)}</y>
<x xsi:type='xsd:string'>${DDtoDM(position.latitude).toFixed(2)}</x>
<promien xsi:type='xsd:int'>${RADIUS}</promien>
<klucz xsi:type='xsd:string'>${KEY}</klucz>
</soap:szukaj_burzy>
</soapenv:Body>
</soapenv:Envelope>
`;
console.warn(requestXML);
const req = new Request(stormURL);
req.method = 'POST';
req.headers = {
'Content-Type': 'text/xml',
'SOAPAction': '\'https://burze.dzis.net/soap.php\''
};
req.body = requestXML;
const response = await req.loadString();
console.warn(response);
const parser = new XMLParser(response);
var processedItem = '';
var returned = {
liczba: -1,
odleglosc: -1,
kierunek: 'n/a',
okres: '0',
}
parser.didStartElement = (name) => {
processedItem = name;
}
parser.foundCharacters = (value) => {
switch (processedItem) {
case 'liczba':
returned.liczba = parseInt(value, 10);
break;
case 'odleglosc':
returned.odleglosc = parseInt(value, 10);
break;
case 'kierunek':
returned.kierunek = value;
break;
case 'okres':
returned.okres = parseInt(value, 10);
break;
}
}
parser.didEndElement = (name) => {
processedItem = '';
}
parser.parse();
console.warn(returned);
return returned;
}
function createWidget(position, data) {
let addressString = position.name;
let headlineString = "No storms";
let detailsString = "—";
if (data.odleglosc > 0) {
headlineString = "Storm nearby!";
detailsString = `${data.liczba} strikes from ${data.kierunek} in last ${data.okres} min. Closest in ${data.odleglosc} km.`;
}
const w = new ListWidget();
w.backgroundColor = new Color("#20504F");
w.centerAlignContent();
const headline = w.addText(headlineString);
headline.applyHeadlineTextStyling();
headline.textColor = new Color("#fff");
const details = w.addText(detailsString);
details.applyBodyTextStyling();
details.textColor = new Color("#fff");
const address = w.addText(addressString);
address.applyBodyTextStyling();
address.textColor = new Color("#fff");
w.presentSmall();
return w;
}
const run = async (getPosition, getData, onFinish) => {
const position = await getPosition();
const data = await getData(position);
onFinish(position, data);
};
const getStaticPosition = () => {
return {
longitude: 51.00,
latitude: 18.00,
name: 'Home',
}
};
await run(
getStaticPosition,
fetchData,
(position, data) => Script.setWidget(createWidget(position, data)),
);