Skip to content

Commit dc9c67e

Browse files
sfeilmeiermichaelgrilllukasrgrvenu-sagarjanseidemann
authored
FEMS Backport (OpenEMS#2359)
* CI: fix tools/common.sh for updating UI version * CI: fix Debian build script Replace all unwanted characters in branch name with "." to be compliant with Debian version requirements * WebsocketClient: decreased connection lost timeout Decreased connection lost timeout to make sure the detection happens within 5 minutes every 100sec ping waiting for response time 1.5 * 100sec = 150sec total time 250sec * Debian: fix debian/semver compatible version string * UI: remove unused channels History Production modal Before this bugfix UI would query a channel that was not existing for pure AC systems, and Backend would fall-back to 'old' InfluxDB instead of Aggregated. * KMtronic: set persistence priority for relay channels to high - Increased persistence priority to enable resending and saving data locally - Also set debug channel to medium * Backend/UI: Add filters to edges overview * UI * Add OpenEMSSumStateLevel (as sumState) to getEdgesRequest * Show sumState in edges Overview * Add filter for producttype and sumState to edges overview * Add firstSetupProtocolDate to profile * Backend * Add Sumstate to edgeMetadata * Add searchParams to getEdgesRequest * isOnline -> if edge is online * sumState -> the sumState of the edge * productType -> the producttype of the edge * Fix OptionsEnums with non-unique values Original: change value of Undefined state in GoodWeHardwareType. Caused problems in fems14974 as the Battery values are set to 0 in Undefined state * Cleanup --------- Co-authored-by: Michael Grill <[email protected]> Co-authored-by: Lukas Rieger <[email protected]> Co-authored-by: Sagar Venu <[email protected]> Co-authored-by: Jan Seidemann <[email protected]> Co-authored-by: Anas Shetla <[email protected]> Co-authored-by: Sebastian Asen <[email protected]> Co-authored-by: Stefan Feilmeier <[email protected]>
1 parent 7a92b64 commit dc9c67e

File tree

55 files changed

+920
-978
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+920
-978
lines changed

io.openems.backend.alerting/test/io/openems/backend/alerting/handler/TestOfflineEdgeHandler.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ public TestOfflineEdgeHandler() {
4545
));
4646
}
4747

48-
private Edge getTestEdge(Metadata metadata, String id, ZonedDateTime LastMessage, boolean isOnline) {
49-
final var edge = new Edge(metadata, id, "comment", "version", "producttype", LastMessage);
48+
private Edge getTestEdge(Metadata metadata, String id, ZonedDateTime lastMessage, boolean isOnline) {
49+
final var edge = new Edge(metadata, id, "comment", "version", "producttype", lastMessage);
5050
edge.setOnline(isOnline);
5151
return edge;
5252
}

io.openems.backend.common/src/io/openems/backend/common/metadata/Edge.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class Edge {
2525
private String comment;
2626
private SemanticVersion version;
2727
private String producttype;
28-
private ZonedDateTime lastmessage = null;
28+
private ZonedDateTime lastmessage;
2929
private boolean isOnline = false;
3030

3131
private final List<EdgeUser> user;

io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
2222
import io.openems.common.exceptions.OpenemsException;
2323
import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions;
24+
import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata;
2425
import io.openems.common.session.Language;
25-
import io.openems.common.session.Role;
2626
import io.openems.common.types.ChannelAddress;
2727
import io.openems.common.types.EdgeConfig;
2828
import io.openems.common.types.EdgeConfig.Component.Channel;
@@ -352,7 +352,8 @@ public static final class Events {
352352
* @return the role to the Edge-IDs
353353
* @throws OpenemsNamedException on error
354354
*/
355-
public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOptions) throws OpenemsNamedException;
355+
public List<EdgeMetadata> getPageDevice(User user, PaginationOptions paginationOptions)
356+
throws OpenemsNamedException;
356357

357358
/**
358359
* Gets the Role for a edge of the current user.
@@ -362,6 +363,6 @@ public static final class Events {
362363
* @return the role to the edge
363364
* @throws OpenemsNamedException on error
364365
*/
365-
public Role getRoleForEdge(User user, String edgeId) throws OpenemsNamedException;
366+
public EdgeMetadata getEdgeMetadataForUser(User user, String edgeId) throws OpenemsNamedException;
366367

367368
}

io.openems.backend.common/src/io/openems/backend/common/metadata/User.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.NavigableMap;
77
import java.util.TreeMap;
88

9+
import io.openems.common.channel.Level;
910
import io.openems.common.exceptions.OpenemsError;
1011
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
1112
import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata;
@@ -92,7 +93,9 @@ public static List<EdgeMetadata> generateEdgeMetadatas(User user, Metadata metad
9293
edge.getVersion(), // Version
9394
role, // Role
9495
edge.isOnline(), // Online-State
95-
edge.getLastmessage() // Last-Message Timestamp
96+
edge.getLastmessage(), // Last-Message Timestamp
97+
null, //
98+
Level.OK //
9699
));
97100
}
98101
}

