+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 17
  1. #1
    Registriert seit
    Feb 2019
    Beiträge
    10

    Standard E3/DC Hauskraftwerk - Modbus Schnittstelle

    Hallo,

    ich schaue mir gerade die Demoversion von IP-Symcon an und beisse mir die Zähne an der Modbus-Schnittstelle aus.
    Es sollen die Werte aus einem E3/DC Hauskraftwerk (Solar-Wechselrichter mit Batteriespeicher) ausgelesen werden.
    In ioBroker funktioniert das einwandfrei, in IP-Symcon kriege ich das nicht hin.
    Beispielhaft sind 3 Werte eingerichtet, siehe auch in den Bilder weiter unten.
    Es kommen auch Werte an, allerdings sind die Werte falsch.

    Die Einstellmöglichkeiten, die geboten werden, hab ich jetzt alle durchprobiert.


    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	modbus_IPS.PNG 
Hits:	118 
Größe:	54.0 KB 
ID:	47658

    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	modbus_IPS_Instanzkonfiguration.PNG 
Hits:	132 
Größe:	27.2 KB 
ID:	47659

    So sieht das Ganze im ioBroker aus:
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	modbus_iobroker.PNG 
Hits:	136 
Größe:	103.5 KB 
ID:	47660

    Hat jemand eine Idee ob man das in IP-Symcon ohne Programmierung hinbekommt?
    Angehängte Grafiken Angehängte Grafiken

  2. #2
    Registriert seit
    Mar 2014
    Ort
    Mücke (Hessen)
    Beiträge
    947

    Hi,

    in der Spliter Instanz von deinem ModBus Gerät Swap LSW/MSW for 32bit/64bit values Aktiviert?
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	modbus.PNG 
Hits:	73 
Größe:	8.2 KB 
ID:	47668

    Teste mal

    Gruß
    IPS v5.1 Unlimited auf Ubuntu Server | IPSView | EnOceanPi | Z-Wave (Razberry) | Sonos | Fritzbox 7390 | 1-Wire | DMX | Dali | Pokeys57E | Siemens Logo 8 | Siemens S7-1200 | Wago SPS | KNX | Onkyo AVR | ModBus | HomeMatic@piVCCU | ESP8266 | MQTT | Ubiquiti | und noch viel mehr geplant

  3. #3
    Registriert seit
    Feb 2019
    Beiträge
    10

    "in der Spliter Instanz von deinem ModBus Gerät Swap LSW/MSW for 32bit/64bit values Aktiviert?"

    Das hatte ich gestern einige male probiert, hatte aber kein Änderung gebracht.
    Heute, nach erneutem Test werden , wie durch Wunderhand, auf einmal die Werte für ein Register richtig dargestellt, nachdem ich die Option deaktiviert habe . Es wird auch brav die Werte jede Sekunde aktualisiert, danke.

  4. #4
    Registriert seit
    Feb 2019
    Beiträge
    10

    das nächste Problem ist jetzt das von 3 konfigurierten Werten (Registern) nur eines aktualisiert wird und zwar '40072_Hausverbrauch_Leistung'.

    Die beiden anderen Instanzen haben immer den Wert 0 und aktualisieren sich auch nicht. Die Konfiguration der Instanzen ist genau gleich, bis auf die Modbus Adresse.

    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	modbus_IPS.PNG 
Hits:	88 
Größe:	152.3 KB 
ID:	47675

    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	modbus_IPS_ob.PNG 
