Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Pushbullet

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Shai
    antwortet
    Hey,

    musste auch erst mal reingucken - hab mich damit länger nicht beschäftigt,
    aber von der API des "Py Requests" aus zu schließen würde ich sagen:

    Code:
    response = sh.pushbullet.note("Note to myself.", "Call my mother.")
    iden = response['iden']
    versuchen.


    Ich hab auch im Anhang noch die (potentielle) Version zum Löschen von Pushes:

    Aufruf mit

    Code:
    sh.pushbullet.delete(<iden>)

    Grüße,

    Lars

    Code:
    #!/usr/bin/env python3
    # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
    #########################################################################
    #  Copyright 2011 KNX-User-Forum e.V.           https://knx-user-forum.de/
    #########################################################################
    #  This file is part of SmartHome.py.    http://mknx.github.io/smarthome/
    #
    #  SmartHome.py is free software: you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation, either version 3 of the License, or
    #  (at your option) any later version.
    #
    #  SmartHome.py is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
    #########################################################################
    
    import logging
    
    import json
    import requests
    import magic
    import os
    import re
    
    logger = logging.getLogger("Pushbullet")
    
    class Pushbullet(object):
        _apiurl = "https://api.pushbullet.com/v2/pushes"
        _upload_apiurl = "https://api.pushbullet.com/v2/upload-request"
    
        def __init__(self, smarthome, apikey=None, deviceid=None, debug=False):
            self._apikey = apikey
            self._deviceid = deviceid
            self._sh = smarthome
            self._debug = debug
    
        def run(self):
            pass
    
        def stop(self):
            pass
    
        def delete(self, pushid, apikey=None):
            if apikey is None:
                apikey = self._apikey
    
            try:
                response = requests.delete(self._apiurl + "/" + pushid, headers={"User-Agent": "SmartHome.py", "Content-Type": "application/json"}, auth=(apikey,""))
                if self._is_response_ok(response):
                    return response.json()
    
                logger.error("Could not delete Pushbullet notification. Error: {0}".format(response.text))
            except Exception as exception:
                logger.error("Could not delete Pushbullet notification. Error: {0}".format(exception))
    
            return False
    
        def note(self, title, body, deviceid=None, apikey=None):
            return self._push(data={"type": "note", "title": title, "body": body}, deviceid=deviceid, apikey=apikey)
    
        def link(self, title, url, deviceid=None, apikey=None, body=None):
            return self._push(data={"type": "link", "title": title, "url": url, "body": body}, deviceid=deviceid, apikey=apikey)
    
        def address(self, name, address, deviceid=None, apikey=None):
            return self._push(data={"type": "address", "name": name, "address": address}, deviceid=deviceid, apikey=apikey)
    
        def list(self, title, items, deviceid=None, apikey=None):
            return self._push(data={"type": "list", "title": title, "items": items}, deviceid=deviceid, apikey=apikey)
    
        def file(self, filepath, deviceid=None, apikey=None, body=None):
            if os.path.exists(filepath) == False:
                logger.error("Trying to push non existing file: {0}".format(filepath))
                return False
    
            return self._upload_and_push_file(filepath, body, deviceid, apikey)
    
        def _upload_and_push_file(self, filepath, body=None, deviceid=None, apikey=None):
            try:
                headers = {"User-Agent": "SmartHome.py", "Content-Type": "application/json"}
    
                if apikey is None:
                    apikey = self._apikey
    
                upload_request_response = requests.post(self._upload_apiurl, data=json.dumps({"file_name": os.path.basename(filepath), "file_type": magic.from_file(filepath, mime=True).decode("UTF-8")}), headers=headers, auth=(apikey,""))
    
                if self._is_response_ok(upload_request_response):
                    data = upload_request_response.json()
                    upload_response = requests.post(data["upload_url"], data=data["data"], headers={"User-Agent": "SmartHome.py"}, files={"file": open(filepath, "rb")})
    
                    if self._is_response_ok(upload_response):
                        if body is None:
                            body = ""
    
                        return self._push(data={"type": "file", "file_name": data["file_name"], "file_type": data["file_type"], "file_url": data["file_url"], "body": body}, deviceid=deviceid, apikey=apikey)
                    else:
                        logger.error("Error while uploading file: {0}".format(upload_response.text))
                else:
                    logger.error("Error while requesting upload: {0}".format(upload_request_response.text))
            except Exception as exception:
                logger.error("Could not send file to Pushbullet notification. Error: {0}".format(exception))
    
            return False
    
        def _push(self, data, deviceid=None, apikey=None):
            if apikey is None:
                apikey = self._apikey
    
            if deviceid is None:
                deviceid = self._deviceid
    
            if re.match(r"^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", deviceid):
                data["email"] = deviceid
            else:
                data["device_iden"] = deviceid
    
            try:
                response = requests.post(self._apiurl, data=json.dumps(data), headers={"User-Agent": "SmartHome.py", "Content-Type": "application/json"}, auth=(apikey,""))
                if self._is_response_ok(response):
                    return response.json()
    
                logger.error("Could not send Pushbullet notification. Error: {0}".format(response.text))
            except Exception as exception:
                logger.error("Could not send Pushbullet notification. Error: {0}".format(exception))
    
            return False
    
        def _is_response_ok(self, response):
            if response.status_code == 200 or response.status_code == 204:
                logger.debug("Pushbullet returns: Notification submitted.")
    
                return True
            elif response.status_code == 400:
                logger.warning("Pushbullet returns: Bad Request - Often missing a required parameter.")
            elif response.status_code == 401:
                logger.warning("Pushbullet returns: Unauthorized - No valid API key provided.")
            elif response.status_code == 402:
                logger.warning("Pushbullet returns: Request Failed - Parameters were valid but the request failed.")
            elif response.status_code == 403:
                logger.warning("Pushbullet returns: Forbidden - The API key is not valid for that request.")
            elif response.status_code == 404:
                logger.warning("Pushbullet returns: Not Found - The requested item doesn't exist.")
            elif response.status_code >= 500:
                logger.warning("Pushbullet returns: Server errors - something went wrong on PushBullet's side.")
            else:
                logger.error("Pushbullet returns unknown HTTP status code = {0}".format(response.status_code))
    
            if self._debug:
                logger.warning("Response was: {}".format(response.text))
    
            return False

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Hi Lars,
    blöde Frage, stehe gerade auf dem Schlauch... Könntest Du mir bitte kurz auf die Sprünge helfen wie ich an die "iden" herankomme?

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Hallo Lars,
    sorry für die ziemlich späte Rückmeldung. Habe nun heute Abend die neue Version mal eingespielt und werde berichten.

    Vielen Dank auf jeden Fall schon mal für die neue Version! Klasse!
    Cheers,
    Oliver

    Einen Kommentar schreiben:


  • Shai
    antwortet
    Hallo zusammen,

    sorry das es etwas länger gedauert hat.

    Hier: http://pastebin.com/5uKB5DXf einmal eine Version, welche den JSON-Response der Pushbullet API zurückliefern sollte.

    (Anhänge scheinen nicht zu funktionieren )

    Habs leider noch nicht wirklich austesten können, hoffe aber das das soweit funktioniert.
    Im JSON Objekt findet man unter dem Key "iden" die ID des gesendeten Pushs, wenn man sich den nun am Auslöser-Objekt speichert könnte man sicherlich über eine Logik den Push löschen wenn die Bedingung wieder auf 0 gesetzt wird.

    Zum Löschen von Pushes muss ich das Plugin noch erweitern, ich versuche das am Wochenende nachzuliefern, aber evtl. kann man mit dem Response schon mal rumprobieren?


    Grüße,

    Lars
    Angehängte Dateien
    Zuletzt geändert von Shai; 07.08.2015, 08:39.

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Moin,
    hmm. Also laut dem Fehler "__init__.py, line 4" und "<!DOCTYPE html>" hätte ich gesagt die init-Datei ist keine reine Textdatei sondern irgendwas mit einem HTML-Header, denn in der Zeile 4 ist ja normalerweise noch ein # mit den Info/Copyrights, oder was sagt Dein File bei Zeile4?
    Mir ging das ganz am Anfang auch etliche Male so bevor ich auf einen anderen Editor (Notepad++) umgestiegen bin.
    Cheers,
    Oliver

    Einen Kommentar schreiben:


  • Hahn
    antwortet
    Zitat von Sandman60 Beitrag anzeigen
    Schuß ins Blaue... Dein Plugin ist kein Text/Plugincode sondern die HMTL-Seite vom GIT, sprich schau mal die __init__ Datei mit einem Notepad oder ähnlichem an...
    Hi Sandman60,

    danke für Deine schnelle Antwort! Ich bin leider erst heute wieder dazu gekommen...

    Leider weiß ich nicht so richtig, was ich mit Deiner Antwort anfangen soll, bzw was ich falsch gemacht habe - ich hab ja auch nicht mehr gemacht, als über den Befehl die Installation anzustoßen.
    Die init habe ich mit einem Editor geöffnet. Muß ich die init durch eine andere ersetzen? Ich habe in der init auch nichts geändert.

    Vielen Dank für Deine Hilfe!

    Einen Kommentar schreiben:


  • wpcdeeznutz
    antwortet
    Juhu, jetzt geht's. Musste mich am android telefon einmal ausloggen und wieder anmelden...
    Habe auch auf email umgestellt...
    Zuletzt geändert von wpcdeeznutz; 08.07.2015, 13:52.

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Yo, könnte der Unterschied sein. Finde Email deutlich komfortaler, denn da können dann diverse Devices dahinter sein. Sende damit auch an fremde PB-Clients/Accounts, bspw. an die meiner besseren Hälfte

    Einen Kommentar schreiben:


  • wpcdeeznutz
    antwortet
    Ich sende an ein Device. Werde mal die email adresse probieren...

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Naja, bei mir klappts einwandfrei, dann taucht auf dem Phone auf Meldung von "Me". Wohin sendest Du denn? An ein Device oder an einen User (emailadresse)? Ich sende immer notes an Emailadressen.

    Einen Kommentar schreiben:


  • wpcdeeznutz
    antwortet
    Also ich bekomme keine Benachrichtigung bei von mir selbst gesendeten Nachrichten. Wenn ich z.B. von der Desktopapp schreibe bekomme ich keine Benachrichtung auf dem Handy (Macht ja auch Sinn). Genauso wenig wie beim versenden durch sh.py. Bei Nachrichten von "außen" (z.B. WhatsApp) auf das Handy bekomme ich die Benachrichtigung auf dem Desktop (Popup). Folglich sehe ich die Nachrichten von sh.py nur, wenn ich die app auf dem Handy öffne...

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Verstehe leider das Problem nicht so ganz. Du kannst an Dich selbst senden und die Nachrichten werden dann auch gepusht, bspw. von SH auf das ip**ne.
    Dabei spielt es keine Rolle ob Du Dir oder jemand anders die Nachrichten versendet. Wo und wie siehst du denn die Nachrichten?

    Einen Kommentar schreiben:


  • wpcdeeznutz
    antwortet
    Hallo,

    kurze, vielleicht etwas blöde Frage: Ich kann die per sh gesendeten Nachrichten zwar sehen, bekomme aber keine Push Benachrichtigung. Macht ja auch irgendwie sinn, da ich ja quasi von meinem eigenen account an mich selber sende. Also kann ich die Nachrichten nur sehen, wenn ich pushbullet öffne und in die Message history schaue. Hab ich da was übersehen?

    Danke und Gruß

    Nils

    Einen Kommentar schreiben:


  • Shai
    antwortet
    Moin,


    ich hab mal in die API gesehen und festgestellt das es die Listen-Funktion nicht mehr gibt.
    Offenbar wurde das Featureset auf Notiz, Link und File reduziert. Der Typ "list" wird nicht mehr aufgeführt. - Interessanterweise ist es allerdings über die API noch möglich einzelne List-Items zu aktualisieren.

    Lassen sich Listen bzw. Mehrzeiler evtl. über "\n" im Text versenden?


    @Oliver
    Mit der Lifetime hab ich mich bisher nicht beschäftigt. Ich lösch alte Nachrichten meist per Hand. ;-)
    Theoretisch erlaubt die API ja ein Löschen, das wäre vermutlich am einfachsten zu realisieren wenn man sich die History abruft und dann z.B. übers Frontend n Löschbefehl schickt.

    Aufwendiger, aber ggfs. denkbar wäre es beim Push den Response zu nehmen und sich den Parameter "iden" zwischenzuspeichern. Bei einer negierenden Nachricht müsste man dann auf den Wert zurückgreifen und n Delete senden. Das wäre dann sicherlich in einer Logik zu machen - würde es helfen wenn das Plugin beim erfolgreichen push den "identifier" des Pushes zurückliefert? Oder den ganzen JSON-Response?


    Grüße,

    Lars


    PS: Bin jetzt wohl erst mal ein wenig im Urlaub - wird also kurzfristig nix angepasst werden ;-)

    Einen Kommentar schreiben:


  • fuxl66
    antwortet
    Also bei mir kommen sh.pushbullet.list Pushnachrichten als Einzeiler an. Verwendet sonst niemand die Listenfunktion?

    Einen Kommentar schreiben:

Lädt...
X