[SOLVED] Fritz Dect automatisch starten
-
Hallo zusammen,
Da ich noch recht unerfahren im Thema C-Programmierung bin, hoffe ich einfach mal, dass ich das richtige Forum gewählt habe
Ich vermute dass es sich um einen C# Programmschnipsel handelt den ich gefunden habe. Zu diesem habe ich nun ein paar Fragen.
Aber vielleicht zuerst zu der eigentlichen Aufgabenstellung:
Ich bin auf der Suche nach einem eigenständig lauffähigen Programm, Skript, Batch... mit dem ich bei Start des PCs auch automatisch eine FritzDect Steckdose einschalten kann. Die Datei möchte ich dann einfach in den Autostart packen und beim Hochfahren (Windows 10) die Steckdose einschalten.
Auf der Fritz Box Seite habe ich hierzu auch schon zwei passende Code Schnipsel gefunden.
1. Anmelden an der Fritzbox und beziehen einer SID
2. Via HTTP Get Request den FritzDect einschaltenNun zu meinem Problem. Ich habe keine Ahnung wie ich das hinbekomme
zu1) Mit welchem Programm kann ich den Code bearbeiten und compilieren? Wo bekomme ich die Bibliotheken her und wie binde ich diese ein?
zu2) Wie binde ich den HTTP Get Request in den ersten Code Schnipsel ein, damit dieser ordentlich ausgeführt wird?
Wäre super wenn ihr mir bei meinem kleinen Problemchen unter die Arme greifen würdet.
Code zu 1)
using System.Net; using System.Security.Cryptography; using System.Xml.Linq; public void Test () { string benutzername = "xxxxxxxx"; string kennwort = "xxxxxxxx"; // SessionID ermitteln string sid = GetSessionId(benutzername, kennwort); string seite = SeiteEinlesen(@"http://fritz.box/home/home.lua", sid); MessageBox.Show(seite); } public string SeiteEinlesen (string url, string sid) { Uri uri = new Uri(url + "?sid=" + sid); HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest; HttpWebResponse response = request.GetResponse() as HttpWebResponse; StreamReader reader = new StreamReader(response.GetResponseStream()); string str = reader.ReadToEnd(); return str; } public string GetSessionId (string benutzername, string kennwort) { XDocument doc = XDocument.Load(@"http://fritz.box/login_sid.lua"); string sid = GetValue(doc, "SID"); if (sid == "0000000000000000") { string challenge = GetValue(doc, "Challenge"); string uri = @"http://fritz.box/login_sid.lua?username=" + benutzername + @"&response=" + GetResponse(challenge, kennwort); doc = XDocument.Load(uri); sid = GetValue(doc, "SID"); } return sid; } public string GetResponse (string challenge, string kennwort) { return challenge + "-" + GetMD5Hash(challenge + "-" + kennwort); } public string GetMD5Hash (string input) { MD5 md5Hasher = MD5.Create(); byte[] data = md5Hasher.ComputeHash(Encoding.Unicode.GetBytes(input)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sb.Append(data[i].ToString("x2")); } return sb.ToString(); } public string GetValue (XDocument doc, string name) { XElement info = doc.FirstNode as XElement; return info.Element(name).Value;
Code zu 2)
https://fritz.box/webservices/homeautoswitch.lua?ain=012340000123&switchcmd=setswitchon&sid=9c977765016899f8
Quelle: https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AHA-HTTP-Interface.pdf
Gruß
Henrik
-
C# programmieren und kompilieren kannst du mit Visual Studio: https://www.visualstudio.com/
Grundsätzlich findest du alle Informationen zur C# Sprache in der MSDN:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/Die hier verwendeten Bibliotheken sind alle Teil des Standards. Sollten bei einem Console-Projekt schon automatisch dabei sein.
Aber ich muss sagen, wenn du nicht C# lernen willst, dann wird das nicht gerade eine schnelle Übung. Suchst du nicht eher sowas wie eine Master-Slave Steckdose/-leiste? Also zum Beispiel sowas:
https://www.conrad.de/de/masterslave-steckdosenleiste-5fach-schwarz-grau-schutzkontakt-brennenstuhl-1156050955-611855.html
-
Hallo Dravere,
nein, ich bin nicht daran interessiert c# zu lernen :p . Aber ich möchte trozdem die FritzDect Steckdose mit einem Skript schalten. Diese Master Slave Steckdosenleiste kommt für mich nicht in Frage. Aber dein Beitrag hat mich zumindest in die richtige Richtung geschuppst, sodass ich eine Lösung gefunden habe
Zum Programmieren / Compilieren habe ich die Software Xamarin genutzt und den Code so angepasst dass es nun funktioniert. Die EXE Datei führe ich jetzt automatisch beim Start meines PCs aus und somit startet zeitgleich auch meine FritzDect Steckdose
Hier nochmal die Details zu meiner Lösung:
Download der Software "XamarinStudio"
http://www.monodevelop.com/download/Download der Software "MonoDevelop" & "GTK# for .net"
http://www.mono-project.com/download/#download-winDownload "MSBuilt Tools 2013"
https://www.microsoft.com/de-de/download/details.aspx?id=40760Downloaf "MSBuilt Tool 2015"
https://www.microsoft.com/de-de/download/details.aspx?id=48159Installation von "mono-5.4.1.6-gtksharp-2.12.45-win32-0.msi".
Installation von "gtk-sharp-2.12.45.msi"
Installation von "BuildTools_Full.exe"
Installation von "BuildTools_Full(2).exe"
Installation von "XamarinStudio-6.1.2.44.msi"Und hier mein angepasster Code (ist eine Console Anwendung):
using System; using System.Xml.Linq; //zu den Referenzen hinzufügen using System.Security.Cryptography; using System.Net; //zu den Referenzen hinzufügen using System.IO; using System.Xml; //zu den Referenzen hinzufügen using System.Text; namespace FritzDect { class LogIn { public string SessionID() { string benutzername = "xxxxxxxxxx"; // Benutzername mit dem man sich an der Fritzbox anmeldet string kennwort = "xxxxxxxxxx"; // Passwort mit dem man sich an der Fritzbox anmeldet // SessionID ermitteln string sid = GetSessionId(benutzername, kennwort); return sid; } public string GetSessionId(string benutzername, string kennwort) { XDocument doc = XDocument.Load(@"http://fritz.box/login_sid.lua"); string sid = GetValue(doc, "SID"); if (sid == "0000000000000000") { string challenge = GetValue(doc, "Challenge"); string uri = @"http://fritz.box/login_sid.lua?username=" + benutzername + @"&response=" + GetResponse(challenge, kennwort); doc = XDocument.Load(uri); sid = GetValue(doc, "SID"); } return sid; } public string GetResponse(string challenge, string kennwort) { return challenge + "-" + GetMD5Hash(challenge + "-" + kennwort); } public string GetMD5Hash(string input) { MD5 md5Hasher = MD5.Create(); byte[] data = md5Hasher.ComputeHash(Encoding.Unicode.GetBytes(input)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sb.Append(data[i].ToString("x2")); } return sb.ToString(); } public string GetValue(XDocument doc, string name) { XElement info = doc.FirstNode as XElement; return info.Element(name).Value; } } class MainClass { public static void Main(string[] args) { // SID anfordern LogIn LogIn = new LogIn(); string sid = LogIn.SessionID(); //Fritz Dect ansteuern string ain = "xxxxxxxxxx"; // ain des FritzDect string switchcmd = "setswitchon"; // Steuerbefehl: setswitchon = AN oder setswitchoff = AUS string url = "http://fritz.box/webservices/homeautoswitch.lua?ain=" + ain + "&switchcmd=" + switchcmd + "&sid=" + sid; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream resStream = response.GetResponseStream(); } } }
schöne Grüße
Henrik
-
Hallo,
mit deinem Code kann ich die Dect 200 an und ausschalten. Nur wie komm ich an die Temperatur? Dazu gibt es "gettemperature" und einige andere Befehle.
Hast du noch einen Tipp bzw Code für mich.Dankeschön