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-ID: 1038666047

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

Ausgedruckt am: 21.11.2024 um 23:11 Uhr

cykes
cykes 18.07.2021 um 11:08:22 Uhr
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
Lochkartenstanzer
Lochkartenstanzer 18.07.2021 aktualisiert um 14:57:08 Uhr
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.
DonJoe
DonJoe 18.07.2021 aktualisiert um 17:53:55 Uhr
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.
DonJoe
DonJoe 18.07.2021 um 17:53:29 Uhr
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 ^^.
148656
148656 18.07.2021 um 19:37:29 Uhr
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.
149062
149062 18.07.2021 aktualisiert um 19:56:37 Uhr
Goto Top
cykes
cykes 19.07.2021 um 07:47:47 Uhr
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
colinardo
colinardo 19.07.2021 aktualisiert um 15:43:00 Uhr
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
DonJoe
DonJoe 20.07.2021 um 17:34:38 Uhr
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.
colinardo
colinardo 20.07.2021 aktualisiert um 17:40:47 Uhr
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.
DonJoe
DonJoe 20.07.2021 um 17:43:20 Uhr
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.
DonJoe
DonJoe 20.07.2021 um 17:52:49 Uhr
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
DonJoe
DonJoe 05.08.2021 um 18:55:30 Uhr
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.
colinardo
colinardo 05.08.2021 aktualisiert um 21:06:37 Uhr
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.
DonJoe
DonJoe 05.08.2021 um 20:01:14 Uhr
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%.
colinardo
colinardo 06.08.2021 aktualisiert um 07:24:18 Uhr
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.
DonJoe
DonJoe 08.08.2021 um 21:45:45 Uhr
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
colinardo
colinardo 09.08.2021 aktualisiert um 10:04:21 Uhr
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.