[Modul] Energierechner

Kann mal jemand nach dem Neustart von Symcon das Log posten, damit ich den Fehler beseitigen kann?
Zusätzlich benötige ich nochmal das Log, wenn eine Berechnung durchgeführt wird, nachdem Symcon schon wieder etwas länger lief.

Dazu darf die Zeile
IPS_LogMessage('Debug Neustart Bug', print_r($result,true));
nicht auskommentiert sein.

Mir reicht jeweils die Ausgabe „Debug Neustart Bug“.

Grüße,
Kai

Hallo @KaiS,

hier die Meldung, die paar Minuten so oder ähnlich im Log steht:

20.02.2024, 07:33:07 | Debug Neustart Bug   | Array
(
    [consumption] => 64.44
    [costs] => 16.65
    [dailyConsumption] => 0
    [dailyCosts] => 0
    [nightlyConsumption] => 0
    [nightlyCosts] => 0
)

Danke für’s Korrigieren…

Es gibt eine neue Beta Version, bitte damit mal testen, ob der Fehler noch auftritt.

Grüße,
Kai

Danke, Log-Meldung ist weg!

Hallo Kai,
wäre das Modul auch geeignet für die Einspeisevergütung zu ermitteln? Das man die Variable der Einspeisung nimmt und die kWh mal den kWh preis rechnet.

VG
Stefan

Ja sicher, warum nicht. Mach ich auch. Du musst halt nur wissen, wieviele kWh du einspeist und zu welchem Preis. Dann legst du dir eine zweite Splitter Instanz für die Einspeisung an und eine Berechnungsinstanz, wo du bei Gateway die entsprechende Splitterinstanz einträgst.
image
image
image

Ok, das Modul berechnet dann aber auch z.B. das er dann nur die Daten ab 01.01.24 nimmt. Ich denke mal das man das auch hinterlegen kann. Habe das Modul noch nicht installiert. Als Variable würde ich dann die Einspeise Variable nehmen von meinem Zähler. Könnte zwar auch die vom Wechselrichter holen, aber ich denke die vom Zähler ist genauer.

Ja, man gibt ein Datum ein, ab wann der Tarif gilt


Das ist meine Splitterinstanz für den „Verkauf“ (wobei man eher verschenken sagen muss, bei den Preisen)

Ok, dann schaue ich mir das mal an. Hatte mir zwar mal vor langer Zeit ein Paar Skripte angelegt für die Berechnung, aber blicke da nicht mehr so ganz durch was zählt. Hatte den Zähler Kopf mittlerweile gewechselt vom Powerfox zu einem WLAN Kopf.
Danke dir.

Edit: Funktioniert, habe schon Ganze 3,12 Euro dieses Jahr eingenommen. Wird wohl wieder ein bescheidenes Jahr wie 2023. :roll_eyes:

Ich lese meinen Smartmeter direkt über die Schnittstelle aus.

Wenn ich das hier so richtig verfolgt und verstanden habe muss ich, wenn ich nicht mit einem neuen Zähler (Stand 0 kWh) beginne das Modul 1 Tag laufen lassen und dann am 2. Tag den 1. Tag löschen?

Wie lösche ich ihn?

Wir haben einen Tag/Nachttarif, aber mit 2 getrennten Zählern (1 Zähler 2 „Zählwerke“).
Dann muss ich vermutlich 2 Rechner anlegen?

Vortageswert meiner Meinung nach viel zu hoch…

Habe den Energierechner auch neu im Einsatz, nutze ihn aber ohne Tarife. Meine Zählervariable zeigt für gestern einen Anfang von 504 kWh und gestern kurz vor Mitternacht 520 kWh, ergibt einen Vortagesverbrauch für mich von 16 kWH.

Entweder ich mache einen Denkfehler oder mit meinem System stimmt etwas nicht, der Energierechner zeigt 30 kWh an, auch das Symcon Modul Verbrauch im Zeitraum zeigt den gleichen Wert an…

