2 * Copyright (c) 2010-2023 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 {
59 final Map<String, Location> locationMap = createLocationMap(client);
60 final Map<String, Capability> capabilityMap = createCapabilityMap(client);
61 final Map<String, DeviceState> deviceStateMap = createDeviceStateMap(client);
62 final Map<String, List<Message>> messageMap = createMessageMap(client);
64 final List<Device> deviceList = client.getDevices(deviceStateMap.keySet());
65 for (final Device device : deviceList) {
66 final String deviceId = device.getId();
67 initializeDevice(device, deviceStateMap.get(deviceId), locationMap, capabilityMap,
68 getMessageList(device, messageMap));
74 * Returns the {@link Device} with the given deviceId with full configuration details, {@link Capability}s and
75 * states. Calling this may take a little bit longer...
77 public Device getFullDeviceById(final String deviceId) throws IOException, ApiException, AuthenticationException {
78 final Map<String, Location> locationMap = createLocationMap(client);
79 final Map<String, Capability> capabilityMap = createCapabilityMap(deviceId, client);
80 final List<Message> messageMap = createMessageMap(deviceId, client);
82 final DeviceState deviceState = new DeviceState();
83 deviceState.setId(deviceId);
84 deviceState.setState(client.getDeviceStateByDeviceId(deviceId));
86 final Device device = client.getDeviceById(deviceId);
87 initializeDevice(device, deviceState, locationMap, capabilityMap, messageMap);
91 private void initializeDevice(Device device, @Nullable DeviceState deviceState, Map<String, Location> locationMap,
92 Map<String, Capability> capabilityMap, List<Message> messageList) {
93 device.setDeviceState(deviceState);
95 if (isBatteryPowered(device)) {
96 device.setIsBatteryPowered(true);
99 device.setLocation(locationMap.get(device.getLocationId()));
101 device.setCapabilityMap(createDeviceCapabilityMap(device, capabilityMap));
103 device.setMessageList(messageList);
106 private static boolean isBatteryPowered(Device device) {
107 return BATTERY_POWERED_DEVICES.contains(device.getType());
110 private List<Message> getMessageList(Device device, Map<String, List<Message>> messageMap) {
111 return Objects.requireNonNullElse(messageMap.get(device.getId()), Collections.emptyList());
114 private static Map<String, Location> createLocationMap(InnogyClient client)
115 throws IOException, ApiException, AuthenticationException {
116 final List<Location> locationList = client.getLocations();
117 final Map<String, Location> locationMap = new HashMap<>(locationList.size());
118 for (final Location location : locationList) {
119 locationMap.put(location.getId(), location);
124 private static Map<String, CapabilityState> createCapabilityStateMap(InnogyClient client)
125 throws IOException, ApiException, AuthenticationException {
126 final List<CapabilityState> capabilityStateList = client.getCapabilityStates();
127 final Map<String, CapabilityState> capabilityStateMap = new HashMap<>(capabilityStateList.size());
128 for (final CapabilityState capabilityState : capabilityStateList) {
129 capabilityStateMap.put(capabilityState.getId(), capabilityState);
131 return capabilityStateMap;
134 private static Map<String, Capability> createCapabilityMap(InnogyClient client)
135 throws IOException, ApiException, AuthenticationException {
136 final Map<String, CapabilityState> capabilityStateMap = createCapabilityStateMap(client);
137 final List<Capability> capabilityList = client.getCapabilities();
139 return initializeCapabilities(capabilityStateMap, capabilityList);
142 private static Map<String, Capability> createCapabilityMap(String deviceId, InnogyClient client)
143 throws IOException, ApiException, AuthenticationException {
144 final Map<String, CapabilityState> capabilityStateMap = createCapabilityStateMap(client);
145 final List<Capability> capabilityList = client.getCapabilitiesForDevice(deviceId);
147 return initializeCapabilities(capabilityStateMap, capabilityList);
150 private static Map<String, Capability> initializeCapabilities(Map<String, CapabilityState> capabilityStateMap,
151 List<Capability> capabilityList) {
152 final Map<String, Capability> capabilityMap = new HashMap<>(capabilityList.size());
153 for (final Capability capability : capabilityList) {
154 String capabilityId = capability.getId();
156 CapabilityState capabilityState = capabilityStateMap.get(capabilityId);
157 capability.setCapabilityState(capabilityState);
159 capabilityMap.put(capabilityId, capability);
161 return capabilityMap;
164 private static Map<String, Capability> createDeviceCapabilityMap(Device device,
165 Map<String, Capability> capabilityMap) {
166 final HashMap<String, Capability> deviceCapabilityMap = new HashMap<>();
167 for (final String capabilityValue : device.getCapabilities()) {
168 final Capability capability = capabilityMap.get(Link.getId(capabilityValue));
169 final String capabilityId = capability.getId();
170 deviceCapabilityMap.put(capabilityId, capability);
172 return deviceCapabilityMap;
175 private static Map<String, DeviceState> createDeviceStateMap(InnogyClient client)
176 throws IOException, ApiException, AuthenticationException {
177 final List<DeviceState> deviceStateList = client.getDeviceStates();
178 final Map<String, DeviceState> deviceStateMap = new HashMap<>(deviceStateList.size());
179 for (final DeviceState deviceState : deviceStateList) {
180 deviceStateMap.put(deviceState.getId(), deviceState);
182 return deviceStateMap;
185 private List<Message> createMessageMap(String deviceId, InnogyClient client)
186 throws IOException, ApiException, AuthenticationException {
187 final List<Message> messages = client.getMessages();
188 final List<Message> messageList = new ArrayList<>();
189 final String deviceIdPath = "/device/" + deviceId;
191 for (final Message message : messages) {
192 logger.trace("Message Type {} with ID {}", message.getType(), message.getId());
193 if (message.getDevices() != null && !message.getDevices().isEmpty()) {
194 for (final String li : message.getDevices()) {
195 if (deviceIdPath.equals(li)) {
196 messageList.add(message);
204 private static Map<String, List<Message>> createMessageMap(InnogyClient client)
205 throws IOException, ApiException, AuthenticationException {
206 final List<Message> messageList = client.getMessages();
207 final Map<String, List<Message>> deviceMessageMap = new HashMap<>();
208 for (final Message message : messageList) {
209 if (message.getDevices() != null && !message.getDevices().isEmpty()) {
210 final String deviceId = message.getDevices().get(0).replace("/device/", "");
212 if (deviceMessageMap.containsKey(deviceId)) {
213 ml = deviceMessageMap.get(deviceId);
215 ml = new ArrayList<>();
218 deviceMessageMap.put(deviceId, ml);
221 return deviceMessageMap;