diff --git a/TC1/http_server/app_httpd.c b/TC1/http_server/app_httpd.c
index 9641d5b..23ca149 100644
--- a/TC1/http_server/app_httpd.c
+++ b/TC1/http_server/app_httpd.c
@@ -163,7 +163,7 @@ static int HttpGetTc1Status(httpd_request_t *req) {
user_config->ap_name, user_config->ap_key, MQTT_SERVER, MQTT_SERVER_PORT,
MQTT_SERVER_USR, MQTT_SERVER_PWD,
VERSION, ip_status.ip, ip_status.mask, ip_status.gateway, user_config->mqtt_report_freq,
- user_config->power_led_enabled, 0L,socket_names);
+ user_config->power_led_enabled, 0L,socket_names,childLockEnabled);
OSStatus err = kNoErr;
send_http(tc1_status, strlen(tc1_status), exit, &err);
@@ -213,6 +213,27 @@ static int HttpSetSocketName(httpd_request_t *req) {
return err;
}
+static int HttpSetChildLock(httpd_request_t *req) {
+ OSStatus err = kNoErr;
+
+ int buf_size = 32;
+ char *buf = malloc(buf_size);
+
+ err = httpd_get_data(req, buf, buf_size);
+ require_noerr(err, exit);
+ int enableLock;
+ sscanf(buf, "%d",&enableLock);
+ user_config->user[0] = enableLock;
+ childLockEnabled = enableLock;
+ mico_system_context_update(sys_config);
+ UserMqttSendChildLockState();
+ send_http("OK", 2, exit, &err);
+
+ exit:
+ if (buf) free(buf);
+ return err;
+}
+
static int HttpGetPowerInfo(httpd_request_t *req) {
OSStatus err = kNoErr;
char buf[16];
@@ -243,7 +264,7 @@ static int HttpGetPowerInfo(httpd_request_t *req) {
user_config->socket_names[4],
user_config->socket_names[5]);
sprintf(power_info_json, POWER_INFO_JSON, sockets, power_record.idx, PW_NUM, p_count, powers,
- up_time,user_config->power_led_enabled,RelayOut()?1:0,socket_names,user_config->p_count_1_day_ago,user_config->p_count_2_days_ago);
+ up_time,user_config->power_led_enabled,RelayOut()?1:0,socket_names,user_config->p_count_1_day_ago,user_config->p_count_2_days_ago,childLockEnabled);
send_http(power_info_json, strlen(power_info_json), exit, &err);
if (socket_names) free(socket_names);
exit:
@@ -546,6 +567,7 @@ const struct httpd_wsgi_call g_app_handlers[] = {
{"/led", HTTPD_HDR_DEFORT, 0, LedStatus, LedSetEnabled, NULL, NULL},
{"/socketAll", HTTPD_HDR_DEFORT, 0, NULL, TotalSocketSetEnabled, NULL, NULL},
{"/socketNames", HTTPD_HDR_DEFORT, 0, NULL, HttpSetSocketName, NULL, NULL},
+ {"/childLock", HTTPD_HDR_DEFORT, 0, NULL, HttpSetChildLock, NULL, NULL},
};
static int g_app_handlers_no = sizeof(g_app_handlers) / sizeof(struct httpd_wsgi_call);
diff --git a/TC1/http_server/app_httpd.h b/TC1/http_server/app_httpd.h
index 3b94c41..91fe06a 100644
--- a/TC1/http_server/app_httpd.h
+++ b/TC1/http_server/app_httpd.h
@@ -65,10 +65,11 @@
'reportFreq':'%d',\
'ledEnabled':%d,\
'up_time':%ld,\
- 'socketNames':'%s'\
+ 'socketNames':'%s',\
+ 'child_lock_enabled':%d\
}"
-#define POWER_INFO_JSON "{'sockets':'%s','idx':%d,'len':%d,'p_count':%ld,'powers':[%s],'up_time':'%s','led_enabled':%d,'total_switch_on':%d,'socketNames':'%s','p_count_today':%ld,'p_count_yesterday':%ld}"
+#define POWER_INFO_JSON "{'sockets':'%s','idx':%d,'len':%d,'p_count':%ld,'powers':[%s],'up_time':'%s','led_enabled':%d,'total_switch_on':%d,'socketNames':'%s','p_count_1_day_ago':%ld,'p_count_2_days_ago':%ld,'child_lock_enabled':%d}"
int AppHttpdStart(void);
diff --git a/TC1/http_server/web/index.html b/TC1/http_server/web/index.html
index 9d7c94e..8182c60 100644
--- a/TC1/http_server/web/index.html
+++ b/TC1/http_server/web/index.html
@@ -122,6 +122,18 @@
-->
-
+
+ 启用童锁
+
+
+
+
+
+ -
电源指示灯
@@ -696,7 +708,8 @@
//主页
Socket: {en: "Socket", cn: "插座"},
Led:{en: "PowerLed", cn: "电源指示灯"},
- SocketAll:{en: "Total switch", cn: "总开关"}
+ SocketAll:{en: "Total Switch", cn: "总开关"},
+ ChildLock:{en: "Child Lock", cn: "童锁"}
}
function ChangeLanguage(lang) {
if (lang == "jp") {
@@ -783,15 +796,15 @@
var names_arr = status.socketNames.split(",");
var switchTexts = document.querySelectorAll('.mdl-list__item-primary-content');
for (var i = 0; i < status_arr.length; i++) {
- var langSpan = switchTexts[i+2].querySelector('.lang');
- var indexSpan = switchTexts[i+2].querySelector('.socket-index');
+ var langSpan = switchTexts[i+3].querySelector('.lang');
+ var indexSpan = switchTexts[i+3].querySelector('.socket-index');
if (langSpan) langSpan.textContent = names_arr[i]; // 修改插座名称
if (indexSpan) indexSpan.textContent = ""; // 修改序号,可自定义起始数字
//checkboxs[i].checked = status_arr[i] == "1";
if (status_arr[i] == "1") {
- switch_lables[i+2].MaterialSwitch.on();
+ switch_lables[i+3].MaterialSwitch.on();
} else {
- switch_lables[i+2].MaterialSwitch.off();
+ switch_lables[i+3].MaterialSwitch.off();
}
}
@@ -856,17 +869,17 @@
var checkboxs = socket_ul.getElementsByClassName("mdl-switch__input");
var switch_lables = socket_ul.getElementsByClassName("mdl-switch");
$(".mdl-switch__input").on("click", function() {
- if("list-switch-all" == this.id){
+ if("list-switch-all" == this.id||"list-switch-child-lock"== this.id){
return;
}
var sockets_st = "";
- for (var i = 2; i < checkboxs.length; i++) {
+ for (var i = 3; i < checkboxs.length; i++) {
sockets_st += (checkboxs[i].checked ? "1," : "0,");
}
HttpPost("/socket", function (re) {
}, sockets_st);
HttpPost("/led", function (re) {
- }, checkboxs[0].checked ? "1" : "0");
+ }, checkboxs[1].checked ? "1" : "0");
});
@@ -904,7 +917,11 @@
document.getElementById("list-switch-all").addEventListener("click", function() {
HttpPost("/socketAll", function (re) {
- }, checkboxs[1].checked ? "1" : "0");});
+ }, checkboxs[2].checked ? "1" : "0");});
+
+ document.getElementById("list-switch-child-lock").addEventListener("click", function() {
+ HttpPost("/childLock", function (re) {
+ }, checkboxs[0].checked ? "1" : "0");});
//Socket-end
@@ -1058,34 +1075,41 @@
$("#uptime").html(power.up_time);
var w_v = (17.1 * power.p_count) / 1000 / 36000;
- w.innerHTML = w_v.toFixed(2);
- var w_v_t = (17.1 * power.p_count_today) / 1000 / 36000;
- w_t.innerHTML = w_v_t.toFixed(2);
- var w_v_y = (17.1 * power.p_count_yesterday) / 1000 / 36000;
- w_y.innerHTML = w_v_y.toFixed(2);
- if (power.led_enabled == 1) {
+ w.innerHTML = w_v.toFixed(3);
+ var w_v_t = (17.1 * (power.p_count - power.p_count_1_day_ago)) / 1000 / 36000;
+ w_v_t = w_v_t < 0 ? 0 : w_v_t;
+ w_t.innerHTML = w_v_t.toFixed(3);
+ var w_v_y = (17.1 * power.p_count_1_day_ago - power.p_count_2_days_ago) / 1000 / 36000;
+ w_v_y = w_v_y < 0 ? 0 : w_v_t;
+ w_y.innerHTML = w_v_y.toFixed(3);
+ if (power.child_lock_enabled == 1) {
switch_lables[0].MaterialSwitch.on();
} else {
switch_lables[0].MaterialSwitch.off();
}
- if (power.total_switch_on == 1) {
+ if (power.led_enabled == 1) {
switch_lables[1].MaterialSwitch.on();
} else {
switch_lables[1].MaterialSwitch.off();
+ }
+ if (power.total_switch_on == 1) {
+ switch_lables[2].MaterialSwitch.on();
+ } else {
+ switch_lables[2].MaterialSwitch.off();
}
var status_arr = power.sockets.split(",");
var names_arr = power.socketNames.split(",");
var switchTexts = document.querySelectorAll('.mdl-list__item-primary-content');
for (var i = 0; i < status_arr.length; i++) {
//checkboxs[i].checked = status_arr[i] == "1";
- var langSpan = switchTexts[i+2].querySelector('.lang');
- var indexSpan = switchTexts[i+2].querySelector('.socket-index');
+ var langSpan = switchTexts[i+3].querySelector('.lang');
+ var indexSpan = switchTexts[i+3].querySelector('.socket-index');
if (langSpan) langSpan.textContent = names_arr[i]; // 修改插座名称
if (indexSpan) indexSpan.textContent = ""; // 修改序号,可自定义起始数字
if (status_arr[i] == "1") {
- switch_lables[i+2].MaterialSwitch.on();
+ switch_lables[i+3].MaterialSwitch.on();
} else {
- switch_lables[i+2].MaterialSwitch.off();
+ switch_lables[i+3].MaterialSwitch.off();
}
}
diff --git a/TC1/main.c b/TC1/main.c
index 840318c..9d8653f 100644
--- a/TC1/main.c
+++ b/TC1/main.c
@@ -145,6 +145,7 @@ int application_start(void) {
}
MicoSysLed(0);
+ childLockEnabled = (int)user_config->user[0];
if (user_config->version != USER_CONFIG_VERSION) { tc1_log("WARNGIN: user params restored!");
err = mico_system_context_restore(sys_config);
require_noerr(err, exit);
diff --git a/TC1/main.h b/TC1/main.h
index ee47a26..d42f6c9 100644
--- a/TC1/main.h
+++ b/TC1/main.h
@@ -75,6 +75,7 @@ extern char str_mac[16];
extern system_config_t* sys_config;
extern user_config_t* user_config;
extern mico_gpio_t Relay[Relay_NUM];
+extern int childLockEnabled;
#endif
diff --git a/TC1/mqtt_server/user_mqtt_client.c b/TC1/mqtt_server/user_mqtt_client.c
index 117ddb5..44d9826 100644
--- a/TC1/mqtt_server/user_mqtt_client.c
+++ b/TC1/mqtt_server/user_mqtt_client.c
@@ -76,6 +76,7 @@ void UserMqttTimerFunc(void *arg) {
case 0:
UserMqttHassAutoLed();
UserMqttHassAutoTotalSocket();
+ UserMqttHassAutoChildLock();
break;
case 1:
case 2:
@@ -264,6 +265,7 @@ void MqttClientThread(mico_thread_arg_t arg) {
UserMqttSendLedState();
UserMqttSendTotalSocketState();
+ UserMqttSendChildLockState();
mico_init_timer(&timer_handle, 150, UserMqttTimerFunc, &arg);
registerMqttEvents();
@@ -411,6 +413,14 @@ void ProcessHaCmd(char *cmd) {
UserMqttSendSocketState(i);
}
UserMqttSendTotalSocketState();
+ }else if (strcmp(cmd, "set childLock") == ' ') {
+ int on;
+ sscanf(cmd, "set childLock %s %d", mac, &on);
+ if (strcmp(mac, str_mac)) return;mqtt_log("set childLock on[%d]", on);
+ user_config->user[0] = on;
+ childLockEnabled = on;
+ UserMqttSendChildLockState();
+ mico_system_context_update(sys_config);
}
}
@@ -499,6 +509,21 @@ OSStatus UserMqttSendLedState(void) {
return oss_status;
}
+OSStatus UserMqttSendChildLockState(void) {
+ char *send_buf = malloc(64);
+ char *topic_buf = malloc(64);
+ OSStatus oss_status = kUnknownErr;
+ if (send_buf != NULL && topic_buf != NULL) {
+ sprintf(topic_buf, "homeassistant/switch/%s/childLock/state", str_mac);
+ sprintf(send_buf, "set childLock %s %d", str_mac, childLockEnabled);
+ oss_status = UserMqttSendTopic(topic_buf, send_buf, 1);
+ }
+ if (send_buf) free(send_buf);
+ if (topic_buf) free(topic_buf);
+
+ return oss_status;
+}
+
//hass mqtt鑷姩鍙戠幇鏁版嵁寮�鍏冲彂閫�
void UserMqttHassAuto(char socket_id) {
socket_id--;
@@ -561,6 +586,35 @@ void UserMqttHassAutoLed(void) {
free(topic_buf);
}
+void UserMqttHassAutoChildLock(void) {
+ char *send_buf = NULL;
+ char *topic_buf = NULL;
+ send_buf = (char *) malloc(600);
+ topic_buf = (char *) malloc(64);
+ if (send_buf != NULL && topic_buf != NULL) {
+ sprintf(topic_buf, "homeassistant/switch/%s/childLock/config", str_mac);
+ sprintf(send_buf,
+ "{\"name\":\"童锁\","
+ "\"uniq_id\":\"tc1_%s_child_lock\","
+ "\"object_id\":\"tc1_%s_child_lock\","
+ "\"stat_t\":\"homeassistant/switch/%s/childLock/state\","
+ "\"cmd_t\":\"device/ztc1/set\","
+ "\"pl_on\":\"set childLock %s 1\","
+ "\"pl_off\":\"set childLock %s 0\","
+ "\"device\":{"
+ "\"identifiers\":[\"tc1_%s\"],"
+ "\"name\":\"TC1\","
+ "\"model\":\"TC1\","
+ "\"manufacturer\":\"PHICOMM\"}}",
+ str_mac,str_mac,str_mac, str_mac, str_mac, str_mac);
+ UserMqttSendTopic(topic_buf, send_buf, 1);
+ }
+ if (send_buf)
+ free(send_buf);
+ if (topic_buf)
+ free(topic_buf);
+}
+
void UserMqttHassAutoTotalSocket(void) {
char *send_buf = NULL;
char *topic_buf = NULL;
diff --git a/TC1/mqtt_server/user_mqtt_client.h b/TC1/mqtt_server/user_mqtt_client.h
index 70f329e..f6e4fa6 100644
--- a/TC1/mqtt_server/user_mqtt_client.h
+++ b/TC1/mqtt_server/user_mqtt_client.h
@@ -31,6 +31,8 @@ extern OSStatus UserMqttSendSocketState(char socket_id);
extern OSStatus UserMqttSendLedState(void);
+extern OSStatus UserMqttSendChildLockState(void);
+
extern OSStatus UserMqttSendTotalSocketState(void);
extern void UserMqttHassAuto(char socket_id);
@@ -41,6 +43,8 @@ extern void UserMqttHassAutoPower(void);
extern void UserMqttHassAutoLed(void);
+extern void UserMqttHassAutoChildLock(void);
+
extern void UserMqttHassAutoTotalSocket(void);
extern void registerMqttEvents(void);
diff --git a/TC1/user_gpio.c b/TC1/user_gpio.c
index b455130..ca12571 100644
--- a/TC1/user_gpio.c
+++ b/TC1/user_gpio.c
@@ -122,6 +122,8 @@ uint16_t key_time = 0;
#define BUTTON_LONG_PRESS_TIME 10 //100ms*10=1s
static void KeyTimeoutHandler(void *arg) {
+ if(childLockEnabled)
+ return;
static char key_trigger, key_continue;
//按键扫描程序
char tmp = ~(0xfe | MicoGpioInputGet(Button));