Sommaire
PushBullet est un service très complet permettant de relier vos ordinateurs et appareils mobiles ensemble pour partager entre eux, globalement ou de manière ciblée, des liens, des notifications (par exemple en cas de réception de SMS), des messages, des copier-coller et même des fichiers.
Vous pouvez installer les clients PushBullet sur Android, iOS, Windows et directement dans les navigateurs (sous forme d’extension) Chrome, Firefox, Safari ou Opéra.
Le package PushBullet pour Constellation vous permettra :
-
d’envoyer des notifications texte
-
d’envoyer des fichiers
-
d’envoyer des liens
-
d’envoyer des SMS de vos smartphones Android
-
de copier un texte dans le presse-papier (avec un abonnement PushBullet Prenium)
-
de récupérer des informations sur l’état de vos devices et utilisateurs connectés au service
Le code source de ce package est en ligne sur : https://github.com/myconstellation/constellation-packages/tree/master/PushBullet
Installation
Prérequis : PushBullet
Pour démarrer vous devez créer un compte sur https://www.pushbullet.com/.
Une fois votre compte activé, installer des clients PushBullet sur vos différents devices, par exemple votre smartphone (iOS ou Android) et dans votre navigateur.
Dès à présent, les notifications de votre smartphone seront partagées avec votre navigateur. Vous pourrez également depuis votre navigateur lire/écrire des SMS, etc…
Pour finir, dans les options de votre compte PushBullet, créer un “Access Token” qui servira pour connecter le package Constellation à votre comte PushBullet :
Installation du package
Depuis le “Online Package Repository” de votre Console Constellation, déployez le package PushBullet :
Une fois le package télécharger votre repository local, sélectionnez la sentinelle sur laquelle déployer le package :
Pour finir entrez le token dans la page de Settings et vous pouvez déployer votre package :
Vous pouvez également déployer ce package manuellement dans la configuration de votre Constellation :
1 2 3 4 5 |
<package name="PushBullet"> <settings> <setting key="token" value="<< access token >>" /> </settings> </package> |
Détails du package
Les Settings
Nom | Type | Détail | Description |
token | String | Obligatoire | Le token d’accès au compte PushBullet |
PushDevicesAsStateObjects | Boolean | Optionnel Défaut : ”true” |
Indique si les devices de votre compte PushBullet doivent être synchronisés dans les StateObjects |
PushChatsAsStateObjects | Boolean | Optionnel Défaut : ”true” |
Indique si les Chats associés à votre compte PushBullet doivent être synchronisés dans les StateObjects |
PushCurrentUserAsStateObject | Boolean | Optionnel Défaut : ”true” |
Indique si les détails votre compte PushBullet doit être synchronisé dans les StateObjects |
SendPushesReceivedToGroup | String | Optionnel Défaut : ”PushBullet” |
Spécifie le nom du groupe dans lequel le package Pushbullet va envoyer les notifications qu’il reçoit (par défaut: ‘PushBullet’). Laissez le champ vide pour désactiver cette fonctionnalité |
SendEphemeralsReceivedToGroup | String | Optionnel Défaut : ”PushBullet” |
Spécifie le nom du groupe dans lequel le package Pushbullet va envoyer les “ephemerals” qu’il reçoit (par défaut: ‘PushBullet’). Laissez le champ vide pour désactiver cette fonctionnalité. |
Les StateObjects
Vous retrouverez 4 StateObjects publiés par le package :
Nom | Type | Description |
CurrentUser | PushBullet.Models.User | Information sur l’utilisateur connecté |
Chats | PushBullet.Models.ChatsList | Liste des chats de l’utilisateur |
Devices | PushBullet.Models.DevicesList | Liste des devices connectés à PushBullet de l’utilisateur |
RateLimit | PushBullet.RateLimits | Etat des limites du service pour l’utilisateur |
Les MessageCallbacks
Le package expose 9 MessageCallbacks :
Nom | Réponse (saga) | Description |
GetDevices | PushBullet.Models.DevicesList | Récupère la liste des devices de l’utilisateur |
GetChats | PushBullet.Models.ChatsList | Récupère la liste des chats de l’utilisateur |
GetPushes | PushBullet.Models.PushesList | Récupère la liste des notification reçu par l’utilisateur |
GetCurrentUser | PushBullet.Models.User | Récupère le détail de l’utilisateur |
SendSMS | Aucune | Envoi un SMS depuis le smartphone (compatible avec le client Android seulement) |
CopyToClipboard | Aucune | Copie un texte dans le presse-papier d’un device (compatible avec un compte Prenium uniquement) |
PushNote | Aucune | Push une notification (message texte) |
PushLink | Aucune | Push une notification avec un lien |
PushFile | Aucune | Push une notification avec un fichier |
Quelques exemples
Tester l’envoi d’une notification depuis la Console Constellation
Le MC pour envoyer une simple notification se nomme “PushNote” :
Il prend en paramètre :
-
Le titre de la notification
-
Le texte de la notification
-
Le type de la cible pour la notification
-
L’argument de la cible
La cible (target) est une énumération :
Vous pouvez envoyer votre notification à un de vos devices, à un autre utilisateur (identifié par son mail), à un canal ou un client Web.
Dans notre cas, sélectionnons la cible par default “Device” et laissons le champs “targetArgument” afin de recevoir la notification sur tous nos devices enregistrés sur PushBullet et cliquons sur “Invoke” :
Votre notification sera instantanément reçue sur votre Smartphone :
Ici la notification reçue par Chrome sur un poste Windows :
Avec une smartwatch associée à votre téléphone, vous recevrez également vos notifications à votre poignet:
Envoyer des notification texte ou image depuis un package C#
N’hésitez pas dans le MessageCallbacks Explorer, à cliquer sur le bouton afin d’ouvrir le générateur de code pour invoquer le MC sélectionné avec les différentes API Constellation.
Ici en sélectionnant le langage C# :
Pour envoyer notre notification de puis un package C# on écrira :
1 |
PackageHost.CreateMessageProxy("PushBullet").PushNote("Constellation", "Ceci est un test"); |
Les deux derniers paramètres étant optionnels (target et targetArguments) vous pouvez les omettre !
Autre solution, générer du code avec le générateur inclus dans le SDK Constellation. Sélectionnez simplement le package “PushBullet” dans le générateur de code :
Vous pouvez ensuite invoquer vos MC dans votre code C# à partir du code générer profitant ainsi de l’auto-complétion et de la documentation directement dans votre IDE :
Par exemple pour envoyer une image vous pouvez invoquer le MC “PushFile” en spécifiant l’URI (file:// ou http(s)://) vers le fichier à envoyer. Si vous souhaitez envoyer une notification avec l’image de votre caméra par exemple :
1 |
MyConstellation.Packages.PushBullet.CreatePushBulletScope().PushFile(urlImageCamera, "Porte de garage ouverte"); |
L’image sera alors envoyée sur tous vos devices :
Tutoriels
Il n'y a pas encore de tutoriel exploitant ce package !
Lister ses devices et envoyer des notifications depuis une page Web
Prenons une page HTML que nous allons connecter à Constellation avec AngularJS (documentation ici).
Lorsque la page sera connectée à Constellation, enregistrons un lien vers le StateObject nommé “Devices” pour le package “PushBullet” afin d’enregistrer la liste des devices (propriété “Devices”) de la valeur du StateObject dans une variable de scope Angular sans oublier de faire un “$apply” pour rafraichir le scope AngularJS :
1 2 3 4 |
constellation.registerStateObjectLink("*", "PushBullet", "Devices", "*", function(so) { $scope.myDevices = so.Value.Devices; $scope.$apply(); }); |
Enfin dans le corps de votre page HTML, affcher une liste à point pour chaque device en affichant différentes informations comme le nom, fabriquant et modele de vos device :
1 2 3 4 5 6 |
<body ng-controller="DemoController"> My devices : <ul> <li ng-repeat="device in myDevices">{{device.Nickname}} ({{device.Manufacturer}} {{device.Model}} </ul> </body> |
Allons un peu plus loin en ajoutant un bouton sur chaque device pour envoyer une notification (PushNote) au device spécifiquement sélectionné. Dans le <li> ajoutons :
1 |
<a href="#" ng-click="sendPush(device)">Send Push</a> |
Et bien sûr déclarons la fonction “sendPush” dans notre scope pour invoquer le MC “PushNote” de notre package PushBullet en spécifiant l’ID du device destinataire de ce push et non tous les devices :
1 2 3 |
$scope.sendPush = function(device) { constellation.sendMessage({ Scope: 'Package', Args: ['PushBullet'] }, 'PushNote', [ "DemoJS", "Hello " + device.Nickname + " from JS", 'Device', }; |
Et voilà, aussi simple que cela !
Le code complet de la page :
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 |
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ng-app="demoApp"> <head> <title>Test API AngularJS</title> <script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"></script> <script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"></script> <script type="text/javascript" src="//cdn.myconstellation.io/js/Constellation-1.8.1.min.js"></script> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> <script type="text/javascript" src="//cdn.myconstellation.io/js/ngConstellation-1.8.1.min.js"></script> <script> var demo = angular.module('demoApp', ['ngConstellation']); demo.controller('DemoController', ['$scope', 'constellationConsumer', function ($scope, constellation) { constellation.initializeClient("https://skynet.ajsinfo.net/constellation/", "9eBsRK5FFS5h36cM3OeE74qaDhlxCE2", "TestAPI"); constellation.onConnectionStateChanged(function (change) { if (change.newState === $.signalR.connectionState.connected) { console.log("Connected to the Constellation"); constellation.registerStateObjectLink("*", "PushBullet", "Devices", "*", function(so) { $scope.myDevices = so.Value.Devices; $scope.$apply(); }); } }); $scope.sendPush = function(device) { constellation.sendMessage({ Scope: 'Package', Args: ['PushBullet'] }, 'PushNote', [ "DemoJS", "Hello " + device.Nickname + " from JS", 'Device', device.Id ]); }; constellation.connect(); }]); </script> </head> <body ng-controller="DemoController"> My devices : <ul> <li ng-repeat="device in myDevices">{{device.Nickname}} ({{device.Manufacturer}} {{device.Model}}) <a href="#" ng-click="sendPush(device)">Send Push</a></li> </ul> </body> </html> |
Recevoir des SMS depuis un Arduino/ESP
Si le paramètre “SendEphemeralsReceivedToGroup” n’est pas vide, le package enverra les “Ephemerals” comme les SMS reçus au groupe que vous avez spécifié par ce paramètre. Par défaut, il est défini à “PushBullet”, c’est à dire que si vous vous abonnez au groupe “PushBullet” vous recevrez les SMS et autre de notification de votre smartphone.
Prenons par exemple la page Web AngularJS créée ci-dessus pour bien comprendre. Lorsque votre page est connectée à Constellation, ajoutez le code suivant :
1 |
constellation.subscribeMessages("PushBullet"); |
Puis ajoutez un MessageCallback de votre page pour réceptionner le message nommé “ReceiveEphemeral”. On affichera alors le message reçu dans la console de notre navigateur pour comprendre ce que le package envoie :
1 2 3 |
constellation.registerMessageCallback("ReceiveEphemeral", function(msg) { console.log(msg); }); |
Lancez votre page et envoyez-vous un SMS :
Le message est bien reçu du package PushBullet (propriété Sender) avec la clé (identifiant du MessageCallback) “ReceiveEphemeral”. Le contenu du message (Data) contient :
- L’identifiant du device qui a reçu la notification
- Le type de notification. Pour une notification liée à la réception d’un SMS cette valeur est à “sms_changed”
- Le tableau contenant le ou les notifications
Si la notification de l’“Ephemeral” est de type “sms_changed”, le tableau des notifications contiendra les SMS reçus avec le nom du contact émetteur du SMS (title), le texte du SMS (body) et la date de réception (timestamp).
Enfin, lorsque vous ouvrez le SMS reçu sur votre Smartphone vous allez faire disparaitre la notification ce qui enverra un autre “Ephemeral” de type “dismissal” pour le package “sms” :
Il devient alors facile de réaliser un petit objet connecté qui serait capable de nous prévenir en faisant clignoter une LED par exemple, lorsque nous recevons un SMS et d’arrêter cette LED lorsque vous nous faisons disparaitre la notification sur notre Smartphone.
Dans la méthode “setup()” nous allons abonnez notre ESP au groupe “PushBullet” :
1 |
constellation.subscribeToGroup("PushBullet"); |
Notez que vous pouvez également abonner votre package depuis la Console Constellation.
Ajoutons ensuite un MessageCallback “ReceiveEphemeral” pour définir si oui ou non nous devons faire clignoter une LED :
1 2 3 4 5 6 7 8 9 10 11 |
constellation.registerMessageCallback("ReceiveEphemeral", [](JsonObject& json) { if(json["Data"]["type"] == "sms_changed") { Serial.println("New SMS received"); blinkLed = true; } else if(json["Data"]["type"] == "dismissal") { Serial.println("SMS readed"); blinkLed = false; } }); |
De ce fait déclarons cette variable ainsi que d’autre :
1 2 3 4 5 |
bool blinkLed = false; int ledState = LOW; unsigned long previousMillis = 0; const int ledPin = LED_BUILTIN; const long interval = 1000; |
Pour faire clignoter la LED sans bloquer le programme avec des delay(), ajoutons la méthode suivante :
1 2 3 4 5 6 7 8 9 10 11 |
void driveLed() { if(blinkLed) { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; ledState = ledState == LOW ? HIGH: LOW; // Switches led state } } else ledState = LOW; digitalWrite(ledPin, ledState); } |
Pour finir dans la boucle principale, appellons notre méthode “driveLed” poru faire clignoter ou éteindre la LED en fonction :
1 2 3 4 |
void loop(void) { constellation.loop(); driveLed(); } |
Et voilà comment notifier la réception de SMS avec un LED drivée par un ESP8266 connecté à Constellation !
Envoyer un SMS depuis un simple appel HTTP
Si vous avez installé un client PushBullet sur un smartphone Android, vous pouvez l’utiliser en tant que passerelle SMS avec le MessageCallback “SendSMS” :
Ce MC prend en paramètre :
- L’ID de l’utilisateur
- L’ID du device qui sera utilisé comme passerelle SMS (ce device doit être un téléphone sous Android)
- Le n° du destinataire du SMS
- Le texte du SMS
Pour récupérer votre ID d’utilisateur, affichez les détails du StateObject “CurrentUser” :
Faites de même pour récupérer l’ID de votre device Android en visualisant le StateObject “Devices” :
Cliquez ensuite sur l’icone dans le MessageCallback Explorer pour afficher le code snippet du MC “SendSMS” en sélectionnant en tant que langage “HTTP Call” :
L’exemple est donné pour l’API Rest Constellation mais vous pouvez aussi utiliser l’API Rest Consumer en remplaçant “/rest/constellation” par “/rest/consumer”.
De ce fait, pour envoyer un SMS depuis un appel HTTP :
1 |
https://constellation.monserver.com/rest/consumer/SendMessage?SentinelName=Consumer&PackageName=DemoConstellation&AccessKey=xxxx&scope=Package&args=PushBullet&key=SendSMS&data=[ "mon_user_id_ici", "mon_device_id_android_ici", "0600000000", "Hello, ceci est un sms de test envoyé depuis l'API REST de Constellation" ] |
Sans oublier bien sûr de remplacer le “xxxx” par une AccessKey valide de votre Constellation.
Bonjour,
J’ai un soucis dont je ne trouve aucune solution à propos du package PushBullet déjà inclus dans la bibliothèque.
Je travail dans un fichier JS relié à un html.
Lorsque j’appelle le message callback send sms de PushBullet après l’avoir correctement paramétré je suppose, celui-ci ne renvoie rien. J’ai vu que dans le StateObject “Devices”, le paramètre HasSms de mon téléphone portable est sur false alors que d’après votre tutoriel il est censé être sur true.
Pourriez-vous m’indiquer comment régler ce problème svp?
Simon.
Ok trouvé, il fallait activer la synchro SMS dans l’appli android mais surtout redémarrer le téléphone.
Bonne journée!