Skip to content

Commit 9ecd009

Browse files
authored
Merge pull request #8 from shiv3/add/basic-auth
Add basic auth settings
2 parents 96defb2 + 4ca30cb commit 9ecd009

File tree

5 files changed

+105
-15
lines changed

5 files changed

+105
-15
lines changed

src/components/Settings.tsx

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ const Settings: React.FC = () => {
99
const [cpID, setCpID] = useState<string>("");
1010
const [tagID, setTagID] = useState<string>("");
1111
const [ocppVersion, setOcppVersion] = useState<string>("OCPP-1.6J");
12+
13+
const [basicAuthEnabled, setBasicAuthEnabled] = useState<boolean>(false);
14+
const [basicAuthUsername, setBasicAuthUsername] = useState<string>("");
15+
const [basicAuthPassword, setBasicAuthPassword] = useState<string>("");
16+
1217
const [autoMeterValueEnabled, setAutoMeterValueEnabled] = useState<boolean>(false);
1318
const [autoMeterValueInterval, setAutoMeterValueInterval] = useState<number>(0);
1419
const [autoMeterValue, setAutoMeterValue] = useState<number>(0);
@@ -26,6 +31,10 @@ const Settings: React.FC = () => {
2631
setTagID(config.tagID);
2732
setOcppVersion(config.ocppVersion);
2833

34+
setBasicAuthEnabled(config.basicAuthSettings?.enabled);
35+
setBasicAuthUsername(config.basicAuthSettings?.username);
36+
setBasicAuthPassword(config.basicAuthSettings?.password);
37+
2938
setAutoMeterValueEnabled(config.autoMeterValueSetting?.enabled);
3039
setAutoMeterValueInterval(config.autoMeterValueSetting?.interval);
3140
setAutoMeterValue(config.autoMeterValueSetting?.value);
@@ -43,6 +52,11 @@ const Settings: React.FC = () => {
4352
ChargePointID: cpID,
4453
tagID,
4554
ocppVersion,
55+
basicAuthSettings: {
56+
enabled: basicAuthEnabled,
57+
username: basicAuthUsername,
58+
password: basicAuthPassword,
59+
},
4660
autoMeterValueSetting: {
4761
enabled: autoMeterValueEnabled,
4862
interval: autoMeterValueInterval,
@@ -148,13 +162,63 @@ const Settings: React.FC = () => {
148162
<option value="OCPP-1.6J">OCPP-1.6J</option>
149163
</select>
150164
</div>
165+
166+
<div className="mb-4">
167+
<input
168+
className="shadow border rounded w-fit py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
169+
id="BasicAuth"
170+
type="checkbox"
171+
checked={basicAuthEnabled}
172+
onChange={(e) => {
173+
setBasicAuthEnabled(e.target.checked)
174+
if(!e.target.checked) {
175+
setBasicAuthUsername("")
176+
setBasicAuthPassword("")
177+
}
178+
}}
179+
/>
180+
<label className="text-gray-700 text-sm font-bold ml-2" htmlFor="BasicAuth">
181+
BasicAuth Settings
182+
</label>
183+
{basicAuthEnabled && (
184+
<div className="flex items-center">
185+
<input
186+
className="shadow appearance-none border rounded w-1/3 py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
187+
id="BasicAuthUsername"
188+
type="text"
189+
value={basicAuthUsername}
190+
onChange={(e) => setBasicAuthUsername(e.target.value)}
191+
placeholder="username"
192+
style={{maxWidth: "20ch"}}
193+
required
194+
/>
195+
<input
196+
className="shadow appearance-none border rounded w-1/3 py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
197+
id="BasicAuthPassword"
198+
type="text"
199+
value={basicAuthPassword}
200+
onChange={(e) => setBasicAuthPassword(e.target.value)}
201+
placeholder="password"
202+
style={{maxWidth: "20ch"}}
203+
required
204+
/>
205+
</div>
206+
)}
207+
</div>
208+
151209
<div className="mb-4">
152210
<input
153211
className="shadow border rounded w-fit py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
154212
id="AutoMeterValue"
155213
type="checkbox"
156214
checked={autoMeterValueEnabled}
157-
onChange={(e) => setAutoMeterValueEnabled(e.target.checked)}
215+
onChange={(e) => {
216+
setAutoMeterValueEnabled(e.target.checked)
217+
if(!e.target.checked) {
218+
setAutoMeterValueInterval(0)
219+
setAutoMeterValue(0)
220+
}
221+
}}
158222
/>
159223
<label className="text-gray-700 text-sm font-bold ml-2" htmlFor="AutoMeterValue">
160224
Auto Meter Value
@@ -185,7 +249,7 @@ const Settings: React.FC = () => {
185249
/>
186250
<span className="text-gray-700 text-sm font-bold ml-2">kWh</span>
187251
</div>
188-
)}
252+
)}
189253
</div>
190254
<div className="mb-4">
191255
<label

src/components/TopPage.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ const TopPage: React.FC = () => {
1919
if (config?.Experimental === null) {
2020
setConnectorNumber(config?.connectorNumber || 2);
2121
setCps([
22-
NewChargePoint(connectorNumber, config.ChargePointID, config.BootNotification ?? DefaultBootNotification, config.wsURL, config.autoMeterValueSetting)
22+
NewChargePoint(connectorNumber, config.ChargePointID, config.BootNotification ?? DefaultBootNotification, config.wsURL, config.basicAuthSettings,config.autoMeterValueSetting)
2323
]);
2424
} else {
2525
const cps = config?.Experimental?.ChargePointIDs.map((cp) =>
26-
NewChargePoint(cp.ConnectorNumber, cp.ChargePointID, config.BootNotification ?? DefaultBootNotification, config.wsURL,config.autoMeterValueSetting)
26+
NewChargePoint(cp.ConnectorNumber, cp.ChargePointID, config.BootNotification ?? DefaultBootNotification, config.wsURL,config.basicAuthSettings,config.autoMeterValueSetting)
2727
)
2828
setCps(cps ?? []);
2929
const tagIDs = config?.Experimental?.TagIDs;
@@ -203,12 +203,10 @@ const ExperimentalView: React.FC<ExperimentalProps> = ({cps, tagIDs}) => {
203203

204204

205205
const NewChargePoint = (ConnectorNumber: number, ChargePointID: string, BootNotification: BootNotification, WSURL: string,
206-
autoMeterValueSetting: {
207-
interval: number;
208-
value: number
209-
} | null) => {
206+
basicAuthSettings: { username: string; password: string } | null,
207+
autoMeterValueSetting: { interval: number; value: number } | null) => {
210208
console.log(`Creating new ChargePoint with ID: ${ChargePointID} Connector Number: ${ConnectorNumber} WSURL: ${WSURL}`);
211-
return new OCPPChargePoint(ChargePointID, BootNotification, ConnectorNumber, WSURL, autoMeterValueSetting);
209+
return new OCPPChargePoint(ChargePointID, BootNotification, ConnectorNumber, WSURL,basicAuthSettings, autoMeterValueSetting);
212210
}
213211

214212
export default TopPage;

src/cp/ChargePoint.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ export class ChargePoint {
3131
(availability: string) => void
3232
> = new Map();
3333

34-
constructor(id: string, _bootNotification: BootNotification, connectorCount: number, wsUrl: string,
34+
constructor(id: string,
35+
_bootNotification: BootNotification,
36+
connectorCount: number,
37+
wsUrl: string,
38+
basicAuthSettings: { username: string; password: string } | null,
3539
autoMeterValueSetting: { interval: number; value: number } | null) {
3640
this._id = id;
3741
this._bootNotification = _bootNotification;
@@ -40,7 +44,7 @@ export class ChargePoint {
4044
this._connectors.set(i, new Connector(i));
4145
}
4246
this._logger = new Logger();
43-
this._webSocket = new OCPPWebSocket(wsUrl, this._id, this._logger);
47+
this._webSocket = new OCPPWebSocket(wsUrl, this._id, this._logger, basicAuthSettings);
4448
this._messageHandler = new OCPPMessageHandler(
4549
this,
4650
this._webSocket,
@@ -175,8 +179,11 @@ export class ChargePoint {
175179
connector.transaction = transaction;
176180
this._messageHandler.startTransaction(transaction, connectorId);
177181
this.updateConnectorStatus(connectorId, OCPPStatus.Preparing);
178-
this._autoMeterValueSetting && this.startAutoMeterValue(connectorId, this._autoMeterValueSetting.interval, this._autoMeterValueSetting.value);
179-
182+
if (this._autoMeterValueSetting !== null &&
183+
this._autoMeterValueSetting.interval !== 0 &&
184+
this._autoMeterValueSetting.value !== 0) {
185+
this.startAutoMeterValue(connectorId, this._autoMeterValueSetting.interval, this._autoMeterValueSetting.value);
186+
}
180187
} else {
181188
this._logger.error(`Connector ${connectorId} not found`);
182189
}

src/cp/OCPPWebSocket.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type MessageHandler = (
2525
export class OCPPWebSocket {
2626
private _ws: WebSocket | null = null;
2727
private _url: string;
28+
private _basicAuth: {username: string; password: string} | null = null;
2829
private _chargePointId: string;
2930
private _logger: Logger;
3031
private _messageHandler: MessageHandler | null = null;
@@ -33,10 +34,17 @@ export class OCPPWebSocket {
3334
private _maxReconnectAttempts: number = 5;
3435
private _reconnectDelay: number = 5000; // 5 seconds
3536

36-
constructor(url: string, chargePointId: string, logger: Logger) {
37+
constructor(url: string, chargePointId: string, logger: Logger,
38+
basicAuthSettings: { username: string; password: string } | null = null) {
3739
this._url = url;
3840
this._chargePointId = chargePointId;
3941
this._logger = logger;
42+
if (basicAuthSettings) {
43+
this._basicAuth = {
44+
username: basicAuthSettings.username,
45+
password: basicAuthSettings.password
46+
};
47+
}
4048
}
4149

4250
get url(): string {
@@ -47,7 +55,13 @@ export class OCPPWebSocket {
4755
onopen: (() => void) | null = null,
4856
onclose: ((ev: CloseEvent) => void) | null = null
4957
): void {
50-
this._ws = new WebSocket(`${this._url}${this._chargePointId}`, [
58+
const url = new URL(this._url);
59+
if (this?._basicAuth) {
60+
url.username = this._basicAuth.username;
61+
url.password = this._basicAuth.password;
62+
}
63+
console.log("url", url);
64+
this._ws = new WebSocket(`${url.toString()}${this._chargePointId}`, [
5165
"ocpp1.6",
5266
"ocpp1.5",
5367
]);

src/store/store.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@ interface Config {
1010
connectorNumber: number;
1111
tagID: string
1212
ocppVersion: string;
13+
basicAuthSettings: BasicAuthSettings;
1314
autoMeterValueSetting: AutoMeterValueSetting;
1415
Experimental: Experimental | null;
1516
BootNotification: BootNotification | null;
1617
}
1718

19+
export interface BasicAuthSettings {
20+
enabled: boolean;
21+
username: string;
22+
password: string;
23+
}
24+
1825
export interface AutoMeterValueSetting {
1926
enabled: boolean;
2027
interval: number;

0 commit comments

Comments
 (0)