Detectar se o Monitor HDMI está desligado

3

Eu tenho um monitor conectado à minha máquina através de HDMI. Agora, se alguém desligar o Monitor, através dos Soft Buttons, ou removendo o cabo de alimentação, desejo ser notificado e executar um Shell Script.

Eu tentei muitas maneiras de identificar quando um monitor é ligado ou desligado (está sempre conectado). A única técnica que chega perto é:

# ddccontrol -p

Quando o monitor externo está conectado, isso retorna todos os tipos de detalhes sobre o monitor. Eu poderia escrever um script para analisar a saída para isso. No entanto, isso parece ser uma técnica não confiável para uso não supervisionado.

Existe alguma maneira através da qual eu poderia obter uma resposta Sim / Não para o Monitor ser Ligado / Desligado?

EDIT: Seria preferível se eu recebesse uma mensagem sobre a mudança de status. Como isso será executado continuamente por dias, não desejo pesquisar o status do monitor. Em vez disso, caso esteja desligado, gostaria de ser informado através de uma mensagem.

    
por darnir 19.01.2013 / 20:39

1 resposta

2

Não vejo nada de errado em analisar a saída de ddccontrol . DDC é o caminho certo para obter as informações desejadas. Ao contrário do VGA, onde o DDC foi criado, o conector HDMI foi projetado para incluir o DDC desde o início. Eles até voltaram e modificaram o padrão DDC para adicionar mais recursos para HDMI, chamando-o de E-DDC .

No Linux, a ferramenta userland para acessar informações do DDC é ddccontrol , portanto, o fato de não ter um sinalizador que faz com que ele faça o que você quer que esteja pronto não é motivo para evitar usar o que é fornecido atualmente. Se qualquer coisa, é um convite para quebrar o código aberto e fornecer um patch.

Enquanto isso, aqui está um pequeno script em Perl com:

#!/usr/bin/perl
# monitor-on.pl
my $CMD = open '-|', 'ddclient -p' or die "Could not run ddclient: $!\n";
local $/ = undef;   # slurp command output
my $out = <$CMD>;
if ($out =~ m/> Power control/) {
    if ($out =~ m/id=dpms/) {
        print "asleep\n";
    }
    elsif ($out =~ m/id=on/) {
        print "on\n";
    }
    elsif ($out =~ m/id=standby/) {
        print "off\n";
    }
    else {
        print "missing?\n";
    }
}
else {
   # Monitor is either a) not DDC capable; or b) unplugged
   print "missing!\n";
}

Este script não foi testado. Eu não tenho caixas Linux não-headless ("cabeças"?) Para testar aqui. Se não funcionar, a correção deve ser óbvia.

Poderia ser mais inteligente. Ele não irá lidar com vários monitores agora, e é possível que sua análise de cadeia de caracteres possa ser confundida, já que ele não verifica se as cadeias de status de energia pesquisadas estão dentro da seção > Power control .

    
por 19.01.2013 / 23:13