2 * Copyright (c) 2010-2021 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.pushover.internal.actions;
15 import static org.openhab.binding.pushover.internal.PushoverBindingConstants.*;
16 import static org.openhab.binding.pushover.internal.connection.PushoverMessageBuilder.*;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.pushover.internal.connection.PushoverMessageBuilder;
21 import org.openhab.binding.pushover.internal.handler.PushoverAccountHandler;
22 import org.openhab.core.automation.annotation.ActionInput;
23 import org.openhab.core.automation.annotation.ActionOutput;
24 import org.openhab.core.automation.annotation.RuleAction;
25 import org.openhab.core.thing.binding.ThingActions;
26 import org.openhab.core.thing.binding.ThingActionsScope;
27 import org.openhab.core.thing.binding.ThingHandler;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
32 * Some automation actions to be used with a {@link PushoverAccountHandler}.
34 * @author Christoph Weitkamp - Initial contribution
36 @ThingActionsScope(name = "pushover")
38 public class PushoverActions implements ThingActions {
40 private static final String DEFAULT_EMERGENCY_PRIORITY = "2";
42 private final Logger logger = LoggerFactory.getLogger(PushoverActions.class);
44 private @NonNullByDefault({}) PushoverAccountHandler accountHandler;
46 @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
47 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
48 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
49 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
50 @ActionInput(name = "sound", label = "@text/sendMessageActionInputSoundLabel", description = "@text/sendMessageActionInputSoundDescription", type = "java.lang.String", defaultValue = DEFAULT_SOUND) @Nullable String sound,
51 @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String") @Nullable String url,
52 @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle,
53 @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String") @Nullable String attachment,
54 @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType,
55 @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority,
56 @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String") @Nullable String device) {
58 "ThingAction 'sendMessage' called with value(s): message='{}', title='{}', sound='{}', url='{}', urlTitle='{}', attachment='{}', contentType='{}', priority='{}', device='{}'",
59 message, title, sound, url, urlTitle, attachment, contentType, priority, device);
61 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message);
63 builder.withSound(sound);
67 if (urlTitle != null) {
68 builder.withUrlTitle(urlTitle);
71 if (attachment != null) {
72 builder.withAttachment(attachment);
73 if (contentType != null) {
74 builder.withContentType(contentType);
77 if (priority != null) {
78 builder.withPriority(priority.intValue());
81 builder.withDevice(device);
83 return send(builder, title);
86 public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title,
87 @Nullable String sound, @Nullable String url, @Nullable String urlTitle, @Nullable String attachment,
88 @Nullable String contentType, @Nullable Integer priority, @Nullable String device) {
89 return ((PushoverActions) actions).sendMessage(message, title, sound, url, urlTitle, attachment, contentType,
93 @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
94 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
95 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
96 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
97 logger.trace("ThingAction 'sendMessage' called with value(s): message='{}', title='{}'", message, title);
98 return send(getDefaultPushoverMessageBuilder(message), title);
101 public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title) {
102 return ((PushoverActions) actions).sendMessage(message, title);
105 @RuleAction(label = "@text/sendURLMessageActionLabel", description = "@text/sendURLMessageActionDescription")
106 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendURLMessage(
107 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
108 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
109 @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String", required = true) String url,
110 @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle) {
112 "ThingAction 'sendURLMessage' called with value(s): message='{}', url='{}', title='{}', urlTitle='{}'",
113 message, url, title, urlTitle);
115 throw new IllegalArgumentException("Skip sending message as 'url' is null.");
118 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withUrl(url);
119 if (urlTitle != null) {
120 builder.withUrl(urlTitle);
122 return send(builder, title);
125 public static Boolean sendURLMessage(ThingActions actions, String message, @Nullable String title, String url,
126 @Nullable String urlTitle) {
127 return ((PushoverActions) actions).sendURLMessage(message, title, url, urlTitle);
130 @RuleAction(label = "@text/sendHTMLMessageActionLabel", description = "@text/sendHTMLMessageActionDescription")
131 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendHtmlMessage(
132 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
133 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
134 logger.trace("ThingAction 'sendHtmlMessage' called with value(s): message='{}', title='{}'", message, title);
135 return send(getDefaultPushoverMessageBuilder(message).withHtmlFormatting(), title);
138 public static Boolean sendHtmlMessage(ThingActions actions, String message, @Nullable String title) {
139 return ((PushoverActions) actions).sendHtmlMessage(message, title);
142 @RuleAction(label = "@text/sendMonospaceMessageActionLabel", description = "@text/sendMonospaceMessageActionDescription")
143 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMonospaceMessage(
144 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
145 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
146 logger.trace("ThingAction 'sendMonospaceMessage' called with value(s): message='{}', title='{}'", message,
148 return send(getDefaultPushoverMessageBuilder(message).withMonospaceFormatting(), title);
151 public static Boolean sendMonospaceMessage(ThingActions actions, String message, @Nullable String title) {
152 return ((PushoverActions) actions).sendMonospaceMessage(message, title);
155 @RuleAction(label = "@text/sendAttachmentMessageActionLabel", description = "@text/sendAttachmentMessageActionDescription")
156 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendAttachmentMessage(
157 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
158 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
159 @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String", required = true) String attachment,
160 @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType) {
162 "ThingAction 'sendAttachmentMessage' called with value(s): message='{}', title='{}', attachment='{}', contentType='{}'",
163 message, title, attachment, contentType);
164 if (attachment == null) {
165 throw new IllegalArgumentException("Skip sending message as 'attachment' is null.");
168 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withAttachment(attachment);
169 if (contentType != null) {
170 builder.withContentType(contentType);
172 return send(builder, title);
175 public static Boolean sendAttachmentMessage(ThingActions actions, String message, @Nullable String title,
176 String attachment, @Nullable String contentType) {
177 return ((PushoverActions) actions).sendAttachmentMessage(message, title, attachment, contentType);
180 @RuleAction(label = "@text/sendPriorityMessageActionLabel", description = "@text/sendPriorityMessageActionDescription")
181 public @ActionOutput(name = "receipt", label = "@text/sendPriorityMessageActionOutputLabel", description = "@text/sendPriorityMessageActionOutputDescription", type = "java.lang.String") String sendPriorityMessage(
182 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
183 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
184 @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority) {
185 logger.trace("ThingAction 'sendPriorityMessage' called with value(s): message='{}', title='{}', priority='{}'",
186 message, title, priority);
187 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message)
188 .withPriority(priority == null ? EMERGENCY_PRIORITY : priority.intValue());
191 builder.withTitle(title);
193 return accountHandler.sendPriorityMessage(builder);
196 public static String sendPriorityMessage(ThingActions actions, String message, @Nullable String title,
197 @Nullable Integer priority) {
198 return ((PushoverActions) actions).sendPriorityMessage(message, title, priority);
201 @RuleAction(label = "@text/cancelPriorityMessageActionLabel", description = "@text/cancelPriorityMessageActionDescription")
202 public @ActionOutput(name = "canceled", label = "@text/cancelPriorityMessageActionOutputLabel", description = "@text/cancelPriorityMessageActionOutputDescription", type = "java.lang.Boolean") Boolean cancelPriorityMessage(
203 @ActionInput(name = "receipt", label = "@text/cancelPriorityMessageActionInputReceiptLabel", description = "@text/cancelPriorityMessageActionInputReceiptDescription", type = "java.lang.String", required = true) String receipt) {
204 logger.trace("ThingAction 'cancelPriorityMessage' called with value(s): '{}'", receipt);
205 if (accountHandler == null) {
206 throw new RuntimeException("PushoverAccountHandler is null!");
209 if (receipt == null) {
210 throw new IllegalArgumentException("Skip canceling message as 'receipt' is null.");
213 return accountHandler.cancelPriorityMessage(receipt);
216 public static Boolean cancelPriorityMessage(ThingActions actions, String receipt) {
217 return ((PushoverActions) actions).cancelPriorityMessage(receipt);
220 @RuleAction(label = "@text/sendMessageToDeviceActionLabel", description = "@text/sendMessageToDeviceActionDescription")
221 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessageToDevice(
222 @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String", required = true) String device,
223 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
224 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
225 logger.trace("ThingAction 'sendMessageToDevice' called with value(s): device='{}', message='{}', title='{}'",
226 device, message, title);
227 if (device == null) {
228 throw new IllegalArgumentException("Skip sending message as 'device' is null.");
231 return send(getDefaultPushoverMessageBuilder(message).withDevice(device), title);
234 public static Boolean sendMessageToDevice(ThingActions actions, String device, String message,
235 @Nullable String title) {
236 return ((PushoverActions) actions).sendMessageToDevice(device, message, title);
239 private PushoverMessageBuilder getDefaultPushoverMessageBuilder(String message) {
240 if (accountHandler == null) {
241 throw new RuntimeException("PushoverAccountHandler is null!");
244 if (message == null) {
245 throw new IllegalArgumentException("Skip sending message as 'message' is null.");
248 return accountHandler.getDefaultPushoverMessageBuilder(message);
251 private Boolean send(PushoverMessageBuilder builder, @Nullable String title) {
253 builder.withTitle(title);
255 return accountHandler.sendMessage(builder);
259 public void setThingHandler(@Nullable ThingHandler handler) {
260 this.accountHandler = (PushoverAccountHandler) handler;
264 public @Nullable ThingHandler getThingHandler() {
265 return accountHandler;