mirror of
https://github.com/node-red/node-red-nodes.git
synced 2023-10-10 13:36:58 +02:00
353 lines
15 KiB
HTML
353 lines
15 KiB
HTML
|
|
<!-- PUSHBULLET CONFIG -->
|
|
|
|
<script type="text/x-red" data-template-name="pushbullet-config">
|
|
<div class="form-row">
|
|
<label for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
<input type="text" id="node-config-input-name" placeholder="Name">
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-config-input-apikey"><i class="fa fa-lock"></i> API-key</label>
|
|
<input type="password" id="node-config-input-apikey">
|
|
</div>
|
|
</script>
|
|
|
|
<script type="text/javascript">
|
|
RED.nodes.registerType('pushbullet-config', {
|
|
category: 'config',
|
|
color: "rgb(218, 196, 180)",
|
|
defaults: {
|
|
name: {value: ""}
|
|
},
|
|
credentials: {
|
|
apikey: {type: "password"}
|
|
},
|
|
label: function() {
|
|
return this.name || "Pushbullet config";
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<!-- PUSHBULLET OUT -->
|
|
|
|
<script type="text/x-red" data-template-name="pushbullet">
|
|
<div class="form-row">
|
|
<label for="node-input-config"><i class="fa fa-user"></i> Config</label>
|
|
<input type="text" id="node-input-config">
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-deviceid"><i class="fa fa-mobile"></i> Device ID</label>
|
|
<select id="node-input-deviceid">
|
|
<option value="">All</option>
|
|
<option value="_msg_">- set from msg.deviceid -</option>
|
|
</select>
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-chan"><i class="fa fa-random"></i> Channel</label>
|
|
<input type="text" id="node-input-chan" placeholder="channel name">
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-pushtype"><i class="fa fa-dot-circle-o"></i> Type</label>
|
|
<select id="node-input-pushtype">
|
|
<optgroup label="Push types">
|
|
<option value="address">Address</option>
|
|
<option value="file">File</option>
|
|
<option value="link">Link</option>
|
|
<option value="list">List</option>
|
|
<option value="note">Note</option>
|
|
<option value="">- set from msg.pushtype -</option>
|
|
</optgroup>
|
|
<optgroup label="Actions">
|
|
<option value="delete">Delete push</option>
|
|
<option value="dismissal">Dismiss push</option>
|
|
<option value="updatelist">Update list</option>
|
|
</optgroup>
|
|
</select>
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-title"><i class="fa fa-random"></i> Title</label>
|
|
<input type="text" id="node-input-title" placeholder="Node-RED">
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
<input type="text" id="node-input-name" placeholder="Name">
|
|
</div>
|
|
<div class="form-tips" id="pushbullet-migration-info" style="display: none;">
|
|
<p><i class="fa fa-random"></i> Configuration node has been migrated, please click Ok and then re-deploy flow to save settings.</p>
|
|
</div>
|
|
</script>
|
|
|
|
<script type="text/x-red" data-help-name="pushbullet">
|
|
<p>Uses PushBullet to push <code>msg.payload</code> to a device that has the PushBullet app installed.</p>
|
|
<p>Optionally uses <code>msg.topic</code> to set the title, if not already set in the properties.</p>
|
|
<p>Optionally uses <code>msg.pushtype</code> to set the type of the push, if not already set in the properties.</p>
|
|
<p>Optionally uses <code>msg.deviceid</code> to set the device ID, if not already set in the properties.</p>
|
|
<p>You can also push to any channels that you own either configured or via <code>msg.channel</code>.</p>
|
|
<p>The node can also <i>dismiss</i> and <i>delete</i> and <i>update</i> items in a pushed list. In this case <code>msg.data.iden</code> must be set to a valid push id, if <code>msg</code> originates from the Pushbullet input node this value is already set.</p>
|
|
<p>The old method of storing your credentials in the pushkey.js file in the directory above /node-red is deprecated.</p>
|
|
</script>
|
|
|
|
<script type="text/javascript">
|
|
RED.nodes.registerType('pushbullet',{
|
|
category: 'mobile-outpit',
|
|
defaults: {
|
|
config: {type: "pushbullet-config", required: true},
|
|
pushtype: {value:"note"},
|
|
title: {value:""},
|
|
chan: {value:"" },
|
|
name: {value:""}
|
|
},
|
|
credentials: {
|
|
deviceid: {value: ""},
|
|
pushkey: {value: ""}
|
|
},
|
|
color:"#a7c9a0",
|
|
inputs:1,
|
|
outputs:0,
|
|
icon: "bullet.png",
|
|
align: "right",
|
|
label: function() {
|
|
var self = this;
|
|
function getName(deviceid) {
|
|
if(!self.devicename && deviceid && self.config) {
|
|
$.getJSON('pushbullet/'+self.config+'/devices', function(data) {
|
|
for(var i=0; i<data.length; i++) {
|
|
if(data[i].iden === deviceid) {
|
|
self.devicename = data[i].nickname;
|
|
self.dirty = true;
|
|
RED.view.redraw();
|
|
return;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
try {
|
|
getName(this.credentials.deviceid);
|
|
}
|
|
catch(err) {
|
|
$.getJSON('credentials/pushbullet/'+this.id, function(data) {
|
|
getName(data.deviceid);
|
|
});
|
|
}
|
|
|
|
return this.name||this.devicename||this.title||"pushbullet";
|
|
},
|
|
labelStyle: function() {
|
|
return this.name?"node_label_italic":"";
|
|
},
|
|
oneditsave: function() {
|
|
this.devicename = undefined;
|
|
if(this.migrationData) {
|
|
$.ajax('pushbullet/'+this.id+'/migrate?save=true');
|
|
}
|
|
},
|
|
oneditprepare: function() {
|
|
var node = this, ddConfig = $('#node-input-config'), ddDevice = $('#node-input-deviceid'), ddPushtype = $('#node-input-pushtype');
|
|
|
|
function updateDeviceList() {
|
|
if(!ddConfig.val()) {
|
|
ddDevice.children().remove();
|
|
ddDevice.append('<option value="">All</option>');
|
|
ddDevice.append('<option value="_msg_">- set from msg.deviceid -</option>');
|
|
var currentDevice;
|
|
if(node.credentials) {
|
|
currentDevice = node.credentials.deviceid;
|
|
}
|
|
if(currentDevice && currentDevice !== "_msg_") {
|
|
ddDevice.append('<option value="'+currentDevice+'">'+currentDevice+'</option>');
|
|
ddDevice.val(currentDevice);
|
|
}
|
|
}
|
|
else {
|
|
var config = RED.nodes.node(ddConfig.val()),
|
|
url = 'pushbullet/'+ddConfig.val()+'/devices';
|
|
if(config && config.credentials && config.credentials.apikey) {
|
|
url += '?apikey='+config.credentials.apikey;
|
|
}
|
|
$.getJSON(url, function(data) {
|
|
ddDevice.children().remove();
|
|
ddDevice.append('<option value="">All</option>');
|
|
ddDevice.append('<option value="_msg_">- set from msg.deviceid -</option>');
|
|
var currentDevice, addCurrent = true;
|
|
if(node.credentials) {
|
|
currentDevice = node.credentials.deviceid;
|
|
}
|
|
for(var i=0; i<data.length; i++) {
|
|
var dev = data[i];
|
|
ddDevice.append('<option value="'+dev.iden+'">'+dev.nickname+' ('+dev.kind+')</option>');
|
|
if(dev.iden === currentDevice) {
|
|
addCurrent = false;
|
|
}
|
|
}
|
|
|
|
if(currentDevice) {
|
|
if(addCurrent && currentDevice !== "_msg_") {
|
|
ddDevice.append('<option value="'+currentDevice+'">'+currentDevice+'</option>');
|
|
}
|
|
ddDevice.val(currentDevice);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function checkMigration(cb) {
|
|
$.getJSON('pushbullet/'+node.id+'/migrate', function(data) {
|
|
var showMigration = false;
|
|
node.migrationData = data.config;
|
|
if(data.migrated) {
|
|
if(data.config) {
|
|
var configId = data.config;
|
|
var configType = 'pushbullet-config';
|
|
var configTypeDef = RED.nodes.getType(configType);
|
|
RED.nodes.add({
|
|
type: configType,
|
|
id: configId,
|
|
name: "Imported",
|
|
users: [node.id],
|
|
label: configTypeDef.label,
|
|
_def: configTypeDef,
|
|
});
|
|
}
|
|
if(node.credentials) {
|
|
if(node.credentials.pushkey) {
|
|
if(ddConfig.find('option[value="'+data.config+'"]').length === 0) {
|
|
ddConfig.append('<option value="'+data.config+'">Imported</option>');
|
|
}
|
|
ddConfig.val(data.config);
|
|
showMigration = true;
|
|
}
|
|
else {
|
|
ddConfig.val("_ADD_");
|
|
}
|
|
|
|
if(node.credentials.deviceid) {
|
|
ddDevice.append('<option value="'+node.credentials.deviceid+'">Imported</option>');
|
|
ddDevice.val(node.credentials.deviceid);
|
|
showMigration = true;
|
|
}
|
|
else {
|
|
ddDevice.val("");
|
|
}
|
|
}
|
|
}
|
|
|
|
if(showMigration) {
|
|
ddPushtype.val("note");
|
|
node.dirty = true;
|
|
$('#pushbullet-migration-info').show();
|
|
}
|
|
if(cb) {
|
|
cb(showMigration);
|
|
}
|
|
});
|
|
}
|
|
|
|
checkMigration(function(migrated) {
|
|
if(!migrated) {
|
|
ddConfig.change(function() {
|
|
if(ddConfig.val() && ddConfig.val() !== "_ADD_") {
|
|
updateDeviceList();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<!-- PUSHBULLET IN -->
|
|
|
|
<script type="text/x-red" data-template-name="pushbullet in">
|
|
<div class="form-row">
|
|
<label for="node-input-config"><i class="fa fa-user"></i> Config</label>
|
|
<input type="text" id="node-input-config" placeholder="Node-RED">
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-filters"><i class="fa fa-mobile"></i> Device filter</label>
|
|
<select id="node-input-filters" style="width: 60%;" multiple="multiple"></select>
|
|
</div>
|
|
<div class="form-row">
|
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
<input type="text" id="node-input-name" placeholder="Name">
|
|
</div>
|
|
<div class="form-tips">
|
|
<i class="fa fa-mobile"></i> Device filter list is multi-selectable. No selections means no filtering, i.e. all pushes are emitted.
|
|
</div>
|
|
</script>
|
|
|
|
<script type="text/x-red" data-help-name="pushbullet in">
|
|
<p>Receives Pushbullets from all devices. Messages contain the following data:</p>
|
|
<p><code>msg.pushtype</code>: type of message</p>
|
|
<p><code>msg.topic</code>: topic information from the push</p>
|
|
<p><code>msg.payload</code>: main content of the push</p>
|
|
<p><code>msg.data</code>: original object from the pushbullet API containing e.g. sender, receiver and message ids.</p>
|
|
<p>Pushes of type <i>link</i> and <i>file</i> will also have <code>msg.message</code> containing the message associated with the push.</p>
|
|
<p>For further details of see <a href="https://docs.pushbullet.com/stream/">Pushbullet Stream API</a> and <a href="https://docs.pushbullet.com/v2/pushes/">Pushbullet Push API</a>.</p>
|
|
</script>
|
|
|
|
<script type="text/javascript">
|
|
RED.nodes.registerType('pushbullet in',{
|
|
category: 'mobile-input',
|
|
defaults: {
|
|
config: {type: "pushbullet-config", required: true},
|
|
name: {value:""}
|
|
},
|
|
credentials: {
|
|
filters: {value: []}
|
|
},
|
|
color:"#a7c9a0",
|
|
inputs:0,
|
|
outputs:1,
|
|
icon: "bullet.png",
|
|
label: function() {
|
|
return this.name||"pushbullet";
|
|
},
|
|
labelStyle: function() {
|
|
return this.name?"node_label_italic":"";
|
|
},
|
|
oneditprepare: function() {
|
|
var node = this, ddConfig = $('#node-input-config'), ddDevice = $('#node-input-filters');
|
|
|
|
function updateDeviceList() {
|
|
var config = RED.nodes.node(ddConfig.val()),
|
|
url = 'pushbullet/'+ddConfig.val()+'/devices';
|
|
if(config && config.credentials && config.credentials.apikey) {
|
|
url += '?apikey='+config.credentials.apikey;
|
|
}
|
|
$.getJSON(url, function(data) {
|
|
var currentDevices = [], addDevices = [];
|
|
if(node.credentials && node.credentials.filters) {
|
|
currentDevices = node.credentials.filters;
|
|
addDevices = node.credentials.filters.splice();
|
|
}
|
|
|
|
var idx;
|
|
ddDevice.children().remove();
|
|
for(var i=0; i<data.length; i++) {
|
|
var dev = data[i];
|
|
ddDevice.append('<option value="'+dev.iden+'">'+dev.nickname+' ('+dev.kind+')</option>');
|
|
|
|
idx = addDevices.indexOf(dev.iden);
|
|
if (idx > -1) {
|
|
addDevices.splice(idx, 1);
|
|
}
|
|
}
|
|
|
|
for(var j=0;j<addDevices.length;j++) {
|
|
ddDevice.append('<option value="'+addDevices[j]+'">'+addDevices[j]+'</option>');
|
|
}
|
|
ddDevice.val(currentDevices);
|
|
});
|
|
}
|
|
|
|
ddConfig.change(function() {
|
|
if(ddConfig.val() && ddConfig.val() !== "_ADD_") {
|
|
updateDeviceList();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
</script>
|