mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 13:16:32 +00:00
Add support for Shelly 1PM Template
Add support for Shelly 1PM Template {"NAME":"Shelly 1PM","GPIO":[56,0,0,0,82,134,0,0,0,0,0,21,0],"FLAG":2,"BASE":18} (#5716)
This commit is contained in:
parent
1cdc04610e
commit
0b6c62f5f9
@ -1,6 +1,7 @@
|
||||
/* 6.5.0.10 20190513
|
||||
* Enable ADC0 by default in my_user_config.h (#5671)
|
||||
* Add user configurable ADC0 to Module and Template configuration compatible with current FLAG options (#5671)
|
||||
* Add support for Shelly 1PM Template {"NAME":"Shelly 1PM","GPIO":[56,0,0,0,82,134,0,0,0,0,0,21,0],"FLAG":2,"BASE":18} (#5716)
|
||||
*
|
||||
* 6.5.0.9 20190418
|
||||
* Add command SetOption63 0/1 to disable relay state feedback scan at restart (#5594, #5663)
|
||||
|
@ -966,7 +966,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
}
|
||||
}
|
||||
if (jsflg) {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
} else {
|
||||
Response_P(S_JSON_COMMAND_SVALUE, command, D_JSON_NOT_SUPPORTED);
|
||||
}
|
||||
@ -1044,7 +1044,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
}
|
||||
Response_P(PSTR("{"));
|
||||
MqttShowPWMState(); // Render the PWM status to MQTT
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
else if (CMND_PWMFREQUENCY == command_code) {
|
||||
if ((1 == payload) || ((payload >= PWM_MIN) && (payload <= PWM_MAX))) {
|
||||
@ -1765,7 +1765,7 @@ void PublishStatus(uint8_t payload)
|
||||
if ((0 == payload) || (8 == payload) || (10 == payload)) {
|
||||
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS10_SENSOR "\":"));
|
||||
MqttShowSensor();
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
if (8 == payload) {
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "8"));
|
||||
} else {
|
||||
@ -1776,7 +1776,7 @@ void PublishStatus(uint8_t payload)
|
||||
if ((0 == payload) || (11 == payload)) {
|
||||
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS11_STATUS "\":"));
|
||||
MqttShowState();
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "11"));
|
||||
}
|
||||
|
||||
@ -1792,7 +1792,7 @@ void MqttShowPWMState(void)
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
|
||||
void MqttShowState(void)
|
||||
@ -1859,7 +1859,7 @@ bool MqttShowSensor(void)
|
||||
if (strstr_P(mqtt_data, PSTR(D_JSON_TEMPERATURE)) != nullptr) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit());
|
||||
}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
|
||||
if (json_data_available) { XdrvCall(FUNC_SHOW_SENSOR); }
|
||||
return json_data_available;
|
||||
|
@ -889,6 +889,11 @@ int ResponseAppend_P(const char* format, ...) // Content send snprintf_P char d
|
||||
return len + mlen;
|
||||
}
|
||||
|
||||
int ResponseJsonEnd(void)
|
||||
{
|
||||
return ResponseAppend_P(PSTR("}"));
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* GPIO Module and Template management
|
||||
\*********************************************************************************************/
|
||||
|
@ -70,6 +70,9 @@ unsigned long energy_period = 0; // 12312312 Wh * 10^-2 (deca milli Watt hour
|
||||
float energy_power_last[3] = { 0 };
|
||||
uint8_t energy_power_delta = 0;
|
||||
|
||||
bool energy_voltage_available = true; // Enable if voltage is measured
|
||||
bool energy_current_available = true; // Enable if current is measured
|
||||
|
||||
bool energy_type_dc = false;
|
||||
bool energy_power_on = true;
|
||||
bool energy_min_power_flag = false;
|
||||
@ -228,7 +231,7 @@ void EnergyMarginCheck(void)
|
||||
jsonflg = true;
|
||||
}
|
||||
if (jsonflg) {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_MARGINS), MQTT_TELE_RETAIN);
|
||||
EnergyMqttShow();
|
||||
}
|
||||
@ -310,7 +313,7 @@ void EnergyMqttShow(void)
|
||||
tele_period = 2;
|
||||
EnergyShow(true);
|
||||
tele_period = tele_period_save;
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
||||
energy_power_delta = 0;
|
||||
}
|
||||
@ -549,19 +552,11 @@ void EnergySnsInit(void)
|
||||
|
||||
#ifdef USE_WEBSERVER
|
||||
const char HTTP_ENERGY_SNS1[] PROGMEM =
|
||||
"{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}"
|
||||
"{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"
|
||||
"{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}";
|
||||
|
||||
const char HTTP_ENERGY_SNS2[] PROGMEM =
|
||||
"{s}" D_POWERUSAGE_APPARENT "{m}%s " D_UNIT_VA "{e}"
|
||||
"{s}" D_POWERUSAGE_REACTIVE "{m}%s " D_UNIT_VAR "{e}"
|
||||
"{s}" D_POWER_FACTOR "{m}%s{e}";
|
||||
|
||||
const char HTTP_ENERGY_SNS3[] PROGMEM =
|
||||
"{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}";
|
||||
|
||||
const char HTTP_ENERGY_SNS4[] PROGMEM =
|
||||
const char HTTP_ENERGY_SNS2[] PROGMEM =
|
||||
"{s}" D_ENERGY_TODAY "{m}%s " D_UNIT_KILOWATTHOUR "{e}"
|
||||
"{s}" D_ENERGY_YESTERDAY "{m}%s " D_UNIT_KILOWATTHOUR "{e}"
|
||||
"{s}" D_ENERGY_TOTAL "{m}%s " D_UNIT_KILOWATTHOUR "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
|
||||
@ -570,7 +565,7 @@ const char HTTP_ENERGY_SNS4[] PROGMEM =
|
||||
void EnergyShow(bool json)
|
||||
{
|
||||
char speriod[20];
|
||||
char sfrequency[20];
|
||||
// char sfrequency[20];
|
||||
|
||||
bool show_energy_period = (0 == tele_period);
|
||||
|
||||
@ -581,36 +576,37 @@ void EnergyShow(bool json)
|
||||
char power_factor_chr[33];
|
||||
char frequency_chr[33];
|
||||
if (!energy_type_dc) {
|
||||
float apparent_power = energy_apparent_power;
|
||||
if (isnan(apparent_power)) {
|
||||
apparent_power = energy_voltage * energy_current;
|
||||
}
|
||||
if (apparent_power < energy_active_power) { // Should be impossible
|
||||
energy_active_power = apparent_power;
|
||||
}
|
||||
|
||||
if (isnan(power_factor)) {
|
||||
power_factor = (energy_active_power && apparent_power) ? energy_active_power / apparent_power : 0;
|
||||
if (power_factor > 1) power_factor = 1;
|
||||
}
|
||||
|
||||
float reactive_power = energy_reactive_power;
|
||||
if (isnan(reactive_power)) {
|
||||
reactive_power = 0;
|
||||
uint32_t difference = ((uint32_t)(apparent_power * 100) - (uint32_t)(energy_active_power * 100)) / 10;
|
||||
if ((energy_current > 0.005) && ((difference > 15) || (difference > (uint32_t)(apparent_power * 100 / 1000)))) {
|
||||
// calculating reactive power only if current is greater than 0.005A and
|
||||
// difference between active and apparent power is greater than 1.5W or 1%
|
||||
reactive_power = (float)(RoundSqrtInt((uint32_t)(apparent_power * apparent_power * 100) - (uint32_t)(energy_active_power * energy_active_power * 100))) / 10;
|
||||
if (energy_current_available && energy_voltage_available) {
|
||||
float apparent_power = energy_apparent_power;
|
||||
if (isnan(apparent_power)) {
|
||||
apparent_power = energy_voltage * energy_current;
|
||||
}
|
||||
if (apparent_power < energy_active_power) { // Should be impossible
|
||||
energy_active_power = apparent_power;
|
||||
}
|
||||
}
|
||||
|
||||
dtostrfd(apparent_power, Settings.flag2.wattage_resolution, apparent_power_chr);
|
||||
dtostrfd(reactive_power, Settings.flag2.wattage_resolution, reactive_power_chr);
|
||||
dtostrfd(power_factor, 2, power_factor_chr);
|
||||
if (isnan(power_factor)) {
|
||||
power_factor = (energy_active_power && apparent_power) ? energy_active_power / apparent_power : 0;
|
||||
if (power_factor > 1) power_factor = 1;
|
||||
}
|
||||
|
||||
float reactive_power = energy_reactive_power;
|
||||
if (isnan(reactive_power)) {
|
||||
reactive_power = 0;
|
||||
uint32_t difference = ((uint32_t)(apparent_power * 100) - (uint32_t)(energy_active_power * 100)) / 10;
|
||||
if ((energy_current > 0.005) && ((difference > 15) || (difference > (uint32_t)(apparent_power * 100 / 1000)))) {
|
||||
// calculating reactive power only if current is greater than 0.005A and
|
||||
// difference between active and apparent power is greater than 1.5W or 1%
|
||||
reactive_power = (float)(RoundSqrtInt((uint32_t)(apparent_power * apparent_power * 100) - (uint32_t)(energy_active_power * energy_active_power * 100))) / 10;
|
||||
}
|
||||
}
|
||||
|
||||
dtostrfd(apparent_power, Settings.flag2.wattage_resolution, apparent_power_chr);
|
||||
dtostrfd(reactive_power, Settings.flag2.wattage_resolution, reactive_power_chr);
|
||||
dtostrfd(power_factor, 2, power_factor_chr);
|
||||
}
|
||||
if (!isnan(energy_frequency)) {
|
||||
dtostrfd(energy_frequency, Settings.flag2.frequency_resolution, frequency_chr);
|
||||
snprintf_P(sfrequency, sizeof(sfrequency), PSTR(",\"" D_JSON_FREQUENCY "\":%s"), frequency_chr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -640,23 +636,42 @@ void EnergyShow(bool json)
|
||||
ResponseAppend_P(PSTR(",\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL_START_TIME "\":\"%s\",\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s%s,\"" D_JSON_POWERUSAGE "\":%s"),
|
||||
GetDateAndTime(DT_ENERGY).c_str(), energy_total_chr, energy_yesterday_chr, energy_daily_chr, (show_energy_period) ? speriod : "", active_power_chr);
|
||||
if (!energy_type_dc) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_APPARENT_POWERUSAGE "\":%s,\"" D_JSON_REACTIVE_POWERUSAGE "\":%s,\"" D_JSON_POWERFACTOR "\":%s%s"),
|
||||
apparent_power_chr, reactive_power_chr, power_factor_chr, (!isnan(energy_frequency)) ? sfrequency : "");
|
||||
if (energy_current_available && energy_voltage_available) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_APPARENT_POWERUSAGE "\":%s,\"" D_JSON_REACTIVE_POWERUSAGE "\":%s,\"" D_JSON_POWERFACTOR "\":%s"),
|
||||
apparent_power_chr, reactive_power_chr, power_factor_chr);
|
||||
}
|
||||
if (!isnan(energy_frequency)) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"), frequency_chr);
|
||||
}
|
||||
}
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_VOLTAGE "\":%s,\"" D_JSON_CURRENT "\":%s}"), voltage_chr, current_chr);
|
||||
if (energy_voltage_available) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_VOLTAGE "\":%s"), voltage_chr);
|
||||
}
|
||||
if (energy_current_available) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_CURRENT "\":%s"), current_chr);
|
||||
}
|
||||
ResponseJsonEnd();
|
||||
|
||||
#ifdef USE_DOMOTICZ
|
||||
if (show_energy_period) { // Only send if telemetry
|
||||
dtostrfd(energy_total * 1000, 1, energy_total_chr);
|
||||
DomoticzSensorPowerEnergy((int)energy_active_power, energy_total_chr); // PowerUsage, EnergyToday
|
||||
DomoticzSensor(DZ_VOLTAGE, voltage_chr); // Voltage
|
||||
DomoticzSensor(DZ_CURRENT, current_chr); // Current
|
||||
if (energy_voltage_available) {
|
||||
DomoticzSensor(DZ_VOLTAGE, voltage_chr); // Voltage
|
||||
}
|
||||
if (energy_current_available) {
|
||||
DomoticzSensor(DZ_CURRENT, current_chr); // Current
|
||||
}
|
||||
}
|
||||
#endif // USE_DOMOTICZ
|
||||
#ifdef USE_KNX
|
||||
if (show_energy_period) {
|
||||
KnxSensor(KNX_ENERGY_VOLTAGE, energy_voltage);
|
||||
KnxSensor(KNX_ENERGY_CURRENT, energy_current);
|
||||
if (energy_voltage_available) {
|
||||
KnxSensor(KNX_ENERGY_VOLTAGE, energy_voltage);
|
||||
}
|
||||
if (energy_current_available) {
|
||||
KnxSensor(KNX_ENERGY_CURRENT, energy_current);
|
||||
}
|
||||
KnxSensor(KNX_ENERGY_POWER, energy_active_power);
|
||||
if (!energy_type_dc) { KnxSensor(KNX_ENERGY_POWERFACTOR, power_factor); }
|
||||
KnxSensor(KNX_ENERGY_DAILY, energy_daily);
|
||||
@ -666,12 +681,22 @@ void EnergyShow(bool json)
|
||||
#endif // USE_KNX
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
WSContentSend_PD(HTTP_ENERGY_SNS1, voltage_chr, current_chr, active_power_chr);
|
||||
if (!energy_type_dc) {
|
||||
WSContentSend_PD(HTTP_ENERGY_SNS2, apparent_power_chr, reactive_power_chr, power_factor_chr);
|
||||
if (!isnan(energy_frequency)) { WSContentSend_PD(HTTP_ENERGY_SNS3, frequency_chr); }
|
||||
if (energy_voltage_available) {
|
||||
WSContentSend_PD(PSTR("{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}"), voltage_chr);
|
||||
}
|
||||
WSContentSend_PD(HTTP_ENERGY_SNS4, energy_daily_chr, energy_yesterday_chr, energy_total_chr);
|
||||
if (energy_current_available) {
|
||||
WSContentSend_PD(PSTR("{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"), current_chr);
|
||||
}
|
||||
WSContentSend_PD(PSTR("{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}"), active_power_chr);
|
||||
if (!energy_type_dc) {
|
||||
if (energy_current_available && energy_voltage_available) {
|
||||
WSContentSend_PD(HTTP_ENERGY_SNS1, apparent_power_chr, reactive_power_chr, power_factor_chr);
|
||||
}
|
||||
if (!isnan(energy_frequency)) {
|
||||
WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"), frequency_chr);
|
||||
}
|
||||
}
|
||||
WSContentSend_PD(HTTP_ENERGY_SNS2, energy_daily_chr, energy_yesterday_chr, energy_total_chr);
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
}
|
||||
|
@ -1558,7 +1558,7 @@ void LightState(uint8_t append)
|
||||
ResponseAppend_P(PSTR(",\"" D_CMND_FADE "\":\"%s\",\"" D_CMND_SPEED "\":%d,\"" D_CMND_LEDTABLE "\":\"%s\""),
|
||||
GetStateText(Settings.light_fade), Settings.light_speed, GetStateText(Settings.light_correction));
|
||||
} else {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -448,7 +448,7 @@ bool TimerCommand(void)
|
||||
if (!error) {
|
||||
Response_P(PSTR("{"));
|
||||
PrepShowTimer(index);
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
}
|
||||
else if (CMND_TIMERS == command_code) {
|
||||
|
@ -547,7 +547,7 @@ void RulesEvery100ms(void)
|
||||
tele_period = tele_period_save;
|
||||
if (strlen(mqtt_data)) {
|
||||
mqtt_data[0] = '{'; // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
RulesProcess();
|
||||
}
|
||||
}
|
||||
@ -1144,7 +1144,7 @@ bool RulesCommand(void)
|
||||
for (uint8_t i = 0; i < MAX_RULE_TIMERS; i++) {
|
||||
ResponseAppend_P(PSTR("%c\"T%d\":%d"), (i) ? ',' : '{', i +1, (rules_timer[i]) ? (rules_timer[i] - millis()) / 1000 : 0);
|
||||
}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
else if (CMND_EVENT == command_code) {
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
|
@ -127,58 +127,62 @@ void HlwEvery200ms(void)
|
||||
energy_active_power = 0;
|
||||
}
|
||||
|
||||
hlw_cf1_timer++;
|
||||
if (hlw_cf1_timer >= 8) {
|
||||
hlw_cf1_timer = 0;
|
||||
hlw_select_ui_flag = (hlw_select_ui_flag) ? 0 : 1;
|
||||
digitalWrite(pin[GPIO_NRG_SEL], hlw_select_ui_flag);
|
||||
if (pin[GPIO_NRG_CF1] < 99) {
|
||||
hlw_cf1_timer++;
|
||||
if (hlw_cf1_timer >= 8) {
|
||||
hlw_cf1_timer = 0;
|
||||
hlw_select_ui_flag = (hlw_select_ui_flag) ? 0 : 1;
|
||||
if (pin[GPIO_NRG_SEL] < 99) {
|
||||
digitalWrite(pin[GPIO_NRG_SEL], hlw_select_ui_flag);
|
||||
}
|
||||
|
||||
if (hlw_cf1_pulse_counter) {
|
||||
cf1_pulse_length = hlw_cf1_summed_pulse_length / hlw_cf1_pulse_counter;
|
||||
}
|
||||
if (hlw_cf1_pulse_counter) {
|
||||
cf1_pulse_length = hlw_cf1_summed_pulse_length / hlw_cf1_pulse_counter;
|
||||
}
|
||||
|
||||
#ifdef HLW_DEBUG
|
||||
// Debugging for calculating mean and median
|
||||
char stemp[100];
|
||||
stemp[0] = '\0';
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%s %d"), stemp, hlw_debug[i]);
|
||||
}
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
for (uint8_t j = i + 1; j < hlw_cf1_pulse_counter; j++) {
|
||||
if (hlw_debug[i] > hlw_debug[j]) { // Sort ascending
|
||||
std::swap(hlw_debug[i], hlw_debug[j]);
|
||||
// Debugging for calculating mean and median
|
||||
char stemp[100];
|
||||
stemp[0] = '\0';
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%s %d"), stemp, hlw_debug[i]);
|
||||
}
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
for (uint8_t j = i + 1; j < hlw_cf1_pulse_counter; j++) {
|
||||
if (hlw_debug[i] > hlw_debug[j]) { // Sort ascending
|
||||
std::swap(hlw_debug[i], hlw_debug[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
unsigned long median = hlw_debug[(hlw_cf1_pulse_counter +1) / 2];
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("NRG: power %d, ui %d, cnt %d, smpl%s, sum %d, mean %d, median %d"),
|
||||
hlw_cf_power_pulse_length, hlw_select_ui_flag, hlw_cf1_pulse_counter, stemp, hlw_cf1_summed_pulse_length, cf1_pulse_length, median);
|
||||
unsigned long median = hlw_debug[(hlw_cf1_pulse_counter +1) / 2];
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("NRG: power %d, ui %d, cnt %d, smpl%s, sum %d, mean %d, median %d"),
|
||||
hlw_cf_power_pulse_length, hlw_select_ui_flag, hlw_cf1_pulse_counter, stemp, hlw_cf1_summed_pulse_length, cf1_pulse_length, median);
|
||||
#endif
|
||||
|
||||
if (hlw_select_ui_flag == hlw_ui_flag) {
|
||||
hlw_cf1_voltage_pulse_length = cf1_pulse_length;
|
||||
if (hlw_select_ui_flag == hlw_ui_flag) {
|
||||
hlw_cf1_voltage_pulse_length = cf1_pulse_length;
|
||||
|
||||
if (hlw_cf1_voltage_pulse_length && energy_power_on) { // If powered on always provide voltage
|
||||
hlw_u = (hlw_voltage_ratio * Settings.energy_voltage_calibration) / hlw_cf1_voltage_pulse_length; // V *10
|
||||
energy_voltage = (float)hlw_u / 10;
|
||||
} else {
|
||||
energy_voltage = 0;
|
||||
}
|
||||
|
||||
if (hlw_cf1_voltage_pulse_length && energy_power_on) { // If powered on always provide voltage
|
||||
hlw_u = (hlw_voltage_ratio * Settings.energy_voltage_calibration) / hlw_cf1_voltage_pulse_length; // V *10
|
||||
energy_voltage = (float)hlw_u / 10;
|
||||
} else {
|
||||
energy_voltage = 0;
|
||||
hlw_cf1_current_pulse_length = cf1_pulse_length;
|
||||
|
||||
if (hlw_cf1_current_pulse_length && energy_active_power) { // No current if no power being consumed
|
||||
hlw_i = (hlw_current_ratio * Settings.energy_current_calibration) / hlw_cf1_current_pulse_length; // mA
|
||||
energy_current = (float)hlw_i / 1000;
|
||||
} else {
|
||||
energy_current = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
hlw_cf1_current_pulse_length = cf1_pulse_length;
|
||||
|
||||
if (hlw_cf1_current_pulse_length && energy_active_power) { // No current if no power being consumed
|
||||
hlw_i = (hlw_current_ratio * Settings.energy_current_calibration) / hlw_cf1_current_pulse_length; // mA
|
||||
energy_current = (float)hlw_i / 1000;
|
||||
} else {
|
||||
energy_current = 0;
|
||||
}
|
||||
|
||||
hlw_cf1_summed_pulse_length = 0;
|
||||
hlw_cf1_pulse_counter = 0;
|
||||
}
|
||||
hlw_cf1_summed_pulse_length = 0;
|
||||
hlw_cf1_pulse_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -214,10 +218,14 @@ void HlwSnsInit(void)
|
||||
hlw_current_ratio = HLW_IREF;
|
||||
}
|
||||
|
||||
pinMode(pin[GPIO_NRG_SEL], OUTPUT);
|
||||
digitalWrite(pin[GPIO_NRG_SEL], hlw_select_ui_flag);
|
||||
pinMode(pin[GPIO_NRG_CF1], INPUT_PULLUP);
|
||||
attachInterrupt(pin[GPIO_NRG_CF1], HlwCf1Interrupt, FALLING);
|
||||
if (pin[GPIO_NRG_SEL] < 99) {
|
||||
pinMode(pin[GPIO_NRG_SEL], OUTPUT);
|
||||
digitalWrite(pin[GPIO_NRG_SEL], hlw_select_ui_flag);
|
||||
}
|
||||
if (pin[GPIO_NRG_CF1] < 99) {
|
||||
pinMode(pin[GPIO_NRG_CF1], INPUT_PULLUP);
|
||||
attachInterrupt(pin[GPIO_NRG_CF1], HlwCf1Interrupt, FALLING);
|
||||
}
|
||||
pinMode(pin[GPIO_HLW_CF], INPUT_PULLUP);
|
||||
attachInterrupt(pin[GPIO_HLW_CF], HlwCfInterrupt, FALLING);
|
||||
}
|
||||
@ -232,14 +240,23 @@ void HlwDrvInit(void)
|
||||
hlw_model_type = 1; // HJL-01/BL0937
|
||||
}
|
||||
|
||||
hlw_ui_flag = 1; // Voltage on high
|
||||
if (pin[GPIO_NRG_SEL_INV] < 99) {
|
||||
pin[GPIO_NRG_SEL] = pin[GPIO_NRG_SEL_INV];
|
||||
pin[GPIO_NRG_SEL_INV] = 99;
|
||||
hlw_ui_flag = 0; // Voltage on low
|
||||
}
|
||||
if (pin[GPIO_HLW_CF] < 99) { // HLW8012 or HJL-01 based device
|
||||
|
||||
hlw_ui_flag = 1; // Voltage on high
|
||||
if (pin[GPIO_NRG_SEL_INV] < 99) {
|
||||
pin[GPIO_NRG_SEL] = pin[GPIO_NRG_SEL_INV];
|
||||
pin[GPIO_NRG_SEL_INV] = 99;
|
||||
hlw_ui_flag = 0; // Voltage on low
|
||||
}
|
||||
|
||||
if (99 == pin[GPIO_NRG_SEL]) {
|
||||
energy_current_available = false;
|
||||
}
|
||||
if (99 == pin[GPIO_NRG_CF1]) {
|
||||
energy_current_available = false;
|
||||
energy_voltage_available = false;
|
||||
}
|
||||
|
||||
if ((pin[GPIO_NRG_SEL] < 99) && (pin[GPIO_NRG_CF1] < 99) && (pin[GPIO_HLW_CF] < 99)) { // HLW8012 or HJL-01 based device
|
||||
energy_flg = XNRG_01;
|
||||
}
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ void CounterShow(bool json)
|
||||
}
|
||||
if (json) {
|
||||
if (header) {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -205,7 +205,7 @@ void Ds18x20Show(bool json)
|
||||
}
|
||||
if (json) {
|
||||
if (dsxflg) {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
}
|
||||
Ds18x20Search(); // Check for changes in sensors number
|
||||
|
@ -194,7 +194,7 @@ void Ads1115toJSON(char *comma_j)
|
||||
ResponseAppend_P(PSTR("%s\"A%d\":%d"), comma, i, ads1115_values[i]);
|
||||
comma = (char*)",";
|
||||
}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
|
||||
void Ads1115toString(uint8_t address)
|
||||
|
@ -118,7 +118,7 @@ void Ads1115Show(bool json)
|
||||
}
|
||||
if (json) {
|
||||
if (dsxflg) {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ void SenseairShow(bool json)
|
||||
if (senseair_type != 2) {
|
||||
ResponseAppend_P(PSTR("%s,\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s"), temperature, humidity);
|
||||
}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
#ifdef USE_DOMOTICZ
|
||||
if (0 == tele_period) DomoticzSensor(DZ_AIRQUALITY, senseair_co2);
|
||||
#endif // USE_DOMOTICZ
|
||||
|
@ -335,7 +335,7 @@ void MCP230xx_Show(bool json)
|
||||
ResponseAppend_P(PSTR(",\"D8\":%i,\"D9\":%i,\"D10\":%i,\"D11\":%i,\"D12\":%i,\"D13\":%i,\"D14\":%i,\"D15\":%i"),
|
||||
(gpio>>0)&1,(gpio>>1)&1,(gpio>>2)&1,(gpio>>3)&1,(gpio>>4)&1,(gpio>>5)&1,(gpio>>6)&1,(gpio>>7)&1);
|
||||
}
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -372,7 +372,7 @@ void Mpr121Show(struct mpr121 *pS, uint8_t function)
|
||||
|
||||
// Append JSON message string
|
||||
if (FUNC_JSON_APPEND == function) {
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
ResponseJsonEnd();
|
||||
}
|
||||
} // if->running
|
||||
} // for-loop i
|
||||
|
Loading…
x
Reference in New Issue
Block a user