io.openems.backend.common/src/io/openems/backend/common/test/DummyMetadata.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
1919
import io.openems.common.exceptions.OpenemsException;
2020
import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions;
21+
import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata;
2122
import io.openems.common.session.Language;
22-
import io.openems.common.session.Role;
2323

2424
public class DummyMetadata implements Metadata {
2525
@Override
@@ -138,13 +138,13 @@ public Optional<String> getSerialNumberForEdge(Edge edge) {
138138
}
139139

140140
@Override
141-
public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOptions)
141+
public List<EdgeMetadata> getPageDevice(User user, PaginationOptions paginationOptions)
142142
throws OpenemsNamedException {
143143
throw new UnsupportedOperationException("Unsupported by Dummy Class");
144144
}
145145

146146
@Override
147-
public Role getRoleForEdge(User user, String edgeId) throws OpenemsNamedException {
147+
public EdgeMetadata getEdgeMetadataForUser(User user, String edgeId) throws OpenemsNamedException {
148148
throw new UnsupportedOperationException("Unsupported by Dummy Class");
149149
}
150150

io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/MetadataDummy.java

+43-4
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@
3636
import io.openems.backend.common.metadata.SimpleEdgeHandler;
3737
import io.openems.backend.common.metadata.User;
3838
import io.openems.common.OpenemsOEM;
39+
import io.openems.common.channel.Level;
3940
import io.openems.common.event.EventReader;
4041
import io.openems.common.exceptions.OpenemsError;
4142
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
4243
import io.openems.common.exceptions.OpenemsException;
4344
import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions;
45+
import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata;
4446
import io.openems.common.session.Language;
4547
import io.openems.common.session.Role;
4648
import io.openems.common.utils.StringUtils;
@@ -284,7 +286,7 @@ public void setUserAlertingSettings(User user, String edgeId, List<AlertingSetti
284286
}
285287

286288
@Override
287-
public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOptions)
289+
public List<EdgeMetadata> getPageDevice(User user, PaginationOptions paginationOptions)
288290
throws OpenemsNamedException {
289291
var pagesStream = this.edges.values().stream();
290292
final var query = paginationOptions.getQuery();
@@ -295,18 +297,55 @@ public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOp
295297
|| StringUtils.containsWithNullCheck(edge.getProducttype(), query) //
296298
);
297299
}
300+
final var searchParams = paginationOptions.getSearchParams();
301+
if (searchParams != null) {
302+
if (searchParams.searchIsOnline()) {
303+
pagesStream = pagesStream.filter(edge -> edge.isOnline() == searchParams.isOnline());
304+
}
305+
if (searchParams.productTypes() != null) {
306+
pagesStream = pagesStream.filter(edge -> searchParams.productTypes().contains(edge.getProducttype()));
307+
}
308+
// TODO sum state filter
309+
}
310+
298311
return pagesStream //
299312
.sorted((s1, s2) -> s1.getId().compareTo(s2.getId())) //
300313
.skip(paginationOptions.getPage() * paginationOptions.getLimit()) //
301314
.limit(paginationOptions.getLimit()) //
302315
.peek(t -> user.setRole(t.getId(), Role.ADMIN)) //
303-
.collect(Collectors.toMap(t -> t.getId(), t -> Role.ADMIN)); //
316+
.map(myEdge -> {
317+
return new EdgeMetadata(//
318+
myEdge.getId(), //
319+
myEdge.getComment(), //
320+
myEdge.getProducttype(), //
321+
myEdge.getVersion(), //
322+
Role.ADMIN, //
323+
myEdge.isOnline(), //
324+
myEdge.getLastmessage(), //
325+
null, //
326+
Level.OK);
327+
}).toList();
304328
}
305329

306330
@Override
307-
public Role getRoleForEdge(User user, String edgeId) throws OpenemsNamedException {
331+
public EdgeMetadata getEdgeMetadataForUser(User user, String edgeId) throws OpenemsNamedException {
332+
final var edge = this.edges.get(edgeId);
333+
if (edge == null) {
334+
return null;
335+
}
308336
user.setRole(edgeId, Role.ADMIN);
309-
return Role.ADMIN;
337+
338+
return new EdgeMetadata(//
339+
edge.getId(), //
340+
edge.getComment(), //
341+
edge.getProducttype(), //
342+
edge.getVersion(), //
343+
Role.ADMIN, //
344+
edge.isOnline(), //
345+
edge.getLastmessage(), //
346+
null, //
347+
Level.OK //
348+
);
310349
}
311350

312351
}

