]> git.basschouten.com Git - openhab-addons.git/blob
d762ece969d60054b3cd023b184a756669467246
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.powermax.internal.discovery;
14
15 import java.util.Date;
16 import java.util.HashMap;
17 import java.util.Map;
18
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;
36
37 /**
38  * The {@link PowermaxDiscoveryService} is responsible for discovering
39  * all enrolled zones and X10 devices
40  *
41  * @author Laurent Garnier - Initial contribution
42  */
43 public class PowermaxDiscoveryService extends AbstractDiscoveryService implements PowermaxPanelSettingsListener {
44
45     private final Logger logger = LoggerFactory.getLogger(PowermaxDiscoveryService.class);
46
47     private static final int SEARCH_TIME = 5;
48
49     private PowermaxBridgeHandler bridgeHandler;
50
51     /**
52      * Creates a PowermaxDiscoveryService with background discovery disabled.
53      */
54     public PowermaxDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
55         super(PowermaxBindingConstants.SUPPORTED_THING_TYPES_UIDS, SEARCH_TIME, true);
56         this.bridgeHandler = bridgeHandler;
57     }
58
59     /**
60      * Activates the Discovery Service.
61      */
62     public void activate() {
63         bridgeHandler.registerPanelSettingsListener(this);
64     }
65
66     /**
67      * Deactivates the Discovery Service.
68      */
69     @Override
70     public void deactivate() {
71         bridgeHandler.unregisterPanelSettingsListener(this);
72     }
73
74     @Override
75     protected void startScan() {
76         logger.debug("Updating discovered things (new scan)");
77         updateFromSettings(bridgeHandler.getPanelSettings());
78     }
79
80     @Override
81     public void onPanelSettingsUpdated(PowermaxPanelSettings settings) {
82         logger.debug("Updating discovered things (global settings updated)");
83         updateFromSettings(settings);
84     }
85
86     @Override
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);
91     }
92
93     private void updateFromSettings(PowermaxPanelSettings settings) {
94         if (settings != null) {
95             long beforeUpdate = new Date().getTime();
96
97             for (int i = 1; i <= settings.getNbZones(); i++) {
98                 PowermaxZoneSettings zoneSettings = settings.getZoneSettings(i);
99                 updateFromZoneSettings(i, zoneSettings);
100             }
101
102             for (int i = 1; i < settings.getNbPGMX10Devices(); i++) {
103                 PowermaxX10Settings deviceSettings = settings.getX10Settings(i);
104                 updateFromDeviceSettings(i, deviceSettings);
105             }
106
107             // Remove not updated discovered things
108             removeOlderResults(beforeUpdate, bridgeHandler.getThing().getUID());
109         }
110     }
111
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) {
121                         return;
122                     }
123                 }
124             }
125
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";
132             }
133             String name = zoneSettings.getName();
134             if ("unknown".equalsIgnoreCase(name)) {
135                 name = "Alarm Zone " + zoneNumber;
136             }
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);
144         }
145     }
146
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) {
156                         return;
157                     }
158                 }
159             }
160
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);
172         }
173     }
174 }