|
2 | 2 |
|
3 | 3 | import java.sql.SQLException;
|
4 | 4 | import java.time.ZonedDateTime;
|
| 5 | +import java.util.ArrayList; |
5 | 6 | import java.util.Collection;
|
6 |
| -import java.util.LinkedHashMap; |
7 | 7 | import java.util.List;
|
8 | 8 | import java.util.Map;
|
9 | 9 | import java.util.NavigableMap;
|
|
45 | 45 | import io.openems.backend.metadata.odoo.odoo.FieldValue;
|
46 | 46 | import io.openems.backend.metadata.odoo.odoo.OdooHandler;
|
47 | 47 | import io.openems.backend.metadata.odoo.odoo.OdooUserRole;
|
| 48 | +import io.openems.backend.metadata.odoo.odoo.OdooUtils.DateTime; |
48 | 49 | import io.openems.backend.metadata.odoo.postgres.PostgresHandler;
|
49 | 50 | import io.openems.common.OpenemsOEM;
|
50 | 51 | import io.openems.common.channel.Level;
|
51 | 52 | import io.openems.common.event.EventReader;
|
52 |
| -import io.openems.common.exceptions.OpenemsError; |
53 | 53 | import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
|
54 | 54 | import io.openems.common.exceptions.OpenemsException;
|
55 | 55 | import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions;
|
| 56 | +import io.openems.common.jsonrpc.response.GetEdgesResponse.EdgeMetadata; |
56 | 57 | import io.openems.common.session.Language;
|
57 | 58 | import io.openems.common.session.Role;
|
58 | 59 | import io.openems.common.types.EdgeConfig;
|
@@ -499,33 +500,62 @@ public void setUserAlertingSettings(User user, String edgeId, List<AlertingSetti
|
499 | 500 | }
|
500 | 501 |
|
501 | 502 | @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 { |
504 | 507 | 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)); |
515 | 512 | }
|
516 |
| - |
517 |
| - return devices; |
| 513 | + return resultMetadata; |
518 | 514 | }
|
519 | 515 |
|
520 | 516 | @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"); |
525 | 523 |
|
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")); |
527 | 531 | 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 | + ); |
529 | 559 | }
|
530 | 560 |
|
531 | 561 | }
|
0 commit comments