joshuar / go-hass-agent

A Home Assistant, native app for desktop/laptop devices.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[SENSOR] connected microphone usage

joshuar opened this issue · comments

What are the sensors you would like to see in Go Hass Agent? What do they measure? Why are they useful? How would you use them in Home Assistant?

  • A sensor that records when a connected microphone is being used
  • Just whether the microphone is in use or not.
  • As a binary sensor, could be used to change lights/shut doors/send notifications to indicate someone is on a call/streaming etc.

How do you access the sensor(s) currently?

  • It's not clear whether this is exposed anywhere or easily measure. Pipewire on Linux might hold something like this.

I'm not 100% sure if you have access to this on your end, but a couple things that might be helpful:

You can see a list of all microphones using arecord:

jay@Navua-Neon:/dev/snd$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Ultimate [Razer Nari Ultimate], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 0: ALC1220 Analog [ALC1220 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 2: ALC1220 Alt Analog [ALC1220 Alt Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 3: C930e [Logitech Webcam C930e], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

If the microphone is in use, lsof will return an output associated with it - assuming you know the microphone ID (capture information on card 1, device 0 here - aka C1D0c or Card1Device0capture).

jay@Navua-Neon:/dev/snd$ lsof /dev/snd/pcmC1D0c
lsof: WARNING: can't stat() overlay file system /var/lib/docker/overlay2/5fded3f178384781127daf6c34fabba88f8e1146d286fd8fbe0db0c59229a534/merged
      Output information may be incomplete.
lsof: WARNING: can't stat() overlay file system /var/lib/docker/overlay2/452460be3173a7bd5e56d88f8a2ca775a4c6fad529d6216c671fbad21873c55c/merged
      Output information may be incomplete.
lsof: WARNING: can't stat() nsfs file system /run/docker/netns/997e324acb67
      Output information may be incomplete.
lsof: WARNING: can't stat() nsfs file system /run/docker/netns/3c6298a7ffce
      Output information may be incomplete.
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
pulseaudi 1284  jay  mem    CHR 116,17          1218 /dev/snd/pcmC1D0c
pulseaudi 1284  jay   91u   CHR 116,17      0t0 1218 /dev/snd/pcmC1D0c

If the machine has PulseAudio, you can do that to get cleaner output without needing to fumble through figuring out which devices are available:

jay@Navua-Neon:/dev/snd$ pactl list source-outputs
Source Output #33
        Driver: protocol-native.c
        Owner Module: 10
        Client: 29
        Source: 3
        Sample Specification: s16le 1ch 44100Hz
        Channel Map: mono
        Format: pcm, format.sample_format = "\"s16le\""  format.rate = "44100"  format.channels = "1"  format.channel_map = "\"mono\""
        Corked: no
        Mute: no
        Volume: mono: 65536 / 100% / 0.00 dB
                balance 0.00
        Buffer Latency: 0 usec
        Source Latency: 2507 usec
        Resample method: n/a
        Properties:
                media.name = "recStream"
                application.name = "ZOOM VoiceEngine"
                native-protocol.peer = "UNIX socket client"
                native-protocol.version = "35"
                application.process.id = "61602"
                application.process.user = "jay"
                application.process.host = "Navua-Neon"
                application.process.binary = "zoom"
                application.language = "en_US.UTF-8"
                window.x11.display = ":1"
                application.process.machine_id = "b6874eae2f1547e582d67dd83ca49e8e"
                application.process.session_id = "1"
                module-stream-restore.id = "source-output-by-application-name:ZOOM VoiceEngine"

In this case, Zoom is using my microphone (process 61602).

Output is empty when nothing is using the Pulseaudio microphone:

jay@Navua-Neon:/dev/snd$ pactl list source-outputs
jay@Navua-Neon:/dev/snd$