Stromzähler


Allgemeine Informationen

Wir möchten euch hier kurz zeigen, wie wir unseren Drehstromzähler mithilfe eines Mikrocontrollers auslesen und die Daten an eine Datenbank übertragen. Um die persönlichen Verbrauchswerte über die optische Schnittstelle erfassen zu können, müssen diese durch die Eingabe des jeweiligen Pin über die selbige Schnittstelle freigegeben werden. Den Pin erhaltet Ihr vom Eigentümer des Stromzählers.


Inhaltsverzeichnis


Die Hardware

Stromzähler

TYP: Itron 3.HZ-AC-D1-A1

Mikrocontroller

Typ: Wemos D1 Mini Pro

Platine

Kleine Platine mit Anschlüsse für den Lesekopf und 2 Status Led`s

IR Lesekopf

Typ: Hichi IR v1.1

Das SML Protokoll

Hier die HEX Werte die der Stromzähler jede Sekunde über die optische Schnittstelle ausgibt.

Hierbei sind folgende Hex-Werte für die einzelnen Sequenzen für uns interessant
  • Start Sequenzen: 1B 1B 1B 1B 01 01 01 01
  • Such-Sequenzen Gesamtverbrauch KWH: 77 07 01 00 01 08 00 FF 65 00 1C 81 04 01 62 1E 52 FF 69 00 00 00 00
    --> Nächsten 4 Hex-Werte Gesamtverbrauch in Wh
  • Such-Sequenzen aktuelle Leistung Watt: 77 07 01 00 10 07 00 FF 01 01 62 1B 52 00 55
    --> Nächsten 4 Hex-Werte Leistung in Watt
  • Stop Sequenzen: 1B 1B 1B 1B 1A

HEX-Werte

1B 1B 1B 1B
1 1 1 1
76
  9 B7 9D F4 5 8 F1 4C 93
  62 0
  62 0
  72
    65 0 0 1 1
    76
      1
      1
      9 0 0 0 0 8 EF B7 3D B
      XX XX XX XX XX XX XX XX XX XX
      72 62 1 65 8 EF B9 7E 1 63 21 2C 0
76
  9 B7 9D F4 5 8 F1 4C 94
  62 0
  62 0
  72
    65 0 0 7 1
    77
      1
      B XX XX XX XX XX XX XX XX XX XX
      7 1 0 62 A FF FF
      72
        62 1
        65 8 EF B9 7E
        74
        77
            7 1 0 60 32 1 1 1 1 1 1 4 49 54 52
            1
          77
            7 1 0 60 1 0 FF
            1
            1
            1
            1
            B XX XX XX XX XX XX XX XX XX XX
            1
          77
            7 1 0 1 8 0 FF
            65 0 1C 81 4 1 62 1E 52 FF
            69 0 0 0 0 6 AB 5E 6
            1
          77
            7 1 0 10 7 0 FF
            1 1 62 1B 52 0 55 0 0 0 AC
            1
            1
            1
        63 D0 39
        0
        76
          9 B7 9D F4 5 8 F1 4C 95
          62 0
          62 0
          72
            65 0 0 2 1
            71
              1
              63 5B 8E
0 0 0
1B 1B 1B 1B
1A
2 AB FB

Beschreibung

Start Escape Zeichenfolge
Start Übertragung Version 1
SML_Message (sequence)

groupNo
groupNo






Server ID (verfälscht mit XX)

SML_Message (sequence)

groupNo
groupNo




Server ID (verfälscht mit XX)





SML_GetList_Response (sequence)


SML_GetList_Response (sequence)





Server ID (verfälscht mit XX)

SML_GetList_Response (sequence)


Zählerstand kWh (06 AB 5E 06 => 111894022 / 10000)

SML_GetList_Response (sequence)

Aktuelle Leistung Watt ( 0 0 0 AC => 172)





SML_Message (sequence)









Escape Sequenz zum Ende
Kennzeichnung Ende der Nachricht
SML Checksum

HEX ↔ DEC Umrechner

Als Hilfe könnt Ihr diesen kleinen HEX ↔ DEC Umrechner verwenden. Die Umrechnung erfolgt in beide Richtung. Einfach im jeweiligen Feld einen Wert eintragen.
Hierbei ggf. die führende Null nicht vergessen.

Arduino Quellcode

Hier der Arduino Quellcode.
Der Quellcode durchläuft verschiedene Sequenzen (Siehe hierzu die jeweiligen Cases). Pro Sekunde wird 1 Datensatz empfangen. 20 Datensätze werden zur Übertragung gebündelt und dann in die Datenbank geschrieben. So wird der Traffic zur Datenbank reduziert. Bleibt der Ardunio über ein paar Sekunden in der gleichen Sequenz hängen, gibt die LED einen Fehlercode als Blinksequenz aus. Hierbei entspricht die Anzahl der Blinksequenz dem Schritt bzw. Case, in welcher sich der Ardunio gerade befindet.
Wenn es hierzu Fragen gibt, könnt Ihr mir gerne eine Nachricht über das Kontaktformular zukommen lassen.

Wichtige Information: Der Quellcode musste etwas angepasst werden, dass er auf der Homepage richtig angezeigt und eingebunden werden kann.
Er kann somit nicht 1 zu 1 in die Arduino IDE übernommen werden. Den gesamten Quellcode im Orginal gibt es jedoch im Downloadbereich.
Wichtig hierbei, die Arduino Datei und der Ordner in dem sich die Datei befindet, müssen den gleichen Namen haben.

// WIFI
  #include <ESP8266WiFi.h>
  #include <WiFiClientSecure.h>
  const char* ssid = "GEHEIM";
  const char* password = "GEHEIM";
  const char* host = "GEHEIM";
  const int httpsPort = GEHEIM;
  String DBUrl = "";
//SoftwareSerial
  #include <SoftwareSerial.h>
  SoftwareSerial SmlSerial(4, 5); // RX, TX
//Variablen SML
  byte bytesmltemp; //Speichern aktueller Wert
  const byte StartSequence[] = { 0x1B, 0x1B, 0x1B, 0x1B, 0x01, 0x01, 0x01, 0x01 }; //start sequence of SML
  const byte StopSequence[]  = { 0x1B, 0x1B, 0x1B, 0x1B, 0x1A }; //end sequence of SML protocol
  const byte PKwhSequence[] = { 0x77, 0x07, 0x01, 0x00, 0x01, 0x08, 0x00, 0xFF, 0x65, ¶
  0x00, 0x1C, 0x81, 0x04, 0x01, 0x62, 0x1E, 0x52, 0xFF, ¶
  0x69, 0x00, 0x00, 0x00, 0x00 }; //Sequence current "Gesamtverbrauch"
  const byte PWSequence[] = { 0x77, 0x07, 0x01, 0x00, 0x10, 0x07, 0x00, 0xFF, 0x01, ¶
  0x01, 0x62, 0x1B, 0x52, 0x00, 0x55 }; //Sequence current "Wirkleistung"
  int SequenceStep = 1; //Sequenzschritt
  int SequenceIndex = 0; //Sequenzindex
  byte SmlPW[4]; //Speichern der aktuellen Messwerte PW in HEX
  byte SmlPKwh[4]; //Speichern der aktuellen Messwerte PKWH in HEX
//Variablen Berechnung Leistung
  unsigned long currentPW = 0; //Aktuelle Leistung W Ausgabe DEC
  unsigned long currentPKwh = 0; //Gesamtleistung Kwh Ausgabe DEC
  double dblcurrentPW = 0; //currentPW/Count
  double dblcurrentPKwh = 0; //currentPKwh/10000
  int CountLoop[] = { 0, 20 }; //Alle X-Loops upload to DB
//Led`s
const int LedErrorPin = 12; //LED Error Pin
const int LedOkPin = 13;  //LED OK Pin

