Ich bin leicht verwirrt. Da tvbshelly das Verfahren beschrieben hat, ist dieses doch recht leicht per Skript implementierbar, oder nicht?
Addiere alle positiven Phasen (als Beispiel wie bei dir L2 + L3) und addiere diesen Wert auf das Bezugszählwerk
Addiere alle negativen Phasen (bei dir kann es nur L1 sein, wenn man eine dreiphasige PV hat auch mehrere) und addiere diesen Wert auf das Einspeisezählwerk
Regelmäßig z.B. pro Minute die Werte der beiden Zählwerke für Statistiken etc. als Reihe fortschreiben
Dazu ein Skript (ungetestet, da ich keinen passenden Shelly habe)
let Period = 10; // Abfrageperiode in ms
let
Import = 0, ImpSald = 0,
Export = 0, ExpSald = 0,
P1 = 0, P2 = 0, P3 = 0,
dt = Period * 1000; // Zeitspanne zur Energieberechnung
function saldiere() {
// verarbeite die letzten P Werte
let E1 = P1 * dt, E2 = P2 * dt, E3 = P3 * dt;
if(E1>=0) Import += E1 else Export += E1;
if(E2>=0) Import += E2 else Export += E2;
if(E3>=0) Import += E3 else Export += E3;
let E = E1 + E2 + E3;
if(E>0) ImpSald += E else ExpSald += E;
// hole aktuelle P Werte
Shelly.call("EM.GetStatus", {id:0}, function(res, errc, errm) {
if(errc) {console.log(errc, errm); P1 = 0; P2 = 0; P3 = 0; return}
P1 = res.a_act_power;
P2 = res.b_act_power;
P3 = res.c_act_power;
};
}
Timer.set(Period, true, saldiere);
function send() {
// Hier bspw. via MQTT gesendet
// Payload unmittelbar via Stringconcatenation
// Alternative: Objekt zusammenstellen, Payload als JSON.stringify(Objekt)
MQTT.publish("meinTopic", '{"Import":'+Import+', "Export":'+Export+', "ImpSald":'+ImpSald+', "ExpSald":'+ExpSald+'}');
}
function resSald() {
Import = 0;
Export = 0;
ImpSald = 0;
ExpSald = 0;
}
Alles anzeigen
Es können sich Tippfehler eingeschlichen haben. ImpSald und ExpSald enthalten die saldierten Werte.
Dazu ein Schedule Job (Zeitplan), der bspw. alle 10 Minuten den Stand von Import und Export sendet.
http://<IP Adresse des Shelly>/rpc/schedule.create?timespec="*/10 * * * * *"&calls=["method":"script.eval","params":{"id":1,"code":"send()"}]
Falls das Skript eine andere Id als 1 hat, diese hinter "id" einsetzen!
Zusätzlich einen ebensolchen Schedule Job, der bspw. täglich um 00:00 Uhr die Import, Export Werte rücksetzt.
http://<IP Adresse des Shelly>/rpc/schedule.create?timespec="0 0 0 * * *"&calls=["method":"script.eval","params":{"id":1,"code":"resSald()"}]
Ausschließlich Zeiten zum senden und zum rücksetzen können leicht per WebUI oder App geändert werden. Bei Bedarf kann meine Webseite https://tools.eichelsdoerfer.net/schedjob.html verwendet werden.
Falls dieses Skript im Zusammenwirken mit den Zeitplänen nicht das gewünschte Resultat bringen sollte, bitte ich um Rückmeldung.
Wichtig!
Gesendet werden die Werte von Import und Export. Dies hat nichts mit der Cloud zu tun. Es gibt eh bessere Speicherungen und Darstellungen als die der Cloud.
Falls irgendwann zu viele RPC Aufrufe auflaufen sollten, weil die Firmware nichts schnell genug arbeitet, dann muss der Period Wert erhöht werden. Ich rechne allerdings nicht damit.