HTMLBox Wallbox (Go-E Charger + Andere) BETA

Hallo zusammen,

nachfolgend eine erste Testversion der HTMLBox Kachel für den go-e Charger (Kann auch für andere Wallboxen eingesetzt werden) Seid bitte gnädig mit mir, für mich sind das Übungen um meine Programmierskills etwas aufzubessern…

wallbox_kachel

Version 0.1
Version 0.2

  • Dezimalzahlen werden auf 2 Stellen nach dem Komma gerundet
  • Icon und Texte gerade ausgerichtet

Schritt 1: Anleitung im Script lesen!

Schritt 2: Momentan müssen noch bei den Spezialschaltern der Schalter „ServerSecurity“ deaktiviert werden sonst funktioniert die API Verbindung aus der HTML Box nicht!

Die Box läuft über den Websocket und die RPC-Api. Die Daten werden also ohne Reload nahezu in Echtzeit aktualisiert. Das Bild ist animiert.

Für den go-e Charger werden Bilder mitgeliefert. Die Animation der LEDs ist komplett in CSS realisiert und sollte entsprechend Ressourcenschonend laufen.
Momentan werden folgende Anzeigen unterstützt:

  • Aus: LED aus
  • Ladekabel eingesteckt: LED aus
  • Warten auf Fahrzeug: LED leuchten blau in eingestellter Ladeleistung
  • Lädt: 1-phasig und 3-phasig, die Schweiflänge passt sich der jeweiligen Ladeleistung an.
  • Fertig: LED leuchten grün
  • Fehler: LED blinken rot

