Dit is momenteel het werkende Homeyscript. Ik ben nog bezig met fine-tunen, maar het lijkt ok te werken. Mijn grote dank gaat uit naar @Arie_J_Godschalk voor het maken van de zoekfunctie in de arrays.
Je moet 1 logic nummer variabele ‘Water Tarief’ aanmaken. Installeer Homeyscript. Maak een leeg script aan en kopieer onderstaande code erin, start het script en zoek het id nummer van je watermeter.
let devices = await Homey.devices.getDevices();
_.forEach(devices, device =>{
console.log(device.name, '',device.id);
})
return true
Het volgende script kopieren in een nieuw homey script en opslaan onder de naam Shower. Het id dat je hebt gevonden vul je in bij de regel 'var smartWaterMeterId = ‘6923a7e2-598e-4493-9973-64344dab3336’; Maak daarna 1 flow aan; Als watermeter update Dan Homeyscript run Shower. Tweede flow: Als het 0:00 is dan Homeyscript Run code. De volgende code kan je in het veld plakken
// waterMeterShowerUpdate setting to false
global.set(‘waterMeterShowerUpdate’, false)
En de laatste flow; Als het (bijv) 20:15 is Dan Send a text only mail, voor de inhoud zoek je de tag Shower Textblock. Suc6
Hieronder het Shower script
var varName = ['Water Tarief'];
var logicId = [];
var count = 0;
while(count <= varName.length -1)
{
var Logic = await Homey.logic.getVariables();
let idArr = Object.entries(Logic);
let filtered = idArr.filter(([key, value]) => value.name==varName[count]);
let [ [ ,{ id: varNameId }]] = filtered;
logicId.splice(count, 1,varNameId);
count++;
}
//Logic variable radioUpdate
var waterRate = await Homey.logic.getVariable({ id: logicId[0]}) ;
waterRate = waterRate.value;
console.log('waterTarif is: '+waterRate);
var smartWaterMeterId = '6923a7e2-598e-4493-9973-64344dab3336';
var device = await Homey.devices.getDevice({ id: smartWaterMeterId });
var waterMeter = device.capabilitiesObj.meter_water.value;
const date = new Date();
var minutes = date.getMinutes();
var hours = date.getHours();
var totalMinutes = (60 * hours) + minutes;
console.log('totalMinutes is:'+totalMinutes);
waterMeterShowerUpdate = global.get('waterMeterShowerUpdate');
console.log('waterMeterShowerUpdate is: ' +waterMeterShowerUpdate);
if(waterMeterShowerUpdate === false)
{
global.set('waterMeterShowerUpdate', true);
var waterMeterShower = Array(1440).fill(0);
global.set('waterMeterShower', waterMeterShower );
}
var waterMeterShower = global.get('waterMeterShower');
waterMeterShower.splice(totalMinutes,1,waterMeter);
global.set('waterMeterShower', waterMeterShower);
let arr = waterMeterShower;
let time =4;
// Here we go, non-flat, or, double array
let ret = getShowerArray(arr, time, false);
console.log(ret);
// And flat array
let retFlat = getShowerArray(arr, time, true);
console.log(retFlat);
function getShowerArray (indices, showerTime, asFlatArray) {
let objs = _.map(indices, a=>{return {amount:a}; });
_.each(objs, (x,index)=> {
if(x.amount===0) return;// x.time=-1;
let yi = _.findIndex(objs, (y,yIndex)=>yIndex>index && y.amount==0)
x.time = yi-index;
});
let output = [], active=false;//, ret2 = _.filter(objs, x=>x.time);
_.each(objs, (x, index)=> {
if(!x.time) active=false;
else if(active) output[output.length-1].push(x.amount);
else if(x.time>=showerTime) {
output.push([x.amount]);
active = true;
}
});
return asFlatArray ? _.flatMap(output) :output;
}
tmp = ret[1];
console.log('tmp is: ' +ret.length)
var count = 0;
console.log('Aantal douchebeurten is: ' +ret.length)
console.log(ret[0])
//var tmp = (ret[0][ret[0].length -1]) - (ret[0][0])
//console.log(tmp)
var tmpTotalShower = 0;
var totalShower = [];
var minutesShower = [];
var tmpMinutesShower = [];
while(count <= ret.length -1)
{
var tmpTotalShower = ((ret[count][ret[count].length -1]) * 1000) - ((ret[count][0]) * 1000);
totalShower.splice(count,1,tmpTotalShower);
tmpMinutesShower = ret[count].length;
minutesShower.splice(count,1,tmpMinutesShower);
count++;
}
console.log('totalShower is: '+totalShower);
console.log('minutesShower is: '+minutesShower);
count = 0;
teller = 1;
var temporarily = [];
while(count < totalShower.length )
{
if(totalShower[count] > 20 && ((totalShower[count] / totalShower[count].length) > 3))
{
var showerTextBlock = 'Douchebeurt ' +((teller)) +' duurde ' +minutesShower[count] +' minuten en er werd ' +Math.round(totalShower[count]) +' liter water verbruikt' + '\r'+'\n' +'Kosten: ' +((totalShower[count] * (waterRate / 1000)) * 100).toFixed(2) +' eurocent' +'\r\n';
temporarily.splice(count,1,showerTextBlock);
teller++;
}
count++;
}
temporarily = temporarily.join("");
showerTextBlock = temporarily;
console.log(showerTextBlock)
await tag('Shower TextBlock', showerTextBlock);