Abfrage Youless-Stromzählerauslesung funktioniert in der 9er Config nicht mehr

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • CoComp
    Smart Home'r
    • 18.01.2017
    • 43

    #1

    Abfrage Youless-Stromzählerauslesung funktioniert in der 9er Config nicht mehr

    Seit dem Update läuft das PicoC-Skript nicht mehr, mit dem ich mein Youless-Strommessgerät abfrage. Hat jemand da schon eine Idee oder weiß, was ich prüfen könnte?
    In einem anderen Thread hat jemand die identische Frage gestellt und auch eine Antwort bekommen.

    Eine kleine Erweiterung im Code löst das Problem auch bei mir, allerdings nur für ein paar Stunden, denn dann aktualisiert Loxone denKW-Wert nicht mehr. Im Webinterface des Youless laufen aktuelle Werte auf und eine ebenfalls zugreifende FHEM Instanz kriegt aktuelle Werte.

    PHP-Code:
    char *pRet, *p, *s;
    int pLen, sLen, tLen, event;
    int rate = 10;                        // default refresh rate
    printf("Starting YouLess Data Fetcher (YDF)");
    while(TRUE)
    {
     event = getinputevent();
        if(event & 0x01)
     {
        rate = (int)getinput(0);
        printf("YDF [INFO]: Refresh rate changed! (%d)", rate);
      }
      pRet = httpget("192.168.178.14:80","/a");
      if ((pRet != NULL) && (*pRet != 0))
      {
        p = strstrskip(pRet,"kWh");       // returns all after keyword "kWh"
        s = index(p,0x20);                // return to first blank
        pLen = strlen(p);
        sLen = strlen(s);
        tLen = pLen - sLen;
        char t[tLen+1];
        strncpy(t,p,tLen);
        t[tLen] = '\0';                   // null terminate char array
        if (p != NULL)
        {
          // debug
          //printf("P:%s|LEN:%d|S:%s|LEN:%d|T:%s|LEN:%d\n", p, pLen, s, sLen, t, tLen);
          setoutput(0,atof((char *)t+1)); // float from char
        }
        free(pRet);                       // free httpget resource
      }
      sleeps(rate);
    } 
    
    Die Lösung war es die Zeile char t[tLen]; in char t[tLen+1]; zu verändern.

    Wenn ich nun die Änderung zurücknehme und den geänderten Code in den Miniserver speichere, dann die Korrektur erneut vornehme und wieder speichere, läuft es für kurze Zeit wieder....

    Was ist da los?
  • waidlerbua
    Dumb Home'r
    • 27.12.2015
    • 17

    #2
    Servus CoCOMP, das gleiche Problem habe ich auch seit dem update...., direkt nach update war der Wert dauerhaft auf 0 W eingefroren, nach der Codeänderung wie oben beschrieben wurde wieder richtig eingelesen, doch das Ganze funktioniert nur durchschnittlich ein paar Stunden. Ich denke da hat Loxone irgendetwas verhunzt.
    Ich werde morgen das Thema beim Service anfragen.

    Kommentar

    • orli
      Lox Guru
      • 13.11.2016
      • 2556

      #3
      Schaut mal hier: https://www.loxforum.com/forum/germa...-beta-v9/page3

      Läuft bei mir problemlos seit 1 Monat.

      Kommentar


      • CoComp
        CoComp kommentierte
        Kommentar bearbeiten
        Das ist genau die Lösung, die ich versucht habe und die einige Stunden läuft bis ein Leistungswert einfriert.
    • CoComp
      Smart Home'r
      • 18.01.2017
      • 43

      #4
      Moin, gibts hier schon eine Idee, ob das Problem in der neuen Config liegt und wie es umgangen werden kann?
      Ich bekommen phasenweise richtige Werte und dann friert der Wert ein bis es irgendwann mal wieder losgeht....

      Hat vielleicht schon jemand den Youless über Loxberry eingebunden und dort keine Probleme?

      Kommentar

      • orli
        Lox Guru
        • 13.11.2016
        • 2556

        #5
        Ich hab das die letzten 2 Tage mal nachgestellt und muss meine obige Aussage "funktioniert" revidieren. Nach einem Reboot läuft das Script zwar wieder mit der obigen Änderung von Christian, aber nur für ein paar Stunden. Mir war das erst garnicht aufgefallen weil immer ein Wert geschrieben wurde und mein Zähler in der Visu grün markiert als aktiv durchging. Aber das Programm stürzt sporadisch immer wieder ab mit:

        Code:
        2017-10-03 14:24:12.052;    t[tLen] = '\0';
                    ^
        Youless Fetcher:23:8 Index out of Array (5)
        Problem ist demnach in v9 weiterhin vorhanden.

        Kommentar

        • Gerrit
          MS Profi
          • 26.08.2015
          • 940

          #6
          Müssen die pointer p und s nicht auch aufgeräumt werden? Würde ich auch mit free wieder freigeben. Oder aber die Variablen erst in der While Schleife erzeugen. Weitere Infos findest du bei Loxone: https://www.loxone.com/dede/kb/script-programming/ oder unter picoc hier im Forum.
          Ansonsten hat Loxone in der 9er Version einiges bei PicoC verbessert. Bisher wurden wohl Programmierfehler einfach so akzeptiert und das Programm lief trotzdem "irgendwie" weiter. Jetzt gibt es mehr Fehlermeldungen und stabilere Programme (auch wenn es in diesem Fall erstmal das Gegenteil im Bezug auf das Programm bewirkt hat, dem Miniserver insgesamt geht es dadurch aber wahrscheinlich besser)
          Zudem muss man bei PicoC schon sagen, dass man das eigentlich nur machen sollte, wenn man sich mit C bzw. PicoC auch ein wenig auskennt, da viel nicht gut programmierter Code veröffentlicht wird. Eigentlich sollten wir für sowas mal ein GitHub repo o.ä. aufmachen und dann werden auch nicht funktionierende Skripte gemeldet. Gut wäre noch, wenn man dann Bewertungen abgeben könnte obs funktioniert und wieviele es nutzen. Vielleicht hat ja schon einer Idee, was man da machen könnte. Ich glaub viele benutzen dieselben PicoC Skripte bzw. für ein ähnliches Problem.

          Kommentar

          • orli
            Lox Guru
            • 13.11.2016
            • 2556

            #7
            Ich hab zwar keine Ahnung von C, aber seit gestern läufts bei mir durch. Ich habe lediglich das in char t[tLen+1]; auf in char t[tLen+8] erweitert und seitdem keine Index out of Array Fehler mehr, das Programm ist seit gestern Abend nicht mehr abgestürzt und zählt identisch zum Youless Webinterface. Vielleicht testet ihr es auch mal obs bei euch auch hilft.

            Kommentar

            • orli
              Lox Guru
              • 13.11.2016
              • 2556

              #8
              Läuft bei mir auch nach knapp 48h noch fehlerfrei. Obige Lösung scheint den Fehler nachhaltig zu beheben.

              Kommentar

              • CoComp
                Smart Home'r
                • 18.01.2017
                • 43

                #9
                Das kann ich bestätigen. läuft bei mir auch seit letzten Freitag durch.

                Kommentar

                • Gast

                  #10
                  Recently, I bought a YouLess LS120 to read the smart meter via the P1 port. The PicoC code in this article helped me a great deal, but I wanted to retrieve some more information than actual power use alone.

                  So, I found some PicoC examples on the web and created another version that reads all relevant attributes from the JSON file that is return when you query with http://ip_address/e?f=j

                  The code is as follows:

                  PHP-Code:
                  //
                  // YouLess LS120 Parser
                  // Tested with firmware 1.4.1-EL
                  //
                  // Version: 20180920
                  //
                  // AQ1 returns total energy comsumption (kWh) as the sum of both tariff meters p1 and p2
                  // AQ2 returns total energy production (kWh) as the sum of both tariff meters n1 and n2
                  // AQ3 returns actual power use (kWh)
                  // AQ4 returns total gas consumption (M3) as displayed on the gas meter (if present)
                  //
                  
                  enum OutputPorts
                  {
                   EnergyConsumption, // AQ1
                   EnergyProduction, // AQ2
                   ActualPowerUse,  // AQ3
                   GasConsumption  // AQ4
                  };
                  
                  float GetValue(char *name, float def)
                  {
                   float value = def;
                   int pos = strfind(result, name, 0);
                  
                   if(pos > 0)
                   {
                    int posend = strfind(result, ",", pos);
                    int lenName = strlen(name);
                    int lenValue = posend - (pos + lenName);
                    char *svalue = calloc(1, lenValue);
                  
                    // printf ("Name %s found. Pos = %d. Length = %d", name, pos, lenValue);
                    strncpy(svalue, result + pos + lenName, lenValue);
                    value = atof((char *)svalue+1);
                  
                    // printf ("sValue = %s | Value = %f", svalue, value);
                  
                    free(svalue);
                    svalue = 0;
                   }
                  
                   // printf ("%s = %f", name, value);
                  
                   return value;
                  }
                  
                  //
                  // Main loop
                  // JSON expected: [{"tm":1537431308,"net": 33873.178,"pwr": 336,"ts0":1537365600,"cs0": 0.000,"ps0": 0,"p1": 18736.471,"p2": 15136.707,"n1": 0.000,"n2": 0.000,"gas": 11207.046,"gts":1809201000}]
                  //
                  while(TRUE)
                  {
                   char *host = "192.168.101.20";
                   char *page = "/e?f=j";
                  
                   char *result = httpget(host, page);
                   // printf ("Result: %s", result);
                  
                   if(result != 0)
                   {
                    float p1 = GetValue(""p1":", 0);
                    float p2 = GetValue(""p2":", 0);
                    setoutput(EnergyConsumption, p1+p2);
                  
                    float n1 = GetValue(""n1":", 0);
                    float n2 = GetValue(""n2":", 0);
                    setoutput(EnergyProduction, n1+n2);
                  
                    float pwr = GetValue(""pwr":", 0);
                    setoutput(ActualPowerUse, pwr / 1000);
                  
                    float gas = GetValue(""gas":", 0);
                    setoutput(GasConsumption, gas);
                  
                    free(result);
                   }
                  
                   // Sleep
                   int sleepTime = 10;
                   sleeps(sleepTime);
                  } 
                  
                  The script is easy to adapt to your own needs, so please do and let me know any comments that you have.
                  Zuletzt geändert von Gast; 20.09.2018, 14:57.

                  Kommentar

                  • tatschke
                    Dumb Home'r
                    • 07.02.2017
                    • 21

                    #11
                    Hallo zusammen,

                    kann schon jemand bestätigen, dass dieses PicoC Programm für den YouLess in der Loxone V10 auch problemlos funktioniert?

                    Vielen Dank
                    Thomas

                    Kommentar

                    • Gast

                      #12
                      Hello Thomas,

                      I installed v10 this afternoon and I can confirm that the above 20180920 version is working well.

                      regards,
                      Richard

                      Kommentar

                      • orli
                        Lox Guru
                        • 13.11.2016
                        • 2556

                        #13
                        Klappt einwandfrei.

                        Kommentar

                        • tatschke
                          Dumb Home'r
                          • 07.02.2017
                          • 21

                          #14
                          Gast orli Herzlichen Dank!!

                          Schöne Grüße
                          Thomas

                          Kommentar

                          • RvdB
                            Azubi
                            • 07.01.2019
                            • 4

                            #15
                            Gast Thanks for your script.

                            I don't have too much PicoC experience and can't get the script to run properly. I've copied your code and changed the IP address in my own. It won't produce any output however. When I pull my log file I'm getting the following fault message:

                            float p1 = GetValue(""p1":", 0);
                            ^
                            Youless Fetcher:65:30 identifier not expected here


                            Anyone any thoughts on what I'm doing wrong or should alter?

                            Thanks a lot in advance!




















                            Hello

                            Kommentar

                            Lädt...