Hat jemand eine Idee wo bei mir der Fehler liegen könnte? Die Werte habe ich visuell geprüft und keine Unstimmigkeiten festgestellt in den geloggten Werten, gibt es
ein Tool in den ich die Plausibilität checken kann?

Du kannst über das Archiv Werte löschen.

Wenn du zwei Variablen hast, dann musst du zwei Energierechner Instanzen anlegen.

Grüße,
Kai

1 „Gefällt mir“

Schau dir mal mein Modul ArchidatenAnomalien an.

Grüße,
Kai

1 „Gefällt mir“

Hallo Kai,
das ist ja absolut genial, hatte tatsächlich einen Dreher drin, warum auch immer, vielen Dank für den Hinweis!

Hab Dir eine kleine Aufmerksamkeit zukommen lassen… Danke nochmals.

Gruß
Jürgen

Hallo Jürgen,

vielen Dank für den Amazon Gutschein ich habe mich sehr gefreut. :slight_smile:

Grüße,
Kai

1 „Gefällt mir“

Ich hab was für aWattar-Kunden und den Energierechner von Kai gebastelt. Es geht darum, die Daten von aWattar regelmäßig (ab 14:00 stehen die Werte für den nächsten Tag bereit) zu holen und zwei Durchschnittspreise (Tag/Nacht) mit allen Abgaben in die Energierechnerinstanz einzutragen.
Den Code habe ich aus meinem System herausgelöst und alles entfernt, was niicht benötigt wird. Es werden keine Variablen angelegt, lediglich ein zyklisches Ereignis, welches um 14:15 die Daten abholt. Das kann aber auch geändert werden.
Weiters gibt es einen Bereich, wo man die Abgaben an den Netzbetreier und aWatter eintragen kann. Diese werden entweder zum Energiepreis addiert oder als Abgabe in den Energierechner eingetragen.
Es sollte auch auf Deutschland funktionieren.
Einfach die Variable $land mit „de“ befüllen. Hab das aber leider nie getestet.
MwSt Satz kann auch geänert werden. Variable: $mwst.
Es müssen nur Anpassungen bei diesen Variablen gemacht werden.

    //START Individuelle Werte 
    //Eingabe der Start und Ende Stunde für Nachtpreis
    $nacht_start=21;
    $nacht_ende=7;
    $mwst=20;
    //Land "at" für Österreich und "de" für Deutschland
    $land="at";

    //Werte vom Netzbetreiber
    // Euro pro Monat
    $verbrauch_netzentgelt=6.92;
    // Cent pro kWh
    $verbrauch_abgabe=1.06;
    //Cent pro kWh
    $grundpreis_netzentgelt=6.21;

    //aWATTAR Werte
    //Euro pro Monat
    $grundpreis_awattar=5.75;
    //Aktuell kommen 3% Gewinnaufschlag dazu
    $prozent_aufschlag_awattar=1+(3/100);
    //Für Neukunden werden aktuell 1.8 Cent pro kWh addiert. Angabe z.b 1.8
    $cent_aufschlag_awattar=1.8;

    //welcher Tag geholt werden soll. 0 = aktueller tag, -1 = vortag, 1 = nächster tag
    $tag=1;
    //ENDE Individuelle Werte 

Ganz wichtig ist dieser Teil

    //Hier die Splitterinstanz-ID vom Energierechner eintragen
    $energierechnerid=0;

Hier muss die ID der Splitterinstanz vom Energierechner eingetragen werden.