Hits:	66 
Größe:	69.8 KB 
ID:	47676

  5. #5
    Registriert seit
    Feb 2019
    Beiträge
    10

    Inzwischen bin ich schon ein Stück weitergekommen.
    Wenns fertig ist melde ich mich hier nochmal.

  6. #6
    Registriert seit
    Apr 2005
    Beiträge
    53

    Hallo,

    bedenke die angegebenen Register stimmen nicht
    Photovoltaik-Leistung in Watt => 40067
    Batterie-Leistung in Watt => 40069
    ....

    probiere das mal
    Gruß
    Klaus

  7. #7
    Registriert seit
    Feb 2019
    Beiträge
    10

    "bedenke die angegebenen Register stimmen nicht
    Photovoltaik-Leistung in Watt => 40067
    Batterie-Leistung in Watt => 40069"

    Danke für den Hinweis.
    Das habe ich in mühevoller Trial and Test Manier schon herausgefunden.

    Dazu kommt noch das die Werte teilweise z.B. 65535 statt 0 sind und ich die mit einem Script umrechnen muß.
    Das hat wohl mit dem "unsigned" zu tun.

    E3/DC verwendet für manche Register den Typ 'UInt8+UInt8'.
    Das kann man auch nur mit einem Script lösen.

  8. #8
    Registriert seit
    Feb 2019
    Beiträge
    10

    so, in der Zwischenzeit habe ich eine Lösung gefunden.
    Dabei wird phpmodbus verwendet, das man sich vorher herunterladen muß und auf den Server kopiert werden muß. -> GitHub - krakorj/phpmodbus: Modbus library for PHP (Google code follower)

    Mit der in Symcon integrierten Modbus Funktion oder Modul habe ich das nicht hinbekommen.

    Das Ganze ist noch nicht ganz fertig, sieht aber für mich schon ganz gut aus.

    Wenn ich mal Zeit und Lust habe mache ich daraus evtl. ein eigenes Modul.

    In den Skripten muss man noch jeweils die richtige IP-Adresse eintragen.


    Mein Script zum Erstellen von Variablen, das nur einmal ausgeführt werden muss:
    PHP-Code:
    <?

    // Prüfen ob Variablen schon vorhanden sind, ansonsten anlegen (im Ordner des Skripts):
    function CreateVariable($VarName$Type$ParentID){
        
    $ID_Variable = @IPS_GetVariableIDByName($VarName$ParentID );
        if (
    $ID_Variable === false) {
            
    $ID_Variable IPS_CreateVariable($Type);
            
    IPS_SetName($ID_Variable$VarName); // Variable benennen
            
    IPS_SetParent($ID_Variable$ParentID); // Variable einsortieren unter dem Objekt mit der ID $ParentID
        
    }
        return 
    $ID_Variable;
    }



    $ParentID IPS_GetParent($_IPS['SELF']);

    $ID_PV_Leistung                CreateVariable("Solar Produktion"1$ParentID);
    $ID_Batterie_Leistung        CreateVariable("Batterie Leistung"1$ParentID);
    $ID_Hausverbrauchs_Leistung    CreateVariable("Hausverbrauch"1$ParentID);
    $ID_Netz_Leistung            CreateVariable("Netz Leistung"1$ParentID);
    $ID_Batterie_SoC            CreateVariable("Batterie Status"1$ParentID);
    $ID_Autarkie_Eigenverbrauch    CreateVariable("Autarkie_Eigenverbrauch"1$ParentID);
    $ID_Autarkie                CreateVariable("Autarkie"1$ParentID);
    $ID_Eigenverbrauch            CreateVariable("Eigenverbrauch"1$ParentID);

    //Tagesproduktionen berechnen:
    $ID_PV_Tages_Solarproduktion        CreateVariable("Tages Solarproduktion"2$ParentID); // hier wird die Solarproduktion pro Tag kontinuierlich hochgezählt.
    $ID_Tages_Hausverbrauch                CreateVariable("Tages Hausverbrauch"2$ParentID); // hier wird die Hausverbrauch pro Tag kontinuierlich hochgezählt.

    $ID_Tages_Netzeinspeisung            CreateVariable("Tages Netzeinspeisung"2$ParentID); // hier wird die Netzeinspeisung pro Tag kontinuierlich hochgezählt.
    $ID_Tages_Netzbezug                    CreateVariable("Tages Netzbezug"2$ParentID); // hier wird die Netzbezug pro Tag kontinuierlich hochgezählt.
    $ID_Tages_Batterieladen                CreateVariable("Tages Batterieladen"2$ParentID); // hier wird die Baterrieladung pro Tag kontinuierlich hochgezählt.
    $ID_Tages_Batterieentladen            CreateVariable("Tages Batterieentladen"2$ParentID); // hier wird die Batterieentladung pro Tag kontinuierlich hochgezählt.


    //$ID_PV_Solarproduktion_Tageswerte     = CreateVariable("E3DC_PV_Solarproduktion_Tageswerte", 2, $ParentID); // Wert wird einmal pro Tag gespeichert!

    $ID_tmp_logging CreateVariable("E3DC_tmp_logging"3$ParentID);

    ?>

    Und hier das Skript für die Leistungsdaten, das bei mir einmal pro Sekunde ausgeführt wird:

    PHP-Code:
    <?php
    // Modul Phpmodbus ins Skript Verzeichnis kopieren (bei Ubuntu /var/lib/symcon/scripts/); https://github.com/krakorj/phpmodbus

    // Beginn Konfiguration:
    require_once dirname(__FILE__) . '/_OwnLibraries/Phpmodbus_0.8.r106/Phpmodbus/ModbusMaster.php'
    $ipaddress_E3DC "192.168.178.31"// IP-Adresse des E3/DC Geräts.
    // Ende Konfiguration, ab hier nichts mehr ändern


    // Variablen nur speichern wenn sich der Wert geändert hat:
    function SetVariable($var2set$value) {
        if (
    GetValue($var2set) != $value)
            
    SetValue($var2set$value);
    }


    function 
    logTageswerteZaehler($value$var2set) {    
        if (
    $value 0) {
            
    $Energie_letzer_Wert GetValue($var2set);
            
    $temp $value/3600000;
        
            
    $temp2 $Energie_letzer_Wert $temp;
            
    //SetValue(27764, '$temp :' . $temp . '|$temp2:' . $temp2 . '|$letzterWert:' . $Energie_letzer_Wert);
            
    SetValue($var2set $temp2);
        }
    }
     
    // Create Modbus object
    $modbus = new ModbusMaster($ipaddress_E3DC"TCP");
     
    try {
        
    $PV_Leistung                 $modbus->readMultipleRegisters(0400672);
        
    $Batterie_Leistung             $modbus->readMultipleRegisters(0400692);
        
    $Hausverbrauchs_Leistung     $modbus->readMultipleRegisters(0400712);
        
    $Netz_Leistung                 $modbus->readMultipleRegisters(0400732);    
        
    $Batterie_Status            $modbus->readMultipleRegisters(0400821);    
        
    $Autarkie_Eigenverbrauch     $modbus->readMultipleRegisters(0400811);
    }
    catch (
    Exception $e) {
        
    // Print error information if any
        
    echo $modbus;
        echo 
    $e;
        exit;
    }

    $ParentID IPS_GetParent($_IPS['SELF']);


    $ID_PV_Leistung             IPS_GetVariableIDByName("Solar Produktion"$ParentID);
    $ID_Batterie_Leistung         IPS_GetVariableIDByName("Batterie Leistung"$ParentID);
    $ID_Hausverbrauchs_Leistung IPS_GetVariableIDByName("Hausverbrauch"$ParentID);
    $ID_Netz_Leistung             IPS_GetVariableIDByName("Netz Leistung"$ParentID);
    $ID_Batterie_Status            IPS_GetVariableIDByName("Batterie Status"$ParentID);
    $ID_Autarkie_Eigenverbrauch IPS_GetVariableIDByName("Autarkie_Eigenverbrauch"$ParentID);
    $ID_Autarkie                 IPS_GetVariableIDByName("Autarkie"$ParentID);
    $ID_Eigenverbrauch             IPS_GetVariableIDByName("Eigenverbrauch"$ParentID);


    $ID_Tages_Solarproduktion         IPS_GetVariableIDByName("Tages Solarproduktion"$ParentID);
    $ID_Tages_Hausverbrauch         IPS_GetVariableIDByName("Tages Hausverbrauch"$ParentID);


    $PV_Leistung_aktuell                 PhpType::bytes2signedInt($PV_Leistung);
    $Batterie_Leistung_aktuell             PhpType::bytes2signedInt($Batterie_Leistung);
    $Hausverbrauchs_Leistung_aktuell     PhpType::bytes2signedInt($Hausverbrauchs_Leistung);
    $Netz_Leistung_aktuell                PhpType::bytes2signedInt($Netz_Leistung);
    $Batterie_Status_aktuell            PhpType::bytes2signedInt($Batterie_Status);

    logTageswerteZaehler($PV_Leistung_aktuell$ID_Tages_Solarproduktion );
    logTageswerteZaehler($Hausverbrauchs_Leistung_aktuell $ID_Tages_Hausverbrauch );


    $ID_Tages_Netzeinspeisung            IPS_GetVariableIDByName("Tages Netzeinspeisung"$ParentID);
    $ID_Tages_Netzbezug                    IPS_GetVariableIDByName("Tages Netzbezug"$ParentID);
    if (
    $Netz_Leistung_aktuell 0){
        
    logTageswerteZaehler($Netz_Leistung_aktuell$ID_Tages_Netzbezug);
    }

    if (
    $Netz_Leistung_aktuell 0){
        
    //SetValue(53391 /*[E3DC_Modbus_TCP\E3DC_tmp_logging]*/, "Wert:".abs($Netz_Leistung_aktuell)."|ID".$ID_Tages_Netzeinspeisung);
        
    logTageswerteZaehler(abs($Netz_Leistung_aktuell), $ID_Tages_Netzeinspeisung);
    }

    $ID_Tages_Batterieladen                IPS_GetVariableIDByName("Tages Batterieladen"$ParentID);
    $ID_Tages_Batterieentladen            IPS_GetVariableIDByName("Tages Batterieentladen"$ParentID);
    if (
    $Batterie_Leistung_aktuell 0){    
        
    logTageswerteZaehler($Batterie_Leistung_aktuell$ID_Tages_Batterieladen);
    }

    if (
    $Batterie_Leistung_aktuell 0){
        
    logTageswerteZaehler(abs($Batterie_Leistung_aktuell), $ID_Tages_Batterieentladen);
    }






    SetVariable($ID_PV_Leistung$PV_Leistung_aktuell ); 
    SetVariable($ID_Batterie_Leistung$Batterie_Leistung_aktuell ); 
    SetVariable($ID_Hausverbrauchs_Leistung$Hausverbrauchs_Leistung_aktuell ); 
    SetVariable($ID_Netz_Leistung$Netz_Leistung_aktuell ); 
    SetVariable($ID_Batterie_Status$Batterie_Status_aktuell     ); 


    $temp PhpType::bytes2signedInt($Autarkie_Eigenverbrauch);
    SetVariable($ID_Autarkie_Eigenverbrauch$temp ); 
    SetVariable($ID_Autarkie, ($temp >> ) & 0xFF );
    SetVariable($ID_Eigenverbrauch$temp 0xFF );

    Ein Skript um statische Information abzuholen, z.B. Hersteller, Seriennummer, Firmware:

    PHP-Code:
    <?php
    // Beginn Konfiguration:

    // Modul Phpmodbus ins Skript Verzeichnis kopieren (bei Ubuntu /var/lib/symcon/scripts/); https://github.com/krakorj/phpmodbus
    require_once dirname(__FILE__) . '/_OwnLibraries/Phpmodbus_0.8.r106/Phpmodbus/ModbusMaster.php'
    $ipaddress_E3DC "192.168.178.31"// IP-Adresse des E3/DC Geräts.
    // Ende Konfiguration, ab hier nichts mehr ändern


    // Prüfen ob Variablen schon vorhanden sind, ansonsten anlegen (im Ordner des Skripts):
    function CreateVariable($VarName$Type$ParentID){
        
    $ID_Variable = @IPS_GetVariableIDByName($VarName$ParentID );
        if (
    $ID_Variable === false) {
            
    $ID_Variable IPS_CreateVariable($Type);
            
    IPS_SetName($ID_Variable$VarName); // Variable benennen
            
    IPS_SetParent($ID_Variable$ParentID); // Variable einsortieren unter dem Objekt mit der ID $ParentID
        
    }
        return 
    $ID_Variable;
    }

    function 
    ConvertArray2String($array) {
        
    $string "";
        foreach (
    $array as $chr) {
            
    $string .= chr($chr);
        }
        return 
    $string;
    }

    $ParentID IPS_GetParent($_IPS['SELF']);

    $ID_Hersteller                 CreateVariable("Hersteller"3$ParentID);
    $ID_Modell                     CreateVariable("Modell"3$ParentID);
    $ID_Seriennummer             CreateVariable("Seriennummer"3$ParentID);
    $ID_S10_Firmware_Release     CreateVariable("S10_Firmware_Release"3$ParentID);

     
    // Create Modbus object
    $modbus = new ModbusMaster($ipaddress_E3DC"TCP");
     
    try {
        
    $Hersteller             $modbus->readMultipleRegisters(0400038);
        
    $Modell                     $modbus->readMultipleRegisters(0400198);
        
    $Seriennummer             $modbus->readMultipleRegisters(0400358);
        
    $S10_Firmware_Release     $modbus->readMultipleRegisters(0400518);
    }
    catch (
    Exception $e) {
        
    // Print error information if any
        
    echo $modbus;
        echo 
    $e;
        exit;
    }

    SetValue($ID_Hersteller,             ConvertArray2String($Hersteller));
    SetValue($ID_Modell,                 ConvertArray2String($Modell));
    SetValue($ID_Seriennummer,             ConvertArray2String($Seriennummer));
    SetValue($ID_S10_Firmware_Release,     ConvertArray2String($S10_Firmware_Release));
    Zum Schluss ein Skript zum zurücksetzen der Tageswerte (Tageszähler):

    PHP-Code:
    <?
    $ParentID 
    IPS_GetParent($_IPS['SELF']);

    $ID_Tages_Solarproduktion         IPS_GetVariableIDByName("Tages Solarproduktion"$ParentID);
    $ID_Tages_Hausverbrauch         IPS_GetVariableIDByName("Tages Hausverbrauch"$ParentID);
    $ID_Tages_Netzeinspeisung        IPS_GetVariableIDByName("Tages Netzeinspeisung"$ParentID);
    $ID_Tages_Netzbezug                IPS_GetVariableIDByName("Tages Netzbezug"$ParentID);
    $ID_Tages_Batterieladen            IPS_GetVariableIDByName("Tages Batterieladen"$ParentID);
    $ID_Tages_Batterieentladen        IPS_GetVariableIDByName("Tages Batterieentladen"$ParentID);

    setValue($ID_Tages_Solarproduktion0);
    setValue($ID_Tages_Hausverbrauch0);
    setValue($ID_Tages_Netzeinspeisung0);
    setValue($ID_Tages_Netzbezug0);
    setValue($ID_Tages_Batterieladen0);
    setValue($ID_Tages_Batterieentladen0);

    ?>

  9. #9
    Registriert seit
    Feb 2019
    Beiträge
    10

    Und so sieht das im Frontend aus:

    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	IP_Symcon_E3DC.PNG 
