Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Join (TTS, SMS, Phonecall, Notification uvm.)

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

    Neues Plugin: Join (TTS, SMS, Phonecall, Notification uvm.)

    Habe das Plugin nun lauffähig. Da es mein erstes Plugin ist, kann vielleicht einer nochmal drüber sehen, ich denke der Code wird verbesserungs würdig sein, vor allem was das Logging betrifft. Für den Anfang ist es für mich ausreichend.

    Infos zur API gibt es hier:
    https://joaoapps.com/join/api/

    Der Vorteil an Join ist, man kann direkt mit Tasker kommunizieren und direkt Aktionen am Handy oder Tablet ausführen. Es ist auch möglich das Handy mit SmarthomeNG fernzusteuern.
    Werde das noch weiter entwickeln und würde mich auf Ideen oder Hilfen freuen.

    Die plugin.conf:
    Code:
    [Join]
        class_name = Join
        class_path = plugins.Join
        device_id = <your deviceid>
        api_key = <your apikey>
    Das Plugin:

    Code:
    #!/usr/bin/env python3
    #
    #########################################################################
    #  Copyright 2017 Pierre Scheibke                       pierre(a)scheibke.com
    #########################################################################
    #
    #  This file is part of SmartHomeNG.
    #
    #  SmartHomeNG 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.
    #
    #  SmartHomeNG 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 SmartHomeNG. If not, see <http://www.gnu.org/licenses/>.
    #
    #########################################################################
    
    import logging
    
    import json
    import requests
    import magic
    import os
    import re
    import urllib.parse
    import http.client
    from lib.model.smartplugin import SmartPlugin
    
    
    
    class Join(SmartPlugin):
        SEND_URL = 'https://joinjoaomgcd.appspot.com/_ah/api/messaging/v1/sendPush?apikey='
        LIST_URL = 'https://joinjoaomgcd.appspot.com/_ah/api/registration/v1/listDevices?apikey='
        PLUGIN_VERSION = "1.0"
        ALLOW_MULTIINSTANCE = False
    
    
        def __init__(self, smarthome, api_key=None, device_id=None, debug=True):
            logging.getLogger("requests").setLevel(logging.WARNING)
            self._api_key = api_key
            self._device_id = device_id
            self._sh = smarthome
            self._debug = debug
            self.logger = logging.getLogger(__name__)
    
        def run(self):
            pass
    
        def stop(self):
            pass
    
    
        def send(self, title=None, text=None, icon=None, find=None, smallicon=None, device_id=None, device_ids=None, device_names=None, url=None, image=None, sound=None, group=None, clipboard=None, file=None, callnumber=None, smsnumber=None, smstext=None, mmsfile=None, wallpaper=None, lockWallpaper=None, interruptionFilter=None, mediaVolume=None, ringVolume=None, alarmVolume=None):
            req_url = self.SEND_URL + self._api_key
            if title: req_url += "&title=" + title
            if text: req_url += "&text=" + text
            if icon: req_url += "&icon=" + icon
            if find: req_url += "&find=" + find
            if smallicon: req_url += "&smallicon=" + smallicon
            if device_ids: req_url += "&deviceIds=" + device_ids
            if device_names: req_url += "&deviceNames=" + device_names
            if url: req_url += "&url=" + url
            if image: req_url += "&image=" + image
            if sound: req_url += "&sound=" + sound
            if group: req_url += "&group=" + group
            if clipboard: req_url += "&clipboard=" + clipboard
            if file: req_url += "&file=" + file
            if callnumber: req_url += "&callnumber=" + callnumber
            if smsnumber: req_url += "&smsnumber=" + smsnumber
            if smstext: req_url += "&smstext=" + smstext
            if mmsfile: req_url += "&mmsfile=" + mmsfile
            if wallpaper: req_url += "&wallpaper=" + wallpaper
            if lockWallpaper: req_url += "&lockWallpaper=" + lockWallpaper
            if interruptionFilter: req_url += "&interruptionFilter=" + interruptionFilter
            if mediaVolume: req_url += "&mediaVolume=" + mediaVolume
            if ringVolume: req_url += "&ringVolume=" + ringVolume
            if alarmVolume: req_url += "&alarmVolume=" + alarmVolume
            if device_id: req_url += "&deviceId=" + device_id
            else:
                req_url += "&deviceId=" + self._device_id
            self.logger.info(req_url)
            requests.get(req_url)
    logic example:
    Code:
    if (sh.your.item() == 1):
        sh.Join.send(smsnumber="0123456789, smstext="Hello World") to write a SMS
    
    if (sh.your.item() == 1):
        sh.Join.send(title="0123456789, text="Hello World") to write a notification
    
    if (sh.your.item() == 1):
        sh.Join.send(find="true") to find your device
    Alle mir bekannten Variabelen habe ich im Code. Diese können bei Bedarf gemischt werden. Bitte die Join API lesen!

    Viele Grüsse
    Knxfan
    Zuletzt geändert von Knx fan; 20.07.2017, 08:46.

    #2
    Sieht nach einem coolen Plugin aus! Danke dir!

    Kommentar


      #3
      Hast Du auch den Plan, es noch offiziell ins Repository zu nehmen? Dann schaue ich gerne genauer rein.

      Kommentar


        #4
        Gerne! Allerdings habe ich sowas noch nicht gemacht.

        Soll ich das machen oder soll ich alles mit einer Doku Posten und du machst es ins Repository?

        Kommentar


          #5
          Knx fan ich schaus mir jetzt erstmal an, die readme und eventuelle kleine korrekturen kann ich machen, den thread hier würde ich als support thread verlinken. das readme kann ich ggf auch erstellen, wenn ich was besonderes wissen muss, bitte info hier im thread.

          dein "realer" name im init file wäre noch gut, um ein copyright zu setzen. also ein header in dem stil: https://github.com/smarthomeNG/plugi...vm/__init__.py

          wenn du den hier zumindest nicht stehen haben willst, schick mir den header einfach als PM.. Im Repository würde er dann aber logischerweise stehen.

          Kommentar


            #6
            Ok! Habe den Header oben eingefügt.
            Ich denke das ist selbsterklärend, für weitere Infos stehe ich gerne zur Verfügung.

            Kommentar


              #7
              Knx fan ohne mich jetzt tiefer eingelesen zu haben: hast Du eine Ahnung, ob ich damit die Alarmsettings meines Handys "dynamisch" anpassen kann?

              Und noch was: laut meinem PyCharm werden folgende Imports nicht benötigt?
              Code:
              import json
              import magic
              import os
              import re
              import urllib.parse
              import http.client
              Wie übergebe ich denn bspw. Images? Als http link?

              Allgemein schaden Beispiele sicherlich nicht.. Schaue es mir aber auch noch an.

              Ok hat sich geklärt: file – a publicly accessible URL of a file. You can also send the url of a file on your personal Google Drive

              Die Imports dürften dann ja wirklich nicht benötigt werden.
              Zuletzt geändert von psilo; 20.07.2017, 10:52.

              Kommentar


                #8
                Habe mal die erste Version unter https://github.com/smarthomeNG/plugi...e/develop/join gepusht..

                Achtung: habe den Plugin-Folder in Kleinbuchstaben umbenannt, da die anderen hier auch alle klein geschrieben sind...

                Zudem habe ich Multiinstance auf TRUE gesetzt, um mehrere DeviceIDs zu unterstützen. Anpassungen sonstiger Art sollten dazu derzeit nicht nötig sein.

                Kommentar


                  #9
                  Die Device IDs werden unterstützt, diese werden komma getrennt angegeben sowie bei den deviceNames. Unter deviceid kann man auch deviceid=group.all angeben oder statt all, android, windows10, phone, tablet oder pc angeben um eine bestimmte Gruppierung zu erreichen.

                  Kommentar


                    #10
                    habs im repo wieder auf FALSE gesetzt.. danke..

                    PS: habe das ding mal getestet, geht gut... Wobei mir nicht wirklich wohl dabei ist, dass die App relativ viel mit meinem Gerät machen darf

                    Was noch toll wäre, wäre die Geräteliste rauszulassen, als Array von Dicts oder so.. Kann ich aber auch schnell bauen die Funktion.

                    Kommentar


                      #11
                      Das ist richtig, mehr oder weniger hat Tasker auch vollen Zugriff. Mir ging es vor allem darum das ich den Busstatus in das Handy bekomme um Sprachausgaben zu realisieren. Ich hatte oder habe das auch im Auge, entweder automatisch in items schreiben oder im Log ausgeben ähnlich wie beim Nuki.

                      Hier ein Anfang:

                      Code:
                          LIST_URL = "https://joinjoaomgcd.appspot.com/_ah/api/registration/v1/listDevices?apikey="
                      
                      def get_devices(api_key):
                          response = requests.get(LIST_URL + api_key).json()
                          if response.get('success') and not response.get('userAuthError'):
                              return [(r['deviceName'], r['deviceId']) for r in response['records']]
                      return False

                      Kommentar


                        #12
                        Danke. Ist gepusht

                        Kommentar


                          #13

                          Hallo,
                          steige gerade von fhem auf svNG um und habe zur Sprachausgabe von svNG auf meine Android-Panels die say-Funktion von join genutzt, um per tts Sprachausgaben zu machen. Bei der Inbetriebnahme habe ich festgestellt, dass das join-Plugin "say" und die Angabe der Landessprache "language" nicht unterstützt hat.

                          Es wäre nett, wenn jemand mit Zugang zum Repo in __init__.py in der Methode "send()" die Parameter "say" und "language" wie folgt dem Plugin hinzufügen würde:

                          Code:
                              def send(self, title=None, text=None, icon=None, find=None, smallicon=None, device_id=None, device_ids=None,
                                       device_names=None, url=None, image=None, sound=None, group=None, clipboard=None, file=None,
                                       callnumber=None, smsnumber=None, smstext=None, mmsfile=None, wallpaper=None, lockWallpaper=None,
                                       interruptionFilter=None, mediaVolume=None, ringVolume=None, alarmVolume=None, say=None, language=None):
                          und

                          Code:
                                  if say:
                                      req_url += "&say=" + say
                                  if language:
                                      req_url += "&language=" + language
                          Vielen Dank im Voraus ! Der erspart die individuelle Pflege dieser Erweiterung und hilft hoffentlich auch anderen bei der Nutzung.

                          VG
                          Jörk



                          Kommentar


                            #14
                            Hallo Jörk,

                            idealerweise machst Du für sowas ein Issue bei den Plugins in Github auf, sonst geht das hier im Forum schnell unter ...

                            Kommentar


                              #15
                              Issue ist auf github angelegt.

                              Kommentar

                              Lädt...
                              X