kopia lustrzana https://github.com/martin-ger/esp_mqtt
added vars as topics
rodzic
3117ba6b53
commit
4d941993f5
66
user/lang.c
66
user/lang.c
|
@ -434,27 +434,35 @@ int ICACHE_FLASH_ATTR parse_event(int next_token, bool * happend) {
|
|||
}
|
||||
|
||||
if (is_token(next_token, "topic")) {
|
||||
lang_debug("event topic\r\n");
|
||||
char *topic;
|
||||
int topic_len;
|
||||
Value_Type topic_type;
|
||||
int lr_token = next_token + 1;
|
||||
|
||||
lang_debug("event topic\r\n");
|
||||
in_topic_statement = true;
|
||||
|
||||
len_check(2);
|
||||
if (is_token(next_token + 1, "remote")) {
|
||||
if ((next_token = parse_value(next_token + 2, &topic, &topic_len, &topic_type)) == -1)
|
||||
return -1;
|
||||
|
||||
if (is_token(lr_token, "remote")) {
|
||||
if (interpreter_status != TOPIC_REMOTE)
|
||||
return next_token + 3;
|
||||
} else if (is_token(next_token + 1, "local")) {
|
||||
return next_token;
|
||||
} else if (is_token(lr_token, "local")) {
|
||||
if (interpreter_status != TOPIC_LOCAL)
|
||||
return next_token + 3;
|
||||
return next_token;
|
||||
} else {
|
||||
return syntax_error(next_token + 1, "'local' or 'remote' expected");
|
||||
}
|
||||
|
||||
*happend = Topics_matches(my_token[next_token + 2], true, interpreter_topic);
|
||||
*happend = Topics_matches(topic, true, interpreter_topic);
|
||||
|
||||
if (*happend)
|
||||
lang_info("topic %s %s %s match\r\n", my_token[next_token + 1],
|
||||
my_token[next_token + 2], interpreter_topic);
|
||||
lang_info("topic %s %s match\r\n", my_token[lr_token],
|
||||
topic, interpreter_topic);
|
||||
|
||||
return next_token + 3;
|
||||
return next_token;
|
||||
}
|
||||
|
||||
if (is_token(next_token, "timer")) {
|
||||
|
@ -589,50 +597,59 @@ int ICACHE_FLASH_ATTR parse_action(int next_token, bool doit) {
|
|||
}
|
||||
|
||||
else if (is_token(next_token, "subscribe")) {
|
||||
char *topic;
|
||||
int topic_len;
|
||||
Value_Type topic_type;
|
||||
bool retval;
|
||||
int rl_token = next_token + 1;
|
||||
|
||||
len_check(2);
|
||||
if ((next_token = parse_value(next_token + 2, &topic, &topic_len, &topic_type)) == -1)
|
||||
return -1;
|
||||
#ifdef MQTT_CLIENT
|
||||
if (is_token(next_token + 1, "remote")) {
|
||||
if (is_token(rl_token, "remote")) {
|
||||
if (doit && mqtt_connected) {
|
||||
retval = MQTT_Subscribe(&mqttClient, my_token[next_token + 2], 0);
|
||||
lang_info("subscribe remote %s %s\r\n", my_token[next_token + 2], retval ? "success" : "failed");
|
||||
retval = MQTT_Subscribe(&mqttClient, topic, 0);
|
||||
lang_info("subscribe remote %s %s\r\n", topic, retval ? "success" : "failed");
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
if (is_token(next_token + 1, "local")) {
|
||||
if (is_token(rl_token, "local")) {
|
||||
if (doit) {
|
||||
retval = MQTT_local_subscribe(my_token[next_token + 2], 0);
|
||||
lang_info("subscribe local %s %s\r\n", my_token[next_token + 2], retval ? "success" : "failed");
|
||||
retval = MQTT_local_subscribe(topic, 0);
|
||||
lang_info("subscribe local %s %s\r\n", topic, retval ? "success" : "failed");
|
||||
}
|
||||
} else {
|
||||
return syntax_error(next_token + 1, "'local' or 'remote' expected");
|
||||
}
|
||||
next_token += 3;
|
||||
}
|
||||
|
||||
else if (is_token(next_token, "unsubscribe")) {
|
||||
char *topic;
|
||||
int topic_len;
|
||||
Value_Type topic_type;
|
||||
bool retval;
|
||||
int rl_token = next_token + 1;
|
||||
|
||||
len_check(2);
|
||||
if ((next_token = parse_value(next_token + 2, &topic, &topic_len, &topic_type)) == -1)
|
||||
return -1;
|
||||
#ifdef MQTT_CLIENT
|
||||
if (is_token(next_token + 1, "remote")) {
|
||||
if (is_token(rl_token, "remote")) {
|
||||
if (doit && mqtt_connected) {
|
||||
retval = MQTT_UnSubscribe(&mqttClient, my_token[next_token + 2]);
|
||||
lang_info("unsubsrcibe remote %s %s\r\n", my_token[next_token + 2], retval ? "success" : "failed");
|
||||
retval = MQTT_UnSubscribe(&mqttClient, topic);
|
||||
lang_info("unsubsrcibe remote %s %s\r\n", topic, retval ? "success" : "failed");
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
if (is_token(next_token + 1, "local")) {
|
||||
if (is_token(rl_token, "local")) {
|
||||
if (doit) {
|
||||
retval = MQTT_local_unsubscribe(my_token[next_token + 2]);
|
||||
lang_info("unsubsrcibe local %s %s\r\n", my_token[next_token + 2], retval ? "success" : "failed");
|
||||
retval = MQTT_local_unsubscribe(topic);
|
||||
lang_info("unsubsrcibe local %s %s\r\n", topic, retval ? "success" : "failed");
|
||||
}
|
||||
} else {
|
||||
return syntax_error(next_token + 1, "'local' or 'remote' expected");
|
||||
}
|
||||
|
||||
next_token += 3;
|
||||
}
|
||||
|
||||
else if (is_token(next_token, "if")) {
|
||||
|
@ -1080,3 +1097,4 @@ int ICACHE_FLASH_ATTR interpreter_topic_received(const char *topic, const char *
|
|||
|
||||
return parse_statement(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -15,34 +15,40 @@ do
|
|||
gpio_out 12 $1
|
||||
gpio_out 13 not ($1)
|
||||
|
||||
publish local /martinshome/switch/1/status $1 retained
|
||||
publish remote /martinshome/switch/1/status $1 retained
|
||||
|
||||
% $2 is blink flag
|
||||
setvar $2=0
|
||||
|
||||
% $3 is the command topic
|
||||
setvar $3="/martinshome/switch/1/command"
|
||||
|
||||
% $4 is the status topic
|
||||
setvar $4="/martinshome/switch/1/status"
|
||||
|
||||
publish local $4 $1 retained
|
||||
publish remote $4 $1 retained
|
||||
|
||||
% local subscriptions once in 'init'
|
||||
subscribe local /martinshome/switch/1/command
|
||||
subscribe local $3
|
||||
|
||||
% Now the MQTT client init, this is done each time the client connects
|
||||
on mqttconnect
|
||||
do
|
||||
% remote subscriptions for each connection in 'mqttconnect'
|
||||
subscribe remote /martinshome/switch/1/command
|
||||
subscribe remote $3
|
||||
|
||||
% Now the events, checked whenever something happens
|
||||
|
||||
% Is there a remote command?
|
||||
on topic remote /martinshome/switch/1/command
|
||||
on topic remote $3
|
||||
do
|
||||
println "Received remote command: " | $this_data
|
||||
|
||||
% republish this locally - this does the action
|
||||
publish local /martinshome/switch/1/command $this_data
|
||||
publish local $3 $this_data
|
||||
|
||||
|
||||
% Is there a local command?
|
||||
on topic local /martinshome/switch/1/command
|
||||
on topic local $3
|
||||
do
|
||||
println "Received local command: " | $this_data
|
||||
|
||||
|
@ -68,8 +74,8 @@ do
|
|||
settimer 1 500
|
||||
endif
|
||||
|
||||
publish local /martinshome/switch/1/status $1 retained
|
||||
publish remote /martinshome/switch/1/status $1 retained
|
||||
publish local $4 $1 retained
|
||||
publish remote $4 $1 retained
|
||||
|
||||
|
||||
% The local pushbutton
|
||||
|
@ -78,7 +84,7 @@ do
|
|||
println "New state GPIO 0: " | $this_gpio
|
||||
if $this_gpio = 0 then
|
||||
setvar $2 = 0
|
||||
publish local /martinshome/switch/1/command "toggle"
|
||||
publish local $3 "toggle"
|
||||
endif
|
||||
|
||||
|
||||
|
@ -86,7 +92,7 @@ do
|
|||
on timer 1
|
||||
do
|
||||
if $2 = 1 then
|
||||
publish local /martinshome/switch/1/command "toggle"
|
||||
publish local $3 "toggle"
|
||||
|
||||
settimer 1 500
|
||||
endif
|
||||
|
@ -95,9 +101,9 @@ do
|
|||
% Switch on in the evening
|
||||
on clock 19:30:00
|
||||
do
|
||||
publish local /martinshome/switch/1/command "on"
|
||||
publish local $3 "on"
|
||||
|
||||
% Switch off at night
|
||||
on clock 01:00:00
|
||||
do
|
||||
publish local /martinshome/switch/1/command "off"
|
||||
publish local $3 "off"
|
||||
|
|
|
@ -40,7 +40,7 @@ typedef enum {SIG_DO_NOTHING=0, SIG_START_SERVER=1, SIG_UART0, SIG_TOPIC_RECEIVE
|
|||
#define MAX_SCRIPT_SIZE 0x1000
|
||||
#define MAX_TIMERS 4
|
||||
#define MAX_GPIOS 3
|
||||
#define MAX_VARS 6
|
||||
#define MAX_VARS 8
|
||||
#define MAX_VAR_LEN 64
|
||||
#define MAX_TIMESTAMPS 6
|
||||
|
||||
|
|
|
@ -365,7 +365,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) {
|
|||
|
||||
if (strcmp(tokens[0], "help") == 0) {
|
||||
os_sprintf(response,
|
||||
"show [config|stats|mqtt|script]\r\n|set [ssid|password|auto_connect|ap_ssid|ap_password|network|dns|ip|netmask|gw|ap_on|ap_open|speed|config_port|broker_user|broker_password] <val>\r\n|quit|save [config]|reset [factory]|lock [<password>]|unlock <password>");
|
||||
"show [config|stats|mqtt|script]\r\n|set [ssid|password|auto_connect|ap_ssid|ap_password|network|dns|ip|netmask|gw|ap_on|ap_open|speed|config_port|config_access|broker_user|broker_password] <val>\r\n|quit|save [config]|reset [factory]|lock [<password>]|unlock <password>");
|
||||
to_console(response);
|
||||
#ifdef SCRIPTED
|
||||
os_sprintf(response, "|script <port>");
|
||||
|
@ -962,6 +962,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) {
|
|||
|
||||
#ifdef SCRIPTED
|
||||
void ICACHE_FLASH_ATTR do_command(char *t1, char *t2, char *t3) {
|
||||
int len;
|
||||
|
||||
ringbuf_memcpy_into(console_rx_buffer, t1, os_strlen(t1));
|
||||
ringbuf_memcpy_into(console_rx_buffer, " ", 1);
|
||||
|
@ -969,7 +970,11 @@ void ICACHE_FLASH_ATTR do_command(char *t1, char *t2, char *t3) {
|
|||
ringbuf_memcpy_into(console_rx_buffer, " ", 1);
|
||||
ringbuf_memcpy_into(console_rx_buffer, t3, os_strlen(t3));
|
||||
console_handle_command(0);
|
||||
ringbuf_memcpy_from(tmp_buffer, console_tx_buffer, ringbuf_bytes_used(console_tx_buffer));
|
||||
len = ringbuf_bytes_used(console_tx_buffer);
|
||||
if (len >= sizeof(tmp_buffer))
|
||||
len = sizeof(tmp_buffer)-1;
|
||||
ringbuf_memcpy_from(tmp_buffer, console_tx_buffer, len);
|
||||
tmp_buffer[len] = '\0';
|
||||
os_printf("%s", tmp_buffer);
|
||||
}
|
||||
#endif
|
||||
|
|
Ładowanie…
Reference in New Issue