G
gerrieg
- Dabei seit
- 24.07.2016
- Beiträge
- 12
- Likes
- 0
Habe mich mit der Gardena Smart Sytem IOS App ein wenig beschäftigt und herausgefunden, wie die Kommunikation grundsätzlich funktioniert. Der Datenaustausch erfolgt mittels JSON.
Die root URL ist: https://sg-api.dss.husqvarnagroup.net/sg-1
Man kann auch unter OSX mit Safari die Applikation aufrufen: https://sg-api.dss.husqvarnagroup.net/sg-1/index/ios/
In den Beispielen habe ich meine ID's zur Sicherheit verändert.
1.) Login
Man muss user/passwort and eine URL schicken und bekommt eine user_id und einen Token zurück. Die user_id ist für die jeweilige user/passwort Kombination immer gleich, der Token ändert sich immer. Ist also eine SessionId.
URL:
Request Header:
POST Request:
Beispiel:
Response:
Den Token muss man jetzt immer in den Folgerequests als HTTP Header 'X-Session' mitsenden.
2.) Locations
Für die weiteren Requests benötigt man eine locations_id, diese bekommt man mit der user_id. Die location_id ist ebenfalls für die jeweilige user/passwort Kombination immer gleich
URL:
Request Header:
Beispiel:
Response:
3.) Devices
Mit der locations_id bekommt man dann alle Infos zu den Geräten
URL:
Request Header:
Beispiel:
Response:
4.) Befehle senden
Man braucht die deviceId und die locationId
URL:
Request Header:
POST Request:
Beispiel:
Die root URL ist: https://sg-api.dss.husqvarnagroup.net/sg-1
Man kann auch unter OSX mit Safari die Applikation aufrufen: https://sg-api.dss.husqvarnagroup.net/sg-1/index/ios/
In den Beispielen habe ich meine ID's zur Sicherheit verändert.
1.) Login
Man muss user/passwort and eine URL schicken und bekommt eine user_id und einen Token zurück. Die user_id ist für die jeweilige user/passwort Kombination immer gleich, der Token ändert sich immer. Ist also eine SessionId.
URL:
Code:
https://sg-api.dss.husqvarnagroup.net/sg-1/sessions
Request Header:
Code:
Content-Type:application/json
POST Request:
Code:
{
"sessions": {
"email": "[email protected]",
"password": "PASSWORT"
}
}
Beispiel:
Code:
curl --data '{"sessions":{"email":"[email protected]","password":"PASSWORT"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions
Response:
Code:
{
"sessions": {
"token": "7867e26c-05eb-4a60-bf30-7c3a1b4480aa",
"user_id": "196ab891-a521-872c-ab1d-1685d1e77afc"
}
}
Den Token muss man jetzt immer in den Folgerequests als HTTP Header 'X-Session' mitsenden.
2.) Locations
Für die weiteren Requests benötigt man eine locations_id, diese bekommt man mit der user_id. Die location_id ist ebenfalls für die jeweilige user/passwort Kombination immer gleich
URL:
Code:
https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=196ab891-a521-872c-ab1d-1685d1e77afc
Request Header:
Code:
Content-Type:application/json
X-Session: 7867e26c-05eb-4a60-bf30-7c3a1b4480aa
Beispiel:
Code:
curl --header "Content-Type:application/json" --header "X-Session:b38f9351-ccb7-40ea-8f2f-0bbf86ee5330" https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=196ab891-a521-872c-ab1d-1685d1e77afc
Response:
Code:
{
"locations": [{
'id': '1c8b301f-22c8-423d-1b4d-ec25315d1377',
'name': 'My Garden',
'devices': ['75cfc1f8-a20c-51d6-c5ea-1b5ecdde80c1', 'e3c1b615-7351-25fc-a551-1908254a2b3e']
}]
}
3.) Devices
Mit der locations_id bekommt man dann alle Infos zu den Geräten
URL:
Code:
https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377
Request Header:
Code:
Content-Type:application/json
X-Session: 7867e26c-05eb-4a60-bf30-7c3a1b4480aa
Beispiel:
Code:
curl --header "Content-Type:application/json" --header "X-Session:b38f9351-ccb7-40ea-8f2f-0bbf86ee5330" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377
Response:
Code:
{
"devices": [{
'id': '75cfc1f8-a20c-51d6-c5ea-1b5ecdde80c1',
'name': 'Gardena Zentrale',
'description': 'Gateway device',
'category': 'gateway',
'configuration_synchronized': true,
'abilities': [{
'id': 'f9667bc2-b5e2-11e5-b6a5-32212aec0665',
'name': 'device_info',
'type': 'device_info',
'properties': [{
'id': 'f9667bc2-b5e2-11e5-b6a5-100000000000',
'name': 'manufacturer',
'value': 'Seluxit',
'writeable': false,
'supported_values': []
}, {
"id": "f9667bc2-b5e2-11e5-b6a5-100000000001",
"name": "product",
"value": "1-GATEWAY",
"writeable": false,
"supported_values": []
}, {
"id": "f9667bc2-b5e2-11e5-b6a5-100000000002",
"name": "serial_number",
"value": "N/A",
"writeable": false,
"supported_values": []
}, {
"id": "f9667bc2-b5e2-11e5-b6a5-100000000003",
"name": "sgtin",
"value": "N/A",
"writeable": false,
"supported_values": []
}, {
"id": "f9667bc2-b5e2-11e5-b6a5-100000000004",
"name": "version",
"value": "1.2.1",
"writeable": false,
"supported_values": []
}, {
"id": "f9667bc2-b5e2-11e5-b6a5-100000000005",
"name": "category",
"value": "gateway",
"writeable": false,
"supported_values": []
}, {
"id": "f9667bc2-b5e2-11e5-b6a5-100000000006",
"name": "last_time_online",
"value": "N/A",
"writeable": false,
"supported_values": []
}]
}, {
"id": "b74cbb14-b5e4-11e5-86c5-32212aec0665",
"name": "gateway",
"type": "gateway",
"properties": [{
'id': 'b74cbb14-b5e4-11e5-86c5-100000000000',
'name': 'ip_address',
'value': '192.168.1.217',
'writeable': false,
'supported_values': []
}, {
"id": "b74cbb14-b5e4-11e5-86c5-100000000001",
"name": "time_zone",
"value": " Europe/Vienna (CEST, +0200)",
"writeable": false,
"supported_values": []
}]
}],
"scheduled_events": [],
"status_report_history": [],
"constraints": []
}, {
"id": "e3c1b615-7351-25fc-a551-1908254a2b3e",
"name": "Rosi",
"category": "mower",
"configuration_synchronized": true,
"abilities": [{
'id': '8df62358-071c-42e0-b7e2-47ba5bce8e79',
'name': 'device_info',
'type': 'device_info',
'properties': [{
'id': '7b2af5e2-cd45-4e59-b131-4585cbf7e58a',
'name': 'manufacturer',
'value': 'Gardena',
'writeable': false,
'supported_values': []
}, {
"id": "4acce2d8-e395-4ea3-9f6e-fc606fefae31",
"name": "product",
"value": "3-DEVICE",
"writeable": false,
"supported_values": []
}, {
"id": "83df149b-3509-446a-9f8c-4d1dc71b8a7a",
"name": "serial_number",
"value": "00008438",
"writeable": false,
"supported_values": []
}, {
"id": "307de2bd-fef1-43d8-b77a-e590a059a5c4",
"name": "version",
"value": "3-2.4.7-1.2.0-4380-MODIFIED-ICD1.16_1.2.0",
"writeable": false,
"supported_values": []
}, {
"id": "1900a86b-661c-47d2-9f42-f66585f8da82",
"name": "category",
"value": "mower",
"writeable": false,
"supported_values": []
}, {
"id": "c5693fc4-0cb2-4997-ba51-b32732cd41d0",
"name": "last_time_online",
"value": "2016-07-21T13:28:48Z",
"writeable": false,
"supported_values": []
}, {
"id": "e1e2e3c2-a424-415a-85bd-212a7ab49fd0",
"name": "sgtin",
"value": "3034F8EE90060080000020F6",
"writeable": false,
"supported_values": []
}]
}, {
"id": "c9147b85-c3eb-41e7-863c-bb24694e586a",
"name": "battery",
"type": "battery_power",
"properties": [{
'id': 'c6f3ad1f-ced9-49f1-8710-268b74b007a8',
'name': 'level',
'value': 100,
'timestamp': '2016-07-21T13:28:16Z',
'unit': '%',
'writeable': false,
'supported_values': []
}, {
"id": "78286acb-3ed1-48c3-bd92-2cacc348f5c1",
"name": "rechargable_battery_status",
"value": "ok",
"timestamp": "2016-07-21T13:28:16Z",
"writeable": false,
"supported_values": ['weak', 'ok', 'undefined']
}, {
"id": "c168f578-a1c6-408a-a132-7124b92ffba5",
"name": "charging",
"value": false,
"timestamp": "2016-07-21T13:28:16Z",
"writeable": false,
"supported_values": ['true', 'false']
}]
}, {
"id": "c924fe09-5a62-4334-a3c2-6c6e8348707c",
"name": "radio",
"type": "radio_link",
"properties": [{
'id': '24bfae0d-a42c-40b3-b19f-a8a704502bbe',
'name': 'quality',
'value': 50,
'timestamp': '2016-07-21T13:28:48Z',
'unit': '%',
'writeable': false,
'supported_values': []
}, {
"id": "a5bc1236-0a55-4cf0-90a4-bbe6cf4aef0d",
"name": "connection_status",
"value": "status_device_unreachable",
"timestamp": "2016-07-21T16:07:13.013366Z",
"writeable": false,
"supported_values": ['unknown', 'status_device_unreachable', 'status_device_alive']
}, {
"id": "fec78e5e-6b5a-4e56-b3a2-3b08322878bd",
"name": "state",
"value": "good",
"timestamp": "2016-07-21T13:28:48Z",
"writeable": false,
"supported_values": ['poor', 'good', 'excellent', 'undefined']
}]
}, {
"id": "1d6a1a0a-aa13-4057-892d-59522d5a719c",
"name": "mower",
"type": "robotic_mower",
"properties": [{
'id': 'ecd040e6-f5d4-4517-a2dd-1948616caf3d',
'name': 'manual_operation',
'value': false,
'timestamp': '2016-07-21T13:28:14Z',
'writeable': false,
'supported_values': []
}, {
"id": "c1c48c80-589a-4b2e-a73d-0485f4d2a22f",
"name": "status",
"value": "off_disabled",
"timestamp": "2016-07-21T13:28:17Z",
"writeable": false,
"supported_values": ['paused', 'ok_cutting', 'ok_searching', 'ok_charging', 'ok_leaving', 'wait_updating', 'wait_power_up', 'parked_timer', 'parked_park_selected', 'off_disabled', 'off_hatch_open', 'unknown', 'error', 'error_at_power_up', 'off_hatch_closed', 'ok_cutting_timer_overridden', 'parked_autotimer', 'parked_daily_limit_reached', 'undefined']
}, {
"id": "594b6456-57a4-47e4-8736-0a392c87856b",
"name": "source_for_next_start",
"value": "week_timer",
"timestamp": "2016-07-21T13:28:16Z",
"writeable": false,
"supported_values": ['no_source', 'completed_cutting_daily_limit', 'week_timer', 'countdown_timer', 'mower_charging', 'completed_cutting_autotimer', 'undefined']
}, {
"id": "dbace91b-b24c-499d-ac69-0fd088af47db",
"name": "timestamp_next_start",
"value": "2016-07-22T08:00:00.000000001Z",
"timestamp": "2016-07-21T13:28:16Z",
"writeable": false,
"supported_values": []
}, {
"id": "0e12f167-afb7-4303-914b-e14dfb364026",
"name": "override_end_time",
"value": "1970-01-01T00:00:00.000000001Z",
"timestamp": "2016-07-21T13:28:14Z",
"writeable": false,
"supported_values": []
}]
}, {
"id": "db40b97e-6ded-43ac-ba53-211acc504404",
"name": "internal_temperature",
"type": "internal_temperature_sensor",
"properties": [{
'id': 'ba006658-9762-49c7-ba80-fee5a51600a2',
'name': 'temperature',
'value': 32,
'timestamp': '2016-07-21T13:28:48Z',
'unit': 'C',
'writeable': false,
'supported_values': []
}]
}],
"scheduled_events": [{
'type': 'active',
'start_at': '08:00',
'end_at': '13:00',
'weekday': 'monday',
'recurrence': {
'type': 'weekly',
'weekdays': ['monday']
},
"id": "6bb76641-b091-4f9f-9113-0070adbd88db"
}, {
"type": "active",
"start_at": "08:00",
"end_at": "13:00",
"weekday": "wednesday",
"recurrence": {
"type": "weekly",
"weekdays": ['wednesday']
},
"id": "96bbfb82-9e7c-4f19-a23f-e109a8cb63e7"
}, {
"type": "active",
"start_at": "08:00",
"end_at": "13:00",
"weekday": "thursday",
"recurrence": {
"type": "weekly",
"weekdays": ['thursday']
},
"id": "a891ee16-0454-4a2b-81a0-47ad6b252f2f"
}, {
"type": "active",
"start_at": "08:00",
"end_at": "13:00",
"weekday": "friday",
"recurrence": {
"type": "weekly",
"weekdays": ['friday']
},
"id": "c442a34e-263a-431c-8acd-7c5feae0e8b9"
}, {
"type": "active",
"start_at": "08:00",
"end_at": "13:00",
"weekday": "tuesday",
"recurrence": {
"type": "weekly",
"weekdays": ['tuesday']
},
"id": "658314ef-6e8b-47f3-8181-5f93a3da3ab2"
}],
"status_report_history": [{
'level': 'warning',
'timestamp': '2016-07-21T16:07:13.013366Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'info',
'timestamp': '2016-07-21T07:30:26.680042Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_ALIVE',
'raw_message': 'STATUS_DEVICE_ALIVE'
}, {
'level': 'warning',
'timestamp': '2016-07-21T07:30:26.386842Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'info',
'timestamp': '2016-07-19T10:17:04.157147Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_ALIVE',
'raw_message': 'STATUS_DEVICE_ALIVE'
}, {
'level': 'warning',
'timestamp': '2016-07-19T10:17:03.862574Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T14:07:13.304845Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T13:07:13.287341Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T12:07:13.302420Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T11:07:13.307148Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T10:07:13.149764Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T09:07:13.160917Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T08:07:13.163727Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T07:07:13.136201Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T06:07:13.155918Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T05:07:13.162761Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T04:07:13.142187Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T03:07:13.143340Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T02:07:13.166782Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T01:07:13.172921Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-18T00:07:13.155377Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T23:07:13.162577Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T22:07:13.173293Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T21:07:13.157209Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T20:07:13.168704Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T19:07:13.178978Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T18:07:13.158740Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T17:07:13.172268Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T14:07:13.170698Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T13:07:13.176930Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}, {
'level': 'warning',
'timestamp': '2016-07-17T12:07:13.182954Z',
'source': 'gateway',
'message': 'STATUS_DEVICE_UNREACHABLE',
'raw_message': 'STATUS_DEVICE_UNREACHABLE'
}],
"constraints": [{
'resource_name': 'scheduled_events',
'values': [{
'name': 'events_week_max',
'value': 14,
'unit': ''
}, {
'name': 'events_day_max',
'value': 2,
'unit': ''
}, {
'name': 'recurrence_weekdays_max',
'value': 1,
'unit': ''
}]
}]
}]
}
4.) Befehle senden
Man braucht die deviceId und die locationId
URL:
Code:
https://sg-api.dss.husqvarnagroup.net/sg-1/devices/e3c1b615-7351-25fc-a551-1908254a2b3e/abilities/mower/command?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377
Request Header:
Code:
Content-Type:application/json
X-Session: 7867e26c-05eb-4a60-bf30-7c3a1b4480aa
POST Request:
Code:
# Parken bis zum nächsten Zeitplan
{
"name": "park_until_next_timer"
}
# Parken und Zeitplan pausieren
{
"name": "park_until_further_notice"
}
# Starten und Zeitpläne fortsetzen
{
"name": "start_resume_schedule"
}
# 24 Stunden lang mähen
{
"name": "start_override_timer",
"parameters": {
"duration": 1440
}
}
# 3 Tage mähen
{
"name": "start_override_timer",
"parameters": {
"duration": 4320
}
}
Beispiel:
Code:
curl --data '{"name":"start_resume_schedule"}' --header "Content-Type:application/json" --header "X-Session:7867e26c-05eb-4a60-bf30-7c3a1b4480aa" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/e3c1b615-7351-25fc-a551-1908254a2b3e/abilities/mower/command?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377