void setup() {
  WiFi.begin(ssid, password); //Mit WIFI verbinden
  SmlSerial.begin(9600); //Serielle Schnittstelle für IR-Lesekopf an Stromzähler mit 9600 Baud starten
  pinMode(LedErrorPin, OUTPUT); // Setzt den LedErrorPin als Ausgang
  pinMode(LedOkPin, OUTPUT); // Setzt den LedOkPin als Ausgang
}

void loop() {
  //Fehlerausgabe wenn Step zu lange aktiv
  ErrorCodeLed(SequenceStep);

  //Wifi prüfen
  if ((SequenceStep == 1) && (WiFi.status() == WL_CONNECTED)) {
    SequenceStep ++; //Sequenzschritt 1-->2
  }

  // SML-Verarbeitung und speichern der aktullen Werte
  if (SmlSerial.available()) { //wenn Daten vorhanden
    bytesmltemp = SmlSerial.read(); //Temp-Speicher der SML Nachricht
    switch (SequenceStep) {
      case 2: // Suche Start-Sequence
        if (bytesmltemp == StartSequence[SequenceIndex]) {
          SequenceIndex ++;
          if (SequenceIndex == 8) {
            SequenceIndex = 0;
            SequenceStep ++; //Sequenzschritt 2-->3
            digitalWrite(LedOkPin, HIGH); //LED Prozess SML Running OK
          }
        } else if (bytesmltemp != StartSequence[SequenceIndex]) {
          SequenceIndex = 0;
        }
        break;
      case 3: // Suche PKwh-Sequence
        if (bytesmltemp == PKwhSequence[SequenceIndex]) {
          SequenceIndex ++;
          if (SequenceIndex == 23) {
            SequenceIndex = 0;
            SequenceStep ++; //Sequenzschritt 3-->4
          }
        } else if (bytesmltemp != PKwhSequence[SequenceIndex]) {
          SequenceIndex = 0;
        }
        break;
      case 4: // Gesamtleistung Speichern
        SmlPKwh[SequenceIndex] = bytesmltemp;
        SequenceIndex ++;
        if (SequenceIndex == 4) {
          SequenceIndex = 0;
          SequenceStep ++; //Sequenzschritt 4-->5
        }
        break;
      case 5: // Suche PW-Sequence
        if (bytesmltemp == PWSequence[SequenceIndex]) {
          SequenceIndex ++;
          if (SequenceIndex == 15) {
            SequenceIndex = 0;
            SequenceStep ++; //Sequenzschritt 5-->6
          }
        } else if (bytesmltemp != PWSequence[SequenceIndex]) {
          SequenceIndex = 0;
        }
        break;
      case 6: // Aktuelle Wirkleistung speichern
        SmlPW[SequenceIndex] = bytesmltemp;
        SequenceIndex ++;
        if (SequenceIndex == 4) {
          SequenceIndex = 0;
          SequenceStep ++; //Sequenzschritt 6-->7
        }
        break;
      case 7: // Suche Stop-Sequence
        if (bytesmltemp == StopSequence[SequenceIndex]) {
          SequenceIndex ++;
          if (SequenceIndex == 5) {
            SequenceIndex = 0;
            SequenceStep ++; //Sequenzschritt 7-->8
          }
        } else if (bytesmltemp != StopSequence[SequenceIndex]) {
          SequenceIndex = 0;
        }
        break;
      case 8: // Letzte 3 Byte des Protokolls abwarten
        SequenceIndex ++;
        if (SequenceIndex == 3) {
          SequenceIndex = 0;
          SequenceStep ++; //Sequenzschritt 8-->9
        }
        break;
    }
  }

  //Daten Zusammenstellen
  if (SequenceStep == 9) {
    //Gesamtleistung Zähler
    currentPKwh = ((long)SmlPKwh[0] << 24 | (long)SmlPKwh[1] << 16 | (long)SmlPKwh[2] << 8 | (long)SmlPKwh[3]);
    dblcurrentPKwh = (double)currentPKwh / 10000;
    //Aktuelle leistung in Watt
    CountLoop[0] ++;
    currentPW = ((long)SmlPW[0] << 24 | (long)SmlPW[1] << 16 | (long)SmlPW[2] << 8 | (long)SmlPW[3]);
    dblcurrentPW = dblcurrentPW + currentPW;
    if (CountLoop[0] == CountLoop[1]) {
      dblcurrentPW = dblcurrentPW / CountLoop[1];
      SequenceStep ++; //Sequenzschritt 9-->10
    }else{ //Sequenzstep 1 bis Anzahl Loop erreicht
       SequenceStep = 1; //Sequenzschritt 10-->1
       digitalWrite(LedOkPin, LOW); //LED Prozess SML Running OK
    }
  }

  //Verbindung zur Datenbank prüfen und Paket absenden
  if (SequenceStep == 10) {
    // Use WiFiClientSecure class to create TLS connection
    WiFiClientSecure client;
    client.setInsecure();
    if (client.connect(host, httpsPort)) {
      DBUrl = "/GEHEIM/GEHEIM/GEHEIM.php?GEHEIM=" + String(dblcurrentPW) + "&GEHEIM=" + String(dblcurrentPKwh);
      client.print(String("GET ") + DBUrl + " HTTP/1.1\r\n" +
        "Host: " + host + "\r\n" +
        "User-Agent: BuildFailureDetectorESP8266\r\n" +
        "Connection: close\r\n\r\n");
      CountLoop[0] = 0;
      dblcurrentPW = 0;
      SequenceStep = 1; //Sequenzschritt 10-->1
      digitalWrite(LedOkPin, LOW); //LED Prozess SML Running OK
    }
  }
}

