Stammtisch Österreich (Ost)

Das habe ich mir auch schon gedacht,
dass dies ein gröberer Umbau werden kann. :smirk:
Und ich momentan nicht weiter weis.

Eventuell kann mir da wer auf die Sprünge helfen.
LG Willi

heute ist Videostammtisch mit einigen aus DE auf Discord, wenn wer dabei sein möchte um 20.00 via Teams.

lg Alex

Hallo,
Habe eine 2. Tabelle für das maximale Preisfenster erstellt.
War für mich, der einfachere Weg mit meinen bescheidenen PHP Kenntnissen :upside_down_face:
Hier die zwei Tabellen:


Die obere für das minimum Preisfenster ( Min Tagespreis + 10% ).
Hier werden meine geschalteten Verbraucher ( 150l Boiler, E-Bike ) und für die Haushaltsgeräte wenn möglich ( Waschm., Geschirrsp. ) mit Zeitvorwahl eingeschaltet.
Auch lade ich meinen 5kW Akku in diesem Zeitfenster,
wenn der Preis kleiner als 0.075€/kWh ( Energiepreis + Ust ( exkl. 2.99€ Mon Geb.)) ist.
Ist heute der Fall.
Das untere für das maximale Preisfenster ( Max Tagespreis -10% ).


Gestern habe ich auch bei der Preisspitze von > 0.13€/kWh in mein Hausnetz mit HM-800 und Akku eingespeist. Das war das eine rote Feld.
Ich berücksichtige dabei, dass zwischen den Max Preisfeld und meiner 0.075€ > 40% Differenz herrscht.
Habe bei meinem Ladegerät leider 33% Ladeverluste!
Auch mit einer sehr kleinen PV, aber mit einem Akku,
kann bei den stündlichen Preisen, auch einwenig jonglieret werden :sweat_smile:

Das Spielen macht Spaß :smile:
LG Willi
PS: danke an Andreas und Helmut :wave:

Hallo, an die Runde :wink:
Die Einbindung, über ein Modul ( paresy ), wird noch eine Weile dauern,
bis wir dann keine mySQL DB mehr brauchen werden.
Da Alexander ( Zonex ) und Walter,
wegen der Einbindung von SmartEnergy ( mithilfe von Awattar ) angefragt haben,
möchte ich mal meinen Iststand Übermitteln.

Teilweise lade ich meinen Akku ( LiFePo ) über eine Steckdose und Ladegerät,
wenn der Strompreis unter z.B. 4cent ( Energiepreis inkl. Steuer ) ist.
Auch speise ich, bei einem hohen Marktpreis von 7,5cent + z.B. 60% manchmal
wieder in mein Hausstromnetz ( Mikrowechselrichter ) ein.
Ist eine Spielerei, aber bei eventuell, höheren Preisschwankungen,
kann sich das dann auch rechnen.

In den Minimalen Preiszohnen, schalte ich z.B. meinen Warmwassserspeicher und
bei Bedarf e-Bike mit Tasmota Steckdosen ein.
Mein Schatz verwendet diese Zeitzonen für den Geschirrspüler und Waschmaschine :wink:

Habe mithilfe von Helmut, die Einbindung bei mir umgesetzt.
Wir brauche eine Datenbank z.B. mySQL.
Am besten in der Version 8.0.36, weil da kann die DB mithilfe von MySQL Workbench erstellt und bearbeitet werden. Höhere Versionen werden nicht Unterstützt.
Hier der Link für Synology Docker MySQL DB Install ( Achtung! Maximal die Version 8.0.36 ):
https://tutorialsight.com/install-mysql-synology-nas-using-docker/
Download von Workbench ( für MySQL maximal V8.0.36 ):
https://dev.mysql.com/downloads/workbench/



Im Workbench, wird die DB erstellt, z.B. wie bei mir mit der Tabelle smartenergy mit datum, stunde und preis.
Habe ich auch im PHP Code „Daten Abholen und Aufbereiten“ genauer beschrieben.

Hier mal meinen Objektbaum, als Übersicht:




Als Zusatzinfo! Es kann bei einem markierten Objekt im Baum, mit String+C die ID Nummer kopiert werden. Die dann im PHP-Code eingefügt werden kann.
Dass vereinfacht die Anpassungen bei eurem PHP-Code :slightly_smiling_face:
Bei manchen Variablen, müsst ihr ein Aktion Skript erstellen.


Wie hier bei „Eigene Aktion“ ist schon das Aktionskript vorhanden.
Bei einer neuen Variable, ist dort ein PLUS rechts, erstellt automatisch das Skript!

Habe versucht, diverse Kommentare und Hilfsmitteln für die Fehlersuche ( echo … ) in PHP-Code einzubinden.
Und hier die PHP-Skripte:
Daten Abholen und Aufbereiten:
Ist das Haupt-Skript, dass die anderen PHPs auch größtenteils verwendet.

<?php

// Daten Abholen und Aufbereiten

$diagramm_erstellen_id=27496; // PHP
$ladezeiten_ermitteln_id=23814; // PHP
$ladezeiten_html_erstellen_id=20822; // PHP
$Maxzeiten_ermitteln_id=20130;
$Maxzeiten_html_erstellen_id=46646;

//$tarifübersicht_energierechner_erstellen_id=24073; // Variable
$datum_auswahl_id=18501; // Variable 
$mail_instanz_id=46728; // SMTP Mailer
$preistabelle_html_id=28164; // Variable 
$mail1="mail1@chello.at";
$mail2="mail2@chello.at";

$nacht1ende=getvalue(50734); // Tarif Stunde Nachtende z.B. 5 ( 5Uhr )
//eine Stunde nach Ende Nacht
$tagstart=getvalue(50734)+1;
//eine Stunde vor Beginn Nacht
$tagende=getvalue(57333)-1; //
$nacht2start=getvalue(57333); // Tarif Stunde Nachtstart z.B. ( 18Uhr )

$tagpreis=0;
$nachtpreis=0;
$tagzaehler=0;
$nachtzaehler=0;

$verbrauch_netzentgelt=getvalue(24045);
$verbrauch_abgabe=getvalue(41922);

//Grundpreise braucht man nur beim Energierechner
$grundpreis_netzentgelt=getvalue(27574);
$grundpreis_anbieter=getvalue(54891);
$grundpreis=$grundpreis_netzentgelt+$grundpreis_anbieter;

$prozent_aufschlag_anbieter=1;   // 1+(getvalue(59894)/100); // 3% nur bei Avattar
$cent_aufschlag_anbieter=getvalue(38031);

$durchschnitttagid=59739;
$durchschnittnachtid=31074;
$energierechnerid=25717;

//welcher Tag geholt werden soll. 0 = aktueller tag, -1 = vortag, 1 = nächster tag
//die neuen Werte werden jeden Tag um 14:00 für den nächsten Tag geholt
//$tag=getvalue(20907);
$tag=1;

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);
// 24*60*60 Sekunden pro Tag!!
// "smartenergy" = Tabellen Name in der SQL DB die selber vorher erstellt wurde; datum ( type:Date= 24-01-27 ), stunde  ( type:int= 0 bis 23 ), preis ( type:Float= in € )

mysqli_query($dbhandler,"delete from smartenergy where datum='".date("Y-m-d",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))))."'");

// $nextdayurl = UnixTimestamp Begin des Tages!!
// z.B. 1706137200= 2024-01-25 00:00:00
$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.at/v1/marketdata?start='.$nextdayurl."000";

// Awattar liefert:
// Euro ohne Steuer
// marketprice €/kWh inkl.USt = ((90.01 MWh/10)*1.2
// 24Stunden in die Zukunft, wenn möglich!!
/*
data:
    0:
        start_timestamp:    1706209200000
        end_timestamp:      1706212800000
        marketprice:        90.01
        unit:               "Eur/MWh"
    1:
        start_timestamp:    1706212800000
        end_timestamp:      1706216400000
        marketprice:        84.4
        unit:               "Eur/MWh"
*/

