Frage zu http request

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    wenn ich im Browser http://192.168.0.200/command?SetHeatpump=1 eingebe, funktioniert es, schaltet ein /aus

    wenn ich im Python scrip das mache geht es nicht:


    Traceback (most recent call last):

    File "/home/pi/th/WP-Steuerung_test.py", line 102, in <module>

    r1 = conn.getresponse()

    File "/usr/lib/python3.7/http/client.py", line 1352, in getresponse

    response.begin()

    File "/usr/lib/python3.7/http/client.py", line 310, in begin

    version, status, reason = self._read_status()

    File "/usr/lib/python3.7/http/client.py", line 279, in _read_status

    raise RemoteDisconnected("Remote end closed connection without"

    http.client.RemoteDisconnected: Remote end closed connection without response

    Was mache ich falsch?

  • Hallo,

    nein, tust du nicht. Die request-Methode bezieht sich auch `conn`, was wiederum eine Instanz von `http.client.HTTPConnection`ist. Wenn dir das mit den Klassen, Instanzen und Methode noch nicht klar ist vielleicht besser nochmal die entsprechenden Kapitel im Python-Tutorial durcharbeiten.

    Um `requests`zu nutzen (ungetestet):

    Code
    import requests
    payload = {'SetHeatpump': '1'}
    response = requests.get('http://192.168.0.200/command', params=payload)
    print(response.url)
    print(response)
    print(response.text)

    Doku: https://requests.readthedocs.io/en/latest/

    Gruß, noisefloor

  • Danke fuer die Antwort.

    Leider kommt ein Fehler.

    Ist aber so geschrieben wie in der verlinkten readthedocs.

    Code
    pi@solaranzeige:~/th $ /home/pi/th/WP-Steuerung_test.py
      File "/home/pi/th/WP-Steuerung_test.py", line 100
        payload = {'SetHeatpump': '0'}
                 ^
    SyntaxError: invalid character in identifier
  • Code
    payload = {'SetHeatpump': '0'}
             ^
             NO-BREAK SPACE
    
             
    
    In [1]: import unicodedata
    In [2]: unicodedata.name(" ")
    Out[2]: 'NO-BREAK SPACE'

    Das kann unter anderem ein Effekt des Quellcodeeditors hier im Forum sein.

    Das ist mir schon öfter aufgefallen, dass im Quellcode immer wieder mal unsichtbare Unicode-Zeichen auftauchen.

    Praktisch wäre es, wenn Quellcode-Blöcke im Forum automatisiert in die Normalform umgewandelt werden.

    Ein NO-BREAK SPACE wird dann z.B. in SPACE umgewandelt.

  • Code
    payload = {'SetHeatpump': '0'}
             ^
             NO-BREAK SPACE
    
             
    
    In [1]: import unicodedata
    In [2]: unicodedata.name(" ")
    Out[2]: 'NO-BREAK SPACE'

    Das kann unter anderem ein Effekt des Quellcodeeditors hier im Forum sein.

    Das ist mir schon öfter aufgefallen, dass im Quellcode immer wieder mal unsichtbare Unicode-Zeichen auftauchen.

    Praktisch wäre es, wenn Quellcode-Blöcke im Forum automatisiert in die Normalform umgewandelt werden.

    Ein NO-BREAK SPACE wird dann z.B. in SPACE umgewandelt.

    Wenn ich den Code aus #4 mit der Maus markiere und dann kopiere kommt der gleiche/ähnlicher Fehler. Aber wenn ich das Symbol "Inhalt kopieren" rechts oben im Codeblock nehme kommt dieser Fehler nicht.

    :rolleyes: sudo !!

  • Noch eine Frage.

    Wenn ich mehrere http Abfragen habe muss dann payload auf payload 1/2/3 geändert werden ?

  • Wenn ich mehrere http Abfragen habe muss dann payload auf payload 1/2/3 geändert werden ?

    Nicht unbedingt.

    Wenn man das Objekt vor der neuen Zuweisung verwendet, dann geht das. Das Problem ist eher, dass man als Mensch schnell vergisst, dass Variablen überschrieben werden:


    Wenn der Code aber weit auseinander liegt, braucht man bei solchen Fehlern mehr Zeit für die Fehlersuche.

    Da dein Payload immer gleich ist, bis auf die Zahl als str, kannst du dir eine Funktion erstellen:

    Python
    def heatpump_payload(pump_number):
        return {"SetHeatpump": str(pump_number)}
    
    
    requests.get(..., params=heatpump_payload(0))
    requests.get(..., params=heatpump_payload(1))
    requests.get(..., params=heatpump_payload(2))

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!