2 * Copyright (c) 2010-2023 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);
62 // add sound, if defined
63 if (sound != null && !DEFAULT_SOUND.equals(sound)) {
64 builder.withSound(sound);
68 if (urlTitle != null) {
69 builder.withUrlTitle(urlTitle);
72 if (attachment != null) {
73 builder.withAttachment(attachment);
74 if (contentType != null) {
75 builder.withContentType(contentType);
78 if (priority != null) {
79 builder.withPriority(priority.intValue());
82 builder.withDevice(device);
84 return send(builder, title);
87 public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title,
88 @Nullable String sound, @Nullable String url, @Nullable String urlTitle, @Nullable String attachment,
89 @Nullable String contentType, @Nullable Integer priority, @Nullable String device) {
90 return ((PushoverActions) actions).sendMessage(message, title, sound, url, urlTitle, attachment, contentType,
94 @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
95 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
96 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
97 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
98 logger.trace("ThingAction 'sendMessage' called with value(s): message='{}', title='{}'", message, title);
99 return send(getDefaultPushoverMessageBuilder(message), title);
102 public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title) {
103 return ((PushoverActions) actions).sendMessage(message, title);
106 @RuleAction(label = "@text/sendURLMessageActionLabel", description = "@text/sendURLMessageActionDescription")
107 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendURLMessage(
108 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
109 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
110 @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String", required = true) String url,
111 @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle) {
113 "ThingAction 'sendURLMessage' called with value(s): message='{}', url='{}', title='{}', urlTitle='{}'",
114 message, url, title, urlTitle);
116 throw new IllegalArgumentException("Skip sending message as 'url' is null.");
119 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withUrl(url);
120 if (urlTitle != null) {
121 builder.withUrl(urlTitle);
123 return send(builder, title);
126 public static Boolean sendURLMessage(ThingActions actions, String message, @Nullable String title, String url,
127 @Nullable String urlTitle) {
128 return ((PushoverActions) actions).sendURLMessage(message, title, url, urlTitle);
131 @RuleAction(label = "@text/sendHTMLMessageActionLabel", description = "@text/sendHTMLMessageActionDescription")
132 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendHtmlMessage(
133 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
134 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
135 logger.trace("ThingAction 'sendHtmlMessage' called with value(s): message='{}', title='{}'", message, title);
136 return send(getDefaultPushoverMessageBuilder(message).withHtmlFormatting(), title);
139 public static Boolean sendHtmlMessage(ThingActions actions, String message, @Nullable String title) {
140 return ((PushoverActions) actions).sendHtmlMessage(message, title);
143 @RuleAction(label = "@text/sendMonospaceMessageActionLabel", description = "@text/sendMonospaceMessageActionDescription")
144 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMonospaceMessage(
145 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
146 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
147 logger.trace("ThingAction 'sendMonospaceMessage' called with value(s): message='{}', title='{}'", message,
149 return send(getDefaultPushoverMessageBuilder(message).withMonospaceFormatting(), title);
152 public static Boolean sendMonospaceMessage(ThingActions actions, String message, @Nullable String title) {
153 return ((PushoverActions) actions).sendMonospaceMessage(message, title);
156 @RuleAction(label = "@text/sendAttachmentMessageActionLabel", description = "@text/sendAttachmentMessageActionDescription")
157 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendAttachmentMessage(
158 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
159 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
160 @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String", required = true) String attachment,
161 @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType) {
163 "ThingAction 'sendAttachmentMessage' called with value(s): message='{}', title='{}', attachment='{}', contentType='{}'",
164 message, title, attachment, contentType);
165 if (attachment == null) {
166 throw new IllegalArgumentException("Skip sending message as 'attachment' is null.");
169 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withAttachment(attachment);
170 if (contentType != null) {
171 builder.withContentType(contentType);
173 return send(builder, title);
176 public static Boolean sendAttachmentMessage(ThingActions actions, String message, @Nullable String title,
177 String attachment, @Nullable String contentType) {
178 return ((PushoverActions) actions).sendAttachmentMessage(message, title, attachment, contentType);
181 @RuleAction(label = "@text/sendPriorityMessageActionLabel", description = "@text/sendPriorityMessageActionDescription")
182 public @ActionOutput(name = "receipt", label = "@text/sendPriorityMessageActionOutputLabel", description = "@text/sendPriorityMessageActionOutputDescription", type = "java.lang.String") String sendPriorityMessage(
183 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
184 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
185 @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority) {
186 logger.trace("ThingAction 'sendPriorityMessage' called with value(s): message='{}', title='{}', priority='{}'",
187 message, title, priority);
188 PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message)
189 .withPriority(priority == null ? EMERGENCY_PRIORITY : priority.intValue());
192 builder.withTitle(title);
194 return accountHandler.sendPriorityMessage(builder);
197 public static String sendPriorityMessage(ThingActions actions, String message, @Nullable String title,
198 @Nullable Integer priority) {
199 return ((PushoverActions) actions).sendPriorityMessage(message, title, priority);
202 @RuleAction(label = "@text/cancelPriorityMessageActionLabel", description = "@text/cancelPriorityMessageActionDescription")
203 public @ActionOutput(name = "canceled", label = "@text/cancelPriorityMessageActionOutputLabel", description = "@text/cancelPriorityMessageActionOutputDescription", type = "java.lang.Boolean") Boolean cancelPriorityMessage(
204 @ActionInput(name = "receipt", label = "@text/cancelPriorityMessageActionInputReceiptLabel", description = "@text/cancelPriorityMessageActionInputReceiptDescription", type = "java.lang.String", required = true) String receipt) {
205 logger.trace("ThingAction 'cancelPriorityMessage' called with value(s): '{}'", receipt);
206 if (accountHandler == null) {
207 throw new RuntimeException("PushoverAccountHandler is null!");
210 if (receipt == null) {
211 throw new IllegalArgumentException("Skip canceling message as 'receipt' is null.");
214 return accountHandler.cancelPriorityMessage(receipt);
217 public static Boolean cancelPriorityMessage(ThingActions actions, String receipt) {
218 return ((PushoverActions) actions).cancelPriorityMessage(receipt);
221 @RuleAction(label = "@text/sendMessageToDeviceActionLabel", description = "@text/sendMessageToDeviceActionDescription")
222 public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessageToDevice(
223 @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String", required = true) String device,
224 @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
225 @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
226 logger.trace("ThingAction 'sendMessageToDevice' called with value(s): device='{}', message='{}', title='{}'",
227 device, message, title);
228 if (device == null) {
229 throw new IllegalArgumentException("Skip sending message as 'device' is null.");
232 return send(getDefaultPushoverMessageBuilder(message).withDevice(device), title);
235 public static Boolean sendMessageToDevice(ThingActions actions, String device, String message,
236 @Nullable String title) {
237 return ((PushoverActions) actions).sendMessageToDevice(device, message, title);
240 private PushoverMessageBuilder getDefaultPushoverMessageBuilder(String message) {
241 if (accountHandler == null) {
242 throw new RuntimeException("PushoverAccountHandler is null!");
245 if (message == null) {
246 throw new IllegalArgumentException("Skip sending message as 'message' is null.");
249 return accountHandler.getDefaultPushoverMessageBuilder(message);
252 private Boolean send(PushoverMessageBuilder builder, @Nullable String title) {
254 builder.withTitle(title);
256 return accountHandler.sendMessage(builder);
260 public void setThingHandler(@Nullable ThingHandler handler) {
261 this.accountHandler = (PushoverAccountHandler) handler;
265 public @Nullable ThingHandler getThingHandler() {
266 return accountHandler;