Сделал yandex_smart_home_api на С
This commit is contained in:
commit
054540b4de
19 changed files with 6800 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
build/
|
||||||
|
*~
|
||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "curl"]
|
||||||
|
path = curl
|
||||||
|
url = https://git.systemconnection.ru/romenskiy2012/curl.git
|
||||||
41
.kdev4/yandex_smart_home_api_C.kdev4
Normal file
41
.kdev4/yandex_smart_home_api_C.kdev4
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
[Buildset]
|
||||||
|
BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00.\x00y\x00a\x00n\x00d\x00e\x00x\x00_\x00s\x00m\x00a\x00r\x00t\x00_\x00h\x00o\x00m\x00e\x00_\x00a\x00p\x00i\x00_\x00C)
|
||||||
|
|
||||||
|
[CMake]
|
||||||
|
Build Directory Count=1
|
||||||
|
Current Build Directory Index-Основная система=0
|
||||||
|
|
||||||
|
[CMake][CMake Build Directory 0]
|
||||||
|
Build Directory Path=/home/romenskiy2012/projects/yandex_smart_home_api_C/build
|
||||||
|
Build Type=Debug
|
||||||
|
CMake Binary=/usr/bin/cmake
|
||||||
|
CMake Executable=/usr/bin/cmake
|
||||||
|
Environment Profile=
|
||||||
|
Extra Arguments=
|
||||||
|
Install Directory=/usr/local
|
||||||
|
Runtime=Основная система
|
||||||
|
|
||||||
|
[Launch]
|
||||||
|
Launch Configurations=Launch Configuration 0
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0]
|
||||||
|
Configured Launch Modes=execute
|
||||||
|
Configured Launchers=nativeAppLauncher
|
||||||
|
Name=Новая конфигурация «Компилируемая программа»
|
||||||
|
Type=Native Application
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0][Data]
|
||||||
|
Arguments=
|
||||||
|
Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00)
|
||||||
|
Dependency Action=Nothing
|
||||||
|
EnvironmentGroup=
|
||||||
|
Executable=file:///home/romenskiy2012/projects/yandex_smart_home_api_C
|
||||||
|
External Terminal=konsole --noclose --workdir %workdir -e %exe
|
||||||
|
Kill Before Executing Again=4194304
|
||||||
|
Project Target=yandex_smart_home_api_C,yandex_smart_home_api_c
|
||||||
|
Use External Terminal=false
|
||||||
|
Working Directory=
|
||||||
|
isExecutable=false
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
VersionControlSupport=
|
||||||
1
.obsidian/app.json
vendored
Normal file
1
.obsidian/app.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
1
.obsidian/appearance.json
vendored
Normal file
1
.obsidian/appearance.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
30
.obsidian/core-plugins-migration.json
vendored
Normal file
30
.obsidian/core-plugins-migration.json
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
"file-explorer": true,
|
||||||
|
"global-search": true,
|
||||||
|
"switcher": true,
|
||||||
|
"graph": true,
|
||||||
|
"backlink": true,
|
||||||
|
"canvas": true,
|
||||||
|
"outgoing-link": true,
|
||||||
|
"tag-pane": true,
|
||||||
|
"properties": false,
|
||||||
|
"page-preview": true,
|
||||||
|
"daily-notes": true,
|
||||||
|
"templates": true,
|
||||||
|
"note-composer": true,
|
||||||
|
"command-palette": true,
|
||||||
|
"slash-command": false,
|
||||||
|
"editor-status": true,
|
||||||
|
"bookmarks": true,
|
||||||
|
"markdown-importer": false,
|
||||||
|
"zk-prefixer": false,
|
||||||
|
"random-note": false,
|
||||||
|
"outline": true,
|
||||||
|
"word-count": true,
|
||||||
|
"slides": false,
|
||||||
|
"audio-recorder": false,
|
||||||
|
"workspaces": false,
|
||||||
|
"file-recovery": true,
|
||||||
|
"publish": false,
|
||||||
|
"sync": false
|
||||||
|
}
|
||||||
20
.obsidian/core-plugins.json
vendored
Normal file
20
.obsidian/core-plugins.json
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
[
|
||||||
|
"file-explorer",
|
||||||
|
"global-search",
|
||||||
|
"switcher",
|
||||||
|
"graph",
|
||||||
|
"backlink",
|
||||||
|
"canvas",
|
||||||
|
"outgoing-link",
|
||||||
|
"tag-pane",
|
||||||
|
"page-preview",
|
||||||
|
"daily-notes",
|
||||||
|
"templates",
|
||||||
|
"note-composer",
|
||||||
|
"command-palette",
|
||||||
|
"editor-status",
|
||||||
|
"bookmarks",
|
||||||
|
"outline",
|
||||||
|
"word-count",
|
||||||
|
"file-recovery"
|
||||||
|
]
|
||||||
163
.obsidian/workspace.json
vendored
Normal file
163
.obsidian/workspace.json
vendored
Normal file
|
|
@ -0,0 +1,163 @@
|
||||||
|
{
|
||||||
|
"main": {
|
||||||
|
"id": "2d5cf626f99cda43",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "d7776d086006468e",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "575b51486935f0db",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "RIDMI.md",
|
||||||
|
"mode": "preview",
|
||||||
|
"source": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "vertical"
|
||||||
|
},
|
||||||
|
"left": {
|
||||||
|
"id": "458b801bd8498e84",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "6d17c2629608cd4d",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "8ed24cd25ebe90ac",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "file-explorer",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "alphabetical"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6bedbba820948b95",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "search",
|
||||||
|
"state": {
|
||||||
|
"query": "",
|
||||||
|
"matchingCase": false,
|
||||||
|
"explainSearch": false,
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0db24788e86643d0",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "bookmarks",
|
||||||
|
"state": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 200
|
||||||
|
},
|
||||||
|
"right": {
|
||||||
|
"id": "3002d329aae7819c",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "8609e3c2b697f17b",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "a0c2048afb568895",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "backlink",
|
||||||
|
"state": {
|
||||||
|
"file": "RIDMI.md",
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": "",
|
||||||
|
"backlinkCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "1b8afc6222400a5d",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outgoing-link",
|
||||||
|
"state": {
|
||||||
|
"file": "RIDMI.md",
|
||||||
|
"linksCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "41350e545149c90e",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "tag",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "frequency",
|
||||||
|
"useHierarchy": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "501a759c69354ed8",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outline",
|
||||||
|
"state": {
|
||||||
|
"file": "RIDMI.md"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 300,
|
||||||
|
"collapsed": true
|
||||||
|
},
|
||||||
|
"left-ribbon": {
|
||||||
|
"hiddenItems": {
|
||||||
|
"switcher:Меню быстрого перехода": false,
|
||||||
|
"graph:Граф": false,
|
||||||
|
"canvas:Создать новый холст": false,
|
||||||
|
"daily-notes:Сегодняшняя заметка": false,
|
||||||
|
"templates:Вставить шаблон": false,
|
||||||
|
"command-palette:Открыть палитру команд": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": "575b51486935f0db",
|
||||||
|
"lastOpenFiles": [
|
||||||
|
"build/CMakeFiles/yandex_smart_home_api_c.dir/main.c.o.d",
|
||||||
|
"build/CMakeFiles/3.30.3/CMakeCCompiler.cmake.tmp",
|
||||||
|
"build/CMakeFiles/3.30.3/CMakeDetermineCompilerABI_C.bin",
|
||||||
|
"build/CMakeFiles/3.30.3/CMakeCCompiler.cmake",
|
||||||
|
"build/CMakeFiles/3.30.3/CompilerIdC/a.out",
|
||||||
|
"build/CMakeFiles/3.30.3/CompilerIdC/tmp",
|
||||||
|
"build/CMakeFiles/3.30.3/CompilerIdC/CMakeCCompilerId.c",
|
||||||
|
"build/CMakeFiles/3.30.3/CompilerIdC",
|
||||||
|
"build/CMakeFiles/3.30.3/CMakeSystem.cmake",
|
||||||
|
"build/CMakeFiles/3.30.3",
|
||||||
|
"build/CMakeFiles/yandex_smart_home_api_c.dir/cJSON/cJSON.c.o.d"
|
||||||
|
]
|
||||||
|
}
|
||||||
12
CMakeLists.txt
Normal file
12
CMakeLists.txt
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
cmake_minimum_required(VERSION 4.0)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
project(yandex_smart_home_api_c LANGUAGES C)
|
||||||
|
set (CMAKE_C_FLAGS "-g -O3")
|
||||||
|
add_executable(yandex_smart_home_api_c main.c json/json.c cJSON/cJSON.c)
|
||||||
|
target_link_libraries(yandex_smart_home_api_c curl)
|
||||||
|
# Правильно указываем папку с .so для линковки
|
||||||
|
target_link_directories(yandex_smart_home_api_c PRIVATE
|
||||||
|
"${CMAKE_SOURCE_DIR}/curl/build/lib/"
|
||||||
|
)
|
||||||
|
install(TARGETS yandex_smart_home_api_c RUNTIME DESTINATION bin)
|
||||||
564
README.md
Normal file
564
README.md
Normal file
|
|
@ -0,0 +1,564 @@
|
||||||
|
# Пролог
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
||||||
793
api.h
Normal file
793
api.h
Normal file
|
|
@ -0,0 +1,793 @@
|
||||||
|
#pragma once
|
||||||
|
#include "curl/curl.h"
|
||||||
|
#include "json/json.h" // https://github.com/forkachild/C-Simple-JSON-Parser/tree/a597dd12271d1e19761f3997eeb1479fda95f81d
|
||||||
|
#include "huiafsdwesdfg.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int len;
|
||||||
|
char* id[];
|
||||||
|
} ya_list;
|
||||||
|
struct ya_list_test{
|
||||||
|
int len;
|
||||||
|
char* id[];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct range_struct {
|
||||||
|
unsigned char min;
|
||||||
|
unsigned char max;
|
||||||
|
unsigned char value;
|
||||||
|
};
|
||||||
|
struct on_off_struct {
|
||||||
|
unsigned char value;
|
||||||
|
};
|
||||||
|
struct temperature_k_struct{
|
||||||
|
unsigned int min;
|
||||||
|
unsigned int max;
|
||||||
|
unsigned int value;
|
||||||
|
};
|
||||||
|
struct color_struct{
|
||||||
|
int h;
|
||||||
|
char s;
|
||||||
|
char v;
|
||||||
|
|
||||||
|
};
|
||||||
|
struct scenes_struct{
|
||||||
|
int len;
|
||||||
|
char* id[];
|
||||||
|
};
|
||||||
|
struct color_setting_struct{
|
||||||
|
struct temperature_k_struct* temperature_k;
|
||||||
|
struct color_struct* color;
|
||||||
|
struct scenes_struct* scenes;
|
||||||
|
char color_target;
|
||||||
|
};
|
||||||
|
struct capabilities_struct {
|
||||||
|
struct range_struct* range;
|
||||||
|
struct color_setting_struct* color_setting;
|
||||||
|
struct on_off_struct* on_off;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ya_dev_struct{
|
||||||
|
char* id;
|
||||||
|
char* name;
|
||||||
|
char* type;
|
||||||
|
char* room;
|
||||||
|
struct groups* groups;
|
||||||
|
struct capabilities_struct* capabilities;
|
||||||
|
struct ya_api* loop;
|
||||||
|
} ya_dev;
|
||||||
|
|
||||||
|
struct devs{
|
||||||
|
int len;
|
||||||
|
struct ya_dev_struct* dev[];
|
||||||
|
} devs;
|
||||||
|
|
||||||
|
struct group{
|
||||||
|
char* id;
|
||||||
|
char* name;
|
||||||
|
struct devs* devs;
|
||||||
|
};
|
||||||
|
struct groups{
|
||||||
|
int len;
|
||||||
|
struct group* group[];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct data {
|
||||||
|
char* tocen;
|
||||||
|
struct devs* devs;
|
||||||
|
struct groups* groups;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ya_api {
|
||||||
|
void (*devs_free) (struct devs*);
|
||||||
|
char* (*on_off) (struct ya_dev_struct*);
|
||||||
|
char* (*kelvin) (struct ya_dev_struct* dev, int k);
|
||||||
|
char* (*hsv) (struct ya_dev_struct* dev, int h, char s, char v);
|
||||||
|
char* (*brightness) (struct ya_dev_struct* dev, int b);
|
||||||
|
void (*list_devices) (struct ya_api*);
|
||||||
|
ya_list* (*list_devices_id) ();
|
||||||
|
|
||||||
|
struct data data;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct MemoryStruct {
|
||||||
|
char *memory;
|
||||||
|
size_t size;
|
||||||
|
};
|
||||||
|
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp){
|
||||||
|
size_t realsize = size * nmemb;
|
||||||
|
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
||||||
|
|
||||||
|
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
|
||||||
|
if(!ptr) {
|
||||||
|
/* out of memory! */
|
||||||
|
printf("not enough memory (realloc returned NULL)\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mem->memory = ptr;
|
||||||
|
memcpy(&(mem->memory[mem->size]), contents, realsize);
|
||||||
|
mem->size += realsize;
|
||||||
|
mem->memory[mem->size] = 0;
|
||||||
|
|
||||||
|
return realsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//char *tocen;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ya_devs_free(struct devs* devs){
|
||||||
|
|
||||||
|
for (int i = 0; i != devs->len; i++){
|
||||||
|
free(devs->dev[i]->id);
|
||||||
|
free(devs->dev[i]->name);
|
||||||
|
free(devs->dev[i]->room);
|
||||||
|
free(devs->dev[i]->type);
|
||||||
|
if (devs->dev[i]->capabilities != NULL){
|
||||||
|
if (devs->dev[i]->capabilities->color_setting != NULL){
|
||||||
|
free(devs->dev[i]->capabilities->color_setting->temperature_k);
|
||||||
|
free(devs->dev[i]->capabilities->color_setting);
|
||||||
|
}
|
||||||
|
if (devs->dev[i]->capabilities->on_off != NULL)
|
||||||
|
free(devs->dev[i]->capabilities->on_off);
|
||||||
|
if (devs->dev[i]->capabilities->range != NULL)
|
||||||
|
free(devs->dev[i]->capabilities->range);
|
||||||
|
if (devs->dev[i]->groups != NULL)
|
||||||
|
free(devs->dev[i]->groups);
|
||||||
|
}
|
||||||
|
free(devs->dev[i]->capabilities);
|
||||||
|
free(devs->dev[i]);
|
||||||
|
}
|
||||||
|
free(devs);
|
||||||
|
}
|
||||||
|
char* ya_api_recvest(char* url, char* json_texst, char* tocen){
|
||||||
|
struct MemoryStruct chunk;
|
||||||
|
chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
|
||||||
|
chunk.size = 0;
|
||||||
|
|
||||||
|
struct curl_slist *headers=NULL;
|
||||||
|
|
||||||
|
headers = curl_slist_append(headers, tocen);
|
||||||
|
headers = curl_slist_append(headers, "Content-Type: application/json");
|
||||||
|
|
||||||
|
CURL* handle;
|
||||||
|
CURLcode response;
|
||||||
|
handle = curl_easy_init();
|
||||||
|
if (json_texst != NULL){
|
||||||
|
curl_easy_setopt(handle, CURLOPT_POSTFIELDS, json_texst);
|
||||||
|
}
|
||||||
|
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||||
|
curl_easy_perform(handle);
|
||||||
|
return chunk.memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
char* list_json(){
|
||||||
|
struct MemoryStruct chunk;
|
||||||
|
chunk.memory = malloc(1);
|
||||||
|
chunk.size = 0;
|
||||||
|
|
||||||
|
char url[] = "https://api.iot.yandex.net/v1.0/user/info";
|
||||||
|
struct curl_slist *headers=NULL;
|
||||||
|
headers = curl_slist_append(headers, tocen);
|
||||||
|
headers = curl_slist_append(headers, "Content-Type: application/json");
|
||||||
|
CURL* handle;
|
||||||
|
CURLcode response;
|
||||||
|
handle = curl_easy_init();
|
||||||
|
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||||
|
curl_easy_perform(handle);
|
||||||
|
return chunk.memory;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
char* ya_dev_(struct ya_dev_struct* dev){
|
||||||
|
printf("%s\n", yan_on_off_lampochka(dev->id, !dev->capabilities->on_off->value));
|
||||||
|
return ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", yan_on_off_lampochka(dev->id, !dev->capabilities->on_off->value));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
char* ya_dev_on_off(struct ya_dev_struct* dev){
|
||||||
|
if (dev->capabilities != NULL)
|
||||||
|
if (dev->capabilities->on_off != NULL){
|
||||||
|
//printf("%i\n", dev->capabilities->on_off->value);
|
||||||
|
return ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", yan_on_off_lampochka(dev->id, !dev->capabilities->on_off->value), dev->loop->data.tocen);
|
||||||
|
}
|
||||||
|
return "ERROR";
|
||||||
|
}
|
||||||
|
static char* memcpy_object_long(const char* data){
|
||||||
|
size_t length = strlen(data);
|
||||||
|
char* sss = malloc((sizeof(char))*length);
|
||||||
|
memcpy(sss, data, (sizeof(char))*length+1);
|
||||||
|
return sss;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tesss(){
|
||||||
|
struct ya_api api;
|
||||||
|
api.data.devs->dev[0]->groups->group[0]->id;
|
||||||
|
api.data.devs->dev[0]->groups->group[0]; // - group[i]
|
||||||
|
api.data.groups->group[0]->devs->dev[0]; // - dev[i]
|
||||||
|
|
||||||
|
//api.data.rooms->room[0];
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
void list_devices_aa(struct ya_api* api){
|
||||||
|
char url[] = "https://api.iot.yandex.net/v1.0/user/info";
|
||||||
|
result(json_element) element_result = json_parse(ya_api_recvest(url, NULL, api->data.tocen));
|
||||||
|
if(result_is_err(json_element)(&element_result)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&element_result);
|
||||||
|
fprintf(stderr, "Error parsing JSON: %s\n", json_error_to_string(error));
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
typed(json_element) element = result_unwrap(json_element)(&element_result);
|
||||||
|
result(json_element) groups_json = json_object_find(element.value.as_object, "groups");
|
||||||
|
struct groups* groups_s;
|
||||||
|
//json_print(&element, 2); // PRINT
|
||||||
|
{
|
||||||
|
typed(json_element) ss = result_unwrap(json_element)(&groups_json);
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
groups_s = (struct groups*)malloc(sizeof(struct groups*) + arr->count * sizeof(char*));
|
||||||
|
groups_s->len = arr->count;
|
||||||
|
for(int i = 0; i < arr->count; i++) {
|
||||||
|
typed(json_element) element = arr->elements[i];
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
struct group *group = malloc(sizeof(struct group));
|
||||||
|
group->id = memcpy_object_long(json_object_find(value.as_object, "id").inner.value.value.as_string);
|
||||||
|
group->name = memcpy_object_long(json_object_find(value.as_object, "name").inner.value.value.as_string);
|
||||||
|
group->devs = malloc(sizeof(struct devs));
|
||||||
|
groups_s->group[i] = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
result(json_element) SS = json_object_find(element.value.as_object, "devices");
|
||||||
|
if(result_is_err(json_element)(&SS)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&SS);
|
||||||
|
fprintf(stderr, "Error getting element \"devices\": %s\n", json_error_to_string(error));
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
typed(json_element) ss = result_unwrap(json_element)(&SS);
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
|
||||||
|
struct devs* devs = (struct devs*)malloc(sizeof(struct devs*) + arr->count * sizeof(char*));
|
||||||
|
for(int i = 0; i < arr->count; i++) {
|
||||||
|
////////printf("%s", "SAS_1\n");
|
||||||
|
typed(json_element) element = arr->elements[i];
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
|
||||||
|
struct ya_dev_struct *data;
|
||||||
|
data = malloc(sizeof(struct ya_dev_struct));
|
||||||
|
data->id = memcpy_object_long(json_object_find(value.as_object, "id").inner.value.value.as_string);
|
||||||
|
data->name = memcpy_object_long(json_object_find(value.as_object, "name").inner.value.value.as_string);
|
||||||
|
////////printf("%s%s", data->name, "\n");
|
||||||
|
data->type = memcpy_object_long(json_object_find(value.as_object, "type").inner.value.value.as_string);
|
||||||
|
data->room = memcpy_object_long(json_object_find(value.as_object, "room").inner.value.value.as_string);
|
||||||
|
result(json_element) nn = json_object_find(value.as_object, "groups");
|
||||||
|
//struct ya_list_test* fam2;
|
||||||
|
struct groups* fam2;
|
||||||
|
if(result_is_err(json_element)(&nn)) {
|
||||||
|
fam2 = NULL;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
typed(json_array) *arr2 = result_unwrap(json_element)(&nn).value.as_array;
|
||||||
|
//fam2 = malloc(sizeof(fam2) + arr2->count * sizeof(char*));
|
||||||
|
//fam2 = malloc(sizeof(struct groups));
|
||||||
|
fam2 = (struct groups*)malloc(sizeof(struct groups*) + arr2->count * sizeof(struct groups*));
|
||||||
|
for(int i = 0; i != arr2->count; i++) {
|
||||||
|
typed(json_element) element = arr2->elements[i];
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
for (int ix = 0; ix != groups_s->len; ix++){
|
||||||
|
if (strcmp(groups_s->group[ix]->id, value.as_string) == 0){
|
||||||
|
groups_s->group[ix]->devs->dev[groups_s->group[ix]->devs->len] = data;
|
||||||
|
groups_s->group[ix]->devs->len = groups_s->group[ix]->devs->len + 1;
|
||||||
|
|
||||||
|
fam2->group[i] = groups_s->group[ix];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//fam2->id[i] = (char*) value.as_string;
|
||||||
|
}
|
||||||
|
fam2->len = arr2->count;
|
||||||
|
}
|
||||||
|
result(json_element) nn_2 = json_object_find(value.as_object, "capabilities");
|
||||||
|
struct capabilities_struct* fam3;
|
||||||
|
if(result_is_err(json_element)(&nn_2)) {
|
||||||
|
fam3 = NULL;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
typed(json_array) *arr3 = result_unwrap(json_element)(&nn_2).value.as_array;
|
||||||
|
fam3 = malloc(sizeof(struct capabilities_struct));
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
fam3->range = NULL;
|
||||||
|
fam3->color_setting = NULL;
|
||||||
|
fam3->on_off = NULL;
|
||||||
|
////////printf("%s", "QQQ\n");
|
||||||
|
for(int i = 0; i < arr3->count; i++) {
|
||||||
|
result(json_element) SS = json_object_find(arr3->elements[i].value.as_object, "type");
|
||||||
|
//result(json_element) SS_state = json_object_find(arr3->elements[i].value.as_object, "state");
|
||||||
|
//result(json_element) SS_state_instance = json_object_find(arr3->elements[i].value.as_object, "instance");
|
||||||
|
if (strcmp(SS.inner.value.value.as_string, "devices.capabilities.range") == 0){
|
||||||
|
struct range_struct* sasss;
|
||||||
|
sasss = malloc(sizeof(struct range_struct));
|
||||||
|
result(json_element) SS_2 = json_object_find(arr3->elements[i].value.as_object, "parameters");
|
||||||
|
result(json_element) SS_3 = json_object_find(SS_2.inner.value.value.as_object, "range");
|
||||||
|
sasss->min = json_object_find(SS_3.inner.value.value.as_object, "min").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss->max = json_object_find(SS_3.inner.value.value.as_object, "max").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss->value = json_object_find(SS_3.inner.value.value.as_object, "precision").inner.value.value.as_number.value.as_long;
|
||||||
|
fam3->range = sasss;
|
||||||
|
}
|
||||||
|
else if (strcmp(SS.inner.value.value.as_string, "devices.capabilities.color_setting") == 0){
|
||||||
|
struct temperature_k_struct* sasss;
|
||||||
|
sasss = malloc(sizeof(struct temperature_k_struct));
|
||||||
|
struct color_setting_struct* sasss_2;
|
||||||
|
sasss_2 = malloc(sizeof(struct color_setting_struct));
|
||||||
|
result(json_element) json_parameters = json_object_find(arr3->elements[i].value.as_object, "parameters");
|
||||||
|
result(json_element) json_temperature_k = json_object_find(json_parameters.inner.value.value.as_object, "temperature_k");
|
||||||
|
sasss->min = json_object_find(json_temperature_k.inner.value.value.as_object, "min").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss->max = json_object_find(json_temperature_k.inner.value.value.as_object, "max").inner.value.value.as_number.value.as_long;
|
||||||
|
/////////json_print(&arr3->elements[i], 2);
|
||||||
|
result(json_element) color_model = json_object_find(json_parameters.inner.value.value.as_object, "color_model");
|
||||||
|
|
||||||
|
if(result_is_err(json_element)(&color_model)) {
|
||||||
|
printf("ID: %s \n", "0");
|
||||||
|
sasss_2->color = NULL;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (strcmp(memcpy_object_long(color_model.inner.value.value.as_string), "hsv") == 0){
|
||||||
|
printf("ID: %s \n", data->id);
|
||||||
|
struct color_struct* color_struct_dat;
|
||||||
|
color_struct_dat = malloc(sizeof(struct color_struct));
|
||||||
|
color_struct_dat->h = 100;
|
||||||
|
color_struct_dat->s = 100;
|
||||||
|
color_struct_dat->v = 100;
|
||||||
|
//color_struct_dat->status = true;
|
||||||
|
sasss_2->color = color_struct_dat;
|
||||||
|
//sasss_2->color_status = 2;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sasss_2->color = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
else{
|
||||||
|
if (strcmp(memcpy_object_long(color_model.inner.value.value.as_string), "hsv") == 0){
|
||||||
|
printf("ID: %s", data->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//result(json_element) state = json_object_find(SS_2.inner.value.value.as_object, "state");
|
||||||
|
//if (strcmp(memcpy_object_long(state.inner.value.value.as_string), "temperature_k") == 0)
|
||||||
|
result(json_element) nn_2_n = json_object_find(json_parameters.inner.value.value.as_object, "value");
|
||||||
|
if(result_is_err(json_element)(&nn_2_n)) {
|
||||||
|
sasss->value = -1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sasss->value = nn_2_n.inner.value.value.as_number.value.as_long;
|
||||||
|
}
|
||||||
|
sasss_2->temperature_k = sasss;
|
||||||
|
//sasss_2->color->h = 2;
|
||||||
|
fam3->color_setting = sasss_2;
|
||||||
|
}
|
||||||
|
//else if (strcmp(SS_state.inner.value.value.as_string, "hsv") == 0){
|
||||||
|
// printf("ID: %s", data->id);
|
||||||
|
//}
|
||||||
|
else if (strcmp(SS.inner.value.value.as_string, "devices.capabilities.on_off") == 0){
|
||||||
|
struct on_off_struct* sasss;
|
||||||
|
sasss = malloc(sizeof(struct on_off_struct));
|
||||||
|
result(json_element) SS_2 = json_object_find(arr3->elements[i].value.as_object, "state");
|
||||||
|
sasss->value = json_object_find(SS_2.inner.value.value.as_object, "value").inner.value.value.as_boolean;
|
||||||
|
fam3->on_off = sasss;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////////printf("%s", "SAS_4\n");
|
||||||
|
data->loop = api;
|
||||||
|
//data->groups = NULL;
|
||||||
|
data->groups = fam2;
|
||||||
|
data->capabilities = fam3;
|
||||||
|
devs->dev[i] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
devs->len = arr->count;
|
||||||
|
//devs->mem = &element;
|
||||||
|
|
||||||
|
//return devs;
|
||||||
|
////////printf("SAS\n");
|
||||||
|
api->data.devs = devs;
|
||||||
|
api->data.groups = groups_s;
|
||||||
|
//main_data->data->ya_devs = devs;
|
||||||
|
////////printf("SAS\n");
|
||||||
|
json_free(&element);
|
||||||
|
}
|
||||||
|
void list_devices(struct ya_api* api){
|
||||||
|
int len_groups = 0;
|
||||||
|
char url[] = "https://api.iot.yandex.net/v1.0/user/info";
|
||||||
|
result(json_element) element_result = json_parse(ya_api_recvest(url, NULL, api->data.tocen));
|
||||||
|
if(result_is_err(json_element)(&element_result)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&element_result);
|
||||||
|
fprintf(stderr, "Error parsing JSON: %s\n", json_error_to_string(error));
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
typed(json_element) element = result_unwrap(json_element)(&element_result);
|
||||||
|
result(json_element) groups_json = json_object_find(element.value.as_object, "groups");
|
||||||
|
struct groups* groups_s;
|
||||||
|
//json_print(&element, 2); // PRINT
|
||||||
|
{
|
||||||
|
typed(json_element) ss = result_unwrap(json_element)(&groups_json);
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
groups_s = (struct groups*)malloc(sizeof(struct groups*) + arr->count * sizeof(char*));
|
||||||
|
groups_s->len = arr->count;
|
||||||
|
for(int i = 0; i < arr->count; i++) {
|
||||||
|
|
||||||
|
typed(json_element) element = arr->elements[i];
|
||||||
|
typed(json_element_type) type = element.type;
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
struct group *group;
|
||||||
|
group = malloc(sizeof(struct group));
|
||||||
|
group->id = memcpy_object_long(json_object_find(value.as_object, "id").inner.value.value.as_string);
|
||||||
|
group->name = memcpy_object_long(json_object_find(value.as_object, "name").inner.value.value.as_string);
|
||||||
|
group->devs = malloc(sizeof(struct devs));
|
||||||
|
groups_s->group[i] = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
result(json_element) SS = json_object_find(element.value.as_object, "devices");
|
||||||
|
if(result_is_err(json_element)(&SS)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&SS);
|
||||||
|
fprintf(stderr, "Error getting element \"devices\": %s\n", json_error_to_string(error));
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
typed(json_element) ss = result_unwrap(json_element)(&SS);
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
|
||||||
|
struct devs* devs = (struct devs*)malloc(sizeof(struct devs*) + arr->count * sizeof(char*));
|
||||||
|
for(int i = 0; i < arr->count; i++) {
|
||||||
|
////////printf("%s", "SAS_1\n");
|
||||||
|
typed(json_element) element = arr->elements[i];
|
||||||
|
typed(json_element_type) type = element.type;
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
|
||||||
|
struct ya_dev_struct *data;
|
||||||
|
data = malloc(sizeof(struct ya_dev_struct));
|
||||||
|
data->id = memcpy_object_long(json_object_find(value.as_object, "id").inner.value.value.as_string);
|
||||||
|
data->name = memcpy_object_long(json_object_find(value.as_object, "name").inner.value.value.as_string);
|
||||||
|
////////printf("%s%s", data->name, "\n");
|
||||||
|
data->type = memcpy_object_long(json_object_find(value.as_object, "type").inner.value.value.as_string);
|
||||||
|
data->room = memcpy_object_long(json_object_find(value.as_object, "room").inner.value.value.as_string);
|
||||||
|
result(json_element) nn = json_object_find(value.as_object, "groups");
|
||||||
|
//struct ya_list_test* fam2;
|
||||||
|
struct groups* fam2;
|
||||||
|
if(result_is_err(json_element)(&nn)) {
|
||||||
|
fam2 = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
typed(json_array) *arr2 = result_unwrap(json_element)(&nn).value.as_array;
|
||||||
|
//fam2 = malloc(sizeof(fam2) + arr2->count * sizeof(char*));
|
||||||
|
//fam2 = malloc(sizeof(struct groups));
|
||||||
|
fam2 = (struct groups*)malloc(sizeof(struct groups*) + arr2->count * sizeof(struct groups*));
|
||||||
|
for(int i = 0; i != arr2->count; i++) {
|
||||||
|
typed(json_element) element = arr2->elements[i];
|
||||||
|
typed(json_element_type) type = element.type;
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
for (int ix = 0; ix != groups_s->len; ix++){
|
||||||
|
if (strcmp(groups_s->group[ix]->id, value.as_string) == 0){
|
||||||
|
groups_s->group[ix]->devs->dev[groups_s->group[ix]->devs->len] = data;
|
||||||
|
groups_s->group[ix]->devs->len = groups_s->group[ix]->devs->len + 1;
|
||||||
|
|
||||||
|
fam2->group[i] = groups_s->group[ix];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//fam2->id[i] = (char*) value.as_string;
|
||||||
|
}
|
||||||
|
fam2->len = arr2->count;
|
||||||
|
}
|
||||||
|
result(json_element) nn_2 = json_object_find(value.as_object, "capabilities");
|
||||||
|
struct capabilities_struct* fam3;
|
||||||
|
if(result_is_err(json_element)(&nn_2)) {
|
||||||
|
fam3 = NULL;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
typed(json_array) *arr3 = result_unwrap(json_element)(&nn_2).value.as_array;
|
||||||
|
fam3 = malloc(sizeof(struct capabilities_struct));
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
fam3->range = NULL;
|
||||||
|
fam3->color_setting = NULL;
|
||||||
|
fam3->on_off = NULL;
|
||||||
|
////////printf("%s", "QQQ\n");
|
||||||
|
for(int i = 0; i < arr3->count; i++) {
|
||||||
|
result(json_element) SS = json_object_find(arr3->elements[i].value.as_object, "type");
|
||||||
|
//result(json_element) SS_state = json_object_find(arr3->elements[i].value.as_object, "state");
|
||||||
|
//result(json_element) SS_state_instance = json_object_find(arr3->elements[i].value.as_object, "instance");
|
||||||
|
if (strcmp(SS.inner.value.value.as_string, "devices.capabilities.range") == 0){
|
||||||
|
struct range_struct* sasss;
|
||||||
|
sasss = malloc(sizeof(struct range_struct));
|
||||||
|
result(json_element) SS_2 = json_object_find(arr3->elements[i].value.as_object, "parameters");
|
||||||
|
result(json_element) SS_3 = json_object_find(SS_2.inner.value.value.as_object, "range");
|
||||||
|
sasss->min = json_object_find(SS_3.inner.value.value.as_object, "min").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss->max = json_object_find(SS_3.inner.value.value.as_object, "max").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss->value = json_object_find(SS_3.inner.value.value.as_object, "precision").inner.value.value.as_number.value.as_long;
|
||||||
|
fam3->range = sasss;
|
||||||
|
}
|
||||||
|
else if (strcmp(SS.inner.value.value.as_string, "devices.capabilities.color_setting") == 0){
|
||||||
|
struct temperature_k_struct* sasss;
|
||||||
|
sasss = malloc(sizeof(struct temperature_k_struct));
|
||||||
|
struct color_setting_struct* sasss_2;
|
||||||
|
sasss_2 = malloc(sizeof(struct color_setting_struct));
|
||||||
|
result(json_element) SS_2 = json_object_find(arr3->elements[i].value.as_object, "parameters");
|
||||||
|
result(json_element) state = json_object_find(arr3->elements[i].value.as_object, "state");
|
||||||
|
result(json_element) SS_3 = json_object_find(SS_2.inner.value.value.as_object, "temperature_k");
|
||||||
|
sasss->min = json_object_find(SS_3.inner.value.value.as_object, "min").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss->max = json_object_find(SS_3.inner.value.value.as_object, "max").inner.value.value.as_number.value.as_long;
|
||||||
|
/////////json_print(&arr3->elements[i], 2);
|
||||||
|
result(json_element) color_model = json_object_find(SS_2.inner.value.value.as_object, "color_model");
|
||||||
|
|
||||||
|
if(result_is_err(json_element)(&color_model)) {
|
||||||
|
//printf("ID: %s \n", "0");
|
||||||
|
sasss_2->color = NULL;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (strcmp(memcpy_object_long(color_model.inner.value.value.as_string), "hsv") == 0){
|
||||||
|
//printf("ID: %s \n", data->id);
|
||||||
|
struct color_struct* color_struct_dat;
|
||||||
|
color_struct_dat = malloc(sizeof(struct color_struct));
|
||||||
|
color_struct_dat->h = -1;
|
||||||
|
color_struct_dat->s = -1;
|
||||||
|
color_struct_dat->v = -1;
|
||||||
|
//color_struct_dat->status = true;
|
||||||
|
sasss_2->color = color_struct_dat;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sasss_2->color = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
else{
|
||||||
|
if (strcmp(memcpy_object_long(color_model.inner.value.value.as_string), "hsv") == 0){
|
||||||
|
printf("ID: %s", data->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//result(json_element) state = json_object_find(SS_2.inner.value.value.as_object, "state");
|
||||||
|
//if (strcmp(memcpy_object_long(state.inner.value.value.as_string), "temperature_k") == 0)
|
||||||
|
result(json_element) instance = json_object_find(state.inner.value.value.as_object, "instance");
|
||||||
|
if(result_is_err(json_element)(&instance)) {
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (strcmp(instance.inner.value.value.as_string, "temperature_k") == 0){
|
||||||
|
//printf("K\n");
|
||||||
|
result(json_element) value_temperature_k= json_object_find(state.inner.value.value.as_object, "value");
|
||||||
|
if(result_is_err(json_element)(&value_temperature_k)) {
|
||||||
|
sasss->value = -1;
|
||||||
|
//result(json_element) nn_2_naa = json_object_find(SS_2.inner.value.value.as_object, "value");
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sasss->value = value_temperature_k.inner.value.value.as_number.value.as_long;
|
||||||
|
sasss_2->color_target = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp(instance.inner.value.value.as_string, "hsv") == 0){
|
||||||
|
//printf("hsv\n");
|
||||||
|
result(json_element) value_vsh= json_object_find(state.inner.value.value.as_object, "value");
|
||||||
|
sasss_2->color->h = json_object_find(value_vsh.inner.value.value.as_object, "h").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss_2->color->s = json_object_find(value_vsh.inner.value.value.as_object, "s").inner.value.value.as_number.value.as_long;
|
||||||
|
sasss_2->color->v = json_object_find(value_vsh.inner.value.value.as_object, "v").inner.value.value.as_number.value.as_long;
|
||||||
|
//printf("VSH = %i %i %i\n", sasss_2->color->v,sasss_2->color->s,sasss_2->color->h);
|
||||||
|
sasss_2->color_target = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sasss_2->temperature_k = sasss;
|
||||||
|
//sasss_2->color->h = 2;
|
||||||
|
fam3->color_setting = sasss_2;
|
||||||
|
}
|
||||||
|
//else if (strcmp(SS_state.inner.value.value.as_string, "hsv") == 0){
|
||||||
|
// printf("ID: %s", data->id);
|
||||||
|
//}
|
||||||
|
else if (strcmp(SS.inner.value.value.as_string, "devices.capabilities.on_off") == 0){
|
||||||
|
struct on_off_struct* sasss;
|
||||||
|
sasss = malloc(sizeof(struct on_off_struct));
|
||||||
|
result(json_element) SS_2 = json_object_find(arr3->elements[i].value.as_object, "state");
|
||||||
|
sasss->value = json_object_find(SS_2.inner.value.value.as_object, "value").inner.value.value.as_boolean;
|
||||||
|
fam3->on_off = sasss;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////////printf("%s", "SAS_4\n");
|
||||||
|
data->loop = api;
|
||||||
|
//data->groups = NULL;
|
||||||
|
data->groups = fam2;
|
||||||
|
data->capabilities = fam3;
|
||||||
|
devs->dev[i] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
devs->len = arr->count;
|
||||||
|
//devs->mem = &element;
|
||||||
|
|
||||||
|
//return devs;
|
||||||
|
////////printf("SAS\n");
|
||||||
|
api->data.devs = devs;
|
||||||
|
api->data.groups = groups_s;
|
||||||
|
//main_data->data->ya_devs = devs;
|
||||||
|
////////printf("SAS\n");
|
||||||
|
json_free(&element);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* ya_dev_kelvin(struct ya_dev_struct* dev, int k){
|
||||||
|
if (dev->capabilities != NULL)
|
||||||
|
if (dev->capabilities->color_setting != NULL){
|
||||||
|
char* s = yan_kelvin_lampochka(dev->id, k);
|
||||||
|
return ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", s, dev->loop->data.tocen);
|
||||||
|
}
|
||||||
|
return "ERROR";
|
||||||
|
}
|
||||||
|
char* ya_dev_hsv(struct ya_dev_struct* dev, int h, char s, char v){
|
||||||
|
if (dev->capabilities != NULL)
|
||||||
|
if (dev->capabilities->color_setting != NULL){
|
||||||
|
char* aaa = yan_hsv_lampochka(dev->id, h,s,v);
|
||||||
|
return ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", aaa, dev->loop->data.tocen);
|
||||||
|
}
|
||||||
|
return "ERROR";
|
||||||
|
}
|
||||||
|
char* ya_dev_brightness(struct ya_dev_struct* dev, int b){
|
||||||
|
if (dev->capabilities != NULL)
|
||||||
|
if (dev->capabilities->range != NULL){
|
||||||
|
char* s = yan_brightness(dev->id, b);
|
||||||
|
return ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", s, dev->loop->data.tocen);
|
||||||
|
}
|
||||||
|
return "ERROR";
|
||||||
|
}
|
||||||
|
ya_list* list_devices_id(struct ya_api api){
|
||||||
|
char url[] = "https://api.iot.yandex.net/v1.0/user/info";
|
||||||
|
result(json_element) element_result = json_parse(ya_api_recvest(url, NULL, api.data.tocen));
|
||||||
|
if(result_is_err(json_element)(&element_result)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&element_result);
|
||||||
|
fprintf(stderr, "Error parsing JSON: %s\n", json_error_to_string(error));
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
typed(json_element) element = result_unwrap(json_element)(&element_result);
|
||||||
|
result(json_element) SS = json_object_find(element.value.as_object, "devices");
|
||||||
|
if(result_is_err(json_element)(&SS)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&SS);
|
||||||
|
fprintf(stderr, "Error getting element \"devices\": %s\n", json_error_to_string(error));
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
typed(json_element) ss = result_unwrap(json_element)(&SS);
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
|
||||||
|
ya_list* fam1 = (ya_list*)malloc(sizeof(ya_list*) + arr->count * sizeof(char*));
|
||||||
|
for(int i = 0; i < arr->count; i++) {
|
||||||
|
typed(json_element) element = arr->elements[i];
|
||||||
|
typed(json_element_type) type = element.type;
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
result(json_element) id = json_object_find(value.as_object, "id");
|
||||||
|
fam1->id[i] = (char*) id.inner.value.value.as_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
fam1->len = arr->count;
|
||||||
|
return fam1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//// asdsdsd
|
||||||
|
void list(){
|
||||||
|
struct MemoryStruct chunk;
|
||||||
|
chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
|
||||||
|
chunk.size = 0;
|
||||||
|
|
||||||
|
char url_2[100];
|
||||||
|
char url[] = "https://api.iot.yandex.net/v1.0/user/info";
|
||||||
|
struct curl_slist *headers=NULL;
|
||||||
|
headers = curl_slist_append(headers, "TOKEN");
|
||||||
|
headers = curl_slist_append(headers, "Content-Type: application/json");
|
||||||
|
CURL* handle;
|
||||||
|
CURLcode response;
|
||||||
|
handle = curl_easy_init();
|
||||||
|
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||||
|
curl_easy_perform(handle);
|
||||||
|
printf("%s\n", chunk.memory);
|
||||||
|
|
||||||
|
result(json_element) element_result = json_parse(chunk.memory);
|
||||||
|
if(result_is_err(json_element)(&element_result)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&element_result);
|
||||||
|
fprintf(stderr, "Error parsing JSON: %s\n", json_error_to_string(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
typed(json_element) element = result_unwrap(json_element)(&element_result);
|
||||||
|
result(json_element) SS = json_object_find(element.value.as_object, "devices");
|
||||||
|
if(result_is_err(json_element)(&SS)) {
|
||||||
|
typed(json_error) error = result_unwrap_err(json_element)(&SS);
|
||||||
|
fprintf(stderr, "Error getting element \"devices\": %s\n", json_error_to_string(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
typed(json_element) ss = result_unwrap(json_element)(&SS);
|
||||||
|
typed(json_array) *arr = ss.value.as_array;
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < arr->count; i++) {
|
||||||
|
typed(json_element) element = arr->elements[i];
|
||||||
|
|
||||||
|
typed(json_element_type) type = element.type;
|
||||||
|
typed(json_element_value) value = element.value;
|
||||||
|
result(json_element) id = json_object_find(value.as_object, "id");
|
||||||
|
result(json_element) name = json_object_find(value.as_object, "name");
|
||||||
|
printf("name: %s \tid: %s\n", name.inner.value.value.as_string, id.inner.value.value.as_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//json_print(&ss, 2);
|
||||||
|
//typed(json_entry) entry = SS.value.as_object->entries[0];
|
||||||
|
//entry.element.type;
|
||||||
|
/*
|
||||||
|
result(json_element) element_result = json_parse(chunk.memory);
|
||||||
|
typed(json_element) element = result_unwrap(json_element)(&element_result);
|
||||||
|
json_print(&element, 2);
|
||||||
|
|
||||||
|
result(json_element) hello_element_result = json_object_find(element.value.as_object, "devices");
|
||||||
|
typed(json_element) hello_element = result_unwrap(json_element)(&hello_element_result);
|
||||||
|
printf("SAS\n");
|
||||||
|
typed(json_entry) entry = hello_element.value.as_object->entries[0];
|
||||||
|
int i;
|
||||||
|
typed(json_object) *obj = hello_element.value.as_object;
|
||||||
|
for(i = 0; i < obj->count; i++) {
|
||||||
|
typed(json_entry) entry = obj->entries[i];
|
||||||
|
|
||||||
|
typed(json_string) key = entry.key;
|
||||||
|
typed(json_element_type) type = entry.element.type;
|
||||||
|
typed(json_element_value) value = entry.element.value;
|
||||||
|
// Do something with `key`, `type` and `value`
|
||||||
|
}
|
||||||
|
//printf("\n%s\n", obj->entries[0]);
|
||||||
|
|
||||||
|
//result(json_element) json_object_find(typed(json_object) * object, typed(json_string) key);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct ya_api ya_api_create(char* tocen){
|
||||||
|
struct ya_api api;
|
||||||
|
api.data.tocen = tocen;
|
||||||
|
api.list_devices = list_devices;
|
||||||
|
api.on_off = ya_dev_on_off;
|
||||||
|
api.list_devices_id = list_devices_id;
|
||||||
|
api.kelvin = ya_dev_kelvin;
|
||||||
|
api.hsv = ya_dev_hsv;
|
||||||
|
api.devs_free = ya_devs_free;
|
||||||
|
api.brightness = ya_dev_brightness;
|
||||||
|
|
||||||
|
return api;
|
||||||
|
}
|
||||||
|
|
||||||
3119
cJSON/cJSON.c
Normal file
3119
cJSON/cJSON.c
Normal file
File diff suppressed because it is too large
Load diff
300
cJSON/cJSON.h
Normal file
300
cJSON/cJSON.h
Normal file
|
|
@ -0,0 +1,300 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cJSON__h
|
||||||
|
#define cJSON__h
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
|
||||||
|
#define __WINDOWS__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
|
||||||
|
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
|
||||||
|
|
||||||
|
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
|
||||||
|
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
|
||||||
|
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
|
||||||
|
|
||||||
|
For *nix builds that support visibility attribute, you can define similar behavior by
|
||||||
|
|
||||||
|
setting default visibility to hidden by adding
|
||||||
|
-fvisibility=hidden (for gcc)
|
||||||
|
or
|
||||||
|
-xldscope=hidden (for sun cc)
|
||||||
|
to CFLAGS
|
||||||
|
|
||||||
|
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CJSON_CDECL __cdecl
|
||||||
|
#define CJSON_STDCALL __stdcall
|
||||||
|
|
||||||
|
/* export symbols by default, this is necessary for copy pasting the C and header file */
|
||||||
|
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
|
||||||
|
#define CJSON_EXPORT_SYMBOLS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CJSON_HIDE_SYMBOLS)
|
||||||
|
#define CJSON_PUBLIC(type) type CJSON_STDCALL
|
||||||
|
#elif defined(CJSON_EXPORT_SYMBOLS)
|
||||||
|
#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
|
||||||
|
#elif defined(CJSON_IMPORT_SYMBOLS)
|
||||||
|
#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
|
||||||
|
#endif
|
||||||
|
#else /* !__WINDOWS__ */
|
||||||
|
#define CJSON_CDECL
|
||||||
|
#define CJSON_STDCALL
|
||||||
|
|
||||||
|
#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
|
||||||
|
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
|
||||||
|
#else
|
||||||
|
#define CJSON_PUBLIC(type) type
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* project version */
|
||||||
|
#define CJSON_VERSION_MAJOR 1
|
||||||
|
#define CJSON_VERSION_MINOR 7
|
||||||
|
#define CJSON_VERSION_PATCH 16
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* cJSON Types: */
|
||||||
|
#define cJSON_Invalid (0)
|
||||||
|
#define cJSON_False (1 << 0)
|
||||||
|
#define cJSON_True (1 << 1)
|
||||||
|
#define cJSON_NULL (1 << 2)
|
||||||
|
#define cJSON_Number (1 << 3)
|
||||||
|
#define cJSON_String (1 << 4)
|
||||||
|
#define cJSON_Array (1 << 5)
|
||||||
|
#define cJSON_Object (1 << 6)
|
||||||
|
#define cJSON_Raw (1 << 7) /* raw json */
|
||||||
|
|
||||||
|
#define cJSON_IsReference 256
|
||||||
|
#define cJSON_StringIsConst 512
|
||||||
|
|
||||||
|
/* The cJSON structure: */
|
||||||
|
typedef struct cJSON
|
||||||
|
{
|
||||||
|
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
|
||||||
|
struct cJSON *next;
|
||||||
|
struct cJSON *prev;
|
||||||
|
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
|
||||||
|
struct cJSON *child;
|
||||||
|
|
||||||
|
/* The type of the item, as above. */
|
||||||
|
int type;
|
||||||
|
|
||||||
|
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
|
||||||
|
char *valuestring;
|
||||||
|
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
|
||||||
|
int valueint;
|
||||||
|
/* The item's number, if type==cJSON_Number */
|
||||||
|
double valuedouble;
|
||||||
|
|
||||||
|
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
||||||
|
char *string;
|
||||||
|
} cJSON;
|
||||||
|
|
||||||
|
typedef struct cJSON_Hooks
|
||||||
|
{
|
||||||
|
/* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
|
||||||
|
void *(CJSON_CDECL *malloc_fn)(size_t sz);
|
||||||
|
void (CJSON_CDECL *free_fn)(void *ptr);
|
||||||
|
} cJSON_Hooks;
|
||||||
|
|
||||||
|
typedef int cJSON_bool;
|
||||||
|
|
||||||
|
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
|
||||||
|
* This is to prevent stack overflows. */
|
||||||
|
#ifndef CJSON_NESTING_LIMIT
|
||||||
|
#define CJSON_NESTING_LIMIT 1000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* returns the version of cJSON as a string */
|
||||||
|
CJSON_PUBLIC(const char*) cJSON_Version(void);
|
||||||
|
|
||||||
|
/* Supply malloc, realloc and free functions to cJSON */
|
||||||
|
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
|
||||||
|
|
||||||
|
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
|
||||||
|
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
|
||||||
|
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
||||||
|
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||||
|
|
||||||
|
/* Render a cJSON entity to text for transfer/storage. */
|
||||||
|
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
|
||||||
|
/* Render a cJSON entity to text for transfer/storage without any formatting. */
|
||||||
|
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
|
||||||
|
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
|
||||||
|
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
|
||||||
|
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
|
||||||
|
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
|
||||||
|
/* Delete a cJSON entity and all subentities. */
|
||||||
|
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
|
||||||
|
|
||||||
|
/* Returns the number of items in an array (or object). */
|
||||||
|
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
|
||||||
|
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
|
||||||
|
/* Get item "string" from object. Case insensitive. */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
|
||||||
|
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
|
||||||
|
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
||||||
|
|
||||||
|
/* Check item type and return its value */
|
||||||
|
CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
|
||||||
|
|
||||||
|
/* These functions check the type of an item */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
|
||||||
|
|
||||||
|
/* These calls create a cJSON item of the appropriate type. */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
|
||||||
|
/* raw json */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
|
||||||
|
|
||||||
|
/* Create a string where valuestring references a string so
|
||||||
|
* it will not be freed by cJSON_Delete */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
|
||||||
|
/* Create an object/array that only references it's elements so
|
||||||
|
* they will not be freed by cJSON_Delete */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
|
||||||
|
|
||||||
|
/* These utilities create an Array of count items.
|
||||||
|
* The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
|
||||||
|
|
||||||
|
/* Append item to the specified array/object. */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
|
||||||
|
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
|
||||||
|
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
|
||||||
|
* writing to `item->string` */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
|
||||||
|
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
|
||||||
|
|
||||||
|
/* Remove/Detach items from Arrays/Objects. */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
|
||||||
|
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||||
|
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
|
||||||
|
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||||
|
|
||||||
|
/* Update array items. */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
|
||||||
|
|
||||||
|
/* Duplicate a cJSON item */
|
||||||
|
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
|
||||||
|
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
|
||||||
|
* need to be released. With recurse!=0, it will duplicate any children connected to the item.
|
||||||
|
* The item->next and ->prev pointers are always zero on return from Duplicate. */
|
||||||
|
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
|
||||||
|
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
|
||||||
|
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
|
||||||
|
|
||||||
|
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
||||||
|
* The input pointer json cannot point to a read-only address area, such as a string constant,
|
||||||
|
* but should point to a readable and writable address area. */
|
||||||
|
CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
||||||
|
|
||||||
|
/* Helper functions for creating and adding items to an object at the same time.
|
||||||
|
* They return the added item or NULL on failure. */
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
|
||||||
|
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
|
||||||
|
|
||||||
|
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
|
||||||
|
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
|
||||||
|
/* helper for the cJSON_SetNumberValue macro */
|
||||||
|
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
|
||||||
|
#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
|
||||||
|
/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
|
||||||
|
CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
|
||||||
|
|
||||||
|
/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/
|
||||||
|
#define cJSON_SetBoolValue(object, boolValue) ( \
|
||||||
|
(object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \
|
||||||
|
(object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \
|
||||||
|
cJSON_Invalid\
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Macro for iterating over an array or object */
|
||||||
|
#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
|
||||||
|
|
||||||
|
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
|
||||||
|
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
|
||||||
|
CJSON_PUBLIC(void) cJSON_free(void *object);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
1
curl
Submodule
1
curl
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit a88907fd96c946d17867a491b4cf7c72a1982be4
|
||||||
192
huiafsdwesdfg.h
Normal file
192
huiafsdwesdfg.h
Normal file
|
|
@ -0,0 +1,192 @@
|
||||||
|
#include "cJSON/cJSON.h"
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
static cJSON* ya_json_hed(char* id_dev, char* type_a, cJSON* state_a){
|
||||||
|
cJSON *device = cJSON_CreateObject();
|
||||||
|
cJSON* devices = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(device, "devices", devices);
|
||||||
|
|
||||||
|
cJSON* id = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(devices, id);
|
||||||
|
|
||||||
|
cJSON* real_id = cJSON_CreateString(id_dev);
|
||||||
|
cJSON_AddItemToObject(id, "id", real_id);
|
||||||
|
|
||||||
|
cJSON* actions_a = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(id, "actions", actions_a);
|
||||||
|
|
||||||
|
cJSON* actions_b = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(actions_a, actions_b);
|
||||||
|
|
||||||
|
cJSON* type = cJSON_CreateString(type_a);
|
||||||
|
cJSON_AddItemToObject(actions_b, "type", type);
|
||||||
|
|
||||||
|
cJSON_AddItemToObject(actions_b, "state", state_a);
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *yan_on_off_lampochka(char* id_dev, char on_off){
|
||||||
|
char *string = NULL;
|
||||||
|
char type_a[] = "devices.capabilities.on_off"; // Операция проводимая
|
||||||
|
cJSON* state_a = cJSON_CreateObject();
|
||||||
|
|
||||||
|
cJSON* instance = cJSON_CreateString("on");
|
||||||
|
cJSON_AddItemToObject(state_a, "instance", instance);
|
||||||
|
|
||||||
|
cJSON* value = cJSON_CreateBool(on_off);
|
||||||
|
cJSON_AddItemToObject(state_a, "value", value);
|
||||||
|
cJSON* device = ya_json_hed(id_dev, type_a, state_a);
|
||||||
|
string = cJSON_Print(device);
|
||||||
|
end:
|
||||||
|
cJSON_Delete(device);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
char *yan_kelvin_lampochka(char* id_dev, int value_n){
|
||||||
|
char *string = NULL;
|
||||||
|
char type_a[] = "devices.capabilities.color_setting"; // Операция проводимая
|
||||||
|
cJSON* state_a = cJSON_CreateObject();
|
||||||
|
|
||||||
|
cJSON* instance = cJSON_CreateString("temperature_k");
|
||||||
|
cJSON_AddItemToObject(state_a, "instance", instance);
|
||||||
|
|
||||||
|
cJSON* value = cJSON_CreateNumber(value_n);
|
||||||
|
cJSON_AddItemToObject(state_a, "value", value);
|
||||||
|
cJSON* device = ya_json_hed(id_dev, type_a, state_a);
|
||||||
|
string = cJSON_Print(device);
|
||||||
|
end:
|
||||||
|
cJSON_Delete(device);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
char *yan_brightness(char* id_dev, char value_n){
|
||||||
|
char *string = NULL;
|
||||||
|
char type_a[] = "devices.capabilities.range"; // Операция проводимая
|
||||||
|
cJSON* state_a = cJSON_CreateObject();
|
||||||
|
|
||||||
|
cJSON* instance = cJSON_CreateString("brightness");
|
||||||
|
cJSON_AddItemToObject(state_a, "instance", instance);
|
||||||
|
|
||||||
|
cJSON* value = cJSON_CreateNumber(value_n);
|
||||||
|
cJSON_AddItemToObject(state_a, "value", value);
|
||||||
|
cJSON* device = ya_json_hed(id_dev, type_a, state_a);
|
||||||
|
string = cJSON_Print(device);
|
||||||
|
end:
|
||||||
|
cJSON_Delete(device);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
char *yan_rgb_lampochka(void){
|
||||||
|
char *string = NULL;
|
||||||
|
char idyan[] = "ff5e379a-03d9-42fc-a0e1-822a8310be92"; // ID сюда
|
||||||
|
char type_a[] = "devices.capabilities.color_setting"; // Операция проводимая
|
||||||
|
char region[] = "rus";
|
||||||
|
int value_n = 14210514;
|
||||||
|
size_t index = 0;
|
||||||
|
|
||||||
|
cJSON *objkt = cJSON_CreateObject();
|
||||||
|
|
||||||
|
cJSON *payload = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(objkt, "payload", payload);
|
||||||
|
cJSON *payload_a = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(payload, payload_a);
|
||||||
|
cJSON *devices = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(payload_a, "devices", devices);
|
||||||
|
cJSON *devices_a = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(devices, devices_a);
|
||||||
|
cJSON *id = cJSON_CreateString(idyan);
|
||||||
|
cJSON_AddItemToObject(devices_a, "id", id);
|
||||||
|
cJSON *custom_data = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(devices_a, "custom_data", custom_data);
|
||||||
|
cJSON *custom_data_a = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(custom_data, custom_data_a);
|
||||||
|
cJSON *api_location = cJSON_CreateString(region);
|
||||||
|
cJSON_AddItemToObject(custom_data_a,"api_location", api_location);
|
||||||
|
cJSON *capabilities = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(devices_a, "capabilities", capabilities);
|
||||||
|
cJSON *capabilities_a = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(capabilities, capabilities_a);
|
||||||
|
cJSON *type = cJSON_CreateString(type_a);
|
||||||
|
cJSON_AddItemToObject(capabilities_a, "type", type);
|
||||||
|
cJSON *state = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(capabilities_a, "state", state);
|
||||||
|
cJSON *state_a = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(state, state_a);
|
||||||
|
cJSON *instance = cJSON_CreateString("rgb");
|
||||||
|
cJSON_AddItemToObject(state_a, "instance", instance);
|
||||||
|
//cJSON *value = cJSON_C;
|
||||||
|
cJSON *value = cJSON_CreateNumber(value_n);
|
||||||
|
cJSON_AddItemToObject(state_a, "value", value);//reateNumber(value_n);
|
||||||
|
cJSON_AddItemToObject(state_a, "value", value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
string = cJSON_Print(objkt);
|
||||||
|
|
||||||
|
end:
|
||||||
|
cJSON_Delete(objkt);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *yan_hsv_lampochka(char* idyan, int h_a, char s_a, char v_a){
|
||||||
|
char *string = NULL;
|
||||||
|
//char idyan[] = "ff5e379a-03d9-42fc-a0e1-822a8310be92"; // ID сюда
|
||||||
|
char type_a[] = "devices.capabilities.color_setting"; // Операция проводимая
|
||||||
|
char region[] = "rus";
|
||||||
|
//int h_a = 125;
|
||||||
|
//int s_a = 20;
|
||||||
|
//int v_a = 100;
|
||||||
|
cJSON *devices = NULL;
|
||||||
|
cJSON *id = NULL;
|
||||||
|
cJSON *real_id = NULL;
|
||||||
|
cJSON *actions_a = NULL;
|
||||||
|
cJSON *actions_b = NULL;
|
||||||
|
cJSON *type = NULL;
|
||||||
|
cJSON *state_a = NULL;
|
||||||
|
cJSON *state_b = NULL;
|
||||||
|
cJSON *instance = NULL;
|
||||||
|
cJSON *value = NULL;
|
||||||
|
size_t index = 0;
|
||||||
|
|
||||||
|
cJSON *device = cJSON_CreateObject();
|
||||||
|
devices = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(device, "devices", devices);
|
||||||
|
|
||||||
|
id = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(devices, id);
|
||||||
|
|
||||||
|
real_id = cJSON_CreateString(idyan);
|
||||||
|
cJSON_AddItemToObject(id, "id", real_id);
|
||||||
|
|
||||||
|
actions_a = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(id, "actions", actions_a);
|
||||||
|
|
||||||
|
actions_b = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToArray(actions_a, actions_b);
|
||||||
|
|
||||||
|
type = cJSON_CreateString(type_a);
|
||||||
|
cJSON_AddItemToObject(actions_b, "type", type);
|
||||||
|
|
||||||
|
state_a = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToObject(actions_b, "state", state_a);
|
||||||
|
|
||||||
|
instance = cJSON_CreateString("hsv");
|
||||||
|
cJSON_AddItemToObject(state_a, "instance", instance);
|
||||||
|
|
||||||
|
cJSON *value_a = cJSON_CreateObject();
|
||||||
|
|
||||||
|
cJSON_AddItemToObject(state_a, "value", value_a);
|
||||||
|
|
||||||
|
cJSON_AddItemToArray(value, value_a);
|
||||||
|
|
||||||
|
cJSON *h = cJSON_CreateNumber(h_a);
|
||||||
|
cJSON_AddItemToObject(value_a, "h", h);
|
||||||
|
cJSON *s = cJSON_CreateNumber(s_a);
|
||||||
|
cJSON_AddItemToObject(value_a, "s", s);
|
||||||
|
cJSON *v = cJSON_CreateNumber(v_a);
|
||||||
|
cJSON_AddItemToObject(value_a, "v", v);
|
||||||
|
|
||||||
|
string = cJSON_Print(device);
|
||||||
|
|
||||||
|
end:
|
||||||
|
cJSON_Delete(device);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
1092
json/json.c
Normal file
1092
json/json.c
Normal file
File diff suppressed because it is too large
Load diff
165
json/json.h
Normal file
165
json/json.h
Normal file
|
|
@ -0,0 +1,165 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
typedef unsigned int bool;
|
||||||
|
#define true (1)
|
||||||
|
#define false (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define typed(name) name##_t
|
||||||
|
|
||||||
|
typedef const char *typed(json_string);
|
||||||
|
typedef bool typed(json_boolean);
|
||||||
|
|
||||||
|
typedef enum json_number_type_e typed(json_number_type);
|
||||||
|
typedef union json_number_value_u typed(json_number_value);
|
||||||
|
typedef signed long typed(json_number_long);
|
||||||
|
typedef double typed(json_number_double);
|
||||||
|
typedef struct json_number_s typed(json_number);
|
||||||
|
typedef enum json_element_type_e typed(json_element_type);
|
||||||
|
typedef union json_element_value_u typed(json_element_value);
|
||||||
|
typedef enum json_error_e typed(json_error);
|
||||||
|
typedef struct json_element_s typed(json_element);
|
||||||
|
typedef struct json_entry_s typed(json_entry);
|
||||||
|
typedef struct json_object_s typed(json_object);
|
||||||
|
typedef struct json_array_s typed(json_array);
|
||||||
|
|
||||||
|
#define result(name) name##_result_t
|
||||||
|
#define result_ok(name) name##_result_ok
|
||||||
|
#define result_err(name) name##_result_err
|
||||||
|
#define result_is_ok(name) name##_result_is_ok
|
||||||
|
#define result_is_err(name) name##_result_is_err
|
||||||
|
#define result_unwrap(name) name##_result_unwrap
|
||||||
|
#define result_unwrap_err(name) name##_result_unwrap_err
|
||||||
|
#define result_map_err(outer_name, inner_name, value) \
|
||||||
|
result_err(outer_name)(result_unwrap_err(inner_name)(value))
|
||||||
|
#define result_try(outer_name, inner_name, lvalue, rvalue) \
|
||||||
|
result(inner_name) lvalue##_result = rvalue; \
|
||||||
|
if (result_is_err(inner_name)(&lvalue##_result)) \
|
||||||
|
return result_map_err(outer_name, inner_name, &lvalue##_result); \
|
||||||
|
const typed(inner_name) lvalue = result_unwrap(inner_name)(&lvalue##_result);
|
||||||
|
#define declare_result_type(name) \
|
||||||
|
typedef struct name##_result_s { \
|
||||||
|
typed(json_boolean) is_ok; \
|
||||||
|
union { \
|
||||||
|
typed(name) value; \
|
||||||
|
typed(json_error) err; \
|
||||||
|
} inner; \
|
||||||
|
} result(name); \
|
||||||
|
result(name) result_ok(name)(typed(name)); \
|
||||||
|
result(name) result_err(name)(typed(json_error)); \
|
||||||
|
typed(json_boolean) result_is_ok(name)(result(name) *); \
|
||||||
|
typed(json_boolean) result_is_err(name)(result(name) *); \
|
||||||
|
typed(name) result_unwrap(name)(result(name) *); \
|
||||||
|
typed(json_error) result_unwrap_err(name)(result(name) *);
|
||||||
|
|
||||||
|
enum json_element_type_e {
|
||||||
|
JSON_ELEMENT_TYPE_STRING = 0,
|
||||||
|
JSON_ELEMENT_TYPE_NUMBER,
|
||||||
|
JSON_ELEMENT_TYPE_OBJECT,
|
||||||
|
JSON_ELEMENT_TYPE_ARRAY,
|
||||||
|
JSON_ELEMENT_TYPE_BOOLEAN,
|
||||||
|
JSON_ELEMENT_TYPE_NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
enum json_number_type_e {
|
||||||
|
JSON_NUMBER_TYPE_LONG = 0,
|
||||||
|
JSON_NUMBER_TYPE_DOUBLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
union json_number_value_u {
|
||||||
|
typed(json_number_long) as_long;
|
||||||
|
typed(json_number_double) as_double;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct json_number_s {
|
||||||
|
typed(json_number_type) type;
|
||||||
|
typed(json_number_value) value;
|
||||||
|
};
|
||||||
|
|
||||||
|
union json_element_value_u {
|
||||||
|
typed(json_string) as_string;
|
||||||
|
typed(json_number) as_number;
|
||||||
|
typed(json_object) * as_object;
|
||||||
|
typed(json_array) * as_array;
|
||||||
|
typed(json_boolean) as_boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct json_element_s {
|
||||||
|
typed(json_element_type) type;
|
||||||
|
typed(json_element_value) value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct json_entry_s {
|
||||||
|
typed(json_string) key;
|
||||||
|
typed(json_element) element;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct json_object_s {
|
||||||
|
typed(size) count;
|
||||||
|
typed(json_entry) * *entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct json_array_s {
|
||||||
|
typed(size) count;
|
||||||
|
typed(json_element) * elements;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum json_error_e {
|
||||||
|
JSON_ERROR_EMPTY = 0,
|
||||||
|
JSON_ERROR_INVALID_TYPE,
|
||||||
|
JSON_ERROR_INVALID_KEY,
|
||||||
|
JSON_ERROR_INVALID_VALUE
|
||||||
|
};
|
||||||
|
|
||||||
|
declare_result_type(json_element_type);
|
||||||
|
declare_result_type(json_element_value);
|
||||||
|
declare_result_type(json_element);
|
||||||
|
declare_result_type(json_entry);
|
||||||
|
declare_result_type(json_string);
|
||||||
|
declare_result_type(size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Parses a JSON string into a JSON element {json_element_t}
|
||||||
|
* with a fallible `result` type
|
||||||
|
*
|
||||||
|
* @param json_str The raw JSON string
|
||||||
|
* @return The parsed {json_element_t} wrapped in a `result` type
|
||||||
|
*/
|
||||||
|
result(json_element) json_parse(typed(json_string) json_str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tries to get the element by key. If not found, returns
|
||||||
|
* a {JSON_ERROR_INVALID_KEY} error
|
||||||
|
*
|
||||||
|
* @param object The object to find the key in
|
||||||
|
* @param key The key of the element to be found
|
||||||
|
* @return Either a {json_element_t} or {json_error_t}
|
||||||
|
*/
|
||||||
|
result(json_element)
|
||||||
|
json_object_find(typed(json_object) * object, typed(json_string) key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Prints a JSON element {json_element_t} with proper
|
||||||
|
* indentation
|
||||||
|
*
|
||||||
|
* @param indent The number of spaces to indent each level by
|
||||||
|
*/
|
||||||
|
void json_print(typed(json_element) * element, int indent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees a JSON element {json_element_t} from memory
|
||||||
|
*
|
||||||
|
* @param element The JSON element {json_element_t} to free
|
||||||
|
*/
|
||||||
|
void json_free(typed(json_element) * element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a string representation of JSON error {json_error_t} type
|
||||||
|
*
|
||||||
|
* @param error The JSON error enum {json_error_t} type
|
||||||
|
* @return The string representation
|
||||||
|
*/
|
||||||
|
typed(json_string) json_error_to_string(typed(json_error) error);
|
||||||
298
main.c
Normal file
298
main.c
Normal file
|
|
@ -0,0 +1,298 @@
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "api.h"
|
||||||
|
|
||||||
|
|
||||||
|
void s(){
|
||||||
|
struct ya_api api = ya_api_create("Authorization: Bearer ---------------------------");
|
||||||
|
api.list_devices(&api);
|
||||||
|
printf("SAS@@@\n");
|
||||||
|
for (int i = 0; i != api.data.devs->len; i++){
|
||||||
|
struct ya_dev_struct *dev = api.data.devs->dev[i];
|
||||||
|
if (dev->capabilities != NULL && dev->capabilities->color_setting != NULL){
|
||||||
|
if (dev->capabilities->color_setting->color_target == 2){
|
||||||
|
struct color_struct *color = dev->capabilities->color_setting->color;
|
||||||
|
printf("%s\n", dev->name);
|
||||||
|
printf("HSV = %i %i %i\n", color->h, color->s, color->v);
|
||||||
|
//ya_dev_hsv(dev, 177,93,80); // hsv(177, 93%, 80%)
|
||||||
|
api.hsv(dev, 284,93,80);
|
||||||
|
}
|
||||||
|
if (dev->capabilities->color_setting->color_target == 1){
|
||||||
|
struct temperature_k_struct *temperature_k = dev->capabilities->color_setting->temperature_k;
|
||||||
|
printf("%s\n", dev->name);
|
||||||
|
printf("temperature_k = %i \n", temperature_k->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//api.data.devs->dev[i]->capabilities->color_setting->color_status;
|
||||||
|
}
|
||||||
|
//perror("Пиздец!!!\n");
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
for (int i = 0; i != api.data.groups->len; i++){
|
||||||
|
printf("ГРУППА: %s\n", api.data.groups->group[i]->name);
|
||||||
|
//printf("S%s\n", api.data.groups->group[i]->devs->len);
|
||||||
|
|
||||||
|
//printf("S%s\n", api.data.groups->group[i]->devs->dev[0]->id);
|
||||||
|
//printf("S%i\n", api.data.groups->group[i]->devs->len);
|
||||||
|
//printf(" ДЕВЫЙС: %s\n", api.data.groups->group[i]->devs->dev[0]->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ДЕВЫЙС %s: %s\n", dev->type, dev->name);
|
||||||
|
//api.brightness(dev, 100);
|
||||||
|
//dev->capabilities->color_setting->temperature_k->
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//api.on_off(3);
|
||||||
|
//api.list_devices(&api);
|
||||||
|
//printf("%s\n", ya_api_recvest("https://api.iot.yandex.net/v1.0/user/info", NULL, api.data.tocen));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//api.on_off(api.data.devs->dev[6]);
|
||||||
|
/*
|
||||||
|
for (int i = 0; i != api.data.groups->len; i++){
|
||||||
|
printf("ГРУППА: %s\n", api.data.groups->group[i]->name);
|
||||||
|
//printf("S%s\n", api.data.groups->group[i]->devs->len);
|
||||||
|
|
||||||
|
//printf("S%s\n", api.data.groups->group[i]->devs->dev[0]->id);
|
||||||
|
//printf("S%i\n", api.data.groups->group[i]->devs->len);
|
||||||
|
//printf(" ДЕВЫЙС: %s\n", api.data.groups->group[i]->devs->dev[0]->name);
|
||||||
|
for (int a = 0; a != api.data.groups->group[i]->devs->len; a++){
|
||||||
|
printf(" ДЕВАЙС: %s\n", api.data.groups->group[i]->devs->dev[a]->name);
|
||||||
|
printf(" Мин: %i\n", api.data.groups->group[i]->devs->dev[a]->capabilities->color_setting->temperature_k->min);
|
||||||
|
printf(" Макс: %i\n", api.data.groups->group[i]->devs->dev[a]->capabilities->color_setting->temperature_k->max);
|
||||||
|
//api.kelvin(api.data.groups->group[i]->devs->dev[a], 6500);
|
||||||
|
|
||||||
|
//api.on_off(api.data.groups->group[i]->devs->dev[a]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//api.data.devs
|
||||||
|
//struct ya_dev_struct* dev = api.data.devs->dev[0];
|
||||||
|
//for (int i = 0; i != api.data.devs->len; i++){
|
||||||
|
// printf("%s\n", api.data.devs->dev[i]->name);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//printf("%i\n", api.data.groups->len);
|
||||||
|
/*
|
||||||
|
printf("%s\n", api.data.groups->group[0]->id);
|
||||||
|
|
||||||
|
printf("%s\n", api.data.devs->dev[0]->groups->group[0]->name);
|
||||||
|
|
||||||
|
printf("%s\n", api.data.groups->group[0]->id);
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
api.on_off(api.data.devs->dev[0]);
|
||||||
|
api.on_off(api.data.devs->dev[3]);
|
||||||
|
api.on_off(api.data.devs->dev[4]);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//api.brightness(dev, 100);
|
||||||
|
//api.kelvin(dev, 4500);
|
||||||
|
//api.dev_id(dev);
|
||||||
|
|
||||||
|
//printf("%s\n", dev->loop->data.tocen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int sas_1(int a){};
|
||||||
|
int sas_2(int a, int b){};
|
||||||
|
int sas_3(int a, ...){
|
||||||
|
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
struct test{
|
||||||
|
int (*sas) (int, ...);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
/*
|
||||||
|
struct test t;
|
||||||
|
t.sas = sas_3;
|
||||||
|
int a = t.sas(1,2);
|
||||||
|
printf("%i\n", a);
|
||||||
|
*/
|
||||||
|
s();
|
||||||
|
|
||||||
|
|
||||||
|
//struct ya_api api = ya_api_create("TOKEN");
|
||||||
|
//api.data.ya_devs->dev[0]->ol->data.ya_devs->dev[0]->ol->data.ya_devs->dev[0]->ol->data.ya_devs->dev[0]->ol->
|
||||||
|
|
||||||
|
|
||||||
|
///struct ya_api api = ya_api_create("Authorization: Bearer --------------------------");
|
||||||
|
//api.list_devices(&api);
|
||||||
|
//api.brightness(api.data.ya_devs->dev[0], 100);
|
||||||
|
//api.kelvin(api.data.ya_devs->dev[0], 6500);
|
||||||
|
//api.on_off(api.data.ya_devs->dev[0]);
|
||||||
|
//printf("%s\n", api.data.ya_devs->dev[0]->ol->data.tocen);
|
||||||
|
|
||||||
|
|
||||||
|
//api.list_devices(&api);
|
||||||
|
//api.on_off(api.data.ya_devs->dev[0]);
|
||||||
|
//api.brightness(api.data.ya_devs->dev[0], 100);
|
||||||
|
|
||||||
|
//api.kelvin(api.data.ya_devs->dev[0], 6500);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//api.ya_dev_on_off(api.data.ya_devs->dev[0]);
|
||||||
|
//printf("%s\n", api.ya_dev_kelvin(api.data.ya_devs->dev[0], 6500));
|
||||||
|
//char* s = yan_brightness(api.data.ya_devs->dev[0]->id, 100);
|
||||||
|
//printf("%s\n",ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", s));
|
||||||
|
//printf("%s\n", api.ya_dev_kelvin(api.data.ya_devs->dev[0], 6500));
|
||||||
|
|
||||||
|
//printf("%s\n", api.data.ya_devs->dev[0]->capabilities->range->value);
|
||||||
|
//char* s = yan_hsv_lampochka(api.data.ya_devs->dev[0]->id, 0,0,100);
|
||||||
|
//printf("%s\n", s);
|
||||||
|
//printf("%s\n",ya_api_recvest("https://api.iot.yandex.net/v1.0/devices/actions", s));
|
||||||
|
/*
|
||||||
|
struct ya_api api = ya_api_create("Authorization: Bearer -----------------------------");
|
||||||
|
api.list_devices(&api);
|
||||||
|
printf("1\n");
|
||||||
|
//api.ya_dev_on_off(api.data.ya_devs->dev[5]);
|
||||||
|
printf("2\n");
|
||||||
|
//api.ya_dev_on_off(api.data.ya_devs->dev[0]);
|
||||||
|
printf("3\n");
|
||||||
|
api.ya_dev_kelvin(api.data.ya_devs->dev[0], 6500);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//printf("%s\n", ya_dev_kelvin(api.data.ya_devs->dev[0], 6500));
|
||||||
|
|
||||||
|
|
||||||
|
//printf("max: %i\n", api.data.ya_devs->dev[0]->capabilities->color_setting->temperature_k->max);
|
||||||
|
//printf("min: %i\n", api.data.ya_devs->dev[0]->capabilities->color_setting->temperature_k->min);
|
||||||
|
|
||||||
|
//api.ya_devs_free(&api);// dsdsdsd
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
for (int i = 0; i != s->len; i++){
|
||||||
|
printf("%s\n", s->dev[i]->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
api.ya_devs_free(s);
|
||||||
|
*/
|
||||||
|
//ya_devs_free(s);
|
||||||
|
//api.ya_dev_on_off(api.list_devices()->dev[0]);
|
||||||
|
//api.ya_devs_free();
|
||||||
|
|
||||||
|
|
||||||
|
//struct test api;
|
||||||
|
//ya_devs* devs = list_devices();
|
||||||
|
//ya_dev_on_off(devs->dev[0]);
|
||||||
|
//api.TEST = TEST;
|
||||||
|
//api.TEST();
|
||||||
|
//api.ya_dev_on_off(devs->dev[0]);
|
||||||
|
/*
|
||||||
|
ya_devs* devs = list_devices();
|
||||||
|
//printf("%s\n", devs->dev[0]->id);
|
||||||
|
for (int i = 0; i != devs->len; i++){
|
||||||
|
printf("%s\n", devs->dev[i]->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s\n", ya_dev_on_off(devs->dev[3]));
|
||||||
|
|
||||||
|
ya_devs_free(devs);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
char* sdsd = list_json();
|
||||||
|
printf("SSS%s\n", sdsd);
|
||||||
|
for (int i = 0; i != 1000000; i++){
|
||||||
|
ya_dev* devs = list_devices(sdsd);
|
||||||
|
for (int i = 0; i != devs->len; i++){
|
||||||
|
//printf("%s\n", devs->dev[i]->name);
|
||||||
|
}
|
||||||
|
ya_dev_free(devs);
|
||||||
|
//free(devs);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//struct ya_list sas;
|
||||||
|
//char* stdjson = list_json();
|
||||||
|
//ya_list* dev_id = list_devices_id();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//dev_off(id);
|
||||||
|
//dev_on(id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
ya_dev* devs = list_devices();
|
||||||
|
for (int i = 0; i != devs->len; i++){
|
||||||
|
if (devs->dev[i]->capabilities != NULL){ //printf("%i\n", devs->dev[i]->capabilities->color_setting->temperature_k->max);
|
||||||
|
if (devs->dev[i]->capabilities->color_setting != NULL){
|
||||||
|
printf("%s\n", devs->dev[i]->name);//
|
||||||
|
printf("%i\n", devs->dev[i]->capabilities->color_setting->temperature_k->value);
|
||||||
|
//printf("%i\n", devs->dev[i]->capabilities->color_setting->temperature_k->max);
|
||||||
|
}
|
||||||
|
//printf("%i\n", devs->dev[i]->capabilities->color_setting->temperature_k->max);
|
||||||
|
//printf("SAS\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(devs);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//printf("%i\n", devs->dev[2]->groups->len);
|
||||||
|
|
||||||
|
if (devs->dev[1]->groups != NULL){
|
||||||
|
|
||||||
|
printf("SASMMM\n");
|
||||||
|
//printf("%s\n", devs->dev[0]->groups->id[0]);
|
||||||
|
//printf("%s\n", devs->dev[0]->groups->len);
|
||||||
|
}
|
||||||
|
for (int i = 0; i != devs->len; i++){
|
||||||
|
printf("id: %s\t name: %s\n",devs->dev[i]->id, devs->dev[i]->name);
|
||||||
|
//if (devs->dev[0]->groups != NULL) printf("SAS\n");
|
||||||
|
|
||||||
|
if (devs->dev[i]->groups != NULL){
|
||||||
|
for (int n = 0; n != devs->dev[i]->groups->len; n++) printf("%s\n", devs->dev[i]->groups->id[n]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
ya_list* dev_id = list_devices_id();
|
||||||
|
|
||||||
|
for (int i = 0; i != dev_id->len; i++){
|
||||||
|
printf("%s\n", dev_id->id[i]);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
3
yandex_smart_home_api_C.kdev4
Normal file
3
yandex_smart_home_api_C.kdev4
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
[Project]
|
||||||
|
Name=yandex_smart_home_api_C
|
||||||
|
Manager=KDevCMakeManager
|
||||||
Loading…
Add table
Add a link
Reference in a new issue