Dazu habe ich (bzw. mein Freund Google) im Internet den schon von Teddy zitierten Beitrag http://homematic-forum.de/forum/viewtop ... box#p43028 gefunden.
Dabei gab es zwei Probleme:
1. Die Zeile
MD5=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
Die HM kennt weder iconv noch md5sum, aber Tcl.
Ich habe also folgendes Tsc-Script angelegt:
Code: Alles auswählen
#!/bin/tclsh
package require md5
proc md5 {str} {
string tolower [::md5::md5 -hex $str]
}
proc utf16 {str} {
encoding convertto unicode $str
}
puts [md5 [utf16 [lindex $argv 0]]]
Die Funktion md5 ermittelt den md5-Code des Strings und ersetzt somit md5sum
Das Script steht bei mir auf dem USB-Stick, der an /usr/local/foo/disk gemountet ist; dort im Verzeichnis bin -- wo sonst.
2. Das auf der CCU installierte wget kann kein post. Dafür gibt es aber das von dirch: http://homematic-forum.de/forum/viewtop ... get#p26433
liegt bei mir auch unter /usr/local/foo/disk/bin/wget
Damit ergeben sich die beinen folgenden scripte
Code: Alles auswählen
#!/bin/sh
# ----------------------------------------------------------------------
WGET=/usr/local/foo/disk/bin/wget
WEBCM="http://fritz.box/cgi-bin/webcm"
LOGIN="getpage=../html/login_sid.xml"
Passwd="FBPASSWORT"
# ----------------------------------------------------------------------
# Challenge abholen
ChallengeXML=$(wget -O - "$WEBCM?$LOGIN" 2>/dev/null | grep Challenge)
Challenge=$(echo $ChallengeXML | awk '{match($0,/>[^<>]+</); print substr($0,RSTART+1,RLENGTH-2)}')
# ----------------------------------------------------------------------
# login aufbauen und hashen
CPSTR="$Challenge-$Passwd"
MD5=`/usr/local/foo/disk/bin/cpwmd5 $CPSTR`
RESPONSE="$Challenge-$MD5"
POSTDATA="login:command/response=$RESPONSE&getpage=../html/de/menus/menu2.html"
# login senden und SID herausfischen
SID=$($WGET -O - --post-data="$POSTDATA" "$WEBCM" 2>/dev/null | \
grep "name=\"sid\"" | \
head -1 | \
awk '{match($0,/value="[^"]+"/); print substr($0,RSTART+7,RLENGTH-8)}')
# ----------------------------------------------------------------------
# Rufumleitung aktivieren
POSTDATA="getpage=../html/de/menus/menu2.html\
&telcfg:settings/Diversity0/Active=1\
&sid=$SID"
$WGET -O /dev/null --post-data="$POSTDATA" "$WEBCM" 2>/dev/null
# ----------------------------------------------------------------------
# WLAN ausschalten
POSTDATA="getpage=../html/de/menus/menu2.html\
&wlan:settings/ap_enabled=0\
&sid=$SID"
$WGET -O /dev/null --post-data="$POSTDATA" "$WEBCM" 2>/dev/null
# ----------------------------------------------------------------------
# Logout
POSTDATA="getpage=../html/confirm_logout.html\
&security:command/logout=\
&sid=$SID"
$WGET -O /dev/null --post-data="$POSTDATA" "$WEBCM" 2>/dev/null
# ----------------------------------------------------------------------
Code: Alles auswählen
#!/bin/sh
# ----------------------------------------------------------------------
WGET=/usr/local/foo/disk/bin/wget
WEBCM="http://fritz.box/cgi-bin/webcm"
LOGIN="getpage=../html/login_sid.xml"
Passwd="FBPASSWORT"
# ----------------------------------------------------------------------
# Challenge abholen
ChallengeXML=$(wget -O - "$WEBCM?$LOGIN" 2>/dev/null | grep Challenge)
Challenge=$(echo $ChallengeXML | awk '{match($0,/>[^<>]+</); print substr($0,RSTART+1,RLENGTH-2)}')
# ----------------------------------------------------------------------
# login aufbauen und hashen
CPSTR="$Challenge-$Passwd"
MD5=`/usr/local/foo/disk/bin/cpwmd5 $CPSTR`
RESPONSE="$Challenge-$MD5"
POSTDATA="login:command/response=$RESPONSE&getpage=../html/de/menus/menu2.html"
# login senden und SID herausfischen
SID=$($WGET -O - --post-data="$POSTDATA" "$WEBCM" 2>/dev/null | \
grep "name=\"sid\"" | \
head -1 | \
awk '{match($0,/value="[^"]+"/); print substr($0,RSTART+7,RLENGTH-8)}')
# ----------------------------------------------------------------------
# Rufumleitung deaktivieren
POSTDATA="getpage=../html/de/menus/menu2.html\
&telcfg:settings/Diversity0/Active=0\
&sid=$SID"
$WGET -O /dev/null --post-data="$POSTDATA" "$WEBCM" 2>/dev/null
# ----------------------------------------------------------------------
# WLAN einschalten
POSTDATA="getpage=../html/de/menus/menu2.html\
&wlan:settings/ap_enabled=1\
&sid=$SID"
$WGET -O /dev/null --post-data="$POSTDATA" "$WEBCM" 2>/dev/null
# ----------------------------------------------------------------------
# Logout
POSTDATA="getpage=../html/confirm_logout.html\
&security:command/logout=\
&sid=$SID"
$WGET -O /dev/null --post-data="$POSTDATA" "$WEBCM" 2>/dev/null
# ----------------------------------------------------------------------
Wer irgendwelche Sonderzeichen im Passwort hat muss aufpassen. Als alter Unixer tue ich sowas nicht, weil in manchen Terminals einfach nur eine rudientäre Tastatur tut.
Bei mir ist fritz.box die richtige ip, weil ich das Script auch von einem entfernten Linux aus nutzen will und dann soll es natürlich nicht das dortige WLAN abschalten.
Nun braucht man nur noch so WebUI-Script mit einem der gefürchteten system.Exec (Abreise entsprechend)
string stdout; string stderr; system. ... stderr);
Vielleicht hilft es dem einen oder anderen.
Viele Spaß damit