Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- extended minimal display to support second CP (for DUO)
Browse files Browse the repository at this point in the history
- merge max scale setting for multiple display themes
- extend max scale setting for minimal display theme
- allow max scale setting even if configured as blind CP

E3DC Driver...

Für Openwb 2.0 muss offensichtlich der die type Variable dem Verzeichnissnamen entsprechen , sonst Absturz im Online beim konfigurieren
Bei der Verarbeitung des Befehls 'addDevice' mit den Parametern '[object Object]' ist ein Fehler aufgetreten:
Es ist ein interner Fehler aufgetreten: Traceback (most recent call last):
  File "/var/www/html/openWB/packages/helpermodules/command.py", line 112, in on_message
    func(connection_id, payload)
  File "/var/www/html/openWB/packages/helpermodules/command.py", line 123, in addDevice
    dev = importlib.import_module(".devices."+payload["data"]["type"]+".device", "modules")
  File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 1030, in _gcd_import
  File "", line 1007, in _find_and_load
  File "", line 972, in _find_and_load_unlocked
  File "", line 228, in _call_with_frames_removed
  File "", line 1030, in _gcd_import
  File "", line 1007, in _find_and_load
  File "", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'modules.devices.E3DC'

Für openwb 1.9 keine Auswirkungen

new isss for buchse master (#2550)

* new isss for daemon

* review

* renaming

Bump version 1.9.290

Bump version 1.9.291

batterx: fix ids

remove unneccessary log msg

refine duo display
jotpehenn committed Jan 7, 2023
1 parent e52f25d commit 5e7b50f
Showing 18 changed files with 1,413 additions and 769 deletions.
13 changes: 7 additions & 6 deletions packages/modules/chargepoints/internal_openwb/socket.py
Original file line number Diff line number Diff line change
@@ -48,8 +48,9 @@ class ActorState(IntEnum):


class Socket(ChargepointModule):
def __init__(self, max_current: int, config: InternalOpenWB) -> None:
self.max_current = max_current
def __init__(self, socket_max_current: int, config: InternalOpenWB) -> None:
log.debug("Konfiguration als Buchse.")
self.socket_max_current = socket_max_current
super().__init__(config)

def set_current(self, current: float) -> None:
@@ -60,12 +61,12 @@ def set_current(self, current: float) -> None:
log.error("Error getting actor status! Using default 'opened'.")
actor = ActorState.OPENED

if actor == ActorState.CLOSED:
if current == self.set_current_evse or self.chargepoint_state.plug_state is False:
if actor == ActorState.CLOSED or self.chargepoint_state.plug_state is False:
if current == self.set_current_evse:
return
else:
current = 0
super().set_current(min(current, self.max_current))
super().set_current(min(current, self.socket_max_current))

def get_values(self, phase_switch_cp_active: bool) -> Tuple[ChargepointState, float]:
try:
@@ -94,6 +95,6 @@ def __close_actor(self):
def __set_actor(self, open: bool):
GPIO.output(23, GPIO.LOW if open else GPIO.HIGH)
GPIO.output(26, GPIO.HIGH)
time.sleep(2 if open else 3)
time.sleep(1)
GPIO.output(26, GPIO.LOW)
log.debug("Actor opened" if open else "Actor closed")
2 changes: 1 addition & 1 deletion packages/modules/common/fault_state.py
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@ def store_error(self, component_info: ComponentInfo) -> None:
if ramdisk:
topic = component_type.type_topic_mapping_comp(component_info.type)
prefix = "openWB/set/" + topic + "/"
if component_info.id is not None:
if component_info.type != "counter" and component_info.type != "bat":
if component_type == "vehicle":
prefix += str(component_info.id) + "/socFault"
else:
4 changes: 2 additions & 2 deletions packages/modules/devices/batterx/device.py
Original file line number Diff line number Diff line change
@@ -87,9 +87,9 @@ def read_legacy(
dev = Device(device_config)
dev = _add_component(dev, component_type, num)
if evu_counter == "bezug_batterx":
dev = _add_component(dev, "counter", None)
dev = _add_component(dev, "counter", 0)
if bat == "speicher_batterx":
dev = _add_component(dev, "bat", None)
dev = _add_component(dev, "bat", 3)

log.debug('BatterX IP-Adresse: ' + ip_address)

2 changes: 1 addition & 1 deletion packages/modules/devices/e3dc/config.py
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ def __init__(self, address: str = None):
class E3dc:
def __init__(self,
name: str = "E3DC",
type: str = "E3DC",
type: str = "e3dc",
id: int = 0,
configuration: E3dcConfiguration = None) -> None:
self.name = name
440 changes: 0 additions & 440 deletions runs/buchse.py

This file was deleted.

1 change: 1 addition & 0 deletions runs/initRamdisk.sh
Original file line number Diff line number Diff line change
@@ -373,6 +373,7 @@ initRamdisk(){
echo 0 > $RamdiskPath/socketApproved
echo 0 > $RamdiskPath/socketActivated
echo 0 > $RamdiskPath/socketActivationRequested
echo "unknown" > $RamdiskPath/prev_isss_mode

# diverse Dateien
echo 0 > $RamdiskPath/AllowedTotalCurrentPerPhase
41 changes: 22 additions & 19 deletions runs/isss.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
#!/usr/bin/python
from enum import Enum
import logging
import os
import re
import sys
import threading
import time
from typing import Dict, List, Optional
from typing import List, Optional
import RPi.GPIO as GPIO

from helpermodules.pub import pub_single
from helpermodules import compatibility
from modules.common.store import ramdisk_read, ramdisk_write
from modules.common.store._util import get_rounding_function_by_digits
from modules.common.fault_state import FaultState
from modules.common.component_state import ChargepointState
from modules.common.modbus import ModbusSerialClient_
from modules.chargepoints.internal_openwb import chargepoint_module, socket
from modules.chargepoints.internal_openwb import chargepoint_module
from modules.chargepoints.internal_openwb.socket import Socket
from modules.chargepoints.internal_openwb.chargepoint_module import InternalOpenWB

basePath = "/var/www/html/openWB"
@@ -23,6 +25,12 @@
MAP_LOG_LEVEL = [logging.ERROR, logging.WARNING, logging.DEBUG]


class IsssMode(Enum):
SOCKET = "socket"
DUO = "duo"
DAEMON = "daemon"


logging.basicConfig(filename=ramdiskPath+'/isss.log',
format='%(asctime)s - {%(name)s:%(lineno)s} - %(levelname)s - %(message)s',
level=MAP_LOG_LEVEL[int(os.environ.get('debug'))])
@@ -193,17 +201,14 @@ def __thread_cp_interruption(self, duration: int) -> None:


class Isss:
def __init__(self) -> None:
def __init__(self, mode: IsssMode, socket_max_current: int) -> None:
log.debug("Init isss")
self.serial_client = ModbusSerialClient_(self.detect_modbus_usb_port())
self.cp0 = IsssChargepoint(self.serial_client, 0)
try:
if int(ramdisk_read("issslp2act")) == 1:
self.cp1 = IsssChargepoint(self.serial_client, 1)
else:
self.cp1 = None
except (FileNotFoundError, ValueError) as e:
log.error("Error reading issslp2act! Guessing cp2 is not configured.")
self.cp0 = IsssChargepoint(self.serial_client, 0, mode, socket_max_current)
if mode == IsssMode.DUO:
log.debug("Zweiter Ladepunkt für Duo konfiguriert.")
self.cp1 = IsssChargepoint(self.serial_client, 1, mode, socket_max_current)
else:
self.cp1 = None
self.init_gpio()

@@ -263,14 +268,12 @@ def get_parent_wb() -> str:


class IsssChargepoint:
def __init__(self, serial_client: ModbusSerialClient_, local_charge_point_num: int) -> None:
def __init__(self, serial_client: ModbusSerialClient_, local_charge_point_num: int, mode: IsssMode, socket_max_current: int) -> None:
self.local_charge_point_num = local_charge_point_num
if local_charge_point_num == 0:
try:
with open('/home/pi/ppbuchse', 'r') as f:
max_current = int(f.read())
self.module = socket.Socket(max_current, InternalOpenWB(0, serial_client))
except (FileNotFoundError, ValueError):
if mode == IsssMode.SOCKET:
self.module = Socket(socket_max_current, InternalOpenWB(0, serial_client))
else:
self.module = chargepoint_module.ChargepointModule(InternalOpenWB(0, serial_client))
else:
self.module = chargepoint_module.ChargepointModule(InternalOpenWB(1, serial_client))
@@ -297,4 +300,4 @@ def __thread_active(thread: Optional[threading.Thread]) -> bool:
log.exception("Fehler bei Ladepunkt "+str(self.local_charge_point_num))


Isss().loop()
Isss(IsssMode(sys.argv[1]), int(sys.argv[2])).loop()
51 changes: 26 additions & 25 deletions runs/services.sh
Original file line number Diff line number Diff line change
@@ -63,18 +63,37 @@ start() {
fi


if (( isss == 1 )) || [[ "$evsecon" == "daemon" ]]; then
openwbDebugLog "MAIN" 1 "external openWB or daemon mode configured"
if pgrep -f '^python.*/isss.py' > /dev/null
if (( isss == 1 )) || [[ "$evsecon" == "daemon" ]] || [[ "$evsecon" == "buchse" ]]; then
if [[ "$evsecon" == "buchse" ]]; then
isss_mode="socket"
elif [[ $lastmanagement == 1 ]]; then
isss_mode="duo"
else
isss_mode="daemon"
fi
prev_isss_mode=$(< $OPENWBBASEDIR/ramdisk/isss_mode)

openwbDebugLog "MAIN" 1 "external openWB, daemon mode or socket mode configured"
if pgrep -f '^python.*/isss.py' > /dev/null && [[ $prev_isss_mode == $isss_mode ]];
then
openwbDebugLog "MAIN" 1 "isss handler already running"
else
openwbDebugLog "MAIN" 0 "isss handler not running! restarting process"
echo "$lastmanagement" > "$OPENWBBASEDIR/ramdisk/issslp2act"
nohup python3 "$OPENWBBASEDIR/runs/isss.py" >>"$OPENWBBASEDIR/ramdisk/isss.log" 2>&1 &
openwbDebugLog "MAIN" 0 "Start/restart isss handler in mode $isss_mode."
if [ -f /home/pi/ppbuchse ]; then
ppbuchse=$(< /home/pi/ppbuchse)
re='^[0-9]+$'
if ! [[ $ppbuchse =~ $re ]] ; then
openwbDebugLog "MAIN" 0 "Invalid value in ppbuchse. Set ppbuchse to 32."
ppbuchse=32
fi
else
ppbuchse=32
fi
nohup python3 "$OPENWBBASEDIR/runs/isss.py" "$isss_mode" "$ppbuchse">>"$OPENWBBASEDIR/ramdisk/isss.log" 2>&1 &
fi
echo "$isss_mode" > $OPENWBBASEDIR/ramdisk/isss_mode
else
openwbDebugLog "MAIN" 1 "external openWB or daemon mode not configured; checking network setup"
openwbDebugLog "MAIN" 1 "external openWB, daemon mode or socket mode not configured; checking network setup"
local ethstate=$(</sys/class/net/eth0/carrier)
if (( ethstate == 1 )); then
sudo ifconfig eth0:0 "$virtual_ip_eth0" netmask 255.255.255.0 up
@@ -96,24 +115,6 @@ start() {
sudo pkill -f '^python.*/isss.py'
fi


# if this is a socket system check for our handler to control the socket lock
if [[ "$evsecon" == "buchse" ]] && [[ "$isss" == "0" ]]; then
openwbDebugLog "MAIN" 1 "openWB socket configured"
# ppbuchse is used in issss.py to detect "openWB Buchse":
[ -f /home/pi/ppbuchse ] || echo "32" > /home/pi/ppbuchse

if pgrep -f '^python.*/buchse.py' > /dev/null
then
openwbDebugLog "MAIN" 1 "socket handler already running"
else
openwbDebugLog "MAIN" 0 "socket handler not running! restarting process"
nohup python3 "$OPENWBBASEDIR/runs/buchse.py" >> "$OPENWBBASEDIR/ramdisk/openWB.log" 2>&1 &
fi
else
sudo pkill -f '^python.*/buchse.py'
fi

rseSetup "$rseenabled" 0

pushButtonsSetup "$ladetaster" 0
1,030 changes: 1,030 additions & 0 deletions web/display/minimal/gauge.js

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion web/display/minimal/gauge.min.js

This file was deleted.

41 changes: 19 additions & 22 deletions web/display/minimal/gaugevalues.php
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
<?php

$result = '';
$lines = file($_SERVER['DOCUMENT_ROOT'].'/openWB/openwb.conf');
foreach($lines as $line) {
if(strpos($line, "displayaktiv=") !== false) {
list(, $displayaktivold) = explode("=", $line);
}
if(strpos($line, "displaylp1max=") !== false) {
list(, $displaylp1maxold) = explode("=", $line);
}
// if(strpos($line, "displaylp2max=") !== false) {
// list(, $displaylp2maxold) = explode("=", $line);
// }
if(strpos($line, "rfidakt=") !== false) {
list(, $rfidaktold) = explode("=", $line);
}
if(strpos($line, "isss=") !== false) {
list(, $isssold) = explode("=", $line);
}
}
?>
<?php

$result = '';
$lines = file($_SERVER['DOCUMENT_ROOT'].'/openWB/openwb.conf');
foreach($lines as $line) {
if(strpos($line, "displaylp1max=") !== false) {
list(, $displaylp1maxold) = explode("=", $line);
}
if(strpos($line, "displaylp2max=") !== false) {
list(, $displaylp2maxold) = explode("=", $line);
}
if(strpos($line, "rfidakt=") !== false) {
list(, $rfidaktold) = explode("=", $line);
}
if(strpos($line, "lastmanagement=") !== false) {
list(, $lastmanagementold) = explode("=", $line);
}
}
?>
96 changes: 62 additions & 34 deletions web/display/minimal/index.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html lang="de">

<head>
<base href="/openWB/web/">
<meta charset="UTF-8">
@@ -19,13 +20,13 @@
<link href="fonts/font-awesome-5.8.2/css/all.css" rel="stylesheet">
<script src="js/bootstrap-4.4.1/bootstrap.bundle.min.js"></script>
<script>
$(document).ready(function(){
$(document).ready(function() {
/**
* detect touch devices and map contextmenu (long press) to normal click
*/
$('body').on("contextmenu", function(event){
$('body').on("contextmenu", function(event) {
console.log("Contextmenu triggered");
if( ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0) ) {
if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
console.log("Click event generated");
$(event.target).trigger("click"); // fire a click event
event.preventDefault();
@@ -34,25 +35,54 @@
});
</script>
</head>

<body>

<!-- minimal.html -->
<?php include ("gaugevalues.php"); ?>
<script src="display/minimal/gauge.min.js?ver=20220510"></script>
<?php include("gaugevalues.php"); ?>
<script src="display/minimal/gauge.js?ver=20230106"></script>
<link rel="stylesheet" href="display/minimal/minimal.css?ver=20220510">

<div id="main">
<div id="gaugedivlp1" style="position: absolute; top: 10px; left: 10px; bottom: 10px; right: 50%;">
<canvas id="lp1" style="height: 600px; top: -150px; left: 20px; position: absolute; width: 760px;"></canvas>
<div id="lp1t" style="font-size: 35px; top: 290px; left: 265px; text-align:center; position: absolute; width: 265px; color: white;">0</div>
<canvas id="lp1s" style="height: 520px; top: -80px; left: 30px; position: absolute; width: 740px;"></canvas>
<div id="lp1st" style="font-size: 35px; top: 230px; left: 265px; text-align:center; position: absolute; width: 265px; color: white;">0</div>
<div style="top: 350px; left: 265px; text-align: center; position: absolute; width: 265px; font-size: 32px;">
<i id="lp1plugstat" class="fas fa-plug"></i>
<i id="lp1disabled" class="fas fa-lock" style="color: red"></i>
<i id="lp1enabled" class="fas fa-unlock hide" style="color: green"></i>
<!-- <div id="800x480_Frame" style="position: absolute; top: 0px; left: 0px; height: 480px; width: 800px; border:1px solid white;"> </div> -->
<?php if ($lastmanagementold == "1\n") { ?>
<div id="gaugedivlp1" style="position: absolute; top: 10px; left: 10px; height: 460px; width: 380px;">
<canvas id="lp1" style="height: 400px; top: 30px; left: 0px; position: absolute; width: 740px;"></canvas>
<canvas id="lp1s" style="height: 400px; top: 30px; left: 0px; position: absolute; width: 740px;"></canvas>
<div id="lp1l" style="font-size: 35px; top: 405px; left: 0px; text-align:center; position: absolute; width: 380px; color: white;">LP1</div>
<div id="lp1st" style="font-size: 35px; top: 245px; right: 10px; text-align:right; position: absolute; width: 135px; color: white;">0</div>
<div id="lp1t" style="font-size: 35px; top: 295px; right: 10px; text-align:right; position: absolute; width: 140px; color: white;">0</div>
<div id="lp1symbol" style="top: 350px; right: 10px; text-align: right; position: absolute; width: 150px; font-size: 32px;">
<i id="lp1plugstat" class="fas fa-plug" style="font-size: 32px"></i>
<i id="lp1disabled" class="fas fa-lock text-danger"></i>
<i id="lp1enabled" class="fas fa-unlock text-success hide"></i>
</div>
</div>
</div>
<div id="gaugedivlp2" style="position: absolute; top: 10px; left: 410px; height: 460px; width: 380px;">
<canvas id="lp2" style="height: 400px; top: 30px; left: -360px; position: absolute; width: 740px;"></canvas>
<canvas id="lp2s" style="height: 400px; top: 30px; left: -360px; position: absolute; width: 740px;"></canvas>
<div id="lp2l" style="font-size: 35px; top: 405px; right: 30px; text-align:center; position: absolute; width: 380px; color: white;">LP2</div>
<div id="lp2st" style="font-size: 35px; top: 245px; left: 10px; text-align:left; position: absolute; width: 135px; color: white;">0</div>
<div id="lp2t" style="font-size: 35px; top: 295px; left: 10px; text-align:left; position: absolute; width: 140px; color: white;">0</div>
<div id="lp2symbol" style="top: 350px; left: 10px; text-align: left; position: absolute; width: 135px; font-size: 32px;">
<i id="lp2disabled" class="fas fa-lock text-danger"></i>
<i id="lp2enabled" class="fas fa-unlock text-success hide"></i>
<i id="lp2plugstat" class="fas fa-plug"></i>
</div>
</div>
<?php } else { ?>
<div id="gaugedivlp1" style="position: absolute; top: 10px; left: 10px; height: 460px; width: 780px;">
<canvas id="lp1" style="height: 400px; top: 30px; left: 0px; position: absolute; width: 780px;"></canvas>
<canvas id="lp1s" style="height: 400px; top: 30px; left: 0px; position: absolute; width: 780px;"></canvas>
<div id="lp1st" style="font-size: 35px; top: 230px; left: 265px; text-align:center; position: absolute; width: 265px; color: white;">0</div>
<div id="lp1t" style="font-size: 35px; top: 290px; left: 265px; text-align:center; position: absolute; width: 265px; color: white;">0</div>
<div id="lp1symbol" style="top: 350px; left: 265px; text-align: center; position: absolute; width: 265px; font-size: 32px;">
<i id="lp1plugstat" class="fas fa-plug"></i>
<i id="lp1disabled" class="fas fa-lock text-danger"></i>
<i id="lp1enabled" class="fas fa-unlock text-success hide"></i>
</div>
</div>
<?php } ?>
<div style="font-size: 18px; top: 0px; right: 10px; text-align: right; position: absolute; color: white;" id="theclock"></div>
<?php if ($rfidaktold > 0) { ?>
<div class="btn-lg btn-dark" style="top: 50px; right: 10px; position: absolute; cursor: pointer; font-size: 32px;" id="code1">
@@ -100,18 +130,18 @@
</div>
</div>
<script>
function addNumber(e){
var v = $( "#PINbox" ).val();
$( "#PINbox" ).val( v + e.value );
function addNumber(e) {
var v = $("#PINbox").val();
$("#PINbox").val(v + e.value);
}

function clearForm(e){
$( "#PINbox" ).val( "" );
function clearForm(e) {
$("#PINbox").val("");
}

function submitForm(e) {
publish( e.value, "openWB/set/system/SimulateRFID" );
$( "#PINbox" ).val( "" );
publish(e.value, "openWB/set/system/SimulateRFID");
$("#PINbox").val("");
$("#codeModal").modal("hide");
};
</script>
@@ -123,40 +153,37 @@ function startTime() {
var h = today.getHours();
var m = today.getMinutes();
m = checkTime(m);
document.getElementById('theclock').innerHTML =
h + ":" + m;
document.getElementById('theclock').innerHTML = h + ":" + m;
var t = setTimeout(startTime, 5000);
}

function checkTime(i) {
if (i < 10) {
i = "0" + i
}; // add zero in front of numbers < 10
}; // add zero in front of numbers < 10
return i;
}

startTime();

var displaylp1max = <?php echo trim($displaylp1maxold); ?>;
// var displaylp2max = <?php echo trim($displaylp2maxold); ?>;
var displaypincode = <?php echo trim($displaypincodeold); ?>;
var displaypinaktiv = <?php echo trim($displaypinaktivold); ?>;
var displaylp2max = <?php echo trim($displaylp2maxold); ?>;
var rfidakt = <?php echo trim($rfidaktold); ?>;
var isssakt = <?php echo trim($isssold); ?>;
var lastmanagementold = <?php echo trim($lastmanagementold); ?>;
</script>
<script src="display/minimal/minimalgauge.js?ver=20220510"></script>
<script src="display/minimal/minimalgauge.js?ver=20230106"></script>
<script>
// ************** beginning of MQTT code *************
$(document).ready(function(){
$(document).ready(function() {

// load scripts synchronously in order specified
var scriptsToLoad = [
// load mqtt library
'js/mqttws31.js',
// functions for processing messages
'display/minimal/processAllMqttMsg.js?ver=20220510',
'display/minimal/processAllMqttMsg.js?ver=20230106',
// functions performing mqtt and start mqtt-service
'display/minimal/setupMqttServices.js?ver=20220510',
'display/minimal/setupMqttServices.js?ver=20221229',
];

scriptsToLoad.forEach(function(src) {
@@ -166,11 +193,12 @@ function checkTime(i) {
document.body.appendChild(script);
});

$('#code1').on("click", function(event){
$('#code1').on("click", function(event) {
console.log("code button clicked");
$("#codeModal").modal("show");
});
});
</script>
</body>

</html>
216 changes: 135 additions & 81 deletions web/display/minimal/minimalgauge.js
Original file line number Diff line number Diff line change
@@ -2,33 +2,55 @@
* LP1 gauge
*/
var opts = {
angle: 0, // The span of the gauge arc
lineWidth: 0.24, // The line thickness
radiusScale: 0.67, // Relative radius
lineWidth: 0.30, // The line thickness
angle: 0, // The angle where gauge starts
radiusScale: 1, // Relative radius
pointer: {
length: 0.6, // // Relative to gauge radius
strokeWidth: 0, // The thickness
color: '#000000' // Fill color
},
limitMax: false, // If false, max value increases automatically if value > maxValue
limitMax: true, // If false, max value increases automatically if value > maxValue
limitMin: true, // If true, the min value of the gauge will be fixed
colorStart: '#6FADCF', // Colors
colorStop: '#8FC0DA', // just experiment with them
strokeColor: 'grey', // to see which ones work best for you
generateGradient: true,
percentColors: [[0.0, "#73c0FF" ], [1.0, "#0000FF"]],
staticLabels: {
percentColors: [[0.0, "#73c0FF"], [1.0, "#0000FF"]],
};

// Duo will only use a quarter circle
if (lastmanagementold != '1') {
opts['range'] = 1; // The span of the gauge arc
} else {
opts['range'] = 0.5; // The span of the gauge arc
}

// switch range depending on magnitute of max value
if (displaylp1max > 999) {
var gaugeLp1MaxValue = displaylp1max / 1000;
opts['staticLabels'] = {
font: "13px sans-serif", // Specifies font
labels: [0, displaylp1max], // Print labels at these values
labels: [0, gaugeLp1MaxValue], // Print labels at these values
unit: "kW", // Optional: Label unit
color: "white", // Optional: Label text color
fractionDigits: 2 // Optional: Numerical precision. 0=round off.
}
} else {
var gaugeLp1MaxValue = displaylp1max;
opts['staticLabels'] = {
font: "13px sans-serif", // Specifies font
labels: [0, gaugeLp1MaxValue], // Print labels at these values
unit: "W", // Optional: Label unit
color: "white", // Optional: Label text color
fractionDigits: 0 // Optional: Numerical precision. 0=round off.
},
};
}
}

var targetlp1 = document.getElementById('lp1'); // your canvas element
var gaugelp1 = new Gauge(targetlp1).setOptions(opts); // create sexy gauge!

gaugelp1.maxValue = displaylp1max; // set max gauge value
gaugelp1.maxValue = gaugeLp1MaxValue; // set max gauge value
gaugelp1.setMinValue(0); // Prefer setter over gauge.minValue = 0
gaugelp1.animationSpeed = 5; // set animation speed (32 is default value)
gaugelp1.set(0); // set actual value
@@ -37,29 +59,38 @@ gaugelp1.set(0); // set actual value
* LP1-SoC gauge
*/
var opts = {
angle: 0, // The span of the gauge arc
lineWidth: 0.08, // The line thickness
radiusScale: 0.5, // Relative radius
lineWidth: 0.10, // The line thickness
radiusScale: 0.66, // Relative radius
angle: 0, // The angle where gauge starts
pointer: {
length: 0.6, // // Relative to gauge radius
strokeWidth: 0, // The thickness
color: '#000000' // Fill color
},
limitMax: false, // If false, max value increases automatically if value > maxValue
limitMin: false, // If true, the min value of the gauge will be fixed
limitMax: true, // If false, max value increases automatically if value > maxValue
limitMin: true, // If true, the min value of the gauge will be fixed
colorStart: '#6FADCF', // Colors
colorStop: '#8FC0DA', // just experiment with them
strokeColor: 'grey', // to see which ones work best for you
generateGradient: true,
percentColors: [[0.0, "#73c0FF" ], [1.0, "#0000FF"]],
staticLabels: {
font: "13px sans-serif", // Specifies font
labels: [0, 100], // Print labels at these values
unit: "%", // Optional: Label unit
insideLabel: true, // Optional: Labels are printed insde of the gauge
color: "white", // Optional: Label text color
fractionDigits: 0 // Optional: Numerical precision. 0=round off.
},
}
};

// Duo will only use a quarter circle
if (lastmanagementold != '1') {
opts['range'] = 1; // The span of the gauge arc
opts['percentColors'] = [[0.0, "#73c0FF"], [1.0, "#0000FF"]];
} else {
opts['range'] = 0.5; // The span of the gauge arc
opts['percentColors'] = [[0.0, "#B22222"], [0.5, "#DAA520"], [1.0, "#33A02C"]];
}
var targetlp1s = document.getElementById('lp1s'); // your canvas element
var gaugelp1s = new Gauge(targetlp1s).setOptions(opts); // create sexy gauge!

@@ -68,72 +99,95 @@ gaugelp1s.setMinValue(0); // Prefer setter over gauge.minValue = 0
gaugelp1s.animationSpeed = 5; // set animation speed (32 is default value)
gaugelp1s.set(70); // set actual value

/***********
* LP2 gauge
*/
// var opts = {
// angle: 0, // The span of the gauge arc
// lineWidth: 0.24, // The line thickness
// radiusScale: 0.67, // Relative radius
// pointer: {
// length: 0.6, // // Relative to gauge radius
// strokeWidth: 0, // The thickness
// color: '#000000' // Fill color
// },
// limitMax: false, // If false, max value increases automatically if value > maxValue
// limitMin: true, // If true, the min value of the gauge will be fixed
// colorStart: '#6FADCF', // Colors
// colorStop: '#8FC0DA', // just experiment with them
// strokeColor: 'grey', // to see which ones work best for you
// generateGradient: true,
// percentColors: [[0.0, "#73c0FF" ], [1.0, "#0000FF"]],
// staticLabels: {
// font: "13px sans-serif", // Specifies font
// labels: [0, displaylp2max], // Print labels at these values
// color: "white", // Optional: Label text color
// fractionDigits: 0 // Optional: Numerical precision. 0=round off.
// },
// };

// var targetlp2 = document.getElementById('lp2'); // your canvas element
// var gaugelp2 = new Gauge(targetlp2).setOptions(opts); // create sexy gauge!
if (lastmanagementold == '1') {
/***********
* LP2 gauge
*/
var opts = {
angle: 0, // The angle where gauge starts
range: 0.5, // The span of the gauge arc
mirror: true, // start gauge from the right
lineWidth: 0.30, // The line thickness
radiusScale: 1, // Relative radius
pointer: {
length: 0.6, // // Relative to gauge radius
strokeWidth: 0, // The thickness
color: '#000000' // Fill color
},
limitMax: true, // If false, max value increases automatically if value > maxValue
limitMin: true, // If true, the min value of the gauge will be fixed
colorStart: '#6FADCF', // Colors
colorStop: '#8FC0DA', // just experiment with them
strokeColor: 'grey', // to see which ones work best for you
generateGradient: true,
percentColors: [[0.0, "#73c0FF"], [1.0, "#0000FF"]],
};

// gaugelp2.maxValue = displaylp2max; // set max gauge value
// gaugelp2.setMinValue(0); // Prefer setter over gauge.minValue = 0
// gaugelp2.animationSpeed = 5; // set animation speed (32 is default value)
// gaugelp2.set(0); // set actual value
// switch range depending on magnitute of max value
if (displaylp2max > 999) {
var gaugeLp2MaxValue = displaylp2max / 1000;
opts['staticLabels'] = {
font: "13px sans-serif", // Specifies font
labels: [0, gaugeLp2MaxValue], // Print labels at these values
unit: "kW", // Optional: Label unit
color: "white", // Optional: Label text color
fractionDigits: 2 // Optional: Numerical precision. 0=round off.
}
} else {
var gaugeLp2MaxValue = displaylp2max;
opts['staticLabels'] = {
font: "13px sans-serif", // Specifies font
labels: [0, gaugeLp2MaxValue], // Print labels at these values
unit: "W", // Optional: Label unit
color: "white", // Optional: Label text color
fractionDigits: 0 // Optional: Numerical precision. 0=round off.
}
}

/***********
* LP2-SoC gauge
*/
// var opts = {
// angle: 0, // The span of the gauge arc
// lineWidth: 0.08, // The line thickness
// radiusScale: 0.5, // Relative radius
// pointer: {
// length: 0.6, // // Relative to gauge radius
// strokeWidth: 0, // The thickness
// color: '#000000' // Fill color
// },
// limitMax: false, // If false, max value increases automatically if value > maxValue
// limitMin: false, // If true, the min value of the gauge will be fixed
// colorStart: '#6FADCF', // Colors
// colorStop: '#8FC0DA', // just experiment with them
// strokeColor: 'grey', // to see which ones work best for you
// generateGradient: true,
// percentColors: [[0.0, "#73c0FF" ], [1.0, "#0000FF"]],
// staticLabels: {
// font: "13px sans-serif", // Specifies font
// labels: [0, 100], // Print labels at these values
// color: "white", // Optional: Label text color
// fractionDigits: 0 // Optional: Numerical precision. 0=round off.
// },
// };

// var targetlp2s = document.getElementById('lp2s'); // your canvas element
// var gaugelp2s = new Gauge(targetlp2s).setOptions(opts); // create sexy gauge!
var targetlp2 = document.getElementById('lp2'); // your canvas element
var gaugelp2 = new Gauge(targetlp2).setOptions(opts); // create sexy gauge!

gaugelp2.maxValue = gaugeLp2MaxValue; // set max gauge value
gaugelp2.setMinValue(0); // Prefer setter over gauge.minValue = 0
gaugelp2.animationSpeed = 5; // set animation speed (32 is default value)
gaugelp2.set(0); // set actual value

// gaugelp2s.maxValue = 100; // set max gauge value
// gaugelp2s.setMinValue(0); // Prefer setter over gauge.minValue = 0
// gaugelp2s.animationSpeed = 5; // set animation speed (32 is default value)
// gaugelp2s.set(70); // set actual value
/***********
* LP2-SoC gauge
*/
var opts = {
angle: 0, // The angle where gauge starts
range: 0.5, // The span of the gauge arc
mirror: true, // start gauge from the right
lineWidth: 0.1, // The line thickness
radiusScale: 0.66, // Relative radius
pointer: {
length: 0.6, // // Relative to gauge radius
strokeWidth: 0, // The thickness
color: '#000000' // Fill color
},
limitMax: true, // If false, max value increases automatically if value > maxValue
limitMin: true, // If true, the min value of the gauge will be fixed
colorStart: '#6FADCF', // Colors
colorStop: '#8FC0DA', // just experiment with them
strokeColor: 'grey', // to see which ones work best for you
generateGradient: true,
percentColors: [[0.0, "#B22222"], [0.5, "#DAA520"], [1.0, "#33A02C"]],
staticLabels: {
font: "13px sans-serif", // Specifies font
labels: [0, 100], // Print labels at these values
unit: "%", // Optional: Label unit
insideLabel: true, // Optional: Labels are printed insde of the gauge
color: "white", // Optional: Label text color
fractionDigits: 0 // Optional: Numerical precision. 0=round off.
}
};
var targetlp2s = document.getElementById('lp2s'); // your canvas element
var gaugelp2s = new Gauge(targetlp2s).setOptions(opts); // create sexy gauge!
gaugelp2s.maxValue = 100; // set max gauge value
gaugelp2s.setMinValue(0); // Prefer setter over gauge.minValue = 0
gaugelp2s.animationSpeed = 5; // set animation speed (32 is default value)
gaugelp2s.set(70); // set actual value
}
122 changes: 56 additions & 66 deletions web/display/minimal/processAllMqttMsg.js
Original file line number Diff line number Diff line change
@@ -12,10 +12,10 @@ function reloadDisplay() {
*/
// wait some seconds to allow other instances receive this message
console.log("reloading display...");
setTimeout(function(){
publish( "0", "openWB/set/system/reloadDisplay" );
setTimeout(function () {
publish("0", "openWB/set/system/reloadDisplay");
// wait again to give the broker some time and avoid a reload loop
setTimeout(function(){
setTimeout(function () {
location.reload();
}, 2000);
}, 2000);
@@ -24,82 +24,72 @@ function reloadDisplay() {
function handlevar(mqttmsg, mqttpayload) {
// console.log("Topic: "+mqttmsg+" Message: "+mqttpayload);
// receives all messages and calls respective function to process them
if ( mqttmsg.match( /^openwb\/system\//i) ) { processSystemMessages(mqttmsg, mqttpayload); }
else if ( mqttmsg.match( /^openwb\/lp\//i) ) { processChargepointMessages(mqttmsg, mqttpayload); }
if (mqttmsg.match(/^openwb\/system\//i)) { processSystemMessages(mqttmsg, mqttpayload); }
else if (mqttmsg.match(/^openwb\/lp\//i)) { processChargepointMessages(mqttmsg, mqttpayload); }
} // end handlevar

function processSystemMessages(mqttmsg, mqttpayload) {
// processes mqttmsg for topic openWB/system
// called by handlevar
if ( mqttmsg == 'openWB/system/reloadDisplay' ) {
if( mqttpayload == '1' ){
if (mqttmsg == 'openWB/system/reloadDisplay') {
if (mqttpayload == '1') {
reloadDisplay();
}
}
// else if ( mqttmsg == 'openWB/system/parentWB' ) {
// console.log("received parent openwb url: " + mqttpayload);
// }
// else if ( mqttmsg == 'openWB/system/parentCPlp1' ) {
// console.log("received index for lp1 on parent openwb: " + mqttpayload);
// }
// else if ( mqttmsg == 'openWB/system/parentCPlp2' ) {
// console.log("received index for lp2 on parent openwb: " + mqttpayload);
// }
}

function processChargepointMessages(mqttmsg, mqttpayload) {
// processes mqttmsg for topic openWB/system
// called by handlevar
if ( mqttmsg == 'openWB/lp/2/boolChargePointConfigured' ) {
console.log("received configured for local lp2: " + mqttpayload)
}
else if ( mqttmsg == 'openWB/lp/1/%Soc' ) {
var lp1s = mqttpayload;
gaugelp1s.set(lp1s);
$("#lp1st").html(mqttpayload + "%");
}
else if ( mqttmsg == 'openWB/lp/1/W' ) {
var lp1w = mqttpayload;
gaugelp1.set(lp1w);
if ( lp1w > 999 ) {
lp1w= lp1w / 1000;
$("#lp1t").html(lp1w.toFixed(2) + " kW");
} else {
$("#lp1t").html(mqttpayload + " W");
}
}
else if (mqttmsg == 'openWB/lp/1/boolSocConfigured' ) {
if ( mqttpayload == 1 ) {
$("#lp1s").removeClass("hide");
$("#lp1st").removeClass("hide");
} else {
$("#lp1s").addClass("hide");
$("#lp1st").addClass("hide");
}
}
else if ( mqttmsg == 'openWB/lp/1/boolPlugStat' ) {
if ( mqttpayload == 1 ) {
$("#lp1plugstat").removeClass('hide');
} else {
$("#lp1plugstat").addClass('hide');
}
}
else if ( mqttmsg == 'openWB/lp/1/boolChargeStat' ) {
if ( mqttpayload == 1 ) {
$("#lp1plugstat").removeClass('text-warning').addClass('text-success');
} else {
$("#lp1plugstat").removeClass('text-success').addClass('text-warning');
}
}
else if ( mqttmsg == 'openWB/lp/1/ChargePointEnabled' ) {
var lp1enabled = mqttpayload;
if(lp1enabled == 1){
$("#lp1enabled").removeClass("hide");
$("#lp1disabled").addClass("hide");
} else {
$("#lp1enabled").addClass("hide");
$("#lp1disabled").removeClass("hide");

// check if topic contains subgroup like /lp/1/
// last part of topic after /
var topic = mqttmsg.substring(mqttmsg.lastIndexOf('/') + 1);
var index = mqttmsg.match(/(\w+)\/(\d\d?)\//)[2];
if (index != null) {
if (topic == '%Soc') {
eval("gaugelp" + index + "s.set(mqttpayload)");
$('#lp' + index + 'st').html(mqttpayload + "%");
} else if (topic == 'W') {
var lpw = mqttpayload / 1000;
if (eval("displaylp" + index + "max") > 999) {
eval("gaugelp" + index + ".set(lpw)");
} else {
eval("gaugelp" + index + ".set(mqttpayload)");
}
if (mqttpayload > 999) {
$('#lp' + index + 't').html(lpw.toFixed(2) + " kW");
} else {
$('#lp' + index + 't').html(mqttpayload + " W");
}
} else if (topic == 'boolSocConfigured') {
if (mqttpayload == 1) {
$('#lp' + index + 's').removeClass("hide");
$('#lp' + index + 'st').removeClass("hide");
} else {
$('#lp' + index + 's').addClass("hide");
$('#lp' + index + 'st').addClass("hide");
}
} else if (topic == 'boolPlugStat') {
if (mqttpayload == 1) {
$('#lp' + index + 'plugstat').removeClass('hide');
} else {
$('#lp' + index + 'plugstat').addClass('hide');
}
} else if (topic == 'boolChargeStat') {
if (mqttpayload == 1) {
$('#lp' + index + 'plugstat').removeClass('text-warning').addClass('text-success');
} else {
$('#lp' + index + 'plugstat').removeClass('text-success').addClass('text-warning');
}
} else if (topic == 'ChargePointEnabled') {
if (mqttpayload == 1) {
$('#lp' + index + 'enabled').removeClass("hide");
$('#lp' + index + 'disabled').addClass("hide");
} else {
$('#lp' + index + 'enabled').addClass("hide");
$('#lp' + index + 'disabled').removeClass("hide");
}
}
}

}
15 changes: 6 additions & 9 deletions web/display/minimal/setupMqttServices.js
Original file line number Diff line number Diff line change
@@ -17,15 +17,12 @@ var topicsToSubscribe = [
["openWB/lp/1/boolPlugStat", 1],
["openWB/lp/1/boolChargeStat", 1],
["openWB/lp/1/ChargePointEnabled", 1],
// ["openWB/lp/2/W", 1],
// ["openWB/lp/2/%Soc", 1],
// ["openWB/lp/2/boolSocConfigured"],
// ["openWB/lp/2/boolPlugStat", 1],
// ["openWB/lp/2/ChargePointEnabled", 1],
// ["openWB/system/parentWB", 1],
// ["openWB/system/parentCPlp1", 1],
// ["openWB/system/parentCPlp2", 1],
// ["openWB/lp/2/boolChargePointConfigured", 1]
["openWB/lp/2/W", 1],
["openWB/lp/2/%Soc", 1],
["openWB/lp/2/boolSocConfigured"],
["openWB/lp/2/boolPlugStat", 1],
["openWB/lp/2/ChargePointEnabled", 1],
["openWB/lp/2/boolChargeStat", 1],
];

// holds number of topics flagged 1 initially
100 changes: 40 additions & 60 deletions web/settings/misc.php
Original file line number Diff line number Diff line change
@@ -1274,16 +1274,18 @@ function visibility_ledsakt() {
</div>
</div>
<hr class="border-secondary">
<div class="form-group">
<div class="form-group <?php if($ssdisplayold == 1 && $isssold == 1) echo "hide" ?>">
<div class="form-row vaRow mb-1">
<label for="displaytheme" class="col-md-4 col-form-label">Theme des Displays</label>
<div class="col">
<select name="displaytheme" id="displaytheme" class="form-control">
<option <?php if($displaythemeold == 0) echo "selected" ?> value="0">Cards</option>
<option <?php if($displaythemeold == 3) echo "selected" ?> value="3">Gauges</option>
<option <?php if($displaythemeold == 1) echo "selected" ?> value="1">Symbolfluss</option>
<option <?php if($displaythemeold == 2) echo "selected" ?> value="2">Nur Ladeleistung, keine verstellmöglichkeit</option>
<option <?php if($displaythemeold == 5) echo "selected" ?> value="5">Colors</option>
<select name="displaytheme" id="displaytheme" class="form-control" >
<?php if($isssold == 0) { ?>
<option <?php if($displaythemeold == 0) echo "selected" ?> value="0">Cards</option>
<option <?php if($displaythemeold == 3) echo "selected" ?> value="3">Gauges</option>
<option <?php if($displaythemeold == 1) echo "selected" ?> value="1">Symbolfluss</option>
<option <?php if($displaythemeold == 5) echo "selected" ?> value="5">Colors</option>
<?php } ?>
<option <?php if($displaythemeold == 2 || $isssold == 1) echo "selected" ?> value="2">Nur Ladeleistung, keine Verstellmöglichkeit</option>
</select>
</div>
</div>
@@ -1327,59 +1329,19 @@ function visibility_ledsakt() {
<input type="number" min="1000" step="100" name="displayhausmax" id="displayhausmax" class="form-control" value="<?php echo $displayhausmaxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1">
<label for="displaylp1max" class="col-md-4 col-form-label">Ladepunkt 1 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp1max" id="displaylp1max" class="form-control" value="<?php echo $displaylp1maxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1" id="displaylp2">
<label for="displaylp2max" class="col-md-4 col-form-label">Ladepunkt 2 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp2max" id="displaylp2max" class="form-control" value="<?php echo $displaylp2maxold ?>">
</div>
</div>
</div>
<div id="displaycards" class="hide">
<div class="form-row vaRow mb-1" id="displaylp3">
<label for="displaylp3max" class="col-md-4 col-form-label">Ladepunkt 3 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp3max" id="displaylp3max" class="form-control" value="<?php echo $displaylp3maxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1" id="displaylp4">
<label for="displaylp4max" class="col-md-4 col-form-label">Ladepunkt 4 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp4max" id="displaylp4max" class="form-control" value="<?php echo $displaylp4maxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1" id="displaylp5">
<label for="displaylp5max" class="col-md-4 col-form-label">Ladepunkt 5 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp5max" id="displaylp5max" class="form-control" value="<?php echo $displaylp5maxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1" id="displaylp6">
<label for="displaylp6max" class="col-md-4 col-form-label">Ladepunkt 6 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp6max" id="displaylp6max" class="form-control" value="<?php echo $displaylp6maxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1" id="displaylp7">
<label for="displaylp7max" class="col-md-4 col-form-label">Ladepunkt 7 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp7max" id="displaylp7max" class="form-control" value="<?php echo $displaylp7maxold ?>">
</div>
</div>
<div class="form-row vaRow mb-1" id="displaylp8">
<label for="displaylp8max" class="col-md-4 col-form-label">Ladepunkt 8 Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp8max" id="displaylp8max" class="form-control" value="<?php echo $displaylp8maxold ?>">
<?php for( $chargepoint = 1; $chargepoint < 9; $chargepoint++ ){ // begin chargepoint loop ?>
<div id=displaylp<?php echo $chargepoint; ?> class="hide">
<div class="form-row vaRow mb-1">
<label for="displaylp<?php echo $chargepoint; ?>max" class="col-md-4 col-form-label">Ladepunkt <?php echo $chargepoint; ?> Skala Max</label>
<div class="col">
<input type="number" min="1000" step="100" name="displaylp<?php echo $chargepoint; ?>max" id="displaylp<?php echo $chargepoint; ?>max" class="form-control" value="<?php echo ${'displaylp' . $chargepoint . 'maxold'} ?>">
</div>
</div>
</div>
</div>
<?php } // end chargepoint loop ?>
<hr class="border-secondary">
</div>
<hr class="border-secondary">
<div class="form-group">
<div class="form-row mb-1">
<div class="col">
@@ -1432,15 +1394,33 @@ function visibility_displaytheme() {
switch ($('#displaytheme').val()) {
case '0': // Cards
showSection('#displaygauge');
showSection('#displaycards');
for (let cp = 1; cp < 9; cp++) {
showSection('#displaylp' + cp);
}
break;
case '2': // Minimal
hideSection('#displaygauge');
for (let cp = 1; cp < 3; cp++) {
showSection('#displaylp' + cp);
}
for (let cp = 3; cp < 9; cp++) {
hideSection('#displaylp' + cp);
}
break;
case '3': // Gauges
showSection('#displaygauge');
hideSection('#displaycards');
for (let cp = 1; cp < 3; cp++) {
showSection('#displaylp' + cp);
}
for (let cp = 3; cp < 9; cp++) {
hideSection('#displaylp' + cp);
}
break;
default:
hideSection('#displaygauge');
hideSection('#displaycards');
hideSection('#displaygauge');
for (let cp = 1; cp < 9; cp++) {
hideSection('#displaylp' + cp);
}
}
}

5 changes: 4 additions & 1 deletion web/settings/settings.php
Original file line number Diff line number Diff line change
@@ -81,7 +81,7 @@
Wird hier Ja gewählt ist diese openWB nur ein Ladepunkt und übernimmt keine eigene Regelung.
Hier ist Ja zu wählen wenn, bereits eine openWB vorhanden ist und diese nur ein weiterer Ladepunkt der vorhandenen openWB sein soll.<br />
Es ist sicherzustellen, dass auf dieser openWB die Modulkonfiguration des <span class="text-danger">ersten Ladepunktes</span>
korrekt ist und alle weiteren Ladepunkte <span class="text-danger">deaktiviert</span> sind. Handels es sich hier um eine
korrekt ist und alle weiteren Ladepunkte <span class="text-danger">deaktiviert</span> sind. Handelt es sich hier um eine
<span class="text-danger">DUO</span>, so ist auch der <span class="text-danger">zweite Ladepunkt</span> zu aktivieren.<br />
<span class="text-danger">Alle weiteren in dieser openWB getätigten Einstellungen werden NICHT beachtet.</span>
An der Haupt openWB wird als Ladepunkt "externe openWB" gewählt und die IP Adresse eingetragen.
@@ -95,6 +95,9 @@
<option <?php if($ssdisplayold == 0) echo "selected" ?> value="0">Normal</option>
<option <?php if($ssdisplayold == 1) echo "selected" ?> value="1">Display der übergeordneten openWB</option>
</select>
<span class="form-text small">
Für das Theme "Normal" kann der Maximalwert der Skala im Bereich "Display" unter Einstellungen->Verschiedenes angepasst werden.
</span>
</div>
</div>
<div class="form-row mb-1">
2 changes: 1 addition & 1 deletion web/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.9.289
1.9.291

0 comments on commit 5e7b50f

Please sign in to comment.