From 36d958187d2e32f39f08059fdf64abb131a9ff77 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 21 May 2025 22:45:38 +0200 Subject: [PATCH] [P019] Implement Switch MQTT Device Class setting and Inverted Switch discovery --- src/_P019_PCF8574.ino | 25 +++++++++++++++++++++++- src/src/PluginStructs/P019_data_struct.h | 3 +++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/_P019_PCF8574.ino b/src/_P019_PCF8574.ino index 48ec2b2eb..9402ab13c 100644 --- a/src/_P019_PCF8574.ino +++ b/src/_P019_PCF8574.ino @@ -71,7 +71,7 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) } addFormSelectorI2C(F("pi2c"), 16, i2cAddressValues, address); const FormSelectorOptions selector(8, portNames, portValues); - selector.addFormSelector(F("Port"), F("pport"), port); + selector.addFormSelector(F("Port"), F("pport"), port); addFormNote(F("PCF8574 uses addresses 0x20..0x27, PCF8574A uses addresses 0x38..0x3F.")); } else { success = intArrayContains(16, i2cAddressValues, event->Par1); @@ -107,6 +107,13 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) P019_LP_MIN_INT, P019_SAFE_BTN); + # if FEATURE_MQTT_DISCOVER && FEATURE_MQTT_DEVICECLASS + + addFormSelector_binarySensorDeviceClass(F("MQTT Device class"), + F("devcls"), + P019_MQTT_DEVICECLASS); + # endif // if FEATURE_MQTT_DISCOVER && FEATURE_MQTT_DEVICECLASS + success = true; break; } @@ -131,10 +138,26 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) P019_LP_MIN_INT, P019_SAFE_BTN); + # if FEATURE_MQTT_DISCOVER && FEATURE_MQTT_DEVICECLASS + P019_MQTT_DEVICECLASS = getFormItemInt(F("devcls")); + # endif // if FEATURE_MQTT_DISCOVER && FEATURE_MQTT_DEVICECLASS + success = true; break; } + # if FEATURE_MQTT_DISCOVER + case PLUGIN_GET_DISCOVERY_VTYPES: + + success = getDiscoveryVType(event, Settings.TaskDevicePin1Inversed[event->TaskIndex] + ? Plugin_QueryVType_BinarySensorInv + : Plugin_QueryVType_BinarySensor, 255, event->Par5); + # if FEATURE_MQTT_DEVICECLASS + string = MQTT_binary_deviceClassName(P019_MQTT_DEVICECLASS); // User selected device_cLass/dev_cls value + # endif // if FEATURE_MQTT_DEVICECLASS + break; + # endif // if FEATURE_MQTT_DISCOVER + case PLUGIN_INIT: { // apply INIT only if PIN is in range. Do not start INIT if pin not set in the device page. diff --git a/src/src/PluginStructs/P019_data_struct.h b/src/src/PluginStructs/P019_data_struct.h index 2d0ff910f..c24bd162e 100644 --- a/src/src/PluginStructs/P019_data_struct.h +++ b/src/src/PluginStructs/P019_data_struct.h @@ -41,6 +41,9 @@ # define P019_LP_MIN_INT PCONFIG_FLOAT(2) # define P019_SAFE_BTN PCONFIG_FLOAT(3) +# if FEATURE_MQTT_DISCOVER && FEATURE_MQTT_DEVICECLASS +# define P019_MQTT_DEVICECLASS PCONFIG(6) +# endif // if FEATURE_MQTT_DISCOVER && FEATURE_MQTT_DEVICECLASS struct P019_data_struct : public PluginTaskData_base { static uint8_t getI2C_address(struct EventStruct *event);