Hallo,
hier mein Script zum automatischen abholen der Mülltermine der AWG
Vielleicht kann es ja jemand gebrauchen.
LG bazidibavaria
/*
AWG Mülltonnen Termine
Author: bazidibavaria - 2020-03-18
Version 0.1
*/
// Ort, Straße bitte wie auf der Webseite hinterlegen
// --CONFIG------------------------------
var city = "";
var street = "";
var housenumber = "";
// ------------------------------CONFIG--
var DataUrl = "https://wastemanagement.awg.de/WasteManagementDonauwald/WasteManagementServlet";
var WasteDisposalUrl = "wasteDisposal.url";
var WasteDisposalLastRun = "wasteDisposal.lastRun";
var WasteDisposalError = "wasteDisposal.error";
var WasteNextDate = "wasteDisposal.next.date";
var WasteNextDateFormat = "wasteDisposal.next.dateformat";
var WasteNextDaysLeft = "wasteDisposal.next.daysleft";
var WasteNextTypes = "wasteDisposal.next.types";
var WasteNextTypesText = "wasteDisposal.next.typestext";
var WasteNextWeekday = "wasteDisposal.next.weekday";
var WasteNextWeekdayText = "wasteDisposal.next.weekdaytext";
var WasteTypeRestmuellDaysLeft = "wasteDisposal.type.Restmuell.daysleft";
var WasteTypeRestmuellNextDate = "wasteDisposal.type.Restmuell.nextdate";
var WasteTypeRestmuellNextDateFormat = "wasteDisposal.type.Restmuell.nextdateformat";
var WasteTypeRestmuellNextWeekday = "wasteDisposal.type.Restmuell.nextweekday";
var WasteTypeRestmuellNextWeekdayText = "wasteDisposal.type.Restmuell.nextweekdaytext";
var WasteTypeRestmuellImage = "wasteDisposal.type.Restmuell.image";
var WasteTypeRestmuellContainerDaysLeft = "wasteDisposal.type.RestmuellContainer.daysleft";
var WasteTypeRestmuellContainerNextDate = "wasteDisposal.type.RestmuellContainer.nextdate";
var WasteTypeRestmuellContainerNextDateFormat = "wasteDisposal.type.RestmuellContainer.nextdateformat";
var WasteTypeRestmuellContainerNextWeekday = "wasteDisposal.type.RestmuellContainer.nextweekday";
var WasteTypeRestmuellContainerNextWeekdayText = "wasteDisposal.type.RestmuellContainer.nextweekdaytext";
var WasteTypeRestmuellContainerImage = "wasteDisposal.type.RestmuellContainer.image";
var WasteTypePapierDaysLeft = "wasteDisposal.type.Papier.daysleft";
var WasteTypePapierNextDate = "wasteDisposal.type.Papier.nextdate";
var WasteTypePapierNextDateFormat = "wasteDisposal.type.Papier.nextdateformat";
var WasteTypePapierNextWeekday = "wasteDisposal.type.Papier.nextweekday";
var WasteTypePapierNextWeekdayText = "wasteDisposal.type.Papier.nextweekdaytext";
var WasteTypePapierImage = "wasteDisposal.type.Papier.image";
var WasteTypePapierContainerDaysLeft = "wasteDisposal.type.PapierContainer.daysleft";
var WasteTypePapierContainerNextDate = "wasteDisposal.type.PapierContainer.nextdate";
var WasteTypePapierContainerNextDateFormat = "wasteDisposal.type.PapierContainer.nextdateformat";
var WasteTypePapierContainerNextWeekday = "wasteDisposal.type.PapierContainer.nextweekday";
var WasteTypePapierContainerNextWeekdayText = "wasteDisposal.type.PapierContainer.nextweekdaytext";
var WasteTypePapierContainerImage = "wasteDisposal.type.PapierContainer.image";
var WasteTypeBioDaysLeft = "wasteDisposal.type.Bio.daysleft";
var WasteTypeBioNextDate = "wasteDisposal.type.Bio.nextdate";
var WasteTypeBioNextDateFormat = "wasteDisposal.type.Bio.nextdateformat";
var WasteTypeBioNextWeekday = "wasteDisposal.type.Bio.nextweekday";
var WasteTypeBioNextWeekdayText = "wasteDisposal.type.Bio.nextweekdaytext";
var WasteTypeBioImage = "wasteDisposal.type.Bio.image";
var validTypes = ["Restmuell", "RestmuellContainer", "Papier", "PapierContainer", "Bio"];
createState(WasteDisposalUrl, DataUrl, {name:'data url',type:"string",write:false,role:"text.url"});
createState(WasteDisposalLastRun, {name:'last run',type:"string",write:false,role:"date.start"});
createState(WasteDisposalError,false,{name:'error',def:false,type:"boolean",write:false,role:"indicator"});
createState(WasteNextDate, {name:'next day',type:"string",write:false,role:"date.start"});
createState(WasteNextDateFormat, "01.01.1970", {name:'next day formated',type:"string",write:false,role:"text"});
createState(WasteNextDaysLeft, 0, {name:'days left',def:0,type:"number",min:0,max:365,unit:"days",write:false,role:"value"});
createState(WasteNextTypes, [], {name:'next types',type:"array",write:false,role:"list"});
createState(WasteNextTypesText, "", {name:'next types as text',type:"string",write:false,role:"text"});
createState(WasteNextWeekday, -1 , {name:'next weekday',def:-1,type:"number",min:-1,max:6,write:false,role:"value"});
createState(WasteNextWeekdayText, "", {name:'next weekday as text',type:"string",write:false,role:"text"});
createState(WasteTypeRestmuellDaysLeft, 0, {name:'days left',def:0,type:"number",min:0,max:365,unit:"days",write:false,role:"value"});
createState(WasteTypeRestmuellNextDate, {name:'date',type:"string",write:false,role:"date.start"});
createState(WasteTypeRestmuellNextDateFormat, "01.01.1970", {name:'day formated',type:"string",write:false,role:"text"});
createState(WasteTypeRestmuellNextWeekday, -1, {name:'weekday',def:-1,type:"number",min:-1,max:6,write:false,role:"value"});
createState(WasteTypeRestmuellNextWeekdayText, "", {name:'weekday as text',type:"string",write:false,role:"text"});
createState(WasteTypeRestmuellImage, "https://wastemanagement.awg.de/WasteManagementDonauwald/content/Restmuelltonnefreigestellt.gif", {name:'type image',type:"string",write:false,role:"text.url"});
createState(WasteTypeRestmuellContainerDaysLeft, 0, {name:'days left',def:0,type:"number",min:0,max:365,unit:"days",write:false,role:"value"});
createState(WasteTypeRestmuellContainerNextDate, {name:'date',type:"string",write:false,role:"date.start"});
createState(WasteTypeRestmuellContainerNextDateFormat, "01.01.1970", {name:'day formated',type:"string",write:false,role:"text"});
createState(WasteTypeRestmuellContainerNextWeekday, -1, {name:'weekday',def:-1,type:"number",min:-1,max:6,write:false,role:"value"});
createState(WasteTypeRestmuellContainerNextWeekdayText, "", {name:'weekday as text',type:"string",write:false,role:"text"});
createState(WasteTypeRestmuellContainerImage, "https://wastemanagement.awg.de/WasteManagementDonauwald/content/1100-Restfreigestellt.gif", {name:'type image',type:"string",write:false,role:"text.url"});
createState(WasteTypePapierDaysLeft, 0, {name:'days left',def:0,type:"number",min:0,max:365,unit:"days",write:false,role:"value"});
createState(WasteTypePapierNextDate, {name:'date',type:"string",write:false,role:"date.start"});
createState(WasteTypePapierNextDateFormat, "01.01.1970", {name:'day formated',type:"string",write:false,role:"text"});
createState(WasteTypePapierNextWeekday, -1, {name:'weekday',def:-1,type:"number",min:-1,max:6,write:false,role:"value"});
createState(WasteTypePapierNextWeekdayText, "", {name:'weekday as text',type:"string",write:false,role:"text"});
createState(WasteTypePapierImage, "https://wastemanagement.awg.de/WasteManagementDonauwald/content/papiertonnefreigestellt.gif", {name:'type image',type:"string",write:false,role:"text.url"});
createState(WasteTypePapierContainerDaysLeft, 0, {name:'days left',def:0,type:"number",min:0,max:365,unit:"days",write:false,role:"value"});
createState(WasteTypePapierContainerNextDate, {name:'date',type:"string",write:false,role:"date.start"});
createState(WasteTypePapierContainerNextDateFormat, "01.01.1970", {name:'day formated',type:"string",write:false,role:"text"});
createState(WasteTypePapierContainerNextWeekday, -1, {name:'weekday',def:-1,type:"number",min:-1,max:6,write:false,role:"value"});
createState(WasteTypePapierContainerNextWeekdayText, "", {name:'weekday as text',type:"string",write:false,role:"text"});
createState(WasteTypePapierContainerImage, "https://wastemanagement.awg.de/WasteManagementDonauwald/content/1001-Papierfreigestellt.gif", {name:'type image',type:"string",write:false,role:"text.url"});
createState(WasteTypeBioDaysLeft, 0, {name:'days left',def:0,type:"number",min:0,max:365,unit:"days",write:false,role:"value"});
createState(WasteTypeBioNextDate, {name:'date',type:"string",write:false,role:"date.start"});
createState(WasteTypeBioNextDateFormat, "01.01.1970", {name:'day formated',type:"string",write:false,role:"text"});
createState(WasteTypeBioNextWeekday, -1, {name:'weekday',def:-1,type:"number",min:-1,max:6,write:false,role:"value"});
createState(WasteTypeBioNextWeekdayText, "", {name:'weekday as text',type:"string",write:false,role:"text"});
createState(WasteTypeBioImage, "https://wastemanagement.awg.de/WasteManagementDonauwald/content/biotonnefreigestellt.gif", {name:'type image',type:"string",write:false,role:"text.url"});
// Schedule für die Updates
schedule("0 16 * * *", Muellabfuhr);
// Skript ausführen
Muellabfuhr();
function Muellabfuhr() {
setState(WasteDisposalUrl, DataUrl);
request(DataUrl, function (error, response, body) {
if (!error && response.statusCode == 200) {
var ApplicationName = "";
var findApplicationName = /ID="ApplicationName" VALUE="([^"]+)"/i;
var matchApplicationName = findApplicationName.exec(body);
if(matchApplicationName != null && matchApplicationName.length == 2){
ApplicationName = matchApplicationName[1];
}
var SessionId = "";
var findSessionId = /ID="SessionId" VALUE="([^"]+)"/i;
var matchSessionId = findSessionId.exec(body);
if(matchSessionId != null && matchSessionId.length == 2){
SessionId = matchSessionId[1];
}
var Build = "";
var findBuild = /ID="Build" VALUE="([^"]+)"/i;
var matchBuild = findBuild.exec(body);
if(matchBuild != null && matchBuild.length == 2){
Build = matchBuild[1];
}
var PageXMLVers = "";
var findPageXMLVers = /ID="PageXMLVers" VALUE="([^"]+)"/i;
var matchPageXMLVers = findPageXMLVers.exec(body);
if(matchPageXMLVers != null && matchPageXMLVers.length == 2){
PageXMLVers = matchBuild[1];
}
var PageName = "";
var findPageName = /ID="PageName" VALUE="([^"]+)"/i;
var matchPageName = findPageName.exec(body);
if(matchPageName != null && matchPageName.length == 2){
PageName = matchBuild[1];
}
if(ApplicationName.length > 0 && SessionId.length > 0 && Build.length > 0 && PageXMLVers.length > 0 && PageName.length > 0){
var formData = {
SubmitAction: "changedEvent"
, ApplicationName: ApplicationName
, SessionId: SessionId
, Method: "GET"
, VerticalOffset: "0"
, Build: Build
, PageXMLVers: PageXMLVers
, InFrameMode: "FALSE"
, ID: ""
, Focus: "Ort"
, ModulName: ""
, PageName: PageName
, NextPageName: ""
, NewTab: "default"
, IsLastPage: "false"
, IsSubmitPage: "false"
, Ajax: "FALSE"
, ShowMenue: "false"
, Ort: city
, Strasse: street
, Hausnummer: ""
, Hausnummerzusatz: ""
}
request.post({
url:DataUrl
,form:formData
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
var formData = {
SubmitAction: "forward"
, ApplicationName: ApplicationName
, SessionId: SessionId
, Method: "POST"
, VerticalOffset: "0"
, Build: Build
, PageXMLVers: PageXMLVers
, InFrameMode: "FALSE"
, ID: ""
, Focus: "Hausnummer"
, ModulName: ""
, PageName: PageName
, NextPageName: ""
, NewTab: "default"
, IsLastPage: "false"
, IsSubmitPage: "false"
, Ajax: "FALSE"
, ShowMenue: "false"
, Ort: city
, Strasse: street
, Hausnummer: housenumber
, Hausnummerzusatz: ""
};
request.post({
url:DataUrl
,form:formData
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
var terminTables = [];
var terminDates = [];
var terminTypes = [];
var dateNow = new Date();
dateNow.setHours(0,0,0,0);
//dateNow.setDate(dateNow.getDate() + 2);
var dayNames = ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'];
var findTables = /<table[^>]+>/ig;
var matchTables = body.match(findTables);
matchTables.forEach(table => {
var findTerminTable = /<table NAME="[A-Za-z]+TermineLIST"[^>]+>/ig;
var matchTerminTable = table.match(findTerminTable);
if(matchTerminTable != null && matchTerminTable.length>0){
var startTableStart = body.indexOf(table);
var startTableEnd = startTableStart + table.length;
var endNode = "</TABLE>";
var endTableStart = body.indexOf(endNode,startTableStart);
var endTableEnd = endTableStart + endNode.length;
var compTable = body.substring(startTableStart,endTableEnd);
if(!terminTables.includes(compTable)){
terminTables.push(compTable);
}
}
});
terminTables.forEach(table => {
var findName = /<table name="([A-Za-z]+)TermineLIST"/ig;
var matchName = findName.exec(table);
var name = "";
if(matchName.length == 2){
name = matchName[1];
var findEmptyTable = /<table NAME="[A-Za-z]+TermineLIST"[^>]+>[^/]\/table>/ig;
var matchEmptyTable = findEmptyTable.exec(table);
if(matchEmptyTable != null){
setState(eval("WasteType" + name + "DaysLeft"),0);
setState(eval("WasteType" + name + "NextDate"),"");
setState(eval("WasteType" + name + "NextDateFormat"),"");
setState(eval("WasteType" + name + "NextWeekday"),0);
setState(eval("WasteType" + name + "NextWeekdayText"),"");
} else {
var findTermine = /"dia_c_abfuhrdatum[^>]+>([0-9]{2}\.[0-9]{2}\.[0-9]{4})/ig;
var matchTermine = findTermine.exec(table);
//var matchTermine = table.match(findTermine);
//if(matchTermine.length > 0){
if(matchTermine.length == 2){
var termin = matchTermine[1];
var dateParts = termin.split('.');
var date = new Date(dateParts[2], dateParts[1]-1, dateParts[0]);
date.setHours(0,0,0,0);
var dayText = "";
if(date.getTime() == dateNow.getTime()){
table = table.replace(matchTermine[0], "");
findTermine = /"dia_c_abfuhrdatum[^>]+>([0-9]{2}\.[0-9]{2}\.[0-9]{4})/ig;
matchTermine = findTermine.exec(table);
//var matchTermine = table.match(findTermine);
//if(matchTermine.length > 0){
if(matchTermine.length == 2){
termin = matchTermine[1];
dateParts = termin.split('.');
date = new Date(dateParts[2], dateParts[1]-1, dateParts[0]);
} else {
setState(eval("WasteType" + name + "DaysLeft"),0);
setState(eval("WasteType" + name + "NextDate"),"");
setState(eval("WasteType" + name + "NextDateFormat"),"");
setState(eval("WasteType" + name + "NextWeekday"),0);
setState(eval("WasteType" + name + "NextWeekdayText"),"");
}
}
if(terminDates.indexOf(date)<0){
terminDates.push(date);
terminTypes.push(name);
}
setState(eval("WasteType" + name + "DaysLeft"),Math.round((date-dateNow)/(1000*60*60*24)));
setState(eval("WasteType" + name + "NextDate"),date.toUTCString());
setState(eval("WasteType" + name + "NextDateFormat"),termin);
setState(eval("WasteType" + name + "NextWeekday"),date.getDay());
setState(eval("WasteType" + name + "NextWeekdayText"),dayNames[date.getDay()]);
} else {
setState(eval("WasteType" + name + "DaysLeft"),0);
setState(eval("WasteType" + name + "NextDate"),"");
setState(eval("WasteType" + name + "NextDateFormat"),"");
setState(eval("WasteType" + name + "NextWeekday"),0);
setState(eval("WasteType" + name + "NextWeekdayText"),"");
}
}
}
});
var nextDate = new Date(Math.min.apply(null,terminDates));
var nextDateDay=nextDate.getDate();
var nextDateMonth=nextDate.getMonth();
var nextDateMonth=nextDateMonth+1;
if((String(nextDateDay)).length==1) nextDateDay='0'+nextDateDay;
if((String(nextDateMonth)).length==1) nextDateMonth='0'+nextDateMonth;
var nextDateFormat=nextDateDay + '.' + nextDateMonth + '.' + nextDate.getFullYear();
var nextTypes = [];
var nextTypesText = "";
terminTypes.forEach(type => {
var dateVal = getState(eval("WasteType" + type + "NextDate")).val;
var checkDate = new Date(dateVal);
var addType = (checkDate.getTime() == nextDate.getTime());
if(addType){
nextTypes.push(type)
}
});
nextTypes.forEach(nextType => {
nextTypesText += (nextTypesText.length>0)?" und ":"";
nextTypesText += nextType;
});
setState(WasteNextDate, nextDate.toUTCString());
setState(WasteNextDateFormat, nextDateFormat);
setState(WasteNextDaysLeft, Math.round((nextDate-dateNow)/(1000*60*60*24)));
setState(WasteNextTypes, nextTypes);
setState(WasteNextTypesText, nextTypesText);
setState(WasteNextWeekday, nextDate.getDay());
setState(WasteNextWeekdayText, dayNames[nextDate.getDay()]);
setState(WasteDisposalLastRun, new Date().toUTCString());
setState(WasteDisposalError,false);
} else {
log(error);
doError();
}
});
} else {
log(error);
doError();
}
});
}
} else {
log(error);
doError();
}
});
function doError(){
log('Mülltermine können nicht abgeholt werden!');
setState(WasteDisposalError,true);
setState(WasteNextDate, "");
setState(WasteNextDateFormat, "");
setState(WasteNextDaysLeft, 0);
setState(WasteNextTypes, [])
setState(WasteNextTypesText, "")
setState(WasteNextWeekday, -1);
setState(WasteNextWeekdayText, "");
validTypes.forEach(name => {
setState(eval("WasteType" + name + "DaysLeft"),0);
setState(eval("WasteType" + name + "NextDate"),"");
setState(eval("WasteType" + name + "NextDateFormat"),"");
setState(eval("WasteType" + name + "NextWeekday"),-1);
setState(eval("WasteType" + name + "NextWeekdayText"),"");
});
}
}