node-red-contrib-power-saver 3.0.0 → 3.0.4

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 (76) hide show
  1. package/.github/FUNDING.yml +12 -0
  2. package/docs/.vuepress/dist/404.html +3 -3
  3. package/docs/.vuepress/dist/assets/js/app.6191e356.js +1 -0
  4. package/docs/.vuepress/dist/assets/js/runtime~app.62fa6694.js +1 -0
  5. package/docs/.vuepress/dist/assets/js/v-08683c60.07fe8291.js +1 -0
  6. package/docs/.vuepress/dist/assets/js/v-0aca7ba6.aec5ba75.js +1 -0
  7. package/docs/.vuepress/dist/assets/js/v-0b5e3c8c.d008d8bc.js +1 -0
  8. package/docs/.vuepress/dist/assets/js/v-1ad821fa.85407071.js +1 -0
  9. package/docs/.vuepress/dist/assets/js/v-30acb564.73b8e29f.js +1 -0
  10. package/docs/.vuepress/dist/assets/js/v-4637f9e4.22ab9413.js +1 -0
  11. package/docs/.vuepress/dist/assets/js/v-510ed0d4.481e9be8.js +1 -0
  12. package/docs/.vuepress/dist/assets/js/v-5954bcb2.be07962c.js +1 -0
  13. package/docs/.vuepress/dist/assets/js/v-5db8da3a.ac192f35.js +1 -0
  14. package/docs/.vuepress/dist/assets/js/v-61f728ca.802ab15e.js +1 -0
  15. package/docs/.vuepress/dist/assets/js/v-677dfaed.9bbbd037.js +1 -0
  16. package/docs/.vuepress/dist/assets/js/v-7c87f26e.457a1a60.js +1 -0
  17. package/docs/.vuepress/dist/assets/js/{v-8daa1a0e.1ea39527.js → v-8daa1a0e.db8b59c6.js} +1 -1
  18. package/docs/.vuepress/dist/assets/js/v-b4a42144.6e0c5aa0.js +1 -0
  19. package/docs/.vuepress/dist/assets/js/v-e8c55052.5f85b6cd.js +1 -0
  20. package/docs/.vuepress/dist/assets/js/v-fffb8e28.e815e852.js +1 -0
  21. package/docs/.vuepress/dist/changelog/index.html +3 -3
  22. package/docs/.vuepress/dist/contribute/index.html +3 -3
  23. package/docs/.vuepress/dist/examples/example-nordpool-current-state.html +3 -3
  24. package/docs/.vuepress/dist/examples/example-nordpool-events-state.html +3 -3
  25. package/docs/.vuepress/dist/examples/example-tibber-mqtt.html +3 -3
  26. package/docs/.vuepress/dist/examples/index.html +3 -3
  27. package/docs/.vuepress/dist/guide/index.html +3 -3
  28. package/docs/.vuepress/dist/index.html +2 -2
  29. package/docs/.vuepress/dist/nodes/index.html +3 -3
  30. package/docs/.vuepress/dist/nodes/old-power-saver-doc.html +3 -3
  31. package/docs/.vuepress/dist/nodes/power-saver.html +3 -3
  32. package/docs/.vuepress/dist/nodes/ps-elvia-add-tariff.html +3 -3
  33. package/docs/.vuepress/dist/nodes/ps-receive-price.html +3 -3
  34. package/docs/.vuepress/dist/nodes/ps-strategy-best-save.html +3 -3
  35. package/docs/.vuepress/dist/nodes/ps-strategy-lowest-price.html +3 -3
  36. package/docs/.vuepress/dist/nodes/strategy-input.html +3 -3
  37. package/docs/changelog/README.md +20 -0
  38. package/docs/contribute/README.md +1 -1
  39. package/docs/guide/README.md +10 -1
  40. package/package.json +1 -1
  41. package/src/elvia/elvia-config.html +3 -1
  42. package/src/elvia/elvia-config.js +7 -13
  43. package/src/elvia/elvia-tariff-types.js +8 -6
  44. package/src/elvia/elvia-tariff.js +1 -5
  45. package/src/handle-input.js +8 -5
  46. package/src/power-saver.html +8 -8
  47. package/src/receive-price-functions.js +14 -10
  48. package/src/receive-price.js +2 -2
  49. package/src/strategy-best-save.html +8 -8
  50. package/src/strategy-lowest-price.html +11 -11
  51. package/src/strategy-lowest-price.js +3 -3
  52. package/test/data/converted-prices.json +1 -0
  53. package/test/data/tibber-data-end-0-24h.json +197 -0
  54. package/test/data/tibber-data-end-0.json +101 -0
  55. package/test/data/tibber-result-end-0-24h.json +320 -0
  56. package/test/data/tibber-result-end-0.json +168 -0
  57. package/test/receive-price-functions.test.js +20 -0
  58. package/test/receive-price.test.js +4 -4
  59. package/test/strategy-lowest-price.test.js +200 -0
  60. package/docs/.vuepress/dist/assets/js/app.80d4373d.js +0 -1
  61. package/docs/.vuepress/dist/assets/js/runtime~app.665b411c.js +0 -1
  62. package/docs/.vuepress/dist/assets/js/v-08683c60.9edcaa60.js +0 -1
  63. package/docs/.vuepress/dist/assets/js/v-0aca7ba6.5eca5160.js +0 -1
  64. package/docs/.vuepress/dist/assets/js/v-0b5e3c8c.c02472fb.js +0 -1
  65. package/docs/.vuepress/dist/assets/js/v-1ad821fa.a628e907.js +0 -1
  66. package/docs/.vuepress/dist/assets/js/v-30acb564.80b4190d.js +0 -1
  67. package/docs/.vuepress/dist/assets/js/v-4637f9e4.df94c6ea.js +0 -1
  68. package/docs/.vuepress/dist/assets/js/v-510ed0d4.a78d8542.js +0 -1
  69. package/docs/.vuepress/dist/assets/js/v-5954bcb2.4f4712f3.js +0 -1
  70. package/docs/.vuepress/dist/assets/js/v-5db8da3a.2e49b81a.js +0 -1
  71. package/docs/.vuepress/dist/assets/js/v-61f728ca.7b545524.js +0 -1
  72. package/docs/.vuepress/dist/assets/js/v-677dfaed.756e0fb5.js +0 -1
  73. package/docs/.vuepress/dist/assets/js/v-7c87f26e.57507077.js +0 -1
  74. package/docs/.vuepress/dist/assets/js/v-b4a42144.a812c440.js +0 -1
  75. package/docs/.vuepress/dist/assets/js/v-e8c55052.30f30acd.js +0 -1
  76. package/docs/.vuepress/dist/assets/js/v-fffb8e28.850019c1.js +0 -1