$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<=$nacht1ende) or ($i>=$nacht2start and $i<=23)) 
    	{
            //+20%MwSt +3% Gewinnauflschag von Awattar
		    $nachtpreis=$nachtpreis+($awattar_daten[$i]["marketprice"]/10*1.2*$prozent_aufschlag_anbieter);
		    $nachtzaehler++;
	    }
	    if (($i>=$tagstart and $i<=$tagende))
	    {
            //+20%MwSt +3% Gewinnauflschag von Awattar
    		$tagpreis=$tagpreis+($awattar_daten[$i]["marketprice"]/10*1.2*$prozent_aufschlag_anbieter);
		    $tagzaehler++;
	    }
        //+20%MwSt +3% Gewinnauflschag von Awattar + die Transportkosten vom Netzbetreiber
	    $preis=(($awattar_daten[$i]["marketprice"]/10*1.2*$prozent_aufschlag_anbieter)+$cent_aufschlag_anbieter)/100;
	    $timestart=$awattar_daten[$i]["start_timestamp"]/1000;
	    mysqli_query($dbhandler,
        "insert into smartenergy (datum,stunde,preis) values ('".
        date("Y-m-d",$timestart)."',".
        $i.",".
        number_format($preis,7).
        ")");
    }
    mysqli_close($dbhandler);
    //Nachtpreis + Transportkosten, müsste eigentlich nach Mitternacht für den vergangenen Tag gemacht werden!!!!! Da der Verbrauch dann bekannt ist ( $VerbrauchTag )
    $nachtpreis=((($nachtpreis/$nachtzaehler)+$cent_aufschlag_anbieter+$verbrauch_netzentgelt+$verbrauch_abgabe)/100);  // Mit Rechenfehler, da nicht kWh bekannt sind!!
    //$nachtpreis=((($nachtpreis/$nachtzaehler)+$cent_aufschlag_anbieter+($VerbrauchTag*($verbrauch_netzentgelt+$verbrauch_abgabe))/100);  // $VerbrauchTag = kWh vom vergangenen Tag!!
    
    //Tagpreis + Transportkosten, müsste eigentlich nach Mitternacht für den vergangenen Tag gemacht werden!!!!! Da der Verbrauch dann bekannt ist ( $VerbrauchTag )
    $tagpreis=((($tagpreis/$tagzaehler)+$cent_aufschlag_anbieter+$verbrauch_netzentgelt+$verbrauch_abgabe)/100);    // Mit Rechenfehler, da nicht kWh bekannt sind!!
    //$tagpreis=((($tagpreis/$tagzaehler)+$cent_aufschlag_anbieter+($VerbrauchTag*($verbrauch_netzentgelt+$verbrauch_abgabe))/100);    // Mit Rechenfehler, da nicht kWh bekannt sind!!
    
    setvalue($durchschnitttagid,$tagpreis);
    setvalue($durchschnittnachtid,$nachtpreis);

    // nur für Energierechner Modul
    
    $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\":".$nacht2start.",\"minute\":0,\"second\":0}",
    	"NightTimeEnd"=>"{\"hour\":".$nacht1ende.",\"minute\":0,\"second\":0}",
    	"ElectricitySuppliers"=>"SmartEnergy",
    	"GasPriceCalculationActive"=>false,
    	"GasConversionFactor"=>0,
    	"GasZNumber"=>0,
    	"GasCalorificValue"=>0
    ]);
    IPS_SetProperty($energierechnerid,"Periods",json_encode($periode));
    IPS_ApplyChanges($energierechnerid);
   
    // Energierechner Ende

    //Skripte die diverse HTML Variablen mit den neuen Werten befüllen
    //Aufruf für die Erstellung eines Balkendiagramms
    //??
    IPS_RunScriptWait($diagramm_erstellen_id);
    //Ladezeiten für den nächsten Tag ermitteln, HTML Austage erstellen
	IPS_RunScriptWaitEx($ladezeiten_ermitteln_id,array("tag"=>1));	
    IPS_RunScriptWait($ladezeiten_html_erstellen_id);
    //Maxzeiten für den nächsten Tag ermitteln, HTML Maxtage erstellen
    IPS_RunScriptWaitEx($Maxzeiten_ermitteln_id,array("tag"=>1));	
    IPS_RunScriptWait($Maxzeiten_html_erstellen_id);

    //Übersicht für die Anzeige der Tarife des Energierechners erstellen wirst du nicht brauchen
    //IPS_RunScriptWait($tarifübersicht_energierechner_erstellen_id);
    

	//Preisinformation per Mail senden
	if (round($tagpreis,2) <=0.20)
	{
		        $tagpreistext="Der Tagespreis ist niedrig! (bis 0,20 €/kWh)";
	}
	elseif(round($tagpreis,2) >=0.21 and $tagpreis <= 0.30)
	{
		        $tagpreistext="Der Tagespreis ist normal! (0,21 €/kWh-0,30 €/kWh)";
	}
	else
	{
		        $tagpreistext="Der Tagespreis ist hoch! (ab 0,30 €/kWh)";
	}
	if (round($nachtpreis,2) <=0.20)
	{
		        $nachtpreistext="Der Nachtpreis ist niedrig! (bis 0,20 €/kWh)";
	}
	elseif(round($nachtpreis,2) >=0.21 and $nachtpreis <= 0.30)
	{
		        $nachtpreistext="Der Nachtpreis ist normal! (0,121 €/kWh-0,30 €/kWh)";
	}
	else
	{
		        $nachtpreistext="Der Nachtpreis ist hoch! (ab 0,30 €/kWh)";
	}
	// Achtung, in der Variable Datum MUSS bei "Eigene Aktion" mit + AUTOMATISCH ein AktionSkript erstellt werden!!
    RequestAction($datum_auswahl_id,strtotime("tomorrow")); // Datum auf Morgen umstellen für Preistabelle in Mail!!
    //Bei PHP "Diagramm Erstellen" muss eine Ereignisabfrage über das geänderte Datum gemacht werden!!!
    
    //hier wird gewartet, bis die Liste der Preise für morgen fertig erstellt wurde. Damit diese im Mail mitgesendet wird.
	IPS_Sleep(2000);
	$diagram=getvalue($preistabelle_html_id);
    //$diagram=getvalue(46983);
    //print_r ($diagram);
    //echo "\r\n";
	$mailtext="<html>Strompreisinformation für ".date("d.m.Y",$nextdayurl)."<br>Durchschnittspreis Tag: ".number_format($tagpreis,2,",",".")." €/kWh. ".$tagpreistext."<br>Durchschnittspreis Nacht: ".number_format($nachtpreis,2,",",".")." €/kWh. ".$nachtpreistext."<br>".$diagram."</html>";
    //print_r ($mailtext);
    //echo "\r\n";
    //IPS_Sleep(2000);
	SMTP_SendMailEx($mail_instanz_id,$mail1,"Strompreisinformation",$mailtext);
	SMTP_SendMailEx($mail_instanz_id,$mail2,"Strompreisinformation",$mailtext);
	// Achtung, in der Variable Datum MUSS bei "Eigene Aktion" mit + AUTOMATISCH ein AktionSkript erstellt werden!!
    RequestAction($datum_auswahl_id,time());    // Datum wird wieder auf Heute gestellt
    
}
else
{
	SMTP_SendMailEx($mail_instanz_id,"mail@chello.at","Fehler Awattar","Fehler bei Preisupdate");
}

Hier wird auch eine Mail ( SMTP-Mail muss vorher für das Senden angepasst werden! )
als Information der neuen Preise für Morgen als Tabelle verschickt!

