+ Antworten
Seite 16 von 16 ErsteErste ... 6 14 15 16
Ergebnis 151 bis 157 von 157
  1. #151
    Registriert seit
    Apr 2013
    Ort
    Baden-Württemberg
    Beiträge
    1,921

    @Cubus
    Das wäre auch schon klasse....

    meine statischen Skripte, habe ich nach dem ersten Jahr feststellen müssen, sind doch sehr statisch...
    Nun ist 2018 :-) Und ich steig nicht mehr durch was ich wo / wie berechne....

    Ich hab alle Datenvarianten im Einsatz (Modbus/PUSH)....
    • Z-WAVE: Fibaro FGR-221, FGS-211,Aeon Labs Multisensor, Aeon Labs S2, FGK, Greenwave
    • 1-Wire: S0 Counter, Windsensor XS, 1 Wire DS9490R, DS18B20, Luftgütesensor
    • Youless LS110 / Velux Raumluftfühler / Oregon Scientific WMR180A
    • IPS: CENOVO MINI China PC / IPS-2: Razberry PI B+

  2. #152
    Registriert seit
    Jun 2015
    Beiträge
    207

    So, dann will ich mal


    Autarkie:

    PHP-Code:
    <?

    //Autarkiegrad ausrechnen
    $Gesamtverbrauch GetValue(13531 /*[Allgemein\Photovoltaik\Auswertung\Gesamtverbrauch täglich\Gesamtverbrauch täglich]*/);
    $Eigenverbrauch GetValue(13152 /*[Allgemein\Photovoltaik\Auswertung\Eigenverbrauch täglich\Eigenverbrauch täglich]*/);

    $Autarkie abs($Eigenverbrauch $Gesamtverbrauch 100);


    SetValue(26213 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad Heute]*/$Autarkie);

    //Autarkiestufe bestimmen
    $wert GetValue(26213 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad Heute]*/);


    //Autarkie bis 20%
    if ($wert <20){
      
    SetValue(21183 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 0-19]*/true);
    }
    if (
    $wert <20)
      
    SetValue(42155 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 20-49]*/false);
      
    if (
    $wert <20)
      
    SetValue(46010 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 50-100]*/false);



    //Autarkie 20 - 50%    
    if ($wert >19)
      
    SetValue(42155 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 20-49]*/true); 

    if (
    $wert >19)
      
    SetValue(21183 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 0-19]*/false);

    if (
    $wert <50)
      
    SetValue(46010 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 50-100]*/false);


    //Autarkie 50 - 100%         
    if ($wert >49)
      
    SetValue(46010 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 50-100]*/true);
      
    if (
    $wert >49)
      
    SetValue(42155 /*[Allgemein\Photovoltaik\Auswertung\Autarkiegrad\Autarkiegrad 20-49]*/false);

      

      
    //echo "Autarkiegrad: " .  $wert . " %". "\n";

    ?>
    Bezug/Einspeisung ausrechnen

    PHP-Code:
    <?
    $usage 
    GetValue(19879 /*[Allgemein\Photovoltaik\PowerReal_P_Sum\Wert]*/);
    $LeistungPV GetValue(42853 /*[Allgemein\Photovoltaik\AC Power Value\Wert]*/);
    $Verbrauch abs($LeistungPV $usage * -1);

    // echo $Verbrauch;
    SetValue(28618 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Verbrauch]*/$Verbrauch);

    // Netzeinspeisung:
    if ($usage 0){
      
    SetValue(35189 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Einspeisung aktuell]*/abs($usage));
    }
    else{
     
    SetValue(35189 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Einspeisung aktuell]*/0); 
    }

    // Netzbezug
    if ($usage 0){
      
    SetValue(10507 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Netzbezug]*/abs($usage));
      
    }
    else{
      
    SetValue(10507 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Netzbezug]*/0);
    }
    ?>
    Bezug ja/nein

    PHP-Code:
    <?


    $wert 
    GetValue(10507 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Netzbezug]*/);
    //echo $wert . "\n";


    if ($wert 0)
      
    SetValue(24013 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Bezug ja/nein]*/true);
      
    if (
    $wert 1)
      
    SetValue(24013 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Bezug ja/nein]*/false);
      

    ?>
    Eigen-/ Fremdbezug ja/nein

    PHP-Code:
    <?



    $Bezug 
    GetValue(24013 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Bezug ja/nein]*/);


    $Erzeugung GetValue(50344 /*[Allgemein\Photovoltaik\Auswertung\Erzeugung täglich\Erzeugung ja/nein]*/);


    $wert abs($Bezug $Erzeugung);
    //echo $wert . "\n";

    if ($wert 1)
     
    SetValue(26473 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Eigen- und Fremdbezug ja/nein]*/true);
      
    if (
    $wert 2)
      
    SetValue(26473 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Eigen- und Fremdbezug ja/nein]*/false);
      

    ?>
    Einspeisung ja/nein

    PHP-Code:
    <?

    $wert 
    GetValue(35189 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Einspeisung aktuell]*/);
    //echo $wert . "\n";


    if ($wert 0)
      
    SetValue(54137 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Einspeisung ja/nein]*/true);
      
    if (
    $wert 1)
      
    SetValue(54137 /*[Allgemein\Photovoltaik\Auswertung\Bezug / Einspeisung aktuell\Einspeisung ja/nein]*/false);

    ?>
    Bezug täglich

    PHP-Code:
    <?


    //Alle heutigen Datensätze abfragen (Tägliche Aggregationsstufe)
    //z.B. um den heutigen Verbrauch er ermitteln oder die heutige Durchschnittstemperatur
    $werte AC_GetAggregatedValues(45082 /*[Archiv]*/21029 /*[Allgemein\Photovoltaik\bringt uns das was?\Bezug gesamt (Wh)\Value]*//* 5 minütig */strtotime("today 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv    
         
    foreach($werte as $wert) {
        
    //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
    }

    // aufsummieren:
    $Summe 0;

    // print_r($werte);
    foreach ($werte as $wert){
      
    $Summe $Summe $wert['Avg'];
    }
    //echo "Summe: " .  $Summe . "\n";

    SetValue(11644 /*[Allgemein\Photovoltaik\Auswertung\Bezug täglich\Bezug tgl]*/$Summe);
    ?>
    Eigenverbrauch ausrechnen

    PHP-Code:
    <?

    $Erzeugung 
    GetValue(16024 /*[Allgemein\Photovoltaik\bringt uns das was?\Arbeit täglich (Wh)\Value]*/);
    $Eigenverbrauch GetValue(13152 /*[Allgemein\Photovoltaik\Auswertung\Eigenverbrauch täglich\Eigenverbrauch täglich]*/);

    $Eigenverbrauchsquote abs($Eigenverbrauch $Erzeugung 100);

    //echo "Eigenverbrauchsquote: " .  $Eigenverbrauchsquote . "\n";

    SetValue(29145 /*[Allgemein\Photovoltaik\Auswertung\Eigenverbrauch täglich\Eigenverbrauch ausrechnen]*/$Eigenverbrauchsquote);

    ?>
    Eigenverbrauch täglich

    PHP-Code:
    <?

    $Erzeugung 
    GetValue(16024 /*[Allgemein\Photovoltaik\bringt uns das was?\Arbeit täglich (Wh)\Value]*/);
    $Einspeisung GetValue(25339 /*[Allgemein\Photovoltaik\Auswertung\Einspeisung täglich\Einspeisung tgl]*/);
    $Bezug GetValue(11644 /*[Allgemein\Photovoltaik\Auswertung\Bezug täglich\Bezug tgl]*/);
    $Eigenverbrauch abs($Erzeugung $Einspeisung);



    SetValue(13152 /*[Allgemein\Photovoltaik\Auswertung\Eigenverbrauch täglich\Eigenverbrauch täglich]*/$Eigenverbrauch);

    ?>
    Einspeisung täglich

    PHP-Code:
    <?


    //Alle heutigen Datensätze abfragen (Tägliche Aggregationsstufe)
    //z.B. um den heutigen Verbrauch er ermitteln oder die heutige Durchschnittstemperatur
    $werte AC_GetAggregatedValues(45082 /*[Archiv]*/20105 /*[Allgemein\Photovoltaik\bringt uns das was?\Eingespeist gesamt (Wh)\Value]*//* 5 minütig */strtotime("today 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv    

    //Dieser Teil erstellt eine Ausgabe im Skriptfenster mit den abgefragten Werten        
    foreach($werte as $wert) {
        
    //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
    }

    // wir müssen ja quasi aufsummieren:
    $Summe 0;

    // print_r($werte);
    foreach ($werte as $wert){
      
    $Summe $Summe $wert['Avg'];
    }
    //echo "Summe: " .  $Summe . "\n";

    SetValue(25339 /*[Allgemein\Photovoltaik\Auswertung\Einspeisung täglich\Einspeisung tgl]*//*[Allgemein\Photovoltaik\Auswertung\Einspeisung täglich\Einspeisung tgl]*/$Summe);
    ?>
    Erzeugung ja/nein

    PHP-Code:
    <?

    $wert 
    GetValue(42853 /*[Allgemein\Photovoltaik\AC Power Value\Wert]*/);
    //echo $wert . "\n";


    if ($wert 9)
      
    SetValue(50344 /*[Allgemein\Photovoltaik\Auswertung\Erzeugung täglich\Erzeugung ja/nein]*/true);
      
    if (
    $wert 10)
      
    SetValue(50344 /*[Allgemein\Photovoltaik\Auswertung\Erzeugung täglich\Erzeugung ja/nein]*/false);

    ?>
    Erzeugung täglich

    PHP-Code:
    <?

    //Alle heutigen Datensätze abfragen (Tägliche Aggregationsstufe)
    //z.B. um den heutigen Verbrauch er ermitteln oder die heutige Durchschnittstemperatur
    $werte AC_GetAggregatedValues(45082 /*[Archiv]*/16024 /*[Allgemein\Photovoltaik\bringt uns das was?\Arbeit täglich (Wh)\Value]*//* 5 minütig */strtotime("today 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv    

    //Dieser Teil erstellt eine Ausgabe im Skriptfenster mit den abgefragten Werten        
    foreach($werte as $wert) {
        
    //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
    }

    // wir müssen ja quasi aufsummieren:
    $Summe 0;

    // print_r($werte);
    foreach ($werte as $wert){
      
    $Summe $Summe $wert['Avg'];
    }
    //echo "Summe: " .  $Summe . "\n";

    SetValue(16871 /*[Allgemein\Photovoltaik\Auswertung\Erzeugung täglich\Erzeugung tgl]*/$Summe);

    ?>
    Berechnung Gesamtverbrauch täglich

    PHP-Code:
    <?
    $Erzeugung 
    GetValue(16024 /*[Allgemein\Photovoltaik\bringt uns das was?\Arbeit täglich (Wh)\Value]*/);
    $Einspeisung GetValue(25339 /*[Allgemein\Photovoltaik\Auswertung\Einspeisung täglich\Einspeisung tgl]*/);
    $Bezug GetValue(11644 /*[Allgemein\Photovoltaik\Auswertung\Bezug täglich\Bezug tgl]*/);
    $Eigenverbrauch abs($Erzeugung $Einspeisung);
    $Verbrauch abs($Eigenverbrauch $Bezug);


    SetValue(13531 /*[Allgemein\Photovoltaik\Auswertung\Gesamtverbrauch täglich\Gesamtverbrauch täglich]*/$Verbrauch);

    ?>
    Die entsprechenden Varianten müssen dann noch angelegt werden, dann kann das alles schön in IPS Studio genutzt werden.

    Viel Spaß damit

    Grüße
    Bruno
    steuert: IPS 4.2 --- LCN --- Sonos: 4x Play 5, 2x Play 1, Connect, Connect Amp ---

    steuert mit: Xiaomi Redmi Note 4X, 2x Teclast X98 Plus2, Teclast X3 Pro, Samsung Galaxy Tab 7, Chuwi HI10 Pro, Xiaomi Note3 Pro, 2x Raspi, ThinkPad X121 und S460

  3. #153
    Registriert seit
    Mar 2012
    Ort
    Magdeburg
    Beiträge
    586

    Hi Bruno ,

    Tolle Arbeit und gut das du es geteilt hast .




    Gesendet von iPhone mit Tapatalk
    Grüße aus Magdeburg
    Marcel

  4. #154
    Registriert seit
    Mar 2008
    Ort
    83379
    Beiträge
    558

    Standard Constructor

    Hallo,

    seit meiner Umstellung auf V5.0 werde ich mit Fehlermeldungen zugeschüttet. Ich habe schon einiges gelesen über den Constructor in PHP7 aber leider keine Ahnung wie ich das Problem in meinen Fall lösen kann.
    Ich hoffe es kann mir jemand helfen.
    Mein Fehler:
    PHP-Code:
    12.08.2018 10:31:16 Register Variable | <br />
    <
    b>Deprecated</b>:  Methods with the same name as their class will not be constructors in a future version of PHPFroniusCom has a deprecated constructor in <b>C:\IPSYMCON\scripts\58818.ips.php</bon line <b>47</b><br /> 
    58818:
    PHP-Code:
    <?
    /**
     * File contains FRONIUS class for protocol implememtation:
     */

     // Define required IPS-variables for communication with inverter
     // replace yyyyy with your own IPS ID's
     
    define"FRONIUS_REGVAR"32820 /*[Bauernhaus\Fronius\Wechselrichter 2\Register Variable Fronius2]*/);
     
    //define( "FRONIUS_COMPORT", 12678 /*[Serial Port Fronius Stick]*/);
    define"FRONIUS_COMPORT"42288 /*[USR_TCP232_306_Fronius]*/);

     
    // Define required IPS-variables for Fronius inverter
     // replace xxxxx with your own IPS ID's
     
    define"POWER_NOW"39301 /*[Bauernhaus\Fronius\Wechselrichter 2\Leistung jetzt]*/ );
     
    define"ENERGY_DAY"10496 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Heute]*/ );
     
    define"ENERGY_YESTERDAY"56400 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Gestern]*/);
     
    define"ENERGY_MONTH"28057 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Monat]*/);
     
    define"ENERGY_YEAR"31504 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Jahr]*/);
     
    define"AC_CURRENT_NOW"51878 /*[Bauernhaus\Fronius\Wechselrichter 2\Wechselstrom]*/ );
     
    define"AC_VOLTAGE_NOW"38707 /*[Bauernhaus\Fronius\Wechselrichter 2\Wechselspannung]*/ );
     
    define"AC_FREQUENCY_NOW"40145 /*[Bauernhaus\Fronius\Wechselrichter 2\Frequenz]*/ );
     
    //define( "DC_CURRENT_NOW", 29769 );
     //define( "DC_VOLTAGE_NOW", 58266 );
     
    define"OPERATING_HOURS_DAY"45465 /*[Bauernhaus\Fronius\Wechselrichter 2\Betriebszeit Heute]*/  );
     
    define"OPERATING_HOURS_YESTERDAY"46102 /*[Bauernhaus\Fronius\Wechselrichter 2\Betriebszeit Gestern]*/ );
     
    define"OPERATING_HOURS_TOTAL"41234 /*[Bauernhaus\Fronius\Wechselrichter 2\Betriebszeit Gesamt]*/ );
     
    define"ENERGY_TOTAL_EX"56884 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Gesamt]*/ );
     
    define"ENERGY_TOTAL_EX_LAST_YEAR"38834 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Gesamt letztes Jahr]*/ );
     
    define"ENERGY_TOTAL_EX_LAST_MONTH"49395 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Gesamt letzten Monat]*/ );
     
    define"ENERGY_TOTAL_EX_LAST_DAY"17679 /*[Bauernhaus\Fronius\Wechselrichter 2\Energie Gesamt Gestern]*/);
     
    define"INVERTER_STATUS"22240 /*[Bauernhaus\Fronius\Wechselrichter 2\Status]*/ );

    /* ***** Do not change values here following ***** */
     
    define"STARTSEQUENCE"chr(0x80).chr(0x80).chr(0x80) );
     
    define"GET_POWER_NOW"chr(0x10) );                // aktuelle Leistung [W] unsigned
     
    define"GET_ENERGY_DAY"chr(0x12) );               // Tagesenergie [Wh in kWh] unsigned
     
    define"GET_AC_CURRENT_NOW"chr(0x14) );         // Aktueller Wechselstrom
     
    define"GET_AC_VOLTAGE_NOW"chr(0x15) );         // Aktuelle Wechselspannung
     
    define"GET_AC_FREQUENCY_NOW"chr(0x16) );       // Aktuelle Frequenz
     
    define"GET_DC_CURRENT_NOW"chr(0x17) );         // Aktueller Gleichstrom
     
    define"GET_DC_VOLTAGE_NOW"chr(0x18) );         // Aktuelle Gleichspannung
     
    define"GET_OPERATING_HOURS_DAY"chr(0x1E) );    // Tagesbetriebszeit in Minuten
     
    define"GET_OPERATING_HOURS_TOTAL"chr(0x2A) );    // Betriebszeit Gesamt
     
    define"GET_ENERGY_TOTAL_EX"chr(0x36) );           // Erzeugte Gesamt-Energie
     
    define"GET_INVERTER_STATUS"chr(0x37) );           // Status Wechselrichter

     
    class FroniusCom {
          var 
    $comport;
          var 
    $regvar;
          var 
    $status;
          var 
    $timeout_sec 5;      // 5 sec
          
    var $endianess 0;      // defines endian codding (little endian == 0, big endian == 1)

      /**
       * FroniusCom
       *
       * This is the constructor that defines the ComPort and the Register
       * Variable RegVar
       *
       * @param comport Id of serial communication port.
       * @param regvar Register Variable which will hold the converter response
       */

     
    function FroniusCom$comport$regvar ){
       
    $this->comport $comport;
       
    $this->regvar  $regvar;
      }

     
    /**
      * readData
      *
      * Reads data from the inverter
      *
      * @param command Fronius protocol command 0x10  - 0x35
      * $param device Fronius device id (e.g. 0x01 = inverter)
      * @param number ID of the device
      */
     
    function readData $command$device 1$number )
     {
       
    // log protocol-flow in status variable - initialize string
       
    $this->status "readValue: START\n";
        
    //open ComPort, if not open return false
       
    if( !$this->openComPort() ) { return false; }
       
    // send packet
       
    $packet $this->buildPacket$command$device$number );
       
    $this->status .= "commandPacket: ".$this->printPacket$packet );
       
    $this->sendCommand$packet );
       
    IPS_SLEEP(50);                                                            // TEST
       // receive response
       
    $rpacket $this->receiveResponse();
       
    $this->status .= "responsePacket: ".$this->printPacket$rpacket );
       if( 
    $rpacket == "" ) { $rpacket $packet; }
        
    //close ComPort
       
    $this->closeComPort();
       
    // parse packet
       
    $return $this->parsePacket$packet$rpacket );
       
    $this->status .= "readData: DONE\n";
       return (boolean)
    $return;
     }

      
    /**
       * buildPacket
       *
       * @param  command Fronius protocol command 0x10  - 0x35
       * @param  device Fronius device id (e.g. 0x01 = converter)
       * @param  number ID of the device
       * @return packet string
       */

      
    private function buildPacket$command$device$number )
      {
         
    // Packet: Startsequenz - Länge - Gerät/Option - Nummer - Befehl - CheckSumme
         
    if( $command == GET_ENERGY_TOTAL_EX ) {
             
    $checksum $this->calculateCheckSumchr(0x01).chr($device).chr($number).$command.chr(0x01) );
         
    $packet   STARTSEQUENCE.chr(0x01).chr($device).chr($number).$command.chr(0x01).chr($checksum);
         } else {
           
    $checksum $this->calculateCheckSumchr(0x00).chr($device).chr($number).$command );
         
    $packet   STARTSEQUENCE.chr(0x00).chr($device).chr($number).$command.chr($checksum);
         }
         return 
    $packet;

      }

      
    /**
        * parse packet
        *
        * parse packet received from inverter and set value in IPS
        *
        * @param  string command packet
        * @param  string response packet
        * @return value
        */
      
    private function parsePacket$packet$rpacket )
      {
      
    //SetValue(31054 /*[Überwachung\Meldung (aktuell)]*/,bin2hex($packet));
      //SetValue(31054 /*[Überwachung\Meldung (aktuell)]*/,bin2hex($rpacket));
        
         // check start sequence
         
    if( ordsubstr$rpacket0) ) != ordSTARTSEQUENCE ) ) {
           
    $this->status .= "Packet error: Packet with incorrect startsequence\n";
           return 
    false;
         }

         
    /*
         // evaluate check sum
         $rchecksum = ord( substr( $rpacket, strlen( $rpacket ) - 1, 1  ) );
         $checksum = $this->calculateCheckSum( substr( $rpacket, 3, strlen(  $rpacket ) -  4) );
         if( $rchecksum != $checksum ) {
           $this->status .= "Packet-error: Incorrect checksum\n";
           return false;
         }
         */

         // loopback - set status = inactive
         
    if( $packet == $rpacket ) {
           
    $this->status .= "Inverter-loopback: inverter is inactive\n";
           
    SetValueINVERTER_STATUS);
           return 
    false;
         }
         
    // check match of device and device number in both packet and rpacket
         
    if( substr$packet42) != substr$rpacket4) ) {
           
    $this->status .= "Packet-error: Packet mismatch\n";
           return 
    false;
         }
         
    // check for protocoll error
         
    if( ordsubstr$rpacket6) ) == 14 ) {
           
    $this->status .= "Protocol-error:\nCommand ".$this->byte2hexordsubstr$rpacket7) ) ).
                    
    " error information: ".ordsubstr$rpacket8) )."\n";
           return 
    false;
         }
         
    // process data in case of command
         
    switch( ordsubstr$rpacket6) ) )  {

               case 
    ordGET_ENERGY_DAY ):
                 
    $value $this->calculateMeteringValue$rpacket ) / 1000;
                 if( 
    $value ) {
                
    SetValueENERGY_DAY$value );
            }
                  break;
               case 
    ordGET_OPERATING_HOURS_DAY ):
                 
    $value $this->calculateMeteringValue$rpacket );
                 if( 
    $value ) {
                 
    $stunden $value 60;
                
    SetValueOPERATING_HOURS_DAY$stunden );
            }
                  break;
               case 
    ordGET_OPERATING_HOURS_TOTAL ):
                 
    $value $this->calculateMeteringValue$rpacket );
                 if( 
    $value ) {
                 
    $stunden $value 60;
                
    SetValueOPERATING_HOURS_TOTAL$stunden );
            }
                  break;
              case 
    ordGET_POWER_NOW ):
                  
    $value $this->calculateMeteringValue$rpacket );
                  if( 
    $value $value 0;
            
    SetValuePOWER_NOW$value );
                 break;

              case 
    ordGET_AC_CURRENT_NOW ):
                 
    $value $this->calculateMeteringValue$rpacket );
            
    SetValueAC_CURRENT_NOW$value );
                  break;
              case 
    ordGET_AC_VOLTAGE_NOW ):
                 
    $value $this->calculateMeteringValue$rpacket );
            
    SetValueAC_VOLTAGE_NOW$value );
                  break;
              case 
    ordGET_AC_FREQUENCY_NOW ):
                 
    $value $this->calculateMeteringValue$rpacket );
            
    SetValueAC_FREQUENCY_NOW$value );
                  break;
              case 
    ordGET_DC_CURRENT_NOW ):
                 
    $value $this->calculateMeteringValue$rpacket );
            
    SetValueDC_CURRENT_NOW$value );
                  break;
              case 
    ordGET_DC_VOLTAGE_NOW ):
                 
    $value $this->calculateMeteringValue$rpacket );
            
    SetValueDC_VOLTAGE_NOW$value );
                  break;
              case 
    ordGET_ENERGY_TOTAL_EX ):
                 
    $value $this->calculateMeteringValue$rpacket ) / 1000;
                 if (
    $value GetValue(ENERGY_TOTAL_EX) and $value < (GetValue(ENERGY_TOTAL_EX) + 1000)){
            
    SetValueENERGY_TOTAL_EX$value );
            }
                  break;

          
    /*    case ord( GET_ENERGY_TOTAL_EX_LAST_DAY ):
                 $value = $this->calculateMeteringValue( $rpacket ) / 1000;
                 if ($value > 0){
            SetValue( ENERGY_TOTAL_EX_LAST_DAY, $value );
            }
                  break;      

              case ord( GET_ENERGY_TOTAL_EX_LAST_YEAR ):
                 $value = $this->calculateMeteringValue( $rpacket ) / 1000;
                 if ($value > 0){
            SetValue( ENERGY_TOTAL_EX_LAST_YEAR, $value );
            }
                  break;                  */
              
    case ordGET_INVERTER_STATUS ):
                 
    $value ordsubstr$rpacket7) );
                 
    SetValueINVERTER_STATUS$value );
                  break;

        default:
            
    IPS_LogMessage"FroniusClass1""Command ".ordsubstr$rpacket6) )." not defined" );
                 break;
        } 
    // end switch
        
    return true;
      }

      
    /**
       * open
       *
       * open the comport
       *
       * @return bool
       */
      
    function openComPort()
      {
        if (
    IPS_SemaphoreEnter("FR_COMPORT"2000))
        {
            if ( 
    IPS_GetProperty$this->comport,'Open') == false )
            {
           
    IPS_SetProperty$this->comport,'Open'true );
           
    IPS_ApplyChanges$this->comport );
           
    RegVar_SetBuffer$this->regvar"" );
           
    $this->status .= "Comport is open\n";
            }
        return 
    true;
        } else {
           
    // COM-Port already open - IPS-script via semaphore
           
    $this->status .= "Comport couldn't be opened\n";
           return 
    false;
        }
      }

      
    /**
       * close
       *
       * close the comport
       *
       * @return bool
       */
      
    function closeComPort()
      {
        if ( 
    IPS_GetProperty$this->comport,'Open') == true )
        {
        
    IPS_SetProperty$this->comport,'Open'false );
           
    IPS_ApplyChanges$this->comport );
           
    $this->status .= "Comport has been closed \n";
        }
        
    IPS_SemaphoreLeave("FR_COMPORT");
        return 
    true;
      }

      
    /**
       * sendCommand
       *
       * Send the packet via Modbus
       *
       * @param string $packet
       */
      
    private function sendCommand($packet){
            
    //SPRT_SendText( $this->comport, $packet );    
            
    CSCK_SendText$this->comport$packet );        //Geändert von SPRT_SendText
            
    $this->status .= "Send packet\n";
      }

      
    /**
       * receiveResponse
       *
       * Receive data via RegVar
       *
       * @return device message | Timeout
       */
      
    private function receiveResponse(){
         
          
    $this->status .= "Wait data ... \n";
          
    $last_access time();
          
    $data "";
          
    //IPS_SLEEP(500);                                                            // TEST
          
    while ( $data == "" ) {
             
    //IPS_SLEEP(500);                                                            // TEST
             
    $data RegVar_GetBuffer$this->regvar );
             if ( 
    time() - $last_access >= $this->timeout_sec ) {
                
    // $this->closeComPort();
                
    IPS_LogMessage"FroniusClass2""Fronius Watchdog time expired [ ".$this->timeout_sec ." sec]!!! Time out " );
            return 
    $data;
             }
             if ( 
    $data == "" IPS_SLEEP(10);                                                                                          //IPS_SLEEP(10)
          
    }
          
    RegVar_SetBuffer$this->regvar,  "" );
          return 
    $data;
      }
     
    /**
      * calculateMeteringValue
      *
      * calculate value of inverter metering
      *
      * @param  string rpacket
      * @return value
      */
     
    private function calculateMeteringValue$rpacket )
     {
      
       
    //print_r("Befehl: ".ord( substr( $rpacket, 6, 1 ) )."\n");
       
    if( ordsubstr$rpacket6) ) == ordGET_ENERGY_TOTAL_EX ) ) {     // command 0x36
        
    $value 0;
        for( 
    $i 8$i 16$i++ ) {                                                      // loop from pos 8 to 15
               
    $value += ordsubstr$rpacket$i) ) * pow25615 $i );
               
    //print_r("Value: ...".$value."\n");
        
    }
        
    $exp $this->byte2hexordsubstr$rpacket161) ) );
       } else {                                        
    // command 0x10 - 0x35, 0xE0 - 0xF9
        
    $value ordsubstr$rpacket7) ) * 256 ordsubstr$rpacket8) );
        
    $exp $this->hexdecs$this->byte2hexordsubstr$rpacket91) ) ) );
       }
       if ( 
    $exp <= 10 && $exp >= -) {
          return (float)( 
    $value pow10$exp ) );
       } else {
          
    IPS_LogMessage"FroniusClass1""Protocol error: Over- or underflow of exponent"  );
          return 
    0;
       }
     }

     
    /**
      * calculate CheckSum
      *
      * calculate CheckSum as 8-bit addition without consideration of overflows
      *
      * @param  string
      * @return checksum
      */
     
    private function calculateCheckSum$string )
     {
         
    $checksum 0;

         for(   
    $i 0$i strlen$string ); $i++ ) {
               
    $checksum += ordsubstr$string$i) );
            if ( 
    $checksum 255 $checksum -= 255;
         }
         return ( 
    $checksum );
     }

     
    /**
      * byte2hex
      *
      * Parse data and get it to the Hex form
      *
      * @param  char $value
      * @return string
      */
      
    private function byte2hex$value ){
        
    $h dechex( ( $value >> ) & 0x0F );
        
    $l dechex$value 0x0F );
        return 
    "$h$l";
      }

      
    /**
       * printPacket
       *
       * Print a packet in the hex form
       *
       * @param  string $packet
       * @return string
       */
      
    private function printPacket($packet){
        
    $str "";
        
    $str .= "Packet: ";
        for(
    $i=0;$i<strlen($packet);$i++){
          
    $str .= $this->byte2hex(ord($packet[$i]));
        }
        
    $str .= "\n";
        return 
    $str;
      }

      
    /**
       * converts a hex string to signed decimal number
       *
       * @param  hex string
       * $return decimal number
       */
      
    private function hexdecs$hex ) {
        
    // ignore non hex characters
        
    $hex preg_replace('/[^0-9A-Fa-f]/'''$hex);

        
    // converted decimal value:
        
    $dec hexdec($hex);

        
    // maximum decimal value based on length of hex + 1:
        // number of bits in hex number is 8 bits for each 2 hex -> max = 2^n
        // use 'pow(2,n)' since '1 << n' is only for integers and therefore limited to integer size.
        
    $max pow(2* (strlen($hex) + (strlen($hex) % 2)));

        
    // complement = maximum - converted hex:
        
    $_dec $max $dec;

        
    // if dec value is larger than its complement we have a negative value (first bit is set)
        
    return $dec $_dec ? -$_dec $dec;
      }

     } 
    //end of class FroniusCom
    ?>
    Gruß Christian

    Raspi piVCCU IPS5.0 13"Touch LCN UVR1610 UVR16x2 1-Wire WRMS200 Homematic Fronius

  5. #155
    Registriert seit
    Mar 2008
    Ort
    83379
    Beiträge
    558

    Wenn ich den Namen ändere weis ich nicht welche Abhängigkeiten ich auch noch ändern muss.
    Mein Problem ist:
    PHP-Code:
    class FroniusCom {
          var 
    $comport;
          var 
    $regvar;
          var 
    $status;
          var 
    $timeout_sec 5;      // 5 sec
          
    var $endianess 0;      // defines endian codding (little endian == 0, big endian == 1) 
    Gruß Christian

    Raspi piVCCU IPS5.0 13"Touch LCN UVR1610 UVR16x2 1-Wire WRMS200 Homematic Fronius

  6. #156
    Registriert seit
    Mar 2012
    Ort
    Magdeburg
    Beiträge
    586

    Versucht es doch mal mit dem Exporter von Raketenschnecke .

    https://www.raketenschnecke.net/rs-p...ject-exporter/
    Grüße aus Magdeburg
    Marcel

  7. #157
    Registriert seit
    Mar 2019
    Beiträge
    1

    Zitat Zitat von gdfde Beitrag anzeigen
    Wichtig zu erwähnen ist, dass man das Leseadresse von der Modbus Variable, die man abfragen will, um den Wert 1 verringert lt. Fronius Spec.
    z.b. die Modbus Leseadresse für die AC Power ist lt. Fronius Spec. 40092.
    In der IPS Leseadresse muß das mit 40091 angeben sein.

    Ich bin schon 5 Jahre gealtert, bis ich diese Info gelesen habe...
    Jetzt funktioniert es einwandfrei... 1000 Dank !!!

Ähnliche Themen

  1. Fronius Wechselrichter
    Von kronos im Forum Haustechnik
    Antworten: 8
    Letzter Beitrag: 04.11.10, 17:13
  2. Wechselrichter Datenübertragung
    Von DeejayT im Forum Off Topic
    Antworten: 3
    Letzter Beitrag: 18.12.09, 20:08
  3. sma wechselrichter mit rs232
    Von hmpf99 im Forum Allgemeine Diskussion
    Antworten: 0
    Letzter Beitrag: 30.04.08, 16:38
  4. meine neue pv anlage mit sma wechselrichter
    Von hmpf99 im Forum Allgemeine Diskussion
    Antworten: 6
    Letzter Beitrag: 19.12.07, 19:21