@@ -5,17 +5,13 @@ module.exports = function (RED) {
5
5
  function PsElviaTariffNode(config) {
6
6
  RED.nodes.createNode(this, config);
7
7
  this.elviaConfig = RED.nodes.getNode(config.elviaConfig);
8
+ const key = this.elviaConfig.credentials.elviaSubscriptionKey;
8
9
  this.tariffKey = config.tariffKey;
9
10
  this.range = config.range;
10
11
  const node = this;
11
-
12
- const configList = node.context().global.get("elviaConfigList") || [];
13
- const key = configList.find((c) => c.id == node.elviaConfig.id)?.elviaSubscriptionKey;
14
12
  ping(node, key);
15
13
 
16
14
  node.on("input", function () {
17
- const configList = node.context().global.get("elviaConfigList") || [];
18
- const key = configList.find((c) => c.id == node.elviaConfig.id)?.elviaSubscriptionKey;
19
15
  getTariff(node, key, node.tariffKey, node.range).then((json) => {
20
16
  node.send([{ payload: json }]);
21
17
  });
@@ -37,7 +37,7 @@ function handleStrategyInput(node, msg, doPlanning) {
37
37
  payload: {
38
38
  schedule: plan.schedule,
39
39
  hours: plan.hours,
40
- source: priceData.source,
40
+ source: msg.payload.source,
41
41
  config: effectiveConfig,
42
42
  },
43
43
  };
@@ -45,7 +45,8 @@ function handleStrategyInput(node, msg, doPlanning) {
45
45
  // Find current output, and set output (if configured to do)
46
46
  const pastSchedule = plan.schedule.filter((entry) => DateTime.fromISO(entry.time) <= planFromTime);
47
47
 
48
- if (node.sendCurrentValueWhenRescheduling && pastSchedule.length > 0) {
48
+ const sendNow = node.sendCurrentValueWhenRescheduling && pastSchedule.length > 0;
49
+ if (sendNow) {
49
50
  const currentValue = pastSchedule[pastSchedule.length - 1].value;
50
51
  output1 = currentValue ? { payload: true } : null;
51
52
  output2 = currentValue ? null : { payload: false };
@@ -58,7 +59,7 @@ function handleStrategyInput(node, msg, doPlanning) {
58
59
  node.send([output1, output2, output3]);
59
60
 
60
61
  // Run schedule
61
- node.schedulingTimeout = runSchedule(node, plan.schedule, planFromTime);
62
+ node.schedulingTimeout = runSchedule(node, plan.schedule, planFromTime, sendNow);
62
63
  }
63
64
 
64
65
  function getPriceData(node, msg) {
@@ -71,7 +72,7 @@ function getPriceData(node, msg) {
71
72
  return priceData;
72
73
  }
73
74
 
74
- function runSchedule(node, schedule, time) {
75
+ function runSchedule(node, schedule, time, currentSent = false) {
75
76
  let currentTime = time;
76
77
  let remainingSchedule = schedule.filter((entry) => {
77
78
  return DateTime.fromISO(entry.time) > DateTime.fromISO(time);
@@ -94,7 +95,9 @@ function runSchedule(node, schedule, time) {
94
95
  const message = "No schedule";
95
96
  node.warn(message);
96
97
  node.status({ fill: "red", shape: "dot", text: message });
97
- sendSwitch(node, node.outputIfNoSchedule);
98
+ if (!currentSent) {
99
+ sendSwitch(node, node.outputIfNoSchedule);
100
+ }
98
101
  }
99
102
  }
100
103
 
@@ -25,9 +25,9 @@
25
25
  // validate: RED.validators.number(),
26
26
  align: "left",
27
27
  },
28
- outputIfNoSchedule: { value: true, required: true, align: "left" },
28
+ outputIfNoSchedule: { value: "true", required: true, align: "left" },
29
29
  scheduleOnlyFromCurrentTime: {
30
- value: true,
30
+ value: "true",
31
31
  required: true,
32
32
  align: "left",
33
33
  },
@@ -46,8 +46,8 @@
46
46
  {
47
47
  value: "onoff",
48
48
  options: [
49
- { value: true, label: "On" },
50
- { value: false, label: "Off" },
49
+ { value: "true", label: "On" },
50
+ { value: "false", label: "Off" },
51
51
  ],
52
52
  },
53
53
  ],
@@ -57,8 +57,8 @@
57
57
  {
58
58
  value: "nowOrStart",
59
59
  options: [
60
- { value: false, label: "Whole data set" },
61
- { value: true, label: "From current hour" },
60
+ { value: "false", label: "Whole data set" },
61
+ { value: "true", label: "From current hour" },
62
62
  ],
63
63
  },
64
64
  ],
@@ -90,7 +90,7 @@
90
90
  </div>
91
91
  <div class="form-row">
92
92
  <label for="node-input-scheduleOnlyFromCurrentTime">Schedule for</label>
93
- <input type="boolean" id="node-input-scheduleOnlyFromCurrentTime" style="width: 160px">
93
+ <input type="text" id="node-input-scheduleOnlyFromCurrentTime" style="width: 160px">
94
94
  </label>
95
95
  </div>
96
96
  <h3>Output</h3>
@@ -104,7 +104,7 @@
104
104
  </div>
105
105
  <div class="form-row">
106
106
  <label for="node-input-outputIfNoSchedule">If no schedule, send</label>
107
- <input type="boolean" id="node-input-outputIfNoSchedule" style="width: 80px">
107
+ <input type="text" id="node-input-outputIfNoSchedule" style="width: 80px">
108
108
  </label>
109
109
  </div>
110
110
  </script>
@@ -15,9 +15,9 @@ function getPriceData(node, msg) {
15
15
  }
16
16
 
17
17
  priceData = [...input.today, ...input.tomorrow];
18
- priceData.source = input.source;
18
+ const source = input.source;
19
19
  node.context().set("lastPriceData", priceData);
20
- return priceData;
20
+ return { priceData, source };
21
21
  }
22
22
 
23
23
  function validateMsg(node, msg) {
@@ -74,16 +74,20 @@ function convertMsg(msg) {
74
74
  }));
75
75
  } else if (msg.data?.new_state?.attributes["raw_" + day]) {
76
76
  result.source = "Nordpool";
77
- result[day] = msg.data.new_state.attributes["raw_" + day].map((v) => ({
78
- value: v.value,
79
- start: v.start,
80
- }));
77
+ result[day] = msg.data.new_state.attributes["raw_" + day]
78
+ .filter((v) => v.value)
79
+ .map((v) => ({
80
+ value: v.value,
81
+ start: v.start,
82
+ }));
81
83
  } else if (msg.payload?.attributes && msg.payload?.attributes["raw_" + day]) {
82
84
  result.source = "Nordpool";
83
- result[day] = msg.payload.attributes["raw_" + day].map((v) => ({
84
- value: v.value,
85
- start: v.start,
86
- }));
85
+ result[day] = msg.payload.attributes["raw_" + day]
86
+ .filter((v) => v.value)
87
+ .map((v) => ({
88
+ value: v.value,
89
+ start: v.start,
90
+ }));
87
91
  } else {
88
92
  result.source = "Other";
89
93
  result[day] = msg.payload[day] || [];
@@ -6,14 +6,14 @@ module.exports = function (RED) {
6
6
  const node = this;
7
7
 
8
8
  node.on("input", function (msg) {
9
- const priceData = getPriceData(node, msg);
9
+ const { priceData, source } = getPriceData(node, msg);
10
10
  if (!priceData) {
11
11
  // Set status failed
12
12
  return;
13
13
  }
14
14
 
15
15
  // Send output
16
- node.send({ payload: { priceData } });
16
+ node.send({ payload: { priceData, source } });
17
17
  });
18
18
  }
19
19
 
@@ -25,9 +25,9 @@
25
25
  // validate: RED.validators.number(),
26
26
  align: "left",
27
27
  },
28
- outputIfNoSchedule: { value: true, required: true, align: "left" },
28
+ outputIfNoSchedule: { value: "true", required: true, align: "left" },
29
29
  scheduleOnlyFromCurrentTime: {
30
- value: true,
30
+ value: "true",
31
31
  required: true,
32
32
  align: "left",
33
33
  },
@@ -46,8 +46,8 @@
46
46
  {
47
47
  value: "onoff",
48
48
  options: [
49
- { value: true, label: "On" },
50
- { value: false, label: "Off" },
49
+ { value: "true", label: "On" },
50
+ { value: "false", label: "Off" },
51
51
  ],
52
52
  },
53
53
  ],
@@ -57,8 +57,8 @@
57
57
  {
58
58
  value: "nowOrStart",
59
59
  options: [
60
- { value: false, label: "Whole data set" },
61
- { value: true, label: "From current hour" },
60
+ { value: "false", label: "Whole data set" },
61
+ { value: "true", label: "From current hour" },
62
62
  ],
63
63
  },
64
64
  ],
@@ -90,7 +90,7 @@
90
90
  </div>
91
91
  <div class="form-row">
92
92
  <label for="node-input-scheduleOnlyFromCurrentTime">Schedule for</label>
93
- <input type="boolean" id="node-input-scheduleOnlyFromCurrentTime" style="width: 160px">
93
+ <input type="text" id="node-input-scheduleOnlyFromCurrentTime" style="width: 160px">
94
94
  </label>
95
95
  </div>
96
96
  <h3>Output</h3>
@@ -104,7 +104,7 @@
104
104
  </div>
105
105
  <div class="form-row">
106
106
  <label for="node-input-outputIfNoSchedule">If no schedule, send</label>
107
- <input type="boolean" id="node-input-outputIfNoSchedule" style="width: 80px">
107
+ <input type="text" id="node-input-outputIfNoSchedule" style="width: 80px">
108
108
  </label>
109
109
  </div>
110
110
  </script>
@@ -44,17 +44,17 @@
44
44
  required: true,
45
45
  },
46
46
  doNotSplit: {
47
- value: false,
47
+ value: "false",
48
48
  required: true,
49
49
  align: "left",
50
50
  },
51
51
  sendCurrentValueWhenRescheduling: {
52
- value: true,
52
+ value: "true",
53
53
  required: true,
54
54
  align: "left",
55
55
  },
56
- outputIfNoSchedule: { value: true, required: true, align: "left" },
57
- outputOutsidePeriod: { value: false, required: true, align: "left" },
56
+ outputIfNoSchedule: { value: "true", required: true, align: "left" },
57
+ outputOutsidePeriod: { value: "false", required: true, align: "left" },
58
58
  },
59
59
  inputs: 1,
60
60
  outputs: 3,
@@ -70,8 +70,8 @@
70
70
  {
71
71
  value: "onoff",
72
72
  options: [
73
- { value: true, label: "On" },
74
- { value: false, label: "Off" },
73
+ { value: "true", label: "On" },
74
+ { value: "false", label: "Off" },
75
75
  ],
76
76
  },
77
77
  ],
