Symcon Zugriff JSON

  • Hallo zusammen,


    DoorPi läuft bei mir in der aktuellen Version. SIP, RFID und PiFace funktioniert alles. Leider bekomme ich
    keine direkt Verbindung zu IP-Symcon hin. Fehler lt. Log :


    Code
    1. [INFO] [requests.packages.urllib3.connectionpool] Starting new HTTP connection (1): 192.168.0.101
    2. 2016-03-20 11:57:52,775 [DEBUG] [requests.packages.urllib3.connectionpool] "POST /api/ HTTP/1.1" 200 58
    3. 2016-03-20 11:57:52,779 [ERROR] [doorpi.action.SingleActions.ipsrpc_setvalue] couldn't send IpsRpc ('instancemethod' object has no attribute '__getitem__')
    4. Traceback (most recent call last):
    5. File "/usr/local/lib/python2.7/dist-packages/doorpi/action/SingleActions/ipsrpc_setvalue.py", line 50, in ips_rpc_set_value
    6. if ips_rpc_check_variable_exists(key, config) is not True: raise Exception("var %s doesn't exist", key)
    7. File "/usr/local/lib/python2.7/dist-packages/doorpi/action/SingleActions/ipsrpc_setvalue.py", line 40, in ips_rpc_check_variable_exists
    8. return response.json['result']
    9. TypeError: 'instancemethod' object has no attribute '__getitem__'


    Die Variable existiert aber . Starte ich ein Script per DoorPi und setze innerhalb des Scripts die Variable kann ich die Variable setzen:


    Code
    1. curl -f -k https://192.168.0.101:3777/user/doorpi_start.php


    doorpi_start.php :

    PHP
    1. <?php
    2. SetValueBoolean(52706, True);
    3. ?>


    Den Umweg wollte ich aber halt nicht gehen. Getestet hab ich das mit IPS 3.4 und 4.0 mit gleichem Ergebnis.


    Vielleicht hat ja jemand eine Idee


    Gruss Thomas

  • Hallo Motom001,


    kannst du uns vielleicht helfen


    - Welches System nutzt Du ? RaspberryPi B mi Piface
    - Welches Betriebssystem nutzt Du? Jessie
    - Welche Version von DoorPi hast Du im Einsatz? 2.50
    - Was ist die angezeigte Fehlermeldung? s.o.
    - Was steht in der Log-Datei? s.o
    - Was wolltest Du erreichen? Variable nach IPS übergeben


    Danke !


    Andreas

  • Hallo zusammen,


    könnte jemand als Test mal folgende Änderungen in ipsrpc_setvalue.py machen:


    Änderungen in Zeile 40 und 45 !

  • Hallo zusammen,


    könnte jemand als Test mal folgende Änderungen in ipsrpc_setvalue.py machen:


    Änderungen in Zeile 40 und 45 !

    Hi ich habs gerade versucht, bei mir funktioniert es nicht und ich bekomm folgende Meldung im Log.
    Wobei bei mir noch nie funktionierte, was muss ich noch ändern damit es klappt?


    2016-09-17 20:46:01,618 [INFO] [urllib3.connectionpool] Starting new HTTP connection (1): 192.168.2.30
    2016-09-17 20:46:01,631 [ERROR] [doorpi.action.SingleActions.ipsrpc_setvalue] couldn't send IpsRpc ('instancemethod' object$
    Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/doorpi/action/SingleActions/ipsrpc_setvalue.py", line 50, in ips_rpc_set_value
    if ips_rpc_check_variable_exists(key, config) is not True: raise Exception("var %s doesn't exist", key)
    File "/usr/local/lib/python2.7/dist-packages/doorpi/action/SingleActions/ipsrpc_setvalue.py", line 40, in ips_rpc_check_variable_$
    return response.json['result']
    TypeError: 'instancemethod' object has no attribute '__getitem__'

  • so funktioniert es bei mir:


    JSON-RPC Schnittstelle (über cURL)
    Aufruf via Kommandozeile
    Variablen verändern
    Beim Benutzername mail%40provider.de oder Passwort darf @ nicht geschrieben werden. => Als Ersatz: %40
    Benutzername (Mail), Passwort und IP ohne <,> eintragen!
    //SetValue Integer mit den Parametern ID = 12345 und Wert = 42
    curl -i -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\": \"2.0\", \"id\": \"0\", \"method\": \"SetValue\", \"params\": [12345, 42]}" http://<mail%40provider.de>:<Passwort>@<IP>:3777/api/
    //SetValue Float mit den Parametern ID = 12346 und Wert = 1.23
    curl -i -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\": \"2.0\", \"id\": \"0\", \"method\": \"SetValue\", \"params\": [12346, 1.23]}" http://<mail%40provider.de>:<Passwort>@<IP>:3777/api/
    //SetValue Boolean mit den Parametern ID = 12347 und Wert = false
    curl -i -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\": \"2.0\", \"id\": \"0\", \"method\": \"SetValue\", \"params\": [12347, false]}" http://<mail%40provider.de>:<Passwort>@<IP>:3777/api/
    //SetValue String mit den Parametern ID = 12348 und Wert = "mein String"
    curl -i -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\": \"2.0\", \"id\": \"0\", \"method\": \"SetValue\", \"params\": [12348, \"mein String\"]}" http://<mail%40provider.de>:<Passwort>@<IP>:3777/api/
    //Rückgabewert bei Erfolg
    {"jsonrpc":"2.0","id":"0","result":true}
    Variablen auslesen
    //GetValue mit den Parametern ID = 12345
    curl -i -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\": \"2.0\", \"id\": \"0\", \"method\": \"GetValue\", \"params\": [12345]}" http://<mail%40provider.de>:<Passwort>@<IP>:3777/api/
    //Rückgabewert
    {"jsonrpc":"2.0","id":"0","result":42}


    in test.sh Datei, diese ausführbar machen und im doorpi mit on_execute aufrufen
    sudo chmod +x /usr/local/etc/DoorPi/conf/ips.sh


    EVENT_OnKeyPressed_onboardpins.11
    10 = call:**610#620
    20 = os_execute:/usr/local/etc/DoorPi/conf/ips.sh

  • Hi SchramIP,


    habe es jetzt hinbekommen ... allerdings mit dem Schönheitsfehler, dass die Config nicht mehr aus doorpi.ini gezogen wird!
    Ich habe einfach zu wenig Python-Erfahrung!


    Wäre cool, wenn motom001 mal drüberschauen könnte !

  • Morgen,


    ich habe gestern mein DoorPI Projekt wieder ausgepackt, nachdem es nun über ein halbes Jahr lang auf dem Schreibtisch lag.
    Das Echo-Problem habe ich nun in Griff, dazu werde ich aber in die entsprechenden Beiträge posten. (Am Rande, dem Polycom CX100 klappts)


    Ich versuch nun auch gerade, DoorPI an IP-Symcon anzubinden, erhalte gleiche Fehler wie ihr bzw. im IP-Symcon Forum
    Der Alternativweg mit dem Shell-Skript klappt zwar, aber den möchte auch ich nur als "Alternative Fallback" haben.


    Gibt es hier zu dem Thema schon neues?
    Wie auch bei den anderen, existieren bei mir die Variablen und können per direkten CURL Befehl gesetzt werden.
    Jedoch über die IpsRpc wird wohl die Variable nicht gefunden.

  • Mahlzeit inzwischen,


    da mir das Thema keine Ruhe lies, hab ich nun nach knapp 3h die Lösung, welche ich auch gleich in meinen Hautomatisierungsblog geschrieben habe:
    https://mytec-home.de/smart-ho…e-mit-ip-symcon-verbinden


    Die obigen Ansätze von DoorPI1 sind schon ganz hilfreich, wie er aber selbst schon erwähnte, wird in seiner Version die Konfiguration nicht eingelesen.
    Bzw. bei mir klappt diese Variante gar nicht.


    Zusammenfassend sind es 2 Fehler vom ursprünglichen Code:
    2x müssen die Returns von:

    Code
    1. return response.json['result']

    mit zwei Klammern versehen werden:

    Code
    1. return response.json()['result']


    Der Erste ist um Zeile 40 der Überprüft ob die Variable existiert. Der Zweite ist bei der Ermittlung des Typs in der nächsten Funktion


    Beim Typ ist dann noch eine Unstimmigkeit des JSON Inhalts, vermutlich hat sich hier der IP-Symcon Response etwas verändert:
    Von ursprünglich:

    Code
    1. return response.json()['result']['VariableValue']['ValueType']

    muss wie folgt geändert werden:

    Code
    1. return response.json()['result']['VariableType']

    Mit diesen 3 Änderungen klappts nun bei mir.


    Genaueres wie z.B. der Weg wie ich darauf kam ist im Blog geschrieben, auch kurz die Lösung zum vorherigen Echo Problem.


    Hoff es hilft jemanden.


    Schönen Sonntag noch.