2 * Copyright (c) 2010-2020 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.powermax.internal.discovery;
15 import java.util.Date;
16 import java.util.HashMap;
19 import org.openhab.binding.powermax.internal.PowermaxBindingConstants;
20 import org.openhab.binding.powermax.internal.config.PowermaxX10Configuration;
21 import org.openhab.binding.powermax.internal.config.PowermaxZoneConfiguration;
22 import org.openhab.binding.powermax.internal.handler.PowermaxBridgeHandler;
23 import org.openhab.binding.powermax.internal.handler.PowermaxThingHandler;
24 import org.openhab.binding.powermax.internal.state.PowermaxPanelSettings;
25 import org.openhab.binding.powermax.internal.state.PowermaxPanelSettingsListener;
26 import org.openhab.binding.powermax.internal.state.PowermaxX10Settings;
27 import org.openhab.binding.powermax.internal.state.PowermaxZoneSettings;
28 import org.openhab.core.config.discovery.AbstractDiscoveryService;
29 import org.openhab.core.config.discovery.DiscoveryResult;
30 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
31 import org.openhab.core.thing.Thing;
32 import org.openhab.core.thing.ThingUID;
33 import org.openhab.core.thing.binding.ThingHandler;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
38 * The {@link PowermaxDiscoveryService} is responsible for discovering
39 * all enrolled zones and X10 devices
41 * @author Laurent Garnier - Initial contribution
43 public class PowermaxDiscoveryService extends AbstractDiscoveryService implements PowermaxPanelSettingsListener {
45 private final Logger logger = LoggerFactory.getLogger(PowermaxDiscoveryService.class);
47 private static final int SEARCH_TIME = 5;
49 private PowermaxBridgeHandler bridgeHandler;
52 * Creates a PowermaxDiscoveryService with background discovery disabled.
54 public PowermaxDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
55 super(PowermaxBindingConstants.SUPPORTED_THING_TYPES_UIDS, SEARCH_TIME, true);
56 this.bridgeHandler = bridgeHandler;
60 * Activates the Discovery Service.
62 public void activate() {
63 bridgeHandler.registerPanelSettingsListener(this);
67 * Deactivates the Discovery Service.
70 public void deactivate() {
71 bridgeHandler.unregisterPanelSettingsListener(this);
75 protected void startScan() {
76 logger.debug("Updating discovered things (new scan)");
77 updateFromSettings(bridgeHandler.getPanelSettings());
81 public void onPanelSettingsUpdated(PowermaxPanelSettings settings) {
82 logger.debug("Updating discovered things (global settings updated)");
83 updateFromSettings(settings);
87 public void onZoneSettingsUpdated(int zoneNumber, PowermaxPanelSettings settings) {
88 logger.debug("Updating discovered things (zone {} updated)", zoneNumber);
89 PowermaxZoneSettings zoneSettings = (settings == null) ? null : settings.getZoneSettings(zoneNumber);
90 updateFromZoneSettings(zoneNumber, zoneSettings);
93 private void updateFromSettings(PowermaxPanelSettings settings) {
94 if (settings != null) {
95 long beforeUpdate = new Date().getTime();
97 for (int i = 1; i <= settings.getNbZones(); i++) {
98 PowermaxZoneSettings zoneSettings = settings.getZoneSettings(i);
99 updateFromZoneSettings(i, zoneSettings);
102 for (int i = 1; i < settings.getNbPGMX10Devices(); i++) {
103 PowermaxX10Settings deviceSettings = settings.getX10Settings(i);
104 updateFromDeviceSettings(i, deviceSettings);
107 // Remove not updated discovered things
108 removeOlderResults(beforeUpdate, bridgeHandler.getThing().getUID());
112 private void updateFromZoneSettings(int zoneNumber, PowermaxZoneSettings zoneSettings) {
113 if (zoneSettings != null) {
114 // Prevent for adding already known zone
115 for (Thing thing : bridgeHandler.getThing().getThings()) {
116 ThingHandler thingHandler = thing.getHandler();
117 if (thing.getThingTypeUID().equals(PowermaxBindingConstants.THING_TYPE_ZONE)
118 && thingHandler instanceof PowermaxThingHandler) {
119 PowermaxZoneConfiguration config = ((PowermaxThingHandler) thingHandler).getZoneConfiguration();
120 if (config.zoneNumber == zoneNumber) {
126 ThingUID bridgeUID = bridgeHandler.getThing().getUID();
127 ThingUID thingUID = new ThingUID(PowermaxBindingConstants.THING_TYPE_ZONE, bridgeUID,
128 String.valueOf(zoneNumber));
129 String sensorType = zoneSettings.getSensorType();
130 if ("unknown".equalsIgnoreCase(sensorType)) {
131 sensorType = "Sensor";
133 String name = zoneSettings.getName();
134 if ("unknown".equalsIgnoreCase(name)) {
135 name = "Alarm Zone " + zoneNumber;
137 name = sensorType + " " + name;
138 logger.debug("Adding new Powermax alarm zone {} ({}) to inbox", thingUID, name);
139 Map<String, Object> properties = new HashMap<>(1);
140 properties.put(PowermaxZoneConfiguration.ZONE_NUMBER, zoneNumber);
141 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties)
142 .withBridge(bridgeUID).withLabel(name).build();
143 thingDiscovered(discoveryResult);
147 private void updateFromDeviceSettings(int deviceNumber, PowermaxX10Settings deviceSettings) {
148 if (deviceSettings != null && deviceSettings.isEnabled()) {
149 // Prevent for adding already known X10 device
150 for (Thing thing : bridgeHandler.getThing().getThings()) {
151 ThingHandler thingHandler = thing.getHandler();
152 if (thing.getThingTypeUID().equals(PowermaxBindingConstants.THING_TYPE_X10)
153 && thingHandler instanceof PowermaxThingHandler) {
154 PowermaxX10Configuration config = ((PowermaxThingHandler) thingHandler).getX10Configuration();
155 if (config.deviceNumber == deviceNumber) {
161 ThingUID bridgeUID = bridgeHandler.getThing().getUID();
162 ThingUID thingUID = new ThingUID(PowermaxBindingConstants.THING_TYPE_X10, bridgeUID,
163 String.valueOf(deviceNumber));
164 String name = (deviceSettings.getName() != null) ? deviceSettings.getName()
165 : ("X10 device " + deviceNumber);
166 logger.debug("Adding new Powermax X10 device {} ({}) to inbox", thingUID, name);
167 Map<String, Object> properties = new HashMap<>(1);
168 properties.put(PowermaxX10Configuration.DEVICE_NUMBER, deviceNumber);
169 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties)
170 .withBridge(bridgeUID).withLabel(name).build();
171 thingDiscovered(discoveryResult);