node-red-contrib-power-saver 3.2.3 → 3.4.0

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/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/docs/.vuepress/clientAppEnhance.js +5 -0
  4. package/docs/.vuepress/components/BestSaveVerificator.vue +306 -0
  5. package/docs/.vuepress/components/DonateButtons.vue +87 -0
  6. package/docs/.vuepress/config.js +36 -7
  7. package/docs/.vuepress/dist/404.html +5 -5
  8. package/docs/.vuepress/dist/assets/css/563.styles.99f4a8aa.css +1 -0
  9. package/docs/.vuepress/dist/assets/css/835.styles.c5afb22b.css +1 -0
  10. package/docs/.vuepress/dist/assets/css/{styles.e835bef6.css → styles.031dcf27.css} +2 -1
  11. package/docs/.vuepress/dist/assets/img/best-save-config.79a2f39a.png +0 -0
  12. package/docs/.vuepress/dist/assets/img/copy-payload-best-save.b9192985.png +0 -0
  13. package/docs/.vuepress/dist/assets/img/heat-capacitor-temperatureVsPrice.6e74905b.png +0 -0
  14. package/docs/.vuepress/dist/assets/img/node-ps-strategy-heat-capacitor-cascade-control.2e75ed9e.png +0 -0
  15. package/docs/.vuepress/dist/assets/img/node-ps-strategy-heat-capacitor-simple-flow-example.29d9bf59.png +0 -0
  16. package/docs/.vuepress/dist/assets/img/oven-setpoint-calculation.5bda0eec.png +0 -0
  17. package/docs/.vuepress/dist/assets/img/overshoot-time.b3b5d70e.png +0 -0
  18. package/docs/.vuepress/dist/assets/js/262.cf2c57d2.js +1 -0
  19. package/docs/.vuepress/dist/assets/js/{293.5e967839.js → 293.08ea5200.js} +0 -0
  20. package/docs/.vuepress/dist/assets/js/331.15ee3c51.js +1 -0
  21. package/docs/.vuepress/dist/assets/js/{491.c183eba3.js → 491.17a98f38.js} +0 -0
  22. package/docs/.vuepress/dist/assets/js/619.8ba1b1f6.js +2 -0
  23. package/docs/.vuepress/dist/assets/js/{812.79dad458.js.LICENSE.txt → 619.8ba1b1f6.js.LICENSE.txt} +0 -0
  24. package/docs/.vuepress/dist/assets/js/811.6a3392d5.js +1 -0
  25. package/docs/.vuepress/dist/assets/js/app.e881e9b6.js +1 -0
  26. package/docs/.vuepress/dist/assets/js/runtime~app.8bebaa00.js +1 -0
  27. package/docs/.vuepress/dist/assets/js/{v-0607240a.661e1808.js → v-0607240a.a57c2199.js} +0 -0
  28. package/docs/.vuepress/dist/assets/js/{v-08683c60.a6b9cf5b.js → v-08683c60.ccafdcab.js} +0 -0
  29. package/docs/.vuepress/dist/assets/js/v-0aca7ba6.4f3573a3.js +1 -0
  30. package/docs/.vuepress/dist/assets/js/v-0b5e3c8c.76407435.js +1 -0
  31. package/docs/.vuepress/dist/assets/js/{v-1ad821fa.6e2194d0.js → v-1ad821fa.5978386f.js} +0 -0
  32. package/docs/.vuepress/dist/assets/js/v-1b3a0ab8.def099e9.js +1 -0
  33. package/docs/.vuepress/dist/assets/js/{v-1e2b191e.98cc227b.js → v-1e2b191e.88dc5555.js} +0 -0
  34. package/docs/.vuepress/dist/assets/js/v-29504124.4aca27d5.js +1 -0
  35. package/docs/.vuepress/dist/assets/js/{v-30acb564.f2fcd69f.js → v-30acb564.529a3c16.js} +0 -0
  36. package/docs/.vuepress/dist/assets/js/v-4637f9e4.5cc542f6.js +1 -0
  37. package/docs/.vuepress/dist/assets/js/v-4c28314d.48fc6e75.js +1 -0
  38. package/docs/.vuepress/dist/assets/js/v-510ed0d4.b58000bf.js +1 -0
  39. package/docs/.vuepress/dist/assets/js/{v-5954bcb2.182daf70.js → v-5954bcb2.937005d0.js} +0 -0
  40. package/docs/.vuepress/dist/assets/js/{v-5db8da3a.f2de6cb9.js → v-5db8da3a.3de3588d.js} +1 -1
  41. package/docs/.vuepress/dist/assets/js/{v-61f728ca.6fdbbb92.js → v-61f728ca.21d432fe.js} +1 -1
  42. package/docs/.vuepress/dist/assets/js/v-677dfaed.1ad4c776.js +1 -0
  43. package/docs/.vuepress/dist/assets/js/v-7446a652.74b21d0b.js +1 -0
  44. package/docs/.vuepress/dist/assets/js/v-7c87f26e.5e3553b0.js +1 -0
  45. package/docs/.vuepress/dist/assets/js/v-84304104.f66996c5.js +1 -0
  46. package/docs/.vuepress/dist/assets/js/{v-8daa1a0e.dde202c9.js → v-8daa1a0e.c06c5c76.js} +1 -1
  47. package/docs/.vuepress/dist/assets/js/{v-b4a42144.9e5f9728.js → v-b4a42144.733e4e7c.js} +0 -0
  48. package/docs/.vuepress/dist/assets/js/v-e8c55052.9664f731.js +1 -0
  49. package/docs/.vuepress/dist/assets/js/v-fffb8e28.525be02a.js +1 -0
  50. package/docs/.vuepress/dist/changelog/index.html +5 -5
  51. package/docs/.vuepress/dist/contribute/index.html +5 -5
  52. package/docs/.vuepress/dist/examples/example-cascade-temperature-control.html +286 -0
  53. package/docs/.vuepress/dist/examples/example-heat-capacitor.html +229 -0
  54. package/docs/.vuepress/dist/examples/example-next-schedule-entity.html +6 -6
  55. package/docs/.vuepress/dist/examples/example-nordpool-current-state.html +6 -7
  56. package/docs/.vuepress/dist/examples/example-nordpool-events-state.html +6 -6
  57. package/docs/.vuepress/dist/examples/example-tibber-mqtt.html +6 -7
  58. package/docs/.vuepress/dist/examples/index.html +5 -5
  59. package/docs/.vuepress/dist/faq/best-save-viewer.html +15 -0
  60. package/docs/.vuepress/dist/faq/index.html +5 -5
  61. package/docs/.vuepress/dist/guide/index.html +6 -6
  62. package/docs/.vuepress/dist/index.html +5 -5
  63. package/docs/.vuepress/dist/nodes/index.html +5 -5
  64. package/docs/.vuepress/dist/nodes/old-power-saver-doc.html +7 -7
  65. package/docs/.vuepress/dist/nodes/power-saver.html +5 -5
  66. package/docs/.vuepress/dist/nodes/ps-elvia-add-tariff.html +5 -5
  67. package/docs/.vuepress/dist/nodes/ps-general-add-tariff.html +5 -5
  68. package/docs/.vuepress/dist/nodes/ps-receive-price.html +8 -8
  69. package/docs/.vuepress/dist/nodes/ps-strategy-best-save.html +27 -8
  70. package/docs/.vuepress/dist/nodes/ps-strategy-heat-capacitor.html +242 -0
  71. package/docs/.vuepress/dist/nodes/ps-strategy-lowest-price.html +22 -7
  72. package/docs/.vuepress/dist/nodes/strategy-input.html +5 -5
  73. package/docs/README.md +4 -1
  74. package/docs/changelog/README.md +22 -0
  75. package/docs/contribute/README.md +11 -3
  76. package/docs/examples/README.md +8 -2
  77. package/docs/examples/example-cascade-temperature-control.md +345 -0
  78. package/docs/examples/example-heat-capacitor.md +271 -0
  79. package/docs/examples/example-nordpool-current-state.md +0 -1
  80. package/docs/examples/example-tibber-mqtt.md +0 -1
  81. package/docs/faq/README.md +28 -1
  82. package/docs/faq/best-save-viewer.md +61 -0
  83. package/docs/images/best-save-config.png +0 -0
  84. package/docs/images/copy-payload-best-save.png +0 -0
  85. package/docs/images/heat-capacitor-temperatureVsPrice.png +0 -0
  86. package/docs/images/node-ps-strategy-heat-capacitor-cascade-control.png +0 -0
  87. package/docs/images/node-ps-strategy-heat-capacitor-simple-flow-example.png +0 -0
  88. package/docs/images/node-ps-strategy-heat-capacitor.png +0 -0
  89. package/docs/images/oven-setpoint-calculation.png +0 -0
  90. package/docs/images/overshoot-time.png +0 -0
  91. package/docs/images/temperature-manipulation-config.png +0 -0
  92. package/docs/nodes/README.md +7 -1
  93. package/docs/nodes/ps-strategy-best-save.md +95 -8
  94. package/docs/nodes/ps-strategy-heat-capacitor.md +346 -0
  95. package/docs/nodes/ps-strategy-lowest-price.md +57 -0
  96. package/package.json +8 -3
  97. package/src/handle-input.js +32 -10
  98. package/src/strategy-best-save.html +0 -21
  99. package/src/strategy-best-save.js +8 -11
  100. package/src/strategy-heat-capacitor-functions.js +246 -0
  101. package/src/strategy-heat-capacitor.html +85 -0
  102. package/src/strategy-heat-capacitor.js +125 -0
  103. package/test/commands-input.test.js +47 -0
  104. package/test/data/best-save-result.json +1 -2
  105. package/test/data/converted-prices.json +1 -1
  106. package/test/data/current-undefined-prices.json +197 -0
  107. package/test/data/current-undefined-result.json +208 -0
  108. package/test/data/lowest-price-result-missing-end.json +2 -1
  109. package/test/data/multiple-trades.json +53 -0
  110. package/test/data/reconfigResult.js +56 -294
  111. package/test/data/reconfigResult_old2.js +75 -0
  112. package/test/data/tibber-decreasing-24h.json +101 -0
  113. package/test/data/tibber-decreasing2-24h.json +101 -0
  114. package/test/data/tibber-result-end-0-24h.json +1 -0
  115. package/test/data/tibber-result-end-0.json +1 -0
  116. package/test/send-config-input.test.js +3 -37
  117. package/test/strategy-best-save-test-utils.js +2 -1
  118. package/test/strategy-best-save.test.js +14 -8
  119. package/test/strategy-heat-capacitor-node.test.js +183 -0
  120. package/test/strategy-heat-capacitor.test.js +105 -0
  121. package/test/test-utils.js +1 -7
  122. package/test/utils.test.js +0 -33
  123. package/docs/.vuepress/dist/assets/img/best-save-config.93fa3c21.png +0 -0
  124. package/docs/.vuepress/dist/assets/js/812.79dad458.js +0 -2
  125. package/docs/.vuepress/dist/assets/js/app.49ad6d54.js +0 -1
  126. package/docs/.vuepress/dist/assets/js/runtime~app.547d0f4e.js +0 -1
  127. package/docs/.vuepress/dist/assets/js/v-0aca7ba6.b42fad7f.js +0 -1
  128. package/docs/.vuepress/dist/assets/js/v-0b5e3c8c.3b37457f.js +0 -1
  129. package/docs/.vuepress/dist/assets/js/v-4637f9e4.b320f5e8.js +0 -1
  130. package/docs/.vuepress/dist/assets/js/v-510ed0d4.3c7e0056.js +0 -1
  131. package/docs/.vuepress/dist/assets/js/v-677dfaed.0013f083.js +0 -1
  132. package/docs/.vuepress/dist/assets/js/v-7446a652.d05e2648.js +0 -1
  133. package/docs/.vuepress/dist/assets/js/v-7c87f26e.1127dcf5.js +0 -1
  134. package/docs/.vuepress/dist/assets/js/v-e8c55052.8384b053.js +0 -1
  135. package/docs/.vuepress/dist/assets/js/v-fffb8e28.3406fd88.js +0 -1
  136. package/test/data/adjustedResult.js +0 -302
  137. package/test/data/adjustedResult_old.js +0 -154
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[745],{7951:(e,n,s)=>{s.r(n),s.d(n,{data:()=>r});const r={key:"v-677dfaed",path:"/nodes/ps-receive-price.html",title:"ps-receive-price",lang:"en-US",frontmatter:{prev:"./ps-strategy-lowest-price.md"},excerpt:"",headers:[{level:2,title:"Description",slug:"description",children:[]},{level:2,title:"Configuration",slug:"configuration",children:[]},{level:2,title:"Input",slug:"input",children:[{level:3,title:"Tibber input",slug:"tibber-input",children:[]},{level:3,title:"Nord Pool input",slug:"nord-pool-input",children:[]},{level:3,title:"Other input",slug:"other-input",children:[]}]},{level:2,title:"Output",slug:"output",children:[]}],filePathRelative:"nodes/ps-receive-price.md",git:{updatedTime:1640034618e3}}},546:(e,n,s)=>{s.r(n),s.d(n,{default:()=>de});var r=s(6252),t=s(3301);const a=(0,r._)("h1",{id:"ps-receive-price",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-receive-price","aria-hidden":"true"},"#"),(0,r.Uk)(" ps-receive-price")],-1),l=(0,r._)("p",null,[(0,r._)("img",{src:t,alt:"ps-receive-price"})],-1),o=(0,r._)("h2",{id:"description",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#description","aria-hidden":"true"},"#"),(0,r.Uk)(" Description")],-1),i=(0,r._)("p",null,[(0,r.Uk)("The "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node is used to convert prices from Tibber or Nord Pool to the format used by the strategy nodes. It takes its input directly from the output of the following nodes (see details below):")],-1),u=(0,r._)("ul",null,[(0,r._)("li",null,[(0,r._)("code",null,"tibber-query"),(0,r.Uk)(" node from Tibber ("),(0,r._)("code",null,"node-red-contrib-tibber-api"),(0,r.Uk)(")")]),(0,r._)("li",null,[(0,r._)("code",null,"current state"),(0,r.Uk)(" node in Home Assistant")]),(0,r._)("li",null,[(0,r._)("code",null,"events: state"),(0,r.Uk)(" node in Home Assistant")])],-1),p=(0,r._)("p",null,[(0,r.Uk)("Output can be sent directly to the strategy nodes (for example "),(0,r._)("code",null,"strategy-best-save"),(0,r.Uk)(" or "),(0,r._)("code",null,"strategy-lowest-price"),(0,r.Uk)("), or it can be sent via another node to add grid tariff or other additional costs before the calculation is done.")],-1),c=(0,r._)("div",{class:"custom-container warning"},[(0,r._)("p",{class:"custom-container-title"},"Note"),(0,r._)("p",null,[(0,r.Uk)("In version 2 of "),(0,r._)("code",null,"node-red-contrib-power-saver"),(0,r.Uk)(", prices were received directly by the Power Saver node. This made it hard to add grid tariff before the calculation was done. That is why this is now a separate node.")])],-1),_=(0,r._)("h2",{id:"configuration",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#configuration","aria-hidden":"true"},"#"),(0,r.Uk)(" Configuration")],-1),b=(0,r._)("p",null,"There is no configuration except from node name.",-1),d=(0,r._)("h2",{id:"input",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#input","aria-hidden":"true"},"#"),(0,r.Uk)(" Input")],-1),h=(0,r._)("h3",{id:"tibber-input",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#tibber-input","aria-hidden":"true"},"#"),(0,r.Uk)(" Tibber input")],-1),m=(0,r.Uk)("If you are a Tibber customer, you can use the "),k=(0,r._)("code",null,"tibber-query",-1),g=(0,r.Uk)(" node from the "),f={href:"https://flows.nodered.org/node/node-red-contrib-tibber-api",target:"_blank",rel:"noopener noreferrer"},U=(0,r._)("code",null,"node-red-contrib-tibber-api",-1),y=(0,r.Uk)(". Set it up with the following query:"),v=(0,r._)("div",{class:"language-gql ext-gql line-numbers-mode"},[(0,r._)("pre",{class:"language-gql"},[(0,r._)("code",null,"{\n viewer {\n homes {\n currentSubscription {\n priceInfo {\n today {\n total\n startsAt\n }\n tomorrow {\n total\n startsAt\n }\n }\n }\n }\n }\n}\n")]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"3"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"4"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"5"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"6"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"7"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"8"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"9"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"10"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"11"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"12"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"13"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"14"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"15"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"16"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"17"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"18"),(0,r._)("br")])],-1),w=(0,r._)("p",null,[(0,r.Uk)("Send the result from the "),(0,r._)("code",null,"tibber-query"),(0,r.Uk)(" node with the query above directly to the "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node. Make sure it is refreshed when new prices are ready. Prices for the next day are normally ready at 13:00, but refreshing every hour can be a good idea.")],-1),x=(0,r.Uk)("See example with Tibber, a switch and MQTT"),T=(0,r._)("div",{class:"custom-container danger"},[(0,r._)("p",{class:"custom-container-title"},"Warning"),(0,r._)("p",null,"The query above returns an array with all houses you have in your Tibber account. It will work only if the house you want is the first house in the array, for example if you have only one house. If that is not the case, you must use the query below.")],-1),q=(0,r._)("p",null,[(0,r._)("strong",null,"Tibber query for a specific house")],-1),I=(0,r._)("p",null,"If the above query does not give you the house you want as the first in the result array, you can use the following method. In this method you need run one query in order to find the id of the house you want the prices for first, and then use the id in the real query.",-1),P=(0,r.Uk)("Go to the "),N={href:"https://developer.tibber.com/",target:"_blank",rel:"noopener noreferrer"},S=(0,r.Uk)("Tibber Developer pages"),W=(0,r.Uk)(", sign in, and go to the "),A={href:"https://developer.tibber.com/explorer",target:"_blank",rel:"noopener noreferrer"},O=(0,r.Uk)("API Explorer"),C=(0,r.Uk)(". Load your personal token, then run the following query:"),D=(0,r._)("div",{class:"language-gql ext-gql line-numbers-mode"},[(0,r._)("pre",{class:"language-gql"},[(0,r._)("code",null,"{\n viewer {\n homes {\n id\n address {\n address1\n address2\n address3\n postalCode\n city\n country\n }\n }\n }\n}\n")]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"3"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"4"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"5"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"6"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"7"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"8"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"9"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"10"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"11"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"12"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"13"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"14"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"15"),(0,r._)("br")])],-1),H=(0,r._)("p",null,[(0,r.Uk)("Then copy the "),(0,r._)("code",null,"id"),(0,r.Uk)(" of the house you want to use prices for. It may look like this:")],-1),j=(0,r._)("div",{class:"language-text ext-text line-numbers-mode"},[(0,r._)("pre",{class:"language-text"},[(0,r._)("code",null,"NB! This is just an example:\n142c1670-ab43-2ab3-ba6d-723703a551e2\n")]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br")])],-1),L=(0,r._)("p",null,"Then use the id in the following query, replacing the id with the one you found in the previous query:",-1),M=(0,r._)("div",{class:"language-gql ext-gql line-numbers-mode"},[(0,r._)("pre",{class:"language-gql"},[(0,r._)("code",null,'{\n viewer {\n home(id: "142c1670-ab43-2ab3-ba6d-723703a551e2") {\n currentSubscription{\n priceInfo{\n today {\n total\n startsAt\n }\n tomorrow {\n total\n startsAt\n }\n }\n }\n }\n }\n}\n')]),(0,r._)("div",{class:"highlight-lines"},[(0,r._)("br"),(0,r._)("br"),(0,r._)("div",{class:"highlight-line"}," "),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br")]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"3"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"4"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"5"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"6"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"7"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"8"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"9"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"10"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"11"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"12"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"13"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"14"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"15"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"16"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"17"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"18"),(0,r._)("br")])],-1),R=(0,r._)("p",null,[(0,r.Uk)("This is the query you shall put in the "),(0,r._)("code",null,"tibber-query"),(0,r.Uk)(" node.")],-1),Z=(0,r._)("h3",{id:"nord-pool-input",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#nord-pool-input","aria-hidden":"true"},"#"),(0,r.Uk)(" Nord Pool input")],-1),B=(0,r.Uk)("This is especially designed to work for Home Assistant (HA), and the "),E={href:"https://github.com/custom-components/nordpool",target:"_blank",rel:"noopener noreferrer"},G=(0,r.Uk)("Nord Pool custom component"),J=(0,r.Uk)(". The Nord Pool component provides a "),Q=(0,r._)("em",null,"sensor",-1),Y=(0,r.Uk)(" that gives price per hour for today and tomorrow (after 13:00). Send the output from this sensor directly to the "),z=(0,r._)("code",null,"ps-receive-price",-1),F=(0,r.Uk)(" node. Make sure this is done whenever the node is updated, as well as when the system starts up."),K=(0,r._)("p",null,[(0,r.Uk)("Data can be sent from both the "),(0,r._)("code",null,"current state"),(0,r.Uk)(" node or the "),(0,r._)("code",null,"events: state"),(0,r.Uk)(" node.")],-1),V=(0,r._)("div",{class:"custom-container tip"},[(0,r._)("p",{class:"custom-container-title"},"Output properties"),(0,r._)("p",null,[(0,r.Uk)("When using the "),(0,r._)("code",null,"current state"),(0,r.Uk)(" node, configure the output properties to set "),(0,r._)("code",null,"msg.payload"),(0,r.Uk)(" to "),(0,r._)("code",null,"entity"),(0,r.Uk)(".")])],-1),X=(0,r.Uk)("See example with Nord Pool and "),$=(0,r._)("code",null,"current state",-1),ee=(0,r.Uk)(" node"),ne=(0,r.Uk)("See example with Nord Pool and "),se=(0,r._)("code",null,"events: state",-1),re=(0,r.Uk)(" node"),te=(0,r._)("h3",{id:"other-input",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#other-input","aria-hidden":"true"},"#"),(0,r.Uk)(" Other input")],-1),ae=(0,r._)("p",null,"If you cannot use any of the two above (Tibber or Nord Pool), create the input to the node with the payload containing JSON like this:",-1),le=(0,r._)("div",{class:"language-json ext-json line-numbers-mode"},[(0,r._)("pre",{class:"language-json"},[(0,r._)("code",null,[(0,r._)("span",{class:"token punctuation"},"{"),(0,r.Uk)("\n "),(0,r._)("span",{class:"token property"},'"today"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token punctuation"},"["),(0,r.Uk)("\n "),(0,r._)("span",{class:"token punctuation"},"{"),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"value"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token number"},"1"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"start"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token string"},'"2021-06-21T00:00:00+02:00"'),(0,r.Uk)(),(0,r._)("span",{class:"token punctuation"},"}"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)("\n "),(0,r._)("span",{class:"token punctuation"},"{"),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"value"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token number"},"2"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"start"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token string"},'"2021-06-21T01:00:00+02:00"'),(0,r.Uk)(),(0,r._)("span",{class:"token punctuation"},"}"),(0,r.Uk)("\n "),(0,r._)("span",{class:"token comment"},"//..."),(0,r.Uk)("\n "),(0,r._)("span",{class:"token punctuation"},"]"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)("\n "),(0,r._)("span",{class:"token property"},'"tomorrow"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token punctuation"},"["),(0,r.Uk)("\n "),(0,r._)("span",{class:"token punctuation"},"{"),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"value"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token number"},"3"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"start"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token string"},'"2021-06-22T00:00:00+02:00"'),(0,r.Uk)(),(0,r._)("span",{class:"token punctuation"},"}"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)("\n "),(0,r._)("span",{class:"token punctuation"},"{"),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"value"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token number"},"4"),(0,r._)("span",{class:"token punctuation"},","),(0,r.Uk)(),(0,r._)("span",{class:"token property"},'"start"'),(0,r._)("span",{class:"token operator"},":"),(0,r.Uk)(),(0,r._)("span",{class:"token string"},'"2021-06-22T01:00:00+02:00"'),(0,r.Uk)(),(0,r._)("span",{class:"token punctuation"},"}"),(0,r.Uk)("\n "),(0,r._)("span",{class:"token comment"},"//..."),(0,r.Uk)("\n "),(0,r._)("span",{class:"token punctuation"},"]"),(0,r.Uk)("\n"),(0,r._)("span",{class:"token punctuation"},"}"),(0,r.Uk)("\n")])]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"3"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"4"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"5"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"6"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"7"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"8"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"9"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"10"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"11"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"12"),(0,r._)("br")])],-1),oe=(0,r._)("h2",{id:"output",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#output","aria-hidden":"true"},"#"),(0,r.Uk)(" Output")],-1),ie=(0,r.Uk)("The output is the "),ue=(0,r.Uk)("common strategy input format"),pe=(0,r.Uk)(", so it can be sent directly to the strategy nodes, or via any "),ce=(0,r._)("code",null,"ps-xxx-add-tariff",-1),_e=(0,r.Uk)(" node."),be={},de=(0,s(3744).Z)(be,[["render",function(e,n){const s=(0,r.up)("OutboundLink"),t=(0,r.up)("RouterLink");return(0,r.wg)(),(0,r.iD)(r.HY,null,[a,l,o,i,u,p,c,_,b,d,h,(0,r._)("p",null,[m,k,g,(0,r._)("a",f,[U,(0,r.Wm)(s)]),y]),v,w,(0,r._)("p",null,[(0,r.Wm)(t,{to:"/examples/example-tibber-mqtt.html"},{default:(0,r.w5)((()=>[x])),_:1})]),T,q,I,(0,r._)("p",null,[P,(0,r._)("a",N,[S,(0,r.Wm)(s)]),W,(0,r._)("a",A,[O,(0,r.Wm)(s)]),C]),D,H,j,L,M,R,Z,(0,r._)("p",null,[B,(0,r._)("a",E,[G,(0,r.Wm)(s)]),J,Q,Y,z,F]),K,V,(0,r._)("p",null,[(0,r.Wm)(t,{to:"/examples/example-nordpool-current-state.html"},{default:(0,r.w5)((()=>[X,$,ee])),_:1})]),(0,r._)("p",null,[(0,r.Wm)(t,{to:"/examples/example-nordpool-events-state.html"},{default:(0,r.w5)((()=>[ne,se,re])),_:1})]),te,ae,le,oe,(0,r._)("p",null,[ie,(0,r.Wm)(t,{to:"/nodes/strategy-input.html"},{default:(0,r.w5)((()=>[ue])),_:1}),pe,ce,_e])],64)}]])},3744:(e,n)=>{n.Z=(e,n)=>{const s=e.__vccOpts||e;for(const[e,r]of n)s[e]=r;return s}},3301:(e,n,s)=>{e.exports=s.p+"assets/img/node-ps-receive-price.76eaa418.png"}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[969],{4129:(e,A,t)=>{t.r(A),t.d(A,{data:()=>s});const s={key:"v-7446a652",path:"/faq/",title:"FAQ",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Why does the Best Save node not turn off the most expensive hours?",slug:"why-does-the-best-save-node-not-turn-off-the-most-expensive-hours",children:[]}],filePathRelative:"faq/README.md",git:{updatedTime:1641408133e3}}},3580:(e,A,t)=>{t.r(A),t.d(A,{default:()=>f});var s=t(6252),h=t(2041);const o=(0,s._)("h1",{id:"faq",tabindex:"-1"},[(0,s._)("a",{class:"header-anchor",href:"#faq","aria-hidden":"true"},"#"),(0,s.Uk)(" FAQ")],-1),n=(0,s._)("h2",{id:"why-does-the-best-save-node-not-turn-off-the-most-expensive-hours",tabindex:"-1"},[(0,s._)("a",{class:"header-anchor",href:"#why-does-the-best-save-node-not-turn-off-the-most-expensive-hours","aria-hidden":"true"},"#"),(0,s.Uk)(" Why does the Best Save node not turn off the most expensive hours?")],-1),I=(0,s._)("p",null,"Here is an example:",-1),a=(0,s._)("p",null,[(0,s._)("img",{src:h,alt:"Mysterious saving"})],-1),i=(0,s._)("p",null,"The purple strokes shows the savings. The Best Save node is configured to save up to 5 hours in a sequence, and only when saving is more than 0.05 NOK.",-1),r=(0,s._)("p",null,"Why does it not save the most expensive period?",-1),C=(0,s._)("p",null,"If you move the saving-period 4-5 hours earlier, the most expensive hours would have been saved. Why is this not better?",-1),Q=(0,s._)("p",null,"Remember that the power that is not used during the saving-period, will be used immediately after. At least, that is the idea, and the normal behaviour if the power consumer is a water heater or another heater controlled by a thermostat. So, then the power would be used one of the blue hours in stead of the green cheaper hour.",-1),d=(0,s._)("p",null,"Also remember that when saving, you do not save the full price. You only save what is the difference between the price during the saved hours and the price the hour immediately after.",-1),g=(0,s._)("p",null,"So the best saving is found where this difference is the largest, and that is not always by turning off the most expensive hours. In the case above, the difference is largest when you turn off the hours marked wit a purple stroke, so this is the best saving you can get.",-1),l=(0,s._)("p",null,"Of course, if you expand the saving period from 5 to 10 hours you would save even more, but that would be a different case, and you can do that if it is ok for you to turn off for that long time.",-1),u=(0,s._)("p",null,"Another alternative is to reduce the minimum saving from 0.05 to 0.001. Then the 3 first red hours would be turned off, but the last red would have to be on, in order to get one hour on until the next 5-hour period off. This would however not save you for much money, since the hour that is on is almost as expensive as the hours you would turn off.",-1),k={},f=(0,t(3744).Z)(k,[["render",function(e,A){return(0,s.wg)(),(0,s.iD)(s.HY,null,[o,n,I,a,i,r,C,Q,d,g,l,u],64)}]])},3744:(e,A)=>{A.Z=(e,A)=>{const t=e.__vccOpts||e;for(const[e,s]of A)t[e]=s;return t}},2041:e=>{e.exports="data:image/png;base64,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"}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[889],{9459:(e,t,r)=>{r.r(t),r.d(t,{data:()=>o});const o={key:"v-7c87f26e",path:"/contribute/",title:"Contribute",lang:"en-US",frontmatter:{sidebar:"auto"},excerpt:"",headers:[{level:2,title:"Patreon",slug:"patreon",children:[]},{level:2,title:"Code",slug:"code",children:[]},{level:2,title:"Examples",slug:"examples",children:[]},{level:2,title:"Bug reports",slug:"bug-reports",children:[]},{level:2,title:"Ideas",slug:"ideas",children:[]}],filePathRelative:"contribute/README.md",git:{updatedTime:1640034618e3}}},9704:(e,t,r)=>{r.r(t),r.d(t,{default:()=>_});var o=r(6252);const a=(0,o.uE)('<h1 id="contribute" tabindex="-1"><a class="header-anchor" href="#contribute" aria-hidden="true">#</a> Contribute</h1><h2 id="patreon" tabindex="-1"><a class="header-anchor" href="#patreon" aria-hidden="true">#</a> Patreon</h2><p>Developing software is time consuming. This solution has taken the better part of all my free time for about 3 quarters of a year. Getting something back would make it easier to also spend future time on this.</p><p>I am trying out Patreon to see if it is possible to get something back for the work I do. The software is open source, and you can use it for free, but if you feel it has value, you can support the development by becoming a patron, paying a monthly fee of your choice.</p><p><a href="https://www.patreon.com/bePatron?u=65948417" data-patreon-widget-type="become-patron-button">Become a Patron!</a></p><h2 id="code" tabindex="-1"><a class="header-anchor" href="#code" aria-hidden="true">#</a> Code</h2><p>It would be very nice to get more developers on board, and become a team. If you satisfy the following criteria, I would be happy to get help on developing this further:</p><ul><li>Professional or experienced developer</li><li>Know JavaScript</li><li>Write automated tests for your code</li><li>Use <code>node-red-contrib-power-saver</code></li><li>Want to collaborate on further development</li></ul><p>Please contact me, for example by making a [GitHub issue(https://github.com/ottopaulsen/node-red-contrib-power-saver/issues)] explaining what you would like to do.</p><p>The first and most important task now, is to make support for getting grid tariff from all suppliers.</p><h2 id="examples" tabindex="-1"><a class="header-anchor" href="#examples" aria-hidden="true">#</a> Examples</h2>',11),i=(0,o.Uk)("It would be very nice to get more examples into the documentation. If you have made something smart, please describe in a markdown-file and either send me, or preferably make a pull request on "),n={href:"https://github.com/ottopaulsen/node-red-contrib-power-saver/pulls",target:"_blank",rel:"noopener noreferrer"},s=(0,o.Uk)("GitHub"),l=(0,o.Uk)("."),d=(0,o._)("h2",{id:"bug-reports",tabindex:"-1"},[(0,o._)("a",{class:"header-anchor",href:"#bug-reports","aria-hidden":"true"},"#"),(0,o.Uk)(" Bug reports")],-1),u=(0,o.Uk)("If you find a bug, please describe it thoroughly and make a "),p={href:"https://github.com/ottopaulsen/node-red-contrib-power-saver/issues",target:"_blank",rel:"noopener noreferrer"},h=(0,o.Uk)("GitHub issue"),c=(0,o.Uk)(". If the bug is related to the scheduling, "),b=(0,o._)("strong",null,"please provide the full output from output 3",-1),f=(0,o.Uk)(" on the strategy node."),m=(0,o._)("h2",{id:"ideas",tabindex:"-1"},[(0,o._)("a",{class:"header-anchor",href:"#ideas","aria-hidden":"true"},"#"),(0,o.Uk)(" Ideas")],-1),g=(0,o.Uk)("If you have ideas for new features, please make a "),k={href:"https://github.com/ottopaulsen/node-red-contrib-power-saver/issues",target:"_blank",rel:"noopener noreferrer"},v=(0,o.Uk)("GitHub issue"),w=(0,o.Uk)(" and describe it as detailed as possible."),y={},_=(0,r(3744).Z)(y,[["render",function(e,t){const r=(0,o.up)("OutboundLink");return(0,o.wg)(),(0,o.iD)(o.HY,null,[a,(0,o._)("p",null,[i,(0,o._)("a",n,[s,(0,o.Wm)(r)]),l]),d,(0,o._)("p",null,[u,(0,o._)("a",p,[h,(0,o.Wm)(r)]),c,b,f]),m,(0,o._)("p",null,[g,(0,o._)("a",k,[v,(0,o.Wm)(r)]),w])],64)}]])},3744:(e,t)=>{t.Z=(e,t)=>{const r=e.__vccOpts||e;for(const[e,o]of t)r[e]=o;return r}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[651],{3029:(e,a,t)=>{t.r(a),t.d(a,{data:()=>r});const r={key:"v-e8c55052",path:"/nodes/",title:"Nodes",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"Power Saver",slug:"power-saver",children:[]},{level:2,title:"Strategy nodes",slug:"strategy-nodes",children:[{level:3,title:"ps-strategy-best-save",slug:"ps-strategy-best-save",children:[]},{level:3,title:"ps-strategy-lowest-price",slug:"ps-strategy-lowest-price",children:[]}]},{level:2,title:"Utility nodes",slug:"utility-nodes",children:[{level:3,title:"ps-receive-price",slug:"ps-receive-price",children:[]}]},{level:2,title:"Grid tariff nodes",slug:"grid-tariff-nodes",children:[{level:3,title:"ps-general-add-tariff",slug:"ps-general-add-tariff",children:[]},{level:3,title:"ps-elvia-add-tariff",slug:"ps-elvia-add-tariff",children:[]}]},{level:2,title:"Other nodes",slug:"other-nodes",children:[{level:3,title:"ps-elvia-tariff-types",slug:"ps-elvia-tariff-types",children:[]},{level:3,title:"ps-elvia-tariff",slug:"ps-elvia-tariff",children:[]}]}],filePathRelative:"nodes/README.md",git:{updatedTime:1641408133e3}}},1173:(e,a,t)=>{t.r(a),t.d(a,{default:()=>z});var r=t(6252),s=t(7656),i=t(7188),d=t(6110),l=t(3301),n=t(4693),o=t(5824);const p=(0,r._)("h1",{id:"nodes",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#nodes","aria-hidden":"true"},"#"),(0,r.Uk)(" Nodes")],-1),h=(0,r._)("p",null,"Here is an overview of the nodes, and links to detailed descriptions for eah of them.",-1),f={id:"power-saver",tabindex:"-1"},c=(0,r._)("a",{class:"header-anchor",href:"#power-saver","aria-hidden":"true"},"#",-1),g=(0,r.Uk)(),v=(0,r._)("a",{href:"./power-saver"},"Power Saver",-1),u=(0,r.Uk)(),_=(0,r._)("p",null,[(0,r._)("img",{src:s,alt:"Power Saver node"})],-1),y=(0,r._)("p",null,"The old node from version 2 is still working, but should be replaced.",-1),b=(0,r._)("h2",{id:"strategy-nodes",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#strategy-nodes","aria-hidden":"true"},"#"),(0,r.Uk)(" Strategy nodes")],-1),w=(0,r._)("p",null,"These are the nodes used to calculate and control saving.",-1),m=(0,r._)("h3",{id:"ps-strategy-best-save",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-strategy-best-save","aria-hidden":"true"},"#"),(0,r.Uk)(),(0,r._)("a",{href:"./ps-strategy-best-save"},"ps-strategy-best-save")],-1),x=(0,r._)("p",null,[(0,r._)("img",{src:i,alt:"ps-strategy-best-save"})],-1),k=(0,r._)("p",null,"Strategy to find the best hours to turn off for most saving.",-1),U=(0,r._)("h3",{id:"ps-strategy-lowest-price",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-strategy-lowest-price","aria-hidden":"true"},"#"),(0,r.Uk)(),(0,r._)("a",{href:"./ps-strategy-lowest-price"},"ps-strategy-lowest-price")],-1),S=(0,r._)("p",null,[(0,r._)("img",{src:d,alt:"ps-strategy-lowest-price"})],-1),P=(0,r._)("p",null,"Strategy to find the x hours with lowest price in a given period each day.",-1),E=(0,r._)("h2",{id:"utility-nodes",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#utility-nodes","aria-hidden":"true"},"#"),(0,r.Uk)(" Utility nodes")],-1),N=(0,r._)("h3",{id:"ps-receive-price",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-receive-price","aria-hidden":"true"},"#"),(0,r.Uk)(),(0,r._)("a",{href:"./ps-receive-price"},"ps-receive-price")],-1),T=(0,r._)("p",null,[(0,r._)("img",{src:l,alt:"ps-receive-price"})],-1),A=(0,r._)("p",null,"Node to convert different types of input data to the format used by the strategy nodes.",-1),O=(0,r._)("h2",{id:"grid-tariff-nodes",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#grid-tariff-nodes","aria-hidden":"true"},"#"),(0,r.Uk)(" Grid tariff nodes")],-1),C=(0,r._)("h3",{id:"ps-general-add-tariff",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-general-add-tariff","aria-hidden":"true"},"#"),(0,r.Uk)(),(0,r._)("a",{href:"./ps-general-add-tariff"},"ps-general-add-tariff")],-1),D=(0,r._)("p",null,[(0,r._)("img",{src:n,alt:"ps-general-add-tariff"})],-1),G=(0,r._)("p",null,"Node to add a variable grid tariff (or any value) to the prices before sending them to the strategy nodes.",-1),H=(0,r._)("h3",{id:"ps-elvia-add-tariff",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-elvia-add-tariff","aria-hidden":"true"},"#"),(0,r.Uk)(),(0,r._)("a",{href:"./ps-elvia-add-tariff"},"ps-elvia-add-tariff")],-1),I=(0,r._)("p",null,[(0,r._)("img",{src:o,alt:"ps-elvia-add-tariff"})],-1),R=(0,r._)("p",null,"Node to add Elvia grid tariff to the prices before sending them to the strategy nodes.",-1),Z=(0,r._)("h2",{id:"other-nodes",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#other-nodes","aria-hidden":"true"},"#"),(0,r.Uk)(" Other nodes")],-1),B=(0,r._)("p",null,"These are a couple of other nodes for using the Elvia API, but these are not important to the Power Saver, so they are not given any further documentation here.",-1),M=(0,r._)("h3",{id:"ps-elvia-tariff-types",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-elvia-tariff-types","aria-hidden":"true"},"#"),(0,r.Uk)(" ps-elvia-tariff-types")],-1),W=(0,r._)("p",null,"Use this to get a list of the tariff types available in the Elvia API.",-1),Y=(0,r._)("h3",{id:"ps-elvia-tariff",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#ps-elvia-tariff","aria-hidden":"true"},"#"),(0,r.Uk)(" ps-elvia-tariff")],-1),j=(0,r._)("p",null,"Use this to get the Elvia grid tariff for a selected tariff type.",-1),q={},z=(0,t(3744).Z)(q,[["render",function(e,a){const t=(0,r.up)("Badge");return(0,r.wg)(),(0,r.iD)(r.HY,null,[p,h,(0,r._)("h2",f,[c,g,v,u,(0,r.Wm)(t,{type:"warning",text:"deprecated",vertical:"middle"})]),_,y,b,w,m,x,k,U,S,P,E,N,T,A,O,C,D,G,H,I,R,Z,B,M,W,Y,j],64)}]])},3744:(e,a)=>{a.Z=(e,a)=>{const t=e.__vccOpts||e;for(const[e,r]of a)t[e]=r;return t}},7656:(e,a,t)=>{e.exports=t.p+"assets/img/node-power-saver.51ff2e5d.png"},5824:(e,a,t)=>{e.exports=t.p+"assets/img/node-ps-elvia-add-tariff.94ea2b09.png"},4693:(e,a,t)=>{e.exports=t.p+"assets/img/node-ps-general-add-tariff.a3cf6f06.png"},3301:(e,a,t)=>{e.exports=t.p+"assets/img/node-ps-receive-price.76eaa418.png"},7188:(e,a,t)=>{e.exports=t.p+"assets/img/node-ps-strategy-best-save.392292d5.png"},6110:(e,a,t)=>{e.exports=t.p+"assets/img/node-ps-strategy-lowest-price.3a4ad347.png"}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknode_red_contrib_power_saver=self.webpackChunknode_red_contrib_power_saver||[]).push([[807],{9570:(e,t,n)=>{n.r(t),n.d(t,{data:()=>r});const r={key:"v-fffb8e28",path:"/guide/",title:"Guide",lang:"en-US",frontmatter:{sidebar:"auto"},excerpt:"",headers:[{level:2,title:"Introduction",slug:"introduction",children:[]},{level:2,title:"Getting started",slug:"getting-started",children:[{level:3,title:"Installation",slug:"installation",children:[]},{level:3,title:"Get price data",slug:"get-price-data",children:[]},{level:3,title:"Add grid tariff",slug:"add-grid-tariff",children:[]},{level:3,title:"Calculate and run schedule",slug:"calculate-and-run-schedule",children:[]},{level:3,title:"Use schedule signals",slug:"use-schedule-signals",children:[]},{level:3,title:"Display schedule",slug:"display-schedule",children:[]},{level:3,title:"More information",slug:"more-information",children:[]}]},{level:2,title:"Migration from v2",slug:"migration-from-v2",children:[]}],filePathRelative:"guide/README.md",git:{updatedTime:1641408133e3}}},2163:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ze});var r=n(6252),l=n(1321),a=n(3405),s=n(1758);const o=(0,r._)("h1",{id:"guide",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#guide","aria-hidden":"true"},"#"),(0,r.Uk)(" Guide")],-1),i=(0,r._)("h2",{id:"introduction",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#introduction","aria-hidden":"true"},"#"),(0,r.Uk)(" Introduction")],-1),d=(0,r.Uk)("This is a collection of nodes for the popular "),u={href:"https://nodered.org/",target:"_blank",rel:"noopener noreferrer"},c=(0,r.Uk)("Node-RED"),h=(0,r.Uk)(" that you can use to save money on variable electricity prices. Node-RED is a widely used low-code programming tool that can be used together with many smart home solutions to create automations."),p=(0,r._)("p",null,[(0,r.Uk)("The solution can be used to control switches or other entities in a smart home system, and for example turn on when the price is low, and turn off when the price is high. There are different ways to calculate what hours to turn on and off, and these are implemented as "),(0,r._)("strong",null,"strategies nodes"),(0,r.Uk)(". Each strategy node can be configured to fit different purposes.")],-1),_=(0,r._)("p",null,"The strategies need price data to work. These can be received from different sources, for example Tibber, Nord Pool or custom sources.",-1),b=(0,r._)("div",{class:"custom-container warning"},[(0,r._)("p",{class:"custom-container-title"},"Price sources"),(0,r._)("p",null,"Tibber and Nord Pool are only available in the nordics, so if you live outside the nordics, you must find another source of price data, and make your own input.")],-1),m=(0,r._)("p",null,[(0,r.Uk)("Grid tariff is normally not part of the electricity price, so if this varies by the hour, it must be added before sent to the strategy nodes for calculation. This can be done by putting a "),(0,r._)("code",null,"ps-xxx-add-tariff"),(0,r.Uk)(" node between the price receiver and the strategy.")],-1),f=(0,r._)("p",null,'The strategy nodes have 3 outputs. Output 1 is used to "turn on", output 2 is used to "turn off", and on output 3, the calculated schedule and some other information is sent. You can use this to make graphs, or just send it to a debug node to view it.',-1),g=(0,r._)("p",null,"Example:",-1),v=(0,r._)("p",null,[(0,r._)("img",{src:l,alt:"Example flow"})],-1),k=(0,r._)("p",null,[(0,r.Uk)("Here prices are received from Tibber, converted in the "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node, then grid tariff for Elvia is added before sent to the "),(0,r._)("code",null,"ps-strategy-best-save"),(0,r.Uk)(" node. Output is sent to Home Assistant via two "),(0,r._)("code",null,"call-service"),(0,r.Uk)(" nodes, and the schedule is sent to a debug node.")],-1),y=(0,r._)("div",{class:"custom-container tip"},[(0,r._)("p",{class:"custom-container-title"},"Home Assistant"),(0,r._)("p",null,"The node collection fits very well with Home Assistant (HA), as Node-RED is frequently used for automations, and there also is an integration with Nord Pool, but there is no direct dependency to HA, so all nodes can be used also without HA.")],-1),w=(0,r._)("h2",{id:"getting-started",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#getting-started","aria-hidden":"true"},"#"),(0,r.Uk)(" Getting started")],-1),U=(0,r._)("h3",{id:"installation",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#installation","aria-hidden":"true"},"#"),(0,r.Uk)(" Installation")],-1),x=(0,r._)("p",null,"Install in Node-RED via the Manage Palette menu.",-1),T=(0,r._)("p",null,"May also be installed via npm:",-1),A=(0,r._)("p",null,[(0,r._)("code",null,"npm install node-red-contrib-power-saver")],-1),S=(0,r._)("p",null,[(0,r.Uk)("Make sure that you upgrade now and then to get the latest version. See "),(0,r._)("a",{href:"CHANGELOG"},"changelog"),(0,r.Uk)(" for changes.")],-1),q=(0,r._)("h3",{id:"get-price-data",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#get-price-data","aria-hidden":"true"},"#"),(0,r.Uk)(" Get price data")],-1),N=(0,r._)("p",null,"This solution is useless without price data. In the nordics, there are at least two very common places to get price data from:",-1),E=(0,r._)("ul",null,[(0,r._)("li",null,"Tibber"),(0,r._)("li",null,"Nord Pool")],-1),P=(0,r._)("p",null,[(0,r.Uk)("The "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node is designed to handle price input from both these, and convert it to the format required by the strategy nodes.")],-1),W=(0,r.Uk)("If you are a Tibber customer, use the "),H=(0,r._)("code",null,"tibber-query",-1),I=(0,r.Uk)(" node from the "),M={href:"https://flows.nodered.org/node/node-red-contrib-tibber-api",target:"_blank",rel:"noopener noreferrer"},G=(0,r.Uk)("Tibber API"),C=(0,r.Uk)(" to receive price, with one of the following queries:"),D=(0,r._)("div",{class:"language-gql ext-gql line-numbers-mode"},[(0,r._)("pre",{class:"language-gql"},[(0,r._)("code",null,"{\n viewer {\n homes {\n id\n address {\n address1\n address2\n address3\n postalCode\n city\n country\n }\n }\n }\n}\n")]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"3"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"4"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"5"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"6"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"7"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"8"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"9"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"10"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"11"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"12"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"13"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"14"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"15"),(0,r._)("br")])],-1),O=(0,r._)("div",{class:"language-gql ext-gql line-numbers-mode"},[(0,r._)("pre",{class:"language-gql"},[(0,r._)("code",null,'{\n viewer {\n home(id: "142c1670-ab43-2ab3-ba6d-723703a551e2") {\n currentSubscription{\n priceInfo{\n today {\n total\n energy\n tax\n startsAt\n }\n tomorrow {\n total\n energy\n tax\n startsAt\n }\n }\n }\n }\n }\n}\n')]),(0,r._)("div",{class:"highlight-lines"},[(0,r._)("br"),(0,r._)("br"),(0,r._)("div",{class:"highlight-line"}," "),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br"),(0,r._)("br")]),(0,r._)("div",{class:"line-numbers"},[(0,r._)("span",{class:"line-number"},"1"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"2"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"3"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"4"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"5"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"6"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"7"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"8"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"9"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"10"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"11"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"12"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"13"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"14"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"15"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"16"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"17"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"18"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"19"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"20"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"21"),(0,r._)("br"),(0,r._)("span",{class:"line-number"},"22"),(0,r._)("br")])],-1),R=(0,r._)("p",null,[(0,r.Uk)("See more details in the "),(0,r._)("a",{href:"../nodes/ps-receive-price#tibber-input"},"documentation"),(0,r.Uk)(" for the "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node.")],-1),Y=(0,r.Uk)("Se documentation for "),L={href:"https://flows.nodered.org/node/node-red-contrib-tibber-api",target:"_blank",rel:"noopener noreferrer"},j=(0,r.Uk)("node-red-contrib-tibber-api"),B=(0,r.Uk)(" for details about the Tibber query."),Z=(0,r._)("div",{class:"custom-container tip"},[(0,r._)("p",{class:"custom-container-title"},"Tibber query"),(0,r._)("p",null,[(0,r.Uk)("You can use an "),(0,r._)("code",null,"inject"),(0,r.Uk)(" node (standard Node-RED) to send the Tibber query as a text string int to the "),(0,r._)("code",null,"tibber-query"),(0,r.Uk)(" node. This can be set to repeat the query for example every hour.")])],-1),F=(0,r.Uk)("See example of Tibber flow and mqtt"),z=(0,r.Uk)("If you use Home Assistant (HA), you can install the "),J={href:"https://github.com/custom-components/nordpool",target:"_blank",rel:"noopener noreferrer"},K=(0,r.Uk)("Nord Pool custom component"),Q=(0,r.Uk)(", that provides a "),V=(0,r._)("em",null,"sensor",-1),X=(0,r.Uk)(" that gives price per hour for today and tomorrow. Data can be sent from both the "),$=(0,r._)("code",null,"current state",-1),ee=(0,r.Uk)(" node or the "),te=(0,r._)("code",null,"events: state",-1),ne=(0,r.Uk)(" node."),re=(0,r.Uk)("See example with Nord Pool and "),le=(0,r._)("code",null,"current state",-1),ae=(0,r.Uk)(" node"),se=(0,r.Uk)("See example with Nord Pool and "),oe=(0,r._)("code",null,"events: state",-1),ie=(0,r.Uk)(" node"),de=(0,r._)("h3",{id:"add-grid-tariff",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#add-grid-tariff","aria-hidden":"true"},"#"),(0,r.Uk)(" Add grid tariff")],-1),ue=(0,r._)("p",null,"When also the grid tariff changes per hour, it must be added to the electricity price in order to get the calculations right.",-1),ce=(0,r._)("p",null,[(0,r.Uk)("After the the "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node, add a "),(0,r._)("code",null,"ps-xxx-add-tariff"),(0,r.Uk)(" node to add grid tariff. What node to choose depends on what grid you get electricity through. The following grids are supported:")],-1),he=(0,r._)("table",null,[(0,r._)("thead",null,[(0,r._)("tr",null,[(0,r._)("th",null,"Grid supplier"),(0,r._)("th",null,"Node")])]),(0,r._)("tbody",null,[(0,r._)("tr",null,[(0,r._)("td",null,"General (any)"),(0,r._)("td",null,[(0,r._)("code",null,"ps-general-add-tariff")])]),(0,r._)("tr",null,[(0,r._)("td",null,"Elvia"),(0,r._)("td",null,[(0,r._)("code",null,"ps-elvia-add-tariff")])])])],-1),pe=(0,r._)("p",null,"If your grid is not supported, you may code this yourself.",-1),_e=(0,r._)("div",{class:"custom-container tip"},[(0,r._)("p",{class:"custom-container-title"},"Skip this step"),(0,r._)("p",null,"If the grid tariff is the same the whole day, you can skip this step i the flow.")],-1),be=(0,r._)("h3",{id:"calculate-and-run-schedule",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#calculate-and-run-schedule","aria-hidden":"true"},"#"),(0,r.Uk)(" Calculate and run schedule")],-1),me=(0,r._)("p",null,"This is the step where the value is produced. Based on the prices received, the optimal schedule for you is calculated automatically, based on your configuration. You can choose between the following strategies:",-1),fe=(0,r._)("table",null,[(0,r._)("thead",null,[(0,r._)("tr",null,[(0,r._)("th",null,"Strategy"),(0,r._)("th",null,"Node"),(0,r._)("th",null,"Description")])]),(0,r._)("tbody",null,[(0,r._)("tr",null,[(0,r._)("td",null,"Best save"),(0,r._)("td",null,[(0,r._)("code",null,"ps-strategy-best-save")]),(0,r._)("td",null,"Postpone power consumption when there is most to save.")]),(0,r._)("tr",null,[(0,r._)("td",null,"Lowest price"),(0,r._)("td",null,[(0,r._)("code",null,"ps--strategy-lowest-price")]),(0,r._)("td",null,"Turn on power when the prices are the lowest in a given period.")])])],-1),ge=(0,r._)("p",null,"These nodes must be configured for your purpose. See configuration description and other details in the documentation for each node.",-1),ve=(0,r._)("p",null,[(0,r.Uk)("Send the result from the "),(0,r._)("code",null,"ps-xxx-add-tariff"),(0,r.Uk)(" node (or the "),(0,r._)("code",null,"ps-receive-price"),(0,r.Uk)(" node) as input to the strategy node you choose.")],-1),ke=(0,r._)("div",{class:"custom-container tip"},[(0,r._)("p",{class:"custom-container-title"},"Choose strategy"),(0,r._)("p",null,"Choose the best save strategy if you can postpone power consumption, and expect the consumption to occur during the first hour after power is turned on again."),(0,r._)("p",null,"Choose the lowest price strategy if you need the power to be on for x hours, but it is not important when that is. Note that you can select to have all hours on in one consecutive period, or spread around on the cheapest hours.")],-1),ye=(0,r._)("h3",{id:"use-schedule-signals",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#use-schedule-signals","aria-hidden":"true"},"#"),(0,r.Uk)(" Use schedule signals")],-1),we=(0,r._)("p",null,"Use the outputs to control switches, thermostats or other entities to control your power consumers.",-1),Ue=(0,r._)("p",null,[(0,r._)("strong",null,"Output 1"),(0,r.Uk)(" is used to turn on. A payload with value "),(0,r._)("code",null,"true"),(0,r.Uk)(" is sent every time turning on is scheduled.")],-1),xe=(0,r._)("p",null,[(0,r._)("strong",null,"Output 2"),(0,r.Uk)(" is used to turn off. A payload with value "),(0,r._)("code",null,"false"),(0,r.Uk)(" is sent every time turning off is scheduled.")],-1),Te=(0,r._)("p",null,"Example using Home Assistant:",-1),Ae=(0,r._)("p",null,[(0,r._)("img",{src:a,alt:"Example flow"})],-1),Se=(0,r._)("div",{class:"custom-container tip"},[(0,r._)("p",{class:"custom-container-title"},"Use output"),(0,r._)("p",null,"There are many ways you can use the output:"),(0,r._)("ul",null,[(0,r._)("li",null,"Turn on/off a switch"),(0,r._)("li",null,"Set a thermostat up, down or to specific values"),(0,r._)("li",null,"Change setting of a dimmer"),(0,r._)("li",null,"Send a notification")])],-1),qe=(0,r._)("h3",{id:"display-schedule",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#display-schedule","aria-hidden":"true"},"#"),(0,r.Uk)(" Display schedule")],-1),Ne=(0,r._)("p",null,[(0,r._)("strong",null,"Output 3"),(0,r.Uk)(" can be used to print or display the calculated schedule. If you just want to see it, send it to a debug node. You can also use it to display the result as graphs in HA.")],-1),Ee=(0,r._)("p",null,[(0,r.Uk)("For users of Magic Mirror and Tibber, the "),(0,r._)("code",null,"ps-best-save"),(0,r.Uk)(" node can send its schedule to the MMM-Tibber module. See more details in the "),(0,r._)("code",null,"ps-best-save"),(0,r.Uk)(" node documentation.")],-1),Pe=(0,r._)("h3",{id:"more-information",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#more-information","aria-hidden":"true"},"#"),(0,r.Uk)(" More information")],-1),We=(0,r.Uk)("There are more details and more information in the documentation for each "),He={href:"/nodes/",target:"_blank",rel:"noopener noreferrer"},Ie=(0,r.Uk)("node"),Me=(0,r.Uk)(" and in the "),Ge={href:"/examples/",target:"_blank",rel:"noopener noreferrer"},Ce=(0,r.Uk)("examples"),De=(0,r.Uk)("."),Oe=(0,r._)("h2",{id:"migration-from-v2",tabindex:"-1"},[(0,r._)("a",{class:"header-anchor",href:"#migration-from-v2","aria-hidden":"true"},"#"),(0,r.Uk)(" Migration from v2")],-1),Re=(0,r._)("p",null,[(0,r.Uk)("The "),(0,r._)("code",null,"Power Saver"),(0,r.Uk)(" node from v2 is still here, and it is working exactly as before. However, it will not be further maintained, so you should replace it. You may directly replace the "),(0,r._)("code",null,"Power Saver"),(0,r.Uk)(" node by two of the new nodes:")],-1),Ye=(0,r._)("p",null,[(0,r._)("img",{src:s,alt:"Migrate Power Saver"})],-1),Le=(0,r.Uk)("See more details in the "),je=(0,r.Uk)("documentation for the "),Be=(0,r._)("code",null,"ps-strategy-best-save",-1),Ze=(0,r.Uk)(" node."),Fe={},ze=(0,n(3744).Z)(Fe,[["render",function(e,t){const n=(0,r.up)("OutboundLink"),l=(0,r.up)("CodeGroupItem"),a=(0,r.up)("CodeGroup"),s=(0,r.up)("RouterLink");return(0,r.wg)(),(0,r.iD)(r.HY,null,[o,i,(0,r._)("p",null,[d,(0,r._)("a",u,[c,(0,r.Wm)(n)]),h]),p,_,b,m,f,g,v,k,y,w,U,x,T,A,S,q,N,E,P,(0,r._)("p",null,[W,H,I,(0,r._)("a",M,[G,(0,r.Wm)(n)]),C]),(0,r.Wm)(a,null,{default:(0,r.w5)((()=>[(0,r.Wm)(l,{title:"All homes"},{default:(0,r.w5)((()=>[D])),_:1}),(0,r.Wm)(l,{title:"Single home",active:""},{default:(0,r.w5)((()=>[O])),_:1})])),_:1}),R,(0,r._)("p",null,[Y,(0,r._)("a",L,[j,(0,r.Wm)(n)]),B]),Z,(0,r._)("p",null,[(0,r.Wm)(s,{to:"/examples/example-tibber-mqtt.html"},{default:(0,r.w5)((()=>[F])),_:1})]),(0,r._)("p",null,[z,(0,r._)("a",J,[K,(0,r.Wm)(n)]),Q,V,X,$,ee,te,ne]),(0,r._)("p",null,[(0,r.Wm)(s,{to:"/examples/example-nordpool-current-state.html"},{default:(0,r.w5)((()=>[re,le,ae])),_:1})]),(0,r._)("p",null,[(0,r.Wm)(s,{to:"/examples/example-nordpool-events-state.html"},{default:(0,r.w5)((()=>[se,oe,ie])),_:1})]),de,ue,ce,he,pe,_e,be,me,fe,ge,ve,ke,ye,we,Ue,xe,Te,Ae,Se,qe,Ne,Ee,Pe,(0,r._)("p",null,[We,(0,r._)("a",He,[Ie,(0,r.Wm)(n)]),Me,(0,r._)("a",Ge,[Ce,(0,r.Wm)(n)]),De]),Oe,Re,Ye,(0,r._)("p",null,[Le,(0,r.Wm)(s,{to:"/nodes/ps-strategy-best-save.html"},{default:(0,r.w5)((()=>[je,Be])),_:1}),Ze])],64)}]])},3744:(e,t)=>{t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},1321:(e,t,n)=>{e.exports=n.p+"assets/img/example-flow-1.3ff3e23f.png"},3405:(e,t,n)=>{e.exports=n.p+"assets/img/example-flow-2.b653b58d.png"},1758:(e,t,n)=>{e.exports=n.p+"assets/img/migrate-best-save.f73420f6.png"}}]);
@@ -1,302 +0,0 @@
1
- module.exports = {
2
- schedule: [],
3
- hours: [
4
- {
5
- price: 0.2494,
6
- onOff: false,
7
- start: "2021-06-20T01:50:00.000+02:00",
8
- saving: 0.0395,
9
- },
10
- {
11
- price: 0.2209,
12
- onOff: false,
13
- start: "2021-06-20T01:50:00.010+02:00",
14
- saving: 0.011,
15
- },
16
- {
17
- price: 0.2099,
18
- onOff: true,
19
- start: "2021-06-20T01:50:00.020+02:00",
20
- saving: null,
21
- },
22
- {
23
- price: 0.219,
24
- onOff: true,
25
- start: "2021-06-20T01:50:00.030+02:00",
26
- saving: null,
27
- },
28
- {
29
- price: 0.2614,
30
- onOff: true,
31
- start: "2021-06-20T01:50:00.040+02:00",
32
- saving: null,
33
- },
34
- {
35
- price: 0.4426,
36
- onOff: true,
37
- start: "2021-06-20T01:50:00.050+02:00",
38
- saving: null,
39
- },
40
- {
41
- price: 0.5433,
42
- onOff: true,
43
- start: "2021-06-20T01:50:00.060+02:00",
44
- saving: null,
45
- },
46
- {
47
- price: 0.5667,
48
- onOff: true,
49
- start: "2021-06-20T01:50:00.070+02:00",
50
- saving: null,
51
- },
52
- {
53
- price: 0.5847,
54
- onOff: true,
55
- start: "2021-06-20T01:50:00.080+02:00",
56
- saving: null,
57
- },
58
- {
59
- price: 0.5762,
60
- onOff: true,
61
- start: "2021-06-20T01:50:00.090+02:00",
62
- saving: null,
63
- },
64
- {
65
- price: 0.5391,
66
- onOff: true,
67
- start: "2021-06-20T01:50:00.100+02:00",
68
- saving: null,
69
- },
70
- {
71
- price: 0.5124,
72
- onOff: true,
73
- start: "2021-06-20T01:50:00.110+02:00",
74
- saving: null,
75
- },
76
- {
77
- price: 0.504,
78
- onOff: true,
79
- start: "2021-06-20T01:50:00.120+02:00",
80
- saving: null,
81
- },
82
- {
83
- price: 0.5057,
84
- onOff: true,
85
- start: "2021-06-20T01:50:00.130+02:00",
86
- saving: null,
87
- },
88
- {
89
- price: 0.5066,
90
- onOff: true,
91
- start: "2021-06-20T01:50:00.140+02:00",
92
- saving: null,
93
- },
94
- {
95
- price: 0.5136,
96
- onOff: true,
97
- start: "2021-06-20T01:50:00.150+02:00",
98
- saving: null,
99
- },
100
- {
101
- price: 0.5143,
102
- onOff: true,
103
- start: "2021-06-20T01:50:00.160+02:00",
104
- saving: null,
105
- },
106
- {
107
- price: 0.5306,
108
- onOff: true,
109
- start: "2021-06-20T01:50:00.170+02:00",
110
- saving: null,
111
- },
112
- {
113
- price: 0.5534,
114
- onOff: true,
115
- start: "2021-06-20T01:50:00.180+02:00",
116
- saving: null,
117
- },
118
- {
119
- price: 0.5511,
120
- onOff: true,
121
- start: "2021-06-20T01:50:00.190+02:00",
122
- saving: null,
123
- },
124
- {
125
- price: 0.5491,
126
- onOff: true,
127
- start: "2021-06-20T01:50:00.200+02:00",
128
- saving: null,
129
- },
130
- {
131
- price: 0.5485,
132
- onOff: true,
133
- start: "2021-06-20T01:50:00.210+02:00",
134
- saving: null,
135
- },
136
- {
137
- price: 0.5481,
138
- onOff: true,
139
- start: "2021-06-20T01:50:00.220+02:00",
140
- saving: null,
141
- },
142
- {
143
- price: 0.5218,
144
- onOff: true,
145
- start: "2021-06-20T01:50:00.230+02:00",
146
- saving: null,
147
- },
148
- {
149
- price: 0.4533,
150
- onOff: true,
151
- start: "2021-06-20T01:50:00.240+02:00",
152
- saving: null,
153
- },
154
- {
155
- price: 0.4196,
156
- onOff: true,
157
- start: "2021-06-20T01:50:00.250+02:00",
158
- saving: null,
159
- },
160
- {
161
- price: 0.4037,
162
- onOff: true,
163
- start: "2021-06-20T01:50:00.260+02:00",
164
- saving: null,
165
- },
166
- {
167
- price: 0.3829,
168
- onOff: true,
169
- start: "2021-06-20T01:50:00.270+02:00",
170
- saving: null,
171
- },
172
- {
173
- price: 0.4555,
174
- onOff: true,
175
- start: "2021-06-20T01:50:00.280+02:00",
176
- saving: null,
177
- },
178
- {
179
- price: 0.4721,
180
- onOff: true,
181
- start: "2021-06-20T01:50:00.290+02:00",
182
- saving: null,
183
- },
184
- {
185
- price: 0.4903,
186
- onOff: true,
187
- start: "2021-06-20T01:50:00.300+02:00",
188
- saving: null,
189
- },
190
- {
191
- price: 0.5028,
192
- onOff: true,
193
- start: "2021-06-20T01:50:00.310+02:00",
194
- saving: null,
195
- },
196
- {
197
- price: 0.5163,
198
- onOff: true,
199
- start: "2021-06-20T01:50:00.320+02:00",
200
- saving: null,
201
- },
202
- {
203
- price: 0.5264,
204
- onOff: true,
205
- start: "2021-06-20T01:50:00.330+02:00",
206
- saving: null,
207
- },
208
- {
209
- price: 0.5346,
210
- onOff: true,
211
- start: "2021-06-20T01:50:00.340+02:00",
212
- saving: null,
213
- },
214
- {
215
- price: 0.5224,
216
- onOff: true,
217
- start: "2021-06-20T01:50:00.350+02:00",
218
- saving: null,
219
- },
220
- {
221
- price: 0.5071,
222
- onOff: true,
223
- start: "2021-06-20T01:50:00.360+02:00",
224
- saving: null,
225
- },
226
- {
227
- price: 0.5045,
228
- onOff: true,
229
- start: "2021-06-20T01:50:00.370+02:00",
230
- saving: null,
231
- },
232
- {
233
- price: 0.5024,
234
- onOff: true,
235
- start: "2021-06-20T01:50:00.380+02:00",
236
- saving: null,
237
- },
238
- {
239
- price: 0.5038,
240
- onOff: true,
241
- start: "2021-06-20T01:50:00.390+02:00",
242
- saving: null,
243
- },
244
- {
245
- price: 0.5118,
246
- onOff: true,
247
- start: "2021-06-20T01:50:00.400+02:00",
248
- saving: null,
249
- },
250
- {
251
- price: 0.5111,
252
- onOff: true,
253
- start: "2021-06-20T01:50:00.410+02:00",
254
- saving: null,
255
- },
256
- {
257
- price: 0.5108,
258
- onOff: true,
259
- start: "2021-06-20T01:50:00.420+02:00",
260
- saving: null,
261
- },
262
- {
263
- price: 0.5055,
264
- onOff: true,
265
- start: "2021-06-20T01:50:00.430+02:00",
266
- saving: null,
267
- },
268
- {
269
- price: 0.5042,
270
- onOff: true,
271
- start: "2021-06-20T01:50:00.440+02:00",
272
- saving: null,
273
- },
274
- {
275
- price: 0.5259,
276
- onOff: true,
277
- start: "2021-06-20T01:50:00.450+02:00",
278
- saving: null,
279
- },
280
- {
281
- price: 0.5282,
282
- onOff: true,
283
- start: "2021-06-20T01:50:00.460+02:00",
284
- saving: null,
285
- },
286
- {
287
- price: 0.5252,
288
- onOff: true,
289
- start: "2021-06-20T01:50:00.470+02:00",
290
- saving: null,
291
- },
292
- ],
293
- source: undefined,
294
- config: {
295
- maxHoursToSaveInSequence: 5,
296
- minHoursOnAfterMaxSequenceSaved: 2,
297
- minSaving: 0.25,
298
- sendCurrentValueWhenRescheduling: undefined,
299
- outputIfNoSchedule: false,
300
- scheduleOnlyFromCurrentTime: true,
301
- },
302
- };
@@ -1,154 +0,0 @@
1
- module.exports = {
2
- schedule: [
3
- {
4
- time: "2021-06-20T01:50:00.080+02:00",
5
- value: true,
6
- },
7
- {
8
- time: "2021-06-20T01:50:00.100+02:00",
9
- value: false,
10
- },
11
- {
12
- time: "2021-06-20T01:50:00.120+02:00",
13
- value: true,
14
- },
15
- {
16
- time: "2021-06-20T01:50:00.130+02:00",
17
- value: false,
18
- },
19
- {
20
- time: "2021-06-20T01:50:00.180+02:00",
21
- value: true,
22
- },
23
- ],
24
- hours: [
25
- {
26
- price: 0.3,
27
- onOff: true,
28
- start: "2021-06-20T01:50:00.000+02:00",
29
- saving: null,
30
- },
31
- {
32
- price: 0.4,
33
- onOff: true,
34
- start: "2021-06-20T01:50:00.010+02:00",
35
- saving: null,
36
- },
37
- {
38
- price: 0.8,
39
- onOff: true,
40
- start: "2021-06-20T01:50:00.020+02:00",
41
- saving: null,
42
- },
43
- {
44
- price: 0.9,
45
- onOff: false,
46
- start: "2021-06-20T01:50:00.030+02:00",
47
- saving: 0.7,
48
- },
49
- {
50
- price: 0.7,
51
- onOff: false,
52
- start: "2021-06-20T01:50:00.040+02:00",
53
- saving: 0.5,
54
- },
55
- {
56
- price: 0.6,
57
- onOff: false,
58
- start: "2021-06-20T01:50:00.050+02:00",
59
- saving: 0.4,
60
- },
61
- {
62
- price: 0.5,
63
- onOff: false,
64
- start: "2021-06-20T01:50:00.060+02:00",
65
- saving: 0.3,
66
- },
67
- {
68
- price: 0.75,
69
- onOff: false,
70
- start: "2021-06-20T01:50:00.070+02:00",
71
- saving: 0.55,
72
- },
73
- {
74
- price: 0.2,
75
- onOff: true,
76
- start: "2021-06-20T01:50:00.080+02:00",
77
- saving: null,
78
- },
79
- {
80
- price: 0.85,
81
- onOff: true,
82
- start: "2021-06-20T01:50:00.090+02:00",
83
- saving: null,
84
- },
85
- {
86
- price: 1.5,
87
- onOff: false,
88
- start: "2021-06-20T01:50:00.100+02:00",
89
- saving: 0.7,
90
- },
91
- {
92
- price: 1.4,
93
- onOff: false,
94
- start: "2021-06-20T01:50:00.110+02:00",
95
- saving: 0.6,
96
- },
97
- {
98
- price: 0.8,
99
- onOff: true,
100
- start: "2021-06-20T01:50:00.120+02:00",
101
- saving: null,
102
- },
103
- {
104
- price: 0.9,
105
- onOff: false,
106
- start: "2021-06-20T01:50:00.130+02:00",
107
- saving: 0.7,
108
- },
109
- {
110
- price: 0.7,
111
- onOff: false,
112
- start: "2021-06-20T01:50:00.140+02:00",
113
- saving: 0.5,
114
- },
115
- {
116
- price: 0.6,
117
- onOff: false,
118
- start: "2021-06-20T01:50:00.150+02:00",
119
- saving: 0.4,
120
- },
121
- {
122
- price: 0.5,
123
- onOff: false,
124
- start: "2021-06-20T01:50:00.160+02:00",
125
- saving: 0.3,
126
- },
127
- {
128
- price: 0.75,
129
- onOff: false,
130
- start: "2021-06-20T01:50:00.170+02:00",
131
- saving: 0.55,
132
- },
133
- {
134
- price: 0.2,
135
- onOff: true,
136
- start: "2021-06-20T01:50:00.180+02:00",
137
- saving: null,
138
- },
139
- {
140
- price: 0.85,
141
- onOff: true,
142
- start: "2021-06-20T01:50:00.190+02:00",
143
- saving: null,
144
- },
145
- ],
146
- source: "Other",
147
- config: {
148
- maxHoursToSaveInSequence: 5,
149
- minHoursOnAfterMaxSequenceSaved: 2,
150
- minSaving: 0.25,
151
- outputIfNoSchedule: false,
152
- scheduleOnlyFromCurrentTime: true,
153
- },
154
- };