io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/MyEdge.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ public String getApikey() {
2121
public String getSetupPassword() {
2222
return this.setupPassword;
2323
}
24-
}
24+
}

io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/MetadataFile.java

+42-4
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@
3838
import io.openems.backend.common.metadata.SimpleEdgeHandler;
3939
import io.openems.backend.common.metadata.User;
4040
import io.openems.common.OpenemsOEM;
41+
import io.openems.common.channel.Level;
4142
import io.openems.common.event.EventReader;
4243
import io.openems.common.exceptions.OpenemsError;
4344
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
4445
import io.openems.common.exceptions.OpenemsException;
4546
import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions;
47+
import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata;
4648
import io.openems.common.session.Language;
4749
import io.openems.common.session.Role;
4850
import io.openems.common.utils.JsonUtils;
@@ -316,7 +318,7 @@ public void setUserAlertingSettings(User user, String edgeId, List<AlertingSetti
316318
}
317319

318320
@Override
319-
public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOptions)
321+
public List<EdgeMetadata> getPageDevice(User user, PaginationOptions paginationOptions)
320322
throws OpenemsNamedException {
321323
var pagesStream = this.edges.values().stream();
322324
final var query = paginationOptions.getQuery();
@@ -327,18 +329,54 @@ public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOp
327329
|| StringUtils.containsWithNullCheck(edge.getProducttype(), query) //
328330
);
329331
}
332+
final var searchParams = paginationOptions.getSearchParams();
333+
if (searchParams != null) {
334+
if (searchParams.searchIsOnline()) {
335+
pagesStream = pagesStream.filter(edge -> edge.isOnline() == searchParams.isOnline());
336+
}
337+
if (searchParams.productTypes() != null) {
338+
pagesStream = pagesStream.filter(edge -> searchParams.productTypes().contains(edge.getProducttype()));
339+
}
340+
// TODO sum state filter
341+
}
330342
return pagesStream //
331343
.sorted((s1, s2) -> s1.getId().compareTo(s2.getId())) //
332344
.skip(paginationOptions.getPage() * paginationOptions.getLimit()) //
333345
.limit(paginationOptions.getLimit()) //
334346
.peek(t -> user.setRole(t.getId(), Role.ADMIN)) //
335-
.collect(Collectors.toMap(t -> t.getId(), t -> Role.ADMIN)); //
347+
.map(myEdge -> {
348+
return new EdgeMetadata(//
349+
myEdge.getId(), //
350+
myEdge.getComment(), //
351+
myEdge.getProducttype(), //
352+
myEdge.getVersion(), //
353+
Role.ADMIN, //
354+
myEdge.isOnline(), //
355+
myEdge.getLastmessage(), //
356+
null, //
357+
Level.OK);
358+
}).toList();
336359
}
337360

338361
@Override
339-
public Role getRoleForEdge(User user, String edgeId) throws OpenemsNamedException {
362+
public EdgeMetadata getEdgeMetadataForUser(User user, String edgeId) throws OpenemsNamedException {
363+
final var edge = this.edges.get(edgeId);
364+
if (edge == null) {
365+
return null;
366+
}
340367
user.setRole(edgeId, Role.ADMIN);
341-
return Role.ADMIN;
368+
369+
return new EdgeMetadata(//
370+
edge.getId(), //
371+
edge.getComment(), //
372+
edge.getProducttype(), //
373+
edge.getVersion(), //
374+
Role.ADMIN, //
375+
edge.isOnline(), //
376+
edge.getLastmessage(), //
377+
null, //
378+
Level.OK //
379+
);
342380
}
343381

344382
}