Optional:

  • SOC als Balken
  • SOC Zielwert
    Beide Anzeigen können ausgeblendet werden. Da diese Daten nicht von der Wallbox bereitgestellt werden muss jeder selbst schauen woher er diese Daten bekommt. API zum Auto etc…
    Zum aus- und einblenden der SOC Anzeigen müssen zwei Bool-Variablen angelegt werden. (Siehe Anleitung im Skript. Eine Logik wann der SOC angezeigt werden soll und wie sich das z.B. mit mehreren Autos verhält muss vom Nutzer selbst bereitgestellt werden.

Verwendung für andere Wallboxen:

Eine Anpassung auf andere Wallboxen ist relativ einfach möglich. So lange die Variablen-Typen und die gelieferten Werte stimmen sehe ich hier keine Probleme. Die Bilder am besten in der gleichen Größe und Seitenverhältnis anlegen.

Todos:

  • Anzeige von zeitgesteuertem Laden
  • Anzeige von Laden für X Kilometer
  • Anzeige Börsenstromladen
  • Feintuning LED Anzeige

Viel Spaß beim Testen und gebt bitte Feedback ob alles läuft oder wo ihr noch verbesserungspotential seht.

Bilder: go_e_Bilder.zip (17,3 KB)

<?php
/*
Anleitung:

Vorbereitung:
- Die Wallbox Bilder müssen im entsprechenden Pfad abgelegt werden.
- Es muss ein Fernzugriffs-Passwort gesetzt sein
- Es muss ein Webfront-Passwort gesetzt sein
- Alle hier verwendeten Variablen müssen irgendwo im Webfront verwendet werden, sonst hat der Webfront Websocket keinen Zugriff auf diese Variablen. 
  Am einfachsten ist es, im Webfront eine Kategorie anzulegen. In diese Kategorie erstellt ihr Links zu allen Variablen oder Instanzen, die die Variablen enthalten. 
  Die Kategorie kann über "Objekt bearbeiten" auf Unsichtbar und deaktiviert gestellt werden. (gibt es hier für eine elegantere Lösung? Bitte im Forum posten.)
- Im nächsten Schritt müssen alle Variablen-IDs im $config Array eingetragen werden.


Icon:
Für die Icon verwende ich Font Awesome. Bitte auf der Webseite kostenlos Anmelden und unter https://fontawesome.com/start sich den "Kit embed code" schicken lassen. 
Der sollte wie folgt aussehen:
<script src="https://kit.fontawesome.com/xxxxxxxxxxxx.js" crossorigin="anonymous"></script>
Die URL bitte hier eintragen:
*/
$fontawesomeurl = "https://kit.fontawesome.com/xxxxxxxxxxxxxxxxxx.js";


// SOC Anzeige
// Da die SOC Werte nicht vom Charger bereitgestellt werden muss jeder selbst schauen woher er diese Daten bekommet. API zum Auto etc.
// Für beide Werte wird der Prozentwert OHNE Prozentzeichen erwartet. (Integer oder Float)
// Die SOC-Anzeige kann dynamisch ein- und ausgeblendet werden. Eine entsprechende Logik muss vom Anwender bereitgestellt werden. Wann, bei welchem Auto etc...
// Wenn ein dynamisches ein- und ausblenden gewünscht ist bitte zwei Bool-Variablen anlegen und nachfolgend die Variablen IDs im config Array eintragen (wb_soc_ziel_switch und wb_soc_switch).
// Wenn SOC oder SOC-Zielwert dauerhaft deaktiviert werden sollen muss im nachfolgenden $config Array als VariablenID eine 1 eingetragen werden. (bei wb_soc_ziel und wb_soc)
// und die beiden Bool-Variablen werden auf false gesetzt.


// Hier die entsprechende Variablen-ID eintragen. (Der angegebene Ident ist der vom go-e charger Modul)

$config = array(
    'wb_status' => 31610, //Status-Variable (Ident: status)
    'wb_leistung_zum_auto' => 25320, //Leistung zum Auto in kWh (Ident: powerToCarToal)
    'wb_energie_vorgang' => 19933, // Abgegebene Energier im aktuellen Ladevorgang (Ident: energyLoadCycle)
    'wb_energie_gesamt' => 51887, // Gesamt geladene Energie  (Ident:energyTotal)
    'wb_fehler' => 22730, // Fehlermeldung  (Ident: error)
    'wb_genutzte_phasen' => 14288, // 1-phasig oder 3-phasig Laden (true = 1-phasig, false=3-phasig)  (Ident: singlePhaseCharging)
    'wb_max_ladeleistung' => 17540, // Maximal mögliche Ladeleistung  (Ident:availableSupplyEnergy)
    'wb_kabel' => 14666, // Ladeleistung die das verwendete Ladekabel unterstützt  (Ident: cableCapability)
    'wb_zugangskontrolle' => 13581, // Zugangskontroll  (Ident: accessControl)
    'wb_verriegelung' => 37832, //Verriegelungs-Einstellung  (Ident: CableUnlockMode)
    'wb_soc_ziel' => 13666, // Ziel-SOC (wenn dauerhaft deaktiviert, hier 1 eintragen)
    'wb_soc' => 22927 , // SOC (wenn dauerhaft deaktiviert, hier 1 eintragen)
    'wb_soc_zielwert_switch' => 29443, // SOC-Zielwert, Bool-Variable (true = anzeigen, false = ausblenden)
    'wb_soc_switch' => 59101    //Aktueller SOC, Bool-Variable (true = anzeigen, false = ausblenden)
 );

// Zugangsdaten für den Webfront Websocket und die JSON RPC API
$username = "max.mustermann@mail.com"; // E-Mailadresse
$wf_password = "xxx"; // Webfront Passwort
$fern_password = "xxx"; // Fernzugriff Passwort
$serverAddressLocal = "192.168.0.134"; // IP-Adresse vom Symcon-Rechner
$serverAddressConnect = "lisf86f87wfw9fmew9ezfw98fz9we8fzw98.ipmagic.de"; // IP Symcon Connect Adresse in diesem Format: lisf86f87wfw9fmew9ezfw98fz9we8fzw98.ipmagic.de
$port = "3777";
$webfront_id = "11891"; // ID der Webfront Instanz


//Pfad für die Bilder
$image_pfad = "user/img/wallbox/"; //ohne führenden /

//Wenn du eigene Bilder verwenden möchtest bitte hier die LED Animation für den Go-E Charger deaktivieren. (an=inline, aus=none)
$led_animation_switch = "inline";


// Status definieren
// WB Status
// Es wird ein Integer-Wert zwischen 0 und 9 erwartet. Je Wert können Text, Farbe und ein Bild definiert werden.
$wb_status_text_0 = "Statustext"; // Integer 0
$wb_status_color_0 = ""; // Integer 0 Farbe
$wb_status_image_0 = "go_e_template.webp"; // Integer 0 Bild

$wb_status_text_1 = "Bereit"; // Integer 1
$wb_status_color_1 = ""; // Integer 1 Farbe
$wb_status_image_1 = "go_e_template.webp"; // Integer 1 Bild

$wb_status_text_2 = "Fahrzeug lädt"; // Integer 2
$wb_status_color_2 = ""; // Integer 2 Farbe
$wb_status_image_2 = "go_e_template.webp"; // Integer 2 Bild

$wb_status_text_3 = "Warte auf Fahrzeug"; // Integer 3
$wb_status_color_3 = ""; // Integer 3 Farbe
$wb_status_image_3 = "go_e_template.webp"; // Integer 3 Bild

$wb_status_text_4 = "Ladung beendet"; // Integer 4
$wb_status_color_4 = ""; // Integer 4 Farbe
$wb_status_image_4 = "go_e_template.webp"; // Integer 4 Bild

$wb_status_text_5 = "Statustext"; // Integer 5
$wb_status_color_5 = ""; // Integer 5 Farbe
$wb_status_image_5 = "go_e_template.webp"; // Integer 5 Bild

$wb_status_text_6 = "Statustext"; // Integer 6
$wb_status_color_6 = ""; // Integer 6 Farbe
$wb_status_image_6 = "go_e_template.webp"; // Integer 6 Bild

$wb_status_text_7 = "Statustext"; // Integer 7
$wb_status_color_7 = ""; // Integer 7 Farbe
$wb_status_image_7 = "go_e_template.webp"; // Integer 7 Bild

$wb_status_text_8 = "Statustext"; // Integer 8
$wb_status_color_8 = ""; // Integer 8 Farbe
$wb_status_image_8 = "go_e_template.webp"; // Integer 8 Bild

$wb_status_text_9 = "Statustext"; // Integer 9
$wb_status_color_9 = ""; // Integer 9 Farbe
$wb_status_image_9 = "go_e_template.webp"; // Integer 9 Bild


//Kabelleistungsfähigkeit
$wb_kabel_0 = 'kein Kabel'; // Integer 0, Wenn Wert nicht 0 dann Bild vom Ladekabel einblenden
$wb_kabel_1 = '1A'; // Integer 1
$wb_kabel_2 = '2A'; // Integer 2
$wb_kabel_3 = '3A'; // Integer 3
$wb_kabel_4 = '4A'; // Integer 4
$wb_kabel_5 = '5A'; // Integer 5
$wb_kabel_6 = '6A'; // Integer 6
$wb_kabel_7 = '7A'; // Integer 7
$wb_kabel_8 = '8A'; // Integer 8
$wb_kabel_9 = '9A'; // Integer 9
$wb_kabel_10 = '10A'; // Integer 10
$wb_kabel_11 = '11A'; // Integer 11
$wb_kabel_12 = '12A'; // Integer 12
$wb_kabel_13 = '13A'; // Integer 13
$wb_kabel_14 = '14A'; // Integer 14
$wb_kabel_15 = '15A'; // Integer 15
$wb_kabel_16 = '16A'; // Integer 16
$wb_kabel_17 = '17A'; // Integer 17
$wb_kabel_18 = '18A'; // Integer 18
$wb_kabel_19 = '19A'; // Integer 19
$wb_kabel_20 = '20A'; // Integer 20
$wb_kabel_21 = '21A'; // Integer 21
$wb_kabel_22 = '22A'; // Integer 22
$wb_kabel_23 = '23A'; // Integer 23
$wb_kabel_24 = '24A'; // Integer 24
$wb_kabel_25 = '25A'; // Integer 25
$wb_kabel_26 = '26A'; // Integer 26
$wb_kabel_27 = '27A'; // Integer 27
$wb_kabel_28 = '28A'; // Integer 28
$wb_kabel_29 = '29A'; // Integer 29
$wb_kabel_30 = '30A'; // Integer 30
$wb_kabel_31 = '31A'; // Integer 31
$wb_kabel_32 = '32A'; // Integer 32

//Zugangskontrolle
$wb_zugang_0 = 'frei zugänglich'; // Integer 0
$wb_zugang_1 = 'RFID Identifizierung'; // Integer 1
$wb_zugang_2 = 'Strompreis / automatisch'; // Integer 2
$wb_zugang_3 = 'Statustext'; // Integer 3
$wb_zugang_4 = 'Statustext'; // Integer 4
$wb_zugang_5 = 'Statustext'; // Integer 5
$wb_zugang_6 = 'Statustext'; // Integer 6
$wb_zugang_7 = 'Statustext'; // Integer 7
$wb_zugang_8 = 'Statustext'; // Integer 8
$wb_zugang_9 = 'Statustext'; // Integer 9

//Verriegelung
$wb_verriegelung_0 = 'verriegelt, wenn Auto angeschlossen'; // Integer 0
$wb_verriegelung_1 = 'am Ladeende entriegeln'; // Integer 1
$wb_verriegelung_2 = 'immer verriegelt'; // Integer 2
$wb_verriegelung_3 = 'Warte auf Fahrzeug'; // Integer 3
$wb_verriegelung_4 = 'Ladung beendet'; // Integer 4
$wb_verriegelung_5 = 'Statustext'; // Integer 5
$wb_verriegelung_6 = 'Statustext'; // Integer 6
$wb_verriegelung_7 = 'Statustext'; // Integer 7
$wb_verriegelung_8 = 'Statustext'; // Integer 8
$wb_verriegelung_9 = 'Statustext'; // Integer 9


//Fehler
$wb_fehler_0 = 'Kein Fehler'; // Integer 0
$wb_fehler_1 = 'FI Schutzschalter'; // Integer 1
$wb_fehler_2 = 'Statustext'; // Integer 2
$wb_fehler_3 = 'Fehler an Phase'; // Integer 3
$wb_fehler_4 = 'Statustext'; // Integer 4
$wb_fehler_5 = 'Statustext'; // Integer 5
$wb_fehler_6 = 'Statustext'; // Integer 6
$wb_fehler_7 = 'Statustext'; // Integer 7
$wb_fehler_8 = 'Keine Erdung'; // Integer 8
$wb_fehler_9 = 'Statustext'; // Integer 9
$wb_fehler_10 = 'Interner Fehler'; // Integer 10


//Layouteinstellungen

//Schriftgrößen
$fontsize_main = "0.9em"; //Allgemeine Schriftgröße
$fontsize_chart = "0.9em"; //Schriftgröße Diagrammbalken
$fontsize_infos = "0.9em"; //Schriftgröße Jaz, Cop etc...

//Icon Farbe
$icon_color = "#26d4b9";

//Schriftfarbe Diagrammbalken
$font_color_chart = "#fff";

//Farbe Balken Ladeleistung
$chart_color_leistung_1 = "#28cdab"; //Farbverlauf Farbe 1
$chart_color_leistung_2 = "#208a74"; //Farbverlauf Farbe 2

//Farbe Balken SOC
$chart_color_soc_1 = "#0054ff"; //Farbverlauf Farbe 1
$chart_color_soc_2 = "#44a4f5"; //Farbverlauf Farbe 2

//Animation Statusbalken
$verlauf_animation = "gradient_leistung 10s infinite"; //Deaktivieren="none", Aktivieren = "gradient_leistung 10s infinite" (über die 10s kann die geschwindigkeit angepasst werden)

//Farbe LED beim Laden
$led_color_charge = "#05d9f5";

//Farbe LED Fehler
$led_color_error = "#ff0000";

//Farbe LED fertig
$led_color_fertig = "#00d43f";

//Bildgröße bzw. Spaltenbreite Layout (Linke Spalte=Bild, Rechte Spalte=Infobereich) Breite in Prozent.
$breite_bild = "20%";
$breite_infobereich = "80%";


// Ab hier nichts mehr ändern! AUSSER DIE ID DER HTML-BOX VARIABLE IN DER LETZTEN ZEILE!
//#####################################################################################################################



// Alle Variablen IDs kommmasepariert ausgeben.
// Filtere Werte, die gleich 0 sind, aus dem Array
$config = array_filter($config, function($value) {
    return $value !== 0;
});

// Füge die verbleibenden Werte zu einem String zusammen
$alle_ids = implode(', ', $config);


$html = '
<!DOCTYPE html>
<html lang="de">
<head>
  <script src="'. $fontawesomeurl .'" crossorigin="anonymous"></script>
  <style>
    :root {
      --soc: calc(var(--' . $config['wb_soc'] .')  * 1%);
      --soc_ziel: calc((100 - var(--' . $config['wb_soc_ziel'] .'))  * 1%);
      --max_ladeleistung: var(--'. $config['wb_max_ladeleistung'] .');
      --kabel: none;
      --error_animation: none;
      --error_color: red;
      --ladeleistung_prozent_round: calc(var(--'. $config['wb_leistung_zum_auto'] .') / var(--max_ladeleistung) * 100%);
      --led_color: #0fff;

/* Werte für Farbverlauf für 1-phasiges Laden */
--led_1p_1_position: calc(95% - (var(--'. $config['wb_leistung_zum_auto'] .') * 4%)); 

/* Werte für Farbverlauf für 3-phasiges Laden */
--led_3p_1_position: calc(30% - (var(--'. $config['wb_leistung_zum_auto'] .') * 2%));
--led_3p_2_position: calc(60% - (var(--'. $config['wb_leistung_zum_auto'] .') * 2%)); 
--led_3p_3_position: calc(95% - (var(--'. $config['wb_leistung_zum_auto'] .') * 2%)); 



}

body {
  margin: 0;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: transparent;
}

::-webkit-scrollbar-thumb {
  background: transparent;
  border-radius: 20px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.main_container {
    width: 100%;
    display: flex;
    flex-wrap: nowrap;
    position: relative;
    font-size: '.$fontsize_main.';
    box-sizing: border-box;
}

.div1 {
    width: '. $breite_bild .';
    height: 100%;
    box-sizing: border-box;
    position: relative;
    overflow: hidden;

}

.image1 {
    width: 100%;
    box-sizing: border-box;
    position: relative;
  
}
.image1 img {
    width: 100%;
    height: auto;
    display: block;
}

.image2 {
  width: 100%;
    position: absolute;
    top: 0;
    left: 0;
    color: white;
    z-index: 1; /* Damit image2 über image1 angezeigt wird */
    display: var(--kabel);
}
.image2 img {
    width: 100%; /* Bilder in image1 auf 100% Breite von div1 skalieren */
    height: auto;
    display: block;
}

.led_animation_centered {
  width: 70%;
  aspect-ratio: 1 / 1;
  position: absolute;
  top: 73%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: -10;
  display: '. $led_animation_switch .';
}

.led_animation_1p {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-image: conic-gradient(from 0deg, #fff var(--led_1p_1_position), '. $led_color_charge .' 98%, #fff);
  background-size: 100% 100%;
  border-radius: 50%;
  animation-name: rotate;
  animation-duration: 10s;
  animation-iteration-count: infinite;
  animation-direction: normal;
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}

.led_animation_3p {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-image: conic-gradient(from 0deg, #fff var(--led_3p_1_position), '. $led_color_charge .' 33%, #fff 34%, #fff var(--led_3p_2_position), '. $led_color_charge .' 63%, #fff 64%, #fff var(--led_3p_3_position), '. $led_color_charge .' 99%, #fff 100%);
  background-size: 100% 100%;
  border-radius: 50%;
  animation-name: rotate;
  animation-duration: 10s;
  animation-iteration-count: infinite;
  animation-direction: normal;
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}

@keyframes rotate {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
}

.led_animation_error {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-color: '. $led_color_error .';
  border-radius: 50%;
    animation: blinker 1s linear infinite;
  }
.led_animation_fertig {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-color: '. $led_color_fertig .';
  border-radius: 50%;
  }

.led_animation_warten {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-image: conic-gradient(from 0deg, #fff 0%, #fff var(--led_1p_1_position),'. $led_color_charge .' var(--led_1p_1_position), '. $led_color_charge .' 98%, #fff);
  background-size: 100% 100%;
  border-radius: 50%;
      animation: blinker 1s linear infinite;
}

@keyframes blinker {
  50% {
    opacity: 0;
  }
}

.led_animation_aus {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-color: white;
  border-radius: 50%;
}

.div2 {
  width: '. $breite_infobereich .';
  padding: 5px 5px 5px 2.5%;
  margin: 0px 0px 0px 2.5%;
  box-sizing: border-box;
  border-radius: 0px;
  border-left: 1px dotted #28cdab;
}

.balkendiagramm {
  width: 100%;
  display: flex;
  position: relative;
  margin-bottom: 2%;
  margin-top: 2%;
  box-sizing: border-box;
}
.balkendiagramm_soc {
  width: 100%;
  display: var(--soc_switch_css);
  position: relative;
  margin-bottom: 2%;
  margin-top: 2%;
  box-sizing: border-box;
}


.balken_links_leistung,
.balken_rechts_leistung,
.balken_links_soc,
.balken_rechts_soc
  {
    height: calc(var(--div-height) + var(--div-height) /5);
    border-radius: calc(var(--div-height) / 4) 0px 0px calc(var(--div-height) / 4);
    font-size: '.$fontsize_chart.';
    transition: width 2s;
    transition-timing-function: ease;
}

@keyframes gradient_leistung {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: -200% 0;
  }
}

.balken_links_leistung {
    width: var(--ladeleistung_prozent_round);
    background: repeating-linear-gradient(to right, '.$chart_color_leistung_1.' 0%, '.$chart_color_leistung_2.' 50%, '.$chart_color_leistung_1.' 100%);
    background-size: 200% auto;
    background-position: 0 100%;
    animation: '.$verlauf_animation.';
    animation-fill-mode: forwards;
    animation-timing-function: linear;
}
.balken_links_soc {
    width: var(--soc);
    background: repeating-linear-gradient(to right, '.$chart_color_soc_1.' 0%, '.$chart_color_soc_2.' 50%, '.$chart_color_soc_1.' 100%);
    background-size: 200% auto;
    background-position: 0 100%;
    animation: '.$verlauf_animation.';
    animation-fill-mode: forwards;
    animation-timing-function: linear;
}



.balken_links_text {
    position: absolute;
    top: 50%;
    left: 2%;
    transform: translate(-0%, -50%);
    color: '.$font_color_chart.';
    z-index: 2;
    padding: 3px;
}


.balken_soc_text_rechts {
    display: var(--soc_zielwert_switch_css);
    justify-content: right; /* Horizontal zentriert */
    align-items: center; /* Vertikal zentriert */
    height: 90%;
    position: absolute;
    top: 50%;
    right: var(--soc_ziel);
    transform: translate(-0%, -50%);
    color: '.$font_color_chart.';
    z-index: 3;
    padding: 0px;
    border-right: 2px solid black;

}

.phasen {
}

.balken_rechts {
  width: 100%;
  border-radius: calc(var(--div-height) / 4) calc(var(--div-height) / 4);
  background: linear-gradient(to right, rgba(135, 135, 135, 0.6) 0%, rgba(135, 135, 135, 0.2) 100%);
  overflow: hidden;
}

.status_0 {
    color: '.$wb_status_color_0.';
}
.status_1 {
    color: '.$wb_status_color_1.';
}
.status_2, {
    color: '.$wb_status_color_2.';
}
.status_3 {
    color: '.$wb_status_color_3.';
}
.status_4 {
    color: '.$wb_status_color_4.';
}
.status_5 {
    color: '.$wb_status_color_5.';
}
.status_6 {
    color: '.$wb_status_color_6.';
}
.status_7 {
    color: '.$wb_status_color_7.';
}
.status_8 {
    color: '.$wb_status_color_8.';
}
.status_9 {
    color: '.$wb_status_color_9.';
}


.status-error {
    animation: var(--error_animation);
    animation-fill-mode: both;
    color: var(--error_color), currentColor;
}
.error_animation {
    animation: var(--error_animation);
    animation-fill-mode: both;
    color: var(--error_color);
    
}




  @keyframes blink {
    0% {
        opacity: 0
    }

    50% {
        opacity: 1
    }

    100% {
        opacity: 0
    }
}

.container_daten {
    display: flex;
    flex-wrap: nowrap;
    width: 100%;
    font-size: '.$fontsize_infos.';
}

.daten_links {
  margin-right: 20px;
  border: 0px solid #000;
}

.daten_rechts {
  border: 0px solid #000;
}

.icon {
    color: '.$icon_color.';
}

        th, td {
            padding: 0px 0px 0px 5px; 
            text-align: left;
            border: none;
            font-size: '.$fontsize_infos.';
        }
</style>
</head>
<body>
  <div class="main_container">
    <div id="div1" class="div1">
    <div class="image1" id="image1"><div class="led_animation_centered"><div class="" id="led_animation"></div></div><img id="wb_image" src="/'.$image_pfad.''.$wb_status_image_0.'"/></div>
    <div class="image2" id="image2"><img src="/user/img/wallbox/go_e_ladekabel.webp"></div>
    </div>
    <div class="div2">
      <b>Status: </b><span id="' . $config['wb_status'] . '"></span><br>
      <div class="balkendiagramm">
        <div class="balken_rechts">
          <div class="balken_links_leistung">
            <span class="balken_links_text"><b>Leistung: </b> <span id="' . $config['wb_leistung_zum_auto'] . '">0</span> KW</span>
          </div>
        </div>
      </div>

      <div class="balkendiagramm_soc">
        <div class="balken_rechts">
          <div class="balken_links_soc">
            <span class="balken_links_text"><b>SOC: </b> <span id="' . $config['wb_soc'] . '">0</span> %</span>
<div class="balken_soc_text_rechts"><b>Ladeziel&nbsp;&nbsp;</b></div>
          </div>
        </div>
      </div>
      <div class="container_daten">

<table>
            <tr>
                <td><i class="fa-solid fa-bolt fa-sm icon"></i>&nbsp;&nbsp;<br></td>
                <td>Geladen:</td>
                <td>Aktuell: <span id="' . $config['wb_energie_vorgang'] . '"></span> kWh,&nbsp;&nbsp;&nbsp; Gesamt: <span id="' . $config['wb_energie_gesamt'] . '"></span> kWh</td>
            </tr>
            <tr>
                <td><i class="fa-solid fa-bars fa-sm icon"></i></td>
                <td>Phasen:</td>
                <td><span class="phasen" id="' . $config['wb_genutzte_phasen'] . '"></span></td>
            </tr>
            <tr>
                <td><i class="fa-solid fa-lock fa-sm icon"></i></td>
                <td>Verriegelung:</td>
                <td><span  id="'. $config['wb_verriegelung'] .'"></span></td>
            </tr>
            <tr>
                <td><i class="fa-solid fa-plug fa-sm icon"></i></td>
                <td>Ladekabel:</td>
                <td><span  id="' . $config['wb_kabel'] . '"></span></td>
            </tr>
            <tr>
                <td><i class="fa-solid fa-key fa-sm icon"></i></td>
                <td>Zugang:</td>
                <td><span  id="' . $config['wb_zugangskontrolle'] . '"></span></td>
            </tr>
            <tr>
                <td><i class="fa-solid fa-triangle-exclamation fa-sm icon"></i></td>
                <td>Fehler</td>
                <td><span class="status-error" id="' . $config['wb_fehler'] .'"></span></td>
            </tr>
    </table>

  </div>  </div>
  <script type="text/javascript">
    var spanElement = document.querySelector(\'.balken_links_text\');
    var root = document.documentElement;
    var spanHeight = spanElement.clientHeight;
    root.style.setProperty(\'--div-height\', spanHeight + \'px\');
  </script>





  <script type="text/javascript" charset="UTF-8">

let status_phasen = true;
let status_status = 1;
let status_error = 0;

  var baseURL = document.baseURI;
    var username = \''.$username.'\';
    var wf_password = \''.$wf_password.'\';
    var fern_password = \''.$fern_password.'\';
    var serverAddressLocal = \''.$serverAddressLocal.'\';
    var serverAddressConnect = \''.$serverAddressConnect.'\';
    var serverPort = \''.$port.'\';
    var variableIDs = ['. $alle_ids .'];
    var wfid = \''.$webfront_id.'\'; 

  // Create basic authentication string
  var credentials = btoa(username + \':\' + fern_password);

  // Function to handle JSON-RPC requests
  const handleJSONRPCRequest = async (rpcURL, request) => {
    try {
      const response = await fetch(rpcURL, {
        method: \'POST\',
        headers: {
          \'Authorization\': \'Basic \' + credentials,
          \'Content-Type\': \'application/json\',
        },
        body: JSON.stringify(request),
      });
      if (response.ok) {
        const data = await response.json();
        return data;
      } else {
        console.error(\'Fehler bei der Anfrage: \' + response.statusText);
        return null;
      }
    } catch (error) {
      console.error(\'Fehler bei der Anfrage: \' + error.message);
      return null;
    }
  };

  // Main function to process JSON-RPC requests
  const processJSONRPCRequests = async () => {
    var rpcURL;
    if (baseURL.includes(\'ipmagic.de\')) {
      rpcURL = \'https://\' + serverAddressConnect + \'/api/\';
    } else {
      rpcURL = \'http://\' + serverAddressLocal + \':\' + serverPort + \'/api/\';
    }

    // Process JSON-RPC requests
    for (let index = 0; index < variableIDs.length; index++) {
      const variableID = variableIDs[index];
      // Define your JSON-RPC request
      const request = {
        jsonrpc: \'2.0\',
        method: \'GetValue\',
        params: [variableID],
        id: index + 1,
      };

      // Handle the JSON-RPC request
      const data = await handleJSONRPCRequest(rpcURL, request);
      if (data) {
        // Data processing logic here
            var value = data.result;
            if (value.toString().includes(\'.\')) {
            // Round the value to two decimal places
            value = parseFloat(value).toFixed(2);
            }
        var divElement = document.getElementById(variableID.toString());
        //CSS Variablen nur Schreiben wenn 
        var cssVariableName = \'--\' + variableID;
        var root = document.documentElement;
        root.style.setProperty(cssVariableName, value);
        if (divElement) {

          // Status 2
          if (variableID === '. $config['wb_status'] .') {
            status_status = value;
                          var statusMapping = {
                          0: { text: \''.$wb_status_text_0.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_0.'\' },
                          1: { text: \''.$wb_status_text_1.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_1.'\' },
                          2: { text: \''.$wb_status_text_2.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_2.'\' },
                          3: { text: \''.$wb_status_text_3.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_3.'\' },
                          4: { text: \''.$wb_status_text_4.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_4.'\' },
                          5: { text: \''.$wb_status_text_5.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_5.'\' },
                          6: { text: \''.$wb_status_text_6.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_6.'\' },
                          7: { text: \''.$wb_status_text_7.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_7.'\' },
                          8: { text: \''.$wb_status_text_8.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_8.'\' },
                          9: { text: \''.$wb_status_text_9.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_9.'\' },
                          };
                          if (statusMapping[value]) {
                            divElement.innerHTML = \'<span class="status_\' + value + \'">\' + statusMapping[value].text + \'</span>\';
                          var wb_image = document.getElementById("wb_image");
                          wb_image.src = statusMapping[value].image;
                          }
          }

          //Ladeleistung zum Auto
          else if (variableID === ' . $config['wb_leistung_zum_auto'] . ') {
            var divElement = document.getElementById(\'' . $config['wb_leistung_zum_auto'] . '\');
            divElement.innerHTML = \'<span>\' + value + \'</span>\';
            
            }
        
            // Verriegelung
            else if (variableID === '. $config['wb_verriegelung'] .') {
                          var statusMapping = {
                          0: { text: \''. $wb_verriegelung_0 .'\' },
                          1: { text: \''. $wb_verriegelung_1 .'\' },
                          2: { text: \''. $wb_verriegelung_2 .'\' },
                          3: { text: \''. $wb_verriegelung_3 .'\' },
                          4: { text: \''. $wb_verriegelung_4 .'\' },
                          5: { text: \''. $wb_verriegelung_5 .'\' },
                          6: { text: \''. $wb_verriegelung_6 .'\' },
                          7: { text: \''. $wb_verriegelung_7 .'\' },
                          8: { text: \''. $wb_verriegelung_8 .'\' },
                          9: { text: \''. $wb_verriegelung_9 .'\' },
                          };
                          if (statusMapping[value]) {
                            divElement.innerHTML = \'<span class="status_\' + value + \'">\' + statusMapping[value].text + \'</span>\';
                          }
            }

            // Kabel
            else if (variableID === '. $config['wb_kabel'] .') {
                          var statusMapping = {
                          0: { text: \''. $wb_kabel_0 .'\' },
                          1: { text: \''. $wb_kabel_1 .'\' },
                          2: { text: \''. $wb_kabel_2 .'\' },
                          3: { text: \''. $wb_kabel_3 .'\' },
                          4: { text: \''. $wb_kabel_4 .'\' },
                          5: { text: \''. $wb_kabel_5 .'\' },
                          6: { text: \''. $wb_kabel_6 .'\' },
                          7: { text: \''. $wb_kabel_7 .'\' },
                          8: { text: \''. $wb_kabel_8 .'\' },
                          9: { text: \''. $wb_kabel_9 .'\' },
                          10: { text: \''. $wb_kabel_10 .'\' },
                          11: { text: \''. $wb_kabel_11 .'\' },
                          12: { text: \''. $wb_kabel_12 .'\' },
                          13: { text: \''. $wb_kabel_13 .'\' },
                          14: { text: \''. $wb_kabel_14 .'\' },
                          15: { text: \''. $wb_kabel_15 .'\' },
                          16: { text: \''. $wb_kabel_16 .'\' },
                          17: { text: \''. $wb_kabel_17 .'\' },
                          18: { text: \''. $wb_kabel_18 .'\' },
                          19: { text: \''. $wb_kabel_19 .'\' },
                          20: { text: \''. $wb_kabel_20 .'\' },
                          21: { text: \''. $wb_kabel_21 .'\' },
                          22: { text: \''. $wb_kabel_22 .'\' },
                          23: { text: \''. $wb_kabel_23 .'\' },
                          24: { text: \''. $wb_kabel_24 .'\' },
                          25: { text: \''. $wb_kabel_25 .'\' },
                          26: { text: \''. $wb_kabel_26 .'\' },
                          27: { text: \''. $wb_kabel_27 .'\' },
                          28: { text: \''. $wb_kabel_28 .'\' },
                          29: { text: \''. $wb_kabel_29 .'\' },
                          30: { text: \''. $wb_kabel_30 .'\' },
                          31: { text: \''. $wb_kabel_31 .'\' },
                          32: { text: \''. $wb_kabel_32 .'\' },
                          };
                          if (statusMapping[value]) {
                            divElement.innerHTML = \'<span class="status_\' + value + \'">\' + statusMapping[value].text + \'</span>\';
                          
                                        if (value !== 0) {
                                            root.style.setProperty(\'--kabel\', \'inline\');
                                        } else {
                                            root.style.setProperty(\'--kabel\', \'none\');
                                        }
                          }
            }



            // Zugang
            else if (variableID === '. $config['wb_zugangskontrolle'] .') {
                          var statusMapping = {
                          0: { text: \''. $wb_zugang_0 .'\' },
                          1: { text: \''. $wb_zugang_1 .'\' },
                          2: { text: \''. $wb_zugang_2 .'\' },
                          3: { text: \''. $wb_zugang_3 .'\' },
                          4: { text: \''. $wb_zugang_4 .'\' },
                          5: { text: \''. $wb_zugang_5 .'\' },
                          6: { text: \''. $wb_zugang_6 .'\' },
                          7: { text: \''. $wb_zugang_7 .'\' },
                          8: { text: \''. $wb_zugang_8 .'\' },
                          9: { text: \''. $wb_zugang_9 .'\' },
                          };
                          if (statusMapping[value]) {
                            divElement.innerHTML = \'<span class="status_\' + value + \'">\' + statusMapping[value].text + \'</span>\';
                          }
            }

            //Fehler
            else if (variableID === ' . $config['wb_fehler'] . ') {
                var divElement = document.getElementById(\'' . $config['wb_fehler'] . '\');
                status_error = value;  
                        var statusMapping = {
                          0: { text: \''. $wb_fehler_0 .'\' },
                          1: { text: \''. $wb_fehler_1 .'\' },
                          2: { text: \''. $wb_fehler_2 .'\' },
                          3: { text: \''. $wb_fehler_3 .'\' },
                          4: { text: \''. $wb_fehler_4 .'\' },
                          5: { text: \''. $wb_fehler_5 .'\' },
                          6: { text: \''. $wb_fehler_6 .'\' },
                          7: { text: \''. $wb_fehler_7 .'\' },
                          8: { text: \''. $wb_fehler_8 .'\' },
                          9: { text: \''. $wb_fehler_9 .'\' },
                          10: { text: \''. $wb_fehler_10 .'\' },
                      };
                      if (statusMapping[value]) {
                            divElement.innerHTML = \'<span>\' + statusMapping[value].text + \'</span>\';
                                      if (value !== 0) {
                                          root.style.setProperty(\'--error_animation\', \'blink 1.5s infinite\');
                                          root.style.setProperty(\'--error_color\', \'red\');
                                      } else {
                                          root.style.setProperty(\'--error_animation\', \'none\');
                                          root.style.setProperty(\'--error_color\', \'#000000\');
                                      }


                          }
          } 

          else if (variableID === '. $config['wb_genutzte_phasen'] .') {
            status_phasen = value;
            var valueHtml;
                    if (value === false) {
                      valueHtml = \'<i class="fa-solid fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-solid fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-solid fa-circle fa-sm icon"></i>\';
                    } else if (value === true) {
                      valueHtml = \'<i class="fa-solid fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-regular fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-regular fa-circle fa-sm icon"></i>\';
                    } 
            divElement.innerHTML = valueHtml;
          } else {
                    divElement.innerHTML = value;
          }

        } else {

            // SOC Anzeige
            if (variableID === '. $config['wb_soc_switch'] .') {
                          if (value === true) {
                              root.style.setProperty(\'--soc_switch_css\', \'flex\');
                          } else {
                              root.style.setProperty(\'--soc_switch_css\', \'none\');
                          }
                          console.log(\'variableID\');
            }            
             // SOC-Zielwert Anzeige
            else if (variableID === '. $config['wb_soc_zielwert_switch'] .') {
                          if (value === true) {
                              root.style.setProperty(\'--soc_zielwert_switch_css\', \'flex\');
                          } else {
                              root.style.setProperty(\'--soc_zielwert_switch_css\', \'none\');
                          }
                          console.log(\'Soc-Zielwert\');
            } 


        }
      
      
      
      }
    }
  };
processJSONRPCRequests();


var websocketURL = baseURL.includes(\'ipmagic.de\')
  ? \'wss://\' + serverAddressConnect + \'/wfc/\' + wfid + \'/api/\'
  : \'ws://\' + serverAddressLocal + \':\' + serverPort + \'/wfc/\' + wfid + \'/api/\';
var connection = new WebSocket(websocketURL, [encodeURIComponent(btoa(\'webfront:\' + wf_password))]);
connection.onopen = function (event) {
  console.log(\'WebSocket-Verbindung geöffnet.\');
};

    function processWebSocketMessage(event) {
      var data = JSON.parse(event.data);
      var senderID = data.SenderID;
      if (numericValue.toString().includes(\'.\')) {
       // Round the value to two decimal places
      numericValue = parseFloat(numericValue).toFixed(2);
      }
      var cssVariableName = \'--\' + senderID;
      var root = document.documentElement;

      if(getComputedStyle(root).getPropertyValue(cssVariableName)){
      root.style.setProperty(cssVariableName, numericValue);
      }

              // Phasen
              if (senderID === ' . $config['wb_genutzte_phasen'] . ') {
                  status_phasen = numericValue;
                  var valueHtml;
                    if (numericValue == false) {
                        valueHtml = \'<i class="fa-solid fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-solid fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-solid fa-circle fa-sm icon"></i>\';
                    }  
                    else if (numericValue == true) {
                        valueHtml = \'<i class="fa-solid fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-regular fa-circle fa-sm icon"></i>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa-regular fa-circle fa-sm icon"></i>\';
                    }                     
                    var resultDiv = document.getElementById(\'' . $config['wb_genutzte_phasen'] . '\');
                    resultDiv.innerHTML = valueHtml;
              }

              //Status
              else if (senderID === ' . $config['wb_status'] . ') {
                  status_status = numericValue;
                  var divElement = document.getElementById(\'' . $config['wb_status'] . '\');
                  var statusMapping = {
                    0: { text: \''.$wb_status_text_0.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_0.'\' },
                    1: { text: \''.$wb_status_text_1.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_1.'\' },
                    2: { text: \''.$wb_status_text_2.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_2.'\' },
                    3: { text: \''.$wb_status_text_3.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_3.'\' },
                    4: { text: \''.$wb_status_text_4.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_4.'\' },
                    5: { text: \''.$wb_status_text_5.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_5.'\' },
                    6: { text: \''.$wb_status_text_6.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_6.'\' },
                    7: { text: \''.$wb_status_text_7.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_7.'\' },
                    8: { text: \''.$wb_status_text_8.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_8.'\' },
                    9: { text: \''.$wb_status_text_9.'\', image: baseURL + \''.$image_pfad.''.$wb_status_image_9.'\' },
                  };
                            if (statusMapping[numericValue]) {
                            divElement.innerHTML = \'<span class="status_\' + numericValue + \'">\' + statusMapping[numericValue].text + \'</span>\';
                            var wb_image = document.getElementById("wb_image");
                            wb_image.src = statusMapping[numericValue].image;
                            }
              }

              //Ladeleistung zum Auto
              else if (senderID === ' . $config['wb_leistung_zum_auto'] . ') {
                    var divElement = document.getElementById(\'' . $config['wb_leistung_zum_auto'] . '\');
                    if (numericValue < 0.2) {
                      
                    }else if (numericValue >= 0.3 && numericValue < 1.57) {

                    } else if (numericValue >= 1.57 && numericValue < 3.14) {

                    } else if (numericValue >= 3.14 && numericValue < 4.71) {

                    } else if (numericValue >= 4.71 && numericValue < 6.28) {

                    } else if (numericValue >= 6.28 && numericValue < 7.85) {

                    } else if (numericValue >= 7.85 && numericValue < 9.42) {

                    } else if (numericValue >= 9.42 && numericValue < 23) {
                    }
                    else{
                    }
                    divElement.innerHTML = \'<span>\' + numericValue + \'</span>\';
              }
       
              //Verriegelung
              else if (senderID === ' . $config['wb_verriegelung'] . ') {
                    var divElement = document.getElementById(\'' . $config['wb_verriegelung'] . '\');
                    var statusMapping = {
                    0: { text: \''. $wb_verriegelung_0 .'\' },
                    1: { text: \''. $wb_verriegelung_1 .'\' },
                    2: { text: \''. $wb_verriegelung_2 .'\' },
                    3: { text: \''. $wb_verriegelung_3 .'\' },
                    4: { text: \''. $wb_verriegelung_4 .'\' },
                    5: { text: \''. $wb_verriegelung_5 .'\' },
                    6: { text: \''. $wb_verriegelung_6 .'\' },
                    7: { text: \''. $wb_verriegelung_7 .'\' },
                    8: { text: \''. $wb_verriegelung_8 .'\' },
                    9: { text: \''. $wb_verriegelung_9 .'\' },
                    };
                          if (statusMapping[numericValue]) {
                            divElement.innerHTML = \'<span class="status_\' + numericValue + \'">\' + statusMapping[numericValue].text + \'</span>\';
                          }
              }


              //Fehler
              else if (senderID === ' . $config['wb_fehler'] . ') {
                    status_error = numericValue;
                    var divElement = document.getElementById(\'' . $config['wb_fehler'] . '\');
                    var statusMapping = {
                    0: { text: \''. $wb_fehler_0 .'\' },
                    1: { text: \''. $wb_fehler_1 .'\' },
                    2: { text: \''. $wb_fehler_2 .'\' },
                    3: { text: \''. $wb_fehler_3 .'\' },
                    4: { text: \''. $wb_fehler_4 .'\' },
                    5: { text: \''. $wb_fehler_5 .'\' },
                    6: { text: \''. $wb_fehler_6 .'\' },
                    7: { text: \''. $wb_fehler_7 .'\' },
                    8: { text: \''. $wb_fehler_8 .'\' },
                    9: { text: \''. $wb_fehler_9 .'\' },
                    10: { text: \''. $wb_fehler_10 .'\' },
                    };
                    if (statusMapping[numericValue]) {
                                divElement.innerHTML = \'<span>\' + statusMapping[numericValue].text + \'</span>\';
                       
                                if (numericValue !== 0) {
                                    root.style.setProperty(\'--error_animation\', \'blink 1.5s infinite\');
                                    root.style.setProperty(\'--error_color\', \'red\');
                                } else {
                                    root.style.setProperty(\'--error_animation\', \'none\');
                                    root.style.setProperty(\'--error_color\', \'#000000\');
                                }
                    }
              }

     
              //Kabel
              else if (senderID === ' . $config['wb_kabel'] . ') {
                  var divElement = document.getElementById(\'' . $config['wb_kabel'] . '\');
                  var statusMapping = {
                    0: { text: \''. $wb_kabel_0 .'\' },
                    1: { text: \''. $wb_kabel_1 .'\' },
                    2: { text: \''. $wb_kabel_2 .'\' },
                    3: { text: \''. $wb_kabel_3 .'\' },
                    4: { text: \''. $wb_kabel_4 .'\' },
                    5: { text: \''. $wb_kabel_5 .'\' },
                    6: { text: \''. $wb_kabel_6 .'\' },
                    7: { text: \''. $wb_kabel_7 .'\' },
                    8: { text: \''. $wb_kabel_8 .'\' },
                    9: { text: \''. $wb_kabel_9 .'\' },
                    10: { text: \''. $wb_kabel_10 .'\' },
                    11: { text: \''. $wb_kabel_11 .'\' },
                    12: { text: \''. $wb_kabel_12 .'\' },
                    13: { text: \''. $wb_kabel_13 .'\' },
                    14: { text: \''. $wb_kabel_14 .'\' },
                    15: { text: \''. $wb_kabel_15 .'\' },
                    16: { text: \''. $wb_kabel_16 .'\' },
                    17: { text: \''. $wb_kabel_17 .'\' },
                    18: { text: \''. $wb_kabel_18 .'\' },
                    19: { text: \''. $wb_kabel_19 .'\' },
                    20: { text: \''. $wb_kabel_20 .'\' },
                    21: { text: \''. $wb_kabel_21 .'\' },
                    22: { text: \''. $wb_kabel_22 .'\' },
                    23: { text: \''. $wb_kabel_23 .'\' },
                    24: { text: \''. $wb_kabel_24 .'\' },
                    25: { text: \''. $wb_kabel_25 .'\' },
                    26: { text: \''. $wb_kabel_26 .'\' },
                    27: { text: \''. $wb_kabel_27 .'\' },
                    28: { text: \''. $wb_kabel_28 .'\' },
                    29: { text: \''. $wb_kabel_29 .'\' },
                    30: { text: \''. $wb_kabel_30 .'\' },
                    31: { text: \''. $wb_kabel_31 .'\' },
                    32: { text: \''. $wb_kabel_32 .'\' },
                    };

                      if (statusMapping[numericValue]) {
                        divElement.innerHTML = \'<span class="status_\' + numericValue + \'">\' + statusMapping[numericValue].text + \'</span>\';
                        
                                if (numericValue !== 0) {
                                    root.style.setProperty(\'--kabel\', \'inline\');
                                } else {
                                    root.style.setProperty(\'--kabel\', \'none\');
                                }
                      }
              }

            // SOC Anzeige
            else if (senderID === '. $config['wb_soc_switch'] .') {
                          if (numericValue == true) {
                              root.style.setProperty(\'--soc_switch_css\', \'flex\');
                          } else {
                              root.style.setProperty(\'--soc_switch_css\', \'none\');
                          }
                          
            }            
             // SOC-Zielwert Anzeige
            else if (senderID === '. $config['wb_soc_zielwert_switch'] .') {
                          if (numericValue == true) {
                              root.style.setProperty(\'--soc_zielwert_switch_css\', \'flex\');
                          } else {
                              root.style.setProperty(\'--soc_zielwert_switch_css\', \'none\');
                          }
                          
            } 


              else if (senderID === ' . $config['wb_zugangskontrolle'] . ') {
                    var divElement = document.getElementById(\'' . $config['wb_zugangskontrolle'] . '\');

                    var statusMapping = {
                      0: { text: \''. $wb_zugang_0 .'\' },
                      1: { text: \''. $wb_zugang_1 .'\' },
                      2: { text: \''. $wb_zugang_2 .'\' },
                      3: { text: \''. $wb_zugang_3 .'\' },
                      4: { text: \''. $wb_zugang_4 .'\' },
                      5: { text: \''. $wb_zugang_5 .'\' },
                      6: { text: \''. $wb_zugang_6 .'\' },
                      7: { text: \''. $wb_zugang_7 .'\' },
                      8: { text: \''. $wb_zugang_8 .'\' },
                      9: { text: \''. $wb_zugang_9 .'\' },
                      };
                          if (statusMapping[numericValue]) {
                            divElement.innerHTML = \'<span class="status_\' + numericValue + \'">\' + statusMapping[numericValue].text + \'</span>\';
                          }
              }
              //SOC
               else if (senderID === ' . $config['wb_soc'] . ') {
                    var divElement = document.getElementById(\'' . $config['wb_soc'] . '\');
                    divElement.innerHTML = numericValue;
                          
              }
              else{
             // var divElement = document.getElementById(SenderID);
              //divElement.innerHTML = value;
              }


      //Setzen der passenden LED Animation
                  var animationDiv = document.getElementById("led_animation");
      if(status_error !== 0){ //Wenn Fehler dann Animation auf Fehleranimation setzen

                  //CSS class löschen und Alarm class setzen
                  animationDiv.classList = [];
                  animationDiv.classList.add("led_animation_error");
      }
      else if (status_status == 1 && status_error == 0){ //Wenn Value 2 (Laden) dann Ladeanimation setzen

                  //CSS class löschen und Lade class setzen
                    animationDiv.classList = [];
                    animationDiv.classList.add("led_animation_aus"); 
      }  
      else if (status_status == 2 && status_error == 0){ //Wenn Value 2 (Laden) dann Ladeanimation setzen

                  //CSS class löschen und Lade class setzen
                  if (status_phasen == false){ //Class für 3-phasiges Laden setzen
                    animationDiv.classList = [];
                    animationDiv.classList.add("led_animation_3p"); 
                  }
                  else
                  {
                    animationDiv.classList = [];
                    animationDiv.classList.add("led_animation_1p");
                  }
      }
      else if (status_status == 4 && status_error == 0){ //Wenn Value 2 (Laden) dann Ladeanimation setzen

                  //CSS class löschen und Lade class setzen
                    animationDiv.classList = [];
                    animationDiv.classList.add("led_animation_fertig"); 
                 
      }
      else if (status_status == 3 && status_error == 0){ //Wenn Value 2 (Laden) dann Ladeanimation setzen

                  //CSS class löschen und Lade class setzen
                    animationDiv.classList = [];
                    animationDiv.classList.add("led_animation_warten"); 
                 
      }
      else { 
      } 

}
    // Wenn eine Nachricht empfangen wird
    connection.onmessage = processWebSocketMessage;

    // Wenn ein Fehler auftritt
    connection.onerror = function(event) {
        console.error(\'WebSocket-Fehler: \' + event);
    };

    // Wenn die Verbindung geschlossen wird
    connection.onclose = function(event) {
        console.log(\'WebSocket-Verbindung geschlossen.\');
    };

</script></body></html>';

//HTML Code in Stringvariable der HTMLBox schreiben 
Setvalue(38978, $html);

Viele Grüße
Stephan

2 „Gefällt mir“

Kleine Anmerkung zur Grafik: Die animierten Punkte (welche sich im Kreis drehen), haben ja eine Aussage: je ein Segment für die Anzahl der Phasen, je mehr LEDs je Segment, je mehr Ampere.
Eine 4-Segment Anzeige wie im Bild gibt es somit nicht :wink:

haha, danke für den Hinweis. Das kam mir auch etwas komisch vor :slight_smile:
Jetzt wo du es sagst macht auch plötzlich der Text in der Doku Sinn…

Gruß Stephan

Sehr schön animiert. Evtl. noch anzeigen die „Power from grid“ wenn PVsurplus angewählt.
Da fehlt jetzt nur noch das passende animierte Auto dazu :smile:

kann mir zufällig jemand sagen wie lang die Schweife sind wenn man 1-phasig mit voller power lädt? Beim einstellen der Ladeleistung zeigt er je Ampere 1 LED an. Das müssten beim 22kW Charger alle 32 LED sein und beim 11kW Charger 16 LED. Aber wie viele LED rotieren nachher? Beim 1 Phasen Laden können es theoretisch alle 32 (beim 22kW) und 16 beim 11kW sein. Das passt aber nicht beim 3-phasigen Laden. Wie viele sind es da? 32 LED geteilt durch 3 geht ja auch nicht…

Ich würd es ja selbst testen, hab nur die nächsten Tage kein Auto hier…

Viele Grüße
Stephan

Hi,

Die Box sieht super aus. Leider habe ich eine andere Wallbox.

Als Idee: Könntest du das Modul so machen, dass es universell funktioniert? z.B. die Grafiken lassen sich auswählen.

Gruß, Michael

Bilder etc. lassen sich auf jeden Fall konfigurieren. Die kannst du problemlos gegen was anderes austauschen.

Viele Grüße
Stephan

Testversion im ersten Beitrag …

Keiner Zeit das Teil zu testen?

1 „Gefällt mir“

so,

hier mal ein erster Test, wobei ich mir nicht sicher bin, ob ich alles richtig konfiguriert habe.

Die Webseite lädt ein Bild nicht korrekt, weil der Name in dem zip nicht mit dem im Script übereinstimmt. Gesucht wirdn wohl eine „kabel.webp“ und die Datei heist vermutlich „go_e_ladekabel.webp“.

Muss im Script in Zeile 611 korrigiert werden.

Folgende Fehler treten auf, wenn ich das Script ausführe:

Warning: Undefined array key „wb_soc“ in /var/lib/symcon/scripts/29418.ips.php on line 247

Warning: Undefined array key „wb_soc_ziel“ in /var/lib/symcon/scripts/29418.ips.php on line 248

Warning: Undefined array key „wb_soc“ in /var/lib/symcon/scripts/29418.ips.php on line 626

Warning: Undefined array key „wb_soc“ in /var/lib/symcon/scripts/29418.ips.php on line 1153

Warning: Undefined array key „wb_soc“ in /var/lib/symcon/scripts/29418.ips.php on line 1154

Ich habe die beiden Variablen für wb_soc und wb_soc_ziel jeweils auf „0“ gesetzt.

… und Werte werden leider auch nicht angezeigt:

Ich werde morgen mal weitersuchen.

Gruß
Christian

Hi,

danke fürs testen!

Trag mal keine 0 sondern eine 1 oder irgend was was keine Variablen ID ist da ein. Die Null verursacht da irgendwie einen Fehler.

Viele Grüße
Stephan

Hallo Stephan,

ich habe jetzt die beiden Bool Variablen angelegt, und bei den anderen einen Wert ungleich 0 eingetragen. Nun läuft das Script ohne Fehler und Warnungen durch.

Im Kachel-Webfront sieht die Box nun so aus:


Der grüne und blaue Balken hat eine aktiven Verlauf.

Nach einigen Minuten ändert sich das Bild:

Im alten Webfront sieht es noch anders aus:

Da werden zumindest einige Werte angezeigt.

Gruß
Christian

So langsam wird’s :smiley:

Im alten Webfront hab ich das nicht getestet.
Wenn am Anfang keine Daten kommen dann funktioniert die API Abfrage nicht. Über die API werden beim ersten öffnen der Kachel alle Werte abgefragt. Später kommen kann bei Wertänderungen die aktuellen Werte über den Websocket. Sicher dass die Zugangsdaten korrekt sind?

Viele Grüße
Stephan

Bei dir wird auch nicht die korrekte Schriftart verwendet. Das ist noch ein Bug in ips. Du kannst bei den Spezialschaltern die Serversecurity deaktivieren. Dann werden die Schriften geladen. Spezialschalter — IP-Symcon :: Automatisierungssoftware

Hallo,
dann warte ich mal, bis der Fehler behoben ist. Den CORS Schutz würde ich ungerne ausschalten.

Aber Danke für die Bereitstellung und Entwicklung.

Gruß
Christian

Die Kachel müsste auch ohne spezialschalter laufen, hast dann halt nur die falsche Schriftart …

Oh gerade erst gesehen :grinning:
Ich teste das die Tage mit meinen Keba Wallboxen :upside_down_face:

Da habe ich aktuell vielleicht noch ein Durcheinander.
Ich habe die Variablen im alten Webfront verlinkt, und auch als Webfront Instanz das alte Webfront eingetragen.

Ich werde das mal anders testen.

Gruß
Christian

Edit: ändert leider nichts, die Kennwörter habe ich noch mal geprüft.

Ich vermute, das Problem liegt beim Fernzugang. Da werde ich noch mal weitersuchen.

Hi Stephan,

ich habe ja schon deine Wärmepumpen HTML Box in Gebrauch und versuche mich gerade an der HTML Wallbox.
Ich habe allerdings die gleichen Probleme wie Christian. Es werden keine Daten angezeigt und die SoC Anzeige ist komisch. Der Spezialschalter ist deaktiviert, sonst würde die WP Box nicht funzen.