## Управление устройствами умного дома

---

### GET `/api/v1/devices/list`
Получить список устройств о которых знает сервер

### Пример ответа
```json
	{
		"status": "ok",
		"devices": [
			{
				"id": 12,
				"device": {
					"device_name": "Relay 1",
				  "device_type": "relay",
				  "firmware_version": "1.0.3",
				  "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9",
				  "device_ip": "192.168.1.13"
				},
				"alias": "alias_name_like_variable",
			  "name": "Реле помпы септика",
				"description": "Управляет помпой, должно периодически включаться и выключаться",
				"connection_state": "active", // active | lost
				"last_contact": "2025-07-28 18:35",
			},
			// ...
		]
	}
	```

---

### GET `/api/v1/devices/scanning/setup` AND GET `/api/v1/devices/scanning/all`
Поиск новых устройств в сети (setup) или всех устройств в сети

### Пример ответа
```json
	{
		"status": true,
		"devices": [
			{
				"device_name": "Relay 1",
			  "device_type": "relay",
			  "firmware_version": "1.0.3",
			  "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9",
			  "device_ip": "192.168.1.42"
			},
			// ...
		]
	}
	```

---

### POST `/api/v1/devices/setup/new-device`
Добавление нового устройства

### Пример запроса
```json
	{
		"device_ip": "192.168.1.43",
		"alias": "alias_name_like_variable", // Must be uniq
		"name": "Реле помпы септика",
		"description": "Управляет помпой, должно периодически включаться и выключаться"
	}
	```

### Пример ответа
```json
	{
		"status": true,
		"data": {
			"device": {
				"id": 12,
				"alias": "...",
				"device": {
					"device_name": "Relay 1",
				  "device_type": "relay",
				  "firmware_version": "1.0.3",
				  "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9",
				  "device_ip": "192.168.1.13"
				  // ...
				},
			  "name": "Реле помпы септика",
				"description": "Управляет помпой, должно периодически включаться и выключаться",
			}
		}
	}
	```

### Пример НЕ успешного ответа
```json
	{
		"status": false,
		"error_alias": "",
		"failed_fields": ["alias"], // alias | name | device_id
		"msg": "Alias already exists" // "Name can`t be empty" | "Device not found by IP"
	}
	```

---

### GET `/api/v1/devices/id/{{id}}/info`
Получить информацию по отдельному девайсу

### Пример ответа
```json
	{
		"status": true,
		"data": {
			"device": {
				"id": 12,
				"alias": "...",
				"state": "active", // active | freeze
				"device": {
					"device_name": "Relay 1",
				  "device_type": "relay",
				  "firmware_version": "1.0.3",
				  "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9",
				  "device_ip": "192.168.1.13"
				},
			  "name": "Реле помпы септика",
				"description": "Управляет помпой, должно периодически включаться и выключаться",
				"connection_state": "active", // active | lost
				"last_contact": "2025-07-28 18:35",
				"create_at": "2025-07-28 15:35"
			}
		}
	}
	```

### Пример НЕ успешного ответа
```json
	{
		"status": false,
		"error_alias": "...",
		"msg": "..."
	}
	```

---

### GET `/api/v1/devices/id/{{id}}`
Получить информацию по отдельному девайсу

### Пример ответа
```json
	{
		"status": true,
		"data": {
			"device": {
				"id": 12,
				"alias": "...",
				"device_type": "relay",
				"device_hard_id": "...",
				"device_mac": "...",
				"device_ip": "...",
				"firmware_version": "...",
			  "name": "Реле помпы септика",
			  "state": "active", // active | freeze
				"description": "Управляет помпой, должно периодически включаться и выключаться",
				"connection_state": "active", // active | lost
				"last_contact": "2025-07-28 18:35",
				"create_at": "2025-07-28 15:35"
			}
		}
	}
	```

### Пример НЕ успешного ответа
```json
	{
		"status": false,
		"error_alias": "...",
		"msg": "..."
	}
	```

---

### GET `/api/v1/devices/id/{{id}}/status` 
Получить отдельный девайс

### Пример ответа
```json
	{
		"status": true,
		"data": {
			"device": {
				"id": 12,
				"alias": "...",
				"device_response": {
					// ...
				}
			}
		}
	}
	```

---

### POST `/api/v1/devices/action`
Выполнить действие для отдельного девайса

### Пример запроса
```json
	{
		"device_id": 47,
		"action": "action_name",
		"params": {
			// ...
		}
	}
	```

### Пример успешного ответа
В ответе вернётся непосредственно ответ от устройства
```json
	{
		"status": true,
		"device": {
			"id": 12,
			"alias": "alias_name_like_variable",
			"device_response": {
				// ...
			}
		}
	}
	```

### Пример НЕ успешного ответа
```json
	{
		"status": false,
		"error_alias": "...",
		"msg": "Device does not support this action or params",
		"device_status": "error",
		"device_error": "...",
		"device_msg": "..."
	}
	```

---

### GET `/api/v1/devices/id/{{id}}/remove`
Забыть выбраный девайс. Сам девайс при этом будет ресетнуть. **Доступно лишь супер админу.**

### Пример успешного ответа
```json
	{
		"status": true
	}
	```

### Пример НЕ успешного ответа
```json
	{
		"status": false,
		"error_alias": "...",
		"device_msg": "...",
		"msg": "..."
	}
	```

---

### GET `/api/v1/devices/id/{{id}}/reboot`
Принудительно перезагрузить устройство. **Доступно лишь админу**

#### Пример успешного ответа
```json
	{
		"status": true
	}
	```