@@ -81,8 +81,8 @@
81
81
  {
82
82
  value: "onoff",
83
83
  options: [
84
- { value: true, label: "On" },
85
- { value: false, label: "Off" },
84
+ { value: "true", label: "On" },
85
+ { value: "false", label: "Off" },
86
86
  ],
87
87
  },
88
88
  ],
@@ -108,7 +108,7 @@
108
108
  {
109
109
  value: "hourson",
110
110
  options: (() => {
111
- const res = hours.map((h) => ({ value: h, label: h }));
111
+ const res = hours.map((h) => ({ value: "" + parseInt(h), label: "" + parseInt(h) }));
112
112
  res.push({ value: "24", label: "24" });
113
113
  return res;
114
114
  })(),
@@ -151,12 +151,12 @@
151
151
  </div>
152
152
  <div class="form-row">
153
153
  <label for="node-input-outputIfNoSchedule">If no schedule, send</label>
154
- <input type="boolean" id="node-input-outputIfNoSchedule" style="width: 80px">
154
+ <input type="text" id="node-input-outputIfNoSchedule" style="width: 80px">
155
155
  </label>
156
156
  </div>
157
157
  <div class="form-row">
158
158
  <label for="node-input-outputIfNoSchedule">Outside period, send</label>
159
- <input type="boolean" id="node-input-outputOutsidePeriod" style="width: 80px">
159
+ <input type="text" id="node-input-outputOutsidePeriod" style="width: 80px">
160
160
  </label>
161
161
  </div>
162
162
  </script>
@@ -11,7 +11,7 @@ module.exports = function (RED) {
11
11
  const originalConfig = {
12
12
  fromTime: config.fromTime,
13
13
  toTime: config.toTime,
14
- hoursOn: config.hoursOn,
14
+ hoursOn: parseInt(config.hoursOn),
15
15
  doNotSplit: booleanConfig(config.doNotSplit),
16
16
  sendCurrentValueWhenRescheduling: booleanConfig(config.sendCurrentValueWhenRescheduling),
17
17
  outputIfNoSchedule: booleanConfig(config.outputIfNoSchedule),
@@ -41,14 +41,14 @@ function doPlanning(node, _, priceData, _, dateDayBefore, _) {
41
41
  const periodStatus = [];
42
42
  const startIndexes = [];
43
43
  const endIndexes = [];
44
- let currentStatus = from < to ? "Outside" : "StartMissing";
44
+ let currentStatus = from < (to === 0 && to !== from ? 24 : to) ? "Outside" : "StartMissing";
45
45
  let hour;
46
46
  priceData.forEach((pd, i) => {
47
47
  hour = DateTime.fromISO(pd.start).hour;
48
48
  if (hour === to && to === from && currentStatus === "Inside") {
49
49
  endIndexes.push(i - 1);
50
50
  }
51
- if (hour === to && to !== from) {
51
+ if (hour === to && to !== from && i > 0) {
52
52
  currentStatus = "Outside";
53
53
  endIndexes.push(i - 1);
54
54
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "source": "Tibber",
2
3
  "priceData": [
3
4
  {
4
5
  "value": 0.2494,
@@ -0,0 +1,197 @@
1
+ {
2
+ "source": "Tibber",
3
+ "priceData": [
4
+ {
5
+ "value": 0.4675,
6
+ "start": "2021-12-14T00:00:00.000+01:00"
7
+ },
8
+ {
9
+ "value": 0.4488,
10
+ "start": "2021-12-14T01:00:00.000+01:00"
11
+ },
12
+ {
13
+ "value": 0.4344,
14
+ "start": "2021-12-14T02:00:00.000+01:00"
15
+ },
16
+ {
17
+ "value": 0.4124,
18
+ "start": "2021-12-14T03:00:00.000+01:00"
19
+ },
20
+ {
21
+ "value": 0.413,
22
+ "start": "2021-12-14T04:00:00.000+01:00"
23
+ },
24
+ {
25
+ "value": 0.4232,
26
+ "start": "2021-12-14T05:00:00.000+01:00"
27
+ },
28
+ {
29
+ "value": 0.4,
30
+ "start": "2021-12-14T06:00:00.000+01:00"
31
+ },
32
+ {
33
+ "value": 0.4067,
34
+ "start": "2021-12-14T07:00:00.000+01:00"
35
+ },
36
+ {
37
+ "value": 0.504,
38
+ "start": "2021-12-14T08:00:00.000+01:00"
39
+ },
40
+ {
41
+ "value": 0.5341,
42
+ "start": "2021-12-14T09:00:00.000+01:00"
43
+ },
44
+ {
45
+ "value": 0.5179,
46
+ "start": "2021-12-14T10:00:00.000+01:00"
47
+ },
48
+ {
49
+ "value": 0.5375,
50
+ "start": "2021-12-14T11:00:00.000+01:00"
51
+ },
52
+ {
53
+ "value": 0.535,
54
+ "start": "2021-12-14T12:00:00.000+01:00"
55
+ },
56
+ {
57
+ "value": 0.5403,
58
+ "start": "2021-12-14T13:00:00.000+01:00"
59
+ },
60
+ {
61
+ "value": 0.5291,
62
+ "start": "2021-12-14T14:00:00.000+01:00"
63
+ },
64
+ {
65
+ "value": 0.5175,
66
+ "start": "2021-12-14T15:00:00.000+01:00"
67
+ },
68
+ {
69
+ "value": 0.4914,
70
+ "start": "2021-12-14T16:00:00.000+01:00"
71
+ },
72
+ {
73
+ "value": 0.4698,
74
+ "start": "2021-12-14T17:00:00.000+01:00"
75
+ },
76
+ {
77
+ "value": 0.4609,
78
+ "start": "2021-12-14T18:00:00.000+01:00"
79
+ },
80
+ {
81
+ "value": 0.4408,
82
+ "start": "2021-12-14T19:00:00.000+01:00"
83
+ },
84
+ {
85
+ "value": 0.4263,
86
+ "start": "2021-12-14T20:00:00.000+01:00"
87
+ },
88
+ {
89
+ "value": 0.3946,
90
+ "start": "2021-12-14T21:00:00.000+01:00"
91
+ },
92
+ {
93
+ "value": 0.3852,
94
+ "start": "2021-12-14T22:00:00.000+01:00"
95
+ },
96
+ {
97
+ "value": 0.373,
98
+ "start": "2021-12-14T23:00:00.000+01:00"
99
+ },
100
+ {
101
+ "value": 0.4675,
102
+ "start": "2021-12-15T00:00:00.000+01:00"
103
+ },
104
+ {
105
+ "value": 0.4488,
106
+ "start": "2021-12-15T01:00:00.000+01:00"
107
+ },
108
+ {
109
+ "value": 0.4344,
110
+ "start": "2021-12-15T02:00:00.000+01:00"
111
+ },
112
+ {
113
+ "value": 0.4124,
114
+ "start": "2021-12-15T03:00:00.000+01:00"
115
+ },
116
+ {
117
+ "value": 0.413,
118
+ "start": "2021-12-15T04:00:00.000+01:00"
119
+ },
120
+ {
121
+ "value": 0.4232,
122
+ "start": "2021-12-15T05:00:00.000+01:00"
123
+ },
124
+ {
125
+ "value": 0.4,
126
+ "start": "2021-12-15T06:00:00.000+01:00"
127
+ },
128
+ {
129
+ "value": 0.4067,
130
+ "start": "2021-12-15T07:00:00.000+01:00"
131
+ },
132
+ {
133
+ "value": 0.504,
134
+ "start": "2021-12-15T08:00:00.000+01:00"
135
+ },
136
+ {
137
+ "value": 0.5341,
138
+ "start": "2021-12-15T09:00:00.000+01:00"
139
+ },
140
+ {
141
+ "value": 0.5179,
142
+ "start": "2021-12-15T10:00:00.000+01:00"
143
+ },
144
+ {
145
+ "value": 0.5375,
146
+ "start": "2021-12-15T11:00:00.000+01:00"
147
+ },
148
+ {
149
+ "value": 0.535,
150
+ "start": "2021-12-15T12:00:00.000+01:00"
151
+ },
152
+ {
153
+ "value": 0.5403,
154
+ "start": "2021-12-15T13:00:00.000+01:00"
155
+ },
156
+ {
157
+ "value": 0.5291,
158
+ "start": "2021-12-15T14:00:00.000+01:00"
159
+ },
160
+ {
161
+ "value": 0.5175,
162
+ "start": "2021-12-15T15:00:00.000+01:00"
163
+ },
164
+ {
165
+ "value": 0.4914,
166
+ "start": "2021-12-15T16:00:00.000+01:00"
167
+ },
168
+ {
169
+ "value": 0.4698,
170
+ "start": "2021-12-15T17:00:00.000+01:00"
171
+ },
172
+ {
173
+ "value": 0.4609,
174
+ "start": "2021-12-15T18:00:00.000+01:00"
175
+ },
176
+ {
177
+ "value": 0.4408,
178
+ "start": "2021-12-15T19:00:00.000+01:00"
179
+ },
180
+ {
181
+ "value": 0.4263,
182
+ "start": "2021-12-15T20:00:00.000+01:00"
183
+ },
184
+ {
185
+ "value": 0.3946,
186
+ "start": "2021-12-15T21:00:00.000+01:00"
187
+ },
188
+ {
189
+ "value": 0.3852,
190
+ "start": "2021-12-15T22:00:00.000+01:00"
191
+ },
192
+ {
193
+ "value": 0.373,
194
+ "start": "2021-12-15T23:00:00.000+01:00"
195
+ }
196
+ ]
197
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "source": "Tibber",
3
+ "priceData": [
4
+ {
5
+ "value": 0.4675,
6
+ "start": "2021-12-14T00:00:00.000+01:00"
7
+ },
8
+ {
9
+ "value": 0.4488,
10
+ "start": "2021-12-14T01:00:00.000+01:00"
11
+ },
12
+ {
13
+ "value": 0.4344,
14
+ "start": "2021-12-14T02:00:00.000+01:00"
15
+ },
16
+ {
17
+ "value": 0.4124,
18
+ "start": "2021-12-14T03:00:00.000+01:00"
19
+ },
20
+ {
21
+ "value": 0.413,
22
+ "start": "2021-12-14T04:00:00.000+01:00"
23
+ },
24
+ {
25
+ "value": 0.4232,
26
+ "start": "2021-12-14T05:00:00.000+01:00"
27
+ },
28
+ {
29
+ "value": 0.4,
30
+ "start": "2021-12-14T06:00:00.000+01:00"
31
+ },
32
+ {
33
+ "value": 0.4067,
34
+ "start": "2021-12-14T07:00:00.000+01:00"
35
+ },
36
+ {
37
+ "value": 0.504,
38
+ "start": "2021-12-14T08:00:00.000+01:00"
39
+ },
40
+ {
41
+ "value": 0.5341,
42
+ "start": "2021-12-14T09:00:00.000+01:00"
43
+ },
44
+ {
45
+ "value": 0.5179,
46
+ "start": "2021-12-14T10:00:00.000+01:00"
47
+ },
48
+ {
49
+ "value": 0.5375,
50
+ "start": "2021-12-14T11:00:00.000+01:00"
51
+ },
52
+ {
53
+ "value": 0.535,
54
+ "start": "2021-12-14T12:00:00.000+01:00"
55
+ },
56
+ {
57
+ "value": 0.5403,
58
+ "start": "2021-12-14T13:00:00.000+01:00"
59
+ },
60
+ {
61
+ "value": 0.5291,
62
+ "start": "2021-12-14T14:00:00.000+01:00"
63
+ },
64
+ {
65
+ "value": 0.5175,
66
+ "start": "2021-12-14T15:00:00.000+01:00"
67
+ },
68
+ {
69
+ "value": 0.4914,
70
+ "start": "2021-12-14T16:00:00.000+01:00"
71
+ },
72
+ {
73
+ "value": 0.4698,
74
+ "start": "2021-12-14T17:00:00.000+01:00"
75
+ },
76
+ {
77
+ "value": 0.4609,
78
+ "start": "2021-12-14T18:00:00.000+01:00"
79
+ },
80
+ {
81
+ "value": 0.4408,
82
+ "start": "2021-12-14T19:00:00.000+01:00"
83
+ },
84
+ {
85
+ "value": 0.4263,
86
+ "start": "2021-12-14T20:00:00.000+01:00"
87
+ },
88
+ {
89
+ "value": 0.3946,
90
+ "start": "2021-12-14T21:00:00.000+01:00"
91
+ },
92
+ {
93
+ "value": 0.3852,
94
+ "start": "2021-12-14T22:00:00.000+01:00"
95
+ },
96
+ {
97
+ "value": 0.373,
98
+ "start": "2021-12-14T23:00:00.000+01:00"
99
+ }
100
+ ]
101
+ }