Update
parent
696bb2a15b
commit
ad48fba62f
|
@ -138,6 +138,8 @@ sprinklerd/zone/1/set 1
|
||||||
sprinklerd/zone/zall/set 1 // Cycle all zones using default runtimes.
|
sprinklerd/zone/zall/set 1 // Cycle all zones using default runtimes.
|
||||||
sprinklerd/24hdelay/set 1
|
sprinklerd/24hdelay/set 1
|
||||||
sprinklerd/calendar/set 1
|
sprinklerd/calendar/set 1
|
||||||
|
sprinklerd/chanceofrain/set 29 // % chance of rain for today
|
||||||
|
sprinklerd/raintotal/set 0.3 // Set rain total in inches.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
1
config.c
1
config.c
|
@ -255,6 +255,7 @@ void readCfg(char *inifile)
|
||||||
_sdconfig_.dzidx_24hdelay = ini_getl("SPRINKLERD", "DZIDX_24HDELAY", 0, inifile);
|
_sdconfig_.dzidx_24hdelay = ini_getl("SPRINKLERD", "DZIDX_24HDELAY", 0, inifile);
|
||||||
_sdconfig_.dzidx_allzones = ini_getl("SPRINKLERD", "DZIDX_ALL_ZONES", 0, inifile);
|
_sdconfig_.dzidx_allzones = ini_getl("SPRINKLERD", "DZIDX_ALL_ZONES", 0, inifile);
|
||||||
_sdconfig_.dzidx_status = ini_getl("SPRINKLERD", "DZIDX_STATUS", 0, inifile);
|
_sdconfig_.dzidx_status = ini_getl("SPRINKLERD", "DZIDX_STATUS", 0, inifile);
|
||||||
|
_sdconfig_.dzidx_rainsensor = ini_getl("SPRINKLERD", "DZIDX_RAINSENSOR", 0, inifile);
|
||||||
|
|
||||||
logMessage (LOG_INFO, "Name = %s\n", _sdconfig_.name);
|
logMessage (LOG_INFO, "Name = %s\n", _sdconfig_.name);
|
||||||
logMessage (LOG_INFO, "Port = %s\n", _sdconfig_.socket_port);
|
logMessage (LOG_INFO, "Port = %s\n", _sdconfig_.socket_port);
|
||||||
|
|
1
config.h
1
config.h
|
@ -70,6 +70,7 @@ struct sprinklerdcfg {
|
||||||
int dzidx_24hdelay;
|
int dzidx_24hdelay;
|
||||||
int dzidx_allzones;
|
int dzidx_allzones;
|
||||||
int dzidx_status;
|
int dzidx_status;
|
||||||
|
int dzidx_rainsensor;
|
||||||
bool enableMQTTdz;
|
bool enableMQTTdz;
|
||||||
bool enableMQTTaq;
|
bool enableMQTTaq;
|
||||||
int zones;
|
int zones;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#
|
#
|
||||||
darkskyAPI='0123456789abcdef9876543210fedcba'
|
darkskyAPI='0123456789abcdef9876543210fedcba'
|
||||||
location='42.3601,-71.0589'
|
location='42.3601,-71.0589'
|
||||||
|
|
||||||
probabilityOver=1.0 # Don't set delay from this script, use the SprinklerD config to decide if to set delay
|
probabilityOver=1.0 # Don't set delay from this script, use the SprinklerD config to decide if to set delay
|
||||||
sprinklerdEnableDelay="http://localhost/?type=option&option=24hdelay&state=reset"
|
sprinklerdEnableDelay="http://localhost/?type=option&option=24hdelay&state=reset"
|
||||||
sprinklerdProbability="http://localhost/?type=sensor&sensor=chanceofrain&value="
|
sprinklerdProbability="http://localhost/?type=sensor&sensor=chanceofrain&value="
|
||||||
|
@ -18,7 +19,7 @@ command -v curl >/dev/null 2>&1 || { echoerr "curl is not installed. Aborting!"
|
||||||
command -v jq >/dev/null 2>&1 || { echoerr "jq is not installed. Aborting!"; exit 1; }
|
command -v jq >/dev/null 2>&1 || { echoerr "jq is not installed. Aborting!"; exit 1; }
|
||||||
command -v bc >/dev/null 2>&1 || { echoerr "bc not installed. Aborting!"; exit 1; }
|
command -v bc >/dev/null 2>&1 || { echoerr "bc not installed. Aborting!"; exit 1; }
|
||||||
|
|
||||||
probability=$(curl -s "https://api.darksky.net/forecast/"$darkskyAPI"/"$location | jq '.["daily"].data[0].precipProbability' 2>/dev/null)
|
darkskyJSON=$(curl -s "https://api.darksky.net/forecast/"$darkskyAPI"/"$location)
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echoerr "Error reading DarkSkys URL, please check!"
|
echoerr "Error reading DarkSkys URL, please check!"
|
||||||
|
@ -26,6 +27,15 @@ if [ $? -ne 0 ]; then
|
||||||
exit 1;
|
exit 1;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
probability=$(echo $darkskyJSON | jq '.["daily"].data[0].precipProbability' )
|
||||||
|
|
||||||
|
#if [ $? -ne 0 ]; then
|
||||||
|
if [ "$probability" == "null" ]; then
|
||||||
|
echoerr "Error reading DarkSkys JSON, please check!"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
echomsg -n "Probability of rain today is "`echo "$probability * 100" | bc`"%"
|
echomsg -n "Probability of rain today is "`echo "$probability * 100" | bc`"%"
|
||||||
|
|
||||||
curl -s "$sprinklerdProbability`echo \"$probability * 100\" | bc`" > /dev/null
|
curl -s "$sprinklerdProbability`echo \"$probability * 100\" | bc`" > /dev/null
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
|
@ -226,7 +226,7 @@ int build_dz_status_message_JSON(char* buffer, int size, int idx, int nvalue, ch
|
||||||
return strlen(buffer);
|
return strlen(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parseJSONmqttrequest(const char *str, size_t len, int *idx, int *nvalue, char *svalue) {
|
bool parseJSONmqttrequest(const char *str, size_t len, int *idx, int *nvalue, char *svalue, const char *svalue_str) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
|
@ -252,7 +252,8 @@ bool parseJSONmqttrequest(const char *str, size_t len, int *idx, int *nvalue, ch
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (strncmp("\"svalue1\"", (char *)&str[i], 9) == 0) {
|
//} else if (strncmp("\"svalue1\"", (char *)&str[i], 9) == 0) {
|
||||||
|
} else if (strncmp(svalue_str, (char *)&str[i], 9) == 0) {
|
||||||
i = i + 9;
|
i = i + 9;
|
||||||
for (; str[i] != ',' && str[i] != '\0'; i++) {
|
for (; str[i] != ',' && str[i] != '\0'; i++) {
|
||||||
if (str[i] == ':') {
|
if (str[i] == ':') {
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
#define JSON_MQTT_MSG_SIZE 50
|
#define JSON_MQTT_MSG_SIZE 50
|
||||||
|
|
||||||
|
|
||||||
bool parseJSONmqttrequest(const char *str, size_t len, int *idx, int *nvalue, char *svalue);
|
//bool parseJSONmqttrequest(const char *str, size_t len, int *idx, int *nvalue, char *svalue);
|
||||||
|
bool parseJSONmqttrequest(const char *str, size_t len, int *idx, int *nvalue, char *svalue, const char *svalue_str);
|
||||||
int build_dz_mqtt_status_JSON(char* buffer, int size, int idx, int nvalue, float tvalue);
|
int build_dz_mqtt_status_JSON(char* buffer, int size, int idx, int nvalue, float tvalue);
|
||||||
int build_dz_status_message_JSON(char* buffer, int size, int idx, int nvalue, char *svalue);
|
int build_dz_status_message_JSON(char* buffer, int size, int idx, int nvalue, char *svalue);
|
||||||
int build_sprinkler_JSON(char* buffer, int size);
|
int build_sprinkler_JSON(char* buffer, int size);
|
||||||
|
|
|
@ -124,7 +124,7 @@ bool check_dz_cache(int idx, int value) {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
void urldecode(char *dst, const char *src)
|
void urldecode(char *dst, const char *src)
|
||||||
{
|
{
|
||||||
char a, b;
|
char a, b;
|
||||||
|
@ -161,7 +161,7 @@ void urldecode(char *dst, const char *src)
|
||||||
}
|
}
|
||||||
*dst++ = '\0';
|
*dst++ = '\0';
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
// Need to update network interface.
|
// Need to update network interface.
|
||||||
char *generate_mqtt_id(char *buf, int len) {
|
char *generate_mqtt_id(char *buf, int len) {
|
||||||
extern char *__progname; // glibc populates this
|
extern char *__progname; // glibc populates this
|
||||||
|
@ -317,6 +317,7 @@ void broadcast_sprinklerdstate(struct mg_connection *nc)
|
||||||
struct mg_connection *c;
|
struct mg_connection *c;
|
||||||
static char mqtt_topic[250];
|
static char mqtt_topic[250];
|
||||||
static char mqtt_msg[50];
|
static char mqtt_msg[50];
|
||||||
|
static char last_state_msg[50];
|
||||||
|
|
||||||
for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) {
|
for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) {
|
||||||
// Start from 0 since we publish master valve (just a temp measure)
|
// Start from 0 since we publish master valve (just a temp measure)
|
||||||
|
@ -359,8 +360,11 @@ void broadcast_sprinklerdstate(struct mg_connection *nc)
|
||||||
}
|
}
|
||||||
if (_sdconfig_.dzidx_status > 0) {
|
if (_sdconfig_.dzidx_status > 0) {
|
||||||
int value =sprinklerdstatus(mqtt_msg, 50);
|
int value =sprinklerdstatus(mqtt_msg, 50);
|
||||||
build_dz_status_message_JSON(mqtt_topic, 250, _sdconfig_.dzidx_status, value, mqtt_msg);
|
if (strcmp(last_state_msg, mqtt_msg) != 0) {
|
||||||
send_mqtt_msg(c, _sdconfig_.mqtt_dz_pub_topic, mqtt_topic);
|
build_dz_status_message_JSON(mqtt_topic, 250, _sdconfig_.dzidx_status, value, mqtt_msg);
|
||||||
|
send_mqtt_msg(c, _sdconfig_.mqtt_dz_pub_topic, mqtt_topic);
|
||||||
|
strcpy(last_state_msg, mqtt_msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -606,7 +610,7 @@ void action_domoticz_mqtt_message(struct mg_connection *nc, struct mg_mqtt_messa
|
||||||
int i;
|
int i;
|
||||||
char svalue[DZ_SVALUE_LEN];
|
char svalue[DZ_SVALUE_LEN];
|
||||||
|
|
||||||
if (parseJSONmqttrequest(msg->payload.p, msg->payload.len, &idx, &nvalue, svalue)) {
|
if (parseJSONmqttrequest(msg->payload.p, msg->payload.len, &idx, &nvalue, svalue, "\"svalue2\"")) {
|
||||||
if ( idx <= 0 || check_dz_cache(idx, nvalue))
|
if ( idx <= 0 || check_dz_cache(idx, nvalue))
|
||||||
return;
|
return;
|
||||||
if (idx == _sdconfig_.dzidx_calendar) {
|
if (idx == _sdconfig_.dzidx_calendar) {
|
||||||
|
@ -622,6 +626,9 @@ void action_domoticz_mqtt_message(struct mg_connection *nc, struct mg_mqtt_messa
|
||||||
} else if (idx == _sdconfig_.dzidx_allzones) {
|
} else if (idx == _sdconfig_.dzidx_allzones) {
|
||||||
zc_zone(zcALL, 0, (nvalue==DZ_ON?zcON:zcOFF), 0);
|
zc_zone(zcALL, 0, (nvalue==DZ_ON?zcON:zcOFF), 0);
|
||||||
logMessage(LOG_INFO, "Domoticz MQTT request to turn %s cycle all zones",(nvalue==DZ_ON?"ON":"OFF"));
|
logMessage(LOG_INFO, "Domoticz MQTT request to turn %s cycle all zones",(nvalue==DZ_ON?"ON":"OFF"));
|
||||||
|
} else if (idx == _sdconfig_.dzidx_rainsensor) {
|
||||||
|
logMessage(LOG_INFO, "Domoticz MQTT rain sensor update, total %s",svalue);
|
||||||
|
setTodayRainTotal(atof(svalue));
|
||||||
} else {
|
} else {
|
||||||
for (i=1; i <= _sdconfig_.zones ; i++)
|
for (i=1; i <= _sdconfig_.zones ; i++)
|
||||||
{
|
{
|
||||||
|
@ -648,8 +655,7 @@ void action_mqtt_message(struct mg_connection *nc, struct mg_mqtt_message *msg){
|
||||||
char *pt3 = NULL;
|
char *pt3 = NULL;
|
||||||
char *pt4 = NULL;
|
char *pt4 = NULL;
|
||||||
|
|
||||||
// NSF change 10 to strlen(_sdconfig_.mqtt_topic)+1 **** BUT TEST.***
|
for (i=strlen(_sdconfig_.mqtt_topic); i < msg->topic.len; i++) {
|
||||||
for (i=10; i < msg->topic.len; i++) {
|
|
||||||
if ( msg->topic.p[i] == '/' ) {
|
if ( msg->topic.p[i] == '/' ) {
|
||||||
if (pt2 == NULL) {
|
if (pt2 == NULL) {
|
||||||
pt2 = (char *)&msg->topic.p[++i];
|
pt2 = (char *)&msg->topic.p[++i];
|
||||||
|
@ -680,6 +686,8 @@ void action_mqtt_message(struct mg_connection *nc, struct mg_mqtt_message *msg){
|
||||||
|
|
||||||
logMessage(LOG_DEBUG, "MQTT: topic %.*s %.*s\n",msg->topic.len, msg->topic.p, msg->payload.len, msg->payload.p);
|
logMessage(LOG_DEBUG, "MQTT: topic %.*s %.*s\n",msg->topic.len, msg->topic.p, msg->payload.len, msg->payload.p);
|
||||||
|
|
||||||
|
logMessage(LOG_DEBUG, "MQTT: pt2 %s\n", pt2);
|
||||||
|
|
||||||
//logMessage(LOG_DEBUG, "MQTT: pt2 %.*s == %s %c\n", 4, pt2, strncmp(pt2, "zone", 4) == 0?"YES":"NO", pt2[4]);
|
//logMessage(LOG_DEBUG, "MQTT: pt2 %.*s == %s %c\n", 4, pt2, strncmp(pt2, "zone", 4) == 0?"YES":"NO", pt2[4]);
|
||||||
/*
|
/*
|
||||||
if (pt2 != NULL && pt3 != NULL && pt4 != NULL && strncmp(pt2, "zone", 4) == 0 && strncmp(pt4, "set", 3) == 0 ) {
|
if (pt2 != NULL && pt3 != NULL && pt4 != NULL && strncmp(pt2, "zone", 4) == 0 && strncmp(pt4, "set", 3) == 0 ) {
|
||||||
|
@ -691,6 +699,8 @@ void action_mqtt_message(struct mg_connection *nc, struct mg_mqtt_message *msg){
|
||||||
logMessage(LOG_WARNING, "MQTT: unknown zone %d\n",zone);
|
logMessage(LOG_WARNING, "MQTT: unknown zone %d\n",zone);
|
||||||
}
|
}
|
||||||
} else*/
|
} else*/
|
||||||
|
//setTodayRainTotal(atof(svalue));
|
||||||
|
|
||||||
if (pt2 != NULL && pt3 != NULL && pt4 != NULL && strncmp(pt2, "zone", 4) == 0 && strncmp(pt3, "duration", 8) == 0 && strncmp(pt4, "set", 3) == 0 ) {
|
if (pt2 != NULL && pt3 != NULL && pt4 != NULL && strncmp(pt2, "zone", 4) == 0 && strncmp(pt3, "duration", 8) == 0 && strncmp(pt4, "set", 3) == 0 ) {
|
||||||
int zone = atoi(&pt2[4]);
|
int zone = atoi(&pt2[4]);
|
||||||
if (zone > 0 && zone <= _sdconfig_.zones) {
|
if (zone > 0 && zone <= _sdconfig_.zones) {
|
||||||
|
@ -710,6 +720,14 @@ void action_mqtt_message(struct mg_connection *nc, struct mg_mqtt_message *msg){
|
||||||
} else if (pt2 != NULL && pt3 != NULL && strncmp(pt2, "cycleallzones", 13) == 0 && strncmp(pt3, "set", 3) == 0 ) {
|
} else if (pt2 != NULL && pt3 != NULL && strncmp(pt2, "cycleallzones", 13) == 0 && strncmp(pt3, "set", 3) == 0 ) {
|
||||||
zc_zone(zcALL, 0, status, 0);
|
zc_zone(zcALL, 0, status, 0);
|
||||||
logMessage(LOG_DEBUG, "MQTT: Cycle all zones %s\n",status==zcON?"ON":"OFF");
|
logMessage(LOG_DEBUG, "MQTT: Cycle all zones %s\n",status==zcON?"ON":"OFF");
|
||||||
|
} else if (pt2 != NULL && pt3 != NULL && strncmp(pt2, "raintotal", 9) == 0 && strncmp(pt3, "set", 3) == 0 ) {
|
||||||
|
float v = str2float(msg->payload.p, msg->payload.len);
|
||||||
|
logMessage(LOG_DEBUG, "MQTT: Rain total %.2f\n",v);
|
||||||
|
setTodayRainTotal(v);
|
||||||
|
} else if (pt2 != NULL && pt3 != NULL && strncmp(pt2, "chanceofrain", 12) == 0 && strncmp(pt3, "set", 3) == 0 ) {
|
||||||
|
int v = str2int(msg->payload.p, msg->payload.len);
|
||||||
|
logMessage(LOG_DEBUG, "MQTT: Chance of rain %d%%\n",v);
|
||||||
|
setTodayChanceOfRain(v);
|
||||||
} else if (pt2 != NULL && pt3 != NULL && strncmp(pt2, "zone", 4) == 0 && strncmp(pt3, "set", 3) == 0 ) {
|
} else if (pt2 != NULL && pt3 != NULL && strncmp(pt2, "zone", 4) == 0 && strncmp(pt3, "set", 3) == 0 ) {
|
||||||
int zone = atoi(&pt2[4]);
|
int zone = atoi(&pt2[4]);
|
||||||
if (zone > 0 && zone <= _sdconfig_.zones) {
|
if (zone > 0 && zone <= _sdconfig_.zones) {
|
||||||
|
|
Binary file not shown.
|
@ -18,6 +18,7 @@ LOG_LEVEL = NOTICE
|
||||||
#DZIDX_CALENDAR = 197
|
#DZIDX_CALENDAR = 197
|
||||||
#DZIDX_24HDELAY = 198
|
#DZIDX_24HDELAY = 198
|
||||||
#DZIDX_ALL_ZONES = 199
|
#DZIDX_ALL_ZONES = 199
|
||||||
|
#DZIDX_RAINSENSOR = 48
|
||||||
|
|
||||||
# Options for the below ZONE and GPIO configuration
|
# Options for the below ZONE and GPIO configuration
|
||||||
#
|
#
|
||||||
|
|
|
@ -8,16 +8,17 @@ CACHE = /var/cache/sprinklerd.cache
|
||||||
LOG_LEVEL = NOTICE
|
LOG_LEVEL = NOTICE
|
||||||
|
|
||||||
# mqtt stuff
|
# mqtt stuff
|
||||||
#MQTT_ADDRESS = trident:1883
|
MQTT_ADDRESS = trident:1883
|
||||||
#MQTT_USER = someusername
|
#MQTT_USER = someusername
|
||||||
#MQTT_PASSWD = somepassword
|
#MQTT_PASSWD = somepassword
|
||||||
#MQT_TOPIC = sprinklerd
|
MQT_TOPIC = sd_test
|
||||||
#MQTT_DZ_PUB_TOPIC = domoticz/in
|
MQTT_DZ_PUB_TOPIC = domoticz/in
|
||||||
#MQTT_DZ_SUB_TOPIC = domoticz/out
|
MQTT_DZ_SUB_TOPIC = domoticz/out
|
||||||
|
|
||||||
#DZIDX_CALENDAR = 197
|
DZIDX_CALENDAR = 197
|
||||||
#DZIDX_24HDELAY = 198
|
DZIDX_24HDELAY = 198
|
||||||
#DZIDX_ALL_ZONES = 199
|
DZIDX_ALL_ZONES = 199
|
||||||
|
DZIDX_RAINSENSOR = 48
|
||||||
|
|
||||||
# Options for the below ZONE and GPIO configuration
|
# Options for the below ZONE and GPIO configuration
|
||||||
#
|
#
|
||||||
|
|
14
sd_cron.c
14
sd_cron.c
|
@ -26,15 +26,21 @@ bool setTodayChanceOfRain(int percent)
|
||||||
|
|
||||||
bool setTodayRainTotal(float rain)
|
bool setTodayRainTotal(float rain)
|
||||||
{
|
{
|
||||||
_sdconfig_.todayRainTotal = rain;
|
if (_sdconfig_.todayRainTotal == rain)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
_sdconfig_.todayRainTotal = rain;
|
||||||
|
|
||||||
logMessage(LOG_DEBUG, "Today's rain total = %f\n",_sdconfig_.todayRainTotal);
|
logMessage(LOG_DEBUG, "Today's rain total = %f\n",_sdconfig_.todayRainTotal);
|
||||||
|
|
||||||
|
time_t now;
|
||||||
|
time(&now);
|
||||||
|
|
||||||
if (_sdconfig_.precipInchDelay2day > 0 && _sdconfig_.todayRainTotal >= _sdconfig_.precipInchDelay2day) {
|
if (_sdconfig_.precipInchDelay2day > 0 && _sdconfig_.todayRainTotal >= _sdconfig_.precipInchDelay2day) {
|
||||||
time_t now;
|
|
||||||
time(&now);
|
|
||||||
reset_delay24h_time(now + (DELAY24H_SEC * 2) ); // today + 2 days in seconds
|
reset_delay24h_time(now + (DELAY24H_SEC * 2) ); // today + 2 days in seconds
|
||||||
} else if (_sdconfig_.precipInchDelay1day > 0 && _sdconfig_.todayRainTotal >= _sdconfig_.precipInchDelay1day) {
|
} else if (_sdconfig_.precipInchDelay1day > 0 && _sdconfig_.todayRainTotal >= _sdconfig_.precipInchDelay1day) {
|
||||||
enable_delay24h(true);
|
//enable_delay24h(true);
|
||||||
|
reset_delay24h_time(now + DELAY24H_SEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
6
utils.c
6
utils.c
|
@ -328,7 +328,11 @@ int str2int(const char* str, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// NSF come back and do this correctly
|
||||||
|
float str2float(const char* str, int len)
|
||||||
|
{
|
||||||
|
return (float)strtod(str, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
1
utils.h
1
utils.h
|
@ -18,6 +18,7 @@ void logMessage(int level, char *format, ...);
|
||||||
int count_characters(const char *str, char character);
|
int count_characters(const char *str, char character);
|
||||||
void run_external(char *command, int state);
|
void run_external(char *command, int state);
|
||||||
int str2int(const char* str, int len);
|
int str2int(const char* str, int len);
|
||||||
|
float str2float(const char* str, int len);
|
||||||
//void readCfg (char *cfgFile);
|
//void readCfg (char *cfgFile);
|
||||||
int text2elevel(char* level);
|
int text2elevel(char* level);
|
||||||
char *elevel2text(int level);
|
char *elevel2text(int level);
|
||||||
|
|
|
@ -186,7 +186,7 @@
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
function addHeadIcon(rel) {
|
function addHeadIcon(rel) {
|
||||||
var image = 'data:image/png;base64,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';
|
var image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAACYCAMAAAAvHNATAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURSLQQaPgq8PixOft54bll0Cu3mFhYf///wAAAAaX1Eyw2sXV2PP19Im8zpbAzo7knN3j5NHa3Nff4L7R1fr7+1my1cfW2WG01aqqqnJycsHBwWxsbGm01I2NjWa000nzYgoAAAL5SURBVHja7dlte4IgFAZgLMGZVVpWVmv//2fOKtUZ4NGdkO16zrexHXZfvIMi8jQEYIABBhhggAEGGGCAAQYYYIABBhgnbLlaLFZL/2CpjMuQqXewRXyPhW+wrXzA5NYz2C5+xg4t9sfHmL+z0tt1bIqVf5kkfC1BrY0AW8k4lisuF7U2QaqJT0aurRe2rBYolt6k19YLS6olPeGA0Wv7uzB648+TZO6wK6nDNd3fpts+dTb4iRP8UDXFwdlyQVoSc1kNHpk7W2ApsY7rWHu1V+4b2HEqWLbLjKcxw4lMm8IMW0sZS/nSXUdLixlSeGGfj0EuP+lj7OuZ8vVO2LqafN0GMM9KYworrP73saSuY+YURljW+i8ZbeW3pfDBds1I0twftXulPcVFi/Gl8I4xzhTOWcmawrmOWcLJOjZqGXey8o/b+FzslV7dxG1RXJQ2TsW0sJP6MIQ6TQkrjK5SVkwIu3xY4jQhTNlgCjBPYbpTzTAY5Q1hMGyrPQcOgRHfEHpg3ZfepDo5J2NhiebsbXtP1sO6b+OmuwYdpqvB+gKvh3W/JphuZ3SYrgbrNwst7OX7i+k+S4dp3hDsX3mE9dKx63kBoMM0Ndi/i/2uxehb0pGlxchjjL6J84wx8qykH3uYZqV5HTvoDoovKKUu3UOPbiUcvo4ZV/4tacdUQ2tg3yuHwN60Vw46YyiGSv817NqFXT2BZZ0mU5knsOj8Q6bOkS+wKG8aTWV55A+sNQEUU4WAAQYYYIAB9rt9nGcHZ4RF17tMXaO3wILurwN6yam55Abj6rHAws5fByG9JC2bTKVDs9olNlg4a/84C4Wgl5zVY4ANy2pKrDARti5Y8zJbDCgpijFZdYkdJjbNTxtxD3JJno/Jqkt6YE3XB+Ej3VVJD6zu+tkz21lJH+zZ9fM621VJL+zR9RvRCicl/bBb1wdhO91JST+s7PrZj2w3JQTYNAEYYIAB9q9hk8Z7bkncARhggAEGGGCAAQYYYIABBhhggAFWxjcZXFfjMfI84gAAAABJRU5ErkJggg==';
|
||||||
var link = document.createElement('link');
|
var link = document.createElement('link');
|
||||||
link.rel = rel;
|
link.rel = rel;
|
||||||
link.type= 'image/png';
|
link.type= 'image/png';
|
||||||
|
|
Loading…
Reference in New Issue