node-red-contrib-power-saver 3.3.2 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.firebase/hosting.ZG9jcy8udnVlcHJlc3MvZGlzdA.cache +94 -0
  2. package/.firebaserc +5 -0
  3. package/.github/workflows/firebase-hosting-merge.yml +20 -0
  4. package/.github/workflows/firebase-hosting-pull-request.yml +17 -0
  5. package/README.md +1 -1
  6. package/docs/.vuepress/components/BestSaveVerificator.vue +3 -3
  7. package/docs/.vuepress/config.js +15 -1
  8. package/docs/.vuepress/dist/404.html +23 -5
  9. package/docs/.vuepress/dist/assets/css/896.styles.21a80cb6.css +1 -0
  10. package/docs/.vuepress/dist/assets/css/styles.1c48cbd0.css +10 -0
  11. package/docs/.vuepress/dist/assets/img/heat-capacitor-temperatureVsPrice.6e74905b.png +0 -0
  12. package/docs/.vuepress/dist/assets/img/node-ps-strategy-heat-capacitor-cascade-control.2e75ed9e.png +0 -0
  13. package/docs/.vuepress/dist/assets/img/node-ps-strategy-heat-capacitor-simple-flow-example.29d9bf59.png +0 -0
  14. package/docs/.vuepress/dist/assets/img/oven-setpoint-calculation.5bda0eec.png +0 -0
  15. package/docs/.vuepress/dist/assets/img/overshoot-time.b3b5d70e.png +0 -0
  16. package/docs/.vuepress/dist/assets/js/229.5c5378fa.js +1 -0
  17. package/docs/.vuepress/dist/assets/js/331.872104cd.js +1 -0
  18. package/docs/.vuepress/dist/assets/js/405.f4edd94d.js +2 -0
  19. package/docs/.vuepress/dist/assets/js/{619.8ba1b1f6.js.LICENSE.txt → 405.f4edd94d.js.LICENSE.txt} +0 -0
  20. package/docs/.vuepress/dist/assets/js/490.1e639e05.js +1 -0
  21. package/docs/.vuepress/dist/assets/js/{491.17a98f38.js → 491.bd938119.js} +1 -1
  22. package/docs/.vuepress/dist/assets/js/555.d8963d84.js +1 -0
  23. package/docs/.vuepress/dist/assets/js/{811.6a3392d5.js → 811.5f659592.js} +0 -0
  24. package/docs/.vuepress/dist/assets/js/app.dfdee6f9.js +1 -0
  25. package/docs/.vuepress/dist/assets/js/runtime~app.f6ac32d7.js +1 -0
  26. package/docs/.vuepress/dist/assets/js/v-0607240a.0193a377.js +1 -0
  27. package/docs/.vuepress/dist/assets/js/v-08683c60.52e94cb6.js +1 -0
  28. package/docs/.vuepress/dist/assets/js/v-0aca7ba6.cac5d4b9.js +1 -0
  29. package/docs/.vuepress/dist/assets/js/v-0b5e3c8c.18561f6e.js +1 -0
  30. package/docs/.vuepress/dist/assets/js/v-1ad821fa.6697a349.js +1 -0
  31. package/docs/.vuepress/dist/assets/js/v-1b3a0ab8.c6c4e19b.js +1 -0
  32. package/docs/.vuepress/dist/assets/js/v-1e2b191e.07b8ab21.js +1 -0
  33. package/docs/.vuepress/dist/assets/js/v-29504124.00be7399.js +1 -0
  34. package/docs/.vuepress/dist/assets/js/v-30acb564.28af12af.js +1 -0
  35. package/docs/.vuepress/dist/assets/js/{v-3706649a.d7f73384.js → v-3706649a.c76d575b.js} +1 -1
  36. package/docs/.vuepress/dist/assets/js/v-4637f9e4.d334c29a.js +1 -0
  37. package/docs/.vuepress/dist/assets/js/v-4c28314d.8cbb0f9d.js +1 -0
  38. package/docs/.vuepress/dist/assets/js/v-510ed0d4.c04bc2e4.js +1 -0
  39. package/docs/.vuepress/dist/assets/js/{v-5954bcb2.937005d0.js → v-5954bcb2.dff3fc67.js} +1 -1
  40. package/docs/.vuepress/dist/assets/js/v-5db8da3a.e5e6d7a6.js +1 -0
  41. package/docs/.vuepress/dist/assets/js/v-61f728ca.81968036.js +1 -0
  42. package/docs/.vuepress/dist/assets/js/v-677dfaed.c159b0f4.js +1 -0
  43. package/docs/.vuepress/dist/assets/js/v-7446a652.8fc2c591.js +1 -0
  44. package/docs/.vuepress/dist/assets/js/v-7c87f26e.8ed52391.js +1 -0
  45. package/docs/.vuepress/dist/assets/js/v-84304104.f3f07ed3.js +1 -0
  46. package/docs/.vuepress/dist/assets/js/{v-8daa1a0e.c63afc2b.js → v-8daa1a0e.ed84ca09.js} +1 -1
  47. package/docs/.vuepress/dist/assets/js/{v-b4a42144.733e4e7c.js → v-b4a42144.9a2a0c9f.js} +1 -1
  48. package/docs/.vuepress/dist/assets/js/v-e8c55052.b7d52fc6.js +1 -0
  49. package/docs/.vuepress/dist/assets/js/v-fffb8e28.d09ab959.js +1 -0
  50. package/docs/.vuepress/dist/changelog/index.html +23 -5
  51. package/docs/.vuepress/dist/contribute/index.html +23 -5
  52. package/docs/.vuepress/dist/examples/example-cascade-temperature-control.html +304 -0
  53. package/docs/.vuepress/dist/examples/example-heat-capacitor.html +247 -0
  54. package/docs/.vuepress/dist/examples/example-next-schedule-entity.html +27 -9
  55. package/docs/.vuepress/dist/examples/example-nordpool-current-state.html +24 -6
  56. package/docs/.vuepress/dist/examples/example-nordpool-events-state.html +24 -6
  57. package/docs/.vuepress/dist/examples/example-tibber-mqtt.html +24 -6
  58. package/docs/.vuepress/dist/examples/index.html +23 -5
  59. package/docs/.vuepress/dist/faq/best-save-viewer.html +23 -5
  60. package/docs/.vuepress/dist/faq/index.html +23 -5
  61. package/docs/.vuepress/dist/guide/index.html +24 -6
  62. package/docs/.vuepress/dist/index.html +23 -5
  63. package/docs/.vuepress/dist/nodes/index.html +23 -5
  64. package/docs/.vuepress/dist/nodes/old-power-saver-doc.html +25 -7
  65. package/docs/.vuepress/dist/nodes/power-saver.html +23 -5
  66. package/docs/.vuepress/dist/nodes/ps-elvia-add-tariff.html +23 -5
  67. package/docs/.vuepress/dist/nodes/ps-general-add-tariff.html +23 -5
  68. package/docs/.vuepress/dist/nodes/ps-receive-price.html +26 -8
  69. package/docs/.vuepress/dist/nodes/ps-strategy-best-save.html +32 -9
  70. package/docs/.vuepress/dist/nodes/ps-strategy-heat-capacitor.html +260 -0
  71. package/docs/.vuepress/dist/nodes/ps-strategy-lowest-price.html +30 -7
  72. package/docs/.vuepress/dist/nodes/strategy-input.html +24 -6
  73. package/docs/README.md +1 -1
  74. package/docs/changelog/README.md +14 -0
  75. package/docs/contribute/README.md +8 -0
  76. package/docs/examples/README.md +8 -2
  77. package/docs/examples/example-cascade-temperature-control.md +346 -0
  78. package/docs/examples/example-heat-capacitor.md +271 -0
  79. package/docs/images/heat-capacitor-temperatureVsPrice.png +0 -0
  80. package/docs/images/node-ps-strategy-heat-capacitor-cascade-control.png +0 -0
  81. package/docs/images/node-ps-strategy-heat-capacitor-simple-flow-example.png +0 -0
  82. package/docs/images/node-ps-strategy-heat-capacitor.png +0 -0
  83. package/docs/images/oven-setpoint-calculation.png +0 -0
  84. package/docs/images/overshoot-time.png +0 -0
  85. package/docs/images/temperature-manipulation-config.png +0 -0
  86. package/docs/nodes/README.md +7 -1
  87. package/docs/nodes/ps-strategy-heat-capacitor.md +346 -0
  88. package/examples/add-general-tariff.json +103 -0
  89. package/examples/best-save-for-water-heater.json +140 -0
  90. package/examples/elvia-add-tariff.json +99 -0
  91. package/examples/elvia-get-tariff-types.json +58 -0
  92. package/examples/elvia-get-tariff.json +60 -0
  93. package/examples/heat-capacitor-for-room-heating.json +186 -0
  94. package/examples/lowest-price-for-heating-cables.json +159 -0
  95. package/firebase.json +6 -0
  96. package/package.json +17 -9
  97. package/public/404.html +33 -0
  98. package/public/index.html +89 -0
  99. package/src/elvia/elvia-tariff.js +2 -1
  100. package/src/handle-input.js +6 -3
  101. package/src/strategy-heat-capacitor-functions.js +246 -0
  102. package/src/strategy-heat-capacitor.html +85 -0
  103. package/src/strategy-heat-capacitor.js +125 -0
  104. package/test/data/converted-prices.json +1 -1
  105. package/test/data/multiple-trades.json +53 -0
  106. package/test/data/tibber-decreasing-24h.json +101 -0
  107. package/test/data/tibber-decreasing2-24h.json +101 -0
  108. package/test/strategy-heat-capacitor-node.test.js +183 -0
  109. package/test/strategy-heat-capacitor.test.js +103 -0
  110. package/test/strategy-lowest-price-functions.test.js +1 -1
  111. package/test/utils.test.js +0 -2
  112. package/docs/.vuepress/dist/.nojekyll +0 -0
  113. package/docs/.vuepress/dist/assets/css/563.styles.99f4a8aa.css +0 -1
  114. package/docs/.vuepress/dist/assets/css/styles.031dcf27.css +0 -9
  115. package/docs/.vuepress/dist/assets/js/262.cf2c57d2.js +0 -1
  116. package/docs/.vuepress/dist/assets/js/293.08ea5200.js +0 -1
  117. package/docs/.vuepress/dist/assets/js/331.15ee3c51.js +0 -1
  118. package/docs/.vuepress/dist/assets/js/619.8ba1b1f6.js +0 -2
  119. package/docs/.vuepress/dist/assets/js/app.b705176c.js +0 -1
  120. package/docs/.vuepress/dist/assets/js/runtime~app.47f4f812.js +0 -1
  121. package/docs/.vuepress/dist/assets/js/v-0607240a.a57c2199.js +0 -1
  122. package/docs/.vuepress/dist/assets/js/v-08683c60.ccafdcab.js +0 -1
  123. package/docs/.vuepress/dist/assets/js/v-0aca7ba6.25903946.js +0 -1
  124. package/docs/.vuepress/dist/assets/js/v-0b5e3c8c.a6a015b4.js +0 -1
  125. package/docs/.vuepress/dist/assets/js/v-1ad821fa.5978386f.js +0 -1
  126. package/docs/.vuepress/dist/assets/js/v-1e2b191e.88dc5555.js +0 -1
  127. package/docs/.vuepress/dist/assets/js/v-29504124.4aca27d5.js +0 -1
  128. package/docs/.vuepress/dist/assets/js/v-30acb564.529a3c16.js +0 -1
  129. package/docs/.vuepress/dist/assets/js/v-4637f9e4.703b1d96.js +0 -1
  130. package/docs/.vuepress/dist/assets/js/v-510ed0d4.7b142a81.js +0 -1
  131. package/docs/.vuepress/dist/assets/js/v-5db8da3a.3de3588d.js +0 -1
  132. package/docs/.vuepress/dist/assets/js/v-61f728ca.21d432fe.js +0 -1
  133. package/docs/.vuepress/dist/assets/js/v-677dfaed.44a653b9.js +0 -1
  134. package/docs/.vuepress/dist/assets/js/v-7446a652.74b21d0b.js +0 -1
  135. package/docs/.vuepress/dist/assets/js/v-7c87f26e.ee5be992.js +0 -1
  136. package/docs/.vuepress/dist/assets/js/v-e8c55052.ab0a79ec.js +0 -1
  137. package/docs/.vuepress/dist/assets/js/v-fffb8e28.525be02a.js +0 -1
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[490],{9490:(e,t)=>{function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,u(e,t)}function a(e){return a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},a(e)}function u(e,t){return u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},u(e,t)}function s(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function c(e,t,n){return c=s()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&u(i,n.prototype),i},c.apply(null,arguments)}function l(e){var t="function"==typeof Map?new Map:void 0;return l=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return c(e,arguments,a(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),u(r,e)},l(e)}function f(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function h(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}Object.defineProperty(t,"__esModule",{value:!0});var m=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(l(Error)),y=function(e){function t(t){return e.call(this,"Invalid DateTime: "+t.toMessage())||this}return o(t,e),t}(m),v=function(e){function t(t){return e.call(this,"Invalid Interval: "+t.toMessage())||this}return o(t,e),t}(m),p=function(e){function t(t){return e.call(this,"Invalid Duration: "+t.toMessage())||this}return o(t,e),t}(m),g=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(m),w=function(e){function t(t){return e.call(this,"Invalid unit "+t)||this}return o(t,e),t}(m),k=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(m),S=function(e){function t(){return e.call(this,"Zone is an abstract class")||this}return o(t,e),t}(m),T="numeric",b="short",O="long",M={year:T,month:T,day:T},N={year:T,month:b,day:T},D={year:T,month:b,day:T,weekday:b},E={year:T,month:O,day:T},V={year:T,month:O,day:T,weekday:O},I={hour:T,minute:T},x={hour:T,minute:T,second:T},C={hour:T,minute:T,second:T,timeZoneName:b},F={hour:T,minute:T,second:T,timeZoneName:O},L={hour:T,minute:T,hourCycle:"h23"},Z={hour:T,minute:T,second:T,hourCycle:"h23"},A={hour:T,minute:T,second:T,hourCycle:"h23",timeZoneName:b},z={hour:T,minute:T,second:T,hourCycle:"h23",timeZoneName:O},_={year:T,month:T,day:T,hour:T,minute:T},j={year:T,month:T,day:T,hour:T,minute:T,second:T},q={year:T,month:b,day:T,hour:T,minute:T},U={year:T,month:b,day:T,hour:T,minute:T,second:T},R={year:T,month:b,day:T,weekday:b,hour:T,minute:T},H={year:T,month:O,day:T,hour:T,minute:T,timeZoneName:b},P={year:T,month:O,day:T,hour:T,minute:T,second:T,timeZoneName:b},W={year:T,month:O,day:T,weekday:O,hour:T,minute:T,timeZoneName:O},J={year:T,month:O,day:T,weekday:O,hour:T,minute:T,second:T,timeZoneName:O};function Y(e){return void 0===e}function G(e){return"number"==typeof e}function $(e){return"number"==typeof e&&e%1==0}function B(){try{return"undefined"!=typeof Intl&&!!Intl.RelativeTimeFormat}catch(e){return!1}}function Q(e,t,n){if(0!==e.length)return e.reduce((function(e,r){var i=[t(r),r];return e&&n(e[0],i[0])===e[0]?e:i}),null)[1]}function K(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function X(e,t,n){return $(e)&&e>=t&&e<=n}function ee(e,t){return void 0===t&&(t=2),e<0?"-"+(""+-e).padStart(t,"0"):(""+e).padStart(t,"0")}function te(e){return Y(e)||null===e||""===e?void 0:parseInt(e,10)}function ne(e){return Y(e)||null===e||""===e?void 0:parseFloat(e)}function re(e){if(!Y(e)&&null!==e&&""!==e){var t=1e3*parseFloat("0."+e);return Math.floor(t)}}function ie(e,t,n){void 0===n&&(n=!1);var r=Math.pow(10,t);return(n?Math.trunc:Math.round)(e*r)/r}function oe(e){return e%4==0&&(e%100!=0||e%400==0)}function ae(e){return oe(e)?366:365}function ue(e,t){var n,r=(n=t-1)-12*Math.floor(n/12)+1;return 2===r?oe(e+(t-r)/12)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][r-1]}function se(e){var t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&e.year>=0&&(t=new Date(t)).setUTCFullYear(t.getUTCFullYear()-1900),+t}function ce(e){var t=(e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400))%7,n=e-1,r=(n+Math.floor(n/4)-Math.floor(n/100)+Math.floor(n/400))%7;return 4===t||3===r?53:52}function le(e){return e>99?e:e>60?1900+e:2e3+e}function fe(e,t,n,r){void 0===r&&(r=null);var o=new Date(e),a={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};r&&(a.timeZone=r);var u=i({timeZoneName:t},a),s=new Intl.DateTimeFormat(n,u).formatToParts(o).find((function(e){return"timezonename"===e.type.toLowerCase()}));return s?s.value:null}function de(e,t){var n=parseInt(e,10);Number.isNaN(n)&&(n=0);var r=parseInt(t,10)||0;return 60*n+(n<0||Object.is(n,-0)?-r:r)}function he(e){var t=Number(e);if("boolean"==typeof e||""===e||Number.isNaN(t))throw new k("Invalid unit value "+e);return t}function me(e,t){var n={};for(var r in e)if(K(e,r)){var i=e[r];if(null==i)continue;n[t(r)]=he(i)}return n}function ye(e,t){var n=Math.trunc(Math.abs(e/60)),r=Math.trunc(Math.abs(e%60)),i=e>=0?"+":"-";switch(t){case"short":return""+i+ee(n,2)+":"+ee(r,2);case"narrow":return""+i+n+(r>0?":"+r:"");case"techie":return""+i+ee(n,2)+ee(r,2);default:throw new RangeError("Value format "+t+" is out of range for property format")}}function ve(e){return function(e,t){return["hour","minute","second","millisecond"].reduce((function(t,n){return t[n]=e[n],t}),{})}(e)}var pe=/[A-Za-z_+-]{1,256}(:?\/[A-Za-z0-9_+-]{1,256}(\/[A-Za-z0-9_+-]{1,256})?)?/,ge=["January","February","March","April","May","June","July","August","September","October","November","December"],we=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ke=["J","F","M","A","M","J","J","A","S","O","N","D"];function Se(e){switch(e){case"narrow":return[].concat(ke);case"short":return[].concat(we);case"long":return[].concat(ge);case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}var Te=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],be=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],Oe=["M","T","W","T","F","S","S"];function Me(e){switch(e){case"narrow":return[].concat(Oe);case"short":return[].concat(be);case"long":return[].concat(Te);case"numeric":return["1","2","3","4","5","6","7"];default:return null}}var Ne=["AM","PM"],De=["Before Christ","Anno Domini"],Ee=["BC","AD"],Ve=["B","A"];function Ie(e){switch(e){case"narrow":return[].concat(Ve);case"short":return[].concat(Ee);case"long":return[].concat(De);default:return null}}function xe(e,t){for(var n,r="",i=h(e);!(n=i()).done;){var o=n.value;o.literal?r+=o.val:r+=t(o.val)}return r}var Ce={D:M,DD:N,DDD:E,DDDD:V,t:I,tt:x,ttt:C,tttt:F,T:L,TT:Z,TTT:A,TTTT:z,f:_,ff:q,fff:H,ffff:W,F:j,FF:U,FFF:P,FFFF:J},Fe=function(){function e(e,t){this.opts=t,this.loc=e,this.systemLoc=null}e.create=function(t,n){return void 0===n&&(n={}),new e(t,n)},e.parseFormat=function(e){for(var t=null,n="",r=!1,i=[],o=0;o<e.length;o++){var a=e.charAt(o);"'"===a?(n.length>0&&i.push({literal:r,val:n}),t=null,n="",r=!r):r||a===t?n+=a:(n.length>0&&i.push({literal:!1,val:n}),n=a,t=a)}return n.length>0&&i.push({literal:r,val:n}),i},e.macroTokenToFormatOpts=function(e){return Ce[e]};var t=e.prototype;return t.formatWithSystemDefault=function(e,t){return null===this.systemLoc&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(e,i({},this.opts,t)).format()},t.formatDateTime=function(e,t){return void 0===t&&(t={}),this.loc.dtFormatter(e,i({},this.opts,t)).format()},t.formatDateTimeParts=function(e,t){return void 0===t&&(t={}),this.loc.dtFormatter(e,i({},this.opts,t)).formatToParts()},t.resolvedOptions=function(e,t){return void 0===t&&(t={}),this.loc.dtFormatter(e,i({},this.opts,t)).resolvedOptions()},t.num=function(e,t){if(void 0===t&&(t=0),this.opts.forceSimple)return ee(e,t);var n=i({},this.opts);return t>0&&(n.padTo=t),this.loc.numberFormatter(n).format(e)},t.formatDateTimeFromString=function(t,n){var r=this,i="en"===this.loc.listingMode(),o=this.loc.outputCalendar&&"gregory"!==this.loc.outputCalendar,a=function(e,n){return r.loc.extract(t,e,n)},u=function(e){return t.isOffsetFixed&&0===t.offset&&e.allowZ?"Z":t.isValid?t.zone.formatOffset(t.ts,e.format):""},s=function(e,n){return i?function(e,t){return Se(t)[e.month-1]}(t,e):a(n?{month:e}:{month:e,day:"numeric"},"month")},c=function(e,n){return i?function(e,t){return Me(t)[e.weekday-1]}(t,e):a(n?{weekday:e}:{weekday:e,month:"long",day:"numeric"},"weekday")},l=function(e){return i?function(e,t){return Ie(t)[e.year<0?0:1]}(t,e):a({era:e},"era")};return xe(e.parseFormat(n),(function(n){switch(n){case"S":return r.num(t.millisecond);case"u":case"SSS":return r.num(t.millisecond,3);case"s":return r.num(t.second);case"ss":return r.num(t.second,2);case"uu":return r.num(Math.floor(t.millisecond/10),2);case"uuu":return r.num(Math.floor(t.millisecond/100));case"m":return r.num(t.minute);case"mm":return r.num(t.minute,2);case"h":return r.num(t.hour%12==0?12:t.hour%12);case"hh":return r.num(t.hour%12==0?12:t.hour%12,2);case"H":return r.num(t.hour);case"HH":return r.num(t.hour,2);case"Z":return u({format:"narrow",allowZ:r.opts.allowZ});case"ZZ":return u({format:"short",allowZ:r.opts.allowZ});case"ZZZ":return u({format:"techie",allowZ:r.opts.allowZ});case"ZZZZ":return t.zone.offsetName(t.ts,{format:"short",locale:r.loc.locale});case"ZZZZZ":return t.zone.offsetName(t.ts,{format:"long",locale:r.loc.locale});case"z":return t.zoneName;case"a":return i?function(e){return Ne[e.hour<12?0:1]}(t):a({hour:"numeric",hourCycle:"h12"},"dayperiod");case"d":return o?a({day:"numeric"},"day"):r.num(t.day);case"dd":return o?a({day:"2-digit"},"day"):r.num(t.day,2);case"c":case"E":return r.num(t.weekday);case"ccc":return c("short",!0);case"cccc":return c("long",!0);case"ccccc":return c("narrow",!0);case"EEE":return c("short",!1);case"EEEE":return c("long",!1);case"EEEEE":return c("narrow",!1);case"L":return o?a({month:"numeric",day:"numeric"},"month"):r.num(t.month);case"LL":return o?a({month:"2-digit",day:"numeric"},"month"):r.num(t.month,2);case"LLL":return s("short",!0);case"LLLL":return s("long",!0);case"LLLLL":return s("narrow",!0);case"M":return o?a({month:"numeric"},"month"):r.num(t.month);case"MM":return o?a({month:"2-digit"},"month"):r.num(t.month,2);case"MMM":return s("short",!1);case"MMMM":return s("long",!1);case"MMMMM":return s("narrow",!1);case"y":return o?a({year:"numeric"},"year"):r.num(t.year);case"yy":return o?a({year:"2-digit"},"year"):r.num(t.year.toString().slice(-2),2);case"yyyy":return o?a({year:"numeric"},"year"):r.num(t.year,4);case"yyyyyy":return o?a({year:"numeric"},"year"):r.num(t.year,6);case"G":return l("short");case"GG":return l("long");case"GGGGG":return l("narrow");case"kk":return r.num(t.weekYear.toString().slice(-2),2);case"kkkk":return r.num(t.weekYear,4);case"W":return r.num(t.weekNumber);case"WW":return r.num(t.weekNumber,2);case"o":return r.num(t.ordinal);case"ooo":return r.num(t.ordinal,3);case"q":return r.num(t.quarter);case"qq":return r.num(t.quarter,2);case"X":return r.num(Math.floor(t.ts/1e3));case"x":return r.num(t.ts);default:return function(n){var i=e.macroTokenToFormatOpts(n);return i?r.formatWithSystemDefault(t,i):n}(n)}}))},t.formatDurationFromString=function(t,n){var r,i=this,o=function(e){switch(e[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"M":return"month";case"y":return"year";default:return null}},a=e.parseFormat(n),u=a.reduce((function(e,t){var n=t.literal,r=t.val;return n?e:e.concat(r)}),[]),s=t.shiftTo.apply(t,u.map(o).filter((function(e){return e})));return xe(a,(r=s,function(e){var t=o(e);return t?i.num(r.get(t),e.length):e}))},e}(),Le=function(){function e(e,t){this.reason=e,this.explanation=t}return e.prototype.toMessage=function(){return this.explanation?this.reason+": "+this.explanation:this.reason},e}(),Ze=function(){function e(){}var t=e.prototype;return t.offsetName=function(e,t){throw new S},t.formatOffset=function(e,t){throw new S},t.offset=function(e){throw new S},t.equals=function(e){throw new S},r(e,[{key:"type",get:function(){throw new S}},{key:"name",get:function(){throw new S}},{key:"isUniversal",get:function(){throw new S}},{key:"isValid",get:function(){throw new S}}]),e}(),Ae=null,ze=function(e){function t(){return e.apply(this,arguments)||this}o(t,e);var n=t.prototype;return n.offsetName=function(e,t){return fe(e,t.format,t.locale)},n.formatOffset=function(e,t){return ye(this.offset(e),t)},n.offset=function(e){return-new Date(e).getTimezoneOffset()},n.equals=function(e){return"system"===e.type},r(t,[{key:"type",get:function(){return"system"}},{key:"name",get:function(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return!0}}],[{key:"instance",get:function(){return null===Ae&&(Ae=new t),Ae}}]),t}(Ze),_e=RegExp("^"+pe.source+"$"),je={},qe={year:0,month:1,day:2,hour:3,minute:4,second:5},Ue={},Re=function(e){function t(n){var r;return(r=e.call(this)||this).zoneName=n,r.valid=t.isValidZone(n),r}o(t,e),t.create=function(e){return Ue[e]||(Ue[e]=new t(e)),Ue[e]},t.resetCache=function(){Ue={},je={}},t.isValidSpecifier=function(e){return!(!e||!e.match(_e))},t.isValidZone=function(e){if(!e)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(),!0}catch(e){return!1}};var n=t.prototype;return n.offsetName=function(e,t){return fe(e,t.format,t.locale,this.name)},n.formatOffset=function(e,t){return ye(this.offset(e),t)},n.offset=function(e){var t=new Date(e);if(isNaN(t))return NaN;var n,r=(n=this.name,je[n]||(je[n]=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:n,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),je[n]),i=r.formatToParts?function(e,t){for(var n=e.formatToParts(t),r=[],i=0;i<n.length;i++){var o=n[i],a=o.type,u=o.value,s=qe[a];Y(s)||(r[s]=parseInt(u,10))}return r}(r,t):function(e,t){var n=e.format(t).replace(/\u200E/g,""),r=/(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(n),i=r[1],o=r[2];return[r[3],i,o,r[4],r[5],r[6]]}(r,t),o=i[0],a=i[1],u=i[2],s=i[3],c=+t,l=c%1e3;return(se({year:o,month:a,day:u,hour:24===s?0:s,minute:i[4],second:i[5],millisecond:0})-(c-=l>=0?l:1e3+l))/6e4},n.equals=function(e){return"iana"===e.type&&e.name===this.name},r(t,[{key:"type",get:function(){return"iana"}},{key:"name",get:function(){return this.zoneName}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return this.valid}}]),t}(Ze),He=null,Pe=function(e){function t(t){var n;return(n=e.call(this)||this).fixed=t,n}o(t,e),t.instance=function(e){return 0===e?t.utcInstance:new t(e)},t.parseSpecifier=function(e){if(e){var n=e.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(n)return new t(de(n[1],n[2]))}return null};var n=t.prototype;return n.offsetName=function(){return this.name},n.formatOffset=function(e,t){return ye(this.fixed,t)},n.offset=function(){return this.fixed},n.equals=function(e){return"fixed"===e.type&&e.fixed===this.fixed},r(t,[{key:"type",get:function(){return"fixed"}},{key:"name",get:function(){return 0===this.fixed?"UTC":"UTC"+ye(this.fixed,"narrow")}},{key:"isUniversal",get:function(){return!0}},{key:"isValid",get:function(){return!0}}],[{key:"utcInstance",get:function(){return null===He&&(He=new t(0)),He}}]),t}(Ze),We=function(e){function t(t){var n;return(n=e.call(this)||this).zoneName=t,n}o(t,e);var n=t.prototype;return n.offsetName=function(){return null},n.formatOffset=function(){return""},n.offset=function(){return NaN},n.equals=function(){return!1},r(t,[{key:"type",get:function(){return"invalid"}},{key:"name",get:function(){return this.zoneName}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return!1}}]),t}(Ze);function Je(e,t){if(Y(e)||null===e)return t;if(e instanceof Ze)return e;if("string"==typeof e){var n=e.toLowerCase();return"local"===n||"system"===n?t:"utc"===n||"gmt"===n?Pe.utcInstance:Re.isValidSpecifier(n)?Re.create(e):Pe.parseSpecifier(n)||new We(e)}return G(e)?Pe.instance(e):"object"==typeof e&&e.offset&&"number"==typeof e.offset?e:new We(e)}var Ye,Ge=function(){return Date.now()},$e="system",Be=null,Qe=null,Ke=null,Xe=function(){function e(){}return e.resetCaches=function(){dt.resetCache(),Re.resetCache()},r(e,null,[{key:"now",get:function(){return Ge},set:function(e){Ge=e}},{key:"defaultZone",get:function(){return Je($e,ze.instance)},set:function(e){$e=e}},{key:"defaultLocale",get:function(){return Be},set:function(e){Be=e}},{key:"defaultNumberingSystem",get:function(){return Qe},set:function(e){Qe=e}},{key:"defaultOutputCalendar",get:function(){return Ke},set:function(e){Ke=e}},{key:"throwOnInvalid",get:function(){return Ye},set:function(e){Ye=e}}]),e}(),et=["base"],tt=["padTo","floor"],nt={},rt={};function it(e,t){void 0===t&&(t={});var n=JSON.stringify([e,t]),r=rt[n];return r||(r=new Intl.DateTimeFormat(e,t),rt[n]=r),r}var ot={},at={},ut=null;function st(e,t,n,r,i){var o=e.listingMode(n);return"error"===o?null:"en"===o?r(t):i(t)}var ct=function(){function e(e,t,n){this.padTo=n.padTo||0,this.floor=n.floor||!1,n.padTo,n.floor;var r=f(n,tt);if(!t||Object.keys(r).length>0){var o=i({useGrouping:!1},n);n.padTo>0&&(o.minimumIntegerDigits=n.padTo),this.inf=function(e,t){void 0===t&&(t={});var n=JSON.stringify([e,t]),r=ot[n];return r||(r=new Intl.NumberFormat(e,t),ot[n]=r),r}(e,o)}}return e.prototype.format=function(e){if(this.inf){var t=this.floor?Math.floor(e):e;return this.inf.format(t)}return ee(this.floor?Math.floor(e):ie(e,3),this.padTo)},e}(),lt=function(){function e(e,t,n){var r;if(this.opts=n,e.zone.isUniversal){var o=e.offset/60*-1,a=o>=0?"Etc/GMT+"+o:"Etc/GMT"+o;0!==e.offset&&Re.create(a).valid?(r=a,this.dt=e):(r="UTC",n.timeZoneName?this.dt=e:this.dt=0===e.offset?e:fr.fromMillis(e.ts+60*e.offset*1e3))}else"system"===e.zone.type?this.dt=e:(this.dt=e,r=e.zone.name);var u=i({},this.opts);r&&(u.timeZone=r),this.dtf=it(t,u)}var t=e.prototype;return t.format=function(){return this.dtf.format(this.dt.toJSDate())},t.formatToParts=function(){return this.dtf.formatToParts(this.dt.toJSDate())},t.resolvedOptions=function(){return this.dtf.resolvedOptions()},e}(),ft=function(){function e(e,t,n){this.opts=i({style:"long"},n),!t&&B()&&(this.rtf=function(e,t){void 0===t&&(t={});var n=t;n.base;var r=f(n,et),i=JSON.stringify([e,r]),o=at[i];return o||(o=new Intl.RelativeTimeFormat(e,t),at[i]=o),o}(e,n))}var t=e.prototype;return t.format=function(e,t){return this.rtf?this.rtf.format(e,t):function(e,t,n,r){void 0===n&&(n="always"),void 0===r&&(r=!1);var i={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},o=-1===["hours","minutes","seconds"].indexOf(e);if("auto"===n&&o){var a="days"===e;switch(t){case 1:return a?"tomorrow":"next "+i[e][0];case-1:return a?"yesterday":"last "+i[e][0];case 0:return a?"today":"this "+i[e][0]}}var u=Object.is(t,-0)||t<0,s=Math.abs(t),c=1===s,l=i[e],f=r?c?l[1]:l[2]||l[1]:c?i[e][0]:e;return u?s+" "+f+" ago":"in "+s+" "+f}(t,e,this.opts.numeric,"long"!==this.opts.style)},t.formatToParts=function(e,t){return this.rtf?this.rtf.formatToParts(e,t):[]},e}(),dt=function(){function e(e,t,n,r){var i=function(e){var t=e.indexOf("-u-");if(-1===t)return[e];var n,r=e.substring(0,t);try{n=it(e).resolvedOptions()}catch(e){n=it(r).resolvedOptions()}var i=n;return[r,i.numberingSystem,i.calendar]}(e),o=i[0],a=i[1],u=i[2];this.locale=o,this.numberingSystem=t||a||null,this.outputCalendar=n||u||null,this.intl=function(e,t,n){return n||t?(e+="-u",n&&(e+="-ca-"+n),t&&(e+="-nu-"+t),e):e}(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=r,this.fastNumbersCached=null}e.fromOpts=function(t){return e.create(t.locale,t.numberingSystem,t.outputCalendar,t.defaultToEN)},e.create=function(t,n,r,i){void 0===i&&(i=!1);var o=t||Xe.defaultLocale;return new e(o||(i?"en-US":ut||(ut=(new Intl.DateTimeFormat).resolvedOptions().locale)),n||Xe.defaultNumberingSystem,r||Xe.defaultOutputCalendar,o)},e.resetCache=function(){ut=null,rt={},ot={},at={}},e.fromObject=function(t){var n=void 0===t?{}:t,r=n.locale,i=n.numberingSystem,o=n.outputCalendar;return e.create(r,i,o)};var t=e.prototype;return t.listingMode=function(){var e=this.isEnglish(),t=!(null!==this.numberingSystem&&"latn"!==this.numberingSystem||null!==this.outputCalendar&&"gregory"!==this.outputCalendar);return e&&t?"en":"intl"},t.clone=function(t){return t&&0!==Object.getOwnPropertyNames(t).length?e.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,t.defaultToEN||!1):this},t.redefaultToEN=function(e){return void 0===e&&(e={}),this.clone(i({},e,{defaultToEN:!0}))},t.redefaultToSystem=function(e){return void 0===e&&(e={}),this.clone(i({},e,{defaultToEN:!1}))},t.months=function(e,t,n){var r=this;return void 0===t&&(t=!1),void 0===n&&(n=!0),st(this,e,n,Se,(function(){var n=t?{month:e,day:"numeric"}:{month:e},i=t?"format":"standalone";return r.monthsCache[i][e]||(r.monthsCache[i][e]=function(e){for(var t=[],n=1;n<=12;n++){var r=fr.utc(2016,n,1);t.push(e(r))}return t}((function(e){return r.extract(e,n,"month")}))),r.monthsCache[i][e]}))},t.weekdays=function(e,t,n){var r=this;return void 0===t&&(t=!1),void 0===n&&(n=!0),st(this,e,n,Me,(function(){var n=t?{weekday:e,year:"numeric",month:"long",day:"numeric"}:{weekday:e},i=t?"format":"standalone";return r.weekdaysCache[i][e]||(r.weekdaysCache[i][e]=function(e){for(var t=[],n=1;n<=7;n++){var r=fr.utc(2016,11,13+n);t.push(e(r))}return t}((function(e){return r.extract(e,n,"weekday")}))),r.weekdaysCache[i][e]}))},t.meridiems=function(e){var t=this;return void 0===e&&(e=!0),st(this,void 0,e,(function(){return Ne}),(function(){if(!t.meridiemCache){var e={hour:"numeric",hourCycle:"h12"};t.meridiemCache=[fr.utc(2016,11,13,9),fr.utc(2016,11,13,19)].map((function(n){return t.extract(n,e,"dayperiod")}))}return t.meridiemCache}))},t.eras=function(e,t){var n=this;return void 0===t&&(t=!0),st(this,e,t,Ie,(function(){var t={era:e};return n.eraCache[e]||(n.eraCache[e]=[fr.utc(-40,1,1),fr.utc(2017,1,1)].map((function(e){return n.extract(e,t,"era")}))),n.eraCache[e]}))},t.extract=function(e,t,n){var r=this.dtFormatter(e,t).formatToParts().find((function(e){return e.type.toLowerCase()===n}));return r?r.value:null},t.numberFormatter=function(e){return void 0===e&&(e={}),new ct(this.intl,e.forceSimple||this.fastNumbers,e)},t.dtFormatter=function(e,t){return void 0===t&&(t={}),new lt(e,this.intl,t)},t.relFormatter=function(e){return void 0===e&&(e={}),new ft(this.intl,this.isEnglish(),e)},t.listFormatter=function(e){return void 0===e&&(e={}),function(e,t){void 0===t&&(t={});var n=JSON.stringify([e,t]),r=nt[n];return r||(r=new Intl.ListFormat(e,t),nt[n]=r),r}(this.intl,e)},t.isEnglish=function(){return"en"===this.locale||"en-us"===this.locale.toLowerCase()||new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us")},t.equals=function(e){return this.locale===e.locale&&this.numberingSystem===e.numberingSystem&&this.outputCalendar===e.outputCalendar},r(e,[{key:"fastNumbers",get:function(){var e;return null==this.fastNumbersCached&&(this.fastNumbersCached=(!(e=this).numberingSystem||"latn"===e.numberingSystem)&&("latn"===e.numberingSystem||!e.locale||e.locale.startsWith("en")||"latn"===new Intl.DateTimeFormat(e.intl).resolvedOptions().numberingSystem)),this.fastNumbersCached}}]),e}();function ht(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.reduce((function(e,t){return e+t.source}),"");return RegExp("^"+r+"$")}function mt(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return t.reduce((function(t,n){var r=t[0],o=t[1],a=t[2],u=n(e,a),s=u[0],c=u[1],l=u[2];return[i({},r,s),o||c,l]}),[{},null,1]).slice(0,2)}}function yt(e){if(null==e)return[null,null];for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];for(var i=0,o=n;i<o.length;i++){var a=o[i],u=a[0],s=a[1],c=u.exec(e);if(c)return s(c)}return[null,null]}function vt(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e,n){var r,i={};for(r=0;r<t.length;r++)i[t[r]]=te(e[n+r]);return[i,null,n+r]}}var pt=/(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,gt=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,wt=RegExp(""+gt.source+pt.source+"?"),kt=RegExp("(?:T"+wt.source+")?"),St=vt("weekYear","weekNumber","weekDay"),Tt=vt("year","ordinal"),bt=RegExp(gt.source+" ?(?:"+pt.source+"|("+pe.source+"))?"),Ot=RegExp("(?: "+bt.source+")?");function Mt(e,t,n){var r=e[t];return Y(r)?n:te(r)}function Nt(e,t){return[{year:Mt(e,t),month:Mt(e,t+1,1),day:Mt(e,t+2,1)},null,t+3]}function Dt(e,t){return[{hours:Mt(e,t,0),minutes:Mt(e,t+1,0),seconds:Mt(e,t+2,0),milliseconds:re(e[t+3])},null,t+4]}function Et(e,t){var n=!e[t]&&!e[t+1],r=de(e[t+1],e[t+2]);return[{},n?null:Pe.instance(r),t+3]}function Vt(e,t){return[{},e[t]?Re.create(e[t]):null,t+1]}var It=RegExp("^T?"+gt.source+"$"),xt=/^-?P(?:(?:(-?\d{1,9}(?:\.\d{1,9})?)Y)?(?:(-?\d{1,9}(?:\.\d{1,9})?)M)?(?:(-?\d{1,9}(?:\.\d{1,9})?)W)?(?:(-?\d{1,9}(?:\.\d{1,9})?)D)?(?:T(?:(-?\d{1,9}(?:\.\d{1,9})?)H)?(?:(-?\d{1,9}(?:\.\d{1,9})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/;function Ct(e){var t=e[0],n=e[1],r=e[2],i=e[3],o=e[4],a=e[5],u=e[6],s=e[7],c=e[8],l="-"===t[0],f=s&&"-"===s[0],d=function(e,t){return void 0===t&&(t=!1),void 0!==e&&(t||e&&l)?-e:e};return[{years:d(ne(n)),months:d(ne(r)),weeks:d(ne(i)),days:d(ne(o)),hours:d(ne(a)),minutes:d(ne(u)),seconds:d(ne(s),"-0"===s),milliseconds:d(re(c),f)}]}var Ft={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Lt(e,t,n,r,i,o,a){var u={year:2===t.length?le(te(t)):te(t),month:we.indexOf(n)+1,day:te(r),hour:te(i),minute:te(o)};return a&&(u.second=te(a)),e&&(u.weekday=e.length>3?Te.indexOf(e)+1:be.indexOf(e)+1),u}var Zt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function At(e){var t,n=e[1],r=e[2],i=e[3],o=e[4],a=e[5],u=e[6],s=e[7],c=e[8],l=e[9],f=e[10],d=e[11],h=Lt(n,o,i,r,a,u,s);return t=c?Ft[c]:l?0:de(f,d),[h,new Pe(t)]}var zt=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,_t=/^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,jt=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function qt(e){var t=e[1],n=e[2],r=e[3];return[Lt(t,e[4],r,n,e[5],e[6],e[7]),Pe.utcInstance]}function Ut(e){var t=e[1],n=e[2],r=e[3],i=e[4],o=e[5],a=e[6];return[Lt(t,e[7],n,r,i,o,a),Pe.utcInstance]}var Rt=ht(/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,kt),Ht=ht(/(\d{4})-?W(\d\d)(?:-?(\d))?/,kt),Pt=ht(/(\d{4})-?(\d{3})/,kt),Wt=ht(wt),Jt=mt(Nt,Dt,Et),Yt=mt(St,Dt,Et),Gt=mt(Tt,Dt,Et),$t=mt(Dt,Et),Bt=mt(Dt),Qt=ht(/(\d{4})-(\d\d)-(\d\d)/,Ot),Kt=ht(bt),Xt=mt(Nt,Dt,Et,Vt),en=mt(Dt,Et,Vt),tn={weeks:{days:7,hours:168,minutes:10080,seconds:604800,milliseconds:6048e5},days:{hours:24,minutes:1440,seconds:86400,milliseconds:864e5},hours:{minutes:60,seconds:3600,milliseconds:36e5},minutes:{seconds:60,milliseconds:6e4},seconds:{milliseconds:1e3}},nn=i({years:{quarters:4,months:12,weeks:52,days:365,hours:8760,minutes:525600,seconds:31536e3,milliseconds:31536e6},quarters:{months:3,weeks:13,days:91,hours:2184,minutes:131040,seconds:7862400,milliseconds:78624e5},months:{weeks:4,days:30,hours:720,minutes:43200,seconds:2592e3,milliseconds:2592e6}},tn),rn=i({years:{quarters:4,months:12,weeks:52.1775,days:365.2425,hours:8765.82,minutes:525949.2,seconds:525949.2*60,milliseconds:525949.2*60*1e3},quarters:{months:3,weeks:13.044375,days:91.310625,hours:2191.455,minutes:131487.3,seconds:525949.2*60/4,milliseconds:7889237999.999999},months:{weeks:4.3481250000000005,days:30.436875,hours:730.485,minutes:43829.1,seconds:2629746,milliseconds:2629746e3}},tn),on=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],an=on.slice(0).reverse();function un(e,t,n){void 0===n&&(n=!1);var r={values:n?t.values:i({},e.values,t.values||{}),loc:e.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||e.conversionAccuracy};return new cn(r)}function sn(e,t,n,r,i){var o=e[i][n],a=t[n]/o,u=Math.sign(a)!==Math.sign(r[i])&&0!==r[i]&&Math.abs(a)<=1?function(e){return e<0?Math.floor(e):Math.ceil(e)}(a):Math.trunc(a);r[i]+=u,t[n]-=u*o}var cn=function(){function e(e){var t="longterm"===e.conversionAccuracy||!1;this.values=e.values,this.loc=e.loc||dt.create(),this.conversionAccuracy=t?"longterm":"casual",this.invalid=e.invalid||null,this.matrix=t?rn:nn,this.isLuxonDuration=!0}e.fromMillis=function(t,n){return e.fromObject({milliseconds:t},n)},e.fromObject=function(t,n){if(void 0===n&&(n={}),null==t||"object"!=typeof t)throw new k("Duration.fromObject: argument expected to be an object, got "+(null===t?"null":typeof t));return new e({values:me(t,e.normalizeUnit),loc:dt.fromObject(n),conversionAccuracy:n.conversionAccuracy})},e.fromDurationLike=function(t){if(G(t))return e.fromMillis(t);if(e.isDuration(t))return t;if("object"==typeof t)return e.fromObject(t);throw new k("Unknown duration argument "+t+" of type "+typeof t)},e.fromISO=function(t,n){var r=function(e){return yt(e,[xt,Ct])}(t),i=r[0];return i?e.fromObject(i,n):e.invalid("unparsable",'the input "'+t+"\" can't be parsed as ISO 8601")},e.fromISOTime=function(t,n){var r=function(e){return yt(e,[It,Bt])}(t),i=r[0];return i?e.fromObject(i,n):e.invalid("unparsable",'the input "'+t+"\" can't be parsed as ISO 8601")},e.invalid=function(t,n){if(void 0===n&&(n=null),!t)throw new k("need to specify a reason the Duration is invalid");var r=t instanceof Le?t:new Le(t,n);if(Xe.throwOnInvalid)throw new p(r);return new e({invalid:r})},e.normalizeUnit=function(e){var t={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[e?e.toLowerCase():e];if(!t)throw new w(e);return t},e.isDuration=function(e){return e&&e.isLuxonDuration||!1};var t=e.prototype;return t.toFormat=function(e,t){void 0===t&&(t={});var n=i({},t,{floor:!1!==t.round&&!1!==t.floor});return this.isValid?Fe.create(this.loc,n).formatDurationFromString(this,e):"Invalid Duration"},t.toHuman=function(e){var t=this;void 0===e&&(e={});var n=on.map((function(n){var r=t.values[n];return Y(r)?null:t.loc.numberFormatter(i({style:"unit",unitDisplay:"long"},e,{unit:n.slice(0,-1)})).format(r)})).filter((function(e){return e}));return this.loc.listFormatter(i({type:"conjunction",style:e.listStyle||"narrow"},e)).format(n)},t.toObject=function(){return this.isValid?i({},this.values):{}},t.toISO=function(){if(!this.isValid)return null;var e="P";return 0!==this.years&&(e+=this.years+"Y"),0===this.months&&0===this.quarters||(e+=this.months+3*this.quarters+"M"),0!==this.weeks&&(e+=this.weeks+"W"),0!==this.days&&(e+=this.days+"D"),0===this.hours&&0===this.minutes&&0===this.seconds&&0===this.milliseconds||(e+="T"),0!==this.hours&&(e+=this.hours+"H"),0!==this.minutes&&(e+=this.minutes+"M"),0===this.seconds&&0===this.milliseconds||(e+=ie(this.seconds+this.milliseconds/1e3,3)+"S"),"P"===e&&(e+="T0S"),e},t.toISOTime=function(e){if(void 0===e&&(e={}),!this.isValid)return null;var t=this.toMillis();if(t<0||t>=864e5)return null;e=i({suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended"},e);var n=this.shiftTo("hours","minutes","seconds","milliseconds"),r="basic"===e.format?"hhmm":"hh:mm";e.suppressSeconds&&0===n.seconds&&0===n.milliseconds||(r+="basic"===e.format?"ss":":ss",e.suppressMilliseconds&&0===n.milliseconds||(r+=".SSS"));var o=n.toFormat(r);return e.includePrefix&&(o="T"+o),o},t.toJSON=function(){return this.toISO()},t.toString=function(){return this.toISO()},t.toMillis=function(){return this.as("milliseconds")},t.valueOf=function(){return this.toMillis()},t.plus=function(t){if(!this.isValid)return this;for(var n,r=e.fromDurationLike(t),i={},o=h(on);!(n=o()).done;){var a=n.value;(K(r.values,a)||K(this.values,a))&&(i[a]=r.get(a)+this.get(a))}return un(this,{values:i},!0)},t.minus=function(t){if(!this.isValid)return this;var n=e.fromDurationLike(t);return this.plus(n.negate())},t.mapUnits=function(e){if(!this.isValid)return this;for(var t={},n=0,r=Object.keys(this.values);n<r.length;n++){var i=r[n];t[i]=he(e(this.values[i],i))}return un(this,{values:t},!0)},t.get=function(t){return this[e.normalizeUnit(t)]},t.set=function(t){return this.isValid?un(this,{values:i({},this.values,me(t,e.normalizeUnit))}):this},t.reconfigure=function(e){var t=void 0===e?{}:e,n=t.locale,r=t.numberingSystem,i=t.conversionAccuracy,o={loc:this.loc.clone({locale:n,numberingSystem:r})};return i&&(o.conversionAccuracy=i),un(this,o)},t.as=function(e){return this.isValid?this.shiftTo(e).get(e):NaN},t.normalize=function(){if(!this.isValid)return this;var e=this.toObject();return function(e,t){an.reduce((function(n,r){return Y(t[r])?n:(n&&sn(e,t,n,t,r),r)}),null)}(this.matrix,e),un(this,{values:e},!0)},t.shiftTo=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];if(!this.isValid)return this;if(0===n.length)return this;n=n.map((function(t){return e.normalizeUnit(t)}));for(var i,o,a={},u={},s=this.toObject(),c=h(on);!(o=c()).done;){var l=o.value;if(n.indexOf(l)>=0){i=l;var f=0;for(var d in u)f+=this.matrix[d][l]*u[d],u[d]=0;G(s[l])&&(f+=s[l]);var m=Math.trunc(f);for(var y in a[l]=m,u[l]=(1e3*f-1e3*m)/1e3,s)on.indexOf(y)>on.indexOf(l)&&sn(this.matrix,s,y,a,l)}else G(s[l])&&(u[l]=s[l])}for(var v in u)0!==u[v]&&(a[i]+=v===i?u[v]:u[v]/this.matrix[i][v]);return un(this,{values:a},!0).normalize()},t.negate=function(){if(!this.isValid)return this;for(var e={},t=0,n=Object.keys(this.values);t<n.length;t++){var r=n[t];e[r]=-this.values[r]}return un(this,{values:e},!0)},t.equals=function(e){if(!this.isValid||!e.isValid)return!1;if(!this.loc.equals(e.loc))return!1;for(var t,n=h(on);!(t=n()).done;){var r=t.value;if(i=this.values[r],o=e.values[r],!(void 0===i||0===i?void 0===o||0===o:i===o))return!1}var i,o;return!0},r(e,[{key:"locale",get:function(){return this.isValid?this.loc.locale:null}},{key:"numberingSystem",get:function(){return this.isValid?this.loc.numberingSystem:null}},{key:"years",get:function(){return this.isValid?this.values.years||0:NaN}},{key:"quarters",get:function(){return this.isValid?this.values.quarters||0:NaN}},{key:"months",get:function(){return this.isValid?this.values.months||0:NaN}},{key:"weeks",get:function(){return this.isValid?this.values.weeks||0:NaN}},{key:"days",get:function(){return this.isValid?this.values.days||0:NaN}},{key:"hours",get:function(){return this.isValid?this.values.hours||0:NaN}},{key:"minutes",get:function(){return this.isValid?this.values.minutes||0:NaN}},{key:"seconds",get:function(){return this.isValid?this.values.seconds||0:NaN}},{key:"milliseconds",get:function(){return this.isValid?this.values.milliseconds||0:NaN}},{key:"isValid",get:function(){return null===this.invalid}},{key:"invalidReason",get:function(){return this.invalid?this.invalid.reason:null}},{key:"invalidExplanation",get:function(){return this.invalid?this.invalid.explanation:null}}]),e}(),ln="Invalid Interval";function fn(e,t){return e&&e.isValid?t&&t.isValid?t<e?dn.invalid("end before start","The end of an interval must be after its start, but you had start="+e.toISO()+" and end="+t.toISO()):null:dn.invalid("missing or invalid end"):dn.invalid("missing or invalid start")}var dn=function(){function e(e){this.s=e.start,this.e=e.end,this.invalid=e.invalid||null,this.isLuxonInterval=!0}e.invalid=function(t,n){if(void 0===n&&(n=null),!t)throw new k("need to specify a reason the Interval is invalid");var r=t instanceof Le?t:new Le(t,n);if(Xe.throwOnInvalid)throw new v(r);return new e({invalid:r})},e.fromDateTimes=function(t,n){var r=dr(t),i=dr(n),o=fn(r,i);return null==o?new e({start:r,end:i}):o},e.after=function(t,n){var r=cn.fromDurationLike(n),i=dr(t);return e.fromDateTimes(i,i.plus(r))},e.before=function(t,n){var r=cn.fromDurationLike(n),i=dr(t);return e.fromDateTimes(i.minus(r),i)},e.fromISO=function(t,n){var r=(t||"").split("/",2),i=r[0],o=r[1];if(i&&o){var a,u,s,c;try{u=(a=fr.fromISO(i,n)).isValid}catch(o){u=!1}try{c=(s=fr.fromISO(o,n)).isValid}catch(o){c=!1}if(u&&c)return e.fromDateTimes(a,s);if(u){var l=cn.fromISO(o,n);if(l.isValid)return e.after(a,l)}else if(c){var f=cn.fromISO(i,n);if(f.isValid)return e.before(s,f)}}return e.invalid("unparsable",'the input "'+t+"\" can't be parsed as ISO 8601")},e.isInterval=function(e){return e&&e.isLuxonInterval||!1};var t=e.prototype;return t.length=function(e){return void 0===e&&(e="milliseconds"),this.isValid?this.toDuration.apply(this,[e]).get(e):NaN},t.count=function(e){if(void 0===e&&(e="milliseconds"),!this.isValid)return NaN;var t=this.start.startOf(e),n=this.end.startOf(e);return Math.floor(n.diff(t,e).get(e))+1},t.hasSame=function(e){return!!this.isValid&&(this.isEmpty()||this.e.minus(1).hasSame(this.s,e))},t.isEmpty=function(){return this.s.valueOf()===this.e.valueOf()},t.isAfter=function(e){return!!this.isValid&&this.s>e},t.isBefore=function(e){return!!this.isValid&&this.e<=e},t.contains=function(e){return!!this.isValid&&this.s<=e&&this.e>e},t.set=function(t){var n=void 0===t?{}:t,r=n.start,i=n.end;return this.isValid?e.fromDateTimes(r||this.s,i||this.e):this},t.splitAt=function(){var t=this;if(!this.isValid)return[];for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];for(var o=r.map(dr).filter((function(e){return t.contains(e)})).sort(),a=[],u=this.s,s=0;u<this.e;){var c=o[s]||this.e,l=+c>+this.e?this.e:c;a.push(e.fromDateTimes(u,l)),u=l,s+=1}return a},t.splitBy=function(t){var n=cn.fromDurationLike(t);if(!this.isValid||!n.isValid||0===n.as("milliseconds"))return[];for(var r,i=this.s,o=1,a=[];i<this.e;){var u=this.start.plus(n.mapUnits((function(e){return e*o})));r=+u>+this.e?this.e:u,a.push(e.fromDateTimes(i,r)),i=r,o+=1}return a},t.divideEqually=function(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]},t.overlaps=function(e){return this.e>e.s&&this.s<e.e},t.abutsStart=function(e){return!!this.isValid&&+this.e==+e.s},t.abutsEnd=function(e){return!!this.isValid&&+e.e==+this.s},t.engulfs=function(e){return!!this.isValid&&this.s<=e.s&&this.e>=e.e},t.equals=function(e){return!(!this.isValid||!e.isValid)&&this.s.equals(e.s)&&this.e.equals(e.e)},t.intersection=function(t){if(!this.isValid)return this;var n=this.s>t.s?this.s:t.s,r=this.e<t.e?this.e:t.e;return n>=r?null:e.fromDateTimes(n,r)},t.union=function(t){if(!this.isValid)return this;var n=this.s<t.s?this.s:t.s,r=this.e>t.e?this.e:t.e;return e.fromDateTimes(n,r)},e.merge=function(e){var t=e.sort((function(e,t){return e.s-t.s})).reduce((function(e,t){var n=e[0],r=e[1];return r?r.overlaps(t)||r.abutsStart(t)?[n,r.union(t)]:[n.concat([r]),t]:[n,t]}),[[],null]),n=t[0],r=t[1];return r&&n.push(r),n},e.xor=function(t){for(var n,r,i=null,o=0,a=[],u=t.map((function(e){return[{time:e.s,type:"s"},{time:e.e,type:"e"}]})),s=h((n=Array.prototype).concat.apply(n,u).sort((function(e,t){return e.time-t.time})));!(r=s()).done;){var c=r.value;1===(o+="s"===c.type?1:-1)?i=c.time:(i&&+i!=+c.time&&a.push(e.fromDateTimes(i,c.time)),i=null)}return e.merge(a)},t.difference=function(){for(var t=this,n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return e.xor([this].concat(r)).map((function(e){return t.intersection(e)})).filter((function(e){return e&&!e.isEmpty()}))},t.toString=function(){return this.isValid?"["+this.s.toISO()+" – "+this.e.toISO()+")":ln},t.toISO=function(e){return this.isValid?this.s.toISO(e)+"/"+this.e.toISO(e):ln},t.toISODate=function(){return this.isValid?this.s.toISODate()+"/"+this.e.toISODate():ln},t.toISOTime=function(e){return this.isValid?this.s.toISOTime(e)+"/"+this.e.toISOTime(e):ln},t.toFormat=function(e,t){var n=(void 0===t?{}:t).separator,r=void 0===n?" – ":n;return this.isValid?""+this.s.toFormat(e)+r+this.e.toFormat(e):ln},t.toDuration=function(e,t){return this.isValid?this.e.diff(this.s,e,t):cn.invalid(this.invalidReason)},t.mapEndpoints=function(t){return e.fromDateTimes(t(this.s),t(this.e))},r(e,[{key:"start",get:function(){return this.isValid?this.s:null}},{key:"end",get:function(){return this.isValid?this.e:null}},{key:"isValid",get:function(){return null===this.invalidReason}},{key:"invalidReason",get:function(){return this.invalid?this.invalid.reason:null}},{key:"invalidExplanation",get:function(){return this.invalid?this.invalid.explanation:null}}]),e}(),hn=function(){function e(){}return e.hasDST=function(e){void 0===e&&(e=Xe.defaultZone);var t=fr.now().setZone(e).set({month:12});return!e.isUniversal&&t.offset!==t.set({month:6}).offset},e.isValidIANAZone=function(e){return Re.isValidSpecifier(e)&&Re.isValidZone(e)},e.normalizeZone=function(e){return Je(e,Xe.defaultZone)},e.months=function(e,t){void 0===e&&(e="long");var n=void 0===t?{}:t,r=n.locale,i=void 0===r?null:r,o=n.numberingSystem,a=void 0===o?null:o,u=n.locObj,s=void 0===u?null:u,c=n.outputCalendar,l=void 0===c?"gregory":c;return(s||dt.create(i,a,l)).months(e)},e.monthsFormat=function(e,t){void 0===e&&(e="long");var n=void 0===t?{}:t,r=n.locale,i=void 0===r?null:r,o=n.numberingSystem,a=void 0===o?null:o,u=n.locObj,s=void 0===u?null:u,c=n.outputCalendar,l=void 0===c?"gregory":c;return(s||dt.create(i,a,l)).months(e,!0)},e.weekdays=function(e,t){void 0===e&&(e="long");var n=void 0===t?{}:t,r=n.locale,i=void 0===r?null:r,o=n.numberingSystem,a=void 0===o?null:o,u=n.locObj;return((void 0===u?null:u)||dt.create(i,a,null)).weekdays(e)},e.weekdaysFormat=function(e,t){void 0===e&&(e="long");var n=void 0===t?{}:t,r=n.locale,i=void 0===r?null:r,o=n.numberingSystem,a=void 0===o?null:o,u=n.locObj;return((void 0===u?null:u)||dt.create(i,a,null)).weekdays(e,!0)},e.meridiems=function(e){var t=(void 0===e?{}:e).locale,n=void 0===t?null:t;return dt.create(n).meridiems()},e.eras=function(e,t){void 0===e&&(e="short");var n=(void 0===t?{}:t).locale,r=void 0===n?null:n;return dt.create(r,null,"gregory").eras(e)},e.features=function(){return{relative:B()}},e}();function mn(e,t){var n=function(e){return e.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf()},r=n(t)-n(e);return Math.floor(cn.fromMillis(r).as("days"))}var yn={arab:"[٠-٩]",arabext:"[۰-۹]",bali:"[᭐-᭙]",beng:"[০-৯]",deva:"[०-९]",fullwide:"[0-9]",gujr:"[૦-૯]",hanidec:"[〇|一|二|三|四|五|六|七|八|九]",khmr:"[០-៩]",knda:"[೦-೯]",laoo:"[໐-໙]",limb:"[᥆-᥏]",mlym:"[൦-൯]",mong:"[᠐-᠙]",mymr:"[၀-၉]",orya:"[୦-୯]",tamldec:"[௦-௯]",telu:"[౦-౯]",thai:"[๐-๙]",tibt:"[༠-༩]",latn:"\\d"},vn={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},pn=yn.hanidec.replace(/[\[|\]]/g,"").split("");function gn(e,t){var n=e.numberingSystem;return void 0===t&&(t=""),new RegExp(""+yn[n||"latn"]+t)}function wn(e,t){return void 0===t&&(t=function(e){return e}),{regex:e,deser:function(e){var n=e[0];return t(function(e){var t=parseInt(e,10);if(isNaN(t)){t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(-1!==e[n].search(yn.hanidec))t+=pn.indexOf(e[n]);else for(var i in vn){var o=vn[i],a=o[0],u=o[1];r>=a&&r<=u&&(t+=r-a)}}return parseInt(t,10)}return t}(n))}}}var kn="( |"+String.fromCharCode(160)+")",Sn=new RegExp(kn,"g");function Tn(e){return e.replace(/\./g,"\\.?").replace(Sn,kn)}function bn(e){return e.replace(/\./g,"").replace(Sn," ").toLowerCase()}function On(e,t){return null===e?null:{regex:RegExp(e.map(Tn).join("|")),deser:function(n){var r=n[0];return e.findIndex((function(e){return bn(r)===bn(e)}))+t}}}function Mn(e,t){return{regex:e,deser:function(e){return de(e[1],e[2])},groups:t}}function Nn(e){return{regex:e,deser:function(e){return e[0]}}}var Dn={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour:{numeric:"h","2-digit":"hh"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"}},En=null;function Vn(e,t,n){var r=function(e,t){var n;return(n=Array.prototype).concat.apply(n,e.map((function(e){return function(e,t){if(e.literal)return e;var n=Fe.macroTokenToFormatOpts(e.val);if(!n)return e;var r=Fe.create(t,n).formatDateTimeParts((En||(En=fr.fromMillis(1555555555555)),En)).map((function(e){return function(e,t,n){var r=e.type,i=e.value;if("literal"===r)return{literal:!0,val:i};var o=n[r],a=Dn[r];return"object"==typeof a&&(a=a[o]),a?{literal:!1,val:a}:void 0}(e,0,n)}));return r.includes(void 0)?e:r}(e,t)})))}(Fe.parseFormat(n),e),i=r.map((function(t){return n=t,i=gn(r=e),o=gn(r,"{2}"),a=gn(r,"{3}"),u=gn(r,"{4}"),s=gn(r,"{6}"),c=gn(r,"{1,2}"),l=gn(r,"{1,3}"),f=gn(r,"{1,6}"),d=gn(r,"{1,9}"),h=gn(r,"{2,4}"),m=gn(r,"{4,6}"),y=function(e){return{regex:RegExp((t=e.val,t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"))),deser:function(e){return e[0]},literal:!0};var t},v=function(e){if(n.literal)return y(e);switch(e.val){case"G":return On(r.eras("short",!1),0);case"GG":return On(r.eras("long",!1),0);case"y":return wn(f);case"yy":case"kk":return wn(h,le);case"yyyy":case"kkkk":return wn(u);case"yyyyy":return wn(m);case"yyyyyy":return wn(s);case"M":case"L":case"d":case"H":case"h":case"m":case"q":case"s":case"W":return wn(c);case"MM":case"LL":case"dd":case"HH":case"hh":case"mm":case"qq":case"ss":case"WW":return wn(o);case"MMM":return On(r.months("short",!0,!1),1);case"MMMM":return On(r.months("long",!0,!1),1);case"LLL":return On(r.months("short",!1,!1),1);case"LLLL":return On(r.months("long",!1,!1),1);case"o":case"S":return wn(l);case"ooo":case"SSS":return wn(a);case"u":return Nn(d);case"uu":return Nn(c);case"uuu":case"E":case"c":return wn(i);case"a":return On(r.meridiems(),0);case"EEE":return On(r.weekdays("short",!1,!1),1);case"EEEE":return On(r.weekdays("long",!1,!1),1);case"ccc":return On(r.weekdays("short",!0,!1),1);case"cccc":return On(r.weekdays("long",!0,!1),1);case"Z":case"ZZ":return Mn(new RegExp("([+-]"+c.source+")(?::("+o.source+"))?"),2);case"ZZZ":return Mn(new RegExp("([+-]"+c.source+")("+o.source+")?"),2);case"z":return Nn(/[a-z_+-/]{1,256}?/i);default:return y(e)}}(n)||{invalidReason:"missing Intl.DateTimeFormat.formatToParts support"},v.token=n,v;var n,r,i,o,a,u,s,c,l,f,d,h,m,y,v})),o=i.find((function(e){return e.invalidReason}));if(o)return{input:t,tokens:r,invalidReason:o.invalidReason};var a=function(e){return["^"+e.map((function(e){return e.regex})).reduce((function(e,t){return e+"("+t.source+")"}),"")+"$",e]}(i),u=a[0],s=a[1],c=RegExp(u,"i"),l=function(e,t,n){var r=e.match(t);if(r){var i={},o=1;for(var a in n)if(K(n,a)){var u=n[a],s=u.groups?u.groups+1:1;!u.literal&&u.token&&(i[u.token.val[0]]=u.deser(r.slice(o,o+s))),o+=s}return[r,i]}return[r,{}]}(t,c,s),f=l[0],d=l[1],h=d?function(e){var t,n=null;return Y(e.z)||(n=Re.create(e.z)),Y(e.Z)||(n||(n=new Pe(e.Z)),t=e.Z),Y(e.q)||(e.M=3*(e.q-1)+1),Y(e.h)||(e.h<12&&1===e.a?e.h+=12:12===e.h&&0===e.a&&(e.h=0)),0===e.G&&e.y&&(e.y=-e.y),Y(e.u)||(e.S=re(e.u)),[Object.keys(e).reduce((function(t,n){var r=function(e){switch(e){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}}(n);return r&&(t[r]=e[n]),t}),{}),n,t]}(d):[null,null,void 0],m=h[0],y=h[1],v=h[2];if(K(d,"a")&&K(d,"H"))throw new g("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:r,regex:c,rawMatches:f,matches:d,result:m,zone:y,specificOffset:v}}var In=[0,31,59,90,120,151,181,212,243,273,304,334],xn=[0,31,60,91,121,152,182,213,244,274,305,335];function Cn(e,t){return new Le("unit out of range","you specified "+t+" (of type "+typeof t+") as a "+e+", which is invalid")}function Fn(e,t,n){var r=new Date(Date.UTC(e,t-1,n)).getUTCDay();return 0===r?7:r}function Ln(e,t,n){return n+(oe(e)?xn:In)[t-1]}function Zn(e,t){var n=oe(e)?xn:In,r=n.findIndex((function(e){return e<t}));return{month:r+1,day:t-n[r]}}function An(e){var t,n=e.year,r=e.month,o=e.day,a=Ln(n,r,o),u=Fn(n,r,o),s=Math.floor((a-u+10)/7);return s<1?s=ce(t=n-1):s>ce(n)?(t=n+1,s=1):t=n,i({weekYear:t,weekNumber:s,weekday:u},ve(e))}function zn(e){var t,n=e.weekYear,r=e.weekNumber,o=e.weekday,a=Fn(n,1,4),u=ae(n),s=7*r+o-a-3;s<1?s+=ae(t=n-1):s>u?(t=n+1,s-=ae(n)):t=n;var c=Zn(t,s);return i({year:t,month:c.month,day:c.day},ve(e))}function _n(e){var t=e.year;return i({year:t,ordinal:Ln(t,e.month,e.day)},ve(e))}function jn(e){var t=e.year,n=Zn(t,e.ordinal);return i({year:t,month:n.month,day:n.day},ve(e))}function qn(e){var t=$(e.year),n=X(e.month,1,12),r=X(e.day,1,ue(e.year,e.month));return t?n?!r&&Cn("day",e.day):Cn("month",e.month):Cn("year",e.year)}function Un(e){var t=e.hour,n=e.minute,r=e.second,i=e.millisecond,o=X(t,0,23)||24===t&&0===n&&0===r&&0===i,a=X(n,0,59),u=X(r,0,59),s=X(i,0,999);return o?a?u?!s&&Cn("millisecond",i):Cn("second",r):Cn("minute",n):Cn("hour",t)}var Rn="Invalid DateTime",Hn=864e13;function Pn(e){return new Le("unsupported zone",'the zone "'+e.name+'" is not supported')}function Wn(e){return null===e.weekData&&(e.weekData=An(e.c)),e.weekData}function Jn(e,t){var n={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new fr(i({},n,t,{old:n}))}function Yn(e,t,n){var r=e-60*t*1e3,i=n.offset(r);if(t===i)return[r,t];r-=60*(i-t)*1e3;var o=n.offset(r);return i===o?[r,i]:[e-60*Math.min(i,o)*1e3,Math.max(i,o)]}function Gn(e,t){var n=new Date(e+=60*t*1e3);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:n.getUTCHours(),minute:n.getUTCMinutes(),second:n.getUTCSeconds(),millisecond:n.getUTCMilliseconds()}}function $n(e,t,n){return Yn(se(e),t,n)}function Bn(e,t){var n=e.o,r=e.c.year+Math.trunc(t.years),o=e.c.month+Math.trunc(t.months)+3*Math.trunc(t.quarters),a=i({},e.c,{year:r,month:o,day:Math.min(e.c.day,ue(r,o))+Math.trunc(t.days)+7*Math.trunc(t.weeks)}),u=cn.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),s=Yn(se(a),n,e.zone),c=s[0],l=s[1];return 0!==u&&(c+=u,l=e.zone.offset(c)),{ts:c,o:l}}function Qn(e,t,n,r,o,a){var u=n.setZone,s=n.zone;if(e&&0!==Object.keys(e).length){var c=t||s,l=fr.fromObject(e,i({},n,{zone:c,specificOffset:a}));return u?l:l.setZone(s)}return fr.invalid(new Le("unparsable",'the input "'+o+"\" can't be parsed as "+r))}function Kn(e,t,n){return void 0===n&&(n=!0),e.isValid?Fe.create(dt.create("en-US"),{allowZ:n,forceSimple:!0}).formatDateTimeFromString(e,t):null}function Xn(e,t){var n=e.c.year>9999||e.c.year<0,r="";return n&&e.c.year>=0&&(r+="+"),r+=ee(e.c.year,n?6:4),t?(r+="-",r+=ee(e.c.month),r+="-",r+=ee(e.c.day)):(r+=ee(e.c.month),r+=ee(e.c.day)),r}function er(e,t,n,r,i){var o=ee(e.c.hour);return t?(o+=":",o+=ee(e.c.minute),0===e.c.second&&n||(o+=":")):o+=ee(e.c.minute),0===e.c.second&&n||(o+=ee(e.c.second),0===e.c.millisecond&&r||(o+=".",o+=ee(e.c.millisecond,3))),i&&(e.isOffsetFixed&&0===e.offset?o+="Z":e.o<0?(o+="-",o+=ee(Math.trunc(-e.o/60)),o+=":",o+=ee(Math.trunc(-e.o%60))):(o+="+",o+=ee(Math.trunc(e.o/60)),o+=":",o+=ee(Math.trunc(e.o%60)))),o}var tr={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},nr={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},rr={ordinal:1,hour:0,minute:0,second:0,millisecond:0},ir=["year","month","day","hour","minute","second","millisecond"],or=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],ar=["year","ordinal","hour","minute","second","millisecond"];function ur(e){var t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[e.toLowerCase()];if(!t)throw new w(e);return t}function sr(e,t){var n,r,i=Je(t.zone,Xe.defaultZone),o=dt.fromObject(t),a=Xe.now();if(Y(e.year))n=a;else{for(var u,s=h(ir);!(u=s()).done;){var c=u.value;Y(e[c])&&(e[c]=tr[c])}var l=qn(e)||Un(e);if(l)return fr.invalid(l);var f=$n(e,i.offset(a),i);n=f[0],r=f[1]}return new fr({ts:n,zone:i,loc:o,o:r})}function cr(e,t,n){var r=!!Y(n.round)||n.round,i=function(e,i){return e=ie(e,r||n.calendary?0:2,!0),t.loc.clone(n).relFormatter(n).format(e,i)},o=function(r){return n.calendary?t.hasSame(e,r)?0:t.startOf(r).diff(e.startOf(r),r).get(r):t.diff(e,r).get(r)};if(n.unit)return i(o(n.unit),n.unit);for(var a,u=h(n.units);!(a=u()).done;){var s=a.value,c=o(s);if(Math.abs(c)>=1)return i(c,s)}return i(e>t?-0:0,n.units[n.units.length-1])}function lr(e){var t,n={};return e.length>0&&"object"==typeof e[e.length-1]?(n=e[e.length-1],t=Array.from(e).slice(0,e.length-1)):t=Array.from(e),[n,t]}var fr=function(){function e(e){var t=e.zone||Xe.defaultZone,n=e.invalid||(Number.isNaN(e.ts)?new Le("invalid input"):null)||(t.isValid?null:Pn(t));this.ts=Y(e.ts)?Xe.now():e.ts;var r=null,i=null;if(!n)if(e.old&&e.old.ts===this.ts&&e.old.zone.equals(t)){var o=[e.old.c,e.old.o];r=o[0],i=o[1]}else{var a=t.offset(this.ts);r=Gn(this.ts,a),r=(n=Number.isNaN(r.year)?new Le("invalid input"):null)?null:r,i=n?null:a}this._zone=t,this.loc=e.loc||dt.create(),this.invalid=n,this.weekData=null,this.c=r,this.o=i,this.isLuxonDateTime=!0}e.now=function(){return new e({})},e.local=function(){var e=lr(arguments),t=e[0],n=e[1],r=n[0],i=n[1],o=n[2],a=n[3],u=n[4],s=n[5],c=n[6];return sr({year:r,month:i,day:o,hour:a,minute:u,second:s,millisecond:c},t)},e.utc=function(){var e=lr(arguments),t=e[0],n=e[1],r=n[0],i=n[1],o=n[2],a=n[3],u=n[4],s=n[5],c=n[6];return t.zone=Pe.utcInstance,sr({year:r,month:i,day:o,hour:a,minute:u,second:s,millisecond:c},t)},e.fromJSDate=function(t,n){void 0===n&&(n={});var r,i=(r=t,"[object Date]"===Object.prototype.toString.call(r)?t.valueOf():NaN);if(Number.isNaN(i))return e.invalid("invalid input");var o=Je(n.zone,Xe.defaultZone);return o.isValid?new e({ts:i,zone:o,loc:dt.fromObject(n)}):e.invalid(Pn(o))},e.fromMillis=function(t,n){if(void 0===n&&(n={}),G(t))return t<-Hn||t>Hn?e.invalid("Timestamp out of range"):new e({ts:t,zone:Je(n.zone,Xe.defaultZone),loc:dt.fromObject(n)});throw new k("fromMillis requires a numerical input, but received a "+typeof t+" with value "+t)},e.fromSeconds=function(t,n){if(void 0===n&&(n={}),G(t))return new e({ts:1e3*t,zone:Je(n.zone,Xe.defaultZone),loc:dt.fromObject(n)});throw new k("fromSeconds requires a numerical input")},e.fromObject=function(t,n){void 0===n&&(n={}),t=t||{};var r=Je(n.zone,Xe.defaultZone);if(!r.isValid)return e.invalid(Pn(r));var i=Xe.now(),o=Y(n.specificOffset)?r.offset(i):n.specificOffset,a=me(t,ur),u=!Y(a.ordinal),s=!Y(a.year),c=!Y(a.month)||!Y(a.day),l=s||c,f=a.weekYear||a.weekNumber,d=dt.fromObject(n);if((l||u)&&f)throw new g("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(c&&u)throw new g("Can't mix ordinal dates with month/day");var m,y,v=f||a.weekday&&!l,p=Gn(i,o);v?(m=or,y=nr,p=An(p)):u?(m=ar,y=rr,p=_n(p)):(m=ir,y=tr);for(var w,k=!1,S=h(m);!(w=S()).done;){var T=w.value;Y(a[T])?a[T]=k?y[T]:p[T]:k=!0}var b=v?function(e){var t=$(e.weekYear),n=X(e.weekNumber,1,ce(e.weekYear)),r=X(e.weekday,1,7);return t?n?!r&&Cn("weekday",e.weekday):Cn("week",e.week):Cn("weekYear",e.weekYear)}(a):u?function(e){var t=$(e.year),n=X(e.ordinal,1,ae(e.year));return t?!n&&Cn("ordinal",e.ordinal):Cn("year",e.year)}(a):qn(a),O=b||Un(a);if(O)return e.invalid(O);var M=$n(v?zn(a):u?jn(a):a,o,r),N=new e({ts:M[0],zone:r,o:M[1],loc:d});return a.weekday&&l&&t.weekday!==N.weekday?e.invalid("mismatched weekday","you can't specify both a weekday of "+a.weekday+" and a date of "+N.toISO()):N},e.fromISO=function(e,t){void 0===t&&(t={});var n=function(e){return yt(e,[Rt,Jt],[Ht,Yt],[Pt,Gt],[Wt,$t])}(e);return Qn(n[0],n[1],t,"ISO 8601",e)},e.fromRFC2822=function(e,t){void 0===t&&(t={});var n=function(e){return yt(function(e){return e.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}(e),[Zt,At])}(e);return Qn(n[0],n[1],t,"RFC 2822",e)},e.fromHTTP=function(e,t){void 0===t&&(t={});var n=function(e){return yt(e,[zt,qt],[_t,qt],[jt,Ut])}(e);return Qn(n[0],n[1],t,"HTTP",t)},e.fromFormat=function(t,n,r){if(void 0===r&&(r={}),Y(t)||Y(n))throw new k("fromFormat requires an input string and a format");var i=r,o=i.locale,a=void 0===o?null:o,u=i.numberingSystem,s=void 0===u?null:u,c=function(e,t,n){var r=Vn(e,t,n);return[r.result,r.zone,r.specificOffset,r.invalidReason]}(dt.fromOpts({locale:a,numberingSystem:s,defaultToEN:!0}),t,n),l=c[0],f=c[1],d=c[2],h=c[3];return h?e.invalid(h):Qn(l,f,r,"format "+n,t,d)},e.fromString=function(t,n,r){return void 0===r&&(r={}),e.fromFormat(t,n,r)},e.fromSQL=function(e,t){void 0===t&&(t={});var n=function(e){return yt(e,[Qt,Xt],[Kt,en])}(e);return Qn(n[0],n[1],t,"SQL",e)},e.invalid=function(t,n){if(void 0===n&&(n=null),!t)throw new k("need to specify a reason the DateTime is invalid");var r=t instanceof Le?t:new Le(t,n);if(Xe.throwOnInvalid)throw new y(r);return new e({invalid:r})},e.isDateTime=function(e){return e&&e.isLuxonDateTime||!1};var t=e.prototype;return t.get=function(e){return this[e]},t.resolvedLocaleOptions=function(e){void 0===e&&(e={});var t=Fe.create(this.loc.clone(e),e).resolvedOptions(this);return{locale:t.locale,numberingSystem:t.numberingSystem,outputCalendar:t.calendar}},t.toUTC=function(e,t){return void 0===e&&(e=0),void 0===t&&(t={}),this.setZone(Pe.instance(e),t)},t.toLocal=function(){return this.setZone(Xe.defaultZone)},t.setZone=function(t,n){var r=void 0===n?{}:n,i=r.keepLocalTime,o=void 0!==i&&i,a=r.keepCalendarTime,u=void 0!==a&&a;if((t=Je(t,Xe.defaultZone)).equals(this.zone))return this;if(t.isValid){var s=this.ts;if(o||u){var c=t.offset(this.ts);s=$n(this.toObject(),c,t)[0]}return Jn(this,{ts:s,zone:t})}return e.invalid(Pn(t))},t.reconfigure=function(e){var t=void 0===e?{}:e,n=t.locale,r=t.numberingSystem,i=t.outputCalendar;return Jn(this,{loc:this.loc.clone({locale:n,numberingSystem:r,outputCalendar:i})})},t.setLocale=function(e){return this.reconfigure({locale:e})},t.set=function(e){if(!this.isValid)return this;var t,n=me(e,ur),r=!Y(n.weekYear)||!Y(n.weekNumber)||!Y(n.weekday),o=!Y(n.ordinal),a=!Y(n.year),u=!Y(n.month)||!Y(n.day),s=a||u,c=n.weekYear||n.weekNumber;if((s||o)&&c)throw new g("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(u&&o)throw new g("Can't mix ordinal dates with month/day");r?t=zn(i({},An(this.c),n)):Y(n.ordinal)?(t=i({},this.toObject(),n),Y(n.day)&&(t.day=Math.min(ue(t.year,t.month),t.day))):t=jn(i({},_n(this.c),n));var l=$n(t,this.o,this.zone);return Jn(this,{ts:l[0],o:l[1]})},t.plus=function(e){return this.isValid?Jn(this,Bn(this,cn.fromDurationLike(e))):this},t.minus=function(e){return this.isValid?Jn(this,Bn(this,cn.fromDurationLike(e).negate())):this},t.startOf=function(e){if(!this.isValid)return this;var t={},n=cn.normalizeUnit(e);switch(n){case"years":t.month=1;case"quarters":case"months":t.day=1;case"weeks":case"days":t.hour=0;case"hours":t.minute=0;case"minutes":t.second=0;case"seconds":t.millisecond=0}if("weeks"===n&&(t.weekday=1),"quarters"===n){var r=Math.ceil(this.month/3);t.month=3*(r-1)+1}return this.set(t)},t.endOf=function(e){var t;return this.isValid?this.plus((t={},t[e]=1,t)).startOf(e).minus(1):this},t.toFormat=function(e,t){return void 0===t&&(t={}),this.isValid?Fe.create(this.loc.redefaultToEN(t)).formatDateTimeFromString(this,e):Rn},t.toLocaleString=function(e,t){return void 0===e&&(e=M),void 0===t&&(t={}),this.isValid?Fe.create(this.loc.clone(t),e).formatDateTime(this):Rn},t.toLocaleParts=function(e){return void 0===e&&(e={}),this.isValid?Fe.create(this.loc.clone(e),e).formatDateTimeParts(this):[]},t.toISO=function(e){var t=void 0===e?{}:e,n=t.format,r=void 0===n?"extended":n,i=t.suppressSeconds,o=void 0!==i&&i,a=t.suppressMilliseconds,u=void 0!==a&&a,s=t.includeOffset,c=void 0===s||s;if(!this.isValid)return null;var l="extended"===r,f=Xn(this,l);return(f+="T")+er(this,l,o,u,c)},t.toISODate=function(e){var t=(void 0===e?{}:e).format,n=void 0===t?"extended":t;return this.isValid?Xn(this,"extended"===n):null},t.toISOWeekDate=function(){return Kn(this,"kkkk-'W'WW-c")},t.toISOTime=function(e){var t=void 0===e?{}:e,n=t.suppressMilliseconds,r=void 0!==n&&n,i=t.suppressSeconds,o=void 0!==i&&i,a=t.includeOffset,u=void 0===a||a,s=t.includePrefix,c=void 0!==s&&s,l=t.format,f=void 0===l?"extended":l;return this.isValid?(c?"T":"")+er(this,"extended"===f,o,r,u):null},t.toRFC2822=function(){return Kn(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)},t.toHTTP=function(){return Kn(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")},t.toSQLDate=function(){return this.isValid?Xn(this,!0):null},t.toSQLTime=function(e){var t=void 0===e?{}:e,n=t.includeOffset,r=void 0===n||n,i=t.includeZone,o=void 0!==i&&i,a="HH:mm:ss.SSS";return(o||r)&&(a+=" ",o?a+="z":r&&(a+="ZZ")),Kn(this,a,!0)},t.toSQL=function(e){return void 0===e&&(e={}),this.isValid?this.toSQLDate()+" "+this.toSQLTime(e):null},t.toString=function(){return this.isValid?this.toISO():Rn},t.valueOf=function(){return this.toMillis()},t.toMillis=function(){return this.isValid?this.ts:NaN},t.toSeconds=function(){return this.isValid?this.ts/1e3:NaN},t.toJSON=function(){return this.toISO()},t.toBSON=function(){return this.toJSDate()},t.toObject=function(e){if(void 0===e&&(e={}),!this.isValid)return{};var t=i({},this.c);return e.includeConfig&&(t.outputCalendar=this.outputCalendar,t.numberingSystem=this.loc.numberingSystem,t.locale=this.loc.locale),t},t.toJSDate=function(){return new Date(this.isValid?this.ts:NaN)},t.diff=function(e,t,n){if(void 0===t&&(t="milliseconds"),void 0===n&&(n={}),!this.isValid||!e.isValid)return cn.invalid("created by diffing an invalid DateTime");var r,o=i({locale:this.locale,numberingSystem:this.numberingSystem},n),a=(r=t,Array.isArray(r)?r:[r]).map(cn.normalizeUnit),u=e.valueOf()>this.valueOf(),s=function(e,t,n,r){var i,o=function(e,t,n){for(var r,i,o={},a=0,u=[["years",function(e,t){return t.year-e.year}],["quarters",function(e,t){return t.quarter-e.quarter}],["months",function(e,t){return t.month-e.month+12*(t.year-e.year)}],["weeks",function(e,t){var n=mn(e,t);return(n-n%7)/7}],["days",mn]];a<u.length;a++){var s=u[a],c=s[0],l=s[1];if(n.indexOf(c)>=0){var f;r=c;var d,h=l(e,t);(i=e.plus(((f={})[c]=h,f)))>t?(e=e.plus(((d={})[c]=h-1,d)),h-=1):e=i,o[c]=h}}return[e,o,i,r]}(e,t,n),a=o[0],u=o[1],s=o[2],c=o[3],l=t-a,f=n.filter((function(e){return["hours","minutes","seconds","milliseconds"].indexOf(e)>=0}));0===f.length&&(s<t&&(s=a.plus(((i={})[c]=1,i))),s!==a&&(u[c]=(u[c]||0)+l/(s-a)));var d,h=cn.fromObject(u,r);return f.length>0?(d=cn.fromMillis(l,r)).shiftTo.apply(d,f).plus(h):h}(u?this:e,u?e:this,a,o);return u?s.negate():s},t.diffNow=function(t,n){return void 0===t&&(t="milliseconds"),void 0===n&&(n={}),this.diff(e.now(),t,n)},t.until=function(e){return this.isValid?dn.fromDateTimes(this,e):this},t.hasSame=function(e,t){if(!this.isValid)return!1;var n=e.valueOf(),r=this.setZone(e.zone,{keepLocalTime:!0});return r.startOf(t)<=n&&n<=r.endOf(t)},t.equals=function(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)},t.toRelative=function(t){if(void 0===t&&(t={}),!this.isValid)return null;var n=t.base||e.fromObject({},{zone:this.zone}),r=t.padding?this<n?-t.padding:t.padding:0,o=["years","months","days","hours","minutes","seconds"],a=t.unit;return Array.isArray(t.unit)&&(o=t.unit,a=void 0),cr(n,this.plus(r),i({},t,{numeric:"always",units:o,unit:a}))},t.toRelativeCalendar=function(t){return void 0===t&&(t={}),this.isValid?cr(t.base||e.fromObject({},{zone:this.zone}),this,i({},t,{numeric:"auto",units:["years","months","days"],calendary:!0})):null},e.min=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];if(!n.every(e.isDateTime))throw new k("min requires all arguments be DateTimes");return Q(n,(function(e){return e.valueOf()}),Math.min)},e.max=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];if(!n.every(e.isDateTime))throw new k("max requires all arguments be DateTimes");return Q(n,(function(e){return e.valueOf()}),Math.max)},e.fromFormatExplain=function(e,t,n){void 0===n&&(n={});var r=n,i=r.locale,o=void 0===i?null:i,a=r.numberingSystem,u=void 0===a?null:a;return Vn(dt.fromOpts({locale:o,numberingSystem:u,defaultToEN:!0}),e,t)},e.fromStringExplain=function(t,n,r){return void 0===r&&(r={}),e.fromFormatExplain(t,n,r)},r(e,[{key:"isValid",get:function(){return null===this.invalid}},{key:"invalidReason",get:function(){return this.invalid?this.invalid.reason:null}},{key:"invalidExplanation",get:function(){return this.invalid?this.invalid.explanation:null}},{key:"locale",get:function(){return this.isValid?this.loc.locale:null}},{key:"numberingSystem",get:function(){return this.isValid?this.loc.numberingSystem:null}},{key:"outputCalendar",get:function(){return this.isValid?this.loc.outputCalendar:null}},{key:"zone",get:function(){return this._zone}},{key:"zoneName",get:function(){return this.isValid?this.zone.name:null}},{key:"year",get:function(){return this.isValid?this.c.year:NaN}},{key:"quarter",get:function(){return this.isValid?Math.ceil(this.c.month/3):NaN}},{key:"month",get:function(){return this.isValid?this.c.month:NaN}},{key:"day",get:function(){return this.isValid?this.c.day:NaN}},{key:"hour",get:function(){return this.isValid?this.c.hour:NaN}},{key:"minute",get:function(){return this.isValid?this.c.minute:NaN}},{key:"second",get:function(){return this.isValid?this.c.second:NaN}},{key:"millisecond",get:function(){return this.isValid?this.c.millisecond:NaN}},{key:"weekYear",get:function(){return this.isValid?Wn(this).weekYear:NaN}},{key:"weekNumber",get:function(){return this.isValid?Wn(this).weekNumber:NaN}},{key:"weekday",get:function(){return this.isValid?Wn(this).weekday:NaN}},{key:"ordinal",get:function(){return this.isValid?_n(this.c).ordinal:NaN}},{key:"monthShort",get:function(){return this.isValid?hn.months("short",{locObj:this.loc})[this.month-1]:null}},{key:"monthLong",get:function(){return this.isValid?hn.months("long",{locObj:this.loc})[this.month-1]:null}},{key:"weekdayShort",get:function(){return this.isValid?hn.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}},{key:"weekdayLong",get:function(){return this.isValid?hn.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}},{key:"offset",get:function(){return this.isValid?+this.o:NaN}},{key:"offsetNameShort",get:function(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}},{key:"offsetNameLong",get:function(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}},{key:"isOffsetFixed",get:function(){return this.isValid?this.zone.isUniversal:null}},{key:"isInDST",get:function(){return!this.isOffsetFixed&&(this.offset>this.set({month:1}).offset||this.offset>this.set({month:5}).offset)}},{key:"isInLeapYear",get:function(){return oe(this.year)}},{key:"daysInMonth",get:function(){return ue(this.year,this.month)}},{key:"daysInYear",get:function(){return this.isValid?ae(this.year):NaN}},{key:"weeksInWeekYear",get:function(){return this.isValid?ce(this.weekYear):NaN}}],[{key:"DATE_SHORT",get:function(){return M}},{key:"DATE_MED",get:function(){return N}},{key:"DATE_MED_WITH_WEEKDAY",get:function(){return D}},{key:"DATE_FULL",get:function(){return E}},{key:"DATE_HUGE",get:function(){return V}},{key:"TIME_SIMPLE",get:function(){return I}},{key:"TIME_WITH_SECONDS",get:function(){return x}},{key:"TIME_WITH_SHORT_OFFSET",get:function(){return C}},{key:"TIME_WITH_LONG_OFFSET",get:function(){return F}},{key:"TIME_24_SIMPLE",get:function(){return L}},{key:"TIME_24_WITH_SECONDS",get:function(){return Z}},{key:"TIME_24_WITH_SHORT_OFFSET",get:function(){return A}},{key:"TIME_24_WITH_LONG_OFFSET",get:function(){return z}},{key:"DATETIME_SHORT",get:function(){return _}},{key:"DATETIME_SHORT_WITH_SECONDS",get:function(){return j}},{key:"DATETIME_MED",get:function(){return q}},{key:"DATETIME_MED_WITH_SECONDS",get:function(){return U}},{key:"DATETIME_MED_WITH_WEEKDAY",get:function(){return R}},{key:"DATETIME_FULL",get:function(){return H}},{key:"DATETIME_FULL_WITH_SECONDS",get:function(){return P}},{key:"DATETIME_HUGE",get:function(){return W}},{key:"DATETIME_HUGE_WITH_SECONDS",get:function(){return J}}]),e}();function dr(e){if(fr.isDateTime(e))return e;if(e&&e.valueOf&&G(e.valueOf()))return fr.fromJSDate(e);if(e&&"object"==typeof e)return fr.fromObject(e);throw new k("Unknown datetime argument: "+e+", of type "+typeof e)}t.DateTime=fr,t.Duration=cn,t.FixedOffsetZone=Pe,t.IANAZone=Re,t.Info=hn,t.Interval=dn,t.InvalidZone=We,t.Settings=Xe,t.SystemZone=ze,t.VERSION="2.3.0",t.Zone=Ze}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[491],{8491:(e,o,t)=>{t.r(o),t.d(o,{default:()=>_});var n=t(6252),l=t(3577),u=t(2262),a=t(7621),r=t(2791);const c={class:"theme-container"},s={class:"theme-default-content"},d=(0,n._)("h1",null,"404",-1),_=(0,n.aZ)({setup(e){var o,t,_;const h=(0,a.I)(),v=(0,r.X6)(),k=null!=(o=v.value.notFound)?o:["Not Found"],i=null!=(t=v.value.home)?t:h.value,w=null!=(_=v.value.backToHome)?_:"Back to home";return(e,o)=>{const t=(0,n.up)("RouterLink");return(0,n.wg)(),(0,n.iD)("div",c,[(0,n._)("div",s,[d,(0,n._)("blockquote",null,(0,l.zw)(k[Math.floor(Math.random()*k.length)]),1),(0,n.Wm)(t,{to:(0,u.SU)(i)},{default:(0,n.w5)((()=>[(0,n.Uk)((0,l.zw)((0,u.SU)(w)),1)])),_:1},8,["to"])])])}}})}}]);
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[491],{8491:(e,o,t)=>{t.r(o),t.d(o,{default:()=>_});var n=t(6252),l=t(3577),u=t(2262),a=t(7621),r=t(3311);const c={class:"theme-container"},s={class:"theme-default-content"},d=(0,n._)("h1",null,"404",-1),_=(0,n.aZ)({setup(e){var o,t,_;const h=(0,a.I)(),v=(0,r.X6)(),k=null!=(o=v.value.notFound)?o:["Not Found"],i=null!=(t=v.value.home)?t:h.value,w=null!=(_=v.value.backToHome)?_:"Back to home";return(e,o)=>{const t=(0,n.up)("RouterLink");return(0,n.wg)(),(0,n.iD)("div",c,[(0,n._)("div",s,[d,(0,n._)("blockquote",null,(0,l.zw)(k[Math.floor(Math.random()*k.length)]),1),(0,n.Wm)(t,{to:(0,u.SU)(i)},{default:(0,n.w5)((()=>[(0,n.Uk)((0,l.zw)((0,u.SU)(w)),1)])),_:1},8,["to"])])])}}})}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[555],{3555:(t,e,n)=>{const{DateTime:r}=n(9490);function o(t,e,n=null){const r=n??t[t.length-1];return t.map(((n,o,i)=>{for(let n=o+1;n<i.length;n++)if(e[n])return u(t[o],t[n]);return u(n,r)}))}function u(t,e){return i(t-e)}function i(t){return Math.round(1e4*t)/1e4}function f(t,e){return r.fromISO(t).toISODate()===r.fromISO(e).toISODate()}t.exports={booleanConfig:function(t){return"true"===t||!0===t},countAtEnd:function(t,e){let n=0;for(let r=t.length-1;r>=0&&t[r]===e;r--)n++;return n},extractPlanForDate:function(t,e){const n={};return n.hours=t.hours.filter((t=>f(e,t.start))),n.schedule=t.schedule.filter((t=>f(e,t.time))),n},fillArray:function(t,e){if(void 0===t||e<=0)return[];res=[];for(let n=0;n<e;n++)res.push(t);return res},firstOn:function(t,e,n=0){return[...t,n][[...e,!0].findIndex((t=>t))]},getDiff:u,getDiffToNextOn:o,getEffectiveConfig:function(t,e){const n=t.context().get("config");if(e?.payload?.config){const r=e.payload.config;Object.keys(r).forEach((t=>{n[t]=r[t]})),t.context().set("config",n)}return n},getSavings:function(t,e,n=null){return o(t,e,n).map(((t,n)=>e[n]?null:t))},getStartAtIndex:function(t,e,n){return t.scheduleOnlyFromCurrentTime?e.map((t=>r.fromISO(t.start))).filter((t=>t<n)).length:0},isSameDate:f,loadDayData:function(t,e){const n=e.toISODate();return t.context().get(n)??{schedule:[],hours:[]}},makeSchedule:function(t,e,n=null){const r=[];let o=n;for(let n=0;n<e.length;n++){const u=t[n];if(u!==o){const t=e[n];r.push({time:t,value:u}),o=u}}return r},roundPrice:i,sortedIndex:function(t){return t.map(((t,e)=>({i:e,value:t}))).sort(((t,e)=>t.value>e.value?-1:t.value<e.value?1:0)).map((t=>t.i))},validationFailure:function(t,e,n=null){t.status({fill:"red",shape:"ring",text:n??e}),t.warn(e)}}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[143],{7453:(e,t,a)=>{a.d(t,{g:()=>l});var n=a(7478),d=a(6971),s=a(1598),o=a(7406),i=a(6252),r=a(7444);const l=[n.Z,d.Z,s.Z,o.Z,({app:e})=>{e.component("BestSaveVerificator",(0,i.RC)((()=>Promise.all([a.e(896),a.e(331)]).then(a.bind(a,6331))))),e.component("DonateButtons",(0,i.RC)((()=>Promise.all([a.e(835),a.e(811)]).then(a.bind(a,6811)))))},({app:e,router:t,siteData:a})=>{e.use(r.ZP)}]},9947:(e,t,a)=>{a.d(t,{p:()=>n});const n=[a(3051).Z]},4611:(e,t,a)=>{a.d(t,{l:()=>o});var n=a(1263),d=a(6243),s=a(8866);const o=[n.Z,d.Z,s.Z]},4150:(e,t,a)=>{a.d(t,{Z:()=>d});var n=a(6252);const d={404:(0,n.RC)((()=>a.e(491).then(a.bind(a,8491)))),Layout:(0,n.RC)((()=>a.e(229).then(a.bind(a,4229))))}},6056:(e,t,a)=>{a.d(t,{b:()=>d});var n=a(6252);const d={"v-8daa1a0e":(0,n.RC)((()=>a.e(509).then(a.bind(a,425)))),"v-510ed0d4":(0,n.RC)((()=>a.e(495).then(a.bind(a,7203)))),"v-0aca7ba6":(0,n.RC)((()=>a.e(27).then(a.bind(a,9637)))),"v-84304104":(0,n.RC)((()=>a.e(254).then(a.bind(a,7994)))),"v-1b3a0ab8":(0,n.RC)((()=>a.e(545).then(a.bind(a,4657)))),"v-0607240a":(0,n.RC)((()=>a.e(35).then(a.bind(a,3328)))),"v-61f728ca":(0,n.RC)((()=>a.e(283).then(a.bind(a,6546)))),"v-30acb564":(0,n.RC)((()=>a.e(901).then(a.bind(a,2870)))),"v-5db8da3a":(0,n.RC)((()=>a.e(625).then(a.bind(a,9426)))),"v-7c87f26e":(0,n.RC)((()=>a.e(889).then(a.bind(a,7883)))),"v-7446a652":(0,n.RC)((()=>a.e(969).then(a.bind(a,1773)))),"v-29504124":(0,n.RC)((()=>a.e(525).then(a.bind(a,3361)))),"v-fffb8e28":(0,n.RC)((()=>a.e(807).then(a.bind(a,8253)))),"v-e8c55052":(0,n.RC)((()=>a.e(651).then(a.bind(a,5262)))),"v-b4a42144":(0,n.RC)((()=>a.e(407).then(a.bind(a,1206)))),"v-1ad821fa":(0,n.RC)((()=>a.e(22).then(a.bind(a,8718)))),"v-08683c60":(0,n.RC)((()=>a.e(332).then(a.bind(a,7143)))),"v-1e2b191e":(0,n.RC)((()=>a.e(737).then(a.bind(a,2733)))),"v-677dfaed":(0,n.RC)((()=>a.e(745).then(a.bind(a,3645)))),"v-0b5e3c8c":(0,n.RC)((()=>a.e(363).then(a.bind(a,2435)))),"v-4c28314d":(0,n.RC)((()=>a.e(684).then(a.bind(a,5294)))),"v-4637f9e4":(0,n.RC)((()=>a.e(418).then(a.bind(a,7951)))),"v-5954bcb2":(0,n.RC)((()=>a.e(317).then(a.bind(a,886)))),"v-3706649a":(0,n.RC)((()=>a.e(88).then(a.bind(a,8109))))}},9706:(e,t,a)=>{a.d(t,{T:()=>n});const n={"v-8daa1a0e":()=>a.e(509).then(a.bind(a,6464)).then((({data:e})=>e)),"v-510ed0d4":()=>a.e(495).then(a.bind(a,3707)).then((({data:e})=>e)),"v-0aca7ba6":()=>a.e(27).then(a.bind(a,7726)).then((({data:e})=>e)),"v-84304104":()=>a.e(254).then(a.bind(a,8800)).then((({data:e})=>e)),"v-1b3a0ab8":()=>a.e(545).then(a.bind(a,6739)).then((({data:e})=>e)),"v-0607240a":()=>a.e(35).then(a.bind(a,3811)).then((({data:e})=>e)),"v-61f728ca":()=>a.e(283).then(a.bind(a,4773)).then((({data:e})=>e)),"v-30acb564":()=>a.e(901).then(a.bind(a,8835)).then((({data:e})=>e)),"v-5db8da3a":()=>a.e(625).then(a.bind(a,8682)).then((({data:e})=>e)),"v-7c87f26e":()=>a.e(889).then(a.bind(a,9459)).then((({data:e})=>e)),"v-7446a652":()=>a.e(969).then(a.bind(a,4129)).then((({data:e})=>e)),"v-29504124":()=>a.e(525).then(a.bind(a,5682)).then((({data:e})=>e)),"v-fffb8e28":()=>a.e(807).then(a.bind(a,9570)).then((({data:e})=>e)),"v-e8c55052":()=>a.e(651).then(a.bind(a,3029)).then((({data:e})=>e)),"v-b4a42144":()=>a.e(407).then(a.bind(a,7952)).then((({data:e})=>e)),"v-1ad821fa":()=>a.e(22).then(a.bind(a,2336)).then((({data:e})=>e)),"v-08683c60":()=>a.e(332).then(a.bind(a,5845)).then((({data:e})=>e)),"v-1e2b191e":()=>a.e(737).then(a.bind(a,1510)).then((({data:e})=>e)),"v-677dfaed":()=>a.e(745).then(a.bind(a,192)).then((({data:e})=>e)),"v-0b5e3c8c":()=>a.e(363).then(a.bind(a,3594)).then((({data:e})=>e)),"v-4c28314d":()=>a.e(684).then(a.bind(a,4907)).then((({data:e})=>e)),"v-4637f9e4":()=>a.e(418).then(a.bind(a,3959)).then((({data:e})=>e)),"v-5954bcb2":()=>a.e(317).then(a.bind(a,1535)).then((({data:e})=>e)),"v-3706649a":()=>a.e(88).then(a.bind(a,1801)).then((({data:e})=>e))}},4634:(e,t,a)=>{a.d(t,{g:()=>d});var n=a(4802);const d=[["v-8daa1a0e","/",{title:""},["/index.html","/README.md"]],["v-510ed0d4","/changelog/",{title:"Change Log"},["/changelog/index.html","/changelog/README.md"]],["v-0aca7ba6","/examples/",{title:"Examples"},["/examples/index.html","/examples/README.md"]],["v-84304104","/examples/example-cascade-temperature-control.html",{title:"Cascade temperature control"},["/examples/example-cascade-temperature-control","/examples/example-cascade-temperature-control.md"]],["v-1b3a0ab8","/examples/example-heat-capacitor.html",{title:"Simple heat capacitor strategy flow"},["/examples/example-heat-capacitor","/examples/example-heat-capacitor.md"]],["v-0607240a","/examples/example-next-schedule-entity.html",{title:"Output schedule to a sensor entity"},["/examples/example-next-schedule-entity","/examples/example-next-schedule-entity.md"]],["v-61f728ca","/examples/example-nordpool-current-state.html",{title:"Nord Pool and current state node"},["/examples/example-nordpool-current-state","/examples/example-nordpool-current-state.md"]],["v-30acb564","/examples/example-nordpool-events-state.html",{title:"Nord Pool and events: state node"},["/examples/example-nordpool-events-state","/examples/example-nordpool-events-state.md"]],["v-5db8da3a","/examples/example-tibber-mqtt.html",{title:"Tibber, a switch and MQTT"},["/examples/example-tibber-mqtt","/examples/example-tibber-mqtt.md"]],["v-7c87f26e","/contribute/",{title:"Contribute"},["/contribute/index.html","/contribute/README.md"]],["v-7446a652","/faq/",{title:"FAQ"},["/faq/index.html","/faq/README.md"]],["v-29504124","/faq/best-save-viewer.html",{title:"Best Save Viewer"},["/faq/best-save-viewer","/faq/best-save-viewer.md"]],["v-fffb8e28","/guide/",{title:"Guide"},["/guide/index.html","/guide/README.md"]],["v-e8c55052","/nodes/",{title:"Nodes"},["/nodes/index.html","/nodes/README.md"]],["v-b4a42144","/nodes/old-power-saver-doc.html",{title:"node-red-contrib-power-saver v2 (deprecated)"},["/nodes/old-power-saver-doc","/nodes/old-power-saver-doc.md"]],["v-1ad821fa","/nodes/power-saver.html",{title:"power-saver"},["/nodes/power-saver","/nodes/power-saver.md"]],["v-08683c60","/nodes/ps-elvia-add-tariff.html",{title:"ps-elvia-add-tariff"},["/nodes/ps-elvia-add-tariff","/nodes/ps-elvia-add-tariff.md"]],["v-1e2b191e","/nodes/ps-general-add-tariff.html",{title:"ps-general-add-tariff"},["/nodes/ps-general-add-tariff","/nodes/ps-general-add-tariff.md"]],["v-677dfaed","/nodes/ps-receive-price.html",{title:"ps-receive-price"},["/nodes/ps-receive-price","/nodes/ps-receive-price.md"]],["v-0b5e3c8c","/nodes/ps-strategy-best-save.html",{title:"ps-strategy-best-save"},["/nodes/ps-strategy-best-save","/nodes/ps-strategy-best-save.md"]],["v-4c28314d","/nodes/ps-strategy-heat-capacitor.html",{title:"ps-strategy-heat-capacitor Experimental"},["/nodes/ps-strategy-heat-capacitor","/nodes/ps-strategy-heat-capacitor.md"]],["v-4637f9e4","/nodes/ps-strategy-lowest-price.html",{title:"ps-strategy-lowest-price"},["/nodes/ps-strategy-lowest-price","/nodes/ps-strategy-lowest-price.md"]],["v-5954bcb2","/nodes/strategy-input.html",{title:"Strategy input format"},["/nodes/strategy-input","/nodes/strategy-input.md"]],["v-3706649a","/404.html",{title:""},["/404"]]].reduce(((e,[t,a,d,s])=>(e.push({name:t,path:a,component:n.Y,meta:d},...s.map((e=>({path:e,redirect:a})))),e)),[{name:"404",path:"/:catchAll(.*)",component:n.Y}])},5220:(e,t,a)=>{a.d(t,{H:()=>n});const n={base:"/",lang:"en-US",title:"Power Saver",description:"A Node-RED note to save money on hourly changing power prices",head:[["link",{rel:"shortcut icon",type:"image/x-icon",href:"euro.png"}],["script",{async:!0,src:"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9857859182772006",crossorigin:"anonymous"}]],locales:{}}},2232:(e,t,a)=>{a.d(t,{f:()=>n});const n={contributors:!1,navbar:[{text:"Guide",link:"/guide/"},{text:"Nodes",link:"/nodes/"},{text:"Examples",link:"/examples/"},{text:"FAQ",link:"/faq/"},{text:"Contribute",link:"/contribute/"},{text:"Changes",link:"/changelog/"},{text:"GitHub",link:"https://github.com/ottopaulsen/node-red-contrib-power-saver"}],sidebar:{"/guide/":[{text:"Guide",children:["/guide/README.md"]}],"/nodes/":[{text:"Nodes",children:[{text:"Power Saver",link:"/nodes/power-saver.md"},{text:"Strategy nodes",children:["/nodes/ps-strategy-best-save.md","/nodes/ps-strategy-lowest-price.md",{text:"ps-strategy-heat-capacitor",link:"/nodes/ps-strategy-heat-capacitor.md"}]},{text:"Utility nodes",children:["/nodes/ps-receive-price.md"]},{text:"Grid tariff nodes",children:["/nodes/ps-general-add-tariff.md","/nodes/ps-elvia-add-tariff.md"]}]},{text:"Data format",children:["/nodes/strategy-input.md"]}],"/examples/":[{text:"Examples",children:["/examples/example-nordpool-current-state.md","/examples/example-nordpool-events-state.md","/examples/example-tibber-mqtt.md","/examples/example-heat-capacitor.md","/examples/example-cascade-temperature-control.md"]}],"/faq/":[{text:"FAQ",children:["/faq/README.md"]}],"/contribute/":[{text:"Contribute",children:["/contribute/README.md"]}],"/changelog/":[{text:"Changelog",children:["/changelog/README.md"]}]},locales:{"/":{selectLanguageName:"English"}},logo:null,darkMode:!0,repo:null,selectLanguageText:"Languages",selectLanguageAriaLabel:"Select language",sidebarDepth:2,editLink:!0,editLinkText:"Edit this page",lastUpdated:!0,lastUpdatedText:"Last Updated",contributorsText:"Contributors",notFound:["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],backToHome:"Take me home",openInNewWindow:"open in new window",toggleDarkMode:"toggle dark mode",toggleSidebar:"toggle sidebar"}}},e=>{e.O(0,[979,405],(()=>(8336,e(e.s=8336)))),e.O()}]);
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e,t,r,a,o,n,d,c={},f={};function i(e){var t=f[e];if(void 0!==t)return t.exports;var r=f[e]={exports:{}};return c[e].call(r.exports,r,r.exports,i),r.exports}i.m=c,e=[],i.O=(t,r,a,o)=>{if(!r){var n=1/0;for(s=0;s<e.length;s++){for(var[r,a,o]=e[s],d=!0,c=0;c<r.length;c++)(!1&o||n>=o)&&Object.keys(i.O).every((e=>i.O[e](r[c])))?r.splice(c--,1):(d=!1,o<n&&(n=o));if(d){e.splice(s--,1);var f=a();void 0!==f&&(t=f)}}return t}o=o||0;for(var s=e.length;s>0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[r,a,o]},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);i.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var d=2&a&&e;"object"==typeof d&&!~t.indexOf(d);d=r(d))Object.getOwnPropertyNames(d).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,i.d(o,n),o},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"assets/js/"+({22:"v-1ad821fa",27:"v-0aca7ba6",35:"v-0607240a",88:"v-3706649a",254:"v-84304104",283:"v-61f728ca",317:"v-5954bcb2",332:"v-08683c60",363:"v-0b5e3c8c",407:"v-b4a42144",418:"v-4637f9e4",495:"v-510ed0d4",509:"v-8daa1a0e",525:"v-29504124",545:"v-1b3a0ab8",625:"v-5db8da3a",651:"v-e8c55052",684:"v-4c28314d",737:"v-1e2b191e",745:"v-677dfaed",807:"v-fffb8e28",889:"v-7c87f26e",901:"v-30acb564",969:"v-7446a652"}[e]||e)+"."+{22:"6697a349",27:"cac5d4b9",35:"0193a377",88:"c76d575b",229:"5c5378fa",254:"f3f07ed3",283:"81968036",317:"dff3fc67",331:"872104cd",332:"52e94cb6",363:"18561f6e",407:"9a2a0c9f",418:"d334c29a",490:"1e639e05",491:"bd938119",495:"c04bc2e4",509:"ed84ca09",525:"00be7399",545:"c6c4e19b",555:"d8963d84",625:"e5e6d7a6",651:"b7d52fc6",684:"8cbb0f9d",737:"07b8ab21",745:"c159b0f4",807:"d09ab959",811:"5f659592",835:"c5afb22b",889:"8ed52391",896:"21a80cb6",901:"28af12af",969:"8fc2c591"}[e]+".js",i.miniCssF=e=>"assets/css/"+e+".styles."+{835:"c5afb22b",896:"21a80cb6"}[e]+".css",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="node-red-contrib-power-saver:",i.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var d,c;if(void 0!==r)for(var f=document.getElementsByTagName("script"),s=0;s<f.length;s++){var l=f[s];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+r){d=l;break}}d||(c=!0,(d=document.createElement("script")).charset="utf-8",d.timeout=120,i.nc&&d.setAttribute("nonce",i.nc),d.setAttribute("data-webpack",o+r),d.src=e),a[e]=[t];var u=(t,r)=>{d.onerror=d.onload=null,clearTimeout(v);var o=a[e];if(delete a[e],d.parentNode&&d.parentNode.removeChild(d),o&&o.forEach((e=>e(r))),t)return t(r)},v=setTimeout(u.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=u.bind(null,d.onerror),d.onload=u.bind(null,d.onload),c&&document.head.appendChild(d)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="/",n=e=>new Promise(((t,r)=>{var a=i.miniCssF(e),o=i.p+a;if(((e,t)=>{for(var r=document.getElementsByTagName("link"),a=0;a<r.length;a++){var o=(d=r[a]).getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(o===e||o===t))return d}var n=document.getElementsByTagName("style");for(a=0;a<n.length;a++){var d;if((o=(d=n[a]).getAttribute("data-href"))===e||o===t)return d}})(a,o))return t();((e,t,r,a)=>{var o=document.createElement("link");o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=n=>{if(o.onerror=o.onload=null,"load"===n.type)r();else{var d=n&&("load"===n.type?"missing":n.type),c=n&&n.target&&n.target.href||t,f=new Error("Loading CSS chunk "+e+" failed.\n("+c+")");f.code="CSS_CHUNK_LOAD_FAILED",f.type=d,f.request=c,o.parentNode.removeChild(o),a(f)}},o.href=t,document.head.appendChild(o)})(e,o,t,r)})),d={523:0},i.f.miniCss=(e,t)=>{d[e]?t.push(d[e]):0!==d[e]&&{835:1,896:1}[e]&&t.push(d[e]=n(e).then((()=>{d[e]=0}),(t=>{throw delete d[e],t})))},(()=>{var e={523:0,979:0};i.f.j=(t,r)=>{var a=i.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(523|835|896|979)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var n=i.p+i.u(t),d=new Error;i.l(n,(r=>{if(i.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;d.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",d.name="ChunkLoadError",d.type=o,d.request=n,a[1](d)}}),"chunk-"+t,t)}},i.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,[n,d,c]=r,f=0;if(n.some((t=>0!==e[t]))){for(a in d)i.o(d,a)&&(i.m[a]=d[a]);if(c)var s=c(i)}for(t&&t(r);f<n.length;f++)o=n[f],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return i.O(s)},r=self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})()})();
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[35],{3811:(n,s,a)=>{a.r(s),a.d(s,{data:()=>t});const t={key:"v-0607240a",path:"/examples/example-next-schedule-entity.html",title:"Output schedule to a sensor entity",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Setup",slug:"setup",children:[]},{level:2,title:"To-do",slug:"to-do",children:[]}],git:{updatedTime:164027482e4},filePathRelative:"examples/example-next-schedule-entity.md"}},3328:(n,s,a)=>{a.r(s),a.d(s,{default:()=>b});var t=a(6252),e=a(3616),p=a(9101),o=a(3121);const l=(0,t._)("h1",{id:"output-schedule-to-a-sensor-entity",tabindex:"-1"},[(0,t._)("a",{class:"header-anchor",href:"#output-schedule-to-a-sensor-entity","aria-hidden":"true"},"#"),(0,t.Uk)(" Output schedule to a sensor entity")],-1),r=(0,t.Uk)("This example was contributed by "),c={href:"https://github.com/oakhill87",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Uk)("Stefan"),u=(0,t.Uk)("Note: Requires "),k={href:"https://github.com/zachowj/hass-node-red",target:"_blank",rel:"noopener noreferrer"},d=(0,t.Uk)("Node-RED Companion Integration"),h=(0,t.Uk)("."),g=(0,t.uE)('<p><img src="'+e+'" alt="Sensor with timestamp and attributes"> <img src="'+p+'" alt="Sensor flow"></p><p>This JavaScript code snippet can be pasted into a Function-node. When connected to the schedule-output (3) from Best Save, it will loop through the array of available hours and find the next timestamp where a power saving schedule is initated.</p><div class="language-javascript ext-js line-numbers-mode"><pre class="language-javascript"><code> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> msg<span class="token punctuation">.</span>payload<span class="token punctuation">.</span>hours<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>\n <span class="token keyword">if</span> <span class="token punctuation">(</span>msg<span class="token punctuation">.</span>payload<span class="token punctuation">.</span>hours<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>onOff <span class="token operator">!=</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>\n <span class="token keyword">var</span> schedule <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">time</span><span class="token operator">:</span> msg<span class="token punctuation">.</span>payload<span class="token punctuation">.</span>hours<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>start<span class="token punctuation">,</span> <span class="token literal-property property">topic</span><span class="token operator">:</span> <span class="token string">&quot;Neste spareperiode&quot;</span><span class="token punctuation">,</span> <span class="token literal-property property">length</span><span class="token operator">:</span> msg<span class="token punctuation">.</span>payload<span class="token punctuation">.</span>config<span class="token punctuation">.</span>maxHoursToSaveInSequence<span class="token punctuation">,</span> <span class="token literal-property property">savings</span><span class="token operator">:</span> msg<span class="token punctuation">.</span>payload<span class="token punctuation">.</span>hours<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>saving<span class="token punctuation">}</span>\n <span class="token keyword">break</span><span class="token punctuation">}</span>\n <span class="token keyword">else</span> <span class="token punctuation">{</span>\n <span class="token keyword">var</span> schedule <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">time</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token literal-property property">topic</span><span class="token operator">:</span> <span class="token string">&quot;Ingen aksjoner&quot;</span><span class="token punctuation">,</span> <span class="token literal-property property">length</span><span class="token operator">:</span> <span class="token string">&quot;0&quot;</span><span class="token punctuation">,</span> <span class="token literal-property property">savings</span><span class="token operator">:</span> <span class="token string">&quot;0&quot;</span><span class="token punctuation">}</span>\n <span class="token punctuation">}</span>\n <span class="token punctuation">}</span>\n <span class="token keyword">var</span> schedule_array <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">upcoming</span><span class="token operator">:</span> schedule<span class="token punctuation">}</span>\n <span class="token keyword">return</span> <span class="token punctuation">[</span>schedule_array<span class="token punctuation">]</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><p>This will return the following:</p><ul><li>msg.upcoming.time = Timestamp if saving is scheduled - False if no schedule with the current available prices.</li><li>msg.upcoming.length = How long the next saving will last - set to 0 if no schedule.</li><li>msg.upcoming.savings = Estimated savings retrieved from the node.</li></ul><h2 id="setup" tabindex="-1"><a class="header-anchor" href="#setup" aria-hidden="true">#</a> Setup</h2><ol><li>Paste the code above into a Function node and connect it to the schedule output.</li><li>Create an entity node from the Node-RED Companion Integration, and configure it according to the steps below:</li></ol><p>The msg.topic is currently not used, but in case you&#39;d want to specify dynamic names in the sensor instead of in the frontend, go ahead and add them as attributes using the following configuration:</p><ol><li><strong>State</strong>: msg.upcoming.time</li><li>Attribute key <strong>Duration</strong>: msg.upcoming.length</li><li>Attribute key <strong>Savings</strong>: msg.upcoming.savings</li></ol><img src="'+o+'" width="25%"><h2 id="to-do" tabindex="-1"><a class="header-anchor" href="#to-do" aria-hidden="true">#</a> To-do</h2><p>If you find any bugs, let me know, but as long as the payload doesn&#39;t change it should work.</p>',12),m={},b=(0,a(3744).Z)(m,[["render",function(n,s){const a=(0,t.up)("ExternalLinkIcon");return(0,t.wg)(),(0,t.iD)(t.HY,null,[l,(0,t._)("p",null,[r,(0,t._)("a",c,[i,(0,t.Wm)(a)])]),(0,t._)("p",null,[u,(0,t._)("a",k,[d,(0,t.Wm)(a)]),h]),g],64)}]])},3744:(n,s)=>{s.Z=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},3121:(n,s,a)=>{n.exports=a.p+"assets/img/next-schedule-entity.4406856a.png"},9101:(n,s,a)=>{n.exports=a.p+"assets/img/next-schedule-flow.413ad62b.png"},3616:(n,s,a)=>{n.exports=a.p+"assets/img/next-schedule-sensor.eb896bdd.png"}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[332],{5845:(e,t,i)=>{i.r(t),i.d(t,{data:()=>a});const a={key:"v-08683c60",path:"/nodes/ps-elvia-add-tariff.html",title:"ps-elvia-add-tariff",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Description",slug:"description",children:[]},{level:2,title:"Configuration",slug:"configuration",children:[]},{level:2,title:"Input",slug:"input",children:[]},{level:2,title:"Output",slug:"output",children:[]}],git:{updatedTime:1641408133e3},filePathRelative:"nodes/ps-elvia-add-tariff.md"}},7143:(e,t,i)=>{i.r(t),i.d(t,{default:()=>P});var a=i(6252),o=i(5824),r=i(2101),n=i(5698),s=i(9858),l=i(6473),p=i(5307);const d=(0,a.uE)('<h1 id="ps-elvia-add-tariff" tabindex="-1"><a class="header-anchor" href="#ps-elvia-add-tariff" aria-hidden="true">#</a> ps-elvia-add-tariff</h1><p><img src="'+o+'" alt="ps-elvia-add-tariff"></p><p>Node to add grid tariff from Elvia.</p><div class="custom-container warning"><p class="custom-container-title">Elvia API</p><p>You need an Elvia API subscription key to use this node. See <a href="#elvia-configuration">configuration</a>.</p></div><h2 id="description" tabindex="-1"><a class="header-anchor" href="#description" aria-hidden="true">#</a> Description</h2><p>When grid tariff changes from hour to hour, this should normally also be considered when finding the most favorable hours to use power. This node retrieves prices from Elvia, so if you are an elvia customer, you can put this node between the <code>ps-receive-price</code> node and the strategy nodes. When configured, it will add Elvia tariff to the power prices before doing the calculation:</p><p><img src="'+r+'" alt="Elvia flow"></p><h2 id="configuration" tabindex="-1"><a class="header-anchor" href="#configuration" aria-hidden="true">#</a> Configuration</h2>',8),u={class:"custom-container warning"},c=(0,a._)("p",{class:"custom-container-title"},"Elvia API subscription key",-1),f=(0,a.Uk)("This node uses the Elvia API, and you must get your own Elvia API subscription key in order to use it. Go to the "),h={href:"https://elvia.portal.azure-api.net/",target:"_blank",rel:"noopener noreferrer"},g=(0,a.Uk)("Elvia Developer Portal"),v=(0,a.Uk)(" to sign up, and then request for a subscription to the GridTariffAPI. When your subscription is approved, you will find your subscription key in the "),m={href:"https://elvia.portal.azure-api.net/developer",target:"_blank",rel:"noopener noreferrer"},b=(0,a.Uk)("developer portal"),y=(0,a.Uk)(" under Your subscriptions."),k=(0,a.uE)('<p>The first time you use this node, you must create a <code>ps-elvia-config</code> entry. Click on the edit button to the right of Elvia Config:</p><p><img src="'+n+'" alt="Elvia configuration"></p><p>Then enter the Elvia API subscription key:</p><p><img src="'+s+'" alt="Elvia configuration"></p><p>After entering the Elvia API subscription key the first time, it is not possible to select tariff.</p><p><img src="'+l+'" alt="Elvia configuration"></p><p>To fix that, save the config, deploy, and then open the node again. Now you should be able to select the right tariff:</p><p><img src="'+p+'" alt="Elvia configuration"></p><p>The next time you use this node, you can select the same config as you created the first time, and then you can also select tariff immediately.</p><h2 id="input" tabindex="-1"><a class="header-anchor" href="#input" aria-hidden="true">#</a> Input</h2>',10),_=(0,a.Uk)("The input is the "),E=(0,a.Uk)("common strategy input format"),w=(0,a._)("h2",{id:"output",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#output","aria-hidden":"true"},"#"),(0,a.Uk)(" Output")],-1),x=(0,a.Uk)("The output is the "),I=(0,a.Uk)("common strategy input format"),U={},P=(0,i(3744).Z)(U,[["render",function(e,t){const i=(0,a.up)("ExternalLinkIcon"),o=(0,a.up)("RouterLink");return(0,a.wg)(),(0,a.iD)(a.HY,null,[d,(0,a._)("div",u,[c,(0,a._)("p",null,[f,(0,a._)("a",h,[g,(0,a.Wm)(i)]),v,(0,a._)("a",m,[b,(0,a.Wm)(i)]),y])]),k,(0,a._)("p",null,[_,(0,a.Wm)(o,{to:"/nodes/strategy-input.html"},{default:(0,a.w5)((()=>[E])),_:1})]),w,(0,a._)("p",null,[x,(0,a.Wm)(o,{to:"/nodes/strategy-input.html"},{default:(0,a.w5)((()=>[I])),_:1})])],64)}]])},3744:(e,t)=>{t.Z=(e,t)=>{const i=e.__vccOpts||e;for(const[e,a]of t)i[e]=a;return i}},5698:(e,t,i)=>{e.exports=i.p+"assets/img/elvia-config-no-config.b4bb972c.png"},6473:(e,t,i)=>{e.exports=i.p+"assets/img/elvia-config-no-tariff.3f89aba8.png"},5307:(e,t,i)=>{e.exports=i.p+"assets/img/elvia-config-select-tariff.0f73fd56.png"},9858:(e,t,i)=>{e.exports=i.p+"assets/img/elvia-config-subscription-key.8be8ab8a.png"},2101:(e,t,i)=>{e.exports=i.p+"assets/img/elvia-flow.bae2a4d5.png"},5824:(e,t,i)=>{e.exports=i.p+"assets/img/node-ps-elvia-add-tariff.94ea2b09.png"}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[27],{7726:(e,a,t)=>{t.r(a),t.d(a,{data:()=>r});const r={key:"v-0aca7ba6",path:"/examples/",title:"Examples",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"User provided examples",slug:"user-provided-examples",children:[]}],git:{updatedTime:164452306e4},filePathRelative:"examples/README.md"}},9637:(e,a,t)=>{t.r(a),t.d(a,{default:()=>n});var r=t(6252);const d=(0,r.uE)('<h1 id="examples" tabindex="-1"><a class="header-anchor" href="#examples" aria-hidden="true">#</a> Examples</h1><p><a href="./example-nordpool-current-state">Nord Pool and <code>current state</code> node in HA</a></p><p><a href="./example-nordpool-events-state">Nord Pool and <code>events: state</code> node in HA</a></p><p><a href="./example-tibber-mqtt">Tibber and mqtt</a></p><p><a href="./example-heat-capacitor">Heat capacitor strategy - simple flow</a></p><p><a href="./example-cascade-temperature-control">Cascade temperature control</a></p><h2 id="user-provided-examples" tabindex="-1"><a class="header-anchor" href="#user-provided-examples" aria-hidden="true">#</a> User provided examples</h2>',7),p=(0,r.Uk)("Output schedule to a sensor entity"),o=(0,r.Uk)(" (by Stefan)"),s={},n=(0,t(3744).Z)(s,[["render",function(e,a){const t=(0,r.up)("RouterLink");return(0,r.wg)(),(0,r.iD)(r.HY,null,[d,(0,r._)("p",null,[(0,r.Wm)(t,{to:"/examples/example-next-schedule-entity.html"},{default:(0,r.w5)((()=>[p])),_:1}),o])],64)}]])},3744:(e,a)=>{a.Z=(e,a)=>{const t=e.__vccOpts||e;for(const[e,r]of a)t[e]=r;return t}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[363],{3594:(n,e,s)=>{s.r(e),s.d(e,{data:()=>a});const a={key:"v-0b5e3c8c",path:"/nodes/ps-strategy-best-save.html",title:"ps-strategy-best-save",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Description",slug:"description",children:[]},{level:2,title:"Configuration",slug:"configuration",children:[{level:3,title:"Dynamic config",slug:"dynamic-config",children:[]},{level:3,title:"Dynamic commands",slug:"dynamic-commands",children:[]}]},{level:2,title:"Input",slug:"input",children:[]},{level:2,title:"Output",slug:"output",children:[{level:3,title:"Output 1",slug:"output-1",children:[]},{level:3,title:"Output 2",slug:"output-2",children:[]},{level:3,title:"Output 3",slug:"output-3",children:[]},{level:3,title:"Data saved in context",slug:"data-saved-in-context",children:[]}]},{level:2,title:"Algorithm",slug:"algorithm",children:[]},{level:2,title:"Data used for calculation",slug:"data-used-for-calculation",children:[]},{level:2,title:"Restarts",slug:"restarts",children:[]},{level:2,title:"Integration with MagicMirror",slug:"integration-with-magicmirror",children:[]},{level:2,title:"Viewer",slug:"viewer",children:[]}],git:{updatedTime:1643919651e3},filePathRelative:"nodes/ps-strategy-best-save.md"}},2435:(n,e,s)=>{s.r(e),s.d(e,{default:()=>Y});var a=s(6252),t=s(7188),o=s(5442);const p=(0,a.uE)('<h1 id="ps-strategy-best-save" tabindex="-1"><a class="header-anchor" href="#ps-strategy-best-save" aria-hidden="true">#</a> ps-strategy-best-save</h1><p><img src="'+t+'" alt="ps-strategy-best-save"></p><p>Strategy node to postpone power consumption until the price is lower.</p><h2 id="description" tabindex="-1"><a class="header-anchor" href="#description" aria-hidden="true">#</a> Description</h2><p>This strategy turns off the hours where the price difference is largest compared to the next hour that is on. The idea is that the power you are not using when the switch is turned off, will be used immediately when the switch is turned on. This would fit well for turning off a water heater or another thermostat controlled heater.</p><p>The picture at the bottom of the page, under <a href="#integration-with-magicmirror">Integration with MagicMirror</a>, illustrates this by the purple strokes, taking the price from the top of the price curve to the level of the first hour after the save-period.</p><h2 id="configuration" tabindex="-1"><a class="header-anchor" href="#configuration" aria-hidden="true">#</a> Configuration</h2><p><img src="'+o+'" alt="Best Save Config"></p><table><thead><tr><th>Value</th><th>Description</th></tr></thead><tbody><tr><td>Max per sequence</td><td>Maximum number of hours to turn off in a sequence.</td></tr><tr><td>Min recover</td><td>Minimum hours to turn on immediately after a period when turned off the maximum number of hours that is allowed to be turned off</td></tr><tr><td>Min saving</td><td>Minimum amount to save per kWh in order to bother turning it off. It is recommended to have some amount here, e.g. 2 cents / 2 øre. No point in saving 0.001, is it?</td></tr><tr><td>Send when rescheduling</td><td>Check this to make sure on or off output is sent immediately after rescheduling</td></tr><tr><td>If no schedule, send</td><td>What to do if there is no valid schedule any more (turn on or off).</td></tr></tbody></table><div class="custom-container warning"><p class="custom-container-title">Min recover</p><p>NB! The <code>Min recover</code> only has effect if the previous save-period is of length <code>Max per sequence</code>. If the save-period is shorter, the following on-period may be as short as one hour.</p></div><h3 id="dynamic-config" tabindex="-1"><a class="header-anchor" href="#dynamic-config" aria-hidden="true">#</a> Dynamic config</h3><p>It is possible to change config dynamically by sending a config message to the node. The config messages has a payload with a config object like this example:</p><div class="language-json ext-json line-numbers-mode"><pre class="language-json"><code><span class="token property">&quot;payload&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;config&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;maxHoursToSaveInSequence&quot;</span><span class="token operator">:</span> <span class="token number">4</span><span class="token punctuation">,</span>\n <span class="token property">&quot;minHoursOnAfterMaxSequenceSaved&quot;</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span>\n <span class="token property">&quot;minSaving&quot;</span><span class="token operator">:</span> <span class="token number">0.02</span><span class="token punctuation">,</span>\n <span class="token property">&quot;sendCurrentValueWhenRescheduling&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputIfNoSchedule&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>All the variables in the config object are optional. You can send only those you want to change.</p><p>The config sent like this will be valid until a new config is sent the same way, or until the flow is restarted. On a restart, the original config set up in the node will be used.</p><p>When a config is sent like this, and without price data, the schedule will be replanned based on the last previously received price data. If no price data has been received, no scheduling is done.</p><p>However, you can send config and price data in the same message. Then both will be used.</p><h3 id="dynamic-commands" tabindex="-1"><a class="header-anchor" href="#dynamic-commands" aria-hidden="true">#</a> Dynamic commands</h3><p>You can dynamically send some commands to the node via its input, by using a <code>commands</code> object in the payload as described below.</p><p>Commands can be sent together with config and/or price data, but the exact behavior is not defined.</p><h4 id="sendschedule" tabindex="-1"><a class="header-anchor" href="#sendschedule" aria-hidden="true">#</a> sendSchedule</h4><p>You can get the schedule sent to output 3 any time by sending a message like this to the node:</p><div class="language-json ext-json line-numbers-mode"><pre class="language-json"><code><span class="token property">&quot;payload&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;commands&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;sendSchedule&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>When you do this, the current schedule is actually recalculated based on the last received data, and then sent to output 3 the same way as when it was originally planned.</p><h4 id="sendoutput" tabindex="-1"><a class="header-anchor" href="#sendoutput" aria-hidden="true">#</a> sendOutput</h4><p>You can get the node to send the current output to output 1 or 2 any time by sending a message like this to the node:</p><div class="language-json ext-json line-numbers-mode"><pre class="language-json"><code><span class="token property">&quot;payload&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;commands&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;sendOutput&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>When you do this, the current schedule is actually recalculated based on the last received data. The current output is sent to output 1 or 2, and the schedule is sent to output 3.</p><h4 id="reset" tabindex="-1"><a class="header-anchor" href="#reset" aria-hidden="true">#</a> reset</h4><p>You can reset data the node has saved in context by sending this message:</p><div class="language-json ext-json line-numbers-mode"><pre class="language-json"><code><span class="token property">&quot;payload&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;commands&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;reset&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>When you do this, all historical data the node has saved is deleted, including the current schedule, so the result will be that the node shows status &quot;No price data&quot;. When new price data is received, a schedule is calculated without considering any history.</p><p>The nodes config is not deleted, as the node depends on it to work.</p><div class="custom-container warning"><p class="custom-container-title">WARNING</p><p>This operation cannot be undone.</p><p>However, it is normally not a big loss, as you can just feed the node with new price data and start from scratch.</p></div><h2 id="input" tabindex="-1"><a class="header-anchor" href="#input" aria-hidden="true">#</a> Input</h2>',35),r=(0,a.Uk)("The input is the "),i=(0,a.Uk)("common strategy input format"),l=(0,a.Uk)("."),u=(0,a.uE)('<p>In addition to the prices sent as input, the node is using the schedule for the day before it receives data for, so that it can calculate the schedule in the beginning of the day according to the configured rules. This requires of course that the node was run the day before.</p><h2 id="output" tabindex="-1"><a class="header-anchor" href="#output" aria-hidden="true">#</a> Output</h2><p>There are three outputs. You use only those you need for your purpose.</p><h3 id="output-1" tabindex="-1"><a class="header-anchor" href="#output-1" aria-hidden="true">#</a> Output 1</h3><p>A payload with the word <code>true</code> is sent to output 1 whenever the power / switch shall be turned on.</p><h3 id="output-2" tabindex="-1"><a class="header-anchor" href="#output-2" aria-hidden="true">#</a> Output 2</h3><p>A payload with the word <code>false</code> is sent to output 2 whenever the power / switch shall be turned off.</p><h3 id="output-3" tabindex="-1"><a class="header-anchor" href="#output-3" aria-hidden="true">#</a> Output 3</h3><p>When a valid input is received, and the schedule is recalculated, the resulting schedule, as well as some other information, is sent to output 3. You can use this to see the plan and verify that it meets your expectations. You can also use it to display the schedule in any way you like.</p><p>Example of output:</p><div class="language-json ext-json line-numbers-mode"><pre class="language-json"><code><span class="token punctuation">{</span>\n <span class="token property">&quot;schedule&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;time&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2021-09-30T00:00:00.000+02:00&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;time&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2021-09-30T01:00:00.000+02:00&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span>\n <span class="token punctuation">}</span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;hours&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;price&quot;</span><span class="token operator">:</span> <span class="token number">1.2584</span><span class="token punctuation">,</span>\n <span class="token property">&quot;onOff&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;start&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2021-09-30T00:00:00.000+02:00&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;saving&quot;</span><span class="token operator">:</span> <span class="token number">0.2034</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;price&quot;</span><span class="token operator">:</span> <span class="token number">1.055</span><span class="token punctuation">,</span>\n <span class="token property">&quot;onOff&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;start&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2021-09-30T01:00:00.000+02:00&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;saving&quot;</span><span class="token operator">:</span> <span class="token null keyword">null</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;price&quot;</span><span class="token operator">:</span> <span class="token number">1.2054</span><span class="token punctuation">,</span>\n <span class="token property">&quot;onOff&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;start&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2021-09-30T02:00:00.000+02:00&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;saving&quot;</span><span class="token operator">:</span> <span class="token null keyword">null</span>\n <span class="token punctuation">}</span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;source&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Nord Pool&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;config&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">&quot;maxHoursToSaveInSequence&quot;</span><span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span>\n <span class="token property">&quot;minHoursOnAfterMaxSequenceSaved&quot;</span><span class="token operator">:</span> <span class="token string">&quot;1&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;minSaving&quot;</span><span class="token operator">:</span> <span class="token number">0.001</span><span class="token punctuation">,</span>\n <span class="token property">&quot;sendCurrentValueWhenRescheduling&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputIfNoSchedule&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token property">&quot;time&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2021-09-30T23:45:12.123+02:00&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;version&quot;</span><span class="token operator">:</span> <span class="token string">&quot;3.1.2&quot;</span>\n<span class="token punctuation">}</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br></div></div><p>The <code>schedule</code> array shows every time the switch is turned on or off. The <code>hours</code> array shows values per hour containing the price (received as input), whether that hour is on or off, the start time of the hour and the amount per kWh that is saved on hours that are turned off, compared to the next hour that is on.</p><h3 id="data-saved-in-context" tabindex="-1"><a class="header-anchor" href="#data-saved-in-context" aria-hidden="true">#</a> Data saved in context</h3><p>The node saves some data in the nodes context, so that it can be used on restarts and also taken into consideration when calculating the schedule over midnight.</p><p>You can see the saved data if you select the node in Node-RED, and view &quot;Context data&quot;, and refresh the Node context.</p><h2 id="algorithm" tabindex="-1"><a class="header-anchor" href="#algorithm" aria-hidden="true">#</a> Algorithm</h2><p>The calculation that decides what hours to turn off works as follows:</p><ol><li>A matrix (x * y) is created where x is the number of hours we have price information for, and y is the configured maximum number of hours to turn off in a sequence.</li><li>The matrix is filled with how much you save by turning off hour x for y hours.</li><li>The matrix is processed calculating all possibilities for turning off a number of hours in a sequence and by that saving money. In this process all non-saving sequences are discarded. Also, if the average saving per hour is less than what you have configured as minimum amount to save per kWh, the sequence is discarded.</li><li>The remaining sequences are sorted by how much that is saved, in descending order.</li><li>Next, a table with one value per hour is created, with all hours in state &quot;on&quot;.</li><li>Then the saving sequences is applied one by one, turning off the hours in each sequence, discarding sequences that lead to any violation of the rules set by the config.</li><li>When all sequences are processed, the resulting table shows a pretty good savings plan, that in most cases would be the optimal plan.</li></ol><p>I say &quot;in most cases&quot;, because there is a chance that a group of two or more sequences combined can give a better plan than a single sequence preceeding those two, but where the selection of the one sequence causes the group to be discarded. If anyone encounters this situation, I would be happy to receive the price data set, and try to improve the algorithm even further.</p><h2 id="data-used-for-calculation" tabindex="-1"><a class="header-anchor" href="#data-used-for-calculation" aria-hidden="true">#</a> Data used for calculation</h2><p>Normally data is received for one or two whole days, and all this data is used to do the calculation. In addition, if the node has run before, so there is historical data, the last period on or off before the period data is received for, is considered in the calculation, so that the rules in the configuration are followed also between days.</p><h2 id="restarts" tabindex="-1"><a class="header-anchor" href="#restarts" aria-hidden="true">#</a> Restarts</h2><p>The node saves data in the nodes context, so if Node-RED is configured to save context between restarts, the node will replan with the last received data when it restarts.</p>',23),c={class:"custom-container warning"},d=(0,a.uE)('<p class="custom-container-title">WARNING</p><p>In Home Assistant, Node-RED is by default configured to save context between restarts. However, if you run Node-RED another way, this may not be the case by default. If context is only stored in memory, it is lost between restarts, and even between re-deployments. This can be changed in the <code>settings.js</code> file for Node-RED like this:</p><div class="language-javascript ext-js line-numbers-mode"><pre class="language-javascript"><code><span class="token literal-property property">contextStorage</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token keyword">default</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token literal-property property">module</span><span class="token operator">:</span> <span class="token string">&quot;localfilesystem&quot;</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div>',3),h=(0,a.Uk)("Please read the "),b={href:"https://nodered.org/docs/user-guide/context",target:"_blank",rel:"noopener noreferrer"},m=(0,a.Uk)("Node-RED documentation"),k=(0,a.Uk)(" for more details about this."),g=(0,a._)("h2",{id:"integration-with-magicmirror",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#integration-with-magicmirror","aria-hidden":"true"},"#"),(0,a.Uk)(" Integration with MagicMirror")],-1),f=(0,a.Uk)("Are you using "),y={href:"https://magicmirror.builders/",target:"_blank",rel:"noopener noreferrer"},v=(0,a.Uk)("MagicMirror"),q=(0,a.Uk)("? Are you also using "),w={href:"https://tibber.com/",target:"_blank",rel:"noopener noreferrer"},x=(0,a.Uk)("Tibber"),M=(0,a.Uk)("? If so, there is a module for MM called "),T={href:"https://github.com/ottopaulsen/MMM-Tibber",target:"_blank",rel:"noopener noreferrer"},_=(0,a.Uk)("MMM-Tibber"),I=(0,a.Uk)(", that easily can be used to show savings from this node."),j=(0,a._)("p",null,[(0,a._)("img",{src:"https://github.com/ottopaulsen/MMM-Tibber/blob/master/doc/MMM-Tibber-screenshot-savings-graph.png?raw=true",alt:"Show savings in MMM-Tibber"})],-1),W=(0,a._)("p",null,"The purple lines show savings per kWh.",-1),U=(0,a.Uk)("Read more about this in the "),S={href:"https://github.com/ottopaulsen/MMM-Tibber#show-savings",target:"_blank",rel:"noopener noreferrer"},N=(0,a.Uk)("MMM-Tibber documentation"),D=(0,a.Uk)("."),O=(0,a._)("h2",{id:"viewer",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#viewer","aria-hidden":"true"},"#"),(0,a.Uk)(" Viewer")],-1),R=(0,a.Uk)("If you like to analyze the data output by the node, take a look at the "),A=(0,a.Uk)("Best Save Viewer"),E=(0,a.Uk)("."),C={},Y=(0,s(3744).Z)(C,[["render",function(n,e){const s=(0,a.up)("RouterLink"),t=(0,a.up)("ExternalLinkIcon");return(0,a.wg)(),(0,a.iD)(a.HY,null,[p,(0,a._)("p",null,[r,(0,a.Wm)(s,{to:"/nodes/strategy-input.html"},{default:(0,a.w5)((()=>[i])),_:1}),l]),u,(0,a._)("div",c,[d,(0,a._)("p",null,[h,(0,a._)("a",b,[m,(0,a.Wm)(t)]),k])]),g,(0,a._)("p",null,[f,(0,a._)("a",y,[v,(0,a.Wm)(t)]),q,(0,a._)("a",w,[x,(0,a.Wm)(t)]),M,(0,a._)("a",T,[_,(0,a.Wm)(t)]),I]),j,W,(0,a._)("p",null,[U,(0,a._)("a",S,[N,(0,a.Wm)(t)]),D]),O,(0,a._)("p",null,[R,(0,a.Wm)(s,{to:"/faq/best-save-viewer.html"},{default:(0,a.w5)((()=>[A])),_:1}),E])],64)}]])},3744:(n,e)=>{e.Z=(n,e)=>{const s=n.__vccOpts||n;for(const[n,a]of e)s[n]=a;return s}},5442:(n,e,s)=>{n.exports=s.p+"assets/img/best-save-config.79a2f39a.png"},7188:(n,e,s)=>{n.exports=s.p+"assets/img/node-ps-strategy-best-save.392292d5.png"}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[22],{2336:(e,r,o)=>{o.r(r),o.d(r,{data:()=>t});const t={key:"v-1ad821fa",path:"/nodes/power-saver.html",title:"power-saver",lang:"en-US",frontmatter:{next:"./ps-strategy-best-save.md"},excerpt:"",headers:[],git:{updatedTime:1639315027e3},filePathRelative:"nodes/power-saver.md"}},8718:(e,r,o)=>{o.r(r),o.d(r,{default:()=>h});var t=o(6252),a=o(7656),s=o(2913),d=o(1758);const n={id:"power-saver",tabindex:"-1"},p=(0,t._)("a",{class:"header-anchor",href:"#power-saver","aria-hidden":"true"},"#",-1),i=(0,t.Uk)(" power-saver "),c=(0,t.uE)('<p><img src="'+a+'" alt="Power Saver node"></p><p>This is the node from version 2. It is still working, but should be replaced.</p><p>To migrate, just replace the Power Saver node by a combination of the ps-receive-price and the ps-best-save nodes:</p><p>Replace the <code>Power Saver</code> node from version 2:</p><p><img src="'+s+'" alt="Power Saver node"></p><p>with this combination of <code>ps-receive-price</code> and <code>ps-strategy-best-save</code> from version 3:</p><p><img src="'+d+'" alt="Migrate Power Saver"></p><p>The configuration is done in the <code>ps-strategy-best-save</code> node, and is the same as in the old <code>Power Saver</code> node.</p><p>Should you need it, here is the <a href="./old-power-saver-doc">old documentation</a> for the PowerSaver node from version 2.</p>',9),v={},h=(0,o(3744).Z)(v,[["render",function(e,r){const o=(0,t.up)("Badge");return(0,t.wg)(),(0,t.iD)(t.HY,null,[(0,t._)("h1",n,[p,i,(0,t.Wm)(o,{type:"warning",text:"deprecated",vertical:"middle"})]),c],64)}]])},3744:(e,r)=>{r.Z=(e,r)=>{const o=e.__vccOpts||e;for(const[e,t]of r)o[e]=t;return o}},1758:(e,r,o)=>{e.exports=o.p+"assets/img/migrate-best-save.f73420f6.png"},2913:(e,r,o)=>{e.exports=o.p+"assets/img/migrate-power-saver.aae13f9d.png"},7656:(e,r,o)=>{e.exports=o.p+"assets/img/node-power-saver.51ff2e5d.png"}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[545],{6739:(n,s,a)=>{a.r(s),a.d(s,{data:()=>t});const t={key:"v-1b3a0ab8",path:"/examples/example-heat-capacitor.html",title:"Simple heat capacitor strategy flow",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Description",slug:"description",children:[]},{level:2,title:"Requirements",slug:"requirements",children:[]},{level:2,title:"Instructions",slug:"instructions",children:[{level:3,title:"Advanced set-up",slug:"advanced-set-up",children:[]}]},{level:2,title:"Flow",slug:"flow",children:[]}],git:{updatedTime:1644520774e3},filePathRelative:"examples/example-heat-capacitor.md"}},4657:(n,s,a)=>{a.r(s),a.d(s,{default:()=>y});var t=a(6252),p=a(1125),o=a(6348);const e=(0,t.uE)('<h1 id="simple-heat-capacitor-strategy-flow" tabindex="-1"><a class="header-anchor" href="#simple-heat-capacitor-strategy-flow" aria-hidden="true">#</a> Simple heat capacitor strategy flow</h1><h2 id="description" tabindex="-1"><a class="header-anchor" href="#description" aria-hidden="true">#</a> Description</h2><p>The heat capacitor strategy utilizes a large body of mass, like your house or cabin, to procure heat at a time where electricity is cheap, and divest at a time where electricity is expensive.</p><p>This is achieved by increasing the temperature setpoint of one or several climate entities at times when electricity is cheap, and reducing it when electricity is expensive.</p><p>It is a good application for cabins/heated storage spaces, as the entity never actually shuts off the climate entities and should therefore be rather safe to apply (still at you own risk 😃). It can also be used for you house, jacuzzi, and/or pool.</p><p><img src="'+p+'" alt="Temperature profile vs. cost"></p><hr><h2 id="requirements" tabindex="-1"><a class="header-anchor" href="#requirements" aria-hidden="true">#</a> Requirements</h2><blockquote><p>Home assistant integrated with Node-RED</p></blockquote><blockquote><p>Tibber node installed and correctly configured</p></blockquote><blockquote><p>A climate entity</p></blockquote><h2 id="instructions" tabindex="-1"><a class="header-anchor" href="#instructions" aria-hidden="true">#</a> Instructions</h2><blockquote><p>Create an <code>input_number</code> entity in Home Assistant named <code>setpoint</code></p></blockquote><blockquote><p>Import the flow into Node-RED</p></blockquote><blockquote><p>Configure the heat-capacitor node:</p></blockquote><ul><li>Insert an approximate time it takes to increase the temperature by 1 Centigrade (could be 90 minutes)</li><li>Insert an approximate time it takes to decrease 1 Centigrade</li><li>Insert minimum savings for a heating/cooling cycle (should not be zero, as a cycle might have a cost)</li></ul><blockquote><p>Configure the climate service to target the correct climate entity (this has to be edited in two places)</p></blockquote><ul><li>Change <code>Entity Id</code> in the properties menu</li><li>Change the <code>entity_id</code> value in the <code>Data</code> property</li></ul><blockquote><p>(optional) If the <code>input_number</code> entity was named something else than <code>setpoint</code>, change the <code>entity_id</code> of the <code>Setpoint</code> node accordingly.</p></blockquote><h3 id="advanced-set-up" tabindex="-1"><a class="header-anchor" href="#advanced-set-up" aria-hidden="true">#</a> Advanced set-up</h3>',20),u=(0,t.Uk)("Replace the "),c=(0,t._)("code",null,"Set temperature",-1),r=(0,t.Uk)(" node with a "),l=(0,t.Uk)("Cascade controller"),k=(0,t.Uk)(" to improve the heaters accuracy and response time."),i=(0,t.uE)('<hr><h2 id="flow" tabindex="-1"><a class="header-anchor" href="#flow" aria-hidden="true">#</a> Flow</h2><p><img src="'+o+'" alt="Simple example with Tibber"></p><hr><details class="custom-container details"><summary>[Flow code]</summary><div class="language-json ext-json"><pre class="language-json"><code><span class="token punctuation">[</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;tab&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;label&quot;</span><span class="token operator">:</span> <span class="token string">&quot;PowerSaver&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;disabled&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;info&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;env&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;cf5908a52e0aee5e&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;ps-receive-price&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Price Receiver&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">400</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">320</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span>\n <span class="token string">&quot;b7b85590b7d28ba6&quot;</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;b08bc12bf8734c5a&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;tibber-query&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;active&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;apiEndpointRef&quot;</span><span class="token operator">:</span> <span class="token string">&quot;9ea07b03b88cb526&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">230</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">320</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span>\n <span class="token string">&quot;cf5908a52e0aee5e&quot;</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;d0d4dd31efe67e85&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;inject&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;props&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;p&quot;</span><span class="token operator">:</span> <span class="token string">&quot;payload&quot;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;p&quot;</span><span class="token operator">:</span> <span class="token string">&quot;topic&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;vt&quot;</span><span class="token operator">:</span> <span class="token string">&quot;str&quot;</span>\n <span class="token punctuation">}</span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;repeat&quot;</span><span class="token operator">:</span> <span class="token string">&quot;60&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;crontab&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;once&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;onceDelay&quot;</span><span class="token operator">:</span> <span class="token string">&quot;1&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;topic&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;payload&quot;</span><span class="token operator">:</span> <span class="token string">&quot;{ viewer { homes { currentSubscription { priceInfo { today { total startsAt } tomorrow { total startsAt } } } } } }&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;payloadType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;str&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">90</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">320</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span>\n <span class="token string">&quot;b08bc12bf8734c5a&quot;</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;4831f393a0066565&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;api-call-service&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Set temperature&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;server&quot;</span><span class="token operator">:</span> <span class="token string">&quot;e2dd69fb.8f70a8&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;version&quot;</span><span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span>\n <span class="token property">&quot;debugenabled&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;service_domain&quot;</span><span class="token operator">:</span> <span class="token string">&quot;climate&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;service&quot;</span><span class="token operator">:</span> <span class="token string">&quot;set_temperature&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;entityId&quot;</span><span class="token operator">:</span> <span class="token string">&quot;climate.my_climate&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;data&quot;</span><span class="token operator">:</span> <span class="token string">&quot;{\\&quot;entity_id\\&quot;:\\&quot;climate.my_climate\\&quot;,\\&quot;temperature\\&quot;:\\&quot;{{adj_setpoint}}\\&quot;}&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;dataType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;json&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;mergecontext&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;mustacheAltTags&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputProperties&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;queue&quot;</span><span class="token operator">:</span> <span class="token string">&quot;none&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">980</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">320</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;027f4267d969e1b8&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;server-state-changed&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Setpoint&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;server&quot;</span><span class="token operator">:</span> <span class="token string">&quot;e2dd69fb.8f70a8&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;version&quot;</span><span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span>\n <span class="token property">&quot;exposeToHomeAssistant&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;haConfig&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;property&quot;</span><span class="token operator">:</span> <span class="token string">&quot;name&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;property&quot;</span><span class="token operator">:</span> <span class="token string">&quot;icon&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span>\n <span class="token punctuation">}</span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;entityidfilter&quot;</span><span class="token operator">:</span> <span class="token string">&quot;input_number.setpoint&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;entityidfiltertype&quot;</span><span class="token operator">:</span> <span class="token string">&quot;exact&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputinitially&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;state_type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;num&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;haltifstate&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;halt_if_type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;str&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;halt_if_compare&quot;</span><span class="token operator">:</span> <span class="token string">&quot;is&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputs&quot;</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span>\n <span class="token property">&quot;output_only_on_state_change&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;for&quot;</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span>\n <span class="token property">&quot;forType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;num&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;forUnits&quot;</span><span class="token operator">:</span> <span class="token string">&quot;minutes&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;ignorePrevStateNull&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;ignorePrevStateUnknown&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;ignorePrevStateUnavailable&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;ignoreCurrentStateUnknown&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;ignoreCurrentStateUnavailable&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputProperties&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;property&quot;</span><span class="token operator">:</span> <span class="token string">&quot;payload.config.setpoint&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;propertyType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;msg&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;valueType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;entityState&quot;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;property&quot;</span><span class="token operator">:</span> <span class="token string">&quot;data&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;propertyType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;msg&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;valueType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;eventData&quot;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;property&quot;</span><span class="token operator">:</span> <span class="token string">&quot;topic&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;propertyType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;msg&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;value&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;valueType&quot;</span><span class="token operator">:</span> <span class="token string">&quot;triggerId&quot;</span>\n <span class="token punctuation">}</span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">420</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">360</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span>\n <span class="token string">&quot;b7b85590b7d28ba6&quot;</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;b7b85590b7d28ba6&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;ps-strategy-heat-capacitor&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Heat capacitor&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;timeHeat1C&quot;</span><span class="token operator">:</span> <span class="token string">&quot;70&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;timeCool1C&quot;</span><span class="token operator">:</span> <span class="token number">50</span><span class="token punctuation">,</span>\n <span class="token property">&quot;maxTempAdjustment&quot;</span><span class="token operator">:</span> <span class="token string">&quot;1&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;boostTempHeat&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;boostTempCool&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;minSavings&quot;</span><span class="token operator">:</span> <span class="token number">0.08</span><span class="token punctuation">,</span>\n <span class="token property">&quot;setpoint&quot;</span><span class="token operator">:</span> <span class="token number">23</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">600</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">320</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span>\n <span class="token string">&quot;2b7cbdef3203a482&quot;</span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2b7cbdef3203a482&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;function&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;z&quot;</span><span class="token operator">:</span> <span class="token string">&quot;135c4e7649611314&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Adjust setpoint&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;func&quot;</span><span class="token operator">:</span> <span class="token string">&quot;//In case the climate entity can only handle integers\\n//Calculate rounded setpoint for the climate entity and return the msg\\nmsg.adj_setpoint=Math.round(msg.payload);\\nreturn msg\\n&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;outputs&quot;</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span>\n <span class="token property">&quot;noerr&quot;</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span>\n <span class="token property">&quot;initialize&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;finalize&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;libs&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token property">&quot;x&quot;</span><span class="token operator">:</span> <span class="token number">800</span><span class="token punctuation">,</span>\n <span class="token property">&quot;y&quot;</span><span class="token operator">:</span> <span class="token number">320</span><span class="token punctuation">,</span>\n <span class="token property">&quot;wires&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span>\n <span class="token string">&quot;4831f393a0066565&quot;</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">]</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;9ea07b03b88cb526&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;tibber-api-endpoint&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;feedUrl&quot;</span><span class="token operator">:</span> <span class="token string">&quot;wss://api.tibber.com/v1-beta/gql/subscriptions&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;queryUrl&quot;</span><span class="token operator">:</span> <span class="token string">&quot;https://api.tibber.com/v1-beta/gql&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Tibber&quot;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">{</span>\n <span class="token property">&quot;id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;e2dd69fb.8f70a8&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;server&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Home Assistant&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;version&quot;</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span>\n <span class="token property">&quot;addon&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;rejectUnauthorizedCerts&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;ha_boolean&quot;</span><span class="token operator">:</span> <span class="token string">&quot;y|yes|true|on|home|open&quot;</span><span class="token punctuation">,</span>\n <span class="token property">&quot;connectionDelay&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;cacheJson&quot;</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>\n <span class="token property">&quot;heartbeat&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>\n <span class="token property">&quot;heartbeatInterval&quot;</span><span class="token operator">:</span> <span class="token number">30</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">]</span>\n</code></pre></div></details>',5),q={},y=(0,a(3744).Z)(q,[["render",function(n,s){const a=(0,t.up)("RouterLink");return(0,t.wg)(),(0,t.iD)(t.HY,null,[e,(0,t._)("blockquote",null,[(0,t._)("p",null,[u,c,r,(0,t.Wm)(a,{to:"/examples/example-cascade-temperature-control.html"},{default:(0,t.w5)((()=>[l])),_:1}),k])]),i],64)}]])},3744:(n,s)=>{s.Z=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},1125:(n,s,a)=>{n.exports=a.p+"assets/img/heat-capacitor-temperatureVsPrice.6e74905b.png"},6348:(n,s,a)=>{n.exports=a.p+"assets/img/node-ps-strategy-heat-capacitor-simple-flow-example.29d9bf59.png"}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[737],{1510:(e,t,a)=>{a.r(t),a.d(t,{data:()=>i});const i={key:"v-1e2b191e",path:"/nodes/ps-general-add-tariff.html",title:"ps-general-add-tariff",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Description",slug:"description",children:[]},{level:2,title:"Configuration",slug:"configuration",children:[{level:3,title:"Add and delete periods",slug:"add-and-delete-periods",children:[]},{level:3,title:"From time and Value",slug:"from-time-and-value",children:[]},{level:3,title:"Valid from date",slug:"valid-from-date",children:[]},{level:3,title:"Valid to date",slug:"valid-to-date",children:[]}]},{level:2,title:"Input",slug:"input",children:[]},{level:2,title:"Output",slug:"output",children:[]}],git:{updatedTime:1641586171e3},filePathRelative:"nodes/ps-general-add-tariff.md"}},2733:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var i=a(6252),d=a(4693),r=a(2884);const o=(0,i.uE)('<h1 id="ps-general-add-tariff" tabindex="-1"><a class="header-anchor" href="#ps-general-add-tariff" aria-hidden="true">#</a> ps-general-add-tariff</h1><p><img src="'+d+'" alt="ps-general-add-tariff"></p><p>Node to add a value, for example a variable grid tariff, to the price before it is used to calculate savings in the strategy nodes.</p><h2 id="description" tabindex="-1"><a class="header-anchor" href="#description" aria-hidden="true">#</a> Description</h2><p>This node is useful if there is an addition to the electricity price that varies over the day, as it might be for the grid tariff.</p><p>If there is one price for example from 22:00 to 06:00 every day, and another price from 06:00 to 22:00, this is the right node to use. It can be used for more than two periods, as long as the time it changes is the same every day.</p><p>Here is how this node is normally used:</p><p><img src="'+r+'" alt="general flow"></p><div class="custom-container tip"><p class="custom-container-title">Changes during the year</p><p>If there is one price now, and another price from a specific date, you can use two nodes after each other. Set the <code>Valid to date</code> of the node with the current prices to the last date the current prices are valid. Set the <code>Valid from date</code> of the node with the upcoming prices to the first date those prices are valid.</p></div><h2 id="configuration" tabindex="-1"><a class="header-anchor" href="#configuration" aria-hidden="true">#</a> Configuration</h2><h3 id="add-and-delete-periods" tabindex="-1"><a class="header-anchor" href="#add-and-delete-periods" aria-hidden="true">#</a> Add and delete periods</h3><p>You can have from 1 to 24 periods during the day, with different values to add for each hour. Click the <code>Add period</code> button to add more periods. Click the <code>X</code> button to delete a period.</p><h3 id="from-time-and-value" tabindex="-1"><a class="header-anchor" href="#from-time-and-value" aria-hidden="true">#</a> From time and Value</h3><p>For each period, select the time of the day the value is valid from, and enter the value.</p><h3 id="valid-from-date" tabindex="-1"><a class="header-anchor" href="#valid-from-date" aria-hidden="true">#</a> Valid from date</h3><p>Fill in the first date the config is valid.</p><p>If this is empty, the config is valid from the dawn of time.</p><h3 id="valid-to-date" tabindex="-1"><a class="header-anchor" href="#valid-to-date" aria-hidden="true">#</a> Valid to date</h3><p>Fill in the last date the config is valid.</p><p>If this is empty, the config is valid until forever.</p><h2 id="input" tabindex="-1"><a class="header-anchor" href="#input" aria-hidden="true">#</a> Input</h2>',21),n=(0,i.Uk)("The input is the "),s=(0,i.Uk)("common strategy input format"),l=(0,i._)("h2",{id:"output",tabindex:"-1"},[(0,i._)("a",{class:"header-anchor",href:"#output","aria-hidden":"true"},"#"),(0,i.Uk)(" Output")],-1),h=(0,i.Uk)("The output is the "),p=(0,i.Uk)("common strategy input format"),c=(0,i._)("p",null,"If there is a config property in the input payload, it is passed on to the output payload.",-1),f={},u=(0,a(3744).Z)(f,[["render",function(e,t){const a=(0,i.up)("RouterLink");return(0,i.wg)(),(0,i.iD)(i.HY,null,[o,(0,i._)("p",null,[n,(0,i.Wm)(a,{to:"/nodes/strategy-input.html"},{default:(0,i.w5)((()=>[s])),_:1})]),l,(0,i._)("p",null,[h,(0,i.Wm)(a,{to:"/nodes/strategy-input.html"},{default:(0,i.w5)((()=>[p])),_:1})]),c],64)}]])},3744:(e,t)=>{t.Z=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},2884:(e,t,a)=>{e.exports=a.p+"assets/img/add-tariff-flow.eb700d4f.png"},4693:(e,t,a)=>{e.exports=a.p+"assets/img/node-ps-general-add-tariff.a3cf6f06.png"}}]);