Esempio n. 1
0
int ICACHE_FLASH_ATTR http_relay_api_toggle(http_connection *c) {


	NODE_DBG("http_wifi_api_get_status");	
	

	//wait for whole body
	if(c->state <HTTPD_STATE_BODY_END)
		return HTTPD_CGI_MORE; 

	
	int ret = json_count_token(c->body.data,c->body.len);
	
	jsonPair fields[1]={
		{
			.key="relay",
			.value=NULL
		}
	};

	if(json_parse(&fields[0],1,c->body.data,c->body.len)){
		
		int relayNumber = atoi(fields[0].value);	

		if(relayNumber<0 || relayNumber >=relay_count()){
			http_response_BAD_REQUEST(c);
			NODE_DBG("Wrong relay");		
			return HTTPD_CGI_DONE;
		}

		unsigned status = relay_get_state(relayNumber);
		status = relay_toggle_state(relayNumber);

		//write headers
		http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE);	
		http_response_OK(c);

		write_json_object_start(c);
		write_json_pair_int(c,"relay",relayNumber);
		write_json_list_separator(c);
		write_json_pair_int(c,"state",status);
		write_json_object_end(c);

		return HTTPD_CGI_DONE;

	}
	else{
		http_response_BAD_REQUEST(c);		
		return HTTPD_CGI_DONE;
	}

	http_response_BAD_REQUEST(c);		
	return HTTPD_CGI_DONE;


}
Esempio n. 2
0
int ICACHE_FLASH_ATTR http_relay_api_toggle(http_connection *c) {


	NODE_DBG("http_wifi_api_get_status");	
	

	//wait for whole body
	if(c->state <HTTPD_STATE_BODY_END)
		return HTTPD_CGI_MORE; 

	//parse json
	cJSON * root = cJSON_Parse(c->body.data);
	if(root==NULL) goto badrequest;
	
	cJSON * relay = cJSON_GetObjectItem(root,"relay");
	if(relay==NULL) goto badrequest;


	int relayNumber = relay->valueint;
	cJSON_Delete(root);	

	if(relayNumber<0 || relayNumber >=relay_count()){
		http_response_BAD_REQUEST(c);
		NODE_DBG("Wrong relay");		
		return HTTPD_CGI_DONE;
	}
	else{
		//valid relay

		unsigned status = relay_get_state(relayNumber);
		status = relay_toggle_state(relayNumber);

		//write headers
		http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE);	
		http_response_OK(c);


		//create json
		root = cJSON_CreateObject();
		cJSON_AddNumberToObject(root,"relay",relayNumber);
		cJSON_AddNumberToObject(root,"state",status);

		http_write_json(c,root);

		//delete json struct
		cJSON_Delete(root);

		return HTTPD_CGI_DONE;

	}	

badrequest:
	http_response_BAD_REQUEST(c);
	return HTTPD_CGI_DONE;

}
Esempio n. 3
0
File: app.c Progetto: flo90/esp-ginx
static void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
	char *topicBuf = (char*)os_zalloc(topic_len+1),
			*dataBuf = (char*)os_zalloc(data_len+1);

	MQTT_Client* client = (MQTT_Client*)args;

	os_memcpy(topicBuf, topic, topic_len);
	topicBuf[topic_len] = 0;

	os_memcpy(dataBuf, data, data_len);
	dataBuf[data_len] = 0;

	MQTT_DBG("Receive topic: %s, data: %s ", topicBuf, dataBuf);

	os_free(topicBuf);
	os_free(dataBuf);

	// set relay
	int i;
	for(i=0;i<relay_count();i++){

		mqtt_relay *r = &relays[i];

		//compare topic
		if(os_strncmp(topic,r->topic,strlen(r->topic))==0){
			MQTT_DBG("Topic 1st part match");
			//check set suffix
			if(os_strncmp(topic+strlen(r->topic),MQTT_RELAY_SET_SUFIX,strlen(MQTT_RELAY_SET_SUFIX))==0)
			{
				MQTT_DBG("Topic 2nd part match");
				int state = data[0] - '0';

				if(state==0 || state == 1)
				{
					MQTT_DBG("Setting relay #%d to %d via MQTT", i, state);
					relay_set_state(i,state);
					break;
				}

				
			}
		} 
			

	}

	
}
Esempio n. 4
0
int ICACHE_FLASH_ATTR http_relay_api_status(http_connection *c) {


	NODE_DBG("http_wifi_api_get_status");
		
	//wait for whole body
	if(c->state <HTTPD_STATE_BODY_END)
		return HTTPD_CGI_MORE; 	

	//write headers
	http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE);	
	http_response_OK(c);

	write_json_object_start(c);
	write_json_key(c,"relays");
	write_json_object_separator(c);
	write_json_array_start(c);

	int i;
	for(i=0;i<relay_count();i++){

		if(i>0)
			write_json_list_separator(c);

		write_json_object_start(c);
		write_json_pair_int(c,"relay",i);
		write_json_list_separator(c);
		write_json_pair_int(c,"state",relay_get_state(i));
		write_json_object_end(c);

		
	}
	
	write_json_array_end(c);
	write_json_object_end(c);
	

			
	return HTTPD_CGI_DONE;


}
Esempio n. 5
0
File: app.c Progetto: flo90/esp-ginx
static void mqttConnectedCb(uint32_t *args)
{
	MQTT_Client* client = (MQTT_Client*)args;
	MQTT_DBG("MQTT: Connected");

	int i;
	for(i=0;i<relay_count();i++){

		char * setTopic = (char *)os_zalloc(strlen(relays[i].topic)+strlen(MQTT_RELAY_SET_SUFIX)+1);
		os_strcpy(setTopic,relays[i].topic);
		os_strcat(setTopic,MQTT_RELAY_SET_SUFIX);

		MQTT_Subscribe(client, setTopic, 1);

		os_free(setTopic);

		mqtt_relay_change_cb(i,-1); //force 1st publish
	}
	
	

}
Esempio n. 6
0
File: app.c Progetto: flo90/esp-ginx
void ICACHE_FLASH_ATTR mqtt_app_init(){
	

	//set relays
	int i;
	for(i=0;i<relay_count();i++){
		relays[i].id=i;		
		os_strcpy(relays[i].topic,"relay/");
		os_strcat(relays[i].topic,SERIAL_NUMBER"/");
		os_strcati(relays[i].topic,i);
	}

	//register listeners 
	relay_register_listener(mqtt_relay_change_cb);

	MQTT_InitConnection(&mqtt_client, MQTT_SERVER_IP, 1883, 0);
	MQTT_InitClient(&mqtt_client, SERIAL_NUMBER, NULL, NULL, 120, 1);

	MQTT_OnConnected(&mqtt_client, mqttConnectedCb);
	MQTT_OnDisconnected(&mqtt_client, mqttDisconnectedCb);
	MQTT_OnPublished(&mqtt_client, mqttPublishedCb);
	MQTT_OnData(&mqtt_client, mqttDataCb);
	
	//arm mqtt timer
	os_memset(&mqtt_timer,0,sizeof(os_timer_t));
	os_timer_disarm(&mqtt_timer);
	os_timer_setfn(&mqtt_timer, (os_timer_func_t *)mqtt_app_timer_cb, NULL);
	os_timer_arm(&mqtt_timer, 2000, 1);

	//arm sensor read timer
	os_memset(&sensor_read_timer,0,sizeof(os_timer_t));
	os_timer_disarm(&sensor_read_timer);
	os_timer_setfn(&sensor_read_timer, (os_timer_func_t *)sensor_read_timer_cb, NULL);
	os_timer_arm(&sensor_read_timer, 5000, 1);

}
Esempio n. 7
0
int ICACHE_FLASH_ATTR http_relay_api_status(http_connection *c) {


	NODE_DBG("http_wifi_api_get_status");
		
	//wait for whole body
	if(c->state <HTTPD_STATE_BODY_END)
		return HTTPD_CGI_MORE; 	

	//write headers
	http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE);	
	http_response_OK(c);

	cJSON *root, *relays, *fld;

	root = cJSON_CreateObject(); 
	cJSON_AddItemToObject(root, "relays", relays = cJSON_CreateArray());
	
	int i;
	for(i=0;i<relay_count();i++){

		cJSON_AddItemToArray(relays,fld=cJSON_CreateObject());
		cJSON_AddNumberToObject(fld,"relay",i);
		cJSON_AddNumberToObject(fld,"state",relay_get_state(i));
		
	}

	http_write_json(c,root);	

	//delete json struct
	cJSON_Delete(root);

	return HTTPD_CGI_DONE;


}