io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public enum EdgeDevice implements Field {
6262
LASTMESSAGE("lastmessage", true), //
6363
OPENEMS_SUM_STATE("openems_sum_state_level", false), //
6464
OPENEMS_IS_CONNECTED("openems_is_connected", false), //
65-
STOCK_PRODUCTION_LOT_ID("stock_production_lot_id", false);
65+
STOCK_PRODUCTION_LOT_ID("stock_production_lot_id", false),
66+
FIRST_SETUP_PROTOCOL("first_setup_protocol_date", false);
6667

6768
public static final String ODOO_MODEL = "openems.device";
6869
public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_");

io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MetadataOdoo.java

+52-22
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import java.sql.SQLException;
44
import java.time.ZonedDateTime;
5+
import java.util.ArrayList;
56
import java.util.Collection;
6-
import java.util.LinkedHashMap;
77
import java.util.List;
88
import java.util.Map;
99
import java.util.NavigableMap;
@@ -45,14 +45,15 @@
4545
import io.openems.backend.metadata.odoo.odoo.FieldValue;
4646
import io.openems.backend.metadata.odoo.odoo.OdooHandler;
4747
import io.openems.backend.metadata.odoo.odoo.OdooUserRole;
48+
import io.openems.backend.metadata.odoo.odoo.OdooUtils.DateTime;
4849
import io.openems.backend.metadata.odoo.postgres.PostgresHandler;
4950
import io.openems.common.OpenemsOEM;
5051
import io.openems.common.channel.Level;
5152
import io.openems.common.event.EventReader;
52-
import io.openems.common.exceptions.OpenemsError;
5353
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
5454
import io.openems.common.exceptions.OpenemsException;
5555
import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions;
56+
import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata;
5657
import io.openems.common.session.Language;
5758
import io.openems.common.session.Role;
5859
import io.openems.common.types.EdgeConfig;
@@ -499,33 +500,62 @@ public void setUserAlertingSettings(User user, String edgeId, List<AlertingSetti
499500
}
500501

501502
@Override
502-
public Map<String, Role> getPageDevice(User user, PaginationOptions paginationOptions)
503-
throws OpenemsNamedException {
503+
public List<EdgeMetadata> getPageDevice(//
504+
final User user, //
505+
final PaginationOptions paginationOptions //
506+
) throws OpenemsNamedException {
504507
var result = this.odooHandler.getEdges((MyUser) user, paginationOptions);
505-
506-
Map<String, Role> devices = new LinkedHashMap<>();
507-
508-
var jDevices = JsonUtils.getAsJsonArray(result, "devices");
509-
for (var jDevice : jDevices) {
510-
var edgeId = JsonUtils.getAsString(jDevice, "name");
511-
var role = Role.getRole(JsonUtils.getAsString(jDevice, "role"));
512-
user.setRole(edgeId, role);
513-
514-
devices.put(edgeId, role);
508+
final var jsonArray = JsonUtils.getAsJsonArray(result, "devices");
509+
final var resultMetadata = new ArrayList<EdgeMetadata>(jsonArray.size());
510+
for (var jElement : jsonArray) {
511+
resultMetadata.add(this.convertToEdgeMetadata(user, jElement));
515512
}
516-
517-
return devices;
513+
return resultMetadata;
518514
}
519515

520516
@Override
521-
public Role getRoleForEdge(User user, String edgeId) throws OpenemsNamedException {
522-
var result = this.odooHandler.getEdgeWithRole((MyUser) user, edgeId);
523-
var roleString = JsonUtils.getAsOptionalString(result, "role") //
524-
.orElseThrow(() -> OpenemsError.COMMON_ROLE_UNDEFINED.exception(edgeId, user.getId()));
517+
public EdgeMetadata getEdgeMetadataForUser(User user, String edgeId) throws OpenemsNamedException {
518+
return this.convertToEdgeMetadata(user, this.odooHandler.getEdgeWithRole(user, edgeId));
519+
}
520+
521+
private EdgeMetadata convertToEdgeMetadata(User user, JsonElement jDevice) throws OpenemsNamedException {
522+
final var edgeId = JsonUtils.getAsString(jDevice, "name");
525523

526-
var role = Role.getRole(roleString);
524+
// TODO remove cached edge
525+
final var cachedEdge = this.getEdge(edgeId).orElse(null);
526+
if (cachedEdge == null) {
527+
throw new OpenemsException("Unable to find edge with id [" + edgeId + "]");
528+
}
529+
530+
final var role = Role.getRole(JsonUtils.getAsString(jDevice, "role"));
527531
user.setRole(edgeId, role);
528-
return role;
532+
533+
final var sumState = JsonUtils.getAsOptionalString(jDevice, "openems_sum_state_level") //
534+
.map(String::toUpperCase) //
535+
.map(Level::valueOf) //
536+
.orElse(Level.OK);
537+
final var commment = JsonUtils.getAsOptionalString(jDevice, "comment").orElse("");
538+
final var producttype = JsonUtils.getAsOptionalString(jDevice, "producttype").orElse("");
539+
final var firstSetupProtocol = JsonUtils.getAsOptionalString(jDevice, "first_setup_protocol_date")
540+
.map(DateTime::stringToDateTime) //
541+
.orElse(null);
542+
final var lastmessage = JsonUtils.getAsOptionalString(jDevice, "lastmessage") //
543+
.map(DateTime::stringToDateTime) //
544+
.orElse(null);
545+
546+
return new EdgeMetadata(//
547+
edgeId, //
548+
commment, //
549+
producttype, //
550+
cachedEdge.getVersion(), //
551+
role, //
552+
// TODO isOnline should also come from odoo and in the ui there should be a
553+
// subscribe to maybe "edgeState" if any of these properties change
554+
cachedEdge.isOnline(), //
555+
lastmessage, //
556+
firstSetupProtocol, //
557+
sumState //
558+
);
529559
}
530560

531561
}

0 commit comments

Comments
 (0)