Hallo Leute
Zwei "Baustellen" habe ich in meinen Logiken die ich mir für die nächsten Tag vorgenommen habe.
Ich nutze den LBS 19001370 damit ich die Daten vom Wechselrichter zu Edomi bringe.
Aktuell sind dies "Modus / Momentanleistung Erzeugung / Gesamterzeugung". Dies funktioniert auch seit 2 Monaten sehr zuverlässig.
Da der Wechselrichter noch viele weitere Werte ausspuckt, würde ich manche davon auch gerne auslesen.
Im Anhang befindet sich die Dokumentation von Solaredge.
Ich bin absolut nicht fit bei Erstellen bzw Abändern von LBS. Das einzige das ich bis jetzt geschafft bzw probiert habe waren Ein bzw Ausgänge zu erweitern, für den Rest fehlen mir auch logische Zusammenhänge.
Wenn ich mir hier den Quellcode des LBS ansehe, sollten doch lt Solaredge Doku Register 40108 für Modus, 40084 für die Momentanleistung und 40094 für die Gesamterzeugung genutzt werden. Somit dachte ich irgendwo im Quellcode diese Register zu finden.
Weiß jemand wie der LBS arbeitet und wie ich weitere Register hinzufügen kann, wenn diese nicht explizit angefragt werden?
Als Anhang die Doku von Solaredge mit den entsprechenden Registern
Liebe Grüße
Jürgen
Zwei "Baustellen" habe ich in meinen Logiken die ich mir für die nächsten Tag vorgenommen habe.
Ich nutze den LBS 19001370 damit ich die Daten vom Wechselrichter zu Edomi bringe.
Aktuell sind dies "Modus / Momentanleistung Erzeugung / Gesamterzeugung". Dies funktioniert auch seit 2 Monaten sehr zuverlässig.
Da der Wechselrichter noch viele weitere Werte ausspuckt, würde ich manche davon auch gerne auslesen.
Im Anhang befindet sich die Dokumentation von Solaredge.
Ich bin absolut nicht fit bei Erstellen bzw Abändern von LBS. Das einzige das ich bis jetzt geschafft bzw probiert habe waren Ein bzw Ausgänge zu erweitern, für den Rest fehlen mir auch logische Zusammenhänge.
Wenn ich mir hier den Quellcode des LBS ansehe, sollten doch lt Solaredge Doku Register 40108 für Modus, 40084 für die Momentanleistung und 40094 für die Gesamterzeugung genutzt werden. Somit dachte ich irgendwo im Quellcode diese Register zu finden.
Weiß jemand wie der LBS arbeitet und wie ich weitere Register hinzufügen kann, wenn diese nicht explizit angefragt werden?
Als Anhang die Doku von Solaredge mit den entsprechenden Registern
Code:
###[DEF]### [name=SunSpec Wechselrichter ModbusTCP ] [e#1=Trigger] [e#2=IP] [e#3=Port #init=502] [e#4=Adresse #init=1] [e#5=Energymeter #init=0] [e#6=Log Level #init=0 ] [a#1=Modus] [a#2=Momentanleistung Erzeugung] [a#3=Gesamtenergieerzeugung] [a#4=Momentanleistung Erzeugung/Bezug] [a#5=Einspeisezähler] [a#6=Bezugszähler] [v#1 = ] [v#100 = 0.1] //Version [v#101 = 19001370] //LBS ID [v#102 = SunSpec Wechselrichter ModbusTCP] //LBS Name [v#103 = 0 ] // Log level [v#104 = 0 ] // Log per instance [v#105 = 0 ] // log ID in each line ###[/DEF]### ###[HELP]### Der Baustein dient zum Auslesen eines Sunspec kompatiblen Wechselrichters über eine Modbus TCP Verbindung. Bisher ist der Baustein nur mit einem Solaredge S7k mit Energymeter getestet. Die Datei ModbusMaster.php muss in das Verzeichnis: /usr/local/edomi/main/include/php/ kopiert werden. E1: Trigger, über diesen Eingang kann der Baustein getriggert werden. E2: IP Wechselrichter E3: Port (normalerweise 502) E4: Adresse (bei Solaredge normalerweise 1) E5: Energymeter (Solaredge Energymeter verfügbar 0=nein, 1=ja) E6: Log-Level (0=none, 1=emergency, 2=alert, 3=critical, 4=error, 5=warning, 6=notice, 7=info, 8=debug) A1: Modus (1=aus / 2=Nachtmodus / 4=an/Produktion) A2: Momentanleistung (kW Erzeugung) A3: Gesamtenergieerzeugung (kWh) A4: Momentanleistung (kW / + Einspeise, -Bezug) A5: Einspeisezähler (kWh) A6: Bezugszähler (kWh) changelog =============================== v0.1 06.12.2017 Initial Version ###[/HELP]### ###[LBS]### <? function LB_LBSID_logging($id, $msg, $var = NULL, $priority = 8) { $E = getLogicEingangDataAll($id); $logLevel = getLogicElementVar($id, 103); if (is_int($priority) && $priority <= $logLevel && $priority > 0) { $logLevelNames = array( 'none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug' ); $version = getLogicElementVar($id, 100); $lbsNo = getLogicElementVar($id, 101); $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo"; $logName = preg_replace('/ /', '_', $logName); if (logic_getVar($id, 104) == 1) $logName .= "-$id"; if (logic_getVar($id, 105) == 1) $msg .= " ($id)"; strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo; writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg); if (isset($var)) { writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================"); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var)); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================"); } } } function LB_LBSID($id) { if ($E=logic_getInputs($id)) { setLogicElementVar($id, 103, $E[6]['value']); // set loglevel to #VAR 103 if ($E[1]['value']==1 && $E[1]['refresh']==1) { LB_LBSID_logging($id, 'LBS started'); logic_setVar($id,1,1); if (logic_getVar($id,1)==1) { //setzt V1=1, um einen mehrfachen Start des EXEC-Scripts zu verhindern logic_callExec(LBSID,$id); //EXEC-Script starten } LB_LBSID_logging($id, 'LBS ended'); } } } ?> ###[/LBS]### ###[EXEC]### <? require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php"); require(dirname(__FILE__). "/../../../../main/include/php/ModbusMaster.php"); set_time_limit(25); sql_connect(); //------------------------------------------------------------------------------------- function logging($id, $msg, $var = NULL, $priority = 8) { $E = getLogicEingangDataAll($id); $logLevel = getLogicElementVar($id, 103); if (is_int($priority) && $priority <= $logLevel && $priority > 0) { $logLevelNames = array( 'none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug' ); $version = getLogicElementVar($id, 100); $lbsNo = getLogicElementVar($id, 101); $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo"; $logName = preg_replace('/ /', '_', $logName); if (logic_getVar($id, 104) == 1) $logName .= "-$id"; if (logic_getVar($id, 105) == 1) $msg .= " ($id)"; strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo; writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg); if (isset($var)) { writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================"); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var)); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================"); } } } $E = getLogicEingangDataAll($id); $V=logic_getVars($id); $ip = $E[2]['value']; $modbus = new ModbusMaster($ip, "TCP"); $modbus->port = $E[3]['value']; try { // read inverter data $recData = $modbus->readMultipleRegisters($E[4]['value'], 40069, 50); //for($i=0; $i < Count($recData); $i++) { // logging($id, strval($i) ." ".strval($recData[$i]),8); //} $Dummy = PhpType::bytes2unsignedInt(array_slice($recData , (108-70)*2, 2)); logging($id, "Modus = " .strval($Dummy)); setLogicLinkAusgang($id,1,$Dummy); $Value= PhpType::bytes2signedInt(array_slice($recData , (84-70)*2, 2))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (85-70)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Momentanleistung = " .strval($Dummy) ." kW"); setLogicLinkAusgang($id,2, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , (94-70)*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , (95-70)*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (96-70)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Gesamtenergieerzeugung = " .strval($Dummy)." kWh"); setLogicLinkAusgang($id,3, $Dummy); if ($E[5]['value']==1) { sleep(2); //usleep(1000*10); // read meter data $recData = $modbus->readMultipleRegisters($E[4]['value'], 40188, 55); //107 //for($i=0; $i < Count($recData); $i++) { // logging($id, strval($i) ." ".strval($recData[$i]),8); //} $Value= PhpType::bytes2signedInt(array_slice($recData , (18)*2, 2))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (22)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Momentanleistung Bezug-Ertrag= " .strval($Dummy)); setLogicLinkAusgang($id,4, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , 38*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , 39*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (54)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Einspeisezähler = " .strval($Dummy)); setLogicLinkAusgang($id,5, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , 46*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , 47*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (54)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Bezugszähler = " .strval($Dummy)); setLogicLinkAusgang($id,6, $Dummy); } logging($id, $modbus); } catch (Exception $e) { logging($id, "Fehler:" ); logging($id, $modbus); logging($id, $e); exit; } unset($modbus); //logic_setVar($id,1,0); //setzt V1=0, um einen erneuten Start des EXEC-Scripts zu erm?glichen logging($id, "EXEC End"); //------------------------------------------------------------------------------------- sql_disconnect(); ?> ###[/EXEC]###
Jürgen
Kommentar