Hi.
Ich habe einen TP-Link GB Ethernet Switch (TL-SG2210P), der Power over Ethernet beherrscht.
Ich habe einige Geräte per PoE versorgt, die ich gerne mit FHEM ferngesteuert schalten würde.
Man kann PoE per Port entweder über die Weboberfläche des Switches schalten, oder per SSH.
Um z.B. Port 1 auszuschalten, muss ich mich mit Username und Passwort per ssh einloggen, und dann eingeben:
enable
configure
interface gigabitEthernet 1/0/1
power inline supply disable
Jeweils mit Enter angeschlossen.
Wie könnte ich so was mit FHEM automatisieren?
Also per script einloggen und die Kommandos senden?
Danke für Euro Antworten.
Hallo,
unter Unix würde ich das mit expect | ssh skripten und per "" als Shell-Kommando aus einem notify auf ein set dummy on/off absetzen. Zu expect gibt es gute Tutorials.
Grüße
Boris
Bingo.
Expect war der entscheidende Tip.
Vielen herzlichen Dank.
Kann ich in FHEM eine Aktion auslösen, wenn eine spezielle IP Adresse längere Zeit nicht erreichbar ist?
Zitat von: Uhrheber am 22 September 2016, 20:54:00
Kann ich in FHEM eine Aktion auslösen, wenn eine spezielle IP Adresse längere Zeit nicht erreichbar ist?
Hallöchen, ganz easy:
Das Modul "PRESENCE" benutzen und ein Notify auf den Status. Wenn dieser "absent" ist, ist das Gerät nicht erreichbar.
Presence kann man recht gut konfigurieren und es werden auch temporär fehlgeschlagene Pings abgefangen.
Grüße
Sebastian
könnte der threadersteller eventuell sein script hier veröffentlichen? ich bin ebenfalls auf der suche nach einer möglichkeit den SG2210P per fhem zu verwalten.
hab mir diverse expect tuts angeschaut, so richtig schlau werd ich daraus allerdings nicht...
habe folgendes expect script "poe_set.exp" erstellt welches in der linux shell mit dem aufruf
/usr/bin/expect /opt/fhem/poe_set.exp w.x.y.z user password 2 enable/disable
einwandfrei den port aktiviert und deaktiviert
#!/usr/bin/expect -f
set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set port [lindex $argv 3]
set status [lindex $argv 4]
if { $host == "" || $user == "" || $pass == "" || $port == "" || $status == "" } {
puts "Usage: <host> <user> <password> <switchport> <POE enable/disable>\n"
exit 1
}
spawn telnet $host
expect "User:"
send "$user\r"
expect "Password:"
send "$pass\r"
send "enable\r"
send "configure\r"
send "interface gigabitEthernet 1/0/$port\r"
send "power inline supply $status\r"
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
wenn ich das script aber per folgendem notify aktivieren will
define n_PoE_Port_2_on notify PoE_Port_2_Switch:on {system("/usr/bin/expect poe_set.exp w.x.y.z user password 2 enable");;}
gibts folgenden mist im logfile und das script wird nicht ausgeführt...
spawn telnet 10.0.0.248
Trying 10.0.0.248...
Connected to 10.0.0.248.
Escape character is '^]'.
***************** User Access Login ********************
User:$[1D$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$
Password:
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
***************** User Access Login ********************
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
User:$
Password:
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
***************** User Access Login ********************
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
User:$[1D$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Connection closed by foreign host.
2018.04.18 08:51:11 3: n_PoE_Port_2_on return value: -1
was kann die ursache dafür sein?
Das login scheint nicht zu funktionieren ...
Aber mal eine andere Frage, kann der Switch nicht auch Login per Key (geht jedenfalls hier, sind aber andere TP-Links)? Wäre eigentlich die Optimale Möglichkeit ...
Hast Du mal Probiert, ob der User FHEM auf der Konsole das Script starten kann?
"User:$[1D$[1D " sieht mir nach Coding-Problemen aus ...
in der fhem console klarerweise das selbe, funzt nicht
character encoding wäre naheliegend nachdem was im log steht, aber wie dem entgegenwirken?
Zitat
Aber mal eine andere Frage, kann der Switch nicht auch Login per Key (geht jedenfalls hier, sond aber andere TP-Links)? Wäre eigentlich die Optimale Möglichkeit ...
bitte näher erläutern, ich weiß gerade nicht was du meinst...
Ich meinte nicht "Fhem-Console", sondern als User FHEM in der ssh-konsole.
Bezüglich ssh-key
ssh kann nicht nur mit User/Passwort, sondern auch mit User/ssh-key sich Authentifiziere. Ist besser (ujnd sicherer), vorallem bei automatischen Logins.
Weiß nur nicht, ob Dein Switch es kann und wo man es einstellt. Für die generierung eines ssh-.keys gibt es genügend Anleitungen
user fhem kann das script ebenfalls problemlos ausführen
ob nun per telnet oder ssh, die übergabe bzw. das ausführen des expect scripts wird wieder failen nach der derzeitigen variante. wenn die telnet variante mal steht kann ich das immer noch auf die ssh variante übertragen... momentan liegt das hase aber noch woanders im pfeffer...
Machst Du jetzt ssh oder telnet??
jetzt telnet
telent ....wenig Wissen (mehr) meinerseits ...
aber Grundsätzlich zum Debuggen:
Packe den expect-Befel mal in ein Eigenes Script.
Gebe Dir dort die Übergebenen Variablen aus.
Starte das dann per FHEM ....
übergeben wird anscheinend korrekt:
spawn telnet 10.0.0.248
Trying 10.0.0.248...
Connected to 10.0.0.248.
Escape character is '^]'.
***************** User Access Login ********************
User:$[1D$[1D [20D[1A$[1D [20D[1A$
Password:
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
***************** User Access Login ********************
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
User:$
Password:
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
***************** User Access Login ********************
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
User:$[1D$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Connection closed by foreign host.
10.0.0.248
user
password
2
enable
2018.04.18 11:55:19 3: n_PoE_Port_2_on return value: -1
ZitatUser:$[1D$[1D
Bist Du Dir sicher?
P.S: wie hast DU es auf der Konsole getestet? Mit "sudo fhem" oder richtig "su - fhem"?
per su - fhem
hat anstandslos gefunkt
Zeig mal Dein Script ... ist mir momentan rätselhaft
root@fhem:/opt/fhem# sudo su - fhem
fhem@fhem:~$ cd /opt/fhem
fhem@fhem:~$ ./poe.sh
spawn telnet 10.0.0.248
Trying 10.0.0.248...
Connected to 10.0.0.248.
Escape character is '^]'.
***************** User Access Login ********************
User:****
Password:
TL-SG2210P>enable
TL-SG2210P#configure
TL-SG2210P(config)#interface gigabitEthernet 1/0/2
TL-SG2210P(config-if)#power inline supply enable
TL-SG2210P(config-if)#exit
TL-SG2210P(config)##2018-04-18 14:43:32,[User]/3/Login the CLI by root on vty0 (10.0.0.201).
#2018-04-18 14:43:32,[PoE]/3/Power supply status of gigabitEthernet 1/0/2 changes from off to on.
#2018-04-18 14:43:42,[Link]/3/gigabitEthernet 1/0/2 changed state to up.
10.0.0.248
****
****
2
enable
das sh script
/usr/bin/expect /opt/fhem/poe_set.exp 10.0.0.248 **** **** 2 enable
das expect script
#!/usr/bin/expect -f
set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set port [lindex $argv 3]
set status [lindex $argv 4]
#if { $host == "" || $user == "" || $pass == "" || $port == "" || $status == "" } {
# puts "Usage: <host> <user> <password> <switchport> <POE enable/disable>\n"
# exit 1
#}
spawn telnet $host
expect "User:"
send "$user\r"
expect "Password:"
send "$pass\r"
send "enable\r"
send "configure\r"
send "interface gigabitEthernet 1/0/$port\r"
send "power inline supply $status\r"
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
puts "$host"
puts "$user"
puts "$pass"
puts "$port"
puts "$status"
Ich hatte Dir vorgeschlagen, mal das "/usr/bin/expect /opt/fhem/poe_set.exp 10.0.0.248 **** **** 2 enable" in ein eigenes Script zu pachen
ala (nur ein Ungetesteter Schnellschuß)
#!/bin/bash
IP=$1
PORT=$2
WIE=$3
echo "$IP $PORT $WIE"
/usr/bin/expect /opt/fhem/poe_set.exp $IP **** **** $PORT $WIE
Ich habe mit Absicht User/Passwort hier nicht per Parameter übergeben. Sollte doch eigentlich statisch sein?
Und dann in FHEM audrufen mit
"./paf/zum/tollen/scirpt/script.sh 10.0.0.248 2 enable"
Ist zwar dann erstmal ein schritt mehr als vorher, dafür kannst Du besser testen...
hat nix geändert:
10.0.0.248 2 enable
spawn telnet 10.0.0.248
Trying 10.0.0.248...
Connected to 10.0.0.248.
Escape character is '^]'.
***************** User Access Login ********************
User:$[1D$[1D [20D[1A$[1D [20D[1A$
Password:
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
***************** User Access Login ********************
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
User:$
Password:
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
***************** User Access Login ********************
Press any key to continue (Q to quit)
Press any key to continue (Q to quit)
User:$[1D$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$[1D [20D[1A$
Press any key to continue (Q to quit)
Login invalid.
Press any key to continue (Q to quit)
Connection closed by foreign host.
2018.04.19 06:54:32 3: n_PoE_Port_2_on return value: -1
mich würds brennend interessieren wie der threadersteller das damals scheinbar erfolgreich implementiert hat...
Mit was für einem Editor hast Du es bearbeitet??
Da Script funktioniert aus der Konsole, aber nicht aus FHEM??
scripte mit nano erstellt und ausführbar gemacht, laufen unter allen benutzern einwandfrei in der console durch...
Komisch .. kann ich mir nicht erklären ...
Kannst DU mal mit den "Lang" Einstellungen rumspielen?
Bzw. Dir ausgeben?
wie meinen?
Sorry, dachte Du hast schon in der Richtugn gearbeitet ...
http://linuxwiki.de/locale (http://linuxwiki.de/locale)
also einfach mal reinsetzen:
LC_ALL=de_DE.UTF-8
LANG=de_DE.UTF-8
Bzw vorher einfach mal ausgeben lassen:
echo $LC_ALL
echo $LANG
Dann eventuell mal mit dem Parameter de_DE.UTF-8 spielen...
Edit:
Die auf dem System verfügbaren anzeigen:
locale -a
alle möglichen de und en varianten durchprobiert, es verändert sich nix... ich gebs auf...
da ich hier so einen switch nicht habe, kann ich Dir leider nicht weiterhelfen ....
danke trotzdem für deine inputs! :thumbsup:
Was mich wundert, das es auf der Konsole geht, aber beim Aufruf durch FHEM nicht.
habs jetzt in perl gelöst
folgende routine in die myutils
sub poeswitch {
my ($port, $status) = @_;
use Net::Telnet;
my $remote;
$remote = new Net::Telnet (Timeout => 10,
Errmode => 'die');
$remote->open("10.0.0.248");
$remote->waitfor('/User:/');
$remote->print("user") ;
$remote->waitfor('/Password:/');
$remote->print("password") ;
$remote->waitfor('/TL-SG2210P/');
$remote->print("\n");
$remote->print("enable\n");
$remote->waitfor('/TL-SG2210P/');
$remote->print("configure\n");
$remote->waitfor('/TL-SG2210P/');
$remote->print("interface gigabitEthernet 1/0/$port\n");
$remote->waitfor('/TL-SG2210P/');
$remote->print("power inline supply $status\n");
$remote->waitfor('/TL-SG2210P/');
}
eventuell muss auf dem ausführenden system NET::Telnet via cpan oder libnet-telnet-perl via packagemanager nachinstalliert werden
danach klappt der aufruf von
define n_PoE_Port_2_on notify PoE_Port_2_Switch:on {poeswitch("2","enable")};;
define n_PoE_Port_2_off notify PoE_Port_2_Switch:off {poeswitch("2","disable")};;
und der switch schaltet den angegebenen port
vielleicht hilfts ja nochmal jemandem :)