In der PHP ist leider ein Rechenfehler bei der Nacht und Tagpreis Übergabe für das Energierechner Modul. Jahresrückblick hat mehrere hunderte € Differenz bei mir.
$verbrauch_netzentgelt und $verbrauch_abgabe müssten immer mit dem Verbrauch ( kWh ) multipliziert werden.
Somit können die Daten erst bei Tagesende für den Energierechner übermittelt werden,
da ist dann auch der Verbrauch bekannt.

Diagramm Erstellen:

<?php

// Diagramm erstellen

$diagramm_html_id=34283;
$diagramm_html_id2=46983;
$preistabelle_html_id=28164;
$anzeige_diagramm_tabelle_umschalten_id=51354;
$datum_auswahl_id=18501;
$tabelle_sortieren_code_id=24202;

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);

$i=0;
$datumvortag=date("Y-m-d",getvalue($datum_auswahl_id)-24*60*60);
$datum=date("Y-m-d",getvalue($datum_auswahl_id));
$datummorgen=date("Y-m-d",getvalue($datum_auswahl_id)+25*60*60);

$datenvor= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datumvortag."' order by stunde");
$daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datum."' order by stunde");
$datenmorgen= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datummorgen."' order by stunde");

$preis=array(array());
$preis_tabelle=array();
while($zeile = mysqli_fetch_object($daten))
{
    $zeilevor=mysqli_fetch_object($datenvor);
    $zeilemorgen=mysqli_fetch_object($datenmorgen);
    if ($datenvor->num_rows >0) $preis[$i][0]=$zeilevor->preis; else $preis[$i][0]=0;
    if ($daten->num_rows>0) $preis[$i][1]=$zeile->preis; else $preis[$i][1]=0;
    $preis_tabelle[$i]=$zeile->preis;
    if ($datenmorgen->num_rows>0) $preis[$i][2]=$zeilemorgen->preis; else $preis[$i][2]=0;
    $i++;
}


/* HTML Comments mit <!--...-->  
z.B. 
<script type="text/javascript">
<!--
function displayMsg() {
  alert("Hello World!")
}
//-->
*/
if ($i>0) 
{
    $html="
    <html>
    <head>
        <script type=\"text/javascript\" src=\"https://www.gstatic.com/charts/loader.js\"></script>
        <script type=\"text/javascript\">
        google.charts.load('current', {'packages':['bar']});
        google.charts.setOnLoadCallback(drawChart);

        function drawChart() {
            var data = google.visualization.arrayToDataTable([
            ['Stunde', '".date("d.m.Y",getvalue($datum_auswahl_id)-24*60*60)."', '".date("d.m.Y",getvalue($datum_auswahl_id))."', '".date("d.m.Y",getvalue($datum_auswahl_id)+25*60*60)."']";

    for ($i=0;$i<=23;$i++)
    {
        $html=$html.",".PHP_EOL."['".$i."-".$preis[$i][1]."',".number_format($preis[$i][0],7,".",",").",".number_format($preis[$i][1],7,".",",").",".number_format($preis[$i][2],7,".",",")."]";
    }
    $html=$html."
            ]);

            var options = {
            chart: {
                title: 'SmartEnergy',
                subtitle: 'Stuendliche Preise Eur/kWh inkl.Mst.',
            }
            };

            var chart = new google.charts.Bar(document.getElementById('columnchart_material'));

            chart.draw(data, google.charts.Bar.convertOptions(options));
        }
        </script>
    </head>
    
        <div id=\"columnchart_material\" style=\"width: 100%; height: 380px;\"></div>
    </body>
    </html>
    ";
}
else
{
    $html="
    <html>
<head>
<title></title>
</head>
<body>
<h2><span style=\"color:white;\"><span style=\"font-family:arial,helvetica,sans-serif;\">Keine Daten gefunden!</span></span></h2>
</body>
</html>
";
}
//HTML - Datei erzeugen
// Windows file_put_contents("c:\\Program Files\\Symcon\\webfront\\awattar.html",$html);
// Ubuntu  /usr/share/symcon/webfront/....
file_put_contents("/usr/share/symcon/webfront/awattar.html",$html);
// oder in Variable speichern
SetValue($diagramm_html_id2,$html);
//damit wird die Anzeige aktualisiert
setvalue($diagramm_html_id,"<center><iframe src=\"/awattar.html\" height=\"400px\" width=\"100%\" frameborder=\"0\"></iframe></center>");
mysqli_close($dbhandler);

//Übersicht Preise erstellen
$html=
'<html>
 <head>
 <link rel="stylesheet">
  <script>'.IPS_GetScriptContent($tabelle_sortieren_code_id).'</script>
 </head>
 <body>
<div>
  <table id="T1" class="wwx" border="1" style="width:30%;">
  <caption>Stündliche Preise für '.date("d.m.Y",getvalue($datum_auswahl_id)).'</caption>
   <thead class="blue">
    <tr>
     <th>Uhrzeit <button onclick="sortTable(0,1)">&uarr;</button><button onclick="sortTable(0,0)">&darr;</button></th>
     <th>Preis <button onclick="sortTable(1,1)">&uarr;</button><button onclick="sortTable(1,0)">&darr;</button></th>
    </tr>
   </thead>
   <tbody>';
for ($i=0;$i<=23;$i++)
{
    
    $html=$html.'<tr>';
    $html=$html.'<td>'.str_pad($i,2,0,STR_PAD_LEFT).'</td>';
    $html=$html.'<td>'.number_format($preis_tabelle[$i],7,",",".").'</td>';
	$html=$html.'</tr>';
}
$html=$html.'
   </tbody>
  </table>
  </div>
 </body>
</html>';

SetValue($preistabelle_html_id,$html);

Ermitteln der Ladezeiten für das automatische einschalten von Verbrauchern:
Hier werden Blockarrays ( ein Wert pro Stunde ) erstellt:
z.B. {„07.02.2024“:[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],„08.02.2024“:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
Die erste 1 bedeutet → Stunde 0 befindet sich im Minimum Toleranzbereich ( z.B. +10% ).

<?php

// Ermitteln der Ladezeiten für das automatische Schalten von Verbrauchern
// Und die Preiswerte für morgen ermitteln, wenn $tag=1 !! normal immer!!


$preistoleranz_id=33902;
$preistoleranz2_id=40321;
$ladezeiten_json_string_id=45016;
$MorgenMinPreis_id=51405;
$MorgenMinPreis_Prozent_Max_id=26766;
$MorgenMaxPreis_id=16813;
$MorgenMaxPreis_Prozent_Min_id=47656;
$HeuteMinPreis_id=36979;
$HeuteMinPreis_Prozent_Max_id=18818;
$HeuteMaxPreis_id=31287;
$HeuteMaxPreis_Prozent_Min_id=58429;

//keine Warnungen ausgeben
//error_reporting(0);
// wenn die Daten geholt werden, wird das Skript für den nächsten Tag $tag=1 geholt.
if ($_IPS["SENDER"]=="RunScript"){
	$tag=$_IPS["tag"]; // übernimmt bei Scriptaufruf im Script "Daten Abholen und Aufbereiten" den tag Wert
}
else
{
	$tag=0; // für Tests, wenn keine NEUEN Daten geholt ( vor 14UHr ), auf 0 = Heute ändern, sonst Fehlermeldungen!!
}
//echo $tag;    // 0= heute, -1= gestern, 1= Morgen
//  Preis für 
$minpreis=0;    // Minimumpreis am Tag
$maxpreis=0;    // Berechnete Maximale Preis vom $minpreis, $maxpreis=$minpreis*(1+$prozent/100); 
$maxpreis2=0;   // Maximale Preis vom Tag
$minpreis2=0;   // Berechnete untere Preis vom Maxpreis2, $minpreis2=$maxpreis2*(1+$prozent2/100);
$prozent=getvalue($preistoleranz_id); /*Toleranz*/
$prozent2=getvalue($preistoleranz2_id); /*Toleranz*/

$block=array(); /*hier kommen die Stunden rein, die in der Toleranz liegen */
$zeitfenster=0;
$k=0;  // ????

for ($i=0;$i<=23;$i++) {$block[$i]=0.0;} /*Block mit 24 Stunden auffüllen*/

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);


$datum=date("Y-m-d",time()+(24*60*60*$tag));
//echo $datum; // Heute Datum z.B. 2024-02-01
$datum_array=date("d.m.Y",time()+(24*60*60*$tag));
//echo $datum_array; // Heute Datum z.B. 01.02.2024
$vortag_array=date("d.m.Y",time()-(24*60*60));
//echo $vortag_array; // Vortag Datum z.B. 30.01.2024
$daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datum."' order by preis");
//print_r ($daten);
//Min- ergibt sich durch "order by preis" die $daten geordnet sind!!! 1.Datensatz = kleinste WERT
while($zeile = mysqli_fetch_object($daten))
{
	// Minpreis vom Tag ermitteln
    //print_r ($zeile);
    if ($minpreis==0)
	{
		$minpreis=$zeile->preis;
	}
	else
	{
		//min($minpreis,$zeile->preis);
        //max($maxpreis2,$zeile->preis);
        // Maxpreis ist der letzte Wert!!!
        $maxpreis2=$zeile->preis;   // Der letzte Wert = der maxilale Wert
        //print_r ($minpreis);
        //print_r ($maxpreis2);
        //echo "\r\n";
	}
}
// vom Minimalen Tagespreis, den MaxPreis berechnen laut Prozent!!
$maxpreis=$minpreis*(1+$prozent/100);
// vom Maximalen Tagespreis, den MinPreis berechnen laut Prozent!!
$minpreis2=$maxpreis2*(1-$prozent2/100);
if ($tag==1)    // wenn morgen, dann die Preise für Morgen sichern
    {
    SetValueFloat($MorgenMinPreis_id, $minpreis);
    SetValueFloat($MorgenMinPreis_Prozent_Max_id, $maxpreis);
    SetValueFloat($MorgenMaxPreis_id, $maxpreis2);
    SetValueFloat($MorgenMaxPreis_Prozent_Min_id, $minpreis2);
    }
    else        // sonst die Preise für Heute sichern
    {
    SetValueFloat($HeuteMinPreis_id, $minpreis);
    SetValueFloat($HeuteMinPreis_Prozent_Max_id, $maxpreis);
    SetValueFloat($HeuteMaxPreis_id, $maxpreis2);
    SetValueFloat($HeuteMaxPreis_Prozent_Min_id, $minpreis2);
    }

// Es gibt in der SQL Datenbank ein Problem mit Floatvariablen und gößer/gleich. Ein = funktioniert nicht.
$minpreis=$minpreis-0.0001;
$maxpreis=$maxpreis+0.0001;
// Es gibt in der SQL Datenbank ein Problem mit Floatvariablen und gößer/gleich. Ein = funktioniert nicht.
$minpreis2=$minpreis2-0.0001;
$maxpreis2=$maxpreis2+0.0001;

/*
echo $minpreis;
echo "\r\n";
echo $maxpreis;
echo "\r\n";
echo $minpreis2;
echo "\r\n";
echo $maxpreis2;
echo "\r\n";
*/
//Datensätze holen, wo die Preise in der Toleranz liegen und in das Blockarray schreiben. Das Blockarray ist dann die Basis für die Suche der zusammenhängenden Stunden
$daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datum."' and preis>=".number_format($minpreis,4,".",",")." and preis<=".number_format($maxpreis,4,".",",")." order by stunde");
//print_r ($daten);
//echo "\r\n";

while($zeile = mysqli_fetch_object($daten))
{
	$block[$zeile->stunde]=floatval($zeile->preis);
    //print_r ($block);
    //echo "\r\n";
}
mysqli_close($dbhandler);
$ladezeiten_json=getvalue($ladezeiten_json_string_id);
//print_r ($ladezeiten_json);  // z.B. {"07.02.2024":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"08.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
//echo "\r\n";
$ladezeiten=json_decode($ladezeiten_json,true);
/* z.B.
Array
(
    [07.02.2024] => Array
        (
            [0] => 1
            [1] => 1
            [2] => 1
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 0
            [8] => 0
            [9] => 0
            [10] => 0
            [11] => 0
            [12] => 0
            [13] => 0
            [14] => 0
            [15] => 0
            [16] => 0
            [17] => 0
            [18] => 0
            [19] => 0
            [20] => 0
            [21] => 0
            [22] => 0
            [23] => 0
        )

    [08.02.2024] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 0
            [8] => 0
            [9] => 0
            [10] => 0
            [11] => 0
            [12] => 0
            [13] => 0
            [14] => 0
            [15] => 0
            [16] => 0
            [17] => 0
            [18] => 0
            [19] => 0
            [20] => 0
            [21] => 0
            [22] => 0
            [23] => 0
        )

)
*/
//print_r ($ladezeiten);
//echo "\r\n";

//Vortag löschen
unset($ladezeiten[$vortag_array]);

//Ladezeiten in Array schreiben
/*$i=0;
foreach($block as $zeitpunkt)
{
    if ($zeitpunkt>0) $ladezeiten[$datum_array][$i]=1; else $ladezeiten[$datum_array][$i]=0;
    $i++;
}*/
$i=0;
foreach($block as $zeitpunkt)
{
    //print_r ($block);
    //echo "\r\n",$i,"\r\n";
    //print_r ($zeitpunkt);
    //echo "\r\n";
    /* z.B.
Array
(
    [0] => 0.068148
    [1] => 0.06336
    [2] => 0.06228
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 0
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
)

0
    */
    if ($zeitpunkt>0)
        {
            $ladezeiten[$datum_array][$i]=1;    // z.B. Ist kein Wert bei Zeitpunkt $ladezeiten=0 -> {"07.02.2024":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"08.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
        }
        else
        {
            $ladezeiten[$datum_array][$i]=0;    // z.B. Ist ein Wert bei Zeitpunkt $ladezeiten=1 -> {"07.02.2024":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"08.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
        }
    $i++;
}
// Variable schreiben
setvalue($ladezeiten_json_string_id,json_encode($ladezeiten));


Ermitteln der Maximalzeiten für das automatische einschalten von Einspeisung:
Hier werden Blockarrays ( ein Wert pro Stunde wie bei den Minimumwerten ) erstellt, für die Maximal Werte.
Verwende ich für das Nulleinspesen ( minimierten oder keinen Grund-Verbrauch zu dieser Stunde ) mit meinen Mikrowechselrichter ( Open-DTU ).

<?php

// Ermitteln der Maximalzeiten für das automatische Einspeisen ins HeimNetz ( Ziel kein Verbrauch)

$preistoleranz_id=33902;
$preistoleranz2_id=40321;
$ladezeiten_json_string_id=34291;
//keine Warnungen ausgeben
//error_reporting(0);
// wenn die Daten geholt werden, wird das Skript für den nächsten Tag $tag=1 geholt.
if ($_IPS["SENDER"]=="RunScript"){
	$tag=$_IPS["tag"]; // übernimmt bei Scriptaufruf im Script "Daten Abholen und Aufbereiten" den tag Wert
}
else
{
	$tag=1; // für Tests, wenn keine NEUEN Daten geholt ( vor 14UHr ), auf 0 = Heute ändern, sonst Fehlermeldungen!!
}
//echo $tag;    // 0= heute, -1= gestern, 1= Morgen
//  Preis für 
$minpreis=0;    // Minimumpreis am Tag
$maxpreis=0;    // Berechnete Maximale Preis vom $minpreis, $maxpreis=$minpreis*(1+$prozent/100); 
$maxpreis2=0;   // Maximale Preis vom Tag
$minpreis2=0;   // Berechnete untere Preis vom Maxpreis2, $minpreis2=$maxpreis2*(1+$prozent2/100);
$prozent=getvalue($preistoleranz_id); /*Toleranz*/
$prozent2=getvalue($preistoleranz2_id); /*Toleranz*/

$block=array(); /*hier kommen die Stunden rein, die in der Toleranz liegen */
$zeitfenster=0;
$k=0;  // ????

for ($i=0;$i<=23;$i++) {$block[$i]=0.0;} /*Block mit 24 Stunden auffüllen*/

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);


$datum=date("Y-m-d",time()+(24*60*60*$tag));
//echo $datum; // Heute Datum z.B. 2024-02-01
$datum_array=date("d.m.Y",time()+(24*60*60*$tag));
//echo $datum_array; // Heute Datum z.B. 01.02.2024
$vortag_array=date("d.m.Y",time()-(24*60*60));
//echo $vortag_array; // Vortag Datum z.B. 30.01.2024
$daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datum."' order by preis");
//print_r ($daten);
//Min- ergibt sich durch "order by preis" die $daten geordnet sind!!! 1.Datensatz = kleinste WERT
while($zeile = mysqli_fetch_object($daten))
{
	// Minpreis vom Tag ermitteln
    //print_r ($zeile);
    if ($minpreis==0)
	{
		$minpreis=$zeile->preis;
	}
	else
	{
		//min($minpreis,$zeile->preis);
        //max($maxpreis2,$zeile->preis);
        // Maxpreis ist der letzte Wert!!!
        $maxpreis2=$zeile->preis;   // Der letzte Wert = der maxilale Wert
        //print_r ($minpreis);
        //print_r ($maxpreis2);
        //echo "\r\n";
	}
}
// vom Minimalen Tagespreis, den MaxPreis berechnen laut Prozent!!
$maxpreis=$minpreis*(1+$prozent/100);
// Es gibt in der SQL Datenbank ein Problem mit Floatvariablen und gößer/gleich. Ein = funktioniert nicht.
$minpreis=$minpreis-0.0001;
$maxpreis=$maxpreis+0.0001;
// vom Maximalen Tagespreis, den MinPreis berechnen laut Prozent!!
$minpreis2=$maxpreis2*(1-$prozent2/100);
// Es gibt in der SQL Datenbank ein Problem mit Floatvariablen und gößer/gleich. Ein = funktioniert nicht.
$minpreis2=$minpreis2-0.0001;
$maxpreis2=$maxpreis2+0.0001;
/*
echo $minpreis;
echo "\r\n";
echo $maxpreis;
echo "\r\n";
echo $minpreis2;
echo "\r\n";
echo $maxpreis2;
echo "\r\n";
*/
//Datensätze holen, wo die Preise in der Toleranz liegen und in das Blockarray schreiben. Das Blockarray ist dann die Basis für die Suche der zusammenhängenden Stunden
$daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datum."' and preis>=".number_format($minpreis2,4,".",",")." and preis<=".number_format($maxpreis2,4,".",",")." order by stunde");
//print_r ($daten);
//echo "\r\n";

while($zeile = mysqli_fetch_object($daten))
{
	$block[$zeile->stunde]=floatval($zeile->preis);
    //print_r ($block);
    //echo "\r\n";
}
mysqli_close($dbhandler);
$ladezeiten_json=getvalue($ladezeiten_json_string_id);
//print_r ($ladezeiten_json);  // z.B. {"07.02.2024":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"08.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
//echo "\r\n";
$ladezeiten=json_decode($ladezeiten_json,true);
/* z.B.
Array
(
    [07.02.2024] => Array
        (
            [0] => 1
            [1] => 1
            [2] => 1
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 0
            [8] => 0
            [9] => 0
            [10] => 0
            [11] => 0
            [12] => 0
            [13] => 0
            [14] => 0
            [15] => 0
            [16] => 0
            [17] => 0
            [18] => 0
            [19] => 0
            [20] => 0
            [21] => 0
            [22] => 0
            [23] => 0
        )

    [08.02.2024] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 0
            [8] => 0
            [9] => 0
            [10] => 0
            [11] => 0
            [12] => 0
            [13] => 0
            [14] => 0
            [15] => 0
            [16] => 0
            [17] => 0
            [18] => 0
            [19] => 0
            [20] => 0
            [21] => 0
            [22] => 0
            [23] => 0
        )

)
*/
//print_r ($ladezeiten);
//echo "\r\n";

//Vortag löschen
unset($ladezeiten[$vortag_array]);

//Ladezeiten in Array schreiben
/*$i=0;
foreach($block as $zeitpunkt)
{
    if ($zeitpunkt>0) $ladezeiten[$datum_array][$i]=1; else $ladezeiten[$datum_array][$i]=0;
    $i++;
}*/
$i=0;
foreach($block as $zeitpunkt)
{
    //print_r ($block);
    //echo "\r\n",$i,"\r\n";
    //print_r ($zeitpunkt);
    //echo "\r\n";
    /* z.B.
Array
(
    [0] => 0.068148
    [1] => 0.06336
    [2] => 0.06228
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 0
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
)

0
    */
    if ($zeitpunkt>0)
        {
            $ladezeiten[$datum_array][$i]=1;    // z.B. Ist kein Wert bei Zeitpunkt $ladezeiten=0 -> {"07.02.2024":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"08.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
        }
        else
        {
            $ladezeiten[$datum_array][$i]=0;    // z.B. Ist ein Wert bei Zeitpunkt $ladezeiten=1 -> {"07.02.2024":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"08.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
        }
    $i++;
}
// Variable schreiben
setvalue($ladezeiten_json_string_id,json_encode($ladezeiten));


Erstellung einer HTML Ausgabe für die Ladezeiten:
Ist recht praktisch, eine Tabelle ( wie bei einem vorigen Post zu sehen ) mit grünen markierten Preiszohnen ( Min. Wert + Tol z.B. +10% ).
Diese können aber mit drücken auf eine Preiszohne ( Stunde ) in der View wieder geändert werden.
Die Tabelle muss halt, mit Aufruf dieser PHP, wieder aktualisiert werden.
Hab da ein Butten ( refesch Tabelle ) verwendet.

<?php

// Erstellung einer HTML Ausgabe für die Ladezeiten
// Achtung, wenn neuer Tag beginnt ist Preis für den nächsten Tag noch nicht vorhanden und dann auf 0.00!!
// 


$ladezeiten_html_id=26258;
$ladezeiten_json_string_id=45016;

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);

$ladezeiten_json=getvalue($ladezeiten_json_string_id);
$ladezeiten=json_decode($ladezeiten_json,true);

//Tabelle erstellen
// hook/autoladen wird im HTML Script bearbeitet

$html="";
$html=$html."<html><head><link rel=\"stylesheet\" href=\"../skins/WwXSkin/webfront.css\"></head>";
$html=$html."<script>
                      function einaus(DAT,HOUR) {
                        window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest(); HTTP.open('GET',o.url,true);HTTP.send(); }; window.xhrGet({ url: 'hook/autoladen?DAT='+DAT+'&HOUR='+HOUR });
                      }
                      </script>";
$html=$html."<center><table class=\"wwx\" style=\"width:100%\">";
$html = $html."<tr>";
$html = $html."<thead class=\"blue\">
                <th style=\"border:0;width:4%\"><center>Datum</center></th>";
for ($i=0;$i<=23;$i++)
{
    $html=$html."<th style=\"border:0;width:4%\"><center>".$i."</center></th>";
}                             
$html = $html."</thead></tr>";

//???
$test=1;

// $ladezeiten = geholt vom String $ladezeiten=json_decode($ladezeiten_json,true);
// dieser String ist z.B. "{"01.02.2024":[0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],"02.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}"
// vor 14Uhr "{"01.02.2024":[0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],"02.02.2024":[0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0]}"
// nach PHP Ausführung
// $tag = "01.02.2024"
// $value Array 
/*
Array
(
    [0] => 0
    [1] => 0
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 1
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
)
02.02.2024
Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 0
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
)
*/

foreach ($ladezeiten as $tag=>$value)
{
    /*
    echo $tag;
    echo "\r\n";
    print_r ($value); // Arrays könen ausgegeben werden, Echo geht nicht
    //echo "\r\n";
    */
    $html = $html."<tr>";
    $html = $html."<td style=\"border:0;background-color: rgb(0, 160, 255)\"><center>".date("d.m.",strtotime($tag))."</center></td>";
    $i=0;
    $daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".date("Y-m-d",strtotime($tag))."' and stunde=".$i);
    foreach($ladezeiten[$tag] as $zeitpunkt)
    {
        $daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".date("Y-m-d",strtotime($tag))."' and stunde=".$i);
        $zeile = mysqli_fetch_object($daten);
        if ($zeitpunkt==1) $Farbe="green"; else $Farbe="white";
		if ($zeitpunkt==1) $sFarbe="yellow"; else $sFarbe="black";
        $html=$html."<td style=\"padding:0px;border:0\"><center><button style=\";width:100%;height:35px;font-size:12px;color:".$sFarbe.";background-color:".$Farbe.";border:none\" onclick=\"einaus('".$tag."','".$i."')\">".number_format($zeile->preis*100,2,",",".")."</button></center></td>";
        $i++;
    }
    $html = $html."</tr>";
}
$html=$html."</table></center></html>";
setvalue($ladezeiten_html_id,$html);
mysqli_close($dbhandler);

/// Test HTML Tabelle

//$diagramm_html_id2=46983; // HTML
//$diagram=getvalue($diagramm_html_id2);
//print_r ($diagram); // Arrays könen ausgegeben werden, Echo geht nicht


Erstellung einer HTML Ausgabe für die Maximalzeiten:
Das selbe wie bei den minimum Preiszeiten ( vorherige PHP ).

<?php

// Erstellung einer HTML Ausgabe für die Einspeisezeiten
// Achtung, wenn neuer Tag beginnt ist Preis für den nächsten Tag noch nicht vorhanden und dann auf 0.00!!
// 


$ladezeiten_html_id=57887;
$ladezeiten_json_string_id=34291;

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);

$ladezeiten_json=getvalue($ladezeiten_json_string_id);
$ladezeiten=json_decode($ladezeiten_json,true);

//Tabelle erstellen
// hook/einspeisen wird im HTML Script bearbeitet

$html="";
$html=$html."<html><head><link rel=\"stylesheet\" href=\"../skins/WwXSkin/webfront.css\"></head>";
$html=$html."<script>
                      function einaus(DAT,HOUR) {
                        window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest(); HTTP.open('GET',o.url,true);HTTP.send(); }; window.xhrGet({ url: 'hook/einspeisen?DAT='+DAT+'&HOUR='+HOUR });
                      }
                      </script>";
$html=$html."<center><table class=\"wwx\" style=\"width:100%\">";
$html = $html."<tr>";
$html = $html."<thead class=\"blue\">
                <th style=\"border:0;width:4%\"><center>Datum</center></th>";
for ($i=0;$i<=23;$i++)
{
    $html=$html."<th style=\"border:0;width:4%\"><center>".$i."</center></th>";
}                             
$html = $html."</thead></tr>";

//???
$test=1;

// $ladezeiten = geholt vom String $ladezeiten=json_decode($ladezeiten_json,true);
// dieser String ist z.B. "{"01.02.2024":[0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],"02.02.2024":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}"
// vor 14Uhr "{"01.02.2024":[0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],"02.02.2024":[0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0]}"
// nach PHP Ausführung
// $tag = "01.02.2024"
// $value Array 
/*
Array
(
    [0] => 0
    [1] => 0
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 1
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
)
02.02.2024
Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 0
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
)
*/

foreach ($ladezeiten as $tag=>$value)
{
    /*
    echo $tag;
    echo "\r\n";
    print_r ($value); // Arrays könen ausgegeben werden, Echo geht nicht
    //echo "\r\n";
    */
    $html = $html."<tr>";
    $html = $html."<td style=\"border:0;background-color: rgb(0, 160, 255)\"><center>".date("d.m.",strtotime($tag))."</center></td>";
    $i=0;
    $daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".date("Y-m-d",strtotime($tag))."' and stunde=".$i);
    foreach($ladezeiten[$tag] as $zeitpunkt)
    {
        $daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".date("Y-m-d",strtotime($tag))."' and stunde=".$i);
        $zeile = mysqli_fetch_object($daten);
        if ($zeitpunkt==1) $Farbe="red"; else $Farbe="white";
		if ($zeitpunkt==1) $sFarbe="white"; else $sFarbe="black";
        $html=$html."<td style=\"padding:0px;border:0\"><center><button style=\";width:100%;height:35px;font-size:12px;color:".$sFarbe.";background-color:".$Farbe.";border:none\" onclick=\"einaus('".$tag."','".$i."')\">".number_format($zeile->preis*100,2,",",".")."</button></center></td>";
        $i++;
    }
    $html = $html."</tr>";
}
$html=$html."</table></center></html>";
setvalue($ladezeiten_html_id,$html);
mysqli_close($dbhandler);

/// Test HTML Tabelle

//$diagramm_html_id2=46983; // HTML
//$diagram=getvalue($diagramm_html_id2);
//print_r ($diagram); // Arrays könen ausgegeben werden, Echo geht nicht


Sortierung: Achtung ohne <?php!!
Ist eine art Unterprogramm.

function sortTable(column,updown) {
  var table, rows, switching, i, x, y, shouldSwitch;
  table = document.getElementById("T1");
  switching = true;
  /*Make a loop that will continue until
  no switching has been done:*/
  while (switching) {
    //start by saying: no switching is done:
    switching = false;
    rows = table.rows;
    /*Loop through all table rows (except the
    first, which contains table headers):*/
    for (i = 1; i < (rows.length - 1); i++) {
      //start by saying there should be no switching:
      shouldSwitch = false;
      /*Get the two elements you want to compare,
      one from current row and one from the next:*/
      x = rows[i].getElementsByTagName("TD")[column];
      y = rows[i + 1].getElementsByTagName("TD")[column];
      //check if the two rows should switch place:
      if (updown === 0){
      	if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
        	//if so, mark as a switch and break the loop:
        	shouldSwitch = true;
        	break;
      	}
      }
      if (updown === 1){
      	if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
        	//if so, mark as a switch and break the loop:
        	shouldSwitch = true;
        	break;
      	}
      }
    }
    if (shouldSwitch) {
      /*If a switch has been marked, make the switch
      and mark that a switch has been done:*/
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
    }
  }
}

Automatisches Schalten der Verbraucher:
Hier schalte ich in den Minimum Preiszohnen, meine Verbraucher ( Tasmota Steckdosen ).

<?php

// Automatisches Schalten der Verbraucher

//IPS_Sleep(2000);
$datum=date("d.m.Y",time());
//echo $datum;

$stunde=date("G",time());
//echo $stunde;
IPS_Sleep(2000);    // Verzögerung wegen Strompreis vergleich notwendig
$ladezeiten_json_string_id=45016;
$ladezeiten_json=getvalue($ladezeiten_json_string_id);
$ladezeiten=json_decode($ladezeiten_json,true);
//echo $ladezeiten;
$laden_aktiv=getvalue(41215);   // Schalten aktivieren
// Steckdosen Tasmota in Billigen Zeiten Automatisch Schalten
$Tasmota_WZ45_VZ_E_Bike_Laden_id=48100; // Steckdose einschalten
$Tasmota_WZ53_BAD_Warmwasserboiler_id= 51660;   // Steckdose einschalten
$Tasmota_WZ59_Lader_PV_id=46149;    // Steckdose einschalten
$Tasmota_WZ45_VZ_E_Bike_Laden=GetValueBoolean(48100);   // Geschaltet
$Tasmota_WZ53_BAD_Warmwasserboiler=GetValueBoolean(51660);  // Geschaltet
$Tasmota_WZ59_Lader_PV=GetValueBoolean(46149);  // Geschaltet
//$HeuteMinPreis_Prozent_Max=GetValueFloat(18818);    // Minpreis Fenster Max Wert
$Heute_MaxPreis_Akku_Laden=GetValueFloat(29097);    // Limit unter dass $HeuteMinPreis_Prozent_Max sein muss Akku Laden
$AkkuLadenEin=GetValueBoolean(24630);   // Akku Laden Aktivieren ( gemeinasam mit $laden_aktiv )
$Betreiber_Stündliche_Tarif=GetValueFloat(33199);   // der jetzige Sunden Tarif
//$wallboxaktiv_id=47587;

//$ladestandaktuell=getvalue(46936);
//$ladestandsoll=getvalue(48017);

//if (array_key_exists($datum,$ladezeiten) and $ladestandaktuell<=$ladestandsoll)
if (array_key_exists($datum,$ladezeiten))
{
    $ladevorgang=$ladezeiten[$datum][$stunde];
    //echo $ladevorgang;
}
else
{
    $ladevorgang=0;
}

//echo $ladevorgang;
if ($ladevorgang==1)
{
    //Steckdose EIN
    //echo "jj";
    SetValueBoolean(38838, $ladevorgang);
    if ($laden_aktiv==1)
    {
        //Global_Log_Eintrag_erstellen("NOTIFY","go-e","go-e Ladevorgang gestartet");
        if ($Tasmota_WZ45_VZ_E_Bike_Laden==false) RequestAction($Tasmota_WZ45_VZ_E_Bike_Laden_id, true);
        if ($Tasmota_WZ53_BAD_Warmwasserboiler==false) RequestAction($Tasmota_WZ53_BAD_Warmwasserboiler_id, true);
        //echo $Betreiber_Stündliche_Tarif;
        //echo "\r\n";
        //echo $Heute_MaxPreis_Akku_Laden;
        if (($Betreiber_Stündliche_Tarif)<=($Heute_MaxPreis_Akku_Laden))  // Wenn der Stundentarif unter dem Preislimit z.B. 0.075€
        {
            if (($AkkuLadenEin==1)and($Tasmota_WZ59_Lader_PV==false)) RequestAction($Tasmota_WZ59_Lader_PV_id, true);     // Akku LADEN, gebunden wo Tabelle grün ist ( ladevorgang==1 )!!
            //echo "hallo";
        }
        //echo $laden_aktiv;
        //IPS_Sleep(25000);
        //RequestAction($wallboxaktiv_id, true);
    }
}
else
{
    //Steckdose AUS
    //
    SetValueBoolean(38838, $ladevorgang);
    if ($laden_aktiv==1) 
    {
        //Global_Log_Eintrag_erstellen("NOTIFY","go-e","go-e Ladevorgang beendet");
        // Nur Ausschalten, wenn eingeschaltet!!
        if ($Tasmota_WZ45_VZ_E_Bike_Laden==true) RequestAction($Tasmota_WZ45_VZ_E_Bike_Laden_id, false);
        if ($Tasmota_WZ53_BAD_Warmwasserboiler==true) RequestAction($Tasmota_WZ53_BAD_Warmwasserboiler_id, false);
        if ($Tasmota_WZ59_Lader_PV==true) RequestAction($Tasmota_WZ59_Lader_PV_id, false); 
        //echo $laden_aktiv;
    }
}
//echo "hallo";

Automatisches Schalten Einspeisen:
Hier wird in den Maximalen Preiszohnen, wenn diese 60% über 7,5cent sind,
mein Mikrowechselrichter aktiviert ( hängt an 50,12V LiFePo Akku ).

<?php

// Automatisches Einspeisen


$datum=date("d.m.Y",time());
//echo $datum;

$stunde=date("G",time());
//echo $stunde;
// Verzögerung wegen Daten Neustand
IPS_Sleep(2000);
$ladezeiten_json_string_id=34291;
$ladezeiten_json=getvalue($ladezeiten_json_string_id);
$ladezeiten=json_decode($ladezeiten_json,true);
//echo $ladezeiten;
$laden_aktiv=getvalue(58648);
// Einspeisen in teuren Zeiten Automatisch Schalten
//$Tasmota_WZ45_VZ_E_Bike_Laden_id=48100;
//$Tasmota_WZ53_BAD_Warmwasserboiler_id= 51660;
//$wallboxaktiv_id=47587;

//$ladestandaktuell=getvalue(46936);
//$ladestandsoll=getvalue(48017);
// HM-800 als Einspeise WR
$WR_schalten_id=29925;  // WR Schalten
$WR_regelung_Shelly3EM_id=17559;    //WR Regelung
$WR_schalten=GetValueBoolean(29925);    // Geschaltet?
$WR_regelung_Shelly3EM=GetValueBoolean(17559);  // Geschaltet?
//$Heute_MaxPreis_Prozent_Min=GetValueFloat(58429);   // Der heutige Maxpreis minus der Prozent
$Heute_MaxPreis_Einspeisen=GetValueFloat(30560);    // Berechnete Wert = vom Minimalen Akkuladen * Prozent
$Betreiber_Stündliche_Tarif=GetValueFloat(33199);   // der jetzige Sunden Tarif

//if (array_key_exists($datum,$ladezeiten) and $ladestandaktuell<=$ladestandsoll)
if (array_key_exists($datum,$ladezeiten))   // relevant, wenn nachfolfende IF "Preis muss über einen Wert sein, sonst keine Einspeisung" dies zulässt!!!
{
    $ladevorgang=$ladezeiten[$datum][$stunde];  // Maxtabelle ist zu dieser Stunde Rot
    //echo $ladevorgang;
}
else
{
    $ladevorgang=0;
}
if ($Betreiber_Stündliche_Tarif<$Heute_MaxPreis_Einspeisen)  // Preis muss über einen Wert sein, sonst keine Einspeisung!!!
{
    $ladevorgang=0;
    //echo "hallo";
}

if ($ladevorgang==1)
{
    //Einspeisen EIN
    //echo "jj";
    SetValueBoolean(26006, $ladevorgang);
    if ($laden_aktiv==1)
    {
        //Global_Log_Eintrag_erstellen("NOTIFY","go-e","go-e Ladevorgang gestartet");
        RequestAction($WR_schalten_id, true);
        IPS_Sleep(6000);
        RequestAction($WR_regelung_Shelly3EM_id, true);
        //echo $laden_aktiv;
        //IPS_Sleep(25000);
        //RequestAction($wallboxaktiv_id, true);
    }
}
else
{
    //Einspeisen AUS
    //
    SetValueBoolean(26006, $ladevorgang);
    if ($laden_aktiv==1) 
    {
        //Global_Log_Eintrag_erstellen("NOTIFY","go-e","go-e Ladevorgang beendet");
        // Kontrolle, ob eingeschaltet
        if ($WR_schalten==true) RequestAction($WR_schalten_id, false);
        if ($WR_regelung_Shelly3EM==true) RequestAction($WR_regelung_Shelly3EM_id, false);
        //echo $laden_aktiv;
    }
}
//echo "hallo";



Erstellen von Web Hooks, für die Markierungen in der HTML Tabelle.
Hier kann, nach der automatischen grün und rot Markierung, diese noch angepasst werden!!!
Einspeisezeiten ändern in HTML Tabelle über Webhook:

<?php

// Einspeisezeiten ändern in HTML Tabelle über Webhook


$ladezeiten_json_string_id=34291;

