.filter(channel -> ChannelKind.STATE.equals(channel.getKind()) && isLinked(channel.getUID()));
}
- default Optional<CommonInterface> getHomeHandler() {
- CommonInterface bridgeHandler = getBridgeHandler();
- if (bridgeHandler != null) {
- return bridgeHandler.getCapabilities().get(HomeCapability.class).isPresent() ? Optional.of(bridgeHandler)
- : Optional.empty();
+ default Optional<CommonInterface> recurseUpToHomeHandler(@Nullable CommonInterface handler) {
+ if (handler == null) {
+ return Optional.empty();
}
- return Optional.empty();
+ return handler.getCapabilities().get(HomeCapability.class).isPresent() ? Optional.of(handler)
+ : recurseUpToHomeHandler(handler.getBridgeHandler());
}
default List<CommonInterface> getActiveChildren() {
}
default <T extends RestCapability<?>> Optional<T> getHomeCapability(Class<T> clazz) {
- return getHomeHandler().map(handler -> handler.getCapabilities().get(clazz)).orElse(Optional.empty());
+ return recurseUpToHomeHandler(this).map(handler -> handler.getCapabilities().get(clazz))
+ .orElse(Optional.empty());
}
default void setNewData(NAObject newData) {
@Override
public List<NAObject> updateReadings() {
- return securityCapability.map(cap -> cap.getDeviceLastEvent(handler.getId(), moduleType.apiName))
+ return getSecurityCapability().map(cap -> cap.getDeviceLastEvent(handler.getId(), moduleType.apiName))
.map(event -> List.of((NAObject) event)).orElse(List.of());
}
}
import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
import java.util.ArrayList;
import java.util.List;
String newVpnUrl = newData.getVpnUrl();
if (newVpnUrl != null && !newVpnUrl.equals(vpnUrl)) {
// This will also decrease the number of requests emitted toward Netatmo API.
- localUrl = newData.isLocal() ? securityCapability.map(cap -> cap.ping(newVpnUrl)).orElse(null) : null;
+ localUrl = newData.isLocal() ? getSecurityCapability().map(cap -> cap.ping(newVpnUrl)).orElse(null) : null;
cameraHelper.setUrls(newVpnUrl, localUrl);
eventHelper.setUrls(newVpnUrl, localUrl);
}
// The channel should get triggered at last (after super and sub methods), because this allows rules to access
// the new updated data from the other channels.
final String eventType = event.getEventType().name();
- handler.getHomeHandler().ifPresent(homeHandler -> homeHandler.triggerChannel(CHANNEL_HOME_EVENT, eventType));
+ handler.recurseUpToHomeHandler(handler)
+ .ifPresent(homeHandler -> homeHandler.triggerChannel(CHANNEL_HOME_EVENT, eventType));
handler.triggerChannel(CHANNEL_HOME_EVENT, eventType);
}
@Override
public void handleCommand(String channelName, Command command) {
if (command instanceof OnOffType && CHANNEL_MONITORING.equals(channelName)) {
- securityCapability.ifPresent(cap -> cap.changeStatus(localUrl, OnOffType.ON.equals(command)));
+ getSecurityCapability().ifPresent(cap -> cap.changeStatus(localUrl, OnOffType.ON.equals(command)));
} else {
super.handleCommand(channelName, command);
}
@Override
protected void beforeNewData() {
super.beforeNewData();
- securityCapability.ifPresent(cap -> {
+ getSecurityCapability().ifPresent(cap -> {
NAObjectMap<HomeDataPerson> persons = cap.getPersons();
descriptionProvider.setStateOptions(personChannelUID, persons.values().stream()
.map(p -> new StateOption(p.getId(), p.getName())).collect(Collectors.toList()));
@Override
public List<NAObject> updateReadings() {
List<NAObject> result = new ArrayList<>();
- securityCapability.ifPresent(cap -> {
+ getSecurityCapability().ifPresent(cap -> {
HomeEvent event = cap.getDeviceLastEvent(handler.getId(), moduleType.apiName);
if (event != null) {
result.add(event);
private final Logger logger = LoggerFactory.getLogger(HomeCapability.class);
private final Set<FeatureArea> featureAreas = new HashSet<>();
private final NetatmoDescriptionProvider descriptionProvider;
- private Set<String> homeIds = Set.of();
+ private final Set<String> homeIds = new HashSet<>();
public HomeCapability(CommonInterface handler, NetatmoDescriptionProvider descriptionProvider) {
super(handler, HomeApi.class);
public void initialize() {
super.initialize();
HomeConfiguration config = handler.getConfiguration().as(HomeConfiguration.class);
- homeIds = Set.of(config.getId(), config.energyId, config.securityId);
+ homeIds.add(config.getId());
+ if (!config.energyId.isBlank()) {
+ homeIds.add(config.energyId);
+ }
+ if (!config.securityId.isBlank()) {
+ homeIds.add(config.securityId);
+ }
+ }
+
+ @Override
+ public void dispose() {
+ homeIds.clear();
+ super.dispose();
}
@Override
protected final EventChannelHelper eventHelper;
private Optional<WebhookServlet> webhook = Optional.empty();
- protected Optional<SecurityCapability> securityCapability = Optional.empty();
- protected Optional<HomeCapability> homeCapability = Optional.empty();
+ private Optional<SecurityCapability> securityCapability = Optional.empty();
+ private Optional<HomeCapability> homeCapability = Optional.empty();
public HomeSecurityThingCapability(CommonInterface handler, NetatmoDescriptionProvider descriptionProvider,
List<ChannelHelper> channelHelpers) {
eventHelper.setModuleType(moduleType);
}
- @Override
- public void initialize() {
- super.initialize();
- securityCapability = handler.getHomeCapability(SecurityCapability.class);
- homeCapability = handler.getHomeCapability(HomeCapability.class);
- ApiBridgeHandler accountHandler = handler.getAccountHandler();
- if (accountHandler != null) {
- webhook = accountHandler.getWebHookServlet();
- webhook.ifPresent(servlet -> servlet.registerDataListener(handler.getId(), this));
+ protected Optional<SecurityCapability> getSecurityCapability() {
+ if (securityCapability.isEmpty()) {
+ securityCapability = handler.getHomeCapability(SecurityCapability.class);
+ ApiBridgeHandler accountHandler = handler.getAccountHandler();
+ if (accountHandler != null) {
+ webhook = accountHandler.getWebHookServlet();
+ webhook.ifPresent(servlet -> servlet.registerDataListener(handler.getId(), this));
+ }
+ }
+ return securityCapability;
+ }
+
+ protected Optional<HomeCapability> getHomeCapability() {
+ if (homeCapability.isEmpty()) {
+ homeCapability = handler.getHomeCapability(HomeCapability.class);
}
+ return homeCapability;
}
@Override
@Override
protected void beforeNewData() {
super.beforeNewData();
- securityCapability.ifPresent(cap -> {
+ getSecurityCapability().ifPresent(cap -> {
Stream<HomeDataModule> cameras = cap.getModules().values().stream()
.filter(module -> module.getType() == ModuleType.WELCOME);
descriptionProvider.setStateOptions(cameraChannelUID,
@Override
public void handleCommand(String channelName, Command command) {
if ((command instanceof OnOffType) && CHANNEL_PERSON_AT_HOME.equals(channelName)) {
- securityCapability.ifPresent(cap -> cap.setPersonAway(handler.getId(), OnOffType.OFF.equals(command)));
+ getSecurityCapability().ifPresent(cap -> cap.setPersonAway(handler.getId(), OnOffType.OFF.equals(command)));
}
}
@Override
public List<NAObject> updateReadings() {
List<NAObject> result = new ArrayList<>();
- securityCapability.ifPresent(cap -> {
+ getSecurityCapability().ifPresent(cap -> {
HomeEvent event = cap.getLastPersonEvent(handler.getId());
if (event != null) {
result.add(event);
}
private void changeFloodlightMode(FloodLightMode mode) {
- securityCapability.ifPresent(cap -> cap.changeFloodlightMode(handler.getId(), mode));
+ getSecurityCapability().ifPresent(cap -> cap.changeFloodlightMode(handler.getId(), mode));
}
}