From b2e42f966017f9b93ae4370257b3c469187aa787 Mon Sep 17 00:00:00 2001 From: Pavel Eremeev Date: Fri, 8 Jan 2021 15:12:08 +0100 Subject: [PATCH] Added: IdleTime Sensor (in seconds) Changed: .net core 3.1 -> .NET 5.0 --- UserInterface/UserInterface.csproj | 2 +- .../InterProcessApi.cs | 3 + .../ServiceContractModels.cs | 3 +- .../Data/ConfigurationService.cs | 3 + .../Domain/Sensors/IdleTimeSensor.cs | 76 +++++++++++++++++++ .../hass-workstation-service.csproj | 6 +- 6 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 hass-workstation-service/Domain/Sensors/IdleTimeSensor.cs diff --git a/UserInterface/UserInterface.csproj b/UserInterface/UserInterface.csproj index 3938707..c29402c 100644 --- a/UserInterface/UserInterface.csproj +++ b/UserInterface/UserInterface.csproj @@ -1,7 +1,7 @@  WinExe - netcoreapp3.1 + net5.0 diff --git a/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs b/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs index dea8726..a677d71 100644 --- a/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs +++ b/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs @@ -109,6 +109,9 @@ namespace hass_workstation_service.Communication.InterProcesCommunication case AvailableSensors.NamedWindowSensor: sensorToCreate = new NamedWindowSensor(this._publisher, model.WindowName, model.Name, (int)model.UpdateInterval); break; + case AvailableSensors.IdleTimeSensor: + sensorToCreate = new IdleTimeSensor(this._publisher,(int)model.UpdateInterval, model.Name); + break; default: Log.Logger.Error("Unknown sensortype"); break; diff --git a/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs b/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs index 9fc20e5..e55a055 100644 --- a/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs +++ b/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs @@ -37,6 +37,7 @@ namespace hass_workstation_service.Communication.InterProcesCommunication.Models WMIQuerySensor, MemoryUsageSensor, ActiveWindowSensor, - NamedWindowSensor + NamedWindowSensor, + IdleTimeSensor } } diff --git a/hass-workstation-service/Data/ConfigurationService.cs b/hass-workstation-service/Data/ConfigurationService.cs index d46bd6c..3c8711d 100644 --- a/hass-workstation-service/Data/ConfigurationService.cs +++ b/hass-workstation-service/Data/ConfigurationService.cs @@ -91,6 +91,9 @@ namespace hass_workstation_service.Data case "NamedWindowSensor": sensor = new NamedWindowSensor(publisher, configuredSensor.WindowName, configuredSensor.Name, configuredSensor.UpdateInterval, configuredSensor.Id); break; + case "IdleTimeSensor": + sensor = new IdleTimeSensor(publisher, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); + break; default: Log.Logger.Error("unsupported sensor type in config"); break; diff --git a/hass-workstation-service/Domain/Sensors/IdleTimeSensor.cs b/hass-workstation-service/Domain/Sensors/IdleTimeSensor.cs new file mode 100644 index 0000000..25ca311 --- /dev/null +++ b/hass-workstation-service/Domain/Sensors/IdleTimeSensor.cs @@ -0,0 +1,76 @@ +using hass_workstation_service.Communication; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using HWND = System.IntPtr; + +namespace hass_workstation_service.Domain.Sensors +{ + public class IdleTimeSensor : AbstractSensor + { + + public IdleTimeSensor(MqttPublisher publisher, int? updateInterval = 10, string name = "IdleTime", Guid id = default) : base(publisher, name ?? "IdleTime", updateInterval ?? 10, id) + { + + + } + + public override AutoDiscoveryConfigModel GetAutoDiscoveryConfig() + { + return this._autoDiscoveryConfigModel ?? SetAutoDiscoveryConfigModel(new AutoDiscoveryConfigModel() + { + Name = this.Name, + Unique_id = this.Id.ToString(), + Device = this.Publisher.DeviceConfigModel, + State_topic = $"homeassistant/sensor/{this.Name}/state", + Icon = "mdi:window-maximize", + }); + } + + public override string GetState() + { + + return GetLastInputTime().ToString(); + } + + + + + static int GetLastInputTime() + { + int idleTime = 0; + LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); + lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo); + lastInputInfo.dwTime = 0; + + int envTicks = Environment.TickCount; + + if (GetLastInputInfo(ref lastInputInfo)) + { + int lastInputTick = Convert.ToInt32(lastInputInfo.dwTime); + + idleTime = envTicks - lastInputTick; + } + + return ((idleTime > 0) ? (idleTime / 1000) : idleTime); + } + + + + [DllImport("User32.dll")] + private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + + [StructLayout(LayoutKind.Sequential)] + struct LASTINPUTINFO + { + public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); + + [MarshalAs(UnmanagedType.U4)] + public int cbSize; + [MarshalAs(UnmanagedType.U4)] + public UInt32 dwTime; + } + } +} diff --git a/hass-workstation-service/hass-workstation-service.csproj b/hass-workstation-service/hass-workstation-service.csproj index 0757d67..1e61b3b 100644 --- a/hass-workstation-service/hass-workstation-service.csproj +++ b/hass-workstation-service/hass-workstation-service.csproj @@ -1,7 +1,7 @@ - + - netcoreapp3.1 + net5.0 dotnet-hass_workstation_service-C65C2EBE-1977-4C24-AC6B-6921877E1390 hass_workstation_service WinExe @@ -30,7 +30,7 @@ - PreserveNewest + Always