if($_IPS['SENDER'] == 'WebHook') {
   $datum=$_GET["DAT"];
   $stunde=$_GET["HOUR"];
}
if ($datum!="" and $stunde!="")
{
   
   $ladezeiten_json=getvalue($ladezeiten_json_string_id);
   $ladezeiten=json_decode($ladezeiten_json,true);
   if ($ladezeiten[$datum][$stunde] == 0) $ladezeiten[$datum][$stunde]=1; else $ladezeiten[$datum][$stunde]=0;
   setvalue(34291,json_encode($ladezeiten));
   //IPS_RunScript(15859);
}

Ladezeiten ändern in HTML Tabelle über Webhook:

<?php

// Ladezeiten ändern in HTML Tabelle über Webhook


$ladezeiten_json_string_id=45016;

if($_IPS['SENDER'] == 'WebHook') {
   $datum=$_GET["DAT"];
   $stunde=$_GET["HOUR"];
}
if ($datum!="" and $stunde!="")
{
   
   $ladezeiten_json=getvalue($ladezeiten_json_string_id);
   $ladezeiten=json_decode($ladezeiten_json,true);
   if ($ladezeiten[$datum][$stunde] == 0) $ladezeiten[$datum][$stunde]=1; else $ladezeiten[$datum][$stunde]=0;
   setvalue(45016,json_encode($ladezeiten));
   IPS_RunScript(22566);
}

Stündlichen Tarife einzeln pro Stunde nach Symcon:
Hier werden die EnergiePreise, jede Stunde in eine Variable übertragen.

<?php

// Jede Stunde den aktuellen Tarif holen und in Symcon Speichern
$Betreiber_Stündliche_Tarif_id=33199;
$Betreiber_Stündliche_Tarif_mit_Netzgebühren_id=53043;

//$datum=date("d.m.Y",time());
//echo $datum;
$Betreiber_Stündliche_Tarif=0.0;
$stunde=0;
$stunde_jetzt=date("G",time());   // z.B. 5:05 Zeit ist 5 die Stunde
//echo $stunde;

$sqlserver=getvalue(43070);
$user=getvalue(43439);
$password=getvalue(44253);
$database=getvalue(11102);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);    // DB verbinden
$tag=0;     // 0 = Heute

$datum=date("Y-m-d",time()+(24*60*60*$tag));
//echo $datum; // Heute Datum z.B. 2024-02-01
$datum_array=date("d.m.Y",time()+(24*60*60*$tag));
//echo $datum_array; // Heute Datum z.B. 01.02.2024
//$vortag_array=date("d.m.Y",time()-(24*60*60));
//echo $vortag_array; // Vortag Datum z.B. 30.01.2024
$daten= mysqli_query($dbhandler,"select * from smartenergy where datum='".$datum."' order by stunde");
//print_r ($daten);
//Min- ergibt sich durch "order by preis" die $daten geordnet sind!!! 1.Datensatz = kleinste WERT

while($zeile = mysqli_fetch_object($daten))
{
	// Stundenpreis ermiteln
    $stunde=$zeile->stunde;     // Stunde für Stunde durch DB
    if ($stunde==$stunde_jetzt) // bis die jetzige Stunde erreicht ist
	{
		$Betreiber_Stündliche_Tarif=$zeile->preis;  // Den Preis dieser Stunde holen
        //print_r ($Betreiber_Stündliche_Tarif);
        //echo "\r\n";
	}
}

SetValueFloat($Betreiber_Stündliche_Tarif_id, $Betreiber_Stündliche_Tarif); // den jetzigen preis speichern

mysqli_close($dbhandler);   // DB schließen


Datum auswählen Heute gestern und morgen:
Hier wird nur jeden Tag nach Mitternacht, das neue Datum in die Variable übertragen.

<?php

// Testhalber, da keine Eingabe in View
// Das heutige Datum um 0Uhr neu setzen

// welcher Tag geholt werden soll. 0 = aktueller tag, -1 = vortag, 1 = nächster tag
// die neuen Werte werden jeden Tag um 14:30 für den nächsten Tag geholt
//$tag=getvalue(20907);
$tag=0;
$datum_auswahl_id=18501; // Variable 

$datum=date("Y-m-d",time()+(24*60*60*$tag)); // je nach tag berechnet

//echo $datum; //Datum ist ein String!
// strtotime = umwandeln in Unix Timestamp
SetValueInteger($datum_auswahl_id, strtotime($datum));

Bin dann mal ab 15.03. auf Urlaub und ab 25.03. wieder daheim. :wink:
Hoffe, ihr könnt eure Einbindung auch erfolgreich abschließen

LG Willi

1 „Gefällt mir“

Ja, wir sollten in April, unser nächstes Stammtisch Treffen organisieren :beers:
Vielleicht kann das Andreas ( Brownson ) diesmal übernehmen,
da ich in Urlaub bin :wink:

LG Willi

Ich verwende Symcon in einer Ubuntu Umgebung.
Wenn Windows verwendet wird, muss in PHP Skript „Diagramm Erstellen“ bei
//HTML - Datei erzeugen, für Windows file_put_contents(„c:\Program Files\Symcon\webfront\awattar.html“,$html); aktiviert werden.
Dafür das für Ubuntu Auskommentiert werden.

setvalue($diagramm_html_id,"<center><iframe src=\"/awattar.html\" height=\"400px\" width=\"100%\" frameborder=\"0\"></iframe></center>");

Auch muss bei Windows vor awattar.html das / entfernt werden!

Auch gibt es anscheinend bei Windows bei dem Befehl:
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);
ein Problem.
Weis nicht ob dieser Link für die Lösung schon veraltet ist?
MySQL Verbindungs Fehler

LG Willi

habs mit der dll von @hfichtinger mal hinbekommen jetzt liegt es noch an der Verbindung zum SQL.

danke mal

Eventuell kann dir da ja Helmut helfen?!
LG Willi

Würde mich freuen, wenn wir im April ein Treffen schaffen. Ich werde 70 und gebe eine runde aus.
lg

1 „Gefällt mir“

OK, dann werf ich mal den 12. April und den 19. April ins Rennen :grinning:

Wieder mal Gwölb oder wieder Altes Zollhaus?

Also ich wäre für 19. April. Am 12. ist Craft Beer Fest in Wien :beers: :grin:
Und meine Stimme geht an das Gwölb, weil uriger.
Liebe Grüße

19.April kling gut. Würde euch da gerne mal wieder besuchen kommen.
So als Idee, In der Firma is im Moment ziemlich viele los und ich dauernd unterwegs, kann daher nicht fix zusagen. Sollte aber passen.

Bernhard

19.4 ging bei mir auch. Lg

Hallo, für mich ist auch der 19. im Gwölb OK.
LG Willi

19.04 geht bei mir auch :+1:
Das alte Zollhaus ist mir vom Essen her viel lieber, als getoastete € 13,- Brote :smile:
Aber grundsätzlich sind mir beide Lokale recht.

LG Peter

servus. 19.4 passt bei mir auch :slight_smile: x2 lg

Auch mir passt der 19.
Lokal ist mir beides Recht.
lg Walter

Ich würde vorschlagen, wir fixieren den 19.04. im Gwölb ab 17Uhr.
Da es nicht mehr so kalt ist, werde ich für draußen einen Tisch bestellen.
Momentan sind gerri1984, Loewenkoenig, zonex, bbernhard, Rubberduck, Brownson, walter21031 und ich dabei ( 8 Personen ).
Morgen sind wieder - Strompreise :star_struck:
Geld für den Verbrauch :wink:
LG Willi

1 „Gefällt mir“

Ja, mein Spring steckt schon seit gestern und wartet :slight_smile:
Ich werde da leider nicht dabei sein.

Ich als Warmduscher würde vorschlagen, wir verlagern unseren Freitag von draußen nach drinnen. Es soll am Freitag Abend 9 Grad haben :cold_face:. Willi, kannst du uns drinnen einen Tisch besorgen?