node-red-contrib-energymeterplus 0.0.7 → 0.0.9

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.
@@ -1,7 +1,7 @@
1
1
  <script type="text/javascript">
2
2
  RED.nodes.registerType('energyMeterPlus', {
3
3
  category: 'energy',
4
- color: '#d9910cdb', <!-- Orange -->
4
+ color: '#d9910cfe', <!-- Dutch Orange -->
5
5
  defaults: {
6
6
  name: {value:""},
7
7
  baselineDaily: {value:0},
@@ -7,7 +7,7 @@ module.exports = function(RED) {
7
7
 
8
8
  let unitCost = Number(config.unitCost) || 0;
9
9
  let filePath = config.filePath || "/addon_configs/a0d7b954_nodered/node_red/solarGen_data.json";
10
- let inputUnit = config.inputUnit || "kW";
10
+ let inputUnit = config.inputUnit || "W"; // default to Watts since your stream is in W
11
11
 
12
12
  // Numeric baseline corrections
13
13
  let baselineDaily = Number(config.baselineDaily) || 0;
@@ -19,44 +19,38 @@ module.exports = function(RED) {
19
19
  let baseline = { daily: baselineDaily, weekly: baselineWeekly, monthly: baselineMonthly, yearly: baselineYearly };
20
20
  let lastCheck = new Date();
21
21
 
22
- // Function to handle rollover
22
+ // Rollover logic
23
23
  function checkRollover() {
24
24
  let now = new Date();
25
-
26
25
  if (now.getDate() !== lastCheck.getDate()) baseline.daily = baselineDaily;
27
26
  if (now.getDay() === 0 && lastCheck.getDay() !== 0) baseline.weekly = baselineWeekly;
28
27
  if (now.getMonth() !== lastCheck.getMonth()) baseline.monthly = baselineMonthly;
29
28
  if (now.getFullYear() !== lastCheck.getFullYear()) {
30
29
  let archiveName = filePath.replace(".json", `_${lastCheck.getFullYear()}.json`);
31
- try {
32
- fs.writeFileSync(archiveName, JSON.stringify(baseline, null, 2));
33
- } catch (err) {
34
- node.error("Failed to archive yearly file: " + err);
35
- }
30
+ try { fs.writeFileSync(archiveName, JSON.stringify(baseline, null, 2)); }
31
+ catch (err) { node.error("Failed to archive yearly file: " + err); }
36
32
  baseline.yearly = baselineYearly;
37
33
  }
38
-
39
34
  lastCheck = now;
40
35
  }
41
-
42
36
  setInterval(checkRollover, 60000);
43
37
 
44
38
  node.on('input', function(msg) {
45
- let factor = (inputUnit === "W") ? 0.001 : 1;
39
+ let now = new Date();
40
+ let durationHours = (now - lastCheck) / (1000 * 3600); // elapsed time in hours
41
+ lastCheck = now;
46
42
 
47
- // Accept either raw number or JSON object
48
- if (typeof msg.payload === "number") {
49
- let power = msg.payload * factor;
50
- baseline.daily += power;
51
- baseline.weekly += power;
52
- baseline.monthly += power;
53
- baseline.yearly += power;
54
- } else if (typeof msg.payload === "object") {
55
- baseline.daily = (msg.payload.daily_kWh || baseline.daily) * factor;
56
- baseline.weekly = (msg.payload.weekly_kWh || baseline.weekly) * factor;
57
- baseline.monthly = (msg.payload.monthly_kWh || baseline.monthly) * factor;
58
- baseline.yearly = (msg.payload.yearly_kWh || baseline.yearly) * factor;
59
- }
43
+ let power = Number(msg.payload) || 0;
44
+ let power_kW = (inputUnit === "W") ? power / 1000 : power;
45
+
46
+ // Energy increment = Power × Time
47
+ let energyIncrement = power_kW * durationHours;
48
+
49
+ // Add to counters
50
+ baseline.daily += energyIncrement;
51
+ baseline.weekly += energyIncrement;
52
+ baseline.monthly += energyIncrement;
53
+ baseline.yearly += energyIncrement;
60
54
 
61
55
  // Calculate costs
62
56
  let daily_cost = baseline.daily * unitCost;
@@ -77,17 +71,14 @@ module.exports = function(RED) {
77
71
  };
78
72
 
79
73
  // Save snapshot
80
- try {
81
- fs.writeFileSync(filePath, JSON.stringify(msg.payload, null, 2));
82
- } catch (err) {
83
- node.error("Failed to write to file: " + err);
84
- }
74
+ try { fs.writeFileSync(filePath, JSON.stringify(msg.payload, null, 2)); }
75
+ catch (err) { node.error("Failed to write to file: " + err); }
85
76
 
86
77
  node.send(msg);
87
78
  });
88
79
  }
89
80
 
90
81
  RED.nodes.registerType("energyMeterPlus", EnergyMeterPlus, {
91
- color: "#d9910cdb" // Orange node color
82
+ color: "#228B22" // Forest Green
92
83
  });
93
84
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-contrib-energymeterplus",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "A node-red energy meter node with editable baseline data, milestone summary, and cost calculation",
5
5
  "author": "Arcfrankye",
6
6
  "license": "MIT",