# Пролог Yandex api немного запутоно. Использование формата json логично для api, но не когда вы работайте на c. И даже так, видно что разработчики пытались сделать api ответы, а именно все девайсы и группы с комнатами максемально не избыточным. И это накладовает некоторые проблемы. Устройство может как и явно говорить включенно оно или нет (True/False), так и не иметь явного стстуса (None). Или например лампочки имеют цвет, и когда они белые мы явно можем задать температуру цвета в келвенах, но когда кампочка имеет другой цвет, то тут только `hsv` или если лампа воспроизводит какуето анимированую палитру, то # Возможности ## Взаимодействие 1. Включить/выключить устройство. ✅ 2. Изменить яркость. ✅ 3. Изменить канделы. ✅ 4. Изменить цвет. ✅ 5. Изменить цветовой профиль/сценарий. ❌ ## Получить данные 1. Имя. ✅ 2. Псевдонимы. ❌ 3. Работает ли. ✅ 4. Яркость. ✅ 5. Минимальная яркостью ✅ 6. Максимальная яркость. ✅ 7. Сила канделы. ✅ 8. Максимальные канделы. ✅ 9. Минимальные канделы. ✅ 10. Поддерживает цвета ? ✅ 11. Какой цвет сейчас. ✅ 12. Поддерживает ли профиль/сценарий. ❌ 13. Какие есть профили/сценарии. ❌ 14. Список групп и устройств в них. ✅ ## Архитектурные реализации. 1. Очистка памяти. ❔ 2. Асинхронность. ❌ # API Так мы получаем структуру нашего API ```c struct ya_api api = ya_api_create("Authorization: TOKEN"); ``` Это даст тебе список девайсов, сейчас у тебя их нет! ```c api.list_devices(&api); ``` Это пример как ты можешь получить имя всех девайсов. ```c for (int i = 0; i != api.data.devs->len; i++){ printf("%s\n", api.data.devs->dev[i]->name); } ``` Вы также можете относительно удобно отправить любой API запрос через ```c ya_api_recvest("https://api.iot.yandex.net/v1.0/user/info", NULL, api.data.tocen) ``` Данная процедура вернёт реквест. Третим пораметром вы можете передать ваш хэдерс, обычно это JSON. Так вы можете сключать и выключать устройство: ```c api.on_off(api.data.devs->dev[6]); ``` Вы можете это делать с группой, использовав данную конструкцию: ```c for (int i = 0; i != api.data.groups->len; i++){ printf("ГРУППА: %s\n", api.data.groups->group[i]->name); for (int a = 0; a != api.data.groups->group[i]->devs->len; a++){ struct ya_dev_struct *dev = api.data.groups->group[i]->devs->dev[a]; printf("\tДЕВAЙС: %s\n", dev->name); api.on_off(dev); } } ``` Также вы можете менять температуру, яркость и свет: ```c api.kelvin(dev, 6500); ``` Изменить свет модно данной командой ```c api.hsv(dev, 284,93,80); ``` Получить цвет можно данным условием: ```c struct color_struct *color = dev->capabilities->color_setting->color; printf("HSV = %i %i %i\n", color->h, color->s, color->v); ``` если ваше устройство сейчас не отоброжает цвеоной цвет, например включён сценарий или цвет задан в кельвинах, то вы получити такой ответ: ```c HSV = -1 -1 -1 ``` Узнать, какой именно тип цвета сейчас работает можно спомошью данной функции, где 1 это kelvin, 2 это color, 3 это сценарий. Вы также захотите понять, что это за устройство, вы можете сделать это так: ```c printf("\tДЕВAЙС %s: %s\n", dev->type, dev->name); ``` Вы получити такой ответ: ```json ДЕВЫЙС devices.types.light: Люстра ``` Наверное вы бы это претпочли получать как то иначе, но как по мне, так болие уневерсально, хоть вам и придётся менять свой код если Яндекс захочет изменить это. ```json { "name": "Люстра", "room": "78dfb6d2-2183-439c-8fbe-c7a101b5ef02", "groups": [ "afedc785-dd02-46e6-a347-458a7121da49" ], "capabilities": [ { "parameters": { "random_access": true, "instance": "brightness", "unit": "unit.percent", "looped": false, "range": { "min": 1, "max": 100, "precision": 1 } }, "state": { "value": 100, "instance": "brightness" }, "last_updated": 1722379725.960000, "reportable": true, "type": "devices.capabilities.range", "retrievable": true }, { "parameters": { "color_scene": { "scenes": [ { "id": "alice" }, { "id": "party" }, { "id": "jungle" }, { "id": "neon" }, { "id": "night" }, { "id": "ocean" }, { "id": "romance" }, { "id": "candle" }, { "id": "siren" }, { "id": "alarm" }, { "id": "fantasy" }, { "id": "reading" } ] }, "color_model": "hsv", "temperature_k": { "min": 1500, "max": 6500 } }, "state": { "value": { "v": 100, "s": 96, "h": 135 }, "instance": "hsv" }, "last_updated": 1722379725.960000, "reportable": true, "type": "devices.capabilities.color_setting", "retrievable": true }, { "parameters": { "split": false }, "state": { "value": true, "instance": "on" }, "last_updated": 1722378636.990000, "reportable": true, "type": "devices.capabilities.on_off", "retrievable": true } ], "id": "0a924ae6-b9d7-4d17-a836-ef280c771b3b", "external_id": "47408080381f8d56fdfc", "type": "devices.types.light", "skill_id": "T", "household_id": "8deb9854-5790-4036-bde3-ba7ad355624c" }, ``` ```json "color_model": "hsv", "temperature_k": { "min": 1500, "max": 6500 } }, "state": { "value": { "v": 100, "s": 96, "h": 135 }, "instance": "hsv" }, "last_updated": 1722379725.960000, "reportable": true, "type": "devices.capabilities.color_setting", "retrievable": true }, { "parameters": { "split": false }, "state": { "value": true, "instance": "on" }, "last_updated": 1722378636.990000, "reportable": true, "type": "devices.capabilities.on_off", "retrievable": true } ////////// "color_model": "hsv", "temperature_k": { "min": 1500, "max": 6500 } }, "state": { "value": 4500, "instance": "temperature_k" }, "last_updated": 1722379815.697000, "reportable": true, "type": "devices.capabilities.color_setting", "retrievable": true }, { "parameters": { "split": false }, "state": { "value": true, "instance": "on" }, "last_updated": 1722378637.454000, "reportable": true, "type": "devices.capabilities.on_off", "retrievable": true } ///////////// "color_model": "hsv", "temperature_k": { "min": 1500, "max": 6500 } }, "state": { "value": "neon", "instance": "scene" }, "last_updated": 1722380508.054000, "reportable": true, "type": "devices.capabilities.color_setting", "retrievable": true }, { "parameters": { "split": false }, "state": { "value": true, "instance": "on" }, "last_updated": 1722378636.990000, "reportable": true, "type": "devices.capabilities.on_off", "retrievable": true } ``` ```mermaid graph LR A[api] -->B1(data) B1 -->Bs2(tocen) B1 -->B2(devs) B2 --> C(["dev[int]"]) B2 --> C1[len] C --> D1[id] C --> D2[name] C --> D4[room] C --> D5[type] C --> CI1[capabilities] CI1 --> CI1F[color_setting] CI1F --> CI1F4[color_target] CI1F --> CI1F1[color] CI1F1 --> CI1F1A1[v] CI1F1 --> CI1F1A2[s] CI1F1 --> CI1F1A3[h] CI1F --> CI1F2[temperature_k] CI1F2 --> CI1F2H1[value] CI1F2 --> CI1F2H2[min] CI1F2 --> CI1F2H3[max] CI1F --> CI1F3[scenes] CI1F3 --> CI1F3A(["scenes[int]"]) CI1 --> CI2F[on_off] CI2F --> CI2F1[value] CI1 --> CI3F[range] CI3F --> CI3F1[value] CI3F --> CI3F2[min] CI3F --> CI3F3[max] C --> D3((groups)) ``` --- ```mermaid graph LR A[api] -->B1(data) B1 -->Bs2(tocen) B1 -->B2(devs) B2 --> C(["dev[int]"]) B2 --> C1[len] C --> D1[id] C --> D2[name] C --> D4[room] C --> D5[type] C --> CI1[capabilities] CI1 --> CI1F[color_setting] CI1F --> CI1F1[color] CI1F --> CI1F2[temperature_k] CI1F2 --> CI1F2H1[value] CI1F2 --> CI1F2H2[min] CI1F2 --> CI1F2H3[max] CI1F --> CI1F3[scenes] CI1 --> CI2F[on_off] CI2F --> CI2F1[value] CI1 --> CI3F[range] CI3F --> CI3F1[value] CI3F --> CI3F2[min] CI3F --> CI3F3[max] C --> D3((groups)) ``` ```mermaid graph LR A[Hard edge] -->B(Round edge) B --> C{Decision} C -->|One| D[Result one] C -->|Two| E[Result two] ``` ```mermaid %% Example with selection of syntaxes gantt dateFormat YYYY-MM-DD title Adding GANTT diagram functionality to mermaid section A section Completed task :done, des1, 2014-01-06,2014-01-08 Active task :active, des2, 2014-01-09, 3d Future task : des3, after des2, 5d Future task2 : des4, after des3, 5d section Critical tasks Completed task in the critical line :crit, done, 2014-01-06,24h Implement parser and jison :crit, done, after des1, 2d Create tests for parser :crit, active, 3d Future task in critical line :crit, 5d Create tests for renderer :2d Add to mermaid :1d section Documentation Describe gantt syntax :active, a1, after des1, 3d Add gantt diagram to demo page :after a1 , 20h Add another diagram to demo page :doc1, after a1 , 48h section Last section Describe gantt syntax :after doc1, 3d Add gantt diagram to demo page : 20h Add another diagram to demo page : 48h ``` ```mermaid classDiagram Animal <|-- Duck Animal <|-- Fish Animal <|-- Zebra Animal : +int age Animal : +String gender Animal: +isMammal() Animal: +mate() class Duck{ +String beakColor +swim() +quack() } class Fish{ -int sizeInFeet -canEat() } class Zebra{ +bool is_wild +run() } ``` ```mermaid stateDiagram [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*] ``` ```mermaid pie title Pie Chart "Dogs" : 386 "Cats" : 85 "Rats" : 150 ``` ```mermaid requirementDiagram requirement test_req { id: 1 text: the test text. risk: high verifymethod: test } element test_entity { type: simulation } test_entity - satisfies -> test_req ```