Stromzähler
TYP: Itron 3.HZ-AC-D1-A1
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.
Hier die HEX Werte die der Stromzähler jede Sekunde über die optische Schnittstelle ausgibt.
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
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
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.
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;
}
}
}
}
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);
?>
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.
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 |
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 € |
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>ø Tagesverbrauch:</td>
<td>" . round(($AlreadyUsedKwh/$DaysGone),2) . " kWh / ". round((($ctKwh* ¶
($AlreadyUsedKwh/$DaysGone))/100),2) ." €</td>
<td>ø 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*/
?>