Hoe kan ik tijd meten?

Hi,

Misschien een hele domme vraag, maar weet iemand hoe ik makkelijk in een flow de tijd kan opslaan en dan als de flow klaar is, nog een keer en dan uitrekenen hoe lang het geduurd heeft? Kan iemand mij op weg helpen? Ik heb dus een douche flow lopen die mijn connectix watermeter uitleest, en dan blijft lopen totdat de waterflow stopt en er dus geen douche meer actief is. Ik wil dus ook graag weten, hoe lang de douchebeurt is geweest. Het lukt mij alleen niet om de tijd in een variabele te zetten, er kom alleen het uur in en niet de minuten. Daarna wil ik berekenen wat het verschil tussen start en stop is…

Je zou zo iets kunnen doen:


Waarbij je contactalarm dus de “doucheflow” sensor moet zijn.
Loopt het water? Dan wordt er elke 10 seconde, 10 bij de douchetijd variable opgeteld.

Daarna zou je een flow kunnen maken die start als de “doucheflow” stopt, de waarde uitleest en een melding stuurt van de douchetijd, vervolgens deze waarde weer reset voor de volgende douchebeurt. Voeg bij het resetten van de variable ook een vertraging toe (na 5 seconde). Ik heb namelijk wel eens gehad dat iets wat eerder in een flow stond, later werd uitgevoerd. Waardoor de waarde al gereset was voordat het verwerkt was.

1 Like

Thanks, ik ga dit proberen

Je zou ook deze app kunnen installeren (Geen ervaring mee):

Maar persoonlijk zou ik zoveel mogelijk zonder extra apps proberen op te lossen.

2 Likes

Deze optie is beter en duidelijker. Met de voorbeeldflow wordt er elke 10 seconden iets gecheckt heel de dag door, wat onnodige belasting is en Homey op lange termijn niet zo leuk vindt denk ik. Daarnaast kun je met Chonograph ook timers zetten, als iemand dan 10 minuten doucht dat de lamp knippert bijvoorbeeld.

Eens, het is niet zo netjes elke 10 seconde te pollen. Maar ik denk dat de impact wel heel erg meevalt gezien die alleen wat doet als de kraan open staat. En dan is het alsnog alleen een simpel optel sommetje.
Elke extra geïnstalleerde app heeft ook impact op het algehele geheugen gebruik wat de boel ook trager maakt. En dit draait ook de hele tijd op de achtergrond mee.

Over apps gesproken, heb nog een app gevonden wat volgens mij exact het antwoord is op jouw probleem @vavoem :

Always wanted to know how long your device is running or how much energy it used?

2 Likes

Ik ben bezig met een script hiervoor( connectix watermeter). Ben nu aan het kijken of het goed werkt. Het werkt automatisch. Iedere keer als het water loopt wordt dat opgeslagen. Uiteindelijk word om 0:00 uur doorgerekend of er gedoucht is. Per douchebeurt registreert hij dan de tijd, hoeveelheid water en de kosten.

In de nabije toekomst wil ik ditzelfde doen met de registratie van de slimme meter( connectix) en watermeter. Zodanig dat ik een overzicht heb. Hieronder dat voorbeeld, maar zoals je ziet is daar nog wel even wat werk te verrichten

1 Like

wow, dat is tof… Mocht je het tzt willen delen dan houd ik mij aanbevolen :wink:

Ik zal hem zeker delen. Douche script zal in de loop van de volgende week af komen. Verwacht ik.

Hier is nog een leuke kant-en-klare Adv.flow, deze maakt wel gebruik van Chronograph:

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);

3 Likes

Mooi script @Marcel_Ubels zou
Dit ook kunnen werken op een Smartgateways watermeter?

Zekers, want het is geschreven voor een smartgateway watermeter💪

Oke dat is nice ik wist even niet meer dat van Connectix was :grin: