Wenn PC (WIN) auf Audio-Ausgabegerät x, dann schalte y

Begonnen von 87insane, 03 Oktober 2019, 14:04:15

Vorheriges Thema - Nächstes Thema

Otto123

Hi,

ich habe es hinbekommen  ::)
Die Vorbereitung (Setup Audio Cmdlet und M2Mqtt) war etwas holprig. Aber geht jetzt. Finde ich aber irgendwie schon wieder relativ aufwendig.

Dann läuft Dein Script einfach durch :)

Muss ich erstmal sacken lassen und noch etwas spielen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

Kann man ja alles automatisieren. Ich würde meinen pc als mqtt Device sehen und hätte damit alles möglich was man realisieren kann. Das Skript ist bzw könnte ja nur der Anfang sein.

Ja bei mir ging es auch nicht einfach so. Musste erst mal ne saubere und laufende Quelle finden.

Gesendet von meinem LG-H850 mit Tapatalk


Beta-User

Um das OT in dem anderen Thread nicht noch auszubauen:

Mit "Auswertung" war gemeint, ob irgendwas spezielles passieren soll/der WIN-PC irgendwas auslösen (können) soll usw.. Dazu fehlt mir aber noch jede Vorstellung, was da von wo nach wo (aus welchem grund/zu welchem Zweck) geschickt wird... Wenn es um reine Statusmeldungen geht, macht MQTT2_DEVICE schon soviel automatisch, dass sich ein template dazu kaum lohnen dürfte.

(Wenn das hier OT ist, bitte bei passender Gelegenheit dann einen neuen Thread öffnen ;) ).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

Aktuell geht es hier noch um die Überschrift. Da ich das aber schon als Projekt sehe für die Zukunft, sammel ich gerne Ideen. Dafür macht natürlich ein eigener Thread Sinn.

Zum jetzigen Zeitpunkt mache ich nur folgendes:
1. Skript um Wiedergabegeräte an einem Win PC zu wechseln und diese Info via MQTT an FHEM reichen. Dann triggere ich via notify einen Schalter, der mir Strom auf die Boxen gibt oder wieder weg nimmt.
2. Skript um online und offline meines PCs via MQTT an FHEM zu senden.

Wo stelle ich so ein Thread am besten ein (Um Ideen zu sammeln und das Thema weiter aus zu bauen)?

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

#35
Hi,

Ich mache mal noch einen Beitrag zum grundlegenden Setup, falls jemand mit Powershell und Windows testen will:
Die AudioDeviceCmdlets installiert man einfach über Package Management Powershellgallery
Install-Module -Name AudioDeviceCmdlets
Obwohl man das Gleiche für M2Mqtt auch als als Quelle findet funktioniert es leider nicht, da ist irgendwas passiert. Ging ja offenbar schon  mal :(
Deswegen umständlicher aber als Kurzfassung von hier.
wget -O nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
nuget.exe install M2Mqtt -o c:\lib
copy c:\lib\M2Mqtt.4.3.0.0\lib\net45\M2Mqtt.Net.dll
Add-Type -Path "M2Mqtt.Net.dll"


Ich bin immer ein Freund von knappen Setups und habe hier für Windows noch einen "schnellen" MQTT Client zum probieren und testen gefunden:
wget -O paho-mqtt3c.dll https://github.com/francoisvdm/TT3/raw/master/paho-mqtt3c.dll
wget -O mfc100.dll https://github.com/francoisvdm/TT3/raw/master/mfc100.dll
wget -O TT3.exe https://github.com/francoisvdm/TT3/raw/master/TT3.exe
start tt3.exe


Ein komplettes mosquitto Setup unter Windows ist vielleicht auch was: https://www.msxfaq.de/sonst/iot/mqtt.htm  aber aufwendiger  ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane


Beta-User

Auch wenn wir uns hier im Reich der Dinosaurier und Exen bewegen: Wie wäre es mit dem Einsatz einer Perl-lib (siehe https://metacpan.org/pod/Net::MQTT::Simple mit weiteren Links)?
Setzt halt das Vorhandensein von Perl auf dem Win-PC voraus, dafür wären wir "in gewohnten Bahnen" und nicht abhängig von "irgendwelchen" gitub-Repos (über deren Qualität ausdrücklich kein Urteil hier gefällt werden soll)...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Naja ich arbeite unter Windows schon gern mit Powershell - da heraus jetzt ne Perl Funktion aufrufen. Auch ein interessanter Ansatz ... ;)
Ich bin morgen 30 km auf dem Elbtalweinlauf in Meißen - da hab ich Zeit (und Wein 🍷🍷🍷 ) da mal drüber nachzudenken.

Zumindest sind mir die Perl Bahnen mittlerweile etwas zugänglicher als irgendwelche C Bibliotheken im Visual Studio Klotz (zumindest ist das die auffindbare "mqtt Welt" in Windows).
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#39
Es war noch ein dummer Fehler im Script!


Der Ton konnte nicht umschalten wegen einer dummen Test-Variablen...


(Sound umstellen) - Hier richtig:
#Wenn config Datei nicht vorhanden ist, werden alle Variablen abgefragt um eine config.xml zu erstellen
If (-not (test-path config.xml)) {
   
    # Auflistung der Audio Geräte
    Get-AudioDevice -List

    # Abfrage der Variablen
    $dev1 = Read-Host "Enter first Device ID"
    $dev2 = Read-Host "Enter second Device ID"
    $serverip = Read-Host "Enter IP-Adress of MQTT Server"
    $conid = Read-Host "Choose a MQTT connection ID"
    $topic = Read-Host "Choose a MQTT Topic"
    $cred = Get-Credential
    $usr = $cred.UserName
    $pw = $cred.Password | ConvertFrom-SecureString
   
    #### Leere XML Datei erstellen ####
    $xmlcreate = New-Object System.Xml.XmlTextWriter("config.xml",$NULL)
    #### Formatierung in XML Datei anpassen ####
    $xmlcreate.Formatting = "Indented"
    $xmlcreate.Indentation = 1
    $xmlcreate.IndentChar = "`t"
    #### Inhalt für XML Datei ####
    $xmlcreate.WriteStartDocument()
    $xmlcreate.WriteStartElement("list")
    $xmlcreate.WriteElementString("SoundDevice1",$dev1)
    $xmlcreate.WriteElementString("SoundDevice2",$dev2)
    $xmlcreate.WriteElementString("MQTTServerIP",$serverip)
    $xmlcreate.WriteElementString("ConnectionID",$conid)
    $xmlcreate.WriteElementString("MQTTTopic",$topic)
    $xmlcreate.WriteElementString("UserName",$usr)
    $xmlcreate.WriteElementString("Password",$pw)
    $xmlcreate.WriteEndElement()
    #### XML Datei beschreiben ####
    $xmlcreate.WriteEndDocument()
    $xmlcreate.Flush()
    $xmlcreate.Close()
    }

# config.xml einlesen und durchsucbar machen
[xml]$config = Get-Content "config.xml"

# Passwort aus XML einlesen und entschlüsseln
$encrypt = $config.list.Password | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential("Username", $encrypt)

# Index der Wiedergabegeräte im System
$dev1=$config.list.SoundDevice1
$dev2=$config.list.SoundDevice2

# Auslesen des aktiven Ausgabe-Geräts mit Index
$aplayindex = (Get-AudioDevice -Playback).Index

# Auslesen des aktiven Aufnahme-Geräts mit Index
$arecindex = (Get-AudioDevice -Recording).Index

# Geräte-Toogle
if ($aplayindex -eq $dev1) {
        $aplayindex = $dev2
    } elseif ($aplayindex -eq $dev2) {
        $aplayindex = $dev1
    }

# Setzen des prim. Gerätes
Set-AudioDevice -Index $aplayindex > $null

# Name von Ein und Ausgabegeräte auslesen
$aplayname = (Get-AudioDevice -Playback).Name
$arecname = (Get-AudioDevice -Recording).Name

######### Ab hier MQTT #########

# dll reggen
Add-Type -Path "C:\lib\M2Mqtt.4.3.0.0\lib\net45\M2Mqtt.Net.dll"

# Verbinden
$MqttClient = [uPLibrary.Networking.M2Mqtt.MqttClient]($config.list.MQTTServerIP)

# Einloggen
$mqttclient.Connect($config.list.ConnectionID, $config.list.UserName, $cred.GetNetworkCredential().password) > $null

# Nachrichten senden mit QOS 1 (0 = Keine Prüfung / 1 = Nachricht kommt mindestens 1 mal an / 2 = Nachricht kommt maximal 1 mal an) - Kein WillReatin
$MqttClient.Publish($config.list.MQTTTopic+"/play_dev_index", [System.Text.Encoding]::UTF8.GetBytes("$aplayindex"),1,0) > $null
$MqttClient.Publish($config.list.MQTTTopic+"/play_dev_name", [System.Text.Encoding]::UTF8.GetBytes("$aplayname"),1,0) > $null
$MqttClient.Publish($config.list.MQTTTopic+"/rec_dev_index", [System.Text.Encoding]::UTF8.GetBytes("$arecindex"),1,0) > $null
$MqttClient.Publish($config.list.MQTTTopic+"/rec_dev_name", [System.Text.Encoding]::UTF8.GetBytes("$arecname"),1,0) > $null

# Delay
for ($i=0; $i -lt 1; $i++)
{
    Start-Sleep 1
}

# Verbindung schließen
$MqttClient.Disconnect()


Benutzer angemeldet (geht natürlich auch mit abgemeldet. Habe es bei mir via GPO drin):
# config.xml einlesen und durchsucbar machen
[xml]$config = Get-Content "config.xml"

# Passwort aus XML einlesen und entschlüsseln
$encrypt = $config.list.Password | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential("Username", $encrypt)

# dll reggen
Add-Type -Path "C:\lib\M2Mqtt.4.3.0.0\lib\net45\M2Mqtt.Net.dll"

# Verbinden
$MqttClient = [uPLibrary.Networking.M2Mqtt.MqttClient]($config.list.MQTTServerIP)

# Einloggen
$mqttclient.Connect($config.list.ConnectionID, $config.list.UserName, $cred.GetNetworkCredential().password)

# Es wird kein LastWill benötigt
#Parameter: string clientid, username, password, willRetain [0/1], willQosLevel [0/1/2], willFlag [0/1], willTopic, willMessage, cleanSession [0/1], keepAlivePeriod)
#$mqttclient.Connect($conid, "$usr", "$pw", 0, 0, 1, "$topic/hier_reading", "test", 1, 60 )

# Nachricht senden mit QOS 1 (0 = Keine Prüfung / 1 = Nachricht kommt mindestens 1 mal an / 2 = Nachricht kommt maximal 1 mal an) - Kein WillReatin
$MqttClient.Publish($config.list.MQTTTopic+"/online", [System.Text.Encoding]::UTF8.GetBytes("true"),1,0)

# Delay
for ($i=0; $i -lt 1; $i++)
{
    Start-Sleep 1
}

# Verbindung schließen
$MqttClient.Disconnect()

87insane

Kennt jemand was besseres und komplettes um PS komplett unsichtbar bzw nicht im Userkontext aus zu führen? Damit ist gemein -> KEIN Fenster.
-windowstyle hidden macht zwar das Fenster fast weg aber kurz blinkt es auf.

Otto123

Wie rufst Du es denn jetzt auf? Sicher das es nicht die Batch ist die kurz aufblitzt?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#42
Ohne Batch.
Hoch und runter fahren via GPO. Das ist auch sauber ohne fenster.

Den Musik toggle mache ich via G Knopf an meiner Logitech Tastatur. Diese ruft mit Command und dem Hide Window die ps1 auf.
"powershell.exe -WindowStyle Hidden -noninteractive -command "&{C:\Users\kaich\Desktop\PS\Sound_umstellen.ps1}""
(siehe Bild)

Gesendet von meinem LG-H850 mit Tapatalk


Otto123

Zitat von: Beta-User am 11 Oktober 2019, 14:16:17
....
Setzt halt das Vorhandensein von Perl auf dem Win-PC voraus, dafür wären wir "in gewohnten Bahnen" und nicht abhängig von "irgendwelchen" gitub-Repos
....
Ich habe über die "gewohnten" Bahnen nochmal nachgedacht :) - und heut zufällig auch schon was getestet. Ein durchaus gewohnter Ansatz wäre auch der mosquitto_sub Client
Das Setup unter Windows ist unkompliziert und schnell, genauso wie die Verwendung per Kommandozeile. Auch die Doku ist als manpage einfach da :) Und damit wäre die Verwendung unter Windows und linux gleich. Also auch für den Fall das man von linux Systemen ohne FHEM usw. einfach mal ein paar Werte an den FHEM Server schicken will.
Auf debian braucht man nur mosquitto-clients für mosquitto_pub
Auf Windows https://mosquitto.org/download/ die exe herunterladen und dann ohne den Dienst installieren. Anschließend hat man "C:\Program Files\mosquitto\mosquitto_pub.exe"

Kann man dann sicher auch ganz einfach aus der Powershell aufrufen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#44
Gute Idee und einheitlich. Müsste man nur schauen in wie weit man das bisherige Script anpassen müsste. Da mqtt immer nach dem gleichen Prinzip funktioniert, kann es nicht mal viel sein.

Hattest du das Script mal getestet? Hab es bei mir seit Fertigstellung aktiv und habe genau was ich wollte. Läuft 1a.

Einzig der delay am Ende vor dem Disconnect nervt. Wenn der auf eine sekunde steht reicht das aber am liebsten hätte ich den ganz weg. Das sorgt aber bei mehreren Nachrichten dafür, dass nicht alle durch kommen, da die Verbindung schneller getrennt ist als das gesendet worden ist. Ggf macht es der andere Client auch einfach besser. Also ein Grund mehr das zu testen.

Gruß,
Kai


EDIT: http://www.steves-internet-guide.com/mosquitto_pub-sub-clients/
Auch direkt was gefunden. Geht sogar mit Zertifikaten usw. Nochmal eine kleine Nummer besser.

@Beta-User: Kann der MQTT2 FHEM Server SSL o.ä.?


Gesendet von meinem LG-H850 mit Tapatalk