NEWS
[auf Umweg gelöst] Fritzbox-LEDs via Telnet steuern
-
Hallo
Ich würde gerne die Preset-Anzeige meines Smartwares Homewizard-Systems auf einer alten Fritzbox 7170 über die LEDs anzeigen lassen, dass ich nicht jedesmal die App auf dem aufmachen muss um zu prüfen, ob richtig geschalten wurde.
Die LEDs der Fritzbox sind manuell über eine Telnet-Verbindung steuerbar. Jetzt würde ich gerne diese Steuerung an IO-Broker übergeben.
Hierfür habe ich im Smartwares-System virtuelle Schalter angelegt, die auf meinem IO-Broker den Zustand (0;1;2;3) im Objekt "javascript.0/Homewizard/Preset/PresetHome" hinterlegen.
Konfiguration zur Presetübertragung an IO-Broker
! ` > Smartwares Homewizard - Konfig
1 IO-Broker
1.1 Manuelle Objekterzeugung
1.1.1 Name=PresetHome
1.1.2 Typ=state
1.1.3 type=Zeichenkette
2 Virtuelle Schalter(Homewizard)
2.1 Preset01:
2.1.1 AN: HTTP GET "http://192.168.102.8:8087/set/PresetHome?value=0"
2.1.2 AUS: HTTP GET "http://192.168.102.8:8087/set/PresetHome?value=1"
2.2 Preset23:
2.2.1 AN: HTTP GET "http://192.168.102.8:8087/set/PresetHome?value=2"
2.2.2 AUS: HTTP GET "http://192.168.102.8:8087/set/PresetHome?value=3"
3 Automation(Homewizard)
3.1 Wenn Voreinstellung zuhause aktiviert dann Preset01 schalten ein
3.2 Wenn Voreinstellung Abwesend aktiviert dann Preset01 schalten aus
3.3 Wenn Voreinstellung Schlafen aktiviert dann Preset23 schalten ein
3.4 Wenn Voreinstellung Urlaub aktiviert dann Preset23 schalten aus `
Blockly-Testscript mit Sprachausgabe bei Änderung funktioniert einwandfreiJetzt würde ich gerne Eine Telnet-Session zu 192.168.100.3 aufbauen, via Passwort anmelden und dort 4 Befehle zur LED-Steuerung absetzen
nötige Befehle innerhalb Telnet-Session:
! ` > Bei Zuhause(PresetHome=0) aktiviert:
echo 14,2 >/var/led
echo 13,1 >/var/led
echo 4,1 >/var/led
echo 7,1 >/var/led
Bei Abwesend(PresetHome=1) aktiviert:
echo 14,1 >/var/led
echo 13,2 >/var/led
echo 4,1 >/var/led
echo 7,1 >/var/led
Bei Schlafen(PresetHome=2) aktiviert:
echo 14,1 >/var/led
echo 13,1 >/var/led
echo 4,2 >/var/led
echo 7,1 >/var/led
Bei Urlaub(PresetHome=3) aktiviert:
echo 14,1 >/var/led
echo 13,1 >/var/led
echo 4,1 >/var/led
echo 7,2 >/var/led `
Manuelle Aktion im Terminal-Fenster anhand PresetHome=0(Preset 'Zuhause' aktiviert)! ` > Fritz!Box web password:
BusyBox v1.8.2 (2009-04-22 13:54:57 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
ermittle die aktuelle TTY
tty is "/dev/pts/0"
Console Ausgaben auf dieses Terminal umgelenkt
echo 13,4 >/var/led
echo 14,1 >/var/led
echo 4,1 >/var/led
echo 7,1 >/var/led `
Leider bin ich in Linux/Javascript/etc nur wenig bewandert. (Lesen von Scripten und kleine Änderungen kein Problem - Komplette Neuentwicklung leider schon)
Würde mich daher freuen, wenn mir hier jemand weiterhelfen kann. (Bisherige Scripts in Blockly gemacht oder direkt übernommen und angepasst)
Gruß Florian
PS: Angegebene IP-Adressen sind in meinem LAN korrekt… ich verwende einen größeren IP-Adressbereich als üblich (Subnetzmaske:255.255.252.0)
-
Problem gelöst, wenn vielleicht auch mit Umweg
-
Expect-Pakete lokal nachinstalliert ("apt-get install expect")
-
Für jede der 4 Stati jeweils ein Script geschrieben. Script des Beispiels "Zuhause" (Abgelegt als "/home/pi/Documents/PresetZuhause"):
! ````
spawn telnet 192.168.100.3
set timeout 10
expect "Fritz!Box web password:"
send "<pass>\r"
expect "# "
send "echo 13,4 >/var/led\r"
expect "# "
send "echo 14,1 >/var/led\r"
expect "# "
send "echo 4,1 >/var/led\r"
expect "# "
send "echo 7,1 >/var/led\r"
expect "# "
send "exit\r"</pass>- Den Aufruf des Scripts dann in Blockly-Script als "Aktionen"-"exec" (Kommando="expect -f /home/pi/Documents/PresetZuhause") Komplettes "Blockly"-Script: >! ```` on({id: "javascript.0.Homewizard.Preset.PresetHome"/*PresetHome*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.Homewizard.Preset.PresetHome").val == 0) { exec('expect -f /home/pi/Documents/PresetZuhause'); } else if (getState("javascript.0.Homewizard.Preset.PresetHome").val == 1) { exec('expect -f /home/pi/Documents/PresetAbwesend'); } else if (getState("javascript.0.Homewizard.Preset.PresetHome").val == 2) { exec('expect -f /home/pi/Documents/PresetSchlafen'); } else if (getState("javascript.0.Homewizard.Preset.PresetHome").val == 3) { exec('expect -f /home/pi/Documents/PresetUrlaub'); } else { setState("sayit.0.tts.text", "de-DE_CLOUD_Male;" + 'Fehlerhafter Preset Status'); console.error("sayIt[de-DE_CLOUD_Male]: " + 'Fehlerhafter Preset Status'); } });
Es scheint so zu tun wie es soll. Weitere Tests werden es zeigen.
Vielleicht hat jemand noch eine bessere Lösung… (Als direktes Javascript/o.ähnl.)
Gruß Florian
-