Initial problem: These Dome water sensors frequently false trigger "wet" , and when they do false trigger, they don't return to dry on their own.
Once you have detected a falsely triggered device, you must "solidly" re-trigger the device before it will send a "dry" condition. Placing all the sensor pickups against a piece of conductive metal will re-trigger the device as if it had actually sensed water, and once removed from the plate, they immediately go back to dry.
I have been working on resolving the source of this problem for a few days.. and today was my lucky day. Another false trigger!
TTS: "A leak was detected under the water main".
Checked it, and it was completely dry. (as you can see in the attached photos)
Paper towels definitely help prevent the false triggers, much reduced. Paper towels do soak up a lot of water, so this is win/win and you know when it really is wet. These towels are NOT wet.


Below is a summary of all websocket data for this particular leak sensor today, which is kept in a SQL Server database.
The red box shows the initial false "wet" trigger.
Roughly 3 minutes later I check on the sensor which sits atop paper towels. (pics were take today of faulting sensor) and as you can see its not wet, and the device did not send a dry command. When the device is picked up touched, etc.. nothing. Then at 6:53:21pm I touch all the sensor pickups against a piece of metal, and it triggers "wet". Within a second of removing the sensor from the conductive plate it sends "dry" as you can see in the blue box below.
I have written several stored procedures in SQL to find my stuck sensor and summarize. This provides a great snapshot of all the sensors in a single view. I only had time to trigger half of the water sensors I have, but as you can seek when triggered by actual water, or atop a conductive plate the devices reliably go back to dry once removed.
I suspect these devices have a voltage drift in the input circuit that is causing them to false trigger.
Slow ramping voltages into digital CMOS without the use of Schmidt trigger buffers will cause what is referred to as "CMOS latchup" They devices exhibit this in my opinion. Water sensors are extremely sensitive, and can tricky to tune.
I DO NOT KNOW if this is the actual problem, but i am dissecting a few of my devices to see if I can determine the root cause, modify a few for long term testing, and I will post here when I do. This will likely void my warranty, but they do me no good turning off my water and running my neighbors to check on my sensors all the time.

USE [hubitat]
GO
/****** Object: StoredProcedure [dbo].[usp_FindStuckMotionSensors] Script Date: 09/17/2019 12:47:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Matthew K
-- Create date: 9/11/2019
-- Description: Find sensors Motion Sensors that are STUCK!
-- =============================================
ALTER PROCEDURE [dbo].[usp_FindStuckLeakSensors]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--local variable declarations
DECLARE @Cursor_PKID INT
DECLARE @TimeStuckOn INT
DECLARE @DeviceType INT
--init local vars
SET @TimeStuckOn = 4
SET @DeviceType =23
--init output table
DELETE FROM tbl_StuckDevices
-- Insert statements for procedure here
CREATE TABLE #TempTable
( pkid INT IDENTITY(1,1) NOT NULL,
SensorName nvarchar(1500),
DeviceID INT,
State int, --(Active = 1, Inactive = 0)
DetectedWater datetime
PRIMARY KEY CLUSTERED ( pkid ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
--Capture all Records for this device
INSERT INTO #TempTable
(SensorName,DeviceID,State, DetectedWater)
SELECT
E.displayName,
HD.Device_ID,
case
WHEN E.value='wet' THEN 1
WHEN E.value='dry' THEN 0
ELSE -1
END as State,
E.created
FROM tbl_HubitatDevices HD
INNER JOIN [events] E ON E.deviceId = HD.Device_ID
WHERE
HD.DeviceType = @DeviceType AND
(E.value = 'wet' OR E.value = 'dry') AND
created > dateadd(day,-2,getdate())
-- Debug ONLY
--SELECT *
--FROM #TempTable C
--WHERE C.DeviceID = 3201
--ORDER BY C.DetectedWater DESC
-- Debug Only
INSERT INTO dbo.tbl_StuckDevices(deviceID, deviceFunction, deviceName, deviceType, lastStateDetected, HoursSinceLastStateChange, LastState, LastChangedStateOn)
SELECT H.Device_ID,h.DeviceFunction,h.DeviceName,h.DeviceType,
isnull(( SELECT TOP 1 T.State
FROM #TempTable T
WHERE
T.DeviceID = h.device_ID
ORDER BY T.DetectedWater DESC
),0)
AS LastStateDetected,
isnull(( SELECT TOP 1 DATEDIFF(hour,T.DetectedWater,getdate()) as HoursOnNoStateChange
FROM #TempTable T
WHERE
T.DeviceID = h.device_ID
ORDER BY T.DetectedWater DESC
),0)
AS HoursSinceLastStateChange,
(SELECT TOP 1 value
FROM events E
WHERE E.deviceId= h.Device_ID and (value = 'wet' or value = 'dry')
ORDER By created DESC) as LastState,
(select TOP 1 Created
FROM events E
WHERE E.deviceId= h.Device_ID and (value = 'wet' or value = 'dry')
ORDER By created DESC) as LastChangedStateOn
FROM dbo.tbl_HubitatDevices h
WHERE
h.DeviceType = @DeviceType AND --motion sensors
h.Device_ID > 0
ORDER BY H.DeviceName
--return stuck devices table
SELECT * FROM dbo.tbl_StuckDevices
--Destroy temp tables
DROP table #TempTable
END