Hallo Leute
Ich kämpfe mit der JSON-RPC-Schnittstelle. Genauer mit der Formatierung des „Param“-Feldes.
Ausgangslage:
Ein Raspberry-Pi hat ein 4x4 Keypad an einen I2C-Keyboard-controller angeschlossen und soll die gedrückte Taste via JSON-RPC an IPS übermitteln. Die gedrückte Taste ist eine 3-stellige Ziffer.
Auf dem Raspberry läuft ein Python-Script. Der JSON-RPC-Teil sieht so aus:
# JSON-RPS zu IPS definieren
def IpsRpc(methodIps, paramIps):
url = "http://<username>:<password>@<IPS-IP>:82/api/"
headers = {'content-type': 'application/json'}
payload = {
"method": methodIps,
"params": paramIps,
"jsonrpc": "2.0",
"id": 0,
}
print json.dumps(payload)
response = requests.post(url, data=json.dumps(payload), headers=headers).json
print(response)
Der Aufruf geschieht mittels dem Befehl:
IpsRpc("SetValue", '[10900, '+str(key) +']')
und generiert folgenden JSON-String:
{"jsonrpc": "2.0", "params": "[10900, 183]", "method": "SetValue", "id": 0}
10900 ist dabei die zu aktualisierende Variablen-ID von IPS. 183 ist die 3-stellige Ziffer der gedrückten Taste. Soweit sogut, nur antwortet mir IPS mit folgender Fehlermeldung:
{u'jsonrpc': u'2.0', u'id': None, u'error': {u'message': u'Invalid request (params field invalid)', u'code': u'-32600'}}
Der Fehler liegt offensichtlich beim „Params“ -Feld.
Wenn ich stattdessen folgenden CURL-Aufruf mache, funktioniert alles bestens:
curl -i -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "id": "0", "method": "SetValue", "params": [10900, 183]}' http://<username>:<password>@<IPS-IP>:82/api/
Mittels Wireshark sehe ich den Unterschied, dass der CURL-Aufruf die Daten des „Param“-Feldes als Array verschickt, der Python Aufruf als String.
Nun meine Fragen an euch:
Wie müssen die Daten des Param-Feldes genau übermittelt werden ? Als String oder als Array ? Wenn als String mit den eckigen Klammer oder ohne ? Ich habe diverse Beispiele gefunden, allerdings immer nur mit der Methode „IPS_RunScript“. Hat mir vielleicht jemand ein funktionierendes Beispiel mit „SetValue“ oder sieht wo ich mich vertan habe ?
Auf die Idee den JSON-RPC-Aufruf via dem Shell-Befehl CURL zu machen, kam ich natürlich auch schon. Nur habe ich mich da mit den doppelten und einfachen Hochkommas ziemlich vertan … Eleganter wäre es natürlich schon alles in einem Python-Script zu haben.
Danke und Gruss
Letraz