SprinklerD/hassio.c

187 lines
6.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include "mongoose.h"
#include "config.h"
#include "net_services.h"
#include "version.h"
//#define HASS_EXPIRE ""\"expire_after"\": 300,"
#define HASS_EXPIRE ""
#define HASS_DEVICE "\"identifiers\": " \
"[\"SprinklerD\"]," \
" \"sw_version\": \"" SD_VERSION "\"," \
" \"model\": \"Sprinkler Daemon\"," \
" \"name\": \"SprinklerD\"," \
" \"manufacturer\": \"SprinklerD\"," \
" \"suggested_area\": \"garden\""
#define HASS_AVAILABILITY "\"payload_available\" : \"1\"," \
"\"payload_not_available\" : \"0\"," \
"\"topic\": \"%s/" MQTT_LWM_TOPIC "\""
const char *HASSIO_TEXT_SENSOR_DISCOVER = "{"
"\"device\": {" HASS_DEVICE "},"
"\"availability\": {" HASS_AVAILABILITY "},"
"\"type\": \"sensor\","
"\"unique_id\": \"%s\","
"\"name\": \"%s\","
"\"state_topic\": \"%s/%s\","
"\"icon\": \"mdi:card-text\""
"}";
const char *HASSIO_SENSOR_DISCOVER = "{"
"\"device\": {" HASS_DEVICE "},"
"\"availability\": {" HASS_AVAILABILITY "},"
"\"type\": \"sensor\","
"\"unique_id\": \"%s\","
"\"name\": \"%s\","
"\"state_topic\": \"%s/%s\","
"\"value_template\": \"{{ value_json }}\","
"\"unit_of_measurement\": \"%s\","
"\"icon\": \"%s\""
"}";
const char *HASSIO_SWITCH_DISCOVER = "{"
"\"device\": {" HASS_DEVICE "},"
"\"availability\": {" HASS_AVAILABILITY "},"
"\"type\": \"switch\","
"\"unique_id\": \"%s\","
"\"name\": \"%s\","
"\"state_topic\": \"%s/%s\","
"\"command_topic\": \"%s/%s/set\","
"\"payload_on\": \"1\","
"\"payload_off\": \"0\""
"}";
const char *HASSIO_VALVE_DISCOVER = "{"
"\"device\": {" HASS_DEVICE "},"
"\"availability\": {" HASS_AVAILABILITY "},"
"\"type\": \"valve\","
"\"device_class\": \"water\","
"\"unique_id\": \"%s\"," // sprinklerd_zone_1
"\"name\": \"Zone %d (%s)\"," // 1 island
"\"state_topic\": \"%s/zone%d\"," // 1
"\"command_topic\": \"%s/zone%d/set\"," // 1
"\"value_template\": \"{%% set values = { '0':'closed', '1':'open'} %%}{{ values[value] if value in values.keys() else 'closed' }}\","
"\"payload_open\": \"1\","
"\"payload_close\": \"0\""
"}";
void publish_mqtt_hassio_discover(struct mg_connection *nc)
{
char msg[2048];
char topic[256];
char id[128];
int i;
sprintf(id,"sprinklerd_status");
sprintf(topic, "%s/sensor/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_TEXT_SENSOR_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"Status",
_sdconfig_.mqtt_topic, "status" );
send_mqtt_msg(nc, topic, msg);
sprintf(id,"sprinklerd_active_zone");
sprintf(topic, "%s/sensor/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_TEXT_SENSOR_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"Active Zone",
_sdconfig_.mqtt_topic, "active" );
send_mqtt_msg(nc, topic, msg);
sprintf(id,"sprinklerd_calendar");
sprintf(topic, "%s/switch/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_SWITCH_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"Calendar Schedule",
_sdconfig_.mqtt_topic, "calendar",
_sdconfig_.mqtt_topic, "calendar" );
send_mqtt_msg(nc, topic, msg);
sprintf(id,"sprinklerd_24hdelay");
sprintf(topic, "%s/switch/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_SWITCH_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"24 Hour rain delay",
_sdconfig_.mqtt_topic, "24hdelay",
_sdconfig_.mqtt_topic, "24hdelay" );
send_mqtt_msg(nc, topic, msg);
sprintf(id,"sprinklerd_cycleallzones");
sprintf(topic, "%s/switch/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_SWITCH_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"Cycle All Zones",
_sdconfig_.mqtt_topic, "cycleallzones",
_sdconfig_.mqtt_topic, "cycleallzones" );
send_mqtt_msg(nc, topic, msg);
sprintf(id,"sprinklerd_rainprobability");
sprintf(topic, "%s/sensor/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_SENSOR_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"Todays Rain Probability",
_sdconfig_.mqtt_topic, "chanceofrain",
"%",
"mdi:water-percent" );
send_mqtt_msg(nc, topic, msg);
sprintf(id,"sprinklerd_raintotal");
sprintf(topic, "%s/sensor/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_SENSOR_DISCOVER,
_sdconfig_.mqtt_topic,
id,
"Todays Rain Total",
_sdconfig_.mqtt_topic, "raintotal",
"\\\"",
"mdi:weather-hail" );
send_mqtt_msg(nc, topic, msg);
//for (i=(_sdconfig_.master_valve?0:1); i <= _sdconfig_.zones ; i++)
// Don't publish zome0/master valve to ha
for (i=1; i <= _sdconfig_.zones ; i++)
{
sprintf(id,"sprinklerd_zone_%d", _sdconfig_.zonecfg[i].zone);
sprintf(topic, "%s/valve/sprinklerd/%s/config", _sdconfig_.mqtt_ha_dis_topic, id);
sprintf(msg, HASSIO_VALVE_DISCOVER,
_sdconfig_.mqtt_topic,
id,
_sdconfig_.zonecfg[i].zone,
_sdconfig_.zonecfg[i].name,
_sdconfig_.mqtt_topic,_sdconfig_.zonecfg[i].zone,
_sdconfig_.mqtt_topic,_sdconfig_.zonecfg[i].zone
);
send_mqtt_msg(nc, topic, msg);
/*
length += sprintf(buffer+length, "{\"type\" : \"zone\", \"zone\": %d, \"name\": \"%s\", \"state\": \"%s\", \"duration\": %d, \"id\" : \"zone%d\" },",
_sdconfig_.zonecfg[i].zone,
_sdconfig_.zonecfg[i].name,
(digitalRead(_sdconfig_.zonecfg[i].pin)==_sdconfig_.zonecfg[i].on_state?"on":"off"),
_sdconfig_.zonecfg[i].default_runtime * 60,
_sdconfig_.zonecfg[i].zone);
*/
}
}