Anwesenheitserkennung über WLAN und Fritzbox nur mit PicoC - ohne Perl, Loxberry etc

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • MightyLox
    LoxBus Spammer
    • 22.10.2015
    • 208

    #1

    Anwesenheitserkennung über WLAN und Fritzbox nur mit PicoC - ohne Perl, Loxberry etc

    Hallo,

    ich habe ein kleines PicoC* geschrieben, mit der man eine Anwesenheitserkennung nur mit der Fritzbox realisieren kann. Das Ganze ist bei weitem noch nicht fertig, eher ein Proof of Concept. Aber da es schon ewig bei mir liegt und die Zeit für einen richtigen Artikel fehlt, wollte ich es jetzt doch mal kurz vorstellen. Vlt hilft es ja jemanden. So wie es ist läuft es bei mir schon einige Monate.

    Code:
    // write program here in PicoC
    // CheckFritzIPs
    // (C) 2017 Mighty - see loxforum.com
    
    // based on: https://groups.google.com/forum/#!topic/loxone-english/KZNGlIQz4qU
    #define SLEEP_TIME 2000
    #define BUFF_SIZE 40001
    #define RD_BLOCK_SIZE 128
    
    #define DEBUG_LEVEL 0  // 0 = disable ; 1 = INFO ; 2 = DEBUG
    
    char* host     = "192.168.2.1"; // The API URL
    
    // Global variables
    char value[50];
    char data[BUFF_SIZE];
    int  debug_msg_count = 0;
    char* position = 0;
    
    // Helper methods
    void downloadDataForMac(char* mac)
    {
      char device[255];
      sprintf(device, "/dev/tcp/%s/49000", host);
      if (DEBUG_LEVEL > 1 ) printf("%d: downloadData device %s", debug_msg_count++, device);
      char headers[1024];
      sprintf(headers, "POST /upnp/control/Hosts HTTP/1.1\r\nCONNECTION: close\r\nContent-Length: 295\r\nContent-Type: text/xml; charset=\"utf-8\"\r\nSOAPACTION: \"urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry\"\r\n\r\n<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:GetSpecificHostEntry xmlns:u=\"urn:dslforum-org:service:Hosts:1\"><NewMACAddress>%s</NewMACAddress></u:GetSpecificHostEntry></s:Body></s:Envelope>\r\n ", mac);
      if (DEBUG_LEVEL > 1 ) printf("%d: downloadData headers %s", debug_msg_count++, headers);
      STREAM* tcpStream = stream_create(device, 0, 0);
      if (DEBUG_LEVEL > 1 ) printf("%d: downloadData tcpStream %d", debug_msg_count++, (int)tcpStream);
      stream_write(tcpStream, headers, strlen(headers));
      stream_flush(tcpStream);
      char block[RD_BLOCK_SIZE];
      int count;
      int i = 0;
      // read stream
      do
      {
        count = stream_read(tcpStream, block, RD_BLOCK_SIZE, 4000);
        if (DEBUG_LEVEL > 1 ) printf("%d: downloadData count %d", debug_msg_count++, (int)count);
        if (count > 0) strncpy((char*)data + i * RD_BLOCK_SIZE, block, count);
        i++;
        if (i >= ( ( BUFF_SIZE - 1 ) / RD_BLOCK_SIZE )) count = 0; // avoid buffer overflows
      }
      while (count > 0);
      stream_close(tcpStream);
      data[BUFF_SIZE] = 0; //put null character or end of string at the end.
    }
    
    int moveToKey(char* key)
    {
      if (DEBUG_LEVEL > 1 ) sleep(250); //provide time to output log entries, otherwise log entries get lost ?!
      char* newPos = strstr(position, key);
      if (newPos != NULL)
      {
        position = newPos;
        if (DEBUG_LEVEL > 1 ) printf("%d: found key %s, pos %d", debug_msg_count++, key, (int)position);
        return 1;
      } else {
        if (DEBUG_LEVEL > 1 ) printf("%d: NOT FOUND key %s", debug_msg_count++, key);
          return 0;
      }
    }
    
    char* readStringValue(char* key, int stripEnd)
    {
      value[49] = '\0';
      if (moveToKey(key) > 0)
      {
        char* valueStart = (char*)((int)position + strlen(key));
        int valueLen = strfind(valueStart, "</", 0);
        if (valueLen - stripEnd > 48) {
          // Prevent error with occasional long (weird?) value of e.g. 'humidity', which produces the following error:
          // myweather:93:14 can't assign char* from
          if (DEBUG_LEVEL > 1 ) printf("%d: DATA TOO LARGE (readStringValue): length=%d", debug_msg_count++, valueLen);
        } else {
          if (valueLen - stripEnd > 0) {
            strncpy(value, valueStart, valueLen - stripEnd);
            if (DEBUG_LEVEL > 1 ) printf("%d: found value of %s = %s (l=%d,s=%d)", debug_msg_count++, key, value, valueLen, stripEnd);
          } else {
            if (DEBUG_LEVEL > 1 ) printf("%d: DATA SEEMS INCOMPLETE (readStringValue)", debug_msg_count++);
          }
        }    
      }
    
      if (DEBUG_LEVEL > 1 ) printf("%d: returning value %s", debug_msg_count++, value);
      return value;
    }
    
    int readIntValue(char* key)
    {
      return batoi(readStringValue(key, 0));
    }
    
    float readFloatValue(char* key)
    {
      return batof(readStringValue(key, 0));
    }
    
    float readPercentageValue(char* key)
    {
      return batof(readStringValue(key, 1));
    }
    
    ////////////////////////////////////////////////////////
    // Start
    while(1)
    {
        if (DEBUG_LEVEL > 1 ) printf("CheckFritzIPs");
    
        downloadDataForMac("AA:BB:CC:DD:EE:FF");
        position = data;
    
        char* sNewIPAddress = readStringValue("<NewIPAddress>", 0);
        if (DEBUG_LEVEL > 1 ) printf("%d: NewIPAddress %s", debug_msg_count++, sNewIPAddress);
    
        int iNewActive = readIntValue("<NewActive>");
        if (DEBUG_LEVEL > 1 ) printf("%d: NewActive %d", debug_msg_count++, iNewActive);
    
        char* sNewHostName = readStringValue("<NewHostName>", 0);
        if (DEBUG_LEVEL > 1 ) printf("%d: NewHostName %s", debug_msg_count++, sNewHostName);
    
        if (DEBUG_LEVEL > 1 ) printf("CheckFritzIPs - end");
    
        setoutput(0, iNewActive);
    
        sleep(SLEEP_TIME);
    }
    Zur Zeit nimmt das Programm eine feste MAC und setzt den Ausgang 1 auf aktiv, wenn die MAC bei der Fritzbox registriert ist. Mir reichte das so.
    Ich wollte es immer mal umbauen, dass man ein Array von MACs angeben kann und dann die entsprechenden Ausgänge geschaltet werden. Wie gesagt, vlt macht das ja jemand noch.

    Viel Spaß mit dem Code.

    Grüße Mighty


    *
    Teile des Codes sind von woanders, leider weiß ich nach der langen Zeit nicht mehr, woher sie kommen. :-(
    Zuletzt geändert von MightyLox; 29.07.2017, 16:23.
    Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
    Loxone: 1x MS, 2x Ext, 1x DMX
    KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
    Licht: DMX LED Beleuchtung (24V/230V)
    Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
    Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16
  • miqa
    MS Profi
    • 03.06.2016
    • 774

    #2
    Zitat von MightyLox

    Zur Zeit nimmt das Programm eine feste MAC und setzt den Ausgang 1 auf aktiv, wenn die MAC bei der Fritzbox registriert ist. Mir reichte das so.
    Ich wollte es immer mal umbauen, dass man ein Array von MACs angeben kann und dann die entsprechenden Ausgänge geschaltet werden.

    Das heißt also man braucht für jeden Benutzer/jedes Gerät ein eigenes Skript?

    Kommentar


    • Labmaster
      Labmaster kommentierte
      Kommentar bearbeiten
      oder man erweiter das Script. Im einfachsten Fall auch einfach statisch, also "Copy und Paste" des entsprechenden Codes innerhalb dieses einen Scripts.
      Ist unelegant muss aber funktionieren. Das ganze würde sich fast ausschließlich auf den Bereich innerhalb der While Schleife am Ende beziehen.
      Zuletzt geändert von Labmaster; 31.07.2017, 09:07.
  • Labmaster
    Lox Guru
    • 20.01.2017
    • 2592

    #3
    Aus Performancegründen würde ich im übrigen, Funktionen die nur für den Debug benötigt werden, auch nur dann aufrufen wenn man den Debug benötigt.



    Code:
    int iNewActive;
    while(1)
    {
        if (DEBUG_LEVEL > 1 ) printf("CheckFritzIPs");
    
        downloadDataForMac("AA:BB:CC:DD:EE:FF");  // MAC für Device eintragen
        position = data;
    
        if (DEBUG_LEVEL > 1 )
        {
            char* sNewIPAddress = readStringValue("<NewIPAddress>", 0);
            printf("%d: NewIPAddress %s", debug_msg_count++, sNewIPAddress);
        }
    
        iNewActive = readIntValue("<NewActive>");
        if (DEBUG_LEVEL > 1 )
          printf("%d: NewActive %d", debug_msg_count++, iNewActive);
    
        if (DEBUG_LEVEL > 1 )
        {
          char* sNewHostName = readStringValue("<NewHostName>", 0);
          printf("%d: NewHostName %s", debug_msg_count++, sNewHostName);
        }
    
        if (DEBUG_LEVEL > 1 ) printf("CheckFritzIPs - end");
    
        setoutput(0, iNewActive);    // Ausgang 0 bedienen
    
    
        downloadDataForMac("AA:BB:CC:DD:EE:FF");  // MAC für nächstes Device eintragen
        position = data;
        iNewActive = readIntValue("<NewActive>");
        setoutput(1, iNewActive);   // Ausgang 1 bedienen
    
    
        downloadDataForMac("AA:BB:CC:DD:EE:FF");  // MAC für nächstes Device eintragen
        position = data;
        iNewActive = readIntValue("<NewActive>");
        setoutput(2, iNewActive);   // Ausgang 2 bedienen
    
    
    
    
        sleep(SLEEP_TIME);
    }
    Ich hab unten in der "while" auch mal ganz primitiv um zwei weitere Geräte erweitert (ohne zu testen)
    Zuletzt geändert von Labmaster; 02.10.2017, 07:27.

    Kommentar

    • MightyLox
      LoxBus Spammer
      • 22.10.2015
      • 208

      #4
      Jaja, wie gesagt, alles Quick'n Dirty.

      Ich würde oben ein Array anlegen und dort die MACs speichern, dann je nach Position im Array den Ausgang schalten.

      Grüße Mighty
      Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
      Loxone: 1x MS, 2x Ext, 1x DMX
      KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
      Licht: DMX LED Beleuchtung (24V/230V)
      Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
      Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

      Kommentar


      • Labmaster
        Labmaster kommentierte
        Kommentar bearbeiten
        Ja, klar, da kann man noch sehr viel optimieren, gerade was die Nutzung von Speicherplatz bezüglich Zeichenketten ausmacht. (der Miniserver wird da sehr schnell an die Grenzen kommen und wer weis schon wie sauber der PicoC Intrepreter dort eingebunden wurde.)

        Könnte mir sehr gut vorstellen, daß wenn man hier umsichtig umgeht es keinerlei Probleme mit PicoC (auch Langzeit) geben würde.

        Ich denke PicoC Probleme enstehen weil gegebenfalls ohne Rücksicht auf Resourcen programmiert wird.

        Wer wie ich aus einer Zeit kommt, in der in Assembler mit einem Speicher von wenigen Kbyte ganze Großsteuerungen Platz finden mussten und entsprechend sorgsam mit den Reseourcen umgehen musste, der weis wie schnell ein eher kleines System (und der Miniserver ist für heutige Zeit ein eher sehr schwachbrüstiges System) an seine Grenzen gerät. Ich gehe auch stark davon aus, das auf dem Miniserver kein OS läuft, eher sowas wie ein von Loxone selbst enwickeltere Scheduler, ansonsten wäre die große Anzahl an Aufgaben mit der entsprechenden Zykluszeit wohl eh nicht machbar.
        Aber jetzt schweife ich ab .. :-)
    • Drunkard
      LoxBus Spammer
      • 27.08.2015
      • 277

      #5
      habe den Teil von Labmaster mal ergänzt und werde es ein paar Tage testen.
      Was ich jetzt schon ml sagen kann, dass es meiner Meinung nach sehr schnell reagiert.

      Kommentar

      • GünWün
        LoxBus Spammer
        • 28.04.2016
        • 272

        #6
        N`abend zusammen,
        ich habe versucht das bei einem Bekannten so einzurichten.
        Müsste nicht noch der Benutzername und das Passwort der FritzBox abgefragt/eingetragen werden?
        Wir haben jetzt einfach einen Baustein"Programme" eingefügt. Und einen virtuellen Ausgang auf Q1 gelegt.
        In der Liveview werden dann bei als gelb markiert, aber mehr passiert da nicht.
        Die MAC Adresse haben wir in der Zeile downloadDataForMac("AA:BB:CCD:EE:FF"); angepasst.
        Danke und gruß
        Günter
        1x MiniServer, 12x Touch Tree, 24x Stellantrieb Tree, 3x Relay Extension, 1x Dimmer Extension, 2x Extension
        1. Test im Haus 21.09.2017, geplanter Einzug 07.10
        Rasperry Pi 3 mit Loxberry für Sonos und Weatherground im Test
        Endlich auch mit Internet :-) - hat ja nur 10 Monate gedauert

        Kommentar

        • Drunkard
          LoxBus Spammer
          • 27.08.2015
          • 277

          #7
          Ich habe noch die IP der Fritzbox eingetragen. Bei host oder so...
          Funktioniert bei mir mit 2 Handys.

          Kommentar


          • GünWün
            GünWün kommentierte
            Kommentar bearbeiten
            Ja, hab ich hier gemacht:
            char* host = "192.168.2.1"; // The API URL

          • Drunkard
            Drunkard kommentierte
            Kommentar bearbeiten
            Genau da.
            I habe nur den Programm Baustein mit dem Code. Dann wird bei den Ausgängen entweder 0oder 1 angezeigt.

          • GünWün
            GünWün kommentierte
            Kommentar bearbeiten
            Hmmm,
            obwohl wir uns mit dem Handy entfernt haben (WLAN aus) passiert nix.
            Dauert das bis die Meldung kommt?
            Frage: Ist der virtuelle Ausgang richtig?
            Muss noch was in den Eigenschaften eingestellt werden?
        • Labmaster
          Lox Guru
          • 20.01.2017
          • 2592

          #8
          -Nein es dauert nicht lange, maximal die "SLEEP TIME" aus dem Script, also 2000ms (2 sek) .
          -Was meinst du denn mit Virtuellen Ausgang ?
          -
          Zitat von GünWün
          ...
          Wir haben jetzt einfach einen Baustein"Programme" eingefügt. Und einen virtuellen Ausgang auf Q1 gelegt.
          ...
          Du meinst aber schon AQ1 am Programm Baustein ?
          Wohin du diesen dann verbindest, also was du mit dieser Information (0 oder 1) machst, bleibt dir überlassen.
          Zuletzt geändert von Labmaster; 12.08.2017, 10:45.

          Kommentar


          • GünWün
            GünWün kommentierte
            Kommentar bearbeiten
            Mein Bekannter möchte in der App ne Meldung bekommen, das jemand wieder zu Hause ist, oder geht...
        • GünWün
          LoxBus Spammer
          • 28.04.2016
          • 272

          #9
          Guten Morgen.
          Rückmeldung meines Bekannten:
          Wenn er morgen durch die FritzBox das WLAN einschalten lässt bekommt er wohl in der APP die Meldung das die Telefone "da" sind.
          Muss noch irgendwo was in der FritzBox aus- oder eingeschaltet werden?
          Gruß Günter
          1x MiniServer, 12x Touch Tree, 24x Stellantrieb Tree, 3x Relay Extension, 1x Dimmer Extension, 2x Extension
          1. Test im Haus 21.09.2017, geplanter Einzug 07.10
          Rasperry Pi 3 mit Loxberry für Sonos und Weatherground im Test
          Endlich auch mit Internet :-) - hat ja nur 10 Monate gedauert

          Kommentar


          • GünWün
            GünWün kommentierte
            Kommentar bearbeiten
            Die FritzBox schaltet das WLAN ein - über Zeitsteuerung - ansonsten passiert den ganzen Tag nix.

          • Drunkard
            Drunkard kommentierte
            Kommentar bearbeiten
            Bei mir ist das WLAN den ganzen Tag an. Sobald ein Handy nicht mehr in Reichweite ist, ändert sich der Ausgang am Programm-Baustein auf 0. Meldet sich das Handy wieder im WLAN an geht der Ausgang auf 1.

            Mehr brauchst du erstmal nicht, um zu gucken ob es funktioniert!
            Was du dann im Anschluss mit den Werten machst, ist dir überlassen....
            Ich habe z.B. (erstmal um das Programm zu testen) einen Status-Baustein dran gehangen und lasse mir so den Status entsprechend in der Visu anzeigen.
            0 = ist nicht zu Hause
            1 = ist zu Hause

          • GünWün
            GünWün kommentierte
            Kommentar bearbeiten
            Könntest du mal einen Screenshot davon machen?
            Irgendwie sind wir zu blöd :-)
        • Labmaster
          Lox Guru
          • 20.01.2017
          • 2592

          #10
          Naja, das mit dem WLan aus/einschalten ist schon ein Problem, denn für das PicoC Script auf dem MS ist es das selbe Ergebniss ob die MAC Adressen nicht erreichbar sind weil das WLan aus ist oder ob das Telefon nicht mehr vorhanden ist (z.B. aus der Reichweite).

          Um das Problem zu lösen müsste man im PicoC Script auch noch den WLan Status mit prüfen.
          Ich werde leider erst nächstes Jahr soweit sein das im Haus umsetzen zu können, dann werde ich das jedoch sicher auch nutzen.
          So eine Fritzbox ist wirklich ein großer Pool voller brauchbarer Informationen :-)

          Kommentar

          • cRieder
            LoxBus Spammer
            • 26.08.2015
            • 396

            #11
            ... und nächstes Jahr ist dann WLan-Mesh wahrscheinlich auch bereits vollwertig in der Firmware integriert (hoffentlich auch für die Vorgänger-Boxen).
            Und sorry für Offtopic, passt aber grad gut, gibts auch noch die tollen Frixtender.de Antennen-Mods
            Smarter Gruß,
            Carsten

            Kommentar

            • Drunkard
              LoxBus Spammer
              • 27.08.2015
              • 277

              #12
              Hier die Bilder....
              Ich habe 2 Status-Bausteine dran, da ich 2 Handys abfrage. Nach den Bausteinen kommt noch ein Logger um zu sehen wann sich die Handys an- und abmelden. ;-)

              Gruß
              Stefan

              Kommentar

              • Matzu
                Extension Master
                • 21.02.2017
                • 121

                #13
                mal ne Frage zwischendurch...
                Hier ist immer von Firtzbox die Rede, funktioniert das auch mit einem Telekom-Router (Speedport)?

                Kommentar


                • neonnt
                  neonnt kommentierte
                  Kommentar bearbeiten
                  Bei einigen Speedports konnte man die Fritzbox Firmware aufspielen über Umwege, falls dir das hilft.
              • svethi
                Lebende Foren Legende
                • 25.08.2015
                • 6320

                #14
                Probieren geht über studieren, doch es geht hier um verwendete Schnittstellen, die der Anbieter dann ja ebenfalls in seiner eigenen Firmware integriert haben müsste und da die Telekomfirmware bisher eher grottenschlecht war, gehe ich mal nicht davon aus.
                Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                Kommentar


                • Matzu
                  Matzu kommentierte
                  Kommentar bearbeiten
                  Japp, habs nun mit meinem Speedport getestet!
                  Funktioniert nicht - Ausgang bleibt ständig auf 0 :-(
              • GünWün
                LoxBus Spammer
                • 28.04.2016
                • 272

                #15
                So wir machen uns jetzt auch mal nackig ;-)
                IP-Adresse der FritzBox stimmt 192.168.178.1 - pingbar
                Die MAC Adressen stimmen auch.
                Aber der Ausgang AQ1 & AQ2 aus dem Baustein Programm ist immer 1.
                Das komische ist, das die Geräte nicht aus der FritzBox "verschwinden" sobald das WLAN (am SmartPhone) ausgeschaltet wird und somit ein Verlassen simuliert wird.
                Hier der Programmcode:
                Code:
                // write program here in PicoC
                // CheckFritzIPs
                // (C) 2017 Mighty - see loxforum.com
                
                // based on: https://groups.google.com/forum/#!topic/loxone-english/KZNGlIQz4qU
                #define SLEEP_TIME 2000
                #define BUFF_SIZE 40001
                #define RD_BLOCK_SIZE 128
                
                #define DEBUG_LEVEL 0  // 0 = disable ; 1 = INFO ; 2 = DEBUG
                
                char* host     = "192.168.178.1"; // The API URL
                
                // Global variables
                char value[50];
                char data[BUFF_SIZE];
                int  debug_msg_count = 0;
                char* position = 0;
                
                // Helper methods
                void downloadDataForMac(char* mac)
                {
                  char device[255];
                  sprintf(device, "/dev/tcp/%s/49000", host);
                  if (DEBUG_LEVEL > 1 ) printf("%d: downloadData device %s", debug_msg_count++, device);
                  char headers[1024];
                  sprintf(headers, "POST /upnp/control/Hosts HTTP/1.1\r\nCONNECTION: close\r\nContent-Length: 295\r\nContent-Type: text/xml; charset=\"utf-8\"\r\nSOAPACTION: \"urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry\"\r\n\r\n<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:GetSpecificHostEntry xmlns:u=\"urn:dslforum-org:service:Hosts:1\"><NewMACAddress>%s</NewMACAddress></u:GetSpecificHostEntry></s:Body></s:Envelope>\r\n ", mac);
                  if (DEBUG_LEVEL > 1 ) printf("%d: downloadData headers %s", debug_msg_count++, headers);
                  STREAM* tcpStream = stream_create(device, 0, 0);
                  if (DEBUG_LEVEL > 1 ) printf("%d: downloadData tcpStream %d", debug_msg_count++, (int)tcpStream);
                  stream_write(tcpStream, headers, strlen(headers));
                  stream_flush(tcpStream);
                  char block[RD_BLOCK_SIZE];
                  int count;
                  int i = 0;
                  // read stream
                  do
                  {
                    count = stream_read(tcpStream, block, RD_BLOCK_SIZE, 4000);
                    if (DEBUG_LEVEL > 1 ) printf("%d: downloadData count %d", debug_msg_count++, (int)count);
                    if (count > 0) strncpy((char*)data + i * RD_BLOCK_SIZE, block, count);
                    i++;
                    if (i >= ( ( BUFF_SIZE - 1 ) / RD_BLOCK_SIZE )) count = 0; // avoid buffer overflows
                  }
                  while (count > 0);
                  stream_close(tcpStream);
                  data[BUFF_SIZE] = 0; //put null character or end of string at the end.
                }
                
                int moveToKey(char* key)
                {
                  if (DEBUG_LEVEL > 1 ) sleep(250); //provide time to output log entries, otherwise log entries get lost ?!
                  char* newPos = strstr(position, key);
                  if (newPos != NULL)
                  {
                    position = newPos;
                    if (DEBUG_LEVEL > 1 ) printf("%d: found key %s, pos %d", debug_msg_count++, key, (int)position);
                    return 1;
                  } else {
                    if (DEBUG_LEVEL > 1 ) printf("%d: NOT FOUND key %s", debug_msg_count++, key);
                      return 0;
                  }
                }
                
                char* readStringValue(char* key, int stripEnd)
                {
                  value[49] = '\0';
                  if (moveToKey(key) > 0)
                  {
                    char* valueStart = (char*)((int)position + strlen(key));
                    int valueLen = strfind(valueStart, "</", 0);
                    if (valueLen - stripEnd > 48) {
                      // Prevent error with occasional long (weird?) value of e.g. 'humidity', which produces the following error:
                      // myweather:93:14 can't assign char* from
                      if (DEBUG_LEVEL > 1 ) printf("%d: DATA TOO LARGE (readStringValue): length=%d", debug_msg_count++, valueLen);
                    } else {
                      if (valueLen - stripEnd > 0) {
                        strncpy(value, valueStart, valueLen - stripEnd);
                        if (DEBUG_LEVEL > 1 ) printf("%d: found value of %s = %s (l=%d,s=%d)", debug_msg_count++, key, value, valueLen, stripEnd);
                      } else {
                        if (DEBUG_LEVEL > 1 ) printf("%d: DATA SEEMS INCOMPLETE (readStringValue)", debug_msg_count++);
                      }
                    }    
                  }
                
                  if (DEBUG_LEVEL > 1 ) printf("%d: returning value %s", debug_msg_count++, value);
                  return value;
                }
                
                int readIntValue(char* key)
                {
                  return batoi(readStringValue(key, 0));
                }
                
                float readFloatValue(char* key)
                {
                  return batof(readStringValue(key, 0));
                }
                
                float readPercentageValue(char* key)
                {
                  return batof(readStringValue(key, 1));
                }
                
                ////////////////////////////////////////////////////////
                // Start
                int iNewActive;
                while(1)
                {
                    if (DEBUG_LEVEL > 1 ) printf("CheckFritzIPs");
                
                    downloadDataForMac("AA:BB:CC:DD:EE:FF");  // MAC für Device eintragen
                    position = data;
                
                    if (DEBUG_LEVEL > 1 )
                    {
                        char* sNewIPAddress = readStringValue("<NewIPAddress>", 0);
                        printf("%d: NewIPAddress %s", debug_msg_count++, sNewIPAddress);
                    }
                
                    iNewActive = readIntValue("<NewActive>");
                    if (DEBUG_LEVEL > 1 )
                      printf("%d: NewActive %d", debug_msg_count++, iNewActive);
                
                    if (DEBUG_LEVEL > 1 )
                    {
                      char* sNewHostName = readStringValue("<NewHostName>", 0);
                      printf("%d: NewHostName %s", debug_msg_count++, sNewHostName);
                    }
                
                    if (DEBUG_LEVEL > 1 ) printf("CheckFritzIPs - end");
                
                    setoutput(0, iNewActive);    // Ausgang 0 bedienen
                
                
                    downloadDataForMac("AA:BB:CC:DD:EE:FF");  // MAC 1 - hier steht natürlich die richtige MAC
                    position = data;
                    iNewActive = readIntValue("<NewActive>");
                    setoutput(1, iNewActive);   // Ausgang 1 bedienen
                
                
                    downloadDataForMac("AA:BB:CC:DD:EE:FF");  // MAC 2 - hier steht natürlich die richtige MAC
                    position = data;
                    iNewActive = readIntValue("<NewActive>");
                    setoutput(2, iNewActive);   // Ausgang 2 bedienen
                
                    sleep(SLEEP_TIME);
                }
                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Loxone Config.PNG
Ansichten: 670
Größe: 16,9 KB
ID: 111425
                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Loxone Config I.PNG
Ansichten: 505
Größe: 9,8 KB
ID: 111426
                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Loxone Config II.PNG
Ansichten: 507
Größe: 11,1 KB
ID: 111427
                1x MiniServer, 12x Touch Tree, 24x Stellantrieb Tree, 3x Relay Extension, 1x Dimmer Extension, 2x Extension
                1. Test im Haus 21.09.2017, geplanter Einzug 07.10
                Rasperry Pi 3 mit Loxberry für Sonos und Weatherground im Test
                Endlich auch mit Internet :-) - hat ja nur 10 Monate gedauert

                Kommentar


                • MightyLox
                  MightyLox kommentierte
                  Kommentar bearbeiten
                  Deine Änderungen funktionieren so nicht. setoutput ist 0 basierend, dh. deine MAC 2 schaltet AQ3.
                  Bei mir verschwinden die Handys aus der Fritzbox, wenn ich am Handy das WLAN ausschalte.
                  Hast du einen Repeater laufen?

                  Grüße Mighty

                • GünWün
                  GünWün kommentierte
                  Kommentar bearbeiten
                  Ja, Repeater ist vorhanden
              Lädt...