Advertisement
Datamupp

Untitled

Nov 20th, 2020
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Pga begränsningar i Homeys funktioner så skapades detta scriptet för att kunna få ut det högsta, lägsta samt
  3. genomsnittsvärdet för vald period och även klockslagen. Scriptet skulle kunna hämta via insights men jag känner
  4. att det blir för svårt för en som inte är så invigd i homeyscript och homeyns api att anpassa scriptet efter
  5. sina egna enheter och önskemål. Så jag gjorde därför istället så att man anropar scriptet med värdet (temperatur
  6. t.ex) som enda argument, varpå 5 st taggar uppdateras.  Scriptet kan köras både under OCH och DÅ.  Detta måste
  7. göras för att uppdatera värdena. Du kan sedan läsa av taggarna när du vill men det blir då en viss förskjutning
  8. om inte värdena precis uppdaterats.
  9.  
  10. Du behöver ladda ner appen HOMEYSCRIPT till din Homey, därefter loggar du in på homeyscript.homey.app där du
  11. väljer att skapa ett nytt script som du sedan klistrar in alla dessa rader i inklusive denna text.
  12.  
  13. Därefter anpassar du 2 st värden på raderna här nedanför. Tanken är att scriptet anropas med jämna mellanrum.
  14. Scriptet är i nuläget inställt på var 10:e minut och perioden är satt till 1440 minuter = 24 timmar men detta är
  15. alltså inte hur ofta scriptet verkligen körs utan enbart för att beräkna hur många värden som skall sparas.
  16.  
  17. Skapa ett flöde som triggas t.ex var 10:e minut.  Anropa scriptet via OCH eller DÅ med kortet "Run a script with
  18. an argument" som finns i appen HOMEYSCRIPT och skicka med temperaturen eller vad det nu kan vara som enda argument.
  19.  
  20. Anropar du via OCH så kommer du antingen att få sant eller falskt tillbaka beroende på om det gick bra eller inte
  21. men enda anledningen att det skulle bli falskt är förhoppningsvis om det anropas utan argument.
  22.  
  23. Taggarna hittar du sedan under sektionen homeyscript som brukar hamna längst ner i listan.
  24. */
  25.  
  26. const intervalMinutes = 10; //Sätt denna till samma interval (i minuter) som du anropar
  27. const periodMinutes = 1440; //24 timmar = 1440 minuter
  28.  
  29. const sys = await Homey.system.getInfo();
  30.  
  31. let paramValue;
  32. if (args.length>0) {
  33.   paramValue=parseFloat(args[0].replace(/\s/g, "").replace(/\u00A0/g, "")); //Rensa parametern från mellanslag och non-breaking space.
  34. }
  35. else
  36. {
  37.   return false; //Måste anropas med argument från ett homeyflöde
  38. }
  39.  
  40. const maxArrayLength = periodMinutes / intervalMinutes;
  41.  
  42. let valueDateTime = new Date(sys.date);
  43. valueDateTime.setMinutes(valueDateTime.getMinutes() - valueDateTime.getTimezoneOffset());
  44.  
  45. //Skapa ett par tomma arrayer att jobba med
  46. let valueList = [];
  47. let timeList = [];
  48.  
  49. //Hämta data ifrån de globala variablerna (ligger kvar även efter omstart av Homey)
  50. if (global.get('persistentValueList')!=null) {
  51.   valueList = global.get('persistentValueList');
  52. }
  53. if (global.get('persistentTimeList')!=null) {
  54.   timeList = global.get('persistentTimeList');
  55. }
  56.  
  57. //Rensa ut äldsta datan
  58. while (valueList.length>=maxArrayLength) {
  59.   valueList.shift();
  60. }
  61.  
  62. while (timeList.length>=maxArrayLength) {
  63.   timeList.shift();
  64. }
  65.  
  66. //Lägg till senaste värdet och tiden
  67. valueList.push(paramValue);
  68. timeList.push(valueDateTime.toISOString());
  69.  
  70. let lowestValue = valueList[0];
  71. let lowestValueTime = timeList[0];
  72. let highestValue = valueList[0];
  73. let highestValueTime = timeList[0];
  74.  
  75. let valuesSum = 0; //Räknar ihop alla värdena för att senare kunna dividera och få ett genomsnitt
  76. for (index = 0; index < valueList.length; ++index) {
  77.   if (valueList[index]!=null) {
  78.     valuesSum+=valueList[index];
  79.     if (valueList[index]<lowestValue) {
  80.       lowestValue=valueList[index];
  81.       lowestValueTime=timeList[index];
  82.     }
  83.     if (valueList[index]>highestValue) {
  84.       highestValue=valueList[index];
  85.       highestValueTime=timeList[index];
  86.     }
  87.   }
  88. //  console.log(index + " = " + valueList[index] + " " + timeList[index]);
  89. }
  90.  
  91. //console.log("Kallast var " + lowestValue + " grader kl " + lowestValueTime);
  92. //console.log("Varmast var " + highestValue + " grader kl " + highestValueTime);
  93.  
  94. //Ändra nedanstående till false för att radera taggar och globala variabler
  95. if (true){
  96.   //Sätt taggarna
  97.   await setTagValue('lowest', {type: 'number', title: 'Lägsta värde'}, lowestValue);
  98.   await setTagValue('highest', {type: 'number', title: 'Högsta värde'}, highestValue);
  99.   await setTagValue('lowestTime', {type: 'string', title: 'Lägsta värde tid'}, lowestValueTime.substring(11,16));
  100.   await setTagValue('highestTime', {type: 'string', title: 'Högsta värde tid'}, highestValueTime.substring(11,16));
  101.   await setTagValue('average', {type: 'number', title: 'Snitt'}, Math.round((valuesSum/valueList.length)*100)/100);
  102.  
  103.   //Spara i de globala variablerna
  104.   global.set("persistentValueList",valueList);
  105.   global.set("persistentTimeList",timeList);
  106.   return true;
  107. }
  108. else
  109. {
  110.   //Radera taggarna
  111.   await setTagValue('lowest', {type: 'number', title: 'Lägsta värde'}, undefined);
  112.   await setTagValue('highest', {type: 'number', title: 'Högsta värde'}, undefined);
  113.   await setTagValue('lowestTime', {type: 'string', title: 'Lägsta värde tid'}, undefined);
  114.   await setTagValue('highestTime', {type: 'string', title: 'Högsta värde tid'}, undefined);
  115.   await setTagValue('average', {type: 'number', title: 'Snitt'}, undefined);
  116.  
  117.   //Radera globala variablerna
  118.   global.set('persistentValueList',undefined);
  119.   global.set('persistentTimeList',undefined);
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement