* @author Victor Belov - Initial contribution
* @author Kai Kreuzer - migrated code to new Jetty client and ESH APIs
*/
-@Component(service = { EventSubscriber.class,
+@Component(service = { CloudService.class, EventSubscriber.class,
ActionService.class }, configurationPid = "org.openhab.openhabcloud", property = Constants.SERVICE_PID
+ "=org.openhab.openhabcloud")
@ConfigurableService(category = "io", label = "openHAB Cloud", description_uri = "io:openhabcloud")
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.io.openhabcloud.internal.actions;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.automation.Action;
+import org.openhab.core.automation.handler.BaseActionModuleHandler;
+import org.openhab.core.automation.handler.ModuleHandler;
+import org.openhab.io.openhabcloud.internal.CloudService;
+
+/**
+ * This is a base {@link ModuleHandler} implementation for {@link Action}s to send a notifications via openHAB Cloud.
+ *
+ * @author Christoph Weitkamp - Initial contribution
+ */
+@NonNullByDefault
+public abstract class BaseNotificationActionHandler extends BaseActionModuleHandler {
+
+ public static final String PARAM_MESSAGE = "message";
+ public static final String PARAM_ICON = "icon";
+ public static final String PARAM_SEVERITY = "severity";
+
+ protected final CloudService cloudService;
+
+ protected final String message;
+ protected final @Nullable String icon;
+ protected final @Nullable String severity;
+
+ public BaseNotificationActionHandler(Action module, CloudService cloudService) {
+ super(module);
+ this.cloudService = cloudService;
+
+ Object messageParam = module.getConfiguration().get(PARAM_MESSAGE);
+ if (messageParam instanceof String) {
+ this.message = messageParam.toString();
+ } else {
+ throw new IllegalArgumentException(String.format("Param '%s' should be of type String.", PARAM_MESSAGE));
+ }
+
+ Object iconParam = module.getConfiguration().get(PARAM_ICON);
+ this.icon = iconParam instanceof String ? iconParam.toString() : null;
+
+ Object severityParam = module.getConfiguration().get(PARAM_SEVERITY);
+ this.severity = severityParam instanceof String ? severityParam.toString() : null;
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.io.openhabcloud.internal.actions;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.automation.Visibility;
+import org.openhab.core.automation.type.ActionType;
+import org.openhab.core.automation.type.ModuleType;
+import org.openhab.core.automation.type.ModuleTypeProvider;
+import org.openhab.core.common.registry.ProviderChangeListener;
+import org.openhab.core.config.core.ConfigDescriptionParameter;
+import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
+import org.openhab.core.config.core.ConfigDescriptionParameterBuilder;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * This class provides a {@link ModuleTypeProvider} implementation to provide actions to send notifications via
+ * openHAB Cloud.
+ *
+ * @author Christoph Weitkamp - Initial contribution
+ */
+@NonNullByDefault
+@Component(service = ModuleTypeProvider.class)
+public class NotificationActionTypeProvider implements ModuleTypeProvider {
+
+ private static final ModuleType SEND_NOTIFICATION_ACTION = new ActionType(SendNotificationActionHandler.TYPE_ID,
+ getSendNotificationConfig(false, null), "send a notificaton",
+ "Sends a notification to a specific cloud user.", null, Visibility.VISIBLE, null, null);
+ private static final ModuleType SEND_EXTENDED_NOTIFICATION_ACTION = new ActionType(
+ SendNotificationActionHandler.EXTENDED_TYPE_ID, getSendNotificationConfig(true, null),
+ "send a notificaton with icon and severity",
+ "Sends a notification to a specific cloud user. Optionally add an icon or the severity.", null,
+ Visibility.VISIBLE, null, null);
+ private static final ModuleType SEND_BROADCAST_NOTIFICATION_ACTION = new ActionType(
+ SendBroadcastNotificationActionHandler.TYPE_ID, getNotificationConfig(false, null),
+ "broadcast a notificaton", "Sends a notification to all devices of all users.", null, Visibility.VISIBLE,
+ null, null);
+ private static final ModuleType SEND_EXRENDED_BROADCAST_NOTIFICATION_ACTION = new ActionType(
+ SendBroadcastNotificationActionHandler.EXTENDED_TYPE_ID, getNotificationConfig(true, null),
+ "broadcast a notificaton with icon and severity",
+ "Sends a notification to all devices of all users. Optionally add an icon or the severity.", null,
+ Visibility.VISIBLE, null, null);
+ private static final ModuleType SEND_LOG_NOTIFICATION_ACTION = new ActionType(
+ SendLogNotificationActionHandler.TYPE_ID, getNotificationConfig(false, null), "send a log message",
+ "Sends a log notification to the openHAB Cloud instance. Notifications are NOT sent to any registered devices.",
+ null, Visibility.VISIBLE, null, null);
+ private static final ModuleType SEND_EXTENDED_LOG_NOTIFICATION_ACTION = new ActionType(
+ SendLogNotificationActionHandler.EXTENDED_TYPE_ID, getNotificationConfig(true, null),
+ "send a log message with icon and severity",
+ "Sends a log notification to the openHAB Cloud instance. Optionally add an icon or the severity. Notifications are NOT sent to any registered devices.",
+ null, Visibility.VISIBLE, null, null);
+ private static final List<ModuleType> MODULE_TYPES = List.of(SEND_NOTIFICATION_ACTION,
+ SEND_EXTENDED_NOTIFICATION_ACTION, SEND_BROADCAST_NOTIFICATION_ACTION,
+ SEND_EXRENDED_BROADCAST_NOTIFICATION_ACTION, SEND_LOG_NOTIFICATION_ACTION,
+ SEND_EXTENDED_LOG_NOTIFICATION_ACTION);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public @Nullable ModuleType getModuleType(String UID, @Nullable Locale locale) {
+ switch (UID) {
+ case SendNotificationActionHandler.TYPE_ID:
+ return SEND_NOTIFICATION_ACTION;
+ case SendNotificationActionHandler.EXTENDED_TYPE_ID:
+ return SEND_EXTENDED_NOTIFICATION_ACTION;
+ case SendBroadcastNotificationActionHandler.TYPE_ID:
+ return SEND_BROADCAST_NOTIFICATION_ACTION;
+ case SendBroadcastNotificationActionHandler.EXTENDED_TYPE_ID:
+ return SEND_EXRENDED_BROADCAST_NOTIFICATION_ACTION;
+ case SendLogNotificationActionHandler.TYPE_ID:
+ return SEND_LOG_NOTIFICATION_ACTION;
+ case SendLogNotificationActionHandler.EXTENDED_TYPE_ID:
+ return SEND_EXTENDED_LOG_NOTIFICATION_ACTION;
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public Collection<ModuleType> getAll() {
+ return MODULE_TYPES;
+ }
+
+ @Override
+ public Collection<ModuleType> getModuleTypes(@Nullable Locale locale) {
+ return MODULE_TYPES;
+ }
+
+ private static List<ConfigDescriptionParameter> getSendNotificationConfig(boolean isExtended,
+ @Nullable Locale locale) {
+ List<ConfigDescriptionParameter> params = new ArrayList<>();
+ params.add(ConfigDescriptionParameterBuilder.create(SendNotificationActionHandler.PARAM_USER, Type.TEXT)
+ .withRequired(true).withLabel("User Id").withDescription("The cloud user id of the recipient.")
+ .build());
+ params.addAll(getNotificationConfig(isExtended, locale));
+ return params;
+ }
+
+ private static List<ConfigDescriptionParameter> getNotificationConfig(boolean isExtended, @Nullable Locale locale) {
+ List<ConfigDescriptionParameter> params = new ArrayList<>();
+ params.add(getMessageConfigParameter(locale));
+ if (isExtended) {
+ params.add(getIconConfigParameter(locale));
+ params.add(getSeverityConfigParameter(locale));
+ }
+ return params;
+ }
+
+ private static ConfigDescriptionParameter getMessageConfigParameter(@Nullable Locale locale) {
+ return ConfigDescriptionParameterBuilder.create(BaseNotificationActionHandler.PARAM_MESSAGE, Type.TEXT)
+ .withRequired(true).withLabel("Message").withDescription("The body of the notification.").build();
+ }
+
+ private static ConfigDescriptionParameter getIconConfigParameter(@Nullable Locale locale) {
+ return ConfigDescriptionParameterBuilder.create(BaseNotificationActionHandler.PARAM_ICON, Type.TEXT)
+ .withLabel("Icon").withDescription("The icon of the notification.").build();
+ }
+
+ private static ConfigDescriptionParameter getSeverityConfigParameter(@Nullable Locale locale) {
+ return ConfigDescriptionParameterBuilder.create(BaseNotificationActionHandler.PARAM_SEVERITY, Type.TEXT)
+ .withLabel("Severity").withDescription("The severity of the notification.").build();
+ }
+
+ @Override
+ public void addProviderChangeListener(ProviderChangeListener<ModuleType> listener) {
+ // does nothing because this provider does not change
+ }
+
+ @Override
+ public void removeProviderChangeListener(ProviderChangeListener<ModuleType> listener) {
+ // does nothing because this provider does not change
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.io.openhabcloud.internal.actions;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.automation.Action;
+import org.openhab.core.automation.Module;
+import org.openhab.core.automation.handler.BaseModuleHandlerFactory;
+import org.openhab.core.automation.handler.ModuleHandler;
+import org.openhab.core.automation.handler.ModuleHandlerFactory;
+import org.openhab.io.openhabcloud.internal.CloudService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+
+/**
+ * This class provides a {@link ModuleHandlerFactory} implementation to provide actions to send notifications via
+ * openHAB Cloud.
+ *
+ * @author Christoph Weitkamp - Initial contribution
+ */
+@NonNullByDefault
+@Component(service = ModuleHandlerFactory.class)
+public class NotificationModuleHandlerFactory extends BaseModuleHandlerFactory {
+
+ private static final Collection<String> TYPES = List.of(SendNotificationActionHandler.TYPE_ID,
+ SendNotificationActionHandler.EXTENDED_TYPE_ID, SendBroadcastNotificationActionHandler.TYPE_ID,
+ SendBroadcastNotificationActionHandler.EXTENDED_TYPE_ID, SendLogNotificationActionHandler.TYPE_ID,
+ SendLogNotificationActionHandler.EXTENDED_TYPE_ID);
+ private final CloudService cloudService;
+
+ @Activate
+ public NotificationModuleHandlerFactory(final @Reference CloudService cloudService) {
+ this.cloudService = cloudService;
+ }
+
+ @Override
+ @Deactivate
+ protected void deactivate() {
+ super.deactivate();
+ }
+
+ @Override
+ public Collection<String> getTypes() {
+ return TYPES;
+ }
+
+ @Override
+ protected @Nullable ModuleHandler internalCreate(Module module, String ruleUID) {
+ if (module instanceof Action) {
+ switch (module.getTypeUID()) {
+ case SendNotificationActionHandler.TYPE_ID:
+ case SendNotificationActionHandler.EXTENDED_TYPE_ID:
+ return new SendNotificationActionHandler((Action) module, cloudService);
+ case SendBroadcastNotificationActionHandler.TYPE_ID:
+ case SendBroadcastNotificationActionHandler.EXTENDED_TYPE_ID:
+ return new SendBroadcastNotificationActionHandler((Action) module, cloudService);
+ case SendLogNotificationActionHandler.TYPE_ID:
+ case SendLogNotificationActionHandler.EXTENDED_TYPE_ID:
+ return new SendLogNotificationActionHandler((Action) module, cloudService);
+ default:
+ break;
+ }
+ }
+ return null;
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.io.openhabcloud.internal.actions;
+
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.automation.Action;
+import org.openhab.core.automation.handler.ModuleHandler;
+import org.openhab.io.openhabcloud.internal.CloudService;
+
+/**
+ * This is a {@link ModuleHandler} implementation for {@link Action}s to send a notification to all devices of all
+ * cloud users.
+ *
+ * @author Christoph Weitkamp - Initial contribution
+ */
+@NonNullByDefault
+public class SendBroadcastNotificationActionHandler extends BaseNotificationActionHandler {
+
+ public static final String TYPE_ID = "notification.SendBroadcastNotification";
+ public static final String EXTENDED_TYPE_ID = "notification.SendExtendedBroadcastNotification";
+
+ public SendBroadcastNotificationActionHandler(Action module, CloudService cloudService) {
+ super(module, cloudService);
+ }
+
+ @Override
+ public @Nullable Map<String, Object> execute(Map<String, Object> context) {
+ cloudService.sendBroadcastNotification(message, icon, severity);
+ return null;
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.io.openhabcloud.internal.actions;
+
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.automation.Action;
+import org.openhab.core.automation.handler.ModuleHandler;
+import org.openhab.io.openhabcloud.internal.CloudService;
+
+/**
+ * This is a {@link ModuleHandler} implementation for {@link Action}s to send a log notification to the cloud.
+ *
+ * @author Christoph Weitkamp - Initial contribution
+ */
+@NonNullByDefault
+public class SendLogNotificationActionHandler extends BaseNotificationActionHandler {
+
+ public static final String TYPE_ID = "notification.SendLogNotification";
+ public static final String EXTENDED_TYPE_ID = "notification.SendExtendedLogNotification";
+
+ public SendLogNotificationActionHandler(Action module, CloudService cloudService) {
+ super(module, cloudService);
+ }
+
+ @Override
+ public @Nullable Map<String, Object> execute(Map<String, Object> context) {
+ cloudService.sendLogNotification(message, icon, severity);
+ return null;
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.io.openhabcloud.internal.actions;
+
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.automation.Action;
+import org.openhab.core.automation.handler.ModuleHandler;
+import org.openhab.io.openhabcloud.internal.CloudService;
+
+/**
+ * This is a {@link ModuleHandler} implementation for {@link Action}s to send a notification to a specific cloud user.
+ *
+ * @author Christoph Weitkamp - Initial contribution
+ */
+@NonNullByDefault
+public class SendNotificationActionHandler extends BaseNotificationActionHandler {
+
+ public static final String TYPE_ID = "notification.SendNotification";
+ public static final String EXTENDED_TYPE_ID = "notification.SendExtendedNotification";
+ public static final String PARAM_USER = "userId";
+
+ private final String userId;
+
+ public SendNotificationActionHandler(Action module, CloudService cloudService) {
+ super(module, cloudService);
+
+ Object userIdParam = module.getConfiguration().get(PARAM_USER);
+ if (userIdParam instanceof String) {
+ this.userId = userIdParam.toString();
+ } else {
+ throw new IllegalArgumentException(String.format("Param '%s' should be of type String.", PARAM_USER));
+ }
+ }
+
+ @Override
+ public @Nullable Map<String, Object> execute(Map<String, Object> context) {
+ cloudService.sendNotification(userId, message, icon, severity);
+ return null;
+ }
+}