Opennet Homematic

Aus Opennet
Wechseln zu: Navigation, Suche

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: api)
  • 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:

  1. Session.login (username password) - Anmeldung vornehmen, Session-ID erhalten
  2. Program.getAll (_session_id_) - Liste der Programme ausgeben; nach Programmnamen suchen, Programm-ID erhalten
  3. Program.execute (_session_id_ id) - gewünschtes Programm id ausführen
  4. 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:

  • Verschlusszustand der Tür prüfen und/oder nachts automatisch schließen? (Kann jeder Zeit von innen mechanisch geöffnet werden)
  • Ereignisprotokoll des Türschlosses aktivieren, ggf. Syslog-Export nach "monitor.on"
  • API-Zugriff per CCU Firewall schützen, Zugriff nur mit Authentifizierung erlauben

JSON Beispiele

  • Login:
! Request
! http POST <ccu>/api/homematic.cgi method=Session.login params:='{"username"\:"api","password"\:"XXX"}'
{
 "method": "Session.login",
 "id": 1,
 "params": {
   "username": "api",
   "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)
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Start
Opennet
Kommunikation
Karten
Werkzeuge