//Error Code durch LED ausgeben
void ErrorCodeLed(int intSmlStep) {
  uint32_t static previousMillis = millis(); // wieviele Sekunden seit der letzten Änderung
  uint32_t static interval = 5000; // Interval zwischen zwei Änderungen
  boolean static value = LOW; // Startwert der LED
  int static intStep = 0; //Aktueller Schritt
  int static intStepOld; // Alter Schritt speichern
  int static BlinkCount = 0; //Speicher Anzahl aktuell geblinkt

  if (intStep < 2) {
    if (intSmlStep == intStepOld) {
      intStep = 1;
    } else {
      intStepOld = intSmlStep;
      intStep = 0;
      previousMillis = millis();
    }
  }

  if (intStep == 1) {
    if (millis() - previousMillis > interval) {
      previousMillis = millis();   // aktuelle Zeit abspeichern
      intStep = 2;
      interval = 500;
    }
  }

  if (intStep == 2) {
    if (millis() - previousMillis > interval) {
      previousMillis = millis();   // aktuelle Zeit abspeichern
      value = !value; // LED Zustand wecheln.
      digitalWrite(LedErrorPin, value);// Wert auf den Ausgang schreiben
      BlinkCount ++;
      if (BlinkCount == intStepOld * 2) {
        intStep = 0;
        interval = 5000;
        previousMillis = millis();
        BlinkCount = 0;
      }
    }
  }
}

Arduino → MYSQL (PHP Datei)

Hier der PHP Quellcode.
Mit dieser Datei werden die Daten in die MYSQL Datenbank geschrieben und können dann auf einer beliebigen Seite visualisiert werden.
Wenn es hierzu Fragen gibt, könnt Ihr mir gerne eine Nachricht über das Kontaktformular zukommen lassen.

Wichtige Information: Der Quellcode musste etwas angepasst werden, dass er auf der Homepage richtig angezeigt und eingebunden werden kann. Er kann somit nicht 1 zu 1 in eine PHP-Datei übernommen werden. Den gesamten Quellcode im Orginal gibt es im Downloadbereich.

<?php
/*Fehler ausschalten*/
error_reporting(0);

/* Datenbankverbindung */
include "GEHEIM.php";

// Check connection
/*if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}*/

/* Variablen */
//GET
$GetDelNo = 720;
$GetPW = $_GET["PW"]; //Aktuelle Leistung in Watt
$GetPKwh = $_GET["PKwh"]; //Gesamtleistung in KWH
//Zeitstempel
$timestamp = time();
$aktTime = date("H:i:s", $timestamp);
$aktDate = date("Y-m-d", $timestamp);
$lastDay = date("Y-m-d", strtotime("-1 day"));
//Datenbankwerte
$DBKwhLast = 0;
$DBKwhToday = 0;
$DBKwhLatest = 0;
$DBDateLatest = "";
//Sonstige Variablen
$PKwhDif = 0;
$DayDiff = 0;
$statement = "";
$DelCount = 0;

/* Aktuelle Leistung in Watt */
if ($GetPW != ""){
    $statement = "INSERT INTO sml_values (PW, TimeStamp) VALUES ('" . $GetPW . "', ¶
    '" . $aktDate . " " . $aktTime . "')";
    mysqli_query($dbcon, $statement);
}

/* Tageswerte in KWH*/
if ($GetPKwh != ""){
    $statement = "SELECT KwhMax, Date FROM used_KwhDay WHERE Date = '$lastDay' ¶
    OR Date = '$aktDate'";
    $sqlresult = mysqli_query($dbcon, $statement);
    while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
        if($dsatzSQL["Date"] == $lastDay){
            $DBKwhLast = $dsatzSQL["KwhMax"];
        }else if($dsatzSQL["Date"] == $aktDate){
            $DBKwhToday = $dsatzSQL["KwhMax"];
        }
    }

    //Neustart oder längere Unterbrechung
    if ($DBKwhLast == 0 AND $DBKwhToday == 0){
        $statement = "Select KwhMax, Date FROM used_KwhDay ORDER by Date DESC LIMIT 1";
        $sqlresult = mysqli_query($dbcon, $statement);
        //Höchster jüngster Wert aus DB ermittel
        while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
            $DBKwhLatest = $dsatzSQL["KwhMax"];
            $DBDateLatest = $dsatzSQL["Date"];
        }
        //Neustart
        if ($DBKwhLatest == 0){
            $statement = "INSERT INTO used_KwhDay (KwhDay, KwhMax, Date) VALUES ('0', ¶
            '" . $GetPKwh . "', '" . $lastDay . "'), ¶
            ('0', '" . $GetPKwh . "', '" . $aktDate . "')";
            mysqli_query($dbcon, $statement);
        }else{//Ausfall länger als 1 Tag
            $LatestDBDate = new DateTime($DBDateLatest);
            $DayDiff = $LatestDBDate->diff(new DateTime($aktDate))->days - 1;
            $PKwhDif = $GetPKwh - $DBKwhLatest;
            if ($PKwhDif > 0){
                $statement = "INSERT INTO used_KwhDay (KwhDay, KwhMax, Date) VALUES ";
                $PKwhDif = round($PKwhDif / $DayDiff,3);
                for ($i = 1; $i <= $DayDiff; $i++ ){
                    $nextday =  date("Y-m-d", strtotime("+$i day", strtotime($DBDateLatest)));
                    $DBKwhLatest = $DBKwhLatest + $PKwhDif;
                    $statement .= "('$PKwhDif', '$DBKwhLatest', '$nextday'), ";
                }
                $statement .= "('0', '" . $GetPKwh . "', '" . $aktDate . "')";
            }else{
                $statement = "INSERT INTO used_KwhDay (KwhDay, KwhMax, Date) VALUES ";
                for ($i = 1; $i <= $DayDiff; $i++ ){
                    $nextday =  date("Y-m-d", strtotime("+$i day", strtotime($DBDateLatest)));
                    $statement .= "('0', '" . $GetPKwh . "', '$nextday'), ";
                }
                $statement .= "('0', '" . $GetPKwh . "', '" . $aktDate . "')";
            }
            mysqli_query($dbcon, $statement);
        }
    }
    
    //Nach Neustart Werte für heute prüfen und Updaten wenn erforderlich
    if ($DBKwhLast != 0 AND $DBKwhToday != 0 AND $GetPKwh > $DBKwhToday){
        $PKwhDif = round($GetPKwh - $DBKwhLast,3);
        $statement = "Update used_KwhDay SET KwhDay=$PKwhDif, KwhMax=$GetPKwh  WHERE ¶
        Date='" . $aktDate . "'";
        mysqli_query($dbcon, $statement);    
    }
    
    //Neuer Tage (Alles i.O.)
    if ($DBKwhLast != 0 AND $DBKwhToday == 0 AND $GetPKwh >= $DBKwhLast){
        $PKwhDif = round($GetPKwh - $DBKwhLast,3);
        $statement = "INSERT INTO used_KwhDay (KwhDay, KwhMax, Date) VALUES ('". $PKwhDif ."', ¶
        '" . $GetPKwh . "', '" . $aktDate . "')";
        mysqli_query($dbcon, $statement);
    }
}

/* Datensätze löschen */
if($GetDelNo != "" AND $GetDelNo > 0){
    $statement = "SELECT COUNT(*) FROM `sml_values`";
    $sqlresult = mysqli_query($dbcon, $statement);
    $arrsqlresult = mysqli_fetch_row($sqlresult);
    if ($arrsqlresult[0] > $GetDelNo){
        $DelCount = $arrsqlresult[0] - $GetDelNo;
        $statement = "DELETE FROM `sml_values` ORDER by TimeStamp LIMIT $DelCount";
        mysqli_query($dbcon, $statement);
    } 
}

