donjoe
Goto Top

Aktion (REST-Request) auslösen bei (Un)Mute der Lautstäke

Hallo,

leider habe ich im Netz bisher dazu keine Lösung gefunden: Es geht darum unter Windows 10 beim (un)muten eine Shelly-Steckdose per REST-Schnittstelle (http Request) ein- bzw. auszuschalten. Hintergrund ist der, dass die Boxen so alt sind, dass diese im Standby viel zu Stromhungrig sind und auch teilweise brummen.
Im Windows Event Log wird Standard mäßig kein (Un)mute protokolliert, in der Registry habe ich nur diverse "Vol"-Optionen für Volume (Datenträger) gefunden.
Daher die Frage weiß jemand die der Registry-Eintrag heißt? Gibt es evtl. bessere Möglichkeiten die Steckdose zu steuern?

Danke, schon mal für die Hilfe.

Content-Key: 1038666047

Url: https://administrator.de/contentid/1038666047

Printed on: April 25, 2024 at 17:04 o'clock

Member: cykes
cykes Jul 18, 2021 at 09:08:22 (UTC)
Goto Top
Moin,
Zitat von @DonJoe:
leider habe ich im Netz bisher dazu keine Lösung gefunden: Es geht darum unter Windows 10 beim (un)muten eine Shelly-Steckdose per REST-Schnittstelle (http Request) ein- bzw. auszuschalten. Hintergrund ist der, dass die Boxen so alt sind, dass diese im Standby viel zu Stromhungrig sind und auch teilweise brummen.
Vielleicht wäre es einen Gedanken wert, die Boxen mal auzutauschen?
Im Windows Event Log wird Standard mäßig kein (Un)mute protokolliert, in der Registry habe ich nur diverse "Vol"-Optionen für Volume (Datenträger) gefunden.
In letzteren fummelst Du besser nicht herum face-wink Die wesentliche Frage wäre, inwiefern Programmierkenntnisse vorhanden sind bzw. ob Du einen (zentralen) Smarthome-Controller einsetzt?
Daher die Frage weiß jemand die der Registry-Eintrag heißt? Gibt es evtl. bessere Möglichkeiten die Steckdose zu steuern?
Die gibt es sicher, aber ohne Programmierkenntnisse wird das wohl nichts werden. Wie bereits oben schon angemerkt, könnte es deutlich weniger Aufwand sein, die Boxen zu tauschen. Gerade Brummschleifen lassen auf billige Verstärker in den (Aktiv)Boxen und/oder minderwertige Kabel schließen.

Gruß

cykes
Member: Lochkartenstanzer
Lochkartenstanzer Jul 18, 2021 updated at 12:57:08 (UTC)
Goto Top
Zitat von @DonJoe:

Hallo,
Hintergrund ist der, dass die Boxen so alt sind, dass diese im Standby viel zu Stromhungrig sind und auch teilweise brummen.

Das wäre eher ein Grund die Dinger zu entsorgen und neue stromsparende Boxen zu holen. Das amortisiert sich in ein bis zwei Jahren. Und die Brumschleife wäre damit vermutlich auch weg.

lks

