Hi,
also ich hab jetzt mal ein Script erstellt, mit dem ich denke, alle abgedeckt zu haben.
Bin mir jedoch noch nicht sicher, ob alle Berechnungen stimmen. Vielleicht kann ja jemand mal drüberschauen.
// Bezug Hauszähler
const oidLeistungHaus = 'alias.0.Energie.Zaehler.Leistung_Zähler_Gesamt';
const oidBezugkWh = 'alias.0.Energie.Zaehler.Stromzaehler_Zaehlerstand_kWh';
const oidBezugWh = 'alias.0.Energie.Zaehler.Stromzähler_Zählerstand_in_Wh';
const oidZaehlerAbPVkWh = '0_userdata.0.PV.Haus_Zählerstand_ab_PV';
const oidTagesbezugkWh = '0_userdata.0.PV.Tagesbezug_in_kWh';
const oidNeededPower = '0_userdata.0.PV.Benötigte_Leistung_Haus_Aktuell';
const oidWerksreset = '0_userdata.0.PV.Werksreset';
const oidWerksresetFreischalten = '0_userdata.0.PV.Werksreset_Freischalten';
const oidWerksresetDatum = '0_userdata.0.PV.Werksreset_Datum';
const oidTagesverbrauchkWh = '0_userdata.0.PV.Tagesverbrauch_in_kWh';
const BezugkWh = getState(oidBezugkWh).val;
const BezugWh = getState(oidBezugWh).val;
let LeistungHaus = 0;
let LeistungPV = 0;
let NeededPower = 0;
let ZaehlerNeuAbPVkWh = 0;
let TagesbezugkWh = 0;
let TagesverbrauchkWh = 0;
let GesamtverbrauchkWh = 0;
// Einspeisung Hauszähler
const oidWhEinspeisung = '0_userdata.0.PV.Einspeisung_ins_Netz';
const oidkWhEinspeisung = '0_userdata.0.PV.Einspeisung_ins_Netz_in_kWh';
const oidkWhEinspeisungHeute = '0_userdata.0.PV.Einspeisung_ins_Netz_Heute_kWh';
let EinspeisungWh = 0;
let EinspeisungkWh = 0;
let EinspeisungHeutekWh = 0;
// PV
const oidPVPower = 'opendtu.0.total.power';
const oidPVYieldTotal = 'opendtu.0.total.yieldtotal';
const oidGesamtertragkWh = '0_userdata.0.PV.PV_Zaehlerstand_Gesamt';
const oidZaehlerstandOpenDTU = '0_userdata.0.PV.PV_Zaehlerstand_openDTU';
const oidEigenverbrauchkWh = '0_userdata.0.PV.Eigenverbrauch_in_kWh';
const oidEigenverbrauchHeutekWh = '0_userdata.0.PV.Eigenverbrauch_Heute_in_kWh';
const oidTagesertragkWh = '0_userdata.0.PV.PV_Zaehlerstand_Heute';
let GesamtertragkWh = 0;
let TagesertragkWh = 0;
let EigenverbrauchkWh = 0;
let EigenverbrauchHeutekWh = 0;
let ZaehlerstandOpenDTU = 0;
//******* Zählerstand Haus ab PV */
ZaehlerNeuAbPVkWh = getState(oidZaehlerAbPVkWh).val;
on({ id: oidBezugWh, change: 'ne' }, async (obj) => {
const value = obj.state.val;
const oldValue = obj.oldState.val;
const differenz = (value - oldValue) / 1000;
ZaehlerNeuAbPVkWh += differenz;
await setStateAsync(oidZaehlerAbPVkWh, Math.round(ZaehlerNeuAbPVkWh * 1000) / 1000, true);
});
//******* Zählerstand direkt von OpenDTU */
on({ id: oidPVYieldTotal, change: 'ne'}, async(obj) => {
ZaehlerstandOpenDTU = (await getStateAsync(oidZaehlerstandOpenDTU)).val;
if (obj.state.val > ZaehlerstandOpenDTU) {
await setStateAsync(oidZaehlerstandOpenDTU, obj.state.val, true);
}
})
//******* Zähler PV Einspeisung und Bezug*/
EinspeisungWh = getState(oidWhEinspeisung).val;
EinspeisungkWh = getState(oidkWhEinspeisung).val;
EinspeisungHeutekWh = getState(oidkWhEinspeisungHeute).val;
TagesbezugkWh = getState(oidTagesbezugkWh).val;
on({ id: oidLeistungHaus, change: 'ne'}, async (obj) => {
const state = obj.state;
const oldState = obj.oldState;
LeistungHaus = state.val;
if (oldState.val < 0) {
EinspeisungWh += (oldState.val * (state.lc - oldState.lc)) / -3600000;
EinspeisungHeutekWh += ((oldState.val * (state.lc - oldState.lc)) / -3600000) / 1000;
EinspeisungkWh = EinspeisungWh / 1000;
await Promise.all([
setStateAsync(oidWhEinspeisung, Math.round(EinspeisungWh), true),
setStateAsync(oidkWhEinspeisung, Math.round(EinspeisungkWh * 1000) / 1000, true),
setStateAsync(oidkWhEinspeisungHeute, Math.round(EinspeisungHeutekWh * 1000) / 1000, true)
]);
} else if (obj.oldState.val > 0) {
TagesbezugkWh += (obj.oldState.val * (obj.state.lc - obj.oldState.lc)) / 3600000000;
await setStateAsync(oidTagesbezugkWh, TagesbezugkWh, true);
};
await NeededPowerCurrent();
});
//******** PV Zählerstand Total und Heute und Berechnung des Eigenverbrauchs */
GesamtertragkWh = getState(oidGesamtertragkWh).val;
TagesertragkWh = getState(oidTagesertragkWh).val;
EigenverbrauchHeutekWh = getState(oidEigenverbrauchHeutekWh).val;
on({ id: oidPVPower, change: 'ne'}, async (obj) => {
const oldValue = LeistungPV = obj.oldState.val;
const value = (oldValue * (obj.state.lc - obj.oldState.lc)) / 3600000000;
GesamtertragkWh += value;
TagesertragkWh += value
EigenverbrauchkWh = Math.round((GesamtertragkWh - EinspeisungkWh) * 1000) / 1000;
EigenverbrauchHeutekWh = Math.round((TagesertragkWh - EinspeisungHeutekWh) * 1000) / 1000;
await Promise.all([
setStateAsync(oidGesamtertragkWh, GesamtertragkWh, true),
setStateAsync(oidEigenverbrauchkWh, EigenverbrauchkWh, true),
setStateAsync(oidEigenverbrauchHeutekWh, EigenverbrauchHeutekWh, true),
setStateAsync(oidTagesertragkWh, TagesertragkWh, true)
]);
await NeededPowerCurrent();
});
//******* Tagesertrag / Tagesbezug resetten */
const zeitplan = schedule('59 23 * * *', async() => {
TagesertragkWh = TagesbezugkWh = EinspeisungHeutekWh = 0
await Promise.all([
setStateAsync(oidTagesertragkWh, 0, true),
setStateAsync(oidTagesbezugkWh, 0, true),
setStateAsync(oidkWhEinspeisungHeute, 0, true)
]);
});
// Autarkie
schedule("*/5 * * * * *", async () => {
const autarkieHeute = Math.round((((TagesverbrauchkWh - TagesbezugkWh) / TagesverbrauchkWh) * 100) * 1) / 1;
const autarkie = Math.round((((GesamtverbrauchkWh - ZaehlerNeuAbPVkWh) / GesamtverbrauchkWh) * 100) * 1) / 1;
let autarkieAktuell = Math.round(Math.min(Math.max((100 * (1 - (LeistungHaus / NeededPower))), 0), 100) * 1) / 1;
await Promise.all([
setStateAsync('0_userdata.0.PV.Autarkie_Gesamt', autarkie, true),
setStateAsync('0_userdata.0.PV.Autarkie_Tag', autarkieHeute, true),
setStateAsync('0_userdata.0.PV.Autarkie_Aktuell', autarkieAktuell, true)
]);
});
// Aktuelle Leistung Haus und Verbräuche berechnen
async function NeededPowerCurrent() {
// Benötigte Leistung Haus aktuell in W
NeededPower = LeistungHaus + LeistungPV;
await setStateAsync(oidNeededPower, (Math.min(Math.max(NeededPower, 0), 10000)), true);
// Benötigter Tagesverbrauch und Gesamtverbrauchin kWh
TagesverbrauchkWh = TagesbezugkWh + TagesertragkWh - EinspeisungHeutekWh;
GesamtverbrauchkWh = ZaehlerNeuAbPVkWh + GesamtertragkWh - EinspeisungkWh;
await setStateAsync(oidTagesverbrauchkWh, TagesverbrauchkWh, true);
return true;
}
//Werksreset
on({id: oidWerksreset}, async (obj) => {
const freigeschaltet = (await getStateAsync(oidWerksresetFreischalten)).val;
if (freigeschaltet) {
TagesbezugkWh = TagesertragkWh = EinspeisungWh = EinspeisungkWh = EinspeisungHeutekWh = EigenverbrauchHeutekWh = GesamtertragkWh = ZaehlerNeuAbPVkWh = TagesverbrauchkWh = 0;
const date = formatDate(new Date(), 'DD.MM.YYYY');
await Promise.all([
setStateAsync(oidTagesbezugkWh, 0, true),
setStateAsync(oidWhEinspeisung, 0, true),
setStateAsync(oidEigenverbrauchHeutekWh, 0, true),
setStateAsync(oidkWhEinspeisungHeute, 0, true),
setStateAsync(oidkWhEinspeisung, 0, true),
setStateAsync(oidTagesertragkWh, 0, true),
setStateAsync(oidGesamtertragkWh, 0, true),
setStateAsync(oidZaehlerAbPVkWh, 0, true),
setStateAsync(oidTagesverbrauchkWh, 0, true),
setStateAsync(oidWerksresetFreischalten, false, true),
setStateAsync(oidWerksresetDatum, date, true)
]);
}
});