[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 einschalten

    Nun 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;
    

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

    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


  • Administrator

    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-win

    Download "MSBuilt Tools 2013"
    https://www.microsoft.com/de-de/download/details.aspx?id=40760

    Downloaf "MSBuilt Tool 2015"
    https://www.microsoft.com/de-de/download/details.aspx?id=48159

    Installation 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


Anmelden zum Antworten