@paul53 Mega. Danke Dir. Ich saß irgendwie dem Trugschluss auf, dass ich das dictionary selbst in der Form: values = { key1: value1, key2:value2} übergeben kann und nicht die Parameter, wie sie in der URL stehen formatieren soll.
Für alle denen es was hilft:
from urllib.parse import quote_plus
url = 'http://deineIOBIP:SimpeAPIPort/'
def dict_to_querystring(data: dict) -> str:
"""
Wandelt ein normales dictionary in die seltsame "Get-String form" um
key1=value1&key2=value2
:param data: dict of key:value paare
:return: string im query parameter format
"""
return "&".join(f"{quote_plus(str(k))}={quote_plus(str(v))}" for k, v in data.items())
def putBulk(values_dict, auth=None):
"""
Sendet mehrere Datenpunkte via PUT Request im Body
:param values_dict: dict of datapoint:value pairs, e.g. {"0_userdata.0.Datenpunkt1": True, 0_userdata.0.Datenpunkt2": 10.5, 0_userdata.0.Datenpunkt3": "Hallo" }
:param auth: Optional tuple (username, password) for basic auth
:return: API response
"""
try:
response = requests.post(url + 'setBulk', data=dict_to_querystring(values_dict), auth=auth, timeout=10.0)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
print(f"Error setting bulk values: {e}")
return None
Und wie erwartet ist der, durch urlencode verursachte Fehler, dass "numbers" zu "strings" werden damit weg. Dankeschön