Hmmmm, I canāt get this script to work, I keep getting this error:
2022-09-05 22:46:56.613 [INFO ] [rulesupport.loader.ScriptFileWatcher] - Loading script '/etc/openhab/automation/jsr223/Afval.js'
2022-09-05 22:46:57.841 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - Error during evaluation of script 'file:/etc/openhab/automation/jsr223/Afval.js': /etc/openhab/automation/jsr223/Afval.js:48:1 Expected an operand but found const
All I did was copy the script, made a new file in automation/jsr233 (I donāt have any other folders under automation), pasted the script and configured the required fields, so not it looks like this:
/**
*
* Dit script bevat een JSRule die afval ophaaldata kan lezen van diverse afvalkalenders. De afvalkalenders worden
* twee maal per dag uitgelazen.
*
* Creƫer de volgende Items om met de afvalkalender te kunnen werken:
*
* Group gAfvalData "Afval ophaaldata" <calendar> (gTuin)
* DateTime AfvalData_gft "Groente, Fruit en Tuin [%1$ta %1$td/%1$tm]" <garbage_gft> (gAfvalData)
* DateTime AfvalData_papier "Papier [%1$ta %1$td/%1$tm]" <garbage_papier> (gAfvalData)
* DateTime AfvalData_restafval "Restafval [%1$ta %1$td/%1$tm]" <garbage_restafval> (gAfvalData)
* DateTime AfvalData_pmd "Plastic [%1$ta %1$td/%1$tm]" <garbage_pmd> (gAfvalData)
* DateTime AfvalData_kca "Chemisch [%1$ta %1$td/%1$tm]" <garbage_kca> (gAfvalData)
* DateTime AfvalData_volgendeDatum "Volgende afvalophaaldag [%1$ta %1$td/%1$tm]" <clock> (gAfvalData)
* String AfvalData_volgendeType "Volgende afvalophaalsoort" (gAfvalData)
*
* En pas daarna de onderstaande configuratie aan.
* Voor MijnAfvalwijzer zijn de volgende gegevens nodig:
* postcode, huisnummer, toevoeging en apikey
* Voor Afvalkalender zijn de volgende gegevens nodig:
* postcode, huisnummer, afvalKalenderUri
*
* Kies voor de Afvalkalender eventueel een afvalkalender uit de onderstaande lijst
*
* Cyclus NV: https://afvalkalender.cyclusnv.nl
* HVC: https://apps.hvcgroep.nl
* Dar: https://afvalkalender.dar.nl
* Afvalvrij / Circulus-Berkel: https://afvalkalender.circulus-berkel.nl
* Meerlanden: https://afvalkalender.meerlanden.nl
* Cure: https://afvalkalender.cure-afvalbeheer.nl
* Avalex: https://www.avalex.nl
* RMN: https://inzamelschema.rmn.nl
* Venray: https://afvalkalender.venray.nl
* Den Haag: https://huisvuilkalender.denhaag.nl
* Berkelland: https://afvalkalender.gemeenteberkelland.nl
* Alphen aan den Rijn: https://afvalkalender.alphenaandenrijn.nl
* Waalre: https://afvalkalender.waalre.nl
* ZRD: https://afvalkalender.zrd.nl
* Spaarnelanden: https://afvalwijzer.spaarnelanden.nl
* Montfoort: https://afvalkalender.montfoort.nl
* GAD: https://inzamelkalender.gad.nl
* Cranendonck: https://afvalkalender.cranendonck.nl
*
* Deze lijst is overgenomen uit: https://www.gadget-freakz.com/domoticz-dzvents-getgarbagedates-script/
*
*/
const logger = log('afvalkalender');
// const MijnAfvalWijzerConfig = {
// huisnummer: "41",
// toevoeging: '',
// postcode: "3825AL",
// apikey: "<voer-hier-de-apikey-in>"
// };
const AfvalkalenderConfig = {
huisnummer: "5",
postcode: "3769XW",
afvalkalenderUri: 'https://inzamelschema.rmn.nl'
};
//const CONFIG = MijnAfvalWijzerConfig;
const CONFIG = AfvalkalenderConfig;
//CONFIG.itemPrefix = "MijnEigenAfvalItem";
rules.JSRule({
name: "Afval ophaaldata updaten",
description: "Haal gegevens op uit de afvalwijzer en/of afvalkalender over ophalen van afval",
triggers: [
triggers.GenericCronTrigger('0 50 22 * * ?'),
triggers.GenericCronTrigger('0 30 19 * * ?')
],
execute: data => {
const { postcode, huisnummer, toevoeging } = CONFIG;
itemPrefix = CONFIG.itemPrefix ?? "AfvalData";
logger.debug(`Afval ophaaldata ophalen voor ${postcode}-${huisnummer}${toevoeging}`);
if ('afvalkalenderUri' in CONFIG && CONFIG.afvalkalenderUri)
pickupdates = getPickupdatesAfvalkalender(postcode, huisnummer, CONFIG.afvalkalenderUri);
else
pickupdates = getPickupdatesMijnafvalwijzer(postcode, huisnummer, toevoeging, CONFIG.apikey);
if (!pickupdates || pickupdates.length == 0) {
logger.warn(`Kon ophaaldata niet downloaden voor ${postcode}-${huisnummer}${toevoeging}`);
return;
}
processPickupdates(pickupdates, 'papier', 'oud papier', `${itemPrefix}_papier`);
processPickupdates(pickupdates, 'gft', 'groente-, fruit- en tuinafval', `${itemPrefix}_gft`);
processPickupdates(pickupdates, 'restafval', 'restafval', `${itemPrefix}_restafval`);
processPickupdates(pickupdates, 'pmd', 'plastic- en metaalafval en drinkkartons', `${itemPrefix}_pmd`);
processPickupdates(pickupdates, 'kca', 'klein chemisch afval', `${itemPrefix}_kca`);
setNextDateAndType(pickupdates, `${itemPrefix}_volgendeDatum`, `${itemPrefix}_volgendeType`);
}
});
class pickupDate {
constructor(date, type) {
this.date = date;
this.type = type;
}
}
function processPickupdates(dates, afvalType, afvalTypeDescription, item, now = undefined) {
if (!pickupdates || pickupdates.length == 0)
return;
const afvalTypeDates = dates.filter(d => d.type == afvalType).map(d => d.date);
if (afvalTypeDates.length == 0)
return;
if (now == undefined)
now = time.ZonedDateTime.now();
logger.debug(`Ophaaldata verwerken voor ${afvalType}: ${afvalTypeDescription} en Item ${item} on ${now}`);
if (items.getItem(item, true) == null) {
logger.warn(`Kan ophaaldata niet verwerken want Item ${item} bestaat niet`);
return;
}
const today = now.toLocalDate();
const tomorrow = today.plusDays(1);
let pickupDate = afvalTypeDates.find(d => !d.isBefore(today));
if (pickupDate == undefined)
pickupDate = afvalTypeDates.at(-1);
items.getItem(item).postUpdate(pickupDate.format(time.DateTimeFormatter.ISO_LOCAL_DATE));
const currentTime = now.toLocalTime();
if (today.isEqual(pickupDate) && currentTime.hour() <= 12) {
message = `Vandaag wordt het ${afvalTypeDescription} opgehaald.`;
logger.info(message);
actions.NotificationAction.sendBroadcastNotification(message);
}
else if (tomorrow.isEqual(pickupDate) && currentTime.hour() > 12) {
message = `Morgen wordt het ${afvalTypeDescription} opgehaald.`;
logger.info(message);
actions.NotificationAction.sendBroadcastNotification(message);
}
}
function setNextDateAndType(dates, nextDateItem, nextTypeItem, now=undefined)
{
if (items.getItem(nextDateItem, true) == null) {
logger.warn(`Kan volgende ophaaldatum niet verwerken want Item ${nextDateItem} bestaat niet`);
return;
}
if (items.getItem(nextTypeItem, true) == null) {
logger.warn(`Kan volgende ophaaldatum niet verwerken want Item ${nextTypeItem} bestaat niet`);
return;
}
now = now ?? time.ZonedDateTime.now();
const today = now.toLocalDate();
const sortedDates = dates.sort((d1, d2) => d1.date.compareTo(d2.date));
let nextDate = sortedDates.find(d => !d.date.isBefore(today));
if (nextDate == undefined)
nextDate = sortedDates.at(-1);
items.getItem(nextDateItem).postUpdate(nextDate.date.format(time.DateTimeFormatter.ISO_LOCAL_DATE));
items.getItem(nextTypeItem).postUpdate(nextDate.type);
}
function getJSONResponse(uri)
{
const result = actions.HTTP.sendHttpGetRequest(uri);
if (!result)
{
logger.warn(`Geen respons gekregen van ${uri}`);
return undefined;
}
try {
return JSON.parse(result);
}
catch (error)
{
logger.warn(`Kon respons van ${uri} niet naar JSON omzetten: ${error}`);
return undefined;
}
}
/**
* Gets pickup dates from different garbage collectors from mijnafvalwijzer.
*/
function getPickupdatesMijnafvalwijzer(postcode, huisnummer, toevoeging, apikey) {
const dateFormatter = time.DateTimeFormatter.ofPattern('yyyy-MM-dd');
const today = time.ZonedDateTime.now().format(dateFormatter);
const uri = `https://api.mijnafvalwijzer.nl/webservices/appsinput/?method=postcodecheck&street=&postcode=${postcode}&huisnummer=${huisnummer}&toevoeging=${toevoeging}&apikey=${apikey}&app_name=afvalwijzer&platform=phone&mobiletype=android&afvaldata=${today}&version=58&langs=nl`;
logger.debug(`Afvalwijzer URI: ${uri}`);
try {
const response = getJSONResponse(uri);
const ophaaldagen = response.ophaaldagen;
if (ophaaldagen.response !== 'OK')
{
logger.warn(`Ongeldige respons bij het downloaden van ophaaldata van ${uri}: ${pickupdates.error}`);
return undefined;
}
pickupdates = [];
return ophaaldagen.data.map(d => new pickupDate(time.LocalDate.parse(d.date, dateFormatter), d.type));
}
catch (error)
{
logger.warn(`Kon ophaaldata niet destileren uit respons van ${uri}: ${error}`);
return undefined;
}
}
/**
* Gets pickup dates from different garbage collectors from afvalkalender
*/
function getPickupdatesAfvalkalender(postcode, huisnummer, afvalkalenderUri) {
const uriAddress=`${afvalkalenderUri}/rest/adressen/${postcode}-${huisnummer}`;
const responseAddress = getJSONResponse(uriAddress);
if (!responseAddress) {
logger.warn(`Kon adresgegevens niet downloaden van ${uriAddress}`);
return undefined;
}
const bagId = responseAddress[0].bagId;
const uriPickupdates=`${afvalkalenderUri}/rest/adressen/${bagId}/afvalstromen`;
const responsePickupdates = getJSONResponse(uriPickupdates);
if (!responsePickupdates)
{
logger.warn(`Kon ophaaldata niet downloaden van ${uriPickupdates}`);
return undefined;
}
pickupdates = [];
return responsePickupdates
.filter(d => d.icon && d.ophaaldatum)
.map(d => new pickupDate(time.LocalDate.parse(d.ophaaldatum,time.DateTimeFormatter.ofPattern('yyyy-MM-dd')), d.icon === "rest" ? "restafval" : d.icon));
}
Any thoughts? Would love to let this work