NEWS
Display via ssh steuern
-
Hallo in die Runde,
ich nutze mehrere Raspberrys zur Steuerung individueller Infoboards/TV-Screens, ähnlich dem Projekt MagicMirror. Zur Energieeinsparung möchte ich jedoch nur ein aktives Display haben, wenn sich eine Person im Raum befindet.
Die Präsenz ermittle ich mit einem Radar-Sensor (funktioniert übrigens phantastisch und sehr schnell) über den ioBroker Tuya - Adapter. Auf die Raspberrys habe ich Zugriff via SSH, ich steuere den Monitor (on/off) über CEC (Consumer Electronics Control).
Übergeben muss ich zum Ausschalten des TV folgenden Befehl: echo "standby f.f.f.f" | cec-client -s -d 1 (und zum Anschalten 'echo "on f.f.f.f" | cec-client -s -d 1'
Ich bin leider nicht der begnadete Blockly-Programmierer, vielleicht kann mir dennoch jemand den richtigen "Schubs" geben, wo es gerade hängt.
Die RPi's haben zur Sicherheit eigene User und Passwörter. Wie kann ich die Befehle zum An- und Ausschalten der Monitore ordnungsgemäß an die kleinen Rechenknechte übertragen bzw. wo müssen die Zugangsdaten hinterlegt werden?Anbei mein Blockly-Versuch (habe ich auch hier aus dem Forum zusammengeklickt) .
c<xml xmlns="https://developers.google.com/blockly/xml"> <block type="on_ext" id="RoOer}|h_)FD-PCG;*Pq" x="13" y="38"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="Terd]Gb@K3@$6@vmm^k."> <field name="oid">tuya.0.bf6ddf30e3470f76a3domw.1</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="#cbqp!R+iTB16EL_#O[z"> <value name="IF0"> <block type="logic_compare" id="wQ6bIybi8v(|Gv;y+kT}"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="Vii;mGts6OXmT+g$Tm^V"> <field name="ATTR">val</field> <field name="OID">tuya.0.bf6ddf30e3470f76a3domw.1</field> </block> </value> <value name="B"> <block type="logic_boolean" id="%3qzkpVva9im+^O,)3-{"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="comment" id="F9fYL:ox!)97!BS=in3K"> <field name="COMMENT">schalte Monitor aus&#10;</field> <next> <block type="exec" id="/hP+;?cEzpn]1I9qi*LQ"> <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation> <field name="WITH_STATEMENT">FALSE</field> <field name="LOG"></field> <value name="COMMAND"> <shadow type="text" id="*|V44Z;l8nvL!Kj}|Xt="> <field name="TEXT">ssh 192.168.160.109 echo "standby f.f.f.f" | cec-client -s -d 1</field> </shadow> </value> </block> </next> </block> </statement> </block> </statement> </block> </xml>ode_text
-
@garbleflux
Versuchs mal ohne dasssh 192.168.160.109
vorweg.
Du willst ja vom ioBroker keine SSH-Verbindung öffnen, sondern lediglich einen Konsolenbefehl absetzen. SSH brauchst Du nur, um vom PC auf den Pi zu kommen. Wenn Du schon dort bist, braucht's kein SSH.Übrigens: Wenn Du den Trigger in "ist größer als letztes" änderst, kannst Du Dir das "Falls" sparen.
Der feuert dann nur beim Wechsel vonfalse
auftrue
.Ein bisschen Lesestoff: https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps
Edit
Hab' jetzt erst geblickt, dass zentral vom ioBroker die einzelnen Pi's angesprochen werden.
Dann so wie @BananaJoe es vorschlägt. -
@garbleflux also, der Befehl
ssh
an sich lässt keine Angabe / Übergabe des Passwortes zu.Lösung 1 (vermutlich die schlechtere, aber diese funktioniert) wäre
sshpass
was du auf dem ioBroker-System nachinstallieren müsstest.Dann kannst du per
sshpass -p 'deinpasswort' ssh benutzername@192.168.160.109 echo ...
Benutzernamen und Passwort übergeben => man schreibt den Benutzernamen einfach mit
benutzername@
vor die IP-Adresse (oder Hostnamen).Lösung 2 ist das du dem iobroker Benutzer (unter diesem wird ja der Befehl ausgeführt) erlaubst dich ohne Passwort an dem anderem System anzumelden.
Dazu meldest du dich am besten auf deinem ioBroker-System per SSH an (du brauchst eine Shell / Eingabeaufforderung / Terminal) und wechselst zu Benutzeriobroker
:sudo -u iobroker /usr/bin/bash cd ~
Der 2. Befehl - dann schon als Benutzer iobroker, wechselt in dess Heimatverzeichnis.
Mitssh-keygen -t ecdsa
erzeugts du nun einen privaten und öffentlichen SSH-Key für diesen Benutzer. Wenn er nach einem Passwort fragt, einfach nur Enter/Return drücken (also keines vergeben).
Danach kannst du den öffentlichen Schlüssel auf das Zielsystem kopieren:ssh-copy-id benutzername@192.168.160-190
Er fragt nach dem Passwort und kopiert den Schlüssel drüben in das richtige Verzeichnis.
Danach solltest du dich perssh benutzername@192.168.160.190
an dem anderen System ohne Passwort und sonstige Rückfragen direkt anmelden können.
In deinem Blockly müsstest du halt noch dasbenutzername@
ergänzen.Lösung 3 wäre ein Skript welches die Befehle ausführt, als Dienst, was du auf deinen Raspi laufen lässt und welches z.B. per MQTT mit dem ioBroker verbindest. Dann könntest du es leicht per Datenpunkte steuern. Hast du gerade nur Bahnhof verstanden, nimm Lösung 1 oder 2
Tipp: vermutlich weißt du das schon: Den Befehl bei
exec
im Blockly kannst du auch aus Textbausteinen und Variablen zusammenbauen. -
@bananajoe
Danke für den ausführlichen Hinweis - werde es so umsetzen und mit sshpass probieren.
VG Michael