From 1e3d86bfab0949468a183ff52c0bc6d036f59a53 Mon Sep 17 00:00:00 2001 From: sleevezipper Date: Sat, 6 Mar 2021 17:53:10 +0100 Subject: [PATCH] add volume sensor --- UserInterface/Views/AddSensorDialog.axaml.cs | 7 +++ .../InterProcessApi.cs | 3 ++ .../ServiceContractModels.cs | 3 +- .../Data/ConfigurationService.cs | 3 ++ .../Domain/Sensors/CurrentVolumeSensor.cs | 53 +++++++++++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs diff --git a/UserInterface/Views/AddSensorDialog.axaml.cs b/UserInterface/Views/AddSensorDialog.axaml.cs index 4e85944..1f0f785 100644 --- a/UserInterface/Views/AddSensorDialog.axaml.cs +++ b/UserInterface/Views/AddSensorDialog.axaml.cs @@ -156,6 +156,13 @@ namespace UserInterface.Views item.ShowWindowNameInput = false; item.UpdateInterval = 5; break; + case AvailableSensors.CurrentVolumeSensor: + item.Description = "This sensor returns the volume of currently playing audio."; + item.MoreInfoLink = "https://github.com/sleevezipper/hass-workstation-service#currentvolume"; + item.ShowQueryInput = false; + item.ShowWindowNameInput = false; + item.UpdateInterval = 5; + break; default: item.Description = null; item.MoreInfoLink = null; diff --git a/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs b/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs index 95c4a6b..0d54bc2 100644 --- a/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs +++ b/hass-workstation-service/Communication/InterProcesCommunication/InterProcessApi.cs @@ -147,6 +147,9 @@ namespace hass_workstation_service.Communication.InterProcesCommunication case AvailableSensors.SessionStateSensor: sensorToCreate = new SessionStateSensor(this._publisher, (int)model.UpdateInterval, model.Name); break; + case AvailableSensors.CurrentVolumeSensor: + sensorToCreate = new CurrentVolumeSensor(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 9f7481a..7c5a7bc 100644 --- a/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs +++ b/hass-workstation-service/Communication/InterProcesCommunication/ServiceContractModels.cs @@ -50,7 +50,8 @@ namespace hass_workstation_service.Communication.InterProcesCommunication.Models NamedWindowSensor, LastActiveSensor, LastBootSensor, - SessionStateSensor + SessionStateSensor, + CurrentVolumeSensor } public enum AvailableCommands diff --git a/hass-workstation-service/Data/ConfigurationService.cs b/hass-workstation-service/Data/ConfigurationService.cs index 7c0f61d..8337d35 100644 --- a/hass-workstation-service/Data/ConfigurationService.cs +++ b/hass-workstation-service/Data/ConfigurationService.cs @@ -120,6 +120,9 @@ namespace hass_workstation_service.Data case "SessionStateSensor": sensor = new SessionStateSensor(publisher, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); break; + case "CurrentVolumeSensor": + sensor = new CurrentVolumeSensor(publisher, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); + break; // keep this one last! case "WMIQuerySensor": sensor = new WMIQuerySensor(publisher, configuredSensor.Query, configuredSensor.UpdateInterval, configuredSensor.Name, configuredSensor.Id); diff --git a/hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs b/hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs new file mode 100644 index 0000000..9201d26 --- /dev/null +++ b/hass-workstation-service/Domain/Sensors/CurrentVolumeSensor.cs @@ -0,0 +1,53 @@ +using CoreAudio; +using hass_workstation_service.Communication; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace hass_workstation_service.Domain.Sensors +{ + public class CurrentVolumeSensor : AbstractSensor + { + + public CurrentVolumeSensor(MqttPublisher publisher, int? updateInterval = null, string name = "CurrentVolume", Guid id = default(Guid)) : base(publisher, name ?? "CurrentVolume", updateInterval ?? 10, id) { } + public override SensorDiscoveryConfigModel GetAutoDiscoveryConfig() + { + return this._autoDiscoveryConfigModel ?? SetAutoDiscoveryConfigModel(new SensorDiscoveryConfigModel() + { + Name = this.Name, + Unique_id = this.Id.ToString(), + Device = this.Publisher.DeviceConfigModel, + State_topic = $"homeassistant/{this.Domain}/{Publisher.DeviceConfigModel.Name}/{this.Name}/state", + Icon = "mdi:volume-medium", + Unit_of_measurement = "%", + Availability_topic = $"homeassistant/{this.Domain}/{Publisher.DeviceConfigModel.Name}/availability" + }); + } + + [DllImport("winmm.dll")] + public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); + + public override string GetState() + { + MMDeviceEnumerator DevEnum = new MMDeviceEnumerator(); + + var collection = DevEnum.EnumerateAudioEndPoints(EDataFlow.eRender, DEVICE_STATE.DEVICE_STATE_ACTIVE); + + List peaks = new List(); + + + foreach (MMDevice device in collection) + { + peaks.Add(device.AudioMeterInformation.PeakValues[0]); + } + + return Math.Round(peaks.Max() * 100, 0).ToString(CultureInfo.InvariantCulture); + } + + + } +}