PS. Nimm so einen Schalter (Brennenstuhl Eco Line Comfort Switch Adapter EL CSA 1). Dann klickst Du statt auf "mute" einfach auf den taster.
Member: DonJoe
DonJoe Jul 18, 2021 updated at 15:53:55 (UTC)
Goto Top
So hoch ist der Stromverbrauch auch nicht, das es nach ein bis zwei Jahren diese Boxen drin sind (Nach-Nachfolger: https://teufel.de/concept-e-450-digital-51-set-104762000

Danke für den Tipp mit den Brennstuhl, aber ich würde gerne auf das zusätzliche Kabel und die Saugroboterfalle verzichten.
Member: DonJoe
DonJoe Jul 18, 2021 at 15:53:29 (UTC)
Goto Top
Zitat von @cykes:

Moin,
Zitat von @DonJoe:
leider habe ich im Netz bisher dazu keine Lösung gefunden: Es geht darum unter Windows 10 beim (un)muten eine Shelly-Steckdose per REST-Schnittstelle (http Request) ein- bzw. auszuschalten. Hintergrund ist der, dass die Boxen so alt sind, dass diese im Standby viel zu Stromhungrig sind und auch teilweise brummen.
Vielleicht wäre es einen Gedanken wert, die Boxen mal auzutauschen?
Im Windows Event Log wird Standard mäßig kein (Un)mute protokolliert, in der Registry habe ich nur diverse "Vol"-Optionen für Volume (Datenträger) gefunden.
In letzteren fummelst Du besser nicht herum face-wink Die wesentliche Frage wäre, inwiefern Programmierkenntnisse vorhanden sind bzw. ob Du einen (zentralen) Smarthome-Controller einsetzt?
Daher die Frage weiß jemand die der Registry-Eintrag heißt? Gibt es evtl. bessere Möglichkeiten die Steckdose zu steuern?
Die gibt es sicher, aber ohne Programmierkenntnisse wird das wohl nichts werden. Wie bereits oben schon angemerkt, könnte es deutlich weniger Aufwand sein, die Boxen zu tauschen. Gerade Brummschleifen lassen auf billige Verstärker in den (Aktiv)Boxen und/oder minderwertige Kabel schließen.

Gruß

cykes


Ich nutze keinen Smarthome-Controller ich wüsste auch nicht wie mir dieser hier weiter helfen könnte. Meine Programmierkenntnisse sind doch etwas eingerostet, aber hier sehe ich primäre das Problem, der Schnittstellen und Parameter mit denen ich mich nicht auskenne. Austauschboxen seihe oben ^^.
Mitglied: 148656
148656 Jul 18, 2021 at 17:37:29 (UTC)
Goto Top
Moin,

Zitat von @DonJoe:

Ich nutze keinen Smarthome-Controller ich wüsste auch nicht wie mir dieser hier weiter helfen könnte. Meine Programmierkenntnisse sind doch etwas eingerostet, aber hier sehe ich primäre das Problem, der Schnittstellen und Parameter mit denen ich mich nicht auskenne. Austauschboxen seihe oben ^^.

Welche Programmierkenntnisse besitzt Du? Also welche Sprache könntest du anwenden?
Mit dem Wissen kann man dann schauen, welche Schnittstelle in Frage kommen könnte.

Gruß
C.C.
Mitglied: 149062
149062 Jul 18, 2021 updated at 17:56:37 (UTC)
Goto Top
Member: cykes
cykes Jul 19, 2021 at 05:47:47 (UTC)
Goto Top
Zitat von @DonJoe:
So hoch ist der Stromverbrauch auch nicht, das es nach ein bis zwei Jahren diese Boxen drin sind (Nach-Nachfolger: https://teufel.de/concept-e-450-digital-51-set-104762000
Aber vielleicht kannst Du zumindest die (vermutliche) Brummschleife umgehen/beheben. Teufel hat eine sehr ausführliche Anleitung dazu: https://blog.teufel.de/brummschleife-mein-subwoofer-brummt-was-tun/

Ggf. hilft es schon, den PC über optisches Kabel mit dem Sub zu verbinden. Ansonsten ist Dein Lösungsansatz zu speziell, um ohne sich dafür etwas selbst zu programmieren zum Ziel zu gelangen. Den Smarthomecontroller hatte ich nur erwähnt, weil man den ggf. separat programmieren kann und der den Shelly-Schalter steuern kann.

Gruß

cykes
Member: colinardo
colinardo Jul 19, 2021 updated at 13:43:00 (UTC)
Goto Top
Servus DonJoe,
hier ein Beispiel mit der Powershell wie man Mute-Events live im System registrieren und darauf mit REST-Requests reagieren kann. Die für dich interessanten Zeilen findest du in Zeile 64 und 69. Wenn du diese mit entsprechenden URLs deiner Shellys ersetzt und auskommentierst kannst du das gewünschte erreichen.
Das Skript registriert einen Event-Handler der auf Änderungen der Lautstärke des Default-Ausgabe-Devices reagiert.
Im Eventhandler wird dann die Mute-Variable abgefragt und je nach Änderung des Status deine gewünschte Aktion ausgeführt.
Zur Info: Der Code im Kopf bis Zeile 50 lädt beim ersten Ausführen die für das Skript benötigte naudio.dll aus dem Nuget Repo herunter und lädt das .NET Assembly.

screenshot

<#
   Register audio mute events
#>

# function to load nuget assembly
function Load-NugetAssembly {
    [CmdletBinding()]
    param(
        [string]$url,
        [string]$name,
        [string]$zipinternalpath,
        [switch]$downloadonly
    )
    # Accept all TLS protocols
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::GetNames([System.Net.SecurityProtocolType]) 
    if($psscriptroot -ne ''){  
        $localpath = join-path $psscriptroot $name
    }else{
        $localpath = join-path $env:TEMP $name
    }
    $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"  
    $zip = $null
    try{
        if(!(Test-Path $localpath)){
            Add-Type -A System.IO.Compression.FileSystem
            write-host "Downloading and extracting required library '$name' ... " -F Green -NoNewline  
            (New-Object System.Net.WebClient).DownloadFile($url, $tmp)
            $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
            $zip.Entries | ?{$_.Fullname -eq $zipinternalpath} | %{
                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
            }
	Unblock-File -Path $localpath
            write-host "OK" -F Green  
        }
        if(!$downloadonly.IsPresent){
            Add-Type -Path $localpath -EA Stop
        }
        
    }catch{
        throw "Error: $($_.Exception.Message)"  
    }finally{
        if ($zip){$zip.Dispose()}
        if(Test-Path $tmp){del $tmp -Force}
    }  
}

# load required assembly from nuget
Load-NugetAssembly 'https://www.nuget.org/api/v2/package/NAudio/1.10.0' -name 'naudio.dll' -zipinternalpath 'lib/net35/naudio.dll' -EA Stop  


# Get IMM DeviceEnumerator object
$deviceenum = New-Object NAudio.CoreAudioApi.MMDeviceEnumerator
# Get system default audio endpoint
$dev = $deviceenum.GetDefaultAudioEndpoint([NAudio.CoreAudioApi.DataFlow]::Render,[NAudio.CoreAudioApi.Role]::Multimedia)
# forcefully unregister event subscriber
Unregister-Event -SourceIdentifier VolumeChanged -Force -EA SilentlyContinue
# mute state variable to register change
$global:muted = $dev.AudioEndpointVolume.Mute
# register audio change event
Register-ObjectEvent $dev.AudioEndpointVolume OnVolumeNotification -SourceIdentifier VolumeChanged -Action {
    if (!$global:muted -and $event.SourceArgs.Muted){
        write-host "Device muted." -F Green  
        # here place your rest method e.g.
        # Invoke-RestMethod 'http://192.168.xxx.xxx/relay/0?turn=off'  
        $global:muted = $true
    }elseif(!$event.SourceArgs.Muted -and $global:muted){
        write-host "Device unmuted." -F Green  
        # here place your rest method e.g.
        # Invoke-RestMethod 'http://192.168.xxx.xxx/relay/0?turn=on'  
        $global:muted = $false
    }
} | out-null

cls
write-host "Waiting for audio mute events ..." -F Green  
while($true){
    sleep .5
}
Viel Spaß damit

Grüße Uwe
Member: DonJoe
DonJoe Jul 20, 2021 at 15:34:38 (UTC)
Goto Top
1000x Danke, Uwe! Funktioniert perfekt, wie gewünscht (Auskommentiert und Request angepasst). Jetzt werde ich nur noch den DL ersetzen damit ich von der Verfügbarkeit der der dll unabhängig bin. Mit der Sleep time werde ich noch mal etwas herum experimentieren, es reagiert sehr schnell und ein Login vergeben face-wink

Ist doch etwas mehr Code als ich dachte *g* DANKE.
Member: colinardo
colinardo Jul 20, 2021 updated at 15:40:47 (UTC)
Goto Top
Zitat von @DonJoe:
Jetzt werde ich nur noch den DL ersetzen damit ich von der Verfügbarkeit der der dll unabhängig bin.
Das macht die Funktion schon automatisch sie prüft ob die DLL bereits im Script-Verzeichnis liegt und nur wenn nicht wird sie heruntergeladen face-wink.
Ist doch etwas mehr Code als ich dachte *g* DANKE.
Das Interessante ist ja eh erst ab Zeile 50, der Rest ist "Gerüst" damit's jeder ohne selbst den Download anzustoßen direkt ausprobieren kann face-wink.
Member: DonJoe
DonJoe Jul 20, 2021 at 15:43:20 (UTC)
Goto Top
Zitat von @cykes:

Zitat von @DonJoe:
So hoch ist der Stromverbrauch auch nicht, das es nach ein bis zwei Jahren diese Boxen drin sind (Nach-Nachfolger: https://teufel.de/concept-e-450-digital-51-set-104762000
Aber vielleicht kannst Du zumindest die (vermutliche) Brummschleife umgehen/beheben. Teufel hat eine sehr ausführliche Anleitung dazu: https://blog.teufel.de/brummschleife-mein-subwoofer-brummt-was-tun/

Ggf. hilft es schon, den PC über optisches Kabel mit dem Sub zu verbinden. Ansonsten ist Dein Lösungsansatz zu speziell, um ohne sich dafür etwas selbst zu programmieren zum Ziel zu gelangen. Den Smarthomecontroller hatte ich nur erwähnt, weil man den ggf. separat programmieren kann und der den Shelly-Schalter steuern kann.

Gruß

cykes

Danke für den Tipp (werde ich bei Gelegenheit in ruhe durchlesen), das brummen ist nur (ganz) selten im Idle, sobald ein Signal anliegt höre ich kein Brummen oder ähnliches.
Member: DonJoe
DonJoe Jul 20, 2021 at 15:52:49 (UTC)
Goto Top
Zitat von @colinardo:

Zitat von @DonJoe:
Jetzt werde ich nur noch den DL ersetzen damit ich von der Verfügbarkeit der der dll unabhängig bin.
Das macht die Funktion schon automatisch sie prüft ob die DLL bereits im Script-Verzeichnis liegt und nur wenn nicht wird sie heruntergeladen face-wink.
Ist doch etwas mehr Code als ich dachte *g* DANKE.
Das Interessante ist ja eh erst ab Zeile 50, der Rest ist "Gerüst" damit's jeder ohne selbst den Download anzustoßen direkt ausprobieren kann face-wink.

Wenn ich in x Jahren Windows neu aufsetze ist die dll im gleichen Verzeichnis wie das Skript liegt ist es einfacher/sicherer. Links ändern sich (zu) häufig face-wink Es sind ~25 Zeilen ich hätte 10-15 getippt bzw. geschätzt face-wink

Ich bin einfach nur glücklich, das es nun funktioniert und auch so wie ich es mir vorgestellt habe. Jetzt müsste ich es nur noch hinbekommen, dass mir VLC/Chrome nicht die Multimedia tasten "entführt/blockiert" sondern immer Systemweit zu Verfügung sehen. face-smile
Member: DonJoe
DonJoe Aug 05, 2021 at 16:55:30 (UTC)
Goto Top
Hallo, ich habe inzwischen leider feststellen müssen, dass das Skript mehr als einen ganzen(!) CPU Kern auslastet. Kann man das noch beheben, wenn ja wie? Ich komme auf einen Stromverbrauch von rund 7,84W wenn ich die TDP im Verhältnis zu Auslastung setze.
Member: colinardo
colinardo Aug 05, 2021 updated at 19:06:37 (UTC)
Goto Top
Zitat von @DonJoe:

Hallo, ich habe inzwischen leider feststellen müssen, dass das Skript mehr als einen ganzen(!) CPU Kern auslastet. Kann man das noch beheben, wenn ja wie? Ich komme auf einen Stromverbrauch von rund 7,84W wenn ich die TDP im Verhältnis zu Auslastung setze.

Du brauchst ja nicht jede halbe Sekunde (wie oben im Skript) die Events abfragen 😉, das war ja nur ein Beispiel, einfach den Sleep Wert in der Schleife erhöhen.
Hier sonst keine Probleme mit der Auslastung, die bleibt unter ferner liefen, ist ja nun wirklich nichts weltbewegendes.
Member: DonJoe
DonJoe Aug 05, 2021 at 18:01:14 (UTC)
Goto Top
@colinardo
Danke, ich hätte nicht gedacht des es einen solchen unterschied macht ob 500ms oder 2sec, bin nun unter 0,1%, liegt zeitlich schließlich nur Faktor 4 dazwischen. Scheint ein BIOS CPU Timer Bug zu sein, bei .6 sind es schon <=0,1%.
Member: colinardo
colinardo Aug 06, 2021 updated at 05:24:18 (UTC)
Goto Top
Zitat von @DonJoe:
Scheint ein BIOS CPU Timer Bug zu sein, bei .6 sind es schon <=0,1%.

Nein das ist kein Bug, das ist schon lange bekannt und nennt sich busy waiting bzw. spinning. Denn auch bei einer Schleife die nichts weiter tut muss der Prozessor eine Variable erhöhen und belegt somit CPU Zeit, je geringer der Sleep desto weniger CPU-Zeit bleibt anderen Prozessen.
Member: DonJoe
DonJoe Aug 08, 2021 at 19:45:45 (UTC)
Goto Top
In zwischen konnte ich ein bisschen Praxiserfahrung sammeln. Leider vergesse ich zu häufig, das Muten. Gibt es eine Möglichkeit wenn kein Audiosignal anliegt nach x- Minuten/Sekunden die Boxen auszuschalten und sobald ein Audio Signal kommt wieder ein? Dann wäre es wirklich Smart face-smile
Member: colinardo
colinardo Aug 09, 2021 updated at 08:04:21 (UTC)
Goto Top
Zitat von @DonJoe:

In zwischen konnte ich ein bisschen Praxiserfahrung sammeln. Leider vergesse ich zu häufig, das Muten. Gibt es eine Möglichkeit wenn kein Audiosignal anliegt nach x- Minuten/Sekunden die Boxen auszuschalten und sobald ein Audio Signal kommt wieder ein?
Ja, kein Problem, mach ich dir gerne als Auftragsarbeit fertig => PN, hat ja nichts mehr mit der ursprünglichen Fragestellung zu tun.