Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zum LBS19001260 Buderus Gateway KM200/100

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

    hat schon mal jemand erfolgreich komma-werte gesetzt?

    manualRoomSetpoint krieg ich nicht auf .5-Werte. weder mit , noch mit .
    OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

    Kommentar


      es liegt daran:

      PHP-Code:
      function km200_SetData$REST_URL$Value )
      {
        global 
      $id$curl_errno;

        if (
      is_numeric($Value))
            
      $Value intval($Value); 
      .. lässt man das intval weg oder macht es anders (z.B. += 0), dann lassen sich auch .5er Werte setzen.
      OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

      Kommentar


        Es gibt das Problem, dass das Setzen von Werten ohne Nachkommastellen als numerischer String am LBS ankommen kann und daher die Umwandlung vorgenommen wird, weil der Wert als Zahl übergeben werden muss. Das erklärt natürlich auch das Verhalten, da Integer keine Nachkommastellen kennt.
        Hast Du jetzt mal versucht einen Wert ohne Nachkommastelle anzugeben, wenn Du intval nicht nutzt?
        Ich könnte mir vorstellen, dass das jetzt zu einem Fehler führt.
        Alternativ wäre vielleicht floatval besser.
        Kann Grad nicht schauen, was das Gateway da für einen genauen Typ erwartet.

        Kommentar


          PHP-Code:
          function km200_SetData$REST_URL$Value )
          {
            global 
          $id$curl_errno;

            if (
          is_numeric($Value))
                
          $Value get_numeric($Value);
           
            
          $content json_encode(array("value" => $Value));
            
          logging($id'JSON CONTENT: ' $contentNULL8);
            
          $content_encrypted km200_Encrypt($content);
            ....
            }



          function 
          get_numeric($val) {
            if (
          is_numeric($val)) {
              return 
          $val 0;
            }
            return 
          0;

          so funzt es mit 19, 19.5 und 20.0. Bei 19.4 wird auf 19.0 abgerundet, bei 19.6 auf 19.5.
          OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

          Kommentar


            Irgenwie benötige ich jetzt mal Hilfe bei beinem eigenen LBS...

            Könnte jemand mit CentOS7 die Funktion km200_SetData und km200_GetData bzw. die dazugehörigen encrypt und decrypt Funktionen bitte mal hier aufführen?
            Irgendwie bekomme ich bei den Änderungen zu OpenSSL kuriose Fehler.

            Code:
             [TABLE="class: log, border: 0, cellpadding: 0, cellspacing: 0, width: 0, height: 12"]
             	 		[TR="class: sErr"]
             			[TD]2019-12-29 16:48:58[/TD]
             			[TD]220078[/TD]
             			[TD]?[/TD]
             			[TD]2690[/TD]
             			[TD]Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001260.php | Fehlercode: 8 | Zeile: 147 | Uninitialized string offset: -1[/TD]
             			[TD]ERROR[/TD]
             		[/TR]
             		[TR="class: sErr"]
             			[TD]2019-12-29 16:48:58[/TD]
             			[TD]233417[/TD]
             			[TD]?[/TD]
             			[TD]2690[/TD]
             			[TD]Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001260.php | Fehlercode: 2 | Zeile: 39 | count(): Parameter must be an array or an object that implements Countable[/TD]
             			[TD]ERROR[/TD]
             		[/TR]
             	 [/TABLE]

            Kommentar


              Der zweite Fehler ist ein typischer Fehler bei der Migration von PHP 5.x zu 7.x, da PHP 7.x hier einfach strikter ist.

              Kommentar


                Fehler gefunden, der zurückgegebene JSON-String enthielt noch (nicht anzeigbare) Zeichen, welche ein json_decode unmöglich machte.
                Dadurch antstand der Fehler mit count und dem Index -1, da kein Array zurückgegeben wurde.
                In der Funktion zum decodieren (km200_Decrypt) hatte ich die folgende Zeile auskommentiert, in der Annahme, dass dies nicht mehr nötigt sei...

                PHP-Code:
                // remove zero padding
                    
                $decrypt rtrim$decrypt"\x00" ); 
                Ich muss das alles nochmal etwas aufbereiten und kann dann eine neue Version, welche mit CentOS7/PHP7 funktioniert, hochladen.

                Kommentar


                  Hallo zusammen,

                  erstmal vielen Dank an Glotzkowski für diesen Logicbaustein welcher bei mir wirklich gut funktioniert.

                  Da für mich auch das Auslesen der Archivdaten (=Recordings) des KM200 sehr wichtig war habe ich das heute in einer Nachtschicht mal experimentell umgesetzt. Ich dachte mir ich teile den Code hier da ich mir vorstellen könnte das das für andere auch hilfreich sein könnte. @Glotzkowski ich hoffe das ist OK für dich? Gerne kannst du den Code auch für deinen LBS verwenden.


                  Alter Code der zu ersetzen ist (Zeile 312-317):
                  PHP-Code:
                  return json_decode(
                  km200_Decrypt(
                  $body
                  ),
                  true //Achtung! Hier das true (und drüber das Komma) macht aus dem decodierten Objekt ein Array zur weiteren Bearbeitung)
                  ); 


                  Neuer Code:
                  PHP-Code:
                  $decodedbody json_decode(km200_Decrypt($body),true); //Achtung! Hier das true (und drüber das Komma) macht aus dem decodierten Objekt ein Array zur weiteren Bearbeitung)

                  if ($decodedbody['type'] == 'yRecording')
                  {
                      
                  //Suche ob Request-URL die Worte "Power" oder "Yield" enthält
                      
                  $endofurl strrchr(strtolower($decodedbody['id']), "/");
                      
                  $ispowerinkw strpos($endofurl'power') !== false || strpos($endofurl'yield') !== false true false;
                      
                      
                  $valueset = array();
                      
                      
                  //Umrechnung der Werte
                      
                  foreach ($decodedbody['recording'] as $record) {
                          
                  $valueset[] = $record['c'] ? round(1000.0 $record['y'] / ($ispowerinkw 60 $record['c'])) / 1000.0 0;
                      }
                      
                      
                  //Funktion für Ausgabe ermitteln
                      
                  $url_vars parse_url($info['url']);
                      
                  parse_str($url_vars['query'], $params);
                      
                  $calc = isset($params['calc']) ? $params['calc'] : '';
                      
                      switch (
                  $calc) {
                      case 
                  'sum':
                          
                  $decodedbody['value'] = array_sum($valueset);
                          break;
                      case 
                  'avg':
                          
                  $decodedbody['value'] = array_sum($valueset) / count($valueset);
                          break;
                      case 
                  'min':
                          
                  $decodedbody['value'] = min($valueset);
                          break;
                      case 
                  'max':
                          
                  $decodedbody['value'] = max($valueset);
                          break;
                      default:
                          
                  $decodedbody['value'] = implode(','$valueset);
                          break;        
                  }
                  }
                  return 
                  $decodedbody

                  Anwendung:
                  Die URL bei den recording-Werten wird um 2 Parameter ergänzt:

                  interval
                  gibt den Zeitraum an, der zurückgegeben wird. Möglich sind Jahre (2019), Monate (2019-12), Tage (2019-12-30)

                  calc
                  gibt die Funktion an mit der die Daten aufbereitet werden. Möglich sind sum (Summe aller Werte), avg (Durchschnitt aller Werte), min (kleinster Wert), max (höchster Wert) oder ohne Parameter werden alle Werte Kommasepariert ausgegeben.


                  Beispiel:
                  /recordings/solarCircuits/sc1/solarYield?interval=2019-12-30&calc=sum



                  Gruß,
                  Andreas

                  Kommentar


                    wenn das wirklich funktioniert, bist du mein Held.. werde ich heute Abend gleich mal testen! Danke schonmal fürs teilen!
                    OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

                    Kommentar


                      Gerne, gib mir dann Bescheid ob es bei dir geklappt hat.

                      Kommentar


                        Ja toll! Funktioniert!

                        Seit März (Gateway-FW Update) hab ich gerätselt wie man an die Daten rankommt.
                        Jetzt komme ich endlich auch an Wärmemengen digital ran, leider nicht getrennt nach Heizen/Kühlen/WW wir am Display, aber ist ja schon mal was.

                        Aus allem werde ich aber noch nicht schlau.

                        Bei einem Datenpunkt mit Energie (/recordings/heatSources/total/energyMonitoring/consumedEnergy) bekomme ich bei der Abfrage eines Tages:
                        12 Einzelwerte
                        nehme ich calc=sum dazu, einen Wert.
                        Addiere ich die 12 Einzelwerte, komme ich auch auf die Summe.

                        Frage ich aber nun einen Monat ab (zB 2019-12) bekome ich 31 Einzelwerte - die aber nicht zu den Tageswerten passen.
                        Der Letzte Wert bei 2019-12 z.B. beträgt 0.794, 2019-12-31&calc=sum liefert aber 19.051

                        0.794 * 24 = 19,056 sieht so aus, als würden bei der Monatsabfrage die (Stunden-)Werte nicht mit Summe, sondern mit Average aggegriert.

                        Leider nicht nur bei der Einzelwert-Abfrage, sondern auch bei sum.
                        2019-12&calc=sum liefert 22.758 - was widerrum x24 einen in etwa plausiblen Wert enstpricht (der aber 20kWh neben dem echten, am Display abgelesenen, Wert liegt).



                        => Für mich brauchbar sind eigentlich nur die Tages bzw. die Stundenwerte.
                        Müsste ich mir mal einen LBS bauen, der dann immer den Vortag ausliest und die 24 Einzelwerte in ein Datenarchiv pumpt..



                        moment, ich hab mir gerade deinen Code nochmal angesehen.. der calc parameter wird nur lokal ausgewertet, oder?
                        Die Daten kommen immer so, wie ohne Angabe von calc, oder?
                        Zuletzt geändert von Ing-Dom; 03.01.2020, 21:03.
                        OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

                        Kommentar


                          Zitat von AndiVaio Beitrag anzeigen
                          @Glotzkowski ich hoffe das ist OK für dich? Gerne kannst du den Code auch für deinen LBS verwenden.
                          Na logo, wir sitzen doch alle auf'm gleichen EDOMI-Dampfer und so bekommt der LBS direkt ne neue Funktion, danke dafür!
                          Werde ich noch mit in den LBS einbauen.
                          Dass man nun so an die Daten vom WMZ kommt ist natürlich ne sau coole Sache!

                          Kommentar


                            Sehr schön, freut mich dass es funktioniert.

                            Korrekt, die calc Parameter werden nur lokal vom Baustein ausgewertet. Ich habe das eingebaut damit ich z.B. durch die sum Funktion einen brauchbaren Tageswert bekomme. Wenn du keinen Parameter angibst erhältst du die Daten die vom Gateway kommen mit Kommas getrennt.

                            Dass die vom Gateway gelieferten Daten sich etwas vom Display am Heizgerät unterscheiden habe ich auch schon an einem Beispiel bei mir gemerkt:
                            Bei "/recordings/solarCircuits/sc1/solarYield?interval=2019-12" ist der letzte Wert 1240.2 (Watt)
                            "/recordings/solarCircuits/sc1/solarYield?interval=2019-12-31&calc=sum" gibt ebenfalls 1240.2 (Watt) zurück

                            Am Display stehen die 1,2kW jedoch am Mittwoch drin, dies ist aber vom Datum schon der 01.01.2020

                            Sieht so aus als wäre das Ganze immer um einen Tag verschoben - darauf habe ich mit dem Script jedoch soweit keinen Einfluss, da das Datum ja unverändert an das Modul geschickt wird.


                            Edit: Ich fasse es nicht, jetzt haben sich die Daten am Display des Heizgerätes verschoben:
                            Vorher
                            IMG_8668.jpg
                            Nachher
                            IMG_8671.jpg
                            Zuletzt geändert von AndiVaio; 03.01.2020, 21:44.

                            Kommentar


                              Ing-Dom Mir ist noch etwas eingefallen. Bei allen Werten die in Watt oder kW ausgegeben werden erfolgt die Umrechnung anders. Deshalb auch die Zeile im Script die die URL auf das Vorkommen von "power" oder "yield" prüft.

                              Vielleicht probierst du mal folgenden Code bei dir aus:
                              PHP-Code:
                              $ispowerinkw strpos($endofurl'power') !== false || strpos($endofurl'yield') !== false || strpos($endofurl'energy') !== false true false
                              Ist nur so eine Idee, ich kann es nicht testen, da ich eine Gas-Therme mit Solar habe.

                              Kommentar


                                Das ist ja echt Zufall. Ich habe mich auch die letzten Tage mit den /recordings beschäftigt. Mir geht es aber dabei aber mehr um die Speicherung der stündlichen Werte in ein Datenarchiv und habe daher auf Grundlage dieses LBS ein eigenes geschrieben. Das erzeugt direkt die korrekten Zeitstempel und schreibt ins Archiv. Bin gerade am testen, die Werte decken sich aber bisher mit dem was ich direkt vom Display ablesen kann. Falls Intersesse besteht kann ich das aber gern teilen.

                                Kommentar

                                Lädt...
                                X