Сделал yandex_smart_home_api на С

This commit is contained in:
Arseniy Romenskiy 2025-07-03 20:57:32 +03:00
commit 054540b4de
19 changed files with 6800 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
build/
*~

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "curl"]
path = curl
url = https://git.systemconnection.ru/romenskiy2012/curl.git

View 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
View file

@ -0,0 +1 @@
{}

1
.obsidian/appearance.json vendored Normal file
View file

@ -0,0 +1 @@
{}

30
.obsidian/core-plugins-migration.json vendored Normal file
View 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
View 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
View 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
View 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
View 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ДЕВС: %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ДЕВС %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
View 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

File diff suppressed because it is too large Load diff

300
cJSON/cJSON.h Normal file
View 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

@ -0,0 +1 @@
Subproject commit a88907fd96c946d17867a491b4cf7c72a1982be4

192
huiafsdwesdfg.h Normal file
View 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

File diff suppressed because it is too large Load diff

165
json/json.h Normal file
View 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
View 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;
}

View file

@ -0,0 +1,3 @@
[Project]
Name=yandex_smart_home_api_C
Manager=KDevCMakeManager