//21.11.2016 Peter Vogel

  //siehe https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AHA-HTTP-Interface.pdf

  //FB_homeKommando


  //erst muss die Session-ID geholt werden - siehe FB_getSessionID

  //die Session-ID hat eine Gültigkeit ab letztem Kommando oder login von 60 Minuten

  //bei einem SID-Timeout kommt Fehler 403, den wir ignorieren, da wir eine Kommando-Abfrage permanent alle paar Minuten zu Logging-Zwecken machen

  //Notiz: bei "getswitchlist" bekam ich Http-Fehler 400 bei leerer oder nicht gültiger ain - ich hätte erwartet, dass ich ain leer lassen kann, da ich ja die Geräteliste abrufe


  //$0 = Ergebnisrückgabe als Text

  //$1 = Fritzbox Ort oder Bezeichnung, da ich mehrere habe

  //$2 = Session-ID, die wir uns über FB_getSessionID zuvor geholt haben

  //$3 = Identifikation des Aktors (fehlt dieser, dann kommt http-Fehler 400 - ich hätte 200 mit entsprechendem Hinweis erwartet)

  //$4 = Kommando: getestet "getswitchpower", "getswitchenergy", "gettemperature", "getswitchstate", "setswitchon", "setswitchof", "getdevicelistinfos"

  //$5 = zusätzliche Parameter - für "sethkrtsoll" - nicht getestet, da ich nur das DECT 200 Teil habe


C_TEXT($0;$1;$2;$3;$4;$ort;$SID;$ain;$kommando;$param;$url)

C_LONGINT($httpStatus)

C_BLOB($xmlBlob)


$ort:=$1

$SID:=$2

$ain:=$3

$kommando:=$4

$param:=""

If (Count parameters>4)

$param:=$5

End if 


  //z.B.: https://fritz.box/webservices/homeautoswitch.lua?ain=012340000123&switchcmd=setswitchon&sid=9c977765016899f8

Case of 

: ($ort="Büro")

$url:="https://xxxxxxxxxxx.myfritz.net:port"  //FB-Büro über Internet - https verwenden


: ($ort="Daheim")

$url:="http://fritz.box"  //FB-Daheim - lokal - http verwenden - bei https keine Verbindung

End case 


$url:=$url+"/webservices/homeautoswitch.lua?ain="+$ain+"&switchcmd="+$kommando+"&sid="+$SID


$httpStatus:=HTTP Get($url;$xmlBlob)


If ($httpStatus#200)

ALERT("Fehler: "+String($httpStatus))

TRACE

Else 


$xml:=BLOB to text($xmlBlob;UTF8 text without length)

SET TEXT TO PASTEBOARD($xml)

  //$DomRef:=DOM Parse XML variable($xml) //XML wird nur für Kommando "getdevicelistinfos" verwendet, sonst Text

$0:=$xml

End if 




  //20.11.2016 Peter Vogel

  //siehe https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_Technical_Note_-_Session_ID.pdf

  // FB_getSessionID

  //der login muss zweimal aufgerufen werden, das 1.Mal, um das Challenge zu erhalten, aus dem zusammen mit dem Kennwort der Response gebaut wird, und das 2.Mal eben mit dem Response, um die Session-ID zu bekommen


  //$0 = Rückgabe der Session-ID, die wir brauchen, um Http-GET Kommandos wie Dose schalten, Temp. auslesen usw. verschicken zu können

  //$1 = Fritzbox Bezeichnung oder Ort, falls mehrere - die urls sind in der Methode eingebaut

  //$2 = url bei Rekursion für Response Challenge


C_TEXT($0;$1;$2;$ort;$prm;$url;$xml;$SID;$DomRef;$ElementRef;$response;$challenge;$pw;$username;$blockTime)

C_BLOB($xmlBlob;$prmBlob)

C_LONGINT($httpStatus)


  //$ort:="Büro"

$ort:="Daheim"

If (Count parameters>0)

$ort:=$1

End if 

If (Count parameters>1)

$url:=$2

End if 


Case of 

: ($url#"")

  //Rekursion mit response challenge

: ($ort="Büro")

$url:="https://xxxxxxxxxxxxxx.myfritz.net:port/login_sid.lua"  //FB-Büro - bei Internet-Aufruf https u. Fritz DynDNS-Dienst verwenden

$username:="XXXXXX"

$pw:="YYYYYY"

: ($ort="Daheim")

$url:="http://fritz.box/login_sid.lua"  //FB-Daheim - bei LAN-Aufruf http verwenden (bei https keine Verbindung)

$username:="UUUUUUUU"

$pw:="VVVVVVV"

End case 


If ($url#"")

$httpStatus:=HTTP Get($url;$xmlBlob)


If ($httpStatus#200)

ALERT("Fehler: "+String($httpStatus))

TRACE

Else 


$xml:=BLOB to text($xmlBlob;UTF8 text without length)

SET TEXT TO PASTEBOARD($xml)

$DomRef:=DOM Parse XML variable($xml)


If (OK=0)

TRACE

Else 

$ElementRef:=DOM Find XML element($DomRef;"SessionInfo/SID")

If (OK=0)

TRACE

Else 

DOM GET XML ELEMENT VALUE($ElementRef;$SID)

If (OK=1)

If ($SID#("0"*16)) | (Count parameters>1)  //vermeide Endlosschleife

$0:=$SID


Else   //wir haben jetzt erst das Challenge u. müssen daraus mit dem pw ein MD5-Hash bauen u. nochmal login aufrufen

$ElementRef:=DOM Find XML element($DomRef;"SessionInfo/Challenge")


If (OK=0)

TRACE

Else 

DOM GET XML ELEMENT VALUE($ElementRef;$challenge)

If (OK=1)


  //$response:=FB_responseChallenge ($challenge;$pw)

CONVERT FROM TEXT($challenge+"-"+$pw;"UTF-16LE";$prmBlob)

$response:=$challenge+"-"+Generate digest($prmBlob;MD5 digest)  //der MD5-Digest muss mit UTF-16LE generiert werden


  //Blocktime berücksichtigen

$ElementRef:=DOM Find XML element($DomRef;"SessionInfo/BlockTime")

If (OK=0)

TRACE

Else 

DOM GET XML ELEMENT VALUE($ElementRef;$blockTime)

If (Num($blockTime)>0)

DELAY PROCESS(Current process;Num($blockTime)*60)

End if 

End if 


$0:=FB_getSessionID ($ort;$url+"?username="+$username+"&response="+$response)  //Rekursion

End if 

End if 

End if 

End if 

End if 

End if 

End if 

End if