So, terminology matters. Debug logging is something different than Info logging.
Debug Logging can be turned off by the method I mentioned.
Sounds like you are asking the developer to add additional logging level restrictions such as Info Only, Debug, Warning, Error, etc. Like is available in Rule Machine
Fair point on the terminology - and thanks for taking the time to clarify!
What I meant is that most of those current "Info" lines look more like internal execution details than high-level user events. Since they’re sent as log.info, they keep spamming the live log even when debug mode is turned off.
In standard Hubitat practice, everyday Info logs are usually just for major events (like an actual state change you'd want to track), while all the fine-grained operational updates belong in log.debug.
If one could reclassify those detailed messages to log.debug, it would make the daily logs so much cleaner without losing any useful info when troubleshooting.
So, I found the issue. The app MERGES the mdns discovery without removing any prior discovered devices. There were no ghost on my home app, and looking at mDNS discovery, they did not show up there either.
I had chat give me a few snippets to modify the existing app that would list any "stale" entries (Devices in the APP list that had no current corresponding mDNS value) and allow you to select which ones you want to remove. Selecting them, and then clicking done removes them from the app list.
This way, if you had manually added something that was not available in mDNS, it will not be removed unless you toggle it. But, you can remove it by selecting it in the stale section and clicking done. Also, if you have a device that is just offline at the time of the scan, it will show as stale. So, you wouldn't want to select it there either.
Tested and verified it worked by selecting only one and it left the remainder of the devices. Then I went back in and selected the rest.
Code is here if you are interested in merging it. Search on "STALE" and "Stale" for the blocks I added. ALL are enclosed in major comment blocks and indented too far to make it easier to find.
I am sure you could make it better (like add a specific button for the cleanup)
I want to use "break time" to structure my spoken words...
When I use the device GUI (Play Text) and enter something like Hello<break time="2s"/>World!
it works 100%!
But when I use Rule Machine, everytime I enter a text with "<" and ">" this part is removed!
(I even tried using HTML codes (60, 62) - but even this is removed...)
Any idea how I can write one(!) text with pauses in between?
I've tried also many other combinations of special chars - no success.
The real problem is that RM drops all <...> parts out of strings...
Maybe this driver can integrate some other way to enter SSML... e.g. by using "{...}" instead?
I pushed a new version with 3 changes suggested above. I have NOT tested these - just reviewed the code changes and they look good to me but please let me know if you have/see any issues:
flag devices that haven't been seen in 5 minutes as 'stale'
support modified SSML for use in Rule Manager (use {} instead of <>)
app:21122026-08-21 10:10:37.603errororg.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: General error during canonicalization: Expression [MethodCallExpression] is not allowed: log.$level(GC+ [App] $msg) at line number 369 java.lang.SecurityException: Expression [MethodCallExpression] is not allowed: log.$level(GC+ [App] $msg) at line number 369 at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.a(SecureASTCustomizerHub.java:738) at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitMethodCallExpression(SecureASTCustomizerHub.java:918) at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:70) at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitExpressionStatement(SecureASTCustomizerHub.java:844) at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42) at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitBlockStatement(SecureASTCustomizerHub.java:804) at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71) at com.hubitat.hub.executor.SecureASTCustomizerHub.call(SecureASTCustomizerHub.java:568) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1087) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293) at com.hubitat.hub.executor.ExecutorHelper.parseClassInternal(ExecutorHelper.groovy:787) at com.hubitat.hub.executor.ExecutorHelper.parseAppClass(ExecutorHelper.groovy:755) at com.hubitat.hub.executor.ExecutorHelper.loadAppTypeClass(ExecutorHelper.groovy:901) at com.hubitat.hub.executor.ExecutorHelper.access$3(ExecutorHelper.groovy) at com.hubitat.hub.executor.ExecutorHelper$_getCachedAppExecutorClass_closure11.doCall(ExecutorHelper.groovy:882) at jdk.internal.reflect.GeneratedMethodAccessor635.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) at groovy.lang.Closure.call(Closure.java:420) at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:54) at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:124) at com.sun.proxy.$Proxy42.apply(Unknown Source) at com.hubitat.hub.executor.ExecutorHelper.getCachedClassInternal(ExecutorHelper.groovy:828) at com.hubitat.hub.executor.ExecutorHelper.getCachedAppExecutorClass(ExecutorHelper.groovy:882) at com.hubitat.hub.executor.ExecutorHelper.getCachedAppExecutorClass(ExecutorHelper.groovy) at com.hubitat.hub.executor.ExecutorHelper.getAppExecutorScript(ExecutorHelper.groovy:692) at com.hubitat.hub.executor.ExecutorHelper$getAppExecutorScript$0.call(Unknown Source) at com.hubitat.handler.AppHandler.getAppExecutor(AppHandler.groovy:243) at com.hubitat.handler.AppHandler.runAppMethodWithException(AppHandler.groovy:133) at com.hubitat.handler.AppHandler$runAppMethodWithException$0.callCurrent(Unknown Source) at com.hubitat.handler.AppHandler.runAppMethod(AppHandler.groovy:59) at com.hubitat.handler.AppHandler$runAppMethod.call(Unknown Source) at com.hubitat.hub.job.GenericJob.execute(GenericJob.groovy:68) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) 1 error (scanMdns)
EDIT: should be fixed - I installed all 3 drivers and made sure the app displays
The interesting thing is this might be related to a newer Hub firmware..
Not caused by the recent changes. Line 369 in commit 9a43902 — the version before the stale-device and SSML work — is exactly that helper. It had compiled fine for a long time; the sandbox check appears to have tightened in a firmware update, so it breaks on hubs newer than yours.
All my devices (15 or so) disappear when I do a refresh except the original ticked one.
I also get this on all my Devices:
2026-08-21 10:50:37.836errororg.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during canonicalization: Expression [MethodCallExpression] is not allowed: log.$level(GC+ [App] $msg) at line number 369
java.lang.SecurityException: Expression [MethodCallExpression] is not allowed: log.$level(GC+ [App] $msg) at line number 369
at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.a(SecureASTCustomizerHub.java:738)
at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitMethodCallExpression(SecureASTCustomizerHub.java:918)
at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:70)
at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitExpressionStatement(SecureASTCustomizerHub.java:844)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitBlockStatement(SecureASTCustomizerHub.java:804)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
at com.hubitat.hub.executor.SecureASTCustomizerHub.call(SecureASTCustomizerHub.java:568)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1087)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
at com.hubitat.hub.executor.ExecutorHelper.parseClassInternal(ExecutorHelper.groovy:787)
at com.hubitat.hub.executor.ExecutorHelper.parseAppClass(ExecutorHelper.groovy:755)
at com.hubitat.hub.executor.ExecutorHelper.loadAppTypeClass(ExecutorHelper.groovy:901)
at com.hubitat.hub.executor.ExecutorHelper.access$3(ExecutorHelper.groovy)
at com.hubitat.hub.executor.ExecutorHelper$_getCachedAppExecutorClass_closure11.doCall(ExecutorHelper.groovy:882)
at jdk.internal.reflect.GeneratedMethodAccessor635.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
at groovy.lang.Closure.call(Closure.java:420)
at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:54)
at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:124)
at com.sun.proxy.$Proxy42.apply(Unknown Source)
at com.hubitat.hub.executor.ExecutorHelper.getCachedClassInternal(ExecutorHelper.groovy:828)
at com.hubitat.hub.executor.ExecutorHelper.getCachedAppExecutorClass(ExecutorHelper.groovy:882)
at com.hubitat.hub.executor.ExecutorHelper.getCachedAppExecutorClass(ExecutorHelper.groovy)
at com.hubitat.hub.executor.ExecutorHelper.getAppExecutorScript(ExecutorHelper.groovy:692)
at com.hubitat.hub.executor.ExecutorHelper$getAppExecutorScript$0.call(Unknown Source)
at com.hubitat.handler.AppHandler.getAppExecutor(AppHandler.groovy:243)
at com.hubitat.handler.AppHandler.runAppMethodWithException(AppHandler.groovy:133)
at com.hubitat.handler.AppHandler$runAppMethodWithException$0.callCurrent(Unknown Source)
at com.hubitat.handler.AppHandler.runAppMethod(AppHandler.groovy:59)
at com.hubitat.handler.AppHandler$runAppMethod.call(Unknown Source)
at com.hubitat.hub.job.GenericJob.execute(GenericJob.groovy:68)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
1 error
(scanMdns)