Mit Pico C, httpget und JSON den Status der Abwaschmaschine (V-ZUG) abfragen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Gast

    Mit Pico C, httpget und JSON den Status der Abwaschmaschine (V-ZUG) abfragen

    Hallo Zusammen

    Ich bin ganz neu hier, und hoffe das ich am richtigen Ort ansetze...

    Ich habe gestern ein C Script für das auslesen meiner Geräte geschrieben und es läuft bereits nicht schlecht. Es gäbe zwar ein LoxBerry Plugin für V-ZUG Geräte, läuft bei mir aber aktuell nicht und wollte deshalb eine Alternative erstellen.

    Kann mich jemand bzgl. Code unterstützen? (Meiner erster Code in C) :-)
    • Ist die Schleife der richtige Ansatz für eine Abfrage pro Minute?
    • Wie muss die "free" Funktion richtig genutzt werden?
    • Wie kann ich ein CHAR zu INT konvertieren und an setoutput ausgeben?
    • Nach ca. 6h ist das Script gecrasht - ich vermute, das Gerät war kurz nicht via httpget erreichbar und returnValue deshalb leer. Wie muss ich NULL oder "" prüfen?

    Code:
    /////////////////////////////////////////////////////////////////////
    // Start Script (PicoC)
    //
    // V-ZUG HTTP Integration, 07.09.2020
    //
    // JSON Sample from HTTP GET
    // {"DeviceName":"Adora SL","Serial":"99999 99999","Inactive":"true","Program":"Vorspühlen","S tatus":"Vorspühlen","ProgramEnd":{"End":"","EndTyp e":"0"},"deviceUuid":"9999999999"}
    //
    /////////////////////////////////////////////////////////////////////
    
    // Params
    char ip[15];
    ip = getinputtext(0);
    
    // Init
    char* returnValue;
    char* leftValue;
    char deviceValue[50];
    int nextQuotes;
    int i;
    
    // Loop the whole time
    while(TRUE)
    {
    // HTTP GET
    returnValue = httpget(ip,"/ai?command=getDeviceStatus");
    setlogtext(returnValue);
    
    // Loop trough values
    i = 1;
    while(i < 8)
    {
    if ( i > 1 )
    {
    returnValue = leftValue;
    }
    leftValue = strstrskip(returnValue,"\":\"");
    nextQuotes = strfind(leftValue,"\"",0);
    strncpy(deviceValue,leftValue,nextQuotes);
    setlogtext(deviceValue);
    
    if ( i == 1 )
    {
    setoutputtext(0,deviceValue);
    }
    if ( i == 2 )
    {
    // setoutput(0,deviceValue);
    }
    if ( i == 3 )
    {
    // setoutput(1,deviceValue);
    }
    if ( i == 4 )
    {
    setoutputtext(1,deviceValue);
    }
    if ( i == 5 )
    {
    setoutputtext(2,deviceValue);
    }
    if ( i == 6 )
    {
    // setoutput(2,deviceValue);
    }
    if ( i == 7 )
    {
    // setoutput(3,deviceValue);
    }
    
    // Speicher pro Wert leeren
    // free(deviceValue); // --> Crash wenn diese aktiviert werden
    
    i++;
    }
    
    // Gesmat-Speicher leeren
    // free(returnValue); // --> Crash wenn diese aktiviert werden
    // free(leftValue); // --> Crash wenn diese aktiviert werden
    
    // Ende
    setlogtext("Go to sleep for 60s");
    sleeps(60);
    }

    Danke und Gruss
    Jens
  • svethi
    Lebende Foren Legende
    • 25.08.2015
    • 6292

    #2
    Du declarest die Variable außerhalb der Schleife und willst diese dann bei jedem Schleifendurchlauf löschen. Das geht natürlich nicht. Entweder müsstest Du dann die Variable auch erst innerhalb der Schleife deklarieren oder Du musst das free außerhalb der Schleife aufrufen.
    Ich möchte Dich ja nicht zu sehr entmutigen, doch PicoC ist so eine Sache. Du hast da kaum ein richtiges Fehlerhandling noch ein Debuging drin. Auch crasht es oftmals ohne Grund. Bzw. habe ich eins laufen, was nur auf interne Werte zugreift, das geht. Wenn Du irgendwie auf externe Daten zugreifst und es auf diesem Weg zu Problemen kommt, crasht es schnell mal.
    Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

    Kommentar


    • Gast
      Gast kommentierte
      Kommentar bearbeiten
      Danke fürs Feedback!
      Ja, das schlechte Fehlerhandling habe ich auch bemerkt. Ich versuch's jetzt mal zu optimieren und werde es dann etwas beobachten.

      Ah, ok. Macht es bei dem kleinen Script überhaupt Sinn, die Variable jede Minute freizugeben mit free(); also innerhalb der Schleife deklarieren?

    • svethi
      svethi kommentierte
      Kommentar bearbeiten
      nun, bei der Zahl hätte ich gesagt tut das nicht Not, doch Du hast da ein Chararray deklariert. Das mußt Du testen und immer die Speicherverbrauch im Auge halten. Kann sein, dass Dir langsam der Speicher vollläuft und dann abschmiert. Dann könnte es besser sein die Variable immer wieder neu anzulegen.
Lädt...