Und hier das ganze Ding. Viel Spaß dabei.

    <?php
    //Hier die Splitterinstanz-ID vom Energierechner eintragen
    $energierechnerid=0;

    //Prüfung ob die Splitterinstanz vom Energierechner existiert
    if ($energierechnerid == 0 or !IPS_ObjectExists($energierechnerid) or IPS_Getinstance($energierechnerid)["ModuleInfo"]["ModuleID"] != "{63472C81-7110-5151-BBE7-DEA310682B31}")
    {
        IPS_LogMessage($_IPS["SELF"],"Keine oder falsche Energierechnerinstanz angegeben");
        echo "Keine oder falsche Energierechnerinstanz angegeben";
        exit();
    }
    //Zyklisches Ereignis erstellen. Täglich um 14:15
    if (!@IPS_GetObjectIDByIdent("ERADDON_AWATTAR",$_IPS["SELF"]))
    {
        $eid = IPS_CreateEvent(1);
        IPS_SetParent($eid, $_IPS["SELF"]);
        IPS_SetEventCyclicTimeFrom($eid, 14, 15, 0);
        IPS_SetEventActive($eid,true);
        IPS_SETIDENT($eid,"ERADDON_AWATTAR");
    }
    //START Individuelle Werte 
    //Eingabe der Start und Ende Stunde für Nachtpreis
    $nacht_start=21;
    $nacht_ende=7;
    $mwst=20;
    //Land "at" für Österreich und "de" für Deutschland
    $land="at";

    //Werte vom Netzbetreiber
    // Euro pro Monat
    $verbrauch_netzentgelt=6.92;
    // Cent pro kWh
    $verbrauch_abgabe=1.06;
    //Cent pro kWh
    $grundpreis_netzentgelt=6.21;

    //aWATTAR Werte
    //Euro pro Monat
    $grundpreis_awattar=5.75;
    //Aktuell kommen 3% Gewinnaufschlag dazu
    $prozent_aufschlag_awattar=1+(3/100);
    //Für Neukunden werden aktuell 1.8 Cent pro kWh addiert. Angabe z.b 1.8
    $cent_aufschlag_awattar=1.8;

    //welcher Tag geholt werden soll. 0 = aktueller tag, -1 = vortag, 1 = nächster tag
    $tag=1;
    //ENDE Individuelle Werte 
    $mwstberechnung=1+($mwst/100);
    $tagpreis=0;
    $nachtpreis=0;
    $tagzaehler=0;
    $nachtzaehler=0;
    //eine Stunde nach Ende Nacht
    $tag_start=$nacht_ende+1;
    //eine Stunde vor Beginn Nacht
    $tag_ende=$nacht_start-1;
    //Gesamtgrundpreis
    $grundpreis=$grundpreis_netzentgelt+$grundpreis_awattar;

    $nextdayurl=mktime(0,0,0,date("m",time()+(24*60*60*$tag)),date("d",time()+(24*60*60*$tag)),date("Y",time()+(24*60*60*$tag)));
    $url='https://api.awattar.'.$land.'/v1/marketdata?start='.$nextdayurl."000";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    }
    curl_close($ch);
    if (is_array(json_decode($result,true)))
    {
        $awattar_daten=json_decode($result,true)["data"];
        for ($i=0;$i<=23;$i++)
        {
            if (($i>=0 and $i<=$nacht_ende) or ($i>=$nacht_start and $i<=23)) 
            {
                //+20%MwSt +3% Gewinnauflschag von Awattar
                $nachtpreis=$nachtpreis+($awattar_daten[$i]["marketprice"]/10*$mwstberechnung*$prozent_aufschlag_awattar);
                $nachtzaehler++;
            }
            if (($i>=$tag_start and $i<=$tag_ende))
            {
                //+20%MwSt +3% Gewinnauflschag von Awattar
                $tagpreis=$tagpreis+($awattar_daten[$i]["marketprice"]/10*$mwstberechnung   *$prozent_aufschlag_awattar);
                $tagzaehler++;
            }
        }
        //Nachtpreis + Transportkosten
        $nachtpreis=((($nachtpreis/$nachtzaehler)+$cent_aufschlag_awattar+$verbrauch_netzentgelt+$verbrauch_abgabe)/100);
        //Tagpreis + Transportkosten
        $tagpreis=((($tagpreis/$tagzaehler)+$cent_aufschlag_awattar+$verbrauch_netzentgelt+$verbrauch_abgabe)/100);

        $periode=json_decode(json_decode(IPS_GetConfiguration($energierechnerid),true)["Periods"],true);
        array_push($periode,[
            "StartDate"=>"{\"year\":".date("Y",time()+(24*60*60*$tag)).",\"month\":".date("n",time()+(24*60*60*$tag)).",\"day\":".date("j",time()+(24*60*60*$tag))."}",
            "DayPrice"=>round($tagpreis,7),
            "AdvancePayment"=>0,
            "DeductionsPerYear"=>11,
            "BasePrice"=>$grundpreis,
            "NightPrice"=>round($nachtpreis,7),
            "NightTimeStart"=>"{\"hour\":".$nacht_start.",\"minute\":0,\"second\":0}",
            "NightTimeEnd"=>"{\"hour\":".$nacht_ende.",\"minute\":0,\"second\":0}",
            "ElectricitySuppliers"=>"aWattar",
            "GasPriceCalculationActive"=>false,
            "GasConversionFactor"=>0,
            "GasZNumber"=>0,
            "GasCalorificValue"=>0
        ]);
        IPS_SetProperty($energierechnerid,"Periods",json_encode($periode));
        IPS_ApplyChanges($energierechnerid);
        IPS_LogMessage($_IPS["SELF"],"Daten von aWattar erfolgreich geholt");
    }
    else
    {
        IPS_LogMessage($_IPS["SELF"],"Fehler beim Holen der Daten von aWattar");
    }

