Opennet Homematic
Aus Opennet
Version vom 16. März 2019, 20:47 Uhr von MathiasMahnke (Diskussion | Beiträge)
JSON-RPC
Komponenten: Homematic CCU3 Zentrale, Keymatic Türschloss (HM-Sec-Key); Stand 03/2019
JSON-RPC API: /api/homematic.cgi (via POST)
Verwendung zur Steuerung der Tür in der Frieda23. Erfahrungen bestehen auch im https://hacklabor.de (Danke für die Starthilfe).
Vorbereitung:
- Benutzer anlegen (hier: opennet)
- Programme anlegen (hier: door_open, door_close)
- door_open - Kanalzustand: HM-Sec-Key "bei Sperrung aktiv, nur prüfen", Kanalauswahl: HM-Sec-Key "sofort Schloss entriegelt"
- door_close - Kanalzustand: HM-Sec-Key "bei Sperrung inaktiv, nur prüfen", Kanalauswahl: HM-Sec-Key "sofort Schloss verriegelt"
Ablauf:
- Session.login (username password) - Anmeldung vornehmen, Session-ID erhalten
- Program.getAll (_session_id_) - Liste der Programme ausgeben; nach Programmnamen suchen, Programm-ID erhalten
- Program.execute (_session_id_ id) - gewünschtes Programm id ausführen
- Session.logout (_session_id_) - Abmeldung vornehmen, auch bei vorzeitigem Programmabbruch
Webinterface:
- Login, denkbar via Opennet CA Client Login oder Nutzername/Passwort auf jeweils Basis Apache
- Tür Öffnen, Ausführung nur mit Login
- Tür Schließen, auch ohne Login erlauben? (Aka, "der letzte der geht macht die Tür zu"?)
Sonstiges:
- Welche Softwareumgebung soll zum Einsatz kommen? Typisch wäre Bash, PHP, Python und HTML? (SN nutzt PHP-GuzzleHttpClient als Backend und Postman)
- Verschlusszustand der Tür prüfen und/oder nachts automatisch schließen? (Kann jeder Zeit von innen mechanisch geöffnet werden)
- Hosting in der Frieda23 um lokalen Zugriff sicher zu stellen?
JSON Beispiele
- Login:
! Request ! http POST <ccu>/api/homematic.cgi method=Session.login params:='{"username"\:"opennet","password"\:"XXX"}' { "method": "Session.login", "id": 1, "params": { "username": "opennet", "password": "XXX" } } ! Response HTTP/1.1 200 OK CONTENT-TYPE: application/json; charset=utf-8 Content-Length: 63 Date: ... Server: lighttpd/1.4.50 { "error": null, "id": 1, "result": "abcd123xyz", "version": "1.1" }
- Program-List
! Request ! http POST <ccu>/api/homematic.cgi method=Program.getAll params:='{"_session_id_"\:"abcd123xyz"}' { "method": "Program.getAll", "id": 2, "params": { "_session_id_": "abcd123xyz" } } ! Response HTTP/1.1 200 OK .. { "error": null, "id": 2, "result": [ { "id": "1234", "isActive": true, "isInternal": false, "lastExecuteTime": "2019-03-15 07:39:07", "name": "door_close" }, { "id": "5678", "isActive": true, "isInternal": false, "lastExecuteTime": "1970-01-01 01:00:00", "name": "door_open" } ], "version": "1.1" }
- Program-Info (zur Info, nicht notwendig)
! Request { "method": "Program.get", "id": 3, "params": { "_session_id_": "abcd123xyz", "id": "1234" } } ! Response (CCU Firmware v3.43.15 -> invalides JSON, abschließendes Komma zu viel! Hier mit Korrektur) HTTP/1.1 200 OK ... { "id": 3, "version": "1.1", "result": { "id": "1234", "name": "door_close", "isActive": true, "isInternal": false, "lastExecuteTime": "2019-03-15 07:39:07" }, "error": null }
- Program-Excecute
! Request { "method": "Program.execute", "id": 3, "params": { "_session_id_": "abcd123xyz", "id": "1234" } } ! Result HTTP/1.1 200 OK ... { "error": null, "id": 3, "result": true, "version": "1.1" }
- Logout
! Request ! http POST <ccu>/api/homematic.cgi method=Session.logout params:='{"_session_id_"\:"abcd123xyz"}' { "method": "Session.logout", "id": 4, "params": { "_session_id_": "abcd123xyz" } } ! Response HTTP/1.1 200 OK ... { "error": null, "id": 4, "result": true, "version": "1.1" }
Software in Bash
- Ohne Debugging
$ ./homematic.sh --close-door Action CLOSE DOOR Login... done (Session ID Ajx32AXDwx) Find program... done (Program ID 1682) Run program... done (Status true) Logout... done (Status true)
- Mit Debugging
$ ./homematic.sh --close-close Debugging = true Action CLOSE DOOR Login... Response: {"version": "1.1","result": "Ba7sY0iz1S","error": null} - done (Session ID Ba7sY0iz1S) Find program... Response: {"version": "1.1","result": [{"id":"1682","name":"door_close","isActive":true,"isInternal":false, \ "lastExecuteTime":"2019-03-16 19:36:17"},{"id":"1727","name":"door_open","isActive":true,"isInternal":false, \ "lastExecuteTime":"2019-03-16 19:36:09"}],"error": null} - done (Program ID 1682) Run program... Response: {"version": "1.1","result": true,"error": null} - done (Status true) Logout... Response: {"version": "1.1","result": true,"error": null} - done (Status true)