/* Verbindung zur SQL-DB trennen */
mysqli_close($dbcon);
?>

Visualisierung

Beispiel Visualisierung

Mit den Werten alleine kann man nicht viel anfangen. Um die Daten auszuwerten, werden diese visualisiert.
Das ganze kann wie unten vorgestellt aussehen. Die Werte, die in diesem Visualisierungsbeispiel angezeigt werden, sind rein fiktiv bzw. Zufalls-generiert und werden nicht aus einer Datenbank bezogen. Die Visualisiert entspricht jedoch der von mir umgesetzten Version mit allen Funktionen.

Stromzähler Daten

Zähler Info

Aktuelle Zählerwerte

Werte in der Tabelle werden nach Auswahl eines Datums neu eingelesen. Alle 20 Sekunden wird der aktuelle Verbrauch in Watt aktualisiert. Werte die sich ändern, leuchten kurz Rot auf.

Letzte Werte zu einem Datum abrufen
Datum:
Zählerstand: 12556 kWh
Tagesverbrauch: 4,36 kWh
Aktueller Verbrauch
Aktuelle Leistung: Watt
Zeitstempel: Uhr

Graphik zum aktuellen Verbrauch in Watt

  • Neue Abfrage der Leistung in Sekunden.
  • Aktuelle Anzeige zwischen 0 und Watt, bei einem aktuellen Verbrauch von Watt.

Verbrauchswerte

Use settings of ID 1
Vertragslaufzeit: 01.01.2022 - 31.12.2022
Jahreskontingent: 2500kWh zu 25 ct/kWh
Aktuell Verfügbar: 1135.36 kWh
Bis jetzt Verbraucht: 1364.64 kWh / 341.16 €
ø Tagesverbrauch: 6.08 kWh / 1.52 €
ø Monatsverbrauch: 188.48 kWh / 47.12 €

Anzeige auswählen

Quellcode Visualisierung

Hier der PHP Quellcode für die Visualisierung. Mit dieser Datei werden die Daten aus der MYSQL Datenbank visualisiert. Zur Visualisierung ist zusätzlich sweetalert2.min.js und Chart.min.js eingebunden. Wenn es hierzu Fragen gibt, könnt Ihr mir gerne eine Nachricht über das Kontaktformular zukommen lassen.

Wichtige Information: Der Quellcode musste etwas angepasst werden, dass er auf der Homepage richtig angezeigt und eingebunden werden kann.
Er kann somit nicht 1 zu 1 in eine PHP-Datei übernommen werden.
Den gesamten Quellcode im Orginal gibt es im Downloadbereich.