Bei mir läuft das schon seit über einem Jahr problemlos. Klar hat man einen Fehler, da nur mit zwei Durschnittspreisen gerechnet wird. Aber der Fehler ist relativ gering. Für mich passt das so um einen Überblick zu behalten.
Man muss sich aber bewußt sein, dass die Berechnung teilweise sehr lange braucht wenn viele Daten vorhanden sind.

Seit ein paar Tagen oder seit der Version 7.1 bekomme ich folgende Warnung ins Log

14.04.2024 00:05:34 | 44160 | MESSAGE | Energierechner       | Einstellungen gespeichert
14.04.2024 00:05:34 | 44160 | WARNING | Energierechner       | Buffer 'Periods' is over 256kB

Kann ich da etwas erhöhen?

Auszug aus der Doku:

Der Buffer besitzt ein Softlimt von 256kB und ein Hardlimit von 1024kB. Das heißt ab 256kB größe wirft IP-Symcon eine „Warning“ in die Meldungen und die maximale Größe des Buffers beträgt 1024kB. Daten größer als 1024kB werden abgeschnitten.

Ich glaube das man das nicht anpassen kann.
Wenn ich wieder mehr Zeit habe, kann ich mal schauen, ob ich das auch anders lösen kann.
Der Fall tritt aber auch nur bei dir auf, weil du so viel Inhalt in der Liste wegen aWATTar hast.

Grüße,
Kai

Das mit der Menge an Einträgen in meiner Instanz hab ich mir auch gedacht. Jedoch tritt es nicht immer auf.
Ich habe mir die letzten Tage angesehen und es tritt nur bei der Berechnung nach Mitternacht auf


Kann es sein, dass das mit meiner Automatik zum deaktiveren/aktivieren der Energierechnerinstanzen.
Das habe ich irgendwann eingeführt, weil die das brauchen damit das mit den Preisen passt - glaube ich. Dieses Skript wird um Mitternacht aufgerufen. Ich bau da noch mehr logging ein.
Da gab es auch einen Beitrag hier im Forum.

<?php
function reload($id)
{
	IPS_SetProperty($id, "Active", false);
	IPS_ApplyChanges($id);
	IPS_SetProperty($id, "Active", true);
	IPS_ApplyChanges($id);
}

$er_id=array(
				57354,
				18894,
				44160,
				22902,
				45025,
				19573,
				40729,
				16012,
				45752,
				10511,
				52772,
				56934,
				23037

);

foreach($er_id as $id)
{
	reload($id);
}