Ankündigung

Einklappen
Keine Ankündigung bisher.

"LBS-Pate" gesucht.

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

    "LBS-Pate" gesucht.

    Hallo,
    ich dachte mich ich frag einfach mal. Ich hab ein Problem mit meinen PHP-Kenntnissen (sind zu schlecht, aber es wird). Daher wollte ich fragen ob mir jemand mit meinen LBS'en hilft. Funktionieren tun sie ja, also sie machen was sie sollen (größtenteils). Nur ich würde sie auch gern der Allgemeinheit zur Verfühgung stellen, aber nicht in diesen Zustand. Sie Schreiben nämlich Feldermeldungen in das Edomi-Log und ich versteh nicht wie ich da ein LBS-Eigenes Log ertstellen und die Meldungen dann dort ausgeben lassen kann.

    Es geht um einen LBS der aus dem Solarworld Suntrol eManager per JSON (in Verbindung mit dem LBS19000933 JSON-Abfrage) Daten abruft und um einen der über ein C.M.I. Modul der Technischen Alternative Daten aus einer UVR16x2 abfragt.

    Vielleicht hat ja jemand Lust den Code mal anzuschauen und mir dabei helfen mein Fehler-Log sauber zu halten.

    Viele Grüße

    Jürgen


    #2
    Wenn es nicht geheim ist, warum postest Du den Code nicht hier? Da wird sich schon jemand finden, der mal drüber schaut. Am Besten LBS Code, einen Beispielstring für den Eingang und die Fehlermeldungen dazu.
    Mfg Micha
    Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

    Kommentar


      #3
      Naja geheim ist es ja nicht aber schlampig...

      Ich poste den Code hier gerne, also:

      PHP-Code:
      ###[DEF]###
      [name        =SolarWorld (v0.8)            ]

      [e#1 TRIGGER    = Trigger (optional)                ]
      [e#2 IMPORTANT    = Json-String    ]

      [a#1    = Aktueller Verbrauch (Haus/Batterie)                ]
      [a#2    = Aktueller Verbrauch (Haus)                    ]
      [a#3    = Einspeisung                    ]
      [a#4    = Batterie-Ladung Wh                    ]
      [a#5    = Batterie-Zustand                    ]
      [a#6    = Batterie-Ladung %                    ]
      [a#7    = Erzeugung PV                    ]
      [a#8    = Maximale Leistung PV                    ]
      [a#9    = Eigenstromversorgung                ]
      [a#10    = Bezug EVU                ]
      [a#11    = Ladestrom Batterie                ]
      [a#12    = Entladestom Batterie                ]
      [a#13    = Direkt Verbraucht von PV                ]
      [a#14    = Autarkie                ]
      [a#15    = Batterie-Ladung 0-255                ]
      ###[/DEF]###


      ###[HELP]###

      <h2>Ein- und Ausg�nge</h2>
      <h3>Eing�ne</h3>


      <h3>Ausg�nge</h3>    

      ###[/HELP]###
      Aktueller Verbrauch (Haus/Batterie) PowerSelfConsumption
      Aktueller Verbrauch (Haus)  PowerConsumption
      Einspeisung                PowerOut    
      Batterie-Ladung Wh    WorkCharge
      Batterie-Zustand    ModeConverter
      Batterie-Ladung %    StateOfCharge
      Erzeugung PV        PowerTotalPV
      Maximale Leistung PV PowerPVPeak
      Eigenstromversorgung PowerSelfSupply
      Bezug EVU            PowerIn
      Ladestrom Batterie
      Entladestom Batterie                
      Direkt Verbraucht von PV            
      Autarkie            
      Batterie-Ladung 0-255

      ###[LBS]###
      <?
      function LB_LBSID($id) {
          if ($E=getLogicEingangDataAll($id)) {  
              if ($E[1]['refresh']==1 || $E[2]['refresh']==1) {    
                  $json = (string)$E[2]['value'];
                  //$json = $E[1]['value'];
                  //$json = '{"PowerSelfConsumption":1379.4603809075945,"PowerConsumption":2596.748567966797,"PowerOut":0,"StatesOfCharge":{"WorkCharge":60,"ModeConverter":"DISCHARGING","StateOfCharge":1},"PowerTotalPV":1379.4603809075945,"PowerPVPeak":9900,"PowerSelfSupply":2575.2943900307573,"PowerIn":21.45417793603974,"PowerConsumptionMax":{"2017-09-24":4327.874227078623,"2017-09-23":5706.109233114997,"2017-09-22":5097.137145880682,"2017-09-18":5003.694712464589,"2017-09-21":5837.091378738959,"2017-09-19":7958.92557146933,"2017-09-20":5060.969388313184}}';
                  $array = json_decode($json, true);

                  //Verbrauch Gesamt
                  if (isset ($array["PowerSelfConsumption"])) {
                      setLogicLinkAusgang($id,1,$array["PowerSelfConsumption"]);
                  } else {   
                      setLogicLinkAusgang($id,1,"0");            
                  }

                  //Verbrauch
                  if (isset ($array["PowerConsumption"])) {
                      setLogicLinkAusgang($id,2,$array["PowerConsumption"]);
                  } else {   
                      setLogicLinkAusgang($id,2,"0");            
                  }

                  //Einspeisung
                  if (isset ($array["PowerOut"])) {
                      setLogicLinkAusgang($id,3,$array["PowerOut"]);
                  } else {   
                      setLogicLinkAusgang($id,3,"0");               
                  }

                  //Ladung kWh
                  if (isset ($array["StatesOfCharge"]["WorkCharge"])) {
                      setLogicLinkAusgang($id,4,$array["StatesOfCharge"] ["WorkCharge"]);
                  } else {   
                      setLogicLinkAusgang($id,4,"0");                
                  }

                  //Zustand Batterie
                  if (isset ($array["StatesOfCharge"] ["ModeConverter"])) {
                      setLogicLinkAusgang($id,5,$array["StatesOfCharge"] ["ModeConverter"]);           
                  } else {   
                      setLogicLinkAusgang($id,5,"0");                
                  }

                  //Ladung %
                  if (isset ($array["StatesOfCharge"] ["StateOfCharge"])) {
                      setLogicLinkAusgang($id,6,$array["StatesOfCharge"] ["StateOfCharge"]);          
                  } else {   
                      setLogicLinkAusgang($id,6,"0");             
                  }            
                  //Ladung 0-255
                  if (isset ($array["StatesOfCharge"] ["StateOfCharge"])) {
                      $ladezustand255 = ($array["StatesOfCharge"] ["StateOfCharge"]) * 2.55 ;
                      setLogicLinkAusgang($id,15,$ladezustand255);          
                  } else {   
                      setLogicLinkAusgang($id,15,"0");             
                  }  


                  //Erzeugung PV
                  if (isset ($array["PowerTotalPV"])) {
                  setLogicLinkAusgang($id,7,$array["PowerTotalPV"]);          
                  } else {   
                      setLogicLinkAusgang($id,7,"0");             
                  }

                  //Maximale PV Leistung
                  if (isset ($array["PowerPVPeak"])) {
                      setLogicLinkAusgang($id,8,$array["PowerPVPeak"]);          
                  } else {   
                      setLogicLinkAusgang($id,8,"0");             
                  }             

                  //Eigenversorgung
                  if (isset ($array["PowerSelfSupply"])) {
                      setLogicLinkAusgang($id,9,$array["PowerSelfSupply"]);          
                  } else {   
                      setLogicLinkAusgang($id,9,"0");             
                  }            

                  //Strombezug
                  if (isset ($array["PowerIn"])) {
                      setLogicLinkAusgang($id,10,$array["PowerIn"]);           
                  } else {   
                      setLogicLinkAusgang($id,10,"0");             
                  }             

                  // Ladestrom der Batterie berechnen            
                  if (isset ($array["PowerTotalPV"]) && ($array["PowerConsumption"]) && ($array["PowerOut"])) {
                      $ladestrom = ($array["PowerTotalPV"]) - ($array["PowerConsumption"]) - ($array["PowerOut"]);
                      if ($ladestrom > 0) {
                          setLogicLinkAusgang($id,11,$ladestrom);    

                      } else {   
                          setLogicLinkAusgang($id,11,"0");             
                      }              
                  }
                  // Entladestom Batterie            
                  if (isset ($array["PowerSelfSupply"]) && ($array["PowerTotalPV"])) {


                      // gesamtverbrauch - Bezug - Solarstrom
                      $entladestrom = ($array["PowerConsumption"]) - ($array["PowerTotalPV"]) - ($array["PowerIn"]) ;
                      if ($entladestrom <= "0"){
                          setLogicLinkAusgang($id,12,"0");
                      } elseif (($array["StatesOfCharge"] ["StateOfCharge"]) == "0" ){
                           setLogicLinkAusgang($id,12,"0");
                      } else {
                          setLogicLinkAusgang($id,12,$entladestrom);    
                      }
                  }             


                  // Direkt von PV Verbraucht    - Rechnet noch nicht richtig     
                  if (isset ($array["PowerTotalPV"]) && ($array["PowerConsumption"])) {
                      if (($array["PowerConsumption"]) < ($array["PowerTotalPV"]) ) {
                          setLogicLinkAusgang($id,13,$array["PowerConsumption"]);    

                      } else {   
                          setLogicLinkAusgang($id,13,($array["PowerTotalPV"]));             
                      }              
                  }           

                  // Berechnung Autarkie            -  Rechnet noch nicht richtig
                  if (isset ($array["PowerConsumption"]) && ($array["PowerSelfSupply"])) {
                      if (($array["PowerConsumption"]) > ($array["PowerSelfSupply"]) )
                      {
                      $autarkie = round(($array["PowerSelfSupply"]) / ($array["PowerConsumption"]) * 100) ;
                          setLogicLinkAusgang($id,14,$autarkie);    
                      }
                      elseif (($array["PowerSelfSupply"]) < "10")  
                      {
                          setLogicLinkAusgang($id,14,"0");
                      }


                      else
                      {   
                          setLogicLinkAusgang($id,14,"100");             
                      }              



                  }

              }
          }
      }
      ?>
      ###[/LBS]###


      ###[EXEC]###
      <?

      ?>
      ###[/EXEC]###
      Bespiel String:
      Code:
      {"PowerSelfConsumption":0,"PowerConsumption":2827.4359296317,"PowerOut":0,"StatesOfCharge":{"WorkCharge":0,"ModeConverter":"DISCHARGING","StateOfCharge":0},"PowerPVPeak":9900,"PowerSelfSupply":0,"PowerIn":2827.4359296317,"PowerConsumptionMax":{"2018-03-07":7789.5358414204,"2018-03-06":7741.8280253444,"2018-03-09":7474.6463462905,"2018-03-08":7401.5157826181,"2018-03-10":8187.1911753247,"2018-03-05":10081.923435511,"2018-03-04":6453.1900474822}}
      Fehlermeldung in Log
      Datei: /usr/local/edomi/www/data/liveproject/lbs/LBS19666151.php | Fehlercode: 8 | Zeile: 106 | Undefined index: StatesOfCharge

      Tritt auf wenn Array nich vorhanden, manchmal ist Json-String nicht vollständig.
      Ausserdem werden die Berechnungen am Schluß nicht richtig durchgeführt bzw sind falsch, das könnt ich selbst in den Griff bekommen...

      Das war der Suntrol eManager LBS

      ----------------------------------------------


      Nun der LBS für das CMI Modul. Da hab ich den JSON-Download mit eingebunden da Login erforderlich.


      PHP-Code:
      ###[DEF]###
      [name        =    UVR16x2 über CMI-Modul auslesen (lokal)]

      [e#1  TRIGGER    = Trigger        ]
      [e#2  IMPORTANT    = IP CMI    ]
      [e#3  IMPORTANT    = Benutzer    ]
      [e#4  IMPORTANT    = Passwort    ]
      [e#5  IMPORTANT    = CAN-Knotennummer    ]


      [a#1        = Messwert Eingang 1 ]
      [a#2        = Messwert Eingang 2 ]
      [a#3        = Messwert Eingang 3 ]
      [a#4        = Messwert Eingang 4 ]
      [a#5        = Messwert Eingang 5 ]
      [a#6        = Messwert Eingang 6 ]
      [a#7        = Messwert Eingang 7 ]
      [a#8        = Messwert Eingang 8 ]
      [a#9        = Messwert Eingang 9 ]
      [a#10        = Messwert Eingang 10 ]
      [a#11        = Messwert Eingang 11 ]
      [a#12        = Messwert Eingang 12 ]
      [a#13        = Messwert Eingang 13 ]
      [a#14        = Messwert Eingang 14 ]
      [a#15        = Messwert Eingang 15 ]
      [a#16        = Messwert Eingang 16 ]
      [a#17        = Zustand Ausgang 1 ]
      [a#18        = Zustand Ausgang 2 ]
      [a#19        = Zustand Ausgang 3 ]
      [a#20        = Zustand Ausgang 4 ]
      [a#21        = Zustand Ausgang 5 ]
      [a#22        = Zustand Ausgang 6 ]
      [a#23        = Zustand Ausgang 7 ]
      [a#24        = Zustand Ausgang 8 ]
      [a#25        = Zustand Ausgang 9 ]
      [a#26        = Zustand Ausgang 10 ]
      [a#27        = Zustand Ausgang 11 ]
      [a#28        = Zustand Ausgang 12 ]
      [a#29        = Zustand Ausgang 13 ]
      [a#30        = Zustand Ausgang 14 ]
      [a#31        = Zustand Ausgang 15 ]
      [a#32        = Zustand Ausgang 16 ]

      ###[/DEF]###


      ###[HELP]###
      Dieser LBS ermöglicht das Auslesen einer UVR16x2 Regelung der Technischen Alternative in Verbindung mit einem C.M.I-Modul lokal über das Netzwerk.
      Wie sich der LBS mit anderen x2-Geräten oder einer UVR1611 verhält könnte nicht getestet werden. Ältere Geräte der Technischen Alternative werden nicht unterstützt.


      Dieser LBS verfügt über keine Log-Funktion.

      Achtung:
      Das C.M.I.-Modul lässt nur jede Minute eine Abfrage zu. Den Oszillator-LBS am Eingang 1 dementsprechend einstellen.

      <hr/>
      <b><u>Changelog:</u></b>
      v0.1:
      - initiale Version

      ###[/HELP]###


      ###[LBS]###
      <?
      function LB_LBSID($id) {
          if ($E=logic_getInputs($id)) {

              if ($E[1]['refresh']==1 || $E[2]['refresh']==1) {
                  callLogicFunctionExec(LBSID, $id);
              }

          }
      }

      ?>

      ###[/LBS]###


      ###[EXEC]###
      <?
      require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
      sql_connect();
      if ($E=logic_getInputs($id)){
          $knotennummer = $E[5]['value'];
          $url = $E[2]['value']."/INCLUDE/api.cgi?jsonnode=" . $knotennummer . "&jsonparam=I,O";
          $user = $E[3]['value'];
          $pass = $E[4]['value'];
          $ch=curl_init();
          curl_setopt($ch,CURLOPT_URL,$url);
          curl_setopt($ch,CURLOPT_USERPWD, "$user:$pass");
          curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5);
          curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
          $content = curl_exec($ch);
          curl_close($ch);
          $array = json_decode ($content, true);
          //echo ($content)




                  $eingangsnummer=0;
                  $n1=$eingangsnummer+1;
                  while($eingangsnummer <= 15) {
                      if (isset ($array["Data"] ["Inputs"] [$eingangsnummer])) {
                      logic_setOutput($id,$array["Data"] ["Inputs"] [$eingangsnummer] ["Number"],$array["Data"] ["Inputs"] [$eingangsnummer] ["Value"] ["Value"]);   

                          //echo (" Eingang ". $array["Data"] ["Inputs"] [$eingangsnummer] ["Number"] . " hat den wert von " . $array["Data"] ["Inputs"] [$eingangsnummer] ["Value"] ["Value"]);

                      }

                      $eingangsnummer++;
                  }        

                  $ausgangsnummer=0;
                  $a1=$ausgangsnummer+1;
                  while($ausgangsnummer <= 15) {
                      if (isset ($array["Data"] ["Outputs"] [$ausgangsnummer])) {
                      logic_setOutput($id,$array["Data"] ["Outputs"] [$ausgangsnummer] ["Number"] + 16,$array["Data"] ["Outputs"] [$ausgangsnummer] ["Value"] ["Value"]);
                      //echo (" Der Ausgang ". $array["Data"] ["Outputs"] [$ausgangsnummer] ["Number"] + 16 . " hat den Zustand von " . $array["Data"] ["Outputs"] [$ausgangsnummer] ["Value"] ["Value"]);

                      }

                      $ausgangsnummer++;
                  }                    


      setLogicElementStatus($id,0);              
      }    
      sql_disconnect();  
      ?>

      ###[/EXEC]###
      Ein Beispiel String:

      Code:
      { "Header":{ "Version":2, "Device":"87", "Timestamp":1520675883 }, "Data":{ "Inputs":[ { "Number":1, "AD":"A", "Value":{ "Value":9999.9, "Unit":"1" } }, { "Number":2, "AD":"A", "Value":{ "Value":23.6, "Unit":"1" } }, { "Number":3, "AD":"A", "Value":{ "Value":24.8, "Unit":"1" } }, { "Number":4, "AD":"A", "Value":{ "Value":27.4, "Unit":"1" } }, { "Number":5, "AD":"A", "Value":{ "Value":36.6, "Unit":"1" } }, { "Number":6, "AD":"A", "Value":{ "Value":30.7, "Unit":"1" } }, { "Number":7, "AD":"A", "Value":{ "Value":71.7, "Unit":"8" } }, { "Number":9, "AD":"A", "Value":{ "Value":45.3, "Unit":"1" } }, { "Number":10, "AD":"A", "Value":{ "Value":44.0, "Unit":"1" } }, { "Number":11, "AD":"A", "Value":{ "Value":44.0, "Unit":"1" } }, { "Number":13, "AD":"A", "Value":{ "Value":30.6, "Unit":"1" } }, { "Number":14, "AD":"A", "Value":{ "Value":28.5, "Unit":"1" } }, { "Number":16, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }], "Outputs":[ { "Number":1, "AD":"A", "Value":{ "State":0, "Value":0, "Unit":"0" } }, { "Number":2, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }, { "Number":5, "AD":"D", "Value":{ "Value":1, "Unit":"43" } }, { "Number":6, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }, { "Number":7, "AD":"D", "Value":{ "Value":1, "Unit":"43" } }, { "Number":8, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }, { "Number":9, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }, { "Number":10, "AD":"D", "Value":{ "Value":1, "Unit":"43" } }, { "Number":11, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }, { "Number":14, "AD":"D", "Value":{ "Value":1, "Unit":"43" } }, { "Number":15, "AD":"D", "Value":{ "Value":1, "Unit":"43" } }, { "Number":16, "AD":"D", "Value":{ "Value":0, "Unit":"43" } }]}, "Status":"OK", "Status code":0 }
      Device 87 bedeutet das Gerät ist eine UVR16x2
      Unit ist die Einheit des Messwertes, wir jedoch nicht aufgewertet.

      Mehr Informationen über das API des CMI von TA auf diesem PDF

      Der LBS ist mir gut gelungen er ist kurz und geht ohne Fehler.
      Ich hab das alles nicht gelernt und musste mir das mehr oder weniger selbst (auch mit Hilfe dieses Forums und deren Mitglieder) erarbeiten.

      Danke

      Jürgen





      Kommentar


        #4
        Für mich sieht es so aus als wäre in Zeile 156 ein Index "StateOfCharge" zuviel:

        PHP-Code:
        $array["StatesOfCharge"] ["StateOfCharge"

        Kommentar


          #5
          Edit Mist geschrieben.....
          Mfg Micha
          Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

          Kommentar


            #6
            Code:
             
             "StatesOfCharge":{"WorkCharge":0,"ModeConverter":"DISCHARGING","StateOfCharge":0
            Nein das ist nicht das Problem. Er meckert wenn ein Teil des Arrays fehlt, ist nicht immer der Fall. Das müsste man nur ignorieren. Danke Aber Danke Das Array wird immer korrekt ausgewertet. Er meckert nur wenn ein Teil des Arrays fehlt.

            Kommentar


              #7
              Ah okay, hatte den Unterschied ('s') nicht gesehen.

              Du musst dann einfach vorher prüfen, ob der Index vorhanden ist oder nicht:

              http://php.net/manual/de/function.array-key-exists.php

              Kommentar


                #8
                Zitat von Jue Beitrag anzeigen
                if (isset ($array["StatesOfCharge"] ["StateOfCharge"]))
                reicht da wohl nicht?

                Kommentar


                  #9
                  Hey sehr cool, liest du mit deinem LBS nur den CMI aus oder direkt die UVR.
                  Da könnte man sich ja das KNX Gateway sparen.

                  Kommentar


                    #10
                    Zitat von Jue Beitrag anzeigen

                    reicht da wohl nicht?
                    Wenn du auf der sicheren Seite sein willst, dann nimmst du array_key_exists().

                    PHP-Code:

                    if (array_key_exists('StateOfCharge'$array['StatesOfCharge']))
                    {

                    // Dein PHP Code


                    Zuletzt geändert von jonofe; 10.03.2018, 12:27.

                    Kommentar


                      #11
                      Zitat von Jue Beitrag anzeigen
                      reicht da wohl nicht?

                      Mit IF (ISSET($array)) würde ich nur das Array selbst prüfen ob "vorhanden", den Rest, wie André schon geschrieben hat mit: IF (ARRAY_KEY_EXISTS(...)) für jede weitere Verwendung (zB: LBS-Ausgang) prüfen.
                      Zuletzt geändert von coliflower; 10.03.2018, 12:25.
                      Danke und LG, Dariusz
                      GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                      Kommentar


                        #12
                        Zitat von jonofe Beitrag anzeigen
                        $array['StatesOfCharge'))
                        hier fehlt noch die abschließende eckige Klammer ...
                        Danke und LG, Dariusz
                        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                        Kommentar


                          #13
                          Klugscheissermodus on
                          Zitat von coliflower Beitrag anzeigen
                          (ARRAY_KEY_EXISTS(...))
                          Mfg Micha
                          Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

                          Kommentar


                            #14
                            ... ausgebessert.
                            Danke und LG, Dariusz
                            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                            Kommentar


                              #15
                              Zitat von SeatSLF Beitrag anzeigen
                              Hey sehr cool, liest du mit deinem LBS nur den CMI aus oder direkt die UVR.
                              Da könnte man sich ja das KNX Gateway sparen.
                              ich lese über das CMI die UVR aus. CAN-BC für KNX ist dann nicht nötig. Aber mit den CAN-BC (KNX) kann man eben mehr machen, also auch Befehle und Werte senden.

                              Kommentar

                              Lädt...
                              X