<?php
  // Zur Anmeldung weiterleiten wenn kein Login
  /* Quellcode entfernt GEHEIM */
  
  /* Datenbankverbindung */
    include 'Geheim/Geheim/Geheim.php';
  
  /* Select/Dropdown */
    $betart = 1;
    $arrbetart = array ("","","","","");
    if (isset($_POST['selectbetart'])){
      $betart = $_POST['selectbetart'];
    }else if (isset($_POST['hiddenFormBetart'])){
      $betart = $_POST['hiddenFormBetart'];
    }
    $arrbetart[$betart] = "selected='selected'";
    
  /* Aktuelle Werte für Tabelle ermitteln */
    date_default_timezone_set('Europe/Berlin'); 
    $AktDate = date_create(null);
    $statement = "Select * FROM settings WHERE DateStart <= '".$AktDate->format ¶
    ('Y-m-d')."' and DateEnd >= '".$AktDate->format('Y-m-d')."' LIMIT 1";
    $sqlresult = mysqli_query($dbcon, $statement);
    while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
      $DateStart = date_create($dsatzSQL["DateStart"]); //Startdatum Vertrag
      $DateEnd = date_create($dsatzSQL["DateEnd"]); //Enddatum Vertrag
      $CounterValStart = $dsatzSQL["CounterValue"];
      $ctKwh = $dsatzSQL["ctKwh"]; //Preis pro Kwh
      $KwhMaxYear = $dsatzSQL["KwhMaxYear"]; //Kontingent für 1 Jahr in Kwh
      $SettingsID = ($dsatzSQL["id"]);
    }
    $interval = date_diff($DateStart, $AktDate);
    $DaysMonth = 365/12; // Tage pro Jahr
    $DaysGone = $interval->format('%a'); // Anzahl Tage ab Startdatum bis jetzt  
    
  /* Info Tabelle */
    $arrOverview = [];
    $statement = "Select KwhMax, KwhDay FROM used_KwhDay ORDER by Date DESC LIMIT 1";
    $sqlresult = mysqli_query($dbcon, $statement);
    while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
      $arrOverview[0] = $dsatzSQL["KwhMax"];
      $arrOverview[1] = $dsatzSQL["KwhDay"];    
    }
    $statement = "Select PW, TimeStamp FROM sml_values ORDER by TimeStamp DESC LIMIT 1";
    $sqlresult = mysqli_query($dbcon, $statement);
    while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
      $arrOverview[2] = $dsatzSQL["PW"];
      $arrOverview[3] = $dsatzSQL["TimeStamp"];    
    }  
    $arrOverview[4] = substr($arrOverview[3], -8); //Uhrzeit
    $arrOverview[3] = substr($arrOverview[3], 0, -9); //Datum
    $arrOverview[3] = date("d.m.Y", strtotime($arrOverview[3]));
    //Tabelle Allgemeine Info
    $tblAktInfo = "
    <tr>
      <td>Letzter Eintrag:</td>
      <td>" . $arrOverview[3] . " Datum</td>
      <td>Zählerstand:</td>
      <td>" . $arrOverview[0] . " kWh</td>
    </tr>
    <tr>
      <td>Zeitstempel:</td>
      <td>" . $arrOverview[4] . " Uhr</td>
      <td>Tagesverbrauch:</td>
      <td>" . $arrOverview[1] . " kWh</td>
    </tr>
    <tr>
      <td>Server-Id:</td>
      <td>0A-01-49-54-52-00-03-47-54-4C</td>
      <td>Aktuelle Leistung:</td>
      <td>" . $arrOverview[2] . " Watt</td>
    </tr>";
    //Tabelle Aktuelle Daten
    $AlreadyUsedKwh = $arrOverview[0] - $CounterValStart;
    $tblConsumptionData = "
    <tr>
      <td>Vertragslaufzeit:</td>
      <td>" . $DateStart->format('d.m.Y') . " - ". $DateEnd->format('d.m.Y') ."</td>
      <td>Jahreskontingent:</td>
      <td>" . $KwhMaxYear . " kWh zu ". $ctKwh ." ct/kWh</td>
    </tr>
    <tr>
      <td>Bis jetzt Verbraucht:</td>
      <td>" . $AlreadyUsedKwh . " kWh / ".round((($ctKwh*$AlreadyUsedKwh)/100),2)." €</td>
      <td>Aktuell Verfügbar:</td>
      <td>" . ($KwhMaxYear - $AlreadyUsedKwh) . " kWh</td>
    </tr>
    <tr>
      <td>&oslash; Tagesverbrauch:</td>
      <td>" . round(($AlreadyUsedKwh/$DaysGone),2) . " kWh / ". round((($ctKwh* ¶
      ($AlreadyUsedKwh/$DaysGone))/100),2) ." €</td>
      <td>&oslash; Monatsverbrauch:</td>
      <td>" . round(($DaysMonth * ($AlreadyUsedKwh / $DaysGone)),2) . " kWh / ". ¶
      round((($ctKwh*($DaysMonth * ($AlreadyUsedKwh/$DaysGone)))/100),2)." €</td>
    </tr>
    ";
  
  /* Graph für Leistung in Watt*/
    if ($betart == 0){
      $arrStartEndTime = array ("","","","","","","","","","","","");
      $statement = "Select TimeStamp FROM sml_values ORDER by TimeStamp ASC LIMIT 1";
      $sqlresult = mysqli_query($dbcon, $statement);
      while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
        $arrStartEndTime[0] = date_create($dsatzSQL["TimeStamp"]);
      }
      $statement = "Select TimeStamp FROM sml_values ORDER by TimeStamp DESC LIMIT 1";
      $sqlresult = mysqli_query($dbcon, $statement);
      while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
        $arrStartEndTime[1] = date_create($dsatzSQL["TimeStamp"]);
      }
      //Zeitstempel Ermittel
      $arrStartEndTime[2] = $arrStartEndTime[0]->format('d.m.Y H:i:s');
      $arrStartEndTime[3] = $arrStartEndTime[1]->format('d.m.Y H:i:s');
      $arrStartEndTime[4] = $arrStartEndTime[0]->format('Y-m-d')."T".$arrStartEndTime[0] ¶
      ->format('H:i'); //Min Wert
      $arrStartEndTime[5] = $arrStartEndTime[1]->format('Y-m-d')."T".$arrStartEndTime[1] ¶
      ->format('H:i'); //Max Wert
      if ((isset($_POST['cmdUpdate_P_Graph'])) and ($_POST['formPGraphFromTime'] != "") ¶
      and ($_POST['formPGraphToTime'] != "")){
        $arrStartEndTime[6] = $_POST['formPGraphFromTime'];
        $arrStartEndTime[7] = $_POST['formPGraphToTime'];
      }else if ((isset($_POST['cmd_PGraph_20Minback'])) and ($_POST['formPGraphFromTime'] != "") ¶
      and ($_POST['formPGraphToTime'] != "") and($_POST['formTimeRangeStep'] != "")){
        $arrStartEndTime[6] = calcTime($_POST['formPGraphFromTime'], $_POST['formTimeRangeStep'], "-");
        $arrStartEndTime[7] = calcTime($_POST['formPGraphToTime'], $_POST['formTimeRangeStep'], "-");
      }else if ((isset($_POST['cmd_PGraph_20MinFor'])) and ($_POST['formPGraphFromTime'] != "") and ¶
      ($_POST['formPGraphToTime'] != "") and ($_POST['formTimeRangeStep'] != "")){
        $arrStartEndTime[6] = calcTime($_POST['formPGraphFromTime'], $_POST['formTimeRangeStep'], "+");
        $arrStartEndTime[7] = calcTime($_POST['formPGraphToTime'], $_POST['formTimeRangeStep'], "+");
      }else if ((isset($_POST['cmd_FormRangeShow'])) and ($_POST['FormRangeShowValue'] != "")){
        $arrStartEndTime[6] = calcTime($arrStartEndTime[3], $_POST['FormRangeShowValue'], "-");
        $arrStartEndTime[7] = $arrStartEndTime[5];
      }else{
        $arrStartEndTime[6] = calcTime($arrStartEndTime[3], 20, "-");
        $arrStartEndTime[7] = $arrStartEndTime[5];
      }
      //Datum für SQL Abfrage
      $arrStartEndTime[8] = date_create(str_replace ("T"," ", $arrStartEndTime[6]))-> ¶
      format('Y-m-d H:i').":00";
      $arrStartEndTime[9] = date_create(str_replace ("T"," ", $arrStartEndTime[7]))-> ¶
      format('Y-m-d H:i').":59";
      //Sql Abfrage und Daten speichern
      $Line_Graph_Data = "";
      $Line_Graph_Labels_x = "";
      $iGraph = 0;
      $statement = "Select PW, TimeStamp FROM sml_values WHERE TimeStamp >='$arrStartEndTime[8]' ¶
      AND TimeStamp <='$arrStartEndTime[9]' ORDER by TimeStamp ASC";
      $sqlresult = mysqli_query($dbcon, $statement);
      while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
        $iGraph ++;
        if ($iGraph <= 720){
          $Line_Graph_Data .= $dsatzSQL["PW"] . ", ";
          $arrStartEndTime[11] = date_create($dsatzSQL["TimeStamp"])->format('d.m.Y H:i:s');
          $Line_Graph_Labels_x .= "'".$arrStartEndTime[11]."', ";
          if ($arrStartEndTime[10] == ""){
            $arrStartEndTime[10] = $arrStartEndTime[11];
          }
        }
      }
      if ($iGraph > 720){
        showmsg("warning", "Warnung!!!", "Der Abfragezeitraum ist größer als 240 Minuten. ¶
        Es werden nicht alle Daten angezeigt!", "");  
      }
      //Anpassung Schrittweite
      if ($_POST['formTimeRangeStep'] != ""){
        $TimeRangeStep = $_POST['formTimeRangeStep'];
      }else{
        $TimeRangeStep = 20;
      }
      //Anpassung Anzeigezeitraum
      if ($_POST['FormRangeShowValue'] != ""){
        $TimeRangeShowValue = $_POST['FormRangeShowValue'];
      }else{
        $TimeRangeShowValue = 20;
      }
      $ShowContentRight = "
            <h3>Aktuelle Leistung in Watt</h3>
            <p>Anzeigezeitraum liegt zwischen ".$arrStartEndTime[10]." Uhr und <br>" ¶
            .$arrStartEndTime[11]." Uhr </p>
            <canvas id='Line_Graph' width='100%' height='100%'></canvas>";
      $ShowContentleft = "
            <div class='row gtr-uniform'>
              <!-- BREAK -->
              
              <div class='col-6 col-12-small'>
                <h3>Graph anpassen</h3>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              
              <!-- BREAK -->
              
              <div class='col-6 col-12-small'>
                Daten verfügbar für den Zeitraum:<br>
                Von: $arrStartEndTime[2] Uhr<br>
                Bis: $arrStartEndTime[3] Uhr
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              
              <!-- BREAK -->
              
              <div class='col-6 col-12-small'>
                <h5>Anzeigezeitraum vergrößern:</h5>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              <div class='col-6 col-12-small'>
                <input type='number' id='FormRangeShowValue' name='FormRangeShowValue'¶
                min='1' max='240' step='1' value='$TimeRangeShowValue' />
              </div>
              <div class='col-6 col-12-small'>
                <ul class='actions'>
                  <li><input type='submit' name='cmd_FormRangeShow' value='Anzeigen'¶
                  class='button' /></li>
                </ul>
              </div>
              <div class='col-6 col-12-small'>
                Max Wert 240.<br>
                Setzt Startdaum neu.
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              
              <!-- BREAK -->
              
              <div class='col-6 col-12-small'>
                <h5>Schrittweise Anzeigedatum setzten:</h5>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              <div class='col-4 col-12-small'>
                <ul class='actions'>
                  <li><input type='submit' name='cmd_PGraph_20Minback' ¶
                  value='<-- Minuten' class='button' /></li>
                </ul>
              </div>
              <div class='col-4 col-12-small'>
                <input type='number' id='formTimeRangeStep' name='formTimeRangeStep' ¶
                min='1' max='240' step='1' value='$TimeRangeStep' />
              </div>
              <div class='col-4 col-12-small'>
                <ul class='actions'>
                  <li><input type='submit' name='cmd_PGraph_20MinFor' ¶
                  value='Minuten -->' class='button' /></li>
                </ul>
              </div>
              
              <!-- BREAK -->
              
              <div class='col-6 col-12-small'>
                <h5>Direkte Datumseingabe:</h5>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              <div class='col-6 col-12-small'>
                <label for='formPGraphFromTime'>Anzeige von:</label>
                <input type='datetime-local' min='$arrStartEndTime[4]' ¶
                max='$arrStartEndTime[5]' value='$arrStartEndTime[6]' ¶
                id='formPGraphFromTime' name='formPGraphFromTime' />
              </div>
              <div class='col-6 col-12-small'>
                <label for='formPGraphToTime'>Anzeige bis:</label>
                <input type='datetime-local' min='$arrStartEndTime[4]' ¶
                max='$arrStartEndTime[5]' value='$arrStartEndTime[7]' ¶
                id='formPGraphToTime' name='formPGraphToTime' />
              </div>
              
              <!-- BREAK -->
              
              <div class='col-6 col-12-small'>
                Anzeigezeit max 240 Minuten
                <input type='hidden' name='hiddenFormBetart' value='$betart'>
              </div>
              <div class='col-6 col-12-small'>
                <ul class='actions'>
                  <li><input type='submit' name='cmdUpdate_P_Graph' ¶
                  value='Update Graph' class='primary' /></li>
                </ul>
              </div>
            </div>";
    }
  
  /*Tagesansicht Graph für Leistung in KWH*/
    if ($betart == 1){
      //Zeitstempel
      $AktDate = date_create(null);
      $aktmaxDate = $AktDate->format('Y-m');
      $aktShowDate = $aktmaxDate;
      $monatsnamen = array( 1=>"Januar", 2=>"Februar", 3=>"März", 4=>"April", ¶
      5=>"Mai", 6=>"Juni", 7=>"Juli", 8=>"August", 9=>"September", 10=>"Oktober", ¶
      11=>"November", 12=>"Dezember");
      if (isset($_POST['KwhDaysMonth'])){
        $aktShowDate = $_POST['KwhDaysMonth'];
      }
      //SQL Abfrage Graph erzeugen
      $Bar_Graph_Data = "";
      $Bar_Graph_Labels_x = "";
      $Bar_Graph_Color = "";
      $statement = "Select KwhDay, Date FROM used_KwhDay WHERE Date like ¶
      '$aktShowDate%' ORDER by Date ASC";
      $sqlresult = mysqli_query($dbcon, $statement);
      while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
          $Bar_Graph_Data .= $dsatzSQL["KwhDay"] . ", ";
          $Bar_Graph_Labels_x .= "'" . date_create($dsatzSQL["Date"])¶
          ->format('d.m.Y') . "', ";
          $Bar_Graph_Color .= "'#3e95cd', ";
      }
      $ShowContentRight = "
            <h3>Übersicht der Tagesverbräuche in kWh</h3>
            <canvas id='Bar_Graph' width='100%' height='100%'></canvas>
            ";
      $ShowContentleft = "
            <div class='row gtr-uniform'>
              <div class='col-6 col-12-small'>
                <h3>Graph anpassen</h3>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              <div class='col-12'>
                <label for='lblKWHDays'>Monat auswählen</label>
                <input type='month' id='lblKWHDays' name='KwhDaysMonth' ¶
                min='2022-11' max='$aktmaxDate' value='$aktShowDate' ¶
                onchange='this.form.submit()'>
                <input type='hidden' name='hiddenFormBetart' value='$betart'>
              </div>
            </div>";
    $Bar_Graph_Text = "Anzeigezeitraum für ".$monatsnamen[substr($aktShowDate,-2)]." ¶
    ".substr($aktShowDate,0,4);
    $Bar_Graph_Labels_y = "Tagesverbrauch in kWh";
    }

  /*Monatsansicht Graph für Leistung in KWH*/
    if ($betart == 2){
      $SqlSelectedYear = "";
      $years = range(2022, strftime("%Y", time()));
      foreach($years as $year) :
        if (($_POST['KwhMonthsYear'] == "" and date("Y") == $year) OR ¶
        ($_POST['KwhMonthsYear'] == $year)){
          $selectYear .= "<option value='$year'  selected>$year</option>";
          $SqlSelectedYear = $year;
        }else{
          $selectYear .= "<option value='$year'>$year</option>";
        }
      endforeach;
      $ShowContentleft = "
            <div class='row gtr-uniform'>
              <div class='col-6 col-12-small'>
                <h3>Graph anpassen</h3>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              <div class='col-12'>
                <label for='KwhMonthsYear'>Jahr auswählen</label>
                <select name='KwhMonthsYear' id='KwhMonthsYear' ¶
                onchange='this.form.submit()'>
                  $selectYear
                </select>
                <input type='hidden' name='hiddenFormBetart' value='$betart'>
              </div>
            </div>";
      $ShowContentRight = "
        <h3>Übersicht der Monatsverbräuche in kWh</h3>
        <canvas id='Bar_Graph' width='100%' height='100%'></canvas>
      ";
      //SQL Abfrage Graph erzeugen
      $monatsnamen = array( 1=>"Januar", 2=>"Februar", 3=>"März", 4=>"April", ¶
      5=>"Mai", 6=>"Juni", 7=>"Juli", 8=>"August", 9=>"September", 10=>"Oktober", ¶
      11=>"November", 12=>"Dezember");
      $Bar_Graph_Data = "";
      $Bar_Graph_Labels_x = "";
      $Bar_Graph_Color = "";
      for ($i = 1; $i <= 12; $i++ )
      {
        if ($i < 10){
          $SqlMoth = "0".$i;
        }else{
          $SqlMoth = $i;
        }
        $statement = "SELECT SUM(KwhDay) FROM used_KwhDay WHERE Date ¶
        like '".$SqlSelectedYear."-".$SqlMoth."%'";
        $sqlresult = mysqli_query($dbcon, $statement);
        $dsatzSQL = mysqli_fetch_row($sqlresult);
        $Bar_Graph_Data .= round($dsatzSQL[0],2).", ";
        $Bar_Graph_Labels_x .= "'" . $monatsnamen[$i] . "', ";
        $Bar_Graph_Color .= "'#3e95cd', ";
      }
      $Bar_Graph_Text = "Daten für das Jahr " . $SqlSelectedYear;
      $Bar_Graph_Labels_y = "Monatsverbräuche in kWh";
    }
    
  /*Jahresansichten Graph für Leistung in KWH*/
    if ($betart == 3){
      $AktDate = date_create(null);
      for ($i = 2022; $i <= $AktDate->format('Y'); $i++ )
      {
        $statement = "SELECT SUM(KwhDay) FROM used_KwhDay WHERE Date ¶
        like '".$i."%'";
        $sqlresult = mysqli_query($dbcon, $statement);
        $dsatzSQL = mysqli_fetch_row($sqlresult);
        $Bar_Graph_Data .= round($dsatzSQL[0],2) . ", ";
        $Bar_Graph_Labels_x .= "'" . $i . "', ";
        $Bar_Graph_Color .= "'#3e95cd', ";
      }
      $ShowContentleft = "
            <div class='row gtr-uniform'>
              <div class='col-6 col-12-small'>
                <h3>Graph anpassen</h3>
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
              <div class='col-6 col-12-small'>
                Keine Einstellungen sind erforderlich.
              </div>
              <div class='col-6 col-12-small'>
                <!-- Platzhalter -->
              </div>
            </div>";
      $ShowContentRight = "
        <h3>Übersicht der Jahresverbräuche in kWh</h3>
        <canvas id='Bar_Graph' width='100%' height='100%'></canvas>
      ";
      $Bar_Graph_Text = "Daten für die Jahre 2022- " . $AktDate->format('Y');
      $Bar_Graph_Labels_y = "Jahresverbrauch in kWh";
    }

  /*Einstellungen*/
    if ($betart == 4){
      $SettingsHeadline = "Neuer Eintrag erfassen";
      //Neuer Eintrag
      $arrSetFormVal = array ($_POST['FormSetDateStart'],$_POST['FormSetDateEnd'],¶
      $_POST['FormSetCountVal'],$_POST['FormSetKwhMaxYear'],$_POST['FormSetCtKwh']);
      if (isset($_POST['cmdStoreSettings'])){
        if ($_POST['hiddenFormIdEdit'] != ""){
          $statement = "Update settings SET DateStart='".$arrSetFormVal[0]."', ¶
          DateEnd='".$arrSetFormVal[1]."', CounterValue='".$arrSetFormVal[2]."', ¶
          ctKwh='".$arrSetFormVal[4]."', KwhMaxYear='".$arrSetFormVal[3]."'  ¶
          WHERE id='".$_POST['hiddenFormIdEdit']."'";
          mysqli_query($dbcon, $statement);
          showmsg("success", "Hinweis", "Einstellungen zur ID ". ¶
          $_POST['hiddenFormIdEdit']." erfolgreich gespeichert.", "");
        }else{
          $statement = "INSERT INTO settings (DateStart, DateEnd, CounterValue, ¶
          ctKwh, KwhMaxYear) VALUES ('$arrSetFormVal[0]', '$arrSetFormVal[1]', ¶
          '$arrSetFormVal[2]', '$arrSetFormVal[4]', '$arrSetFormVal[3]')";
          mysqli_query($dbcon, $statement);
          showmsg("success", "Neuer Eintrag", "Neuer Eintrag erfolgreich gespeichert.", "");
        }
      }
      //Eintrag löschen
      if ((isset($_POST['cmd_idsetdel'])) and($_POST['cmd_idsetdel'] != "")){
        $statement = "DELETE FROM `settings` WHERE id = " . $_POST['cmd_idsetdel'];
        mysqli_query($dbcon, $statement);
        showmsg("success", "Löschen", "Löschen von Eintrag mit der ID ". ¶
        $_POST['cmd_idsetdel']." erfolgreich.", "");
      }
      $arrSetFormVal = array();
      //Eintrag laden um in Form zu editieren
      if ((isset($_POST['cmd_idsetedit'])) and ($_POST['cmd_idsetedit'] != "")){
        $statement = "Select * FROM settings WHERE id = " . $_POST['cmd_idsetedit'];
        $sqlresult = mysqli_query($dbcon, $statement);
        while($dsatzSQL = mysqli_fetch_assoc($sqlresult)){
          $arrSetFormVal = array ($dsatzSQL["DateStart"],$dsatzSQL["DateEnd"], ¶
          $dsatzSQL["CounterValue"],$dsatzSQL["KwhMaxYear"],$dsatzSQL["ctKwh"]);
        }
        $SettingsHeadline = "Eintrag mit der ID '".$_POST['cmd_idsetedit']."' bearbeiten";
        showmsg("info", "Hinweis", "Einstellungen mit der ID ". ¶
        $_POST['cmd_idsetedit']." zum editieren in die Form geladen.", "");
      }
      
      //Tabelle erzeugen
      $tablesettings = "";
      $sqlstatement = "Select * from settings ORDER by id asc";
      $sqlresult = mysqli_query($dbcon, $sqlstatement);
      while($dsatz = mysqli_fetch_assoc($sqlresult))
      {
        $tablesettings .= "
        <tr>
          <td>
            <ul>
              <li>Vertragslaufzeit: ".date("d.m.Y", strtotime($dsatz['DateStart'])). ¶
              " - ".date("d.m.Y", strtotime($dsatz['DateEnd']))."</li>
              <li>Start Zählerstand: ".$dsatz['CounterValue']." kWh</li>
              <li>Jahreskontingent: ".$dsatz['KwhMaxYear']." kWh</li>
              <li>Kosten: ".$dsatz['ctKwh']." ct/kWh</li>
            </ul>
          </td>
          <td><input type='submit' name='cmd_idsetedit' value='" . $dsatz["id"] . ¶
          "' class='button primary small' /></td>
          <td><input type='submit' name='cmd_idsetdel' value='". $dsatz["id"] . ¶
          "' class='button small' /></td>
        </tr>";
      }
        
      //Wenn Abfrage ohen Werte
      if ($tablesettings == ""){
      $tablesettings = "<tr>
                <td>Kein Datensatz vorhanden</td>
                <td><input type='submit' name='cmd_indexedit' ¶
                value='' class='button primary small' /></td>
                <td><input type='submit' name='cmd_indexdel' ¶
                value='' class='button small' /></td>
              </tr>";
      }
      $ShowContentRight ="
        <h3>Tabelle Vertragsdatenübersicht</h3>
        <form action='#' method='POST'>
          <div class='table-wrapper'>
            <table class='alt'>
              <thead>
                <tr>
                  <th>Werte</th>
                  <th>Edit</th>
                  <th>Löschen</th>
                </tr>
              </thead>
              <tbody>
                $tablesettings
              </tbody>  
            </table>
          </div>
          <input type='hidden' name='hiddenFormBetart' value='$betart'>
        </form>
      ";
      //Formular links erzeugen
      $ShowContentleft ="
        <div class='col-6 col-12-xsmall'>
          <h3>$SettingsHeadline</h3>
        </div>
        <div class='col-6 col-12-xsmall'>
          <!-- Platzhalter -->
        </div>
        <div class='col-6 col-12-xsmall'>
          <label for='FormSetDateStart'>Datum Vertragsbeginn</label>
          <input type='date' name='FormSetDateStart' id='FormSetDateStart' ¶
          value='$arrSetFormVal[0]'/>
        </div>
        <div class='col-6 col-12-xsmall'>
          <label for='FormSetDateEnd'>Datum Vertragsende</label>
          <input type='date' name='FormSetDateEnd' id='FormSetDateEnd' ¶
          value='$arrSetFormVal[1]'/>
        </div>
        <div class='col-6 col-12-xsmall'>
          <label for='FormSetCountVal'>Anfangs-Zählerstand</label>
          <input type='number' name='FormSetCountVal' id='FormSetCountVal' ¶
          value='$arrSetFormVal[2]'/>
        </div>
        <div class='col-6 col-12-xsmall'>
          <label for='FormSetKwhMaxYear'>Jahreskontingent kWh</label>
          <input type='number' name='FormSetKwhMaxYear' id='FormSetKwhMaxYear' ¶
          value='$arrSetFormVal[3]'/>
        </div>
        <div class='col-6 col-12-xsmall'>
          <label for='FormSetCtKwh'>Preis in Ct pro kWh </label>
          <input type='text' name='FormSetCtKwh' id='FormSetCtKwh' ¶
          value='$arrSetFormVal[4]'/>
        </div>
        <div class='col-6 col-12-xsmall'>
          <input type='hidden' name='hiddenFormBetart' value='$betart'>
          <input type='hidden' name='hiddenFormIdEdit' value='". ¶
          $_POST['cmd_idsetedit']."'>
        </div>
        <div class='col-12'>
          <ul class='actions'>
            <li><input type='submit' name='cmdStoreSettings' ¶
            value='Speichern' class='primary' /></li>
            <li><input type='reset' value='Reset' /></li>
          </ul>
        </div>
      ";
    }
  //Seite Ausgeben
    echo "
      <section>
        <header class='main'>
          <h1>Stromzähler Daten</h1>
        </header>
        <hr class='major' />
        <h2>Zähler Info</h2>
        <div class='table-wrapper'>
          <table class='alt'>
            <tbody>
              $tblAktInfo
            </tbody>  
          </table>
        </div>
        <h2>Verbrauchswerte</h2>
        <h6>Use settings of ID $SettingsID</h6>
        <div class='table-wrapper'>
          <table class='alt'>
            <tbody>
              $tblConsumptionData
            </tbody>  
          </table>
        </div>
      </section>
      
      <section>
        <div class='row gtr-200' id='Anchor1'>
          <div class='col-6 col-12-medium'>
            <h2>Anzeige auswählen</h2>
            <form action='#' method='POST'>
              <select name='selectbetart' id='selectbetart' ¶
              onchange='this.form.submit()'>
                <option value='0' $arrbetart[0]> ¶
                Aktuelle Leistung in Watt</option>
                <option value='1' $arrbetart[1]> ¶
                Übersicht Tagesverbräuche in KWH</option>
                <option value='2' $arrbetart[2]> ¶
                Übersicht Monatsverbräuche in KWH</option>
                <option value='3' $arrbetart[3]> ¶
                Übersicht Jahresverbräuche in KWH</option>
                <option value='4' $arrbetart[4]> ¶
                Einstellungen</option>
              </select>
            </form>
          </div>
          <div class='col-6 col-12-medium'>
            <!-- Platzhalter -->
          </div>
          <div class='col-6 col-12-medium'>
            <form method='post' action='#'>
              <div class='row gtr-uniform'>
                $ShowContentleft
              </div>
            </form>
          </div>
          <div class='col-6 col-12-medium'>
            $ShowContentRight
          </div>
        </div>
      </section>

      <script>
        new Chart(document.getElementById('Line_Graph'), {
          type: 'line',
          data: {
          labels: [" . $Line_Graph_Labels_x . "],
          datasets: [{ 
            data: [" . $Line_Graph_Data . "],
            label: 'Leistung in Watt',
            borderColor: '#6AA84F',
            fill: true
            }
          ]
          },
          options: {
          title: {
            display: true,
            text: ''
          },
          scales: {
            yAxes: [{
              ticks: {
                beginAtZero: true
              }
            }]
          }          
          }
        });
      </script>
      <script>
        new Chart(document.getElementById('Bar_Graph'), {
          type: 'bar',
          data: {
            labels: [".$Bar_Graph_Labels_x."],
            datasets: [
            {
              label: '".$Bar_Graph_Labels_y."',
              backgroundColor: [".$Bar_Graph_Color."],
              data: [".$Bar_Graph_Data."]
            }
            ]
          },
          options: {
            legend: { display: false },
            title: {
            display: true,
            text: '".$Bar_Graph_Text."'
            },
            scales: {
              yAxes: [{
                ticks: {
                  beginAtZero: true
                }
              }]
            }
          }
        });          
      </script>
    ";
  
  /* Sweetalert ausgeben */
  function showmsg($icon, $titel, $txt, $linkit){
    if ($linkit != "")
    {
      $linkit = "
        .then((result) => {
          if (result.value) {
            window.location.href = `".$linkit."`
          }
        });
      ";
    }else{$linkit = "";}
    echo "<script type='text/javascript'>
      Swal.fire({
        showConfirmButton: true,
        position: 'center',
        confirmButtonColor: '#0000FF',
        icon: '$icon',
        title: '$titel',
        html: '$txt',
        })".$linkit."
    </script>";
  }
  /* Sweetalert ausgeben */
  
  /*Zeitberechnung*/
  function calcTime ($TimeStamp, $Minutes, $AddOrSub){
    $TimeStamp = date_create($TimeStamp);
    if($AddOrSub == "+"){
      date_add($TimeStamp,date_interval_create_from_date_string ¶
      ($Minutes . " minutes"));
    }else if($AddOrSub == "-"){
      date_sub($TimeStamp,date_interval_create_from_date_string ¶
      ($Minutes . " minutes"));
    }
    return $TimeStamp->format('Y-m-d')."T".$TimeStamp->format('H:i');
  }
  /*Zeitberechnung*/
  
  /*Jump To Anchor*/
  if($_SERVER['REQUEST_METHOD'] == 'POST'){
    echo "
      <script>
        function JumpToAnchor() {
          $('html,body').animate({scrollTop: $('#Anchor1'). ¶
          offset().top},'slow');
        }
        window.addEventListener('load', JumpToAnchor, false);
      </script>
    ";
  }
  /*Jump To Anchor*/
?>