-
Notifications
You must be signed in to change notification settings - Fork 0
/
charge.js
143 lines (107 loc) · 5.11 KB
/
charge.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const fetch = require('node-fetch');
async function getAwattarPrices() {
const apiUrl = 'https://api.awattar.at/v1/marketdata';
// Konstruiere die URL für die Anfrage
const fullUrl = `${apiUrl}`;
const response = await fetch(fullUrl);
if (!response.ok) {
throw new Error(`Fehler bei der Anfrage: ${response.status} - ${response.statusText}`);
}
const data = await response.json();
// Handle die Antwort hier
return data;
}
const stopDischarge = () => {
console.log('Stop discharge');
setState('modbus.0.holdingRegisters.1.40350_MinRsvPct' /*Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage*/,
getState('modbus.0.holdingRegisters.1.40351_ChaState').val); /*Currently available energy as a percent of the capacity rating*/
};
const discharge = () => {
console.log('Start discharge');
setState('modbus.0.holdingRegisters.1.40350_MinRsvPct' /*Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage*/,
1000);
};
const charge = () => {
console.log('Start charge');
setState('modbus.0.holdingRegisters.1.40350_MinRsvPct' /*Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage*/,
8000);
}
let carCharging = false;
let batteryCharing = false;
/*Leistung go-e Charger gesamt in kW (nrg[11])*/
on({ id: 'go-e.0.energy.power', change: 'ne' },
(obj) => {
console.log("EV Power: " + getState('go-e.0.energy.power').val);
if (getState('go-e.0.energy.power').val > 0) {
carCharging = true;
if (!batteryCharing) {
stopDischarge();
}
}
if (getState('go-e.0.energy.power').val == 0) {
carCharging = false;
if (!batteryCharing) {
discharge();
}
}
}
);
const handleBattery = async () => {
const soc = getState('modbus.0.holdingRegisters.1.40351_ChaState').val;
const data = await getAwattarPrices();
// console.log(data.data);
const awattarRaw = data.data;
// const awattarRaw = JSON.parse(getState('awattar.0.Rawdata').val).data;
const awattar = awattarRaw.filter((p) => p.end_timestamp > Date.now());
const priceNow = awattar.filter((p) => p.start_timestamp < Date.now() && p.end_timestamp > Date.now())[0].marketprice;
const maxPrice = awattar.reduce(function (prev, current) {
return (prev && prev.marketprice > current.marketprice) ? prev : current
});
const minPrice = awattar.reduce(function (prev, current) {
return (prev && prev.marketprice < current.marketprice) ? prev : current
});
// Mittelwert des Preises
const avgPrice = Math.round(awattar.reduce((acc, curr) => acc + curr.marketprice, 0) / awattar.length);
// Quadratishe Abweidungen
const squaredDeviations = awattar.map(x => {
return Math.pow(x.marketprice - avgPrice, 2);
});
const stdDevPrice = Math.round(Math.sqrt(squaredDeviations.reduce((a, b) => a + b, 0) / awattar.length));
// Preis bis zu dem geladen wird
const lowPriceRange = avgPrice - stdDevPrice * 0.5;
// Preis ab dem entladen wird
const midPriceRange = avgPrice + stdDevPrice * 0.5;
var stunde = new Date().getHours();
// const awattar = JSON.parse(getState('awattar.0.Rawdata').val).data;
// const priceNow = awattar.filter((p) => p.start_timestamp < Date.now() && p.end_timestamp > Date.now())[0].marketprice;
/*Geschätzte Energie (morgen)*/
const kwhTomorrow = getState('pvforecast.0.summary.energy.tomorrow').val;
/*Geschätzte Energie (heute)*/
const kwhToday = getState('pvforecast.0.summary.energy.today').val;
const limitkWhBadWeather = 10;
const startEveningHour = 19;
console.log('SOC: ' + soc + ' Wh Tomorrow: ' + kwhTomorrow + ' kWh Today: ' + kwhToday + ' kWh Price Now: ' + priceNow + ' € Car Charging: ' + carCharging + ' Anz Awattarpreise: ' + awattar.length);
console.log('AvgPrice: ' + avgPrice + ' StdDev: ' + stdDevPrice + ' MaxPrice: ' + maxPrice.marketprice + ' MinPrice: ' + minPrice.marketprice + ' aktuelle Stunde: ' + stunde + ' LowPriceRange: ' + lowPriceRange + ' MidPriceRange: ' + midPriceRange);
// nur bei schlechtem Wetter
// bis zum Abend das Wetter von heute verwenden, danach das Wetter von morgen
if (((stunde < startEveningHour) && (kwhToday < limitkWhBadWeather)) ||
((stunde >= startEveningHour) && (kwhTomorrow < limitkWhBadWeather))) {
if (priceNow < lowPriceRange) {
batteryCharing = true;
charge();
} else if (priceNow < midPriceRange) {
batteryCharing = false;
stopDischarge();
} else if (!carCharging) {
batteryCharing = false;
discharge();
}
} else if (!carCharging) {
discharge();
}
}
schedule('{"time":{"start":"00:00","end":"23:59","mode":"minutes","interval":10},"period":{"days":1}}',
handleBattery
);
// call on startup
handleBattery();