Hits:	98 
Größe:	70.7 KB 
ID:	49350

  10. #10
    Registriert seit
    Oct 2017
    Beiträge
    189

    Moin,

    die Lösung sieht sauber aus! Überlegen auch grad PV zu installieren mit nem Speicher,
    da schaue ich auch in die Richtung des E3/DC.

    Funktioniert alles immer noch tadellos über IPS?

    Gruß
    IPS 5.0 Professional, Server auf Raspberry Stretch.
    Tasmota, MQTT, Sonoff etc.

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 21.08.18, 20:23
  2. Modbus RTU (485) Konverter --> Modbus TCP
    Von Daste im Forum SPS Automatisierungstechnik
    Antworten: 36
    Letzter Beitrag: 20.07.17, 10:08
  3. Serielle Schnittstelle
    Von BestEx im Forum Skripte, PHP, SQL
    Antworten: 5
    Letzter Beitrag: 05.07.15, 00:21
  4. Modbus TCP stürzt ab, wenn ein Gerät über Modbus RTU keine Spannung hat
    Von Helmut im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 22
    Letzter Beitrag: 04.06.15, 07:32
  5. Wechselstromzähler Saia-Burgess ALD1D5F10 mit Modbus-Schnittstelle (RTU)
    Von PreinfalkG im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 3
    Letzter Beitrag: 19.02.14, 08:19

Stichworte