OnTrue
Program.Setup(()=>{
Program.AddFeature("Sensor,Switch,Light", "Stuck_Module_Check.Enable", "Enable stuck motion sensor checking");
Program.AddFeatureTextInput("Sensor,Switch,Light", "Stuck_Module_Check.StuckModuleTimeout", "How long until this sensor is considered stuck (seconds)");
Program.AddInputField("Stuck_Module_Check.LogPath", @"/usr/local/bin/homegenie/log/StuckModuleCheck.log", "Path to log file");
Program.AddInputField("Stuck_Module_Check.TimerFidelity", "10", "How often does code check for stuck sensors (seconds)");
});
return true;
string ActivityLogPath = Program.InputField("Stuck_Module_Check.LogPath").Value;
var STUCK_MODULE_CHECK_ENABLE = "Stuck_Module_Check.Enable";
var STUCK_MODULE_TIMEOUT = "Stuck_Module_Check.StuckModuleTimeout";
var LAST_ON = "LastEvent.LastON";
var TIMER_FIDELITY = Program.InputField("Stuck_Module_Check.TimerFidelity").DecimalValue;
var stuck_devices = Modules.WithFeature(STUCK_MODULE_CHECK_ENABLE);
Action<string>
Log = (string logtext) => {
string text = DateTime.Now.ToLocalTime().ToString("yyyyMMdd HH:mm:ss.fffffff") + " ; " + logtext + "\n";
System.IO.File.AppendAllText(ActivityLogPath, text);
};
// check status of modules periodically.
while (Program.IsEnabled)
{
string logtext = "";
//logtext="enabled";
//Log(logtext);
stuck_devices.Each((module)=>
{
if (module.Parameter("Status.Level").DecimalValue > 0)
{
//need to know when module was switched on
var lasteventtime = module.Parameter(LAST_ON).UpdateTime;
var rightnow = DateTime.UtcNow;
var elapsed = new TimeSpan(rightnow.Ticks - lasteventtime.Ticks);
var timeout = module.Parameter(STUCK_MODULE_TIMEOUT).DecimalValue;
if (timeout == 0) timeout = 300; // default timeout is 5 minutes
if (elapsed.TotalSeconds > timeout)
{
logtext = "Stuck module detected. Turning off (" + elapsed.TotalSeconds + ").";
Log(logtext);
logtext = "Last module event ; " + module.Instance.Name.ToString() + " ; " + module.Parameter("Status.Level").Value + " ; " + module.Parameter(LAST_ON).UpdateTime.ToLocalTime().ToString("yyyyMMdd HH:mm:ss.fffffff");
Log(logtext);
module.Off();
}
else
{
// logtext = module.Instance.Name + " is not stuck yet... (" + elapsed.TotalSeconds + ")";
// Log(logtext);
}
}
else
{
// logtext=module.Instance.Name + " is off so not stuck";
// Log(logtext);
}
return false;
});
Pause(TIMER_FIDELITY);
}
Program.GoBackground();
[]
true
checkbox
Sensor,Switch,Light
Stuck_Module_Check.Enable
Enable stuck motion sensor checking
text
Sensor,Switch,Light
Stuck_Module_Check.StuckModuleTimeout
How long until this sensor is considered stuck (seconds)
true
HomeAutomation.HomeGenie.Automation
1004
Stuck Module Check
Watches selected module to see if it's been left ON for more than specified time and turns off if exceeded. Relies on Last Event code.
NEW
2014-07-25T02:39:46.120497Z
2014-07-31T01:40:49.58255Z
CSharp
true