2 * Copyright (c) 2010-2022 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.innogysmarthome.internal.manager;
15 import static org.openhab.binding.innogysmarthome.internal.InnogyBindingConstants.BATTERY_POWERED_DEVICES;
17 import java.io.IOException;
18 import java.util.ArrayList;
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.List;
23 import java.util.Objects;
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.eclipse.jdt.annotation.Nullable;
27 import org.openhab.binding.innogysmarthome.internal.client.InnogyClient;
28 import org.openhab.binding.innogysmarthome.internal.client.entity.capability.Capability;
29 import org.openhab.binding.innogysmarthome.internal.client.entity.capability.CapabilityState;
30 import org.openhab.binding.innogysmarthome.internal.client.entity.device.Device;
31 import org.openhab.binding.innogysmarthome.internal.client.entity.device.DeviceState;
32 import org.openhab.binding.innogysmarthome.internal.client.entity.link.Link;
33 import org.openhab.binding.innogysmarthome.internal.client.entity.location.Location;
34 import org.openhab.binding.innogysmarthome.internal.client.entity.message.Message;
35 import org.openhab.binding.innogysmarthome.internal.client.exception.ApiException;
36 import org.openhab.binding.innogysmarthome.internal.client.exception.AuthenticationException;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
41 * @author Sven Strohschein - Initial contribution (but only created by refactoring the InnogyClient class)
44 public class FullDeviceManager {
46 private final Logger logger = LoggerFactory.getLogger(FullDeviceManager.class);
48 private final InnogyClient client;
50 public FullDeviceManager(InnogyClient client) {
55 * Returns a {@link List} of all {@link Device}s with the full configuration details, {@link Capability}s and
56 * states. Calling this may take a while...
58 public List<Device> getFullDevices() throws IOException, ApiException, AuthenticationException {
60 final Map<String, Location> locationMap = createLocationMap(client);
61 final Map<String, Capability> capabilityMap = createCapabilityMap(client);
62 final Map<String, DeviceState> deviceStateMap = createDeviceStateMap(client);
63 final Map<String, List<Message>> messageMap = createMessageMap(client);
65 final List<Device> deviceList = client.getDevices(deviceStateMap.keySet());
66 for (final Device device : deviceList) {
67 final String deviceId = device.getId();
68 initializeDevice(device, deviceStateMap.get(deviceId), locationMap, capabilityMap,
69 getMessageList(device, messageMap));
75 * Returns the {@link Device} with the given deviceId with full configuration details, {@link Capability}s and
76 * states. Calling this may take a little bit longer...
78 public Device getFullDeviceById(final String deviceId) throws IOException, ApiException, AuthenticationException {
79 final Map<String, Location> locationMap = createLocationMap(client);
80 final Map<String, Capability> capabilityMap = createCapabilityMap(deviceId, client);
81 final List<Message> messageMap = createMessageMap(deviceId, client);
83 final DeviceState deviceState = new DeviceState();
84 deviceState.setId(deviceId);
85 deviceState.setState(client.getDeviceStateByDeviceId(deviceId));
87 final Device device = client.getDeviceById(deviceId);
88 initializeDevice(device, deviceState, locationMap, capabilityMap, messageMap);
92 private void initializeDevice(Device device, @Nullable DeviceState deviceState, Map<String, Location> locationMap,
93 Map<String, Capability> capabilityMap, List<Message> messageList) {
95 device.setDeviceState(deviceState);
97 if (isBatteryPowered(device)) {
98 device.setIsBatteryPowered(true);
101 device.setLocation(locationMap.get(device.getLocationId()));
103 device.setCapabilityMap(createDeviceCapabilityMap(device, capabilityMap));
105 device.setMessageList(messageList);
108 private static boolean isBatteryPowered(Device device) {
109 return BATTERY_POWERED_DEVICES.contains(device.getType());
112 private List<Message> getMessageList(Device device, Map<String, List<Message>> messageMap) {
113 return Objects.requireNonNullElse(messageMap.get(device.getId()), Collections.emptyList());
116 private static Map<String, Location> createLocationMap(InnogyClient client)
117 throws IOException, ApiException, AuthenticationException {
118 final List<Location> locationList = client.getLocations();
119 final Map<String, Location> locationMap = new HashMap<>(locationList.size());
120 for (final Location location : locationList) {
121 locationMap.put(location.getId(), location);
126 private static Map<String, CapabilityState> createCapabilityStateMap(InnogyClient client)
127 throws IOException, ApiException, AuthenticationException {
128 final List<CapabilityState> capabilityStateList = client.getCapabilityStates();
129 final Map<String, CapabilityState> capabilityStateMap = new HashMap<>(capabilityStateList.size());
130 for (final CapabilityState capabilityState : capabilityStateList) {
131 capabilityStateMap.put(capabilityState.getId(), capabilityState);
133 return capabilityStateMap;
136 private static Map<String, Capability> createCapabilityMap(InnogyClient client)
137 throws IOException, ApiException, AuthenticationException {
139 final Map<String, CapabilityState> capabilityStateMap = createCapabilityStateMap(client);
140 final List<Capability> capabilityList = client.getCapabilities();
142 return initializeCapabilities(capabilityStateMap, capabilityList);
145 private static Map<String, Capability> createCapabilityMap(String deviceId, InnogyClient client)
146 throws IOException, ApiException, AuthenticationException {
148 final Map<String, CapabilityState> capabilityStateMap = createCapabilityStateMap(client);
149 final List<Capability> capabilityList = client.getCapabilitiesForDevice(deviceId);
151 return initializeCapabilities(capabilityStateMap, capabilityList);
154 private static Map<String, Capability> initializeCapabilities(Map<String, CapabilityState> capabilityStateMap,
155 List<Capability> capabilityList) {
156 final Map<String, Capability> capabilityMap = new HashMap<>(capabilityList.size());
157 for (final Capability capability : capabilityList) {
158 String capabilityId = capability.getId();
160 CapabilityState capabilityState = capabilityStateMap.get(capabilityId);
161 capability.setCapabilityState(capabilityState);
163 capabilityMap.put(capabilityId, capability);
165 return capabilityMap;
168 private static Map<String, Capability> createDeviceCapabilityMap(Device device,
169 Map<String, Capability> capabilityMap) {
171 final HashMap<String, Capability> deviceCapabilityMap = new HashMap<>();
172 for (final String capabilityValue : device.getCapabilities()) {
173 final Capability capability = capabilityMap.get(Link.getId(capabilityValue));
174 final String capabilityId = capability.getId();
175 deviceCapabilityMap.put(capabilityId, capability);
177 return deviceCapabilityMap;
180 private static Map<String, DeviceState> createDeviceStateMap(InnogyClient client)
181 throws IOException, ApiException, AuthenticationException {
182 final List<DeviceState> deviceStateList = client.getDeviceStates();
183 final Map<String, DeviceState> deviceStateMap = new HashMap<>(deviceStateList.size());
184 for (final DeviceState deviceState : deviceStateList) {
185 deviceStateMap.put(deviceState.getId(), deviceState);
187 return deviceStateMap;
190 private List<Message> createMessageMap(String deviceId, InnogyClient client)
191 throws IOException, ApiException, AuthenticationException {
192 final List<Message> messages = client.getMessages();
193 final List<Message> messageList = new ArrayList<>();
194 final String deviceIdPath = "/device/" + deviceId;
196 for (final Message message : messages) {
197 logger.trace("Message Type {} with ID {}", message.getType(), message.getId());
198 if (message.getDevices() != null && !message.getDevices().isEmpty()) {
199 for (final String li : message.getDevices()) {
200 if (deviceIdPath.equals(li)) {
201 messageList.add(message);
209 private static Map<String, List<Message>> createMessageMap(InnogyClient client)
210 throws IOException, ApiException, AuthenticationException {
211 final List<Message> messageList = client.getMessages();
212 final Map<String, List<Message>> deviceMessageMap = new HashMap<>();
213 for (final Message message : messageList) {
214 if (message.getDevices() != null && !message.getDevices().isEmpty()) {
215 final String deviceId = message.getDevices().get(0).replace("/device/", "");
217 if (deviceMessageMap.containsKey(deviceId)) {
218 ml = deviceMessageMap.get(deviceId);
220 ml = new ArrayList<>();
223 deviceMessageMap.put(deviceId, ml);
226 return deviceMessageMap;