-
Notifications
You must be signed in to change notification settings - Fork 2
/
Octoprint-Notifications.groovy
135 lines (121 loc) · 4.41 KB
/
Octoprint-Notifications.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* Octoprint Monitors
* Cecil Coupe shamelessly borrowed code from
* Simple State Machines - Copyright 2019 Joel Wetzel
* Notification Proxy App - Copyright 2021 Robert Morris
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under the License.
*
*/
definition(
parent: "ccoupe:OctoPrint Monitors",
name: "OctoPrint Notifications",
namespace: "ccoupe",
author: "Cecil Coupe",
description: 'Select one "monitor" device to route its notifications to any number of notification devices',
iconUrl: "",
iconX2Url: ""
)
preferences {
page(name: "mainPage")
}
/*
preferences {
page(name: "mainPage", install: true, uninstall: true) {
section("Choose devices") {
input "proxyDevice", "device.MqttOctoprintMonitor",
title: "Mqtt Octoprint Monitor"
input "notificationDevice", "capability.notification",
title: "Notification Devices",
multiple: true
paragraph "When a notification device is sent to the proxy notification device, it will send the notification to all of the notification devices selected."
input "debugMode", "bool",
title: "Enable debug logging"
}
}
}
*/
void installed() {
log.debug "installed()"
initialize()
}
void updated() {
log.debug "updated()"
unsubscribe()
initialize()
}
void initialize() {
log.debug "initialize()"
subscribe(proxyDevice, "deviceNotification", notificationHandler)
}
void notificationHandler(evt) {
logDebug "Sending ${evt.value} to ${notificationDevice}"
String text = "${evt.value}"
flds = text.split(" ")
nlvl = settings?.notifyLevel
// drop thru mean publish notification
if (flds[1].contains("%") && nlvl != "Minimal") {
String vs = flds[1]
Integer val = vs.substring(0, vs.indexOf("%")).toInteger()
if (nlvl.startsWith("10%") && (val % 10 != 0)) return
if (nlvl.startsWith("5%") && (val % 5 != 0)) return
}
try {
notificationDevice.deviceNotification(text)
}
catch (ex) {
log.error("Error sending notification to devices: ${ex}")
}
}
void logDebug(str) {
if (settings.debugMode != false) log.debug(str)
}
def mainPage() {
dynamicPage(name: "mainPage", title: "", install: true, uninstall: true) {
if (!app.label) {
app.updateLabel(app.name)
}
section(getFormat("title", (app?.label ?: app?.name).toString())) {
input(name: "oPChildName", type: "string", title: "OctoPrint Notifications Child", multiple: false, required: true, submitOnChange: true)
if (settings.oPChildName) {
app.updateLabel(settings.oPChildName)
}
}
section () {
input "proxyDevice", "device.MqttOctoprintMonitor",
title: "Mqtt Octoprint Monitor (source) "
input "notificationDevice", "capability.notification",
title: "Notification Devices (destinations)",
options: (filterNoteDevices(settings.proxyDevice)),
multiple: true
paragraph "A notification from source device is sent to the destination notification device(s)."
}
section () {
input ("notifyLevel", "enum", title: "Pass messages:",
require: false,
displayDuringSetup:true,
options: getPrintLevels(),
defaultValue: "1% - level")
input(name: "enableLogging", type: "bool", title: "Enable Debug Logging?", defaultValue: true, required: true)
}
}
}
def getPrintLevels() {
/* can be computed */
def list = ["Minimal", "10% level", "5% level", "1% level"]
return list
}
def filterNoteDevices(exclude) {
log.info("filterNoteDevices: called")
}
def getFormat(type, myText="") {
if(type == "header-green") return "<div style='color:#ffffff;font-weight: bold;background-color:#81BC00;border: 1px solid;box-shadow: 2px 3px #A9A9A9'>${myText}</div>"
if(type == "line") return "\n<hr style='background-color:#1A77C9; height: 1px; border: 0;'></hr>"
if(type == "title") return "<h2 style='color:#1A77C9;font-weight: bold'>${myText}</h2>"
}