[gelöst] Notify mit Sys-Befehl und Dummy-Fütterung langsam vs. Konsole schnell

Begonnen von presskopf, 07 September 2022, 16:25:22

Vorheriges Thema - Nächstes Thema

presskopf

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

Wernieman

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)
- Was machen die anderen Scripte, die Du hier nicht schreibst, aber oben aufrufst?

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

presskopf

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'"



presskopf

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'");;

Wernieman

Nochmals:
Anstatt system mit & besser gleich die ""

Siehe angehängten Link in meinem ersten Beitrag
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

presskopf

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'\"");;

Otto123

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"
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

presskopf