Hallo zusammen,
in Zeiten von vielen Homeofficeteilnehmern muss man ab und zu die Bandbreite für bestimmte Teilnehmer regulieren.
Die Steuerung will ich per fhem vereinfachen:
Ein Dummy zum Steuern: net_MAX.BW.KIDS - on / off
Ein Dummy zum Prüfen: net_MAX.BW.KIDS_status - on /off
Im Notify habe ich stehen:
(net_MAX.BW.KIDS) {
if ($EVENT eq "off"){
system("/home/pi/apps/max_bw_kids_off.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep No && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status off'");;
}
elsif ($EVENT eq "on"){
system("/home/pi/apps/max_bw_kids_on.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep Yes && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status on'");;
}
else{}
}
Die beiden Skripte:
max_bw_kids_on.sh (off analog)
#!/bin/bash
/usr/bin/expect - << EndMark
log_file switch.log
spawn telnet 192.168.0.1
expect "Password: "
send "saumäßiggeheim\r"
expect "> "
send "cd Setup/IP-Router/Firewall/Rules\r"
expect "> "
send "set MAX_BANDWIDTH_KIDS {Firewall-Rule} yes\r";
expect "> "
send "exit\r";
EndMark
max_bw_kids_on_status.sh
#!/bin/bash
/usr/bin/expect - << EndMark
log_file switch.log
spawn telnet 192.168.0.1
expect "Password: "
send "immernochsaumäßiggeheim\r"
expect "> "
send "cd Setup/IP-Router/Firewall/Rules/MAX_BANDWIDTH_KIDS\r"
expect "> "
send "dir Firewall-Rule *\r"
expect "> "
send "exit\r";
EndMark
Es dauert gute 10 Sekunden + x bis der Status-Dummy gefüttert wird während Fhem am träumen is (nicht ansprechbar). Die Änderungen im Router erfolgen sofort.
Wenn ich den Befehl in der Konsole ausführe geht alles ruckzuck: Ausführung und Status-Dummy.
Übersehe ich irgend etwas, das bremst? Irgendeine Schleife?
Viele Grüße
Matthias
Anstatt DOIF würde ich notify nehmen, aber das nur am Rande.
system("/home/pi/apps/max_bw_kids_off.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep No && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status off'");;
Wenn Du schon mit externen Scripten arbeitest
- kannst Du nicht das komplette in EIN Skrypt packen?
- Nicht mit System sondern "" für "nonblocking" (siehe z.B. https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html))
- Was machen die anderen Scripte, die Du hier nicht schreibst, aber oben aufrufst?
Hi, ich habe doch ein Notify am Start.
Es gibt nur drei Skripte, welche ich oben beschrieben habe:
- max_bw_kids_on.sh (off analog)
- max_bw_kids_on_status.sh (Dieses fragt den Firewall-Wert im Router ab, wertet die Zeile 23 der Rückgabe mittels awk und grep aus und soll dann den Status-Dummy ändern).
Der Abfrage- und Status-Änderungspart ist anscheinend das, was bremst:
/home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep Yes && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status on'"
Da habe ich mir selbst eine Antwort / Lösung gegeben: :)
Teil zwei mit einem & von Fhem abgelöst.
schnell:
system("/home/pi/apps/max_bw_kids_on.sh && (/home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep Yes && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status on')&");;
langsam:
system("/home/pi/apps/max_bw_kids_on.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep Yes && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status on'");;
Nochmals:
Anstatt system mit & besser gleich die ""
Siehe angehängten Link in meinem ersten Beitrag
Hmmmhmmm,
Du meinst quasi so?
fhem("\"/home/pi/apps/max_bw_kids_off.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep No && /opt/fhem/fhem.pl 7072 'set net_MAX.BW.KIDS_status off'\"");;
sowas geht (getestet)
defmod n_onoff notify Aktor01:o[nf]+ "./fhem.pl 7072 "setreading Test Aktor01 $EVENT""
könnte also bei Dir auch so gehen (nicht getestet)
net_MAX.BW.KIDS:o[nf]+ "/home/pi/apps/max_bw_kids_$EVENT.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep No && /opt/fhem/fhem.pl 7072 "set net_MAX.BW.KIDS_status $EVENT""
Es gab bei mir immer Schwierigkeiten mit der Pipe, deswegen der (schon oben) gut gemeinte Rat: ein Script und dies aufrufen aus FHEM:
script.sh erzeugen
{qx(echo '/home/pi/apps/max_bw_kids_\$1.sh && /home/pi/apps/max_bw_kids_status.sh | awk NR==23 | grep No && /opt/fhem/fhem.pl 7072 "set net_MAX.BW.KIDS_status \$1"' >script.sh)}
und im notify einfach in die DEF net_MAX.BW.KIDS:o[nf]+ "bash script.sh $EVENT"
Cool & ein Danke an Euch.
Wieder was gelernt. :)