Ankündigung

Einklappen
Keine Ankündigung bisher.

Parameter mit sh.tools.fetch_url() senden

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

    Parameter mit sh.tools.fetch_url() senden

    Ich möchte, erst mal in einer Logik, eine session starten um mich bei der Bosch Rasenmäherapi anzumelden. Das geht so:
    PHP-Code:
     POST https://api.indego.iot.bosch-si.com/api/v1/authenticate
    AuthorizationBasic bWF4Lm11c3RlckBhbnl3aGVyZS5jb206c3VwZXJzZWNyZXQ=  
    Request:
    {    
    "device":"",
       
    "os_type":"Android",
       
    "os_version":"4.0",
       
    "dvc_manuf":"unknown",
       
    "dvc_type":"unknown" 
    der erste Teil (Url Aufruf und Login) ist mir dabei klar, das scheint auch zu gehen, allerdings weiß ich nicht ob und wie ich dann den Request senden kann.

    #2
    Hi,
    das must du ziemlich sicher selbst programmieren da fetch_url mit GET arbeitet und nicht mit Post.

    auf
    https://docs.python.org/3/library/http.client.html
    findes du ganz unten ein beispiel dazu. Wie man die Authorization einbaut findest du im coding von fetch_url

    Viele Grüsse
    Jürgen

    Kommentar


      #3
      Hi Jürgen,

      danke für Deine Antwort. Ich kann mich mit sh.tools.fetch_url('URL','User';'Passwort') registrieren und erhalte:
      PHP-Code:
      {"contextId":"da148715-cbd2-48bf-a0ea-c9006XXXXX","userId":"0a7174a0-4a9c-11e6-8a68-0050569XXXXX","alm_sn":"XXXXXXXXX"}
      Wenn ich es richtig verstehe, dann kann ich mit context und userID nun weitere Informationen aufrufen oder auslösen, ich würde nun gerne versuchen den Status testweise abzufen, dass geht so (Quelle: https://github.com/zazaz-de/iot-devi...er/PROTOCOL.md) :
      PHP-Code:
        GET https://api.indego.iot.bosch-si.com/api/v1/alms/{serial}/state x-im-context-id: {contextId} 
      ich verstehe aber nicht, wich das nun in die URL packe, habe es so probiert:
      PHP-Code:
      https://api.indego.iot.bosch-si.com/api/v1/alms/XXXXXXXXX/state?x-im-context-id:0a7174a0-4a9c-11e6-8a68-0050569XXXXX 
      da bekomme ich aber nun ein 401 zurück (Cockie was missing or another device stole authentication)
      Zuletzt geändert von Marcov; 20.07.2016, 14:42.

      Kommentar


        #4
        von dem indego server habe ich keine ahnung was das ist. Aber wie schon gesagt wenn du einen HTTPS POST willst musst du das selber machen und du kannst das nicht über fetch_url machen. Weil fetch url machgt einen HTTPS GET aufruf.

        Viele Grüsse
        Jürgen

        Kommentar


          #5
          Hi Jürgen,

          der Indego ist ein Rasenmähroboter, dieser hat eine Schnittstelle über welche man den Status (Mähfortschritt, Fehlermeldungen, aktueller Status und auch eine interaktive Karte des Garten als SVG abrufen kann). Normalerweise kann man dies mit einer Handyapp machen, ich möchte das aber gerne in meine Haussteuerung einbauen und z.B. benachrichtigungen erhalten, wenn er festhängt oder ihn schlafen schicken, wenn es regnet.

          Ich habe mir fetch_url() und Deinen Link noch mal angeschaut und es nun hinbekommen Werte zu empfangen. Ich versuche mir nun erst mal eine Logik zu basteln, die den Status regelmäßig abruft, vielleicht schaffe ich daraus auch mein erstes Plugin. Danke noch mal für die Hilfe!

          Kommentar


            #6
            Hallo Jürgen

            Zitat von heckmannju Beitrag anzeigen
            das must du ziemlich sicher selbst programmieren da fetch_url mit GET arbeitet und nicht mit Post.
            Da würde ich aber wiedersprechen.

            Im Source Code von /lib/tools.py steht:
            Code:
            def fetch_url(self, url, username=None, password=None, timeout=2, warn_no_connect=1, method = 'GET', body=None, errorItem = None):
                ...
                conn.request(method, purl, body, headers)

            Ein POST wie oben müsste sich also etwa folgendermassen ausführen lassen:
            Code:
            sh.tools.fetch_url('https://api.indego.iot.bosch-si.com/api/v1/authenticate', method='POST', body={'device':'', 'os_type':'Android', 'os_version':'4.0', 'dvc_manuf':'unknown', 'dvc_type':'unknown'})
            Gruss
            Stefan

            P.S.
            Natürlich hast du Recht, falls noch der master-Branch vom originalen SmartHome eingesetzt wird. Die Änderung gilt erst seit 5. Aug 2013 im develop-Branch.
            Marcov hat leider keine Version erwähnt.
            Zuletzt geändert von smai; 21.07.2016, 15:26. Grund: P.S. einfügt

            Kommentar


              #7
              Hi,
              das kenne ich nicht... ich bin von dem ursprünglichen ausgegangen...
              https://github.com/mknx/smarthome/bl...r/lib/tools.py

              Viele Grüsse
              Jürgen

              Kommentar


                #8
                Nun hat sich mein Edit mit deinem Post überschnitten.

                Kommentar


                  #9
                  nabend! Ich bin auf smarthome.py develop, deshalb hatte jürgen glaube ich schon recht. Ich kriege die Stati alle gelesen. Nun hänge ich noch am Kartendownload bzw. am speichern:
                  PHP-Code:
                  sh.tools.test_url('https://api.indego.iot.bosch-si.com/api/v1/alms/XXX/map',context_id,120
                  gibt als Antwort ein Bild im SVG format zurück, dass will ich nun unter /tmp/garden.svg speichern.
                  ich habe es so probiert:
                  PHP-Code:
                  with sh.tools.test_url('https://api.indego.iot.bosch-si.com/api/v1/alms/XXX/map',context_id,120) as gardenopen("/tmp/garden.svg"'wb') as out_file:
                      
                  shutil.copyfileobj(gardenout_file
                  kriege aber:
                  PHP-Code:
                  2016-07-21 19:46:13,078 ERROR    indego_state Logicindego_stateFile: /usr/local/smarthome/logics/indego_state.pyLine34Method: <module>, Exception__exit__ -- scheduler.py:_task:348
                  Traceback 
                  (most recent call last):
                    
                  File "/usr/local/smarthome/lib/scheduler.py"line 341in _task
                      exec
                  (obj.bytecode)
                    
                  File "/usr/local/smarthome/logics/indego_state.py"line 34in <module>
                      
                  with sh.tools.test_url('https://api.indego.iot.bosch-si.com/api/v1/alms/XXX/map',context_id,120) as gardenopen("/tmp/garden.svg"'wb') as out_file:
                  AttributeError__exit__ 

                  Kommentar


                    #10
                    Meinst du mit "test_url" "fetch_url"?
                    Wenn ja überrascht mich etwas, dass du die context_id als Benutzername und 120 als Passwort mitgeben sollst.

                    Kommentar


                      #11
                      Hi, nein, ich habe mir eine neue Funktion test_url gemacht, mit der ich die context_id übergeben kann. Das geht einwandfrei, ich muss jetzt die Antwort davon als Datei speichern, da stecke ich fest...

                      Kommentar


                        #12
                        Ah, ok.
                        Und wie sieht diese Funktion aus? Gibt sie direkt den return value von fetch_url zurück?
                        Wenn ich mich nicht irre ist dieser im develop-Branch vom Typ bytes.
                        out_file.write(garden) könnte also funktionieren.

                        Kommentar

                        Lädt...
                        X