NEWS
Solax Photovoltaik Portal in ioBroker
-
Hallo zusammen,
nach einem Jahr erfolgloser Versuche, Fragen und Misserfolge, meine PV Anlage in Homematic einzubinden, habe ich auf dem Homematic Usertreffen mit einigen gesprochen, die sich mit ioBroker beschäftigen. Mir wurden dann geraten, dass Problem hier zu schreiben, in der Hoffnung, dass sich hier eine Lösung findet.
Zum Problem:
Die Daten der lokalen PV Anlage werden über das Internet an den Anbieter gesendet, der diese in einem Portal zur Verfügung stellt. Der Wechselrichter hat natürlich eine interne IP. Aber bisher konnte ich direkt keine Daten abgreifen. Es hat sich schonmal jemand mit IPSymcon drangemacht und das ganze in PHP erfolgreich umgesetzt.
https://www.symcon.de/forum/threads/352 … lax-Portal
Da ich leider keine Programmiersprache beherrsche, wäre nun die Frage, ob das hier jemand in Javascript, bzw. ioBroker "übersetzen" kann.
Vielleicht finden sich ja noch ein paar Nutzer, die auch Interesse daran habe, dass das funktioniert
-
Gibt es vieleicht zufällig hier einen Ansatz ?
Die Cloudseite ist eine Java .jsp
Ich würde auch gerne irgenwie an ein paar Daten herankommen. Vieleicht jemand einen Tip dafür ?
Mit dem Parser komme ich ja nur an HTML Daten oder ?
Hier noch der code:<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Inverter statistische Analyse</title> <link id="shortcut_icon" rel="shortcut icon" type="image/x-icon" href="" /> <base href="https://www.solaxcloud.com:443/"> <link rel="stylesheet" href="resource/plugins/bootstrap/css/bootstrap.min.css"> <!-- --------------------在网上压缩js文件 tableExport.js bootstrap-table.js---------------------------------------> <!--bootstrap-table--> <link rel="stylesheet" href="resource/plugins/bootstrap-table/css/bootstrap-table.min1.css"/> <!-- Font Awesome --> <link rel="stylesheet" href="resource/plugins/font-awesome-4.7.0/css/font-awesome.min.css"> <!-- bootstrap开关 由于刷新时开关样式错位 需要在此引用下bootstrap-switch.min.css --> <link rel="stylesheet" href="resource/plugins/bootstrap-switch/css/bootstrap-switch.min.css"> <link rel="stylesheet" href="resource/plugins/aliicon/iconfont.css?v=1.15"> <!-- Theme style --> <link rel="stylesheet" href="resource/plugins/select2/select2.min.css"> <link rel="stylesheet" href="resource/plugins/adminLTE/css/AdminLTE.min1.css"> <link rel="stylesheet" href="resource/css/reset.css?v=1.15"/> <link rel="stylesheet" href="resource/plugins/zTree/css/metroStyle/metroStyle.css?v=1.15"> <link rel="stylesheet" href="resource/css/table.css?v=1.15"/> <!-- jQuery 2.2.3 --> <script src="resource/plugins/jquery/jquery-2.2.3.min.js"></script> <script src="resource/plugins/jquery/jquery.easing.min.js"></script> <!-- amcharts begin --> <script src="resource/plugins/echarts/echarts-all.js"></script> <!-- amcharts end --> <!-- Bootstrap 3.3.6 --> <script src="resource/plugins/bootstrap/js/bootstrap.js"></script> <!-- <script src="resource/plugins/slimScroll/jquery.slimscroll.js"></script> --> <script src="resource/plugins/My97DatePicker/WdatePicker.js"></script> <script src="resource/plugins/bootstrap-table/bootstrap-table.js"></script> <script src="resource/plugins/bootstrap-table/bootstrap-table-export.min.js"></script> <script src="resource/plugins/bootstrap-table/tableExport.js"></script> <script src="resource/plugins/select2/select2.min.js"></script> <script src="resource/plugins/select2/i18n/de.js"></script> <script src="resource/plugins/bootstrap-table/locale/bootstrap-table-de-DE.min.js"></script> <script src="resource/modules/common/utils.js?v=1.15"></script> <!-- <script src="resource/modules/common/jquery.extends.js"></script> --> <script src="resource/modules/common/string.extends.js"></script> <script src="resource/plugins/zTree/js/jquery.ztree.all.min.js"></script> <script src="resource/plugins/multiselect/multiselect.min.js"></script> <script src="resource/plugins/jquery/jquery.barcode.js"></script> <script src="resource/plugins/jquery/jquery.qrcode.min.js"></script> <link rel="stylesheet" href="resource/css/overview-dark.css?v=1.15"> <link rel="stylesheet" href="resource/css/statistics/statistics.css?v=1.15" /> <link rel="stylesheet" href="resource/css/deviceMenu.css?v=1.15" /> <link rel="stylesheet" href="resource/css/map/map.css?v=1.15" > <script src="resource/plugins/amcharts/amcharts.js?v=1.15"></script> <script src="resource/plugins/amcharts/pie.js?v=1.15"></script> <script src="resource/plugins/amcharts/serial.js?v=1.15"></script> <script src="resource/modules/common/chartUtils.js?v=1.15" ></script> <script src="resource/plugins/jquery/jquery.rotate.js?v=1.15" ></script> <script src="resource/modules/overview/frame-inverter.js?v=1.15" ></script> </head> <body id="content"> <!--页面上方导航路径--> <div class="inverterSubpage subMenu"> <ul id="inverterTab" class="inverterTab clearfix"> <li attr-url="overview-inverter.jsp" class="active">Inverter statistische Analyse</li> <li attr-url="device/real-time-Display.jsp">Echtzeitanzeige</li> <li attr-url="battery/batteryAnalysis.jsp" id="show_battery">Batterie statistische Analyse</li> <li attr-url="device/chart.jsp">Wechselrichterdaten</li> <li attr-url="device/report.jsp" id="show_report">Statistischer Bericht</li> <li attr-url="device/alarm.jsp">Wechselrichteralarm</li> <li attr-url="device/inverter-load.jsp" id="show_load">RF control</li> </ul> <ul class="menu-info clearfix"> <li id="info_invertersn"><span>Inverter SN</span><span id="info_number_sn" class="info-name"></span></li> <li id="info_wifisn"><span>Registrationsnummer</span><span id="info_number_wifi" class="info-name"></span></li> <li><span>letztes Update</span><span id="realLastUpdateTime" class="info-name"></span></li> </ul> </div> <div id="inverter-content"> <!-- 逆变器子页面内容 --> </div> <ul class="hide-text"> <li id="title_systemName">Die Homepage des Fernüberwachungssystems von Solax New Power</li> <li id="js_stand">stand</li> <li id="js_seeDetails">Siehe Einzelheiten</li> <li id="js_noChoose">Keine Auswahl</li> <li id="js_platform">Plattform</li> <li id="js_firm">Hersteller</li> <li id="js_dealer">Händler</li> <li id="js_agent">Händler</li> <li id="js_installer">Installateur</li> <li id="js_user">Händler</li> <li id="js_all">Alle</li> <li id="js_edit">Bearbeiten</li> <li id="js_delete">Löschen</li> <li id="delete_select">Bitte wählen Sie die zu löschenden Daten aus!</li> <li id="delete_subMenu">Bitte löschen Sie zuerst das Untermenü!</li> <li id="delete_subType">Bitte löschen Sie zuerst den Subtyp!</li> <li id="delete_confirm">Bestätigen zum Löschen? Y / N?</li> <li id="delete_item_confirm">Bitte bestätigen Sie, ob Sie diese Daten löschen möchten.?</li> <li id="delete_success">Erfolgreichgelöscht</li> <li id="delete_fail">Löschen fehlgeschlagen</li> <li id="alter_success">Erfolgreich geändert</li> <li id="alter_fail">Konnte nicht geändert werden</li> <li id="edit_success">Bearbeiten erfolgreich</li> <li id="edit_fail">Bearbeiten fehlgeschlagen</li> <li id="control_success">Operation erfolgreich</li> <li id="control_fail">Operation fehlgeschlagen</li> <li id="add_success">Erfolgreich hinzugefügt</li> <li id="add_fail">Fehlgeschlagen</li> <li id="edit_one">Nur eine Nachricht kann jeweils editiert werden!</li> <li id="select_one">Wählen Sie mindestens eine Nachricht aus!</li> <li class="select_before">Bitte zuerst auswählen</li> <li id="js_noData">Keine Daten</li> <li id="overView_selfConsumption">Eigenverbrauch Diagramm</li> <li id="overView_totalConsumption">Energiebilanz Diagramm</li> <li id="overView_powerConsumption">Netzverbrauch</li> <li id="overView_todayPowerConsumption">Today Netzverbrauch</li> <li id="overView_charge">Batterieladung</li> <li id="overView_toGrid">Netz Energie</li> <li id="overView_todayToGrid">Today Netz Energie</li> <li id="overView_selfUse">Eigenverbrauch</li> <li id="overView_disCharge">Batterieentladung</li> <li id="overView_fromGrid">Netzversorgung</li> <li id="overView_selfProduce">Eigenenergie Kapazität</li> <li id="overView_total">Energieerzeugungskapazität</li> <li id="overView_directSelfUse">Selbstversorgung</li> <li id="overView_todayDirectSelfUse">Today Selbstversorgung</li> <li id="overView_outPutPower">Wechselstrom</li> <li id="overView_solarPower">PV-Leistung</li> <li id="overView_batteryPower">Batterieleistung</li> <li id="overView_feedInPower">Netzleistung</li> <li id="normal_all">Alle</li> <li id="js_unitTime_hour">Stunde</li> <li id="js_unitTime_day">Tag</li> <li id="js_unitTime_week">Woche</li> <li id="js_unitTime_month">Monat</li> <li id="js_unitTime_season">Jahreszeit</li> <li id="js_unitTime_year">Jahr</li> <li id="js_jumpTo">Laden</li> <li id="js_go"></li> <li id="js_pleaseSelect">Bitte auswählen</li> <li id="js_onloading">Loading...</li> <li id="js_billion">Milliarde</li> <li id="js_ten_million">Zehn Millionen</li> <li id="js_ten_thousand">Zehntausend</li> <li id="js_thousand">Tausend</li> <li id="js_pwd_overdue">Ihr Passwort wurde seit mehr als 60 Tage nicht aktualisiert, bitte ändern Sie das Passwort so schnell wie möglich für Ihre Kontosicherheit</li> <li id="systemInfo">Systemeingabe</li> <li id="js_sure">sicher</li> <li id="js_cancel">Abbrechen</li> <li id="expireinfo">Die Berechtigungsinformationen sind ungültig</li> <li id="js_opt">Genehmigung</li> <li id="js_optConfirm">Bestätigen Sie, diesen Benutzer zu autorisieren</li> <li id="js_deviceUpgradeOver">Geräte-Upgrade abgeschlossen</li> <li id="js_waitForUpgrade">Aktualisierung. Bitte seien Sie geduldig und warten Sie, bis es beendet ist.</li> <!-- getCommonText("#success") --> <!-- getText("#success")--> <li id="m_482097403550236672">Geräteverwaltung</li> <li id="m_482098002492653568">Inv Management</li> <li id="m_482098557109665792">Batteriemanagement</li> <li id="m_482100258269036544">Alarmmanagement</li> <li id="m_482100640605011968">Geräteabfrage</li> <li id="m_482101146987528192">Systemmanagement</li> <li id="m_482101473971273728">Standortverwaltung</li> <li id="m_482101757090988032">Virtuelle Seite</li> <li id="m_482102054995623936">Kontoführung</li> <li id="m_482102223820554240">Rollenmanagement</li> <li id="m_482102687429558272">Menüverwaltung</li> <li id="m_482102876550725632">Resourcenmanagement</li> <li id="m_482102952333410304">Herstellerverwaltung</li> <li id="m_482103130037682176">Wörterbuchverwaltung</li> <li id="m_482103296228589568">Stil-Management</li> <li id="m_482103686701514752">Agent Management</li> <li id="m_482422729279012864">Alarmtyp Definition</li> <li id="m_482424913190191104">Herstellerverwaltung</li> <li id="m_482424969666494464">Push-Alarm angepasst </li> <li id="m_482747671581294592">E-Mail-Push-Einstellungen</li> <li id="m_483523087912927232">SN Generation</li> <li id="m_485681447005323264">statistische Analyse</li> <li id="m_485703302084820992">Wechselrichteralarm</li> <li id="m_485704141876756480">Alarmnummerstatistik</li> <li id="m_485704595910164480">Alarmgeräteanalyse</li> <li id="m_485704774453297152">Alarmtypanalyse</li> <li id="m_485716321204436992">Fernunterricht Aufzeichnung</li> <li id="m_485734079505891328">Wechselrichter Station Energie Generation Ranking</li> <li id="m_485994672783622144">User-Station Energieerzeugung Ranking</li> <li id="m_485999254741975040">Hersteller Energieerzeugung Statistik</li> <li id="m_487056401735090176">Inverter-Parameter-Analyse</li> <li id="m_487057196081741824">Alarm Level Analyse</li> <li id="m_487214751248547840">Inverter Alarm Nummer Ranking</li> <li id="m_487446544857956352">Wechselrichter Alarmstatistik</li> <li id="m_487809129058926592">Neue Geräte</li> <li id="m_487814872235507712">Verkaufsbereichsstatistik</li> <li id="m_487815778842705920">Verkaufsstatistik</li> <li id="m_493237719716069376">Berichtsstatistik</li> <li id="m_493695564811075584">meine Seite</li> <li id="m_493696678323290112">Alarmaufzeichnung</li> <li id="m_493697251076472832">Geschichte Rekord</li> <li id="m_493697828166565888">Berichtsanalyse</li> <li id="m_493702634637623296">Wechselrichter</li> <li id="m_495758797550125056">Nutzerdetails</li> <li id="m_496480741622808576">Ferneinstellung</li> <li id="m_497926953790078976">Alterungstest</li> <li id="m_497927264244072448">Online Status</li> <li id="m_497927435564613632">Listenmodus</li> <li id="m_497927752503001088">Alterungsgeschichte</li> <li id="m_497928159526649856">Alterungsfehler Geschichte</li> <li id="m_497928607880970240">Alterungsanalyse</li> <li id="m_497928847677718528">Wechselrichteralarmanalyse</li> <li id="m_497929047754407936">Alterungsparameter Einstellungen</li> <li id="m_507392618720657408">Benutzerverwaltung</li> <li id="m_511078469627543552">Remote Upgrade</li> <li id="m_515448829571497984">Firmware hochladen</li> <li id="m_533878055840514048">Push-Einstellungen</li> <li id="m_535652117323448320">Zentrale Steuerungsplanung</li> <li id="m_535653051059404800">MC-Ressourcenverwaltung</li> <li id="m_535653435689664512">MGCC-Scheduling-Aufgabenverteilung</li> <li id="m_535652688637984768">MGCC-Ressourcenverwaltung</li> <li id="m_535653277803479040">Scheduling Kurvenmanagement</li> <li id="m_535612341824258048">E-Mail-Push-Einstellungen</li> <li id="m_535612938363338752">Individueller Push Alarm</li> <li id="m_540429604414816256">Site interne Informationen</li> <li id="m_582009362613010432">扶贫机构管理</li> <li id="m_582009362613010433">扶贫用户管理</li> <li id="m_582009362613010434">系统日志查询</li> <li id="m_582009362613010435">MQTT Config</li> <li id="m_620495106918580224">Card management</li> <li id="m_632407358198251520">Password management</li> <li id="m_637170864969744384">Server Switching</li> <li id="m_640708485822021632">SN History</li> <li id="m_647376027378515968">Aging Upgrade</li> <li id="m_648346326739714048">Gprs aging test to complete</li> <li id="m_662530781704355840">Access track</li> <li id="m_668323831487660032">Test House Management</li> <li id="m_668714819121053696">Aging inverter</li> <li id="m_674886831833088000">Aging module</li> <li id="m_683218161125818368">Package verändern</li> <li id="m_683869407486672896">Transfer rates</li> <li id="m_688301529563660288">External interface management</li> <li id="m_733125230075052032">Operation and maintenance news</li> <!--站内消息--> <li id="js_opt_userName">Benutzername</li> <li id="js_opt_deviceSN">Inverter SN</li> <li id="js_opt_wifiSN">Registrationsnummer</li> <li id="js_opt_desc">Betriebsinformationen</li> <li id="js_opt_Type">Operation type</li> <li id="js_opt_uuid">Autorisierungscode</li> <li id="js_opt_applying">Antrag auf genehmigung für das</li> <li id="js_opt_firmName">Firmenname</li> <!--告警消息--> <li id="js_alarm_userName">Benutzername</li> <li id="js_alarm_batterySN">Battery SN</li> <li id="js_alarm_wifiSn">Registrierungsnummer</li> <li id="js_alarm_thName">Alarmdetails</li> <li id="js_alarm_date">Geschehen zeit</li> <li id="js_noWeatherData">No Weather Data</li> <!-- map --> <li id="js_site_siteName1">Kraftwerksname</li> <li id="js_map_info-all">Sites</li> <li id="js_index_choose">Bitte auswählen</li> <li id="js_login_LoginNameNotchinese">The login account cannot contain Chinese</li> <li id="js_login_LoginNameErr">The login account format is not correct.(Characters other than English, Numbers, "@", "_", ". "are not allowed)</li> <li id="js_map_removePower">Non removable site</li> <li id="js_wifi_exsistWifiSn">Have fill out the registration No.</li> <li id="js_sign_wifisn_registered">Das Modul ist registriert!</li> <li id="langSelect2">de</li> <li id="js_recover_user">recover account</li> <li id="js_updatePassword_title">Passwort ändern</li> <li id="msg_illegal_character">Password is not allowed to contain illegal characters</li> <li id="js_startTime_compare_endTime">Start time is not greater than end time</li> <li id="js_startTime_select">Please select the start time</li> <li id="js_endTime_select">Please select the end time</li> <li id="js_time_range_over">Time range cannot be more than </li> <li id="js_days">days</li> <li id="js_notNull">can't be empty</li> <li id="js_lengthRules">length must be between 2 ~ 20</li> <li id="js_mustbeNum">must be numeric</li> <li id="js_mustbeInteger">must be a positive integer</li> <li id="js_Non_Negative_Integer">must be non-negative integers</li> <li id="js_Non_Negative">must be as a negative number</li> <li id="js_illegal_character">not allowed to enter illegal characters</li> <li id="email_error">Das E-Mail-Format ist falsch.(Characters other than English, Numbers, "@", "_","-", ". "are not allowed)</li> <li id="phone_error">Telefonformat ist falsch.(Characters other than Numbers, Spaces, "-", "#", "+" are not allowed)</li> <li id="js_ThisItem">this item </li> <li id="js_pv_no_data">Nothing select</li> <li id="js_address_format_err">Address is incorrectly formatted.(Characters other than Chinese, English, Numbers, Spaces, ", ", "#", "&", "()" are not allowed)</li> <li id="js_noemail_uname">Your login account without binding mailbox,cannot modify the login account!</li> <li id="js_sure_cancel_account">Sure you want to cancel the account?</li> <li id="js_account_success">Account cancellation of success</li> <li id="js_account_failed">Account cancellation of failure</li> <li id="js_pwd_contain_space">The password cannot contain Spaces</li> <li id="js_pwd_not_paste">The password box is not allowed to be pasted</li> <li id="js_pwd_not_menu">The password box is not allowed to use the right-click menu</li> <li id="langPlus">en-US</li> <li id="registerVodafone_content">Dear Customer, welcome to the GPRS3.0 data communication service, the service trial period is three months. In order to protect your normal use afterwards, please complete the recharge operation within three months. For details, please refer to the GPRS3.0 User Manual. 【SolaxPower】</li> <li id="VodafoneDownBefore">【Payment reminder】Dear customer, your GPRS3.0 device has less available time. Please recharge it in time to guarantee your normal use. For details of the recharge process, please refer to the GPRS3.0 User Manual.</li> <li id="VodafoneDown">【Payment reminder】Dear customer, your GPRS3.0 device has been restricted to the network due to arrears. Please recharge it in time to guarantee your normal use. For details of the recharge process, please refer to the GPRS3.0 User Manual.</li> <li id="noSiteRemindMsg">No sites registered, please add sites in site management!</li> </ul> <!-- 判断加载地图类型 --> <base href="https://www.solaxcloud.com:443/"> <script type="text/javascript" src="https://maps.google.cn/maps/api/js?file=api&v=3.exp&key=AIzaSyAW5U00CMMio8lbb1ys_SYh6kMVCAGVSKk&sensor=true&language=en-US"></script> <script type="text/javascript" src="resource/modules/map/overGoogleMap.js?v=1.15" async></script> <script type="text/javascript" src="resource/modules/map/googleCommonMap.js?v=1.15" async></script> <script type="text/javascript" src="resource/modules/map/markerclusterer.min.js?v=1.15" async></script> <base href="https://www.solaxcloud.com:443/"> <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=inh0qPVz4a09PXGUYpe0SgCr2GDUiEEh&language=en-US"></script> <script type="text/javascript" src="resource/modules/map/maplib.js?v=1.15" async></script> <script type="text/javascript" src="resource/modules/map/textIconOverlay.js?v=1.15" async></script> <script type="text/javascript" src="resource/modules/map/baiduCommonMap.js?v=1.15" async></script> <script type="text/javascript" src="resource/modules/map/overBaiduMap.js?v=1.15" async></script> <input type="hidden" value="1" id="mapTypeValue"> <input id="userTypeView" name="userId" type="hidden" value="5" /> </body> </html>
Gruß
fastsonic -
Hallo@all
Ich habe noch etwas gesucht und das Script bei symcom mal näher angeschaut. Würde das Script im Parser plugin laufen wenn ich es versuche anzupassen?
Für Tips wäre ich echt dankbar.[Back] <? //Username Solax portal define('USERNAME', '********'); //Passwort the Solax portal. define('PASSWORD', '************'); //ID des Wechselrichters - kann man im Portal sehen $Solax_ID = "*******"; // Ab hier sollte nichts mehr geändert werden. //******************************************** //URL of the login form (Mobile Portal of Solax) - 2 Stufiger Anmeldeprozess define('LOGIN_FORM_URL', 'http://www.solax-portal.com/m/home/login'); //Login action URL - Sendet die Anmeldung define('LOGIN_ACTION_URL', 'http://www.solax-portal.com/m/home/loginpost'); //CURL Config for authentication define('USER_AGENT', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36'); define('COOKIE_FILE', 'cookie.txt'); $postValues = array( 'username' => USERNAME, 'password' => PASSWORD ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, LOGIN_ACTION_URL); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postValues)); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE); curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_REFERER, LOGIN_FORM_URL); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_exec($curl); //echo curl_exec($curl); //test area in case we want to check what happens if(curl_errno($curl)){ throw new Exception(curl_error($curl)); } $Zu_Loeschende_Werte = array("W","A","KW","kWH","kH","V","K","°","â"); // Aufrufen der Übersichtsseite um diese zu parsen curl_setopt($curl, CURLOPT_URL, 'http://www.solax-portal.com/m/user/overview/'.$Solax_ID); curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE); curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $overview_website = curl_exec($curl); //echo $overview_website; $dom_overview = new DOMDocument(); $dom_overview->loadHTML($overview_website); $tablerows = $dom_overview->getElementsByTagName('tr'); foreach ($tablerows as $tablerow) { $Power_Now = stripos($tablerow->nodeValue, "Power Now"); if($Power_Now !== false) { $trimmed = trim($tablerow->nodeValue); $Power_Now = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "Aktueller Stromverbrauch: ",$Power_Now,PHP_EOL; $ID_Power_Now = @IPS_GetVariableIDByName("Aktueller Stromverbrauch", $_IPS['SELF']); if($ID_Power_Now === false) { $ID_Power_Now = IPS_CreateVariable(2); IPS_SetName($ID_Power_Now, "Aktueller Stromverbrauch"); IPS_SetParent($ID_Power_Now, $_IPS['SELF']); } SetValue($ID_Power_Now,$Power_Now); } $Todays_Energy = stripos($tablerow->nodeValue, "Today's Energy"); if($Todays_Energy !== false) { $trimmed = trim($tablerow->nodeValue); $Todays_Energy = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "Ertrag Heute: ",$Todays_Energy, PHP_EOL; $ID_Todays_Energy = @IPS_GetVariableIDByName("Ertrag Heute", $_IPS['SELF']); if($ID_Todays_Energy === false) { $ID_Todays_Energy = IPS_CreateVariable(2); IPS_SetName($ID_Todays_Energy, "Ertrag Heute"); IPS_SetParent($ID_Todays_Energy, $_IPS['SELF']); } SetValue($ID_Todays_Energy,$Todays_Energy); } $Monthly_Yield = stripos($tablerow->nodeValue, "Monthly Yield"); if($Monthly_Yield !== false) { $trimmed = trim($tablerow->nodeValue); $Monthly_Yield = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Ertrag Monat: ",$Monthly_Yield, PHP_EOL; $ID_Monthly_Yield = @IPS_GetVariableIDByName("Ertrag Monat", $_IPS['SELF']); if($ID_Monthly_Yield === false) { $ID_Monthly_Yield = IPS_CreateVariable(2); IPS_SetName($ID_Monthly_Yield, "Ertrag Monat"); IPS_SetParent($ID_Monthly_Yield, $_IPS['SELF']); } SetValue($ID_Monthly_Yield,$Monthly_Yield); } $Yearly_Yield = stripos($tablerow->nodeValue, "Yearly Yield"); if($Yearly_Yield !== false) { $trimmed = trim($tablerow->nodeValue); $Yearly_Yield = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Ertrag Jahr: ",$Yearly_Yield, PHP_EOL; $ID_Yearly_Yield = @IPS_GetVariableIDByName("Ertrag Jahr", $_IPS['SELF']); if($ID_Yearly_Yield === false) { $ID_Yearly_Yield = IPS_CreateVariable(2); IPS_SetName($ID_Yearly_Yield, "Ertrag Jahr"); IPS_SetParent($ID_Yearly_Yield, $_IPS['SELF']); } SetValue($ID_Yearly_Yield,$Yearly_Yield); } $Total_Energy = stripos($tablerow->nodeValue, "Total Energy"); if($Total_Energy !== false) { $trimmed = trim($tablerow->nodeValue); $Total_Energy = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Ertrag Gesamt: ",$Total_Energy, PHP_EOL; $ID_Total_Energy = @IPS_GetVariableIDByName("Ertrag Gesamt", $_IPS['SELF']); if($ID_Total_Energy === false) { $ID_Total_Energy = IPS_CreateVariable(2); IPS_SetName($ID_Total_Energy, "Ertrag Gesamt"); IPS_SetParent($ID_Total_Energy, $_IPS['SELF']); } SetValue($ID_Total_Energy,$Total_Energy); } } // Aufrufen der Statusseite mit Echtzeitdaten um diese zu parsen curl_setopt($curl, CURLOPT_URL, 'http://www.solax-portal.com/m/User/status/'.$Solax_ID); curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE); curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $overview_website = curl_exec($curl); //echo $overview_website; $dom_realtime = new DOMDocument(); $dom_realtime->loadHTML($overview_website); $tablerows = $dom_realtime->getElementsByTagName('tr'); foreach ($tablerows as $tablerow) { $PV1_Current = stripos($tablerow->nodeValue, "PV1 Current"); if($PV1_Current !== false) { $trimmed = trim($tablerow->nodeValue); $PV1_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "PV1 Strang Leistung Aktuell: ",$PV1_Current, PHP_EOL; $ID_PV1_Current = @IPS_GetVariableIDByName("PV1 Strang Leistung Aktuell", $_IPS['SELF']); if($ID_PV1_Current === false) { $ID_PV1_Current = IPS_CreateVariable(2); IPS_SetName($ID_PV1_Current, "PV1 Strang Leistung Aktuell"); IPS_SetParent($ID_PV1_Current, $_IPS['SELF']); } SetValue($ID_PV1_Current,$PV1_Current); } $PV2_Current = stripos($tablerow->nodeValue, "PV2 Current"); if($PV2_Current !== false) { $trimmed = trim($tablerow->nodeValue); $PV2_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "PV2 Strang Leistung Aktuell: ",$PV2_Current, PHP_EOL; $ID_PV2_Current = @IPS_GetVariableIDByName("PV2 Strang Leistung Aktuell", $_IPS['SELF']); if($ID_PV2_Current === false) { $ID_PV2_Current = IPS_CreateVariable(2); IPS_SetName($ID_PV2_Current, "PV2 Strang Leistung Aktuell"); IPS_SetParent($ID_PV2_Current, $_IPS['SELF']); } SetValue($ID_PV2_Current,$PV2_Current); } $PV1_Voltage = stripos($tablerow->nodeValue, "PV1 Voltage"); if($PV1_Voltage !== false) { $trimmed = trim($tablerow->nodeValue); $PV1_Voltage = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "PV1 Strang Spannung Aktuell: ",$PV1_Voltage, PHP_EOL; $ID_PV1_Voltage = @IPS_GetVariableIDByName("PV1 Strang Spannung Aktuell", $_IPS['SELF']); if($ID_PV1_Voltage === false) { $ID_PV1_Voltage = IPS_CreateVariable(2); IPS_SetName($ID_PV1_Voltage, "PV1 Strang Spannung Aktuell"); IPS_SetParent($ID_PV1_Voltage, $_IPS['SELF']); } SetValue($ID_PV1_Voltage,$PV1_Voltage); } $PV2_Voltage = stripos($tablerow->nodeValue, "PV2 Voltage"); if($PV2_Voltage !== false) { $trimmed = trim($tablerow->nodeValue); $PV2_Voltage = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "PV2 Strang Spannung Aktuell: ",$PV2_Voltage, PHP_EOL; $ID_PV2_Voltage = @IPS_GetVariableIDByName("PV2 Strang Spannung Aktuell", $_IPS['SELF']); if($ID_PV2_Voltage === false) { $ID_PV2_Voltage = IPS_CreateVariable(2); IPS_SetName($ID_PV2_Voltage, "PV2 Strang Spannung Aktuell"); IPS_SetParent($ID_PV2_Voltage, $_IPS['SELF']); } SetValue($ID_PV2_Voltage,$PV2_Voltage); } $Output_Current = stripos($tablerow->nodeValue, "Output Current"); if($Output_Current !== false) { $trimmed = trim($tablerow->nodeValue); $Output_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Aktuelle Ausgangsleistung: ",$Output_Current, PHP_EOL; $ID_Output_Current = @IPS_GetVariableIDByName("Aktuelle Ausgangsleistung", $_IPS['SELF']); if($ID_Output_Current === false) { $ID_Output_Current = IPS_CreateVariable(2); IPS_SetName($ID_Output_Current, "Aktuelle Ausgangsleistung"); IPS_SetParent($ID_Output_Current, $_IPS['SELF']); } SetValue($ID_Output_Current,$Output_Current); } $Network_Voltage = stripos($tablerow->nodeValue, "Network Voltage"); if($Network_Voltage !== false) { $trimmed = trim($tablerow->nodeValue); $Network_Voltage = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "Spannung Stromnetz: ",$Network_Voltage, PHP_EOL; $ID_Network_Voltage = @IPS_GetVariableIDByName("Spannung Stromnetz", $_IPS['SELF']); if($ID_Network_Voltage === false) { $ID_Network_Voltage = IPS_CreateVariable(2); IPS_SetName($ID_Network_Voltage, "Spannung Stromnetz"); IPS_SetParent($ID_Network_Voltage, $_IPS['SELF']); } SetValue($ID_Network_Voltage,$Network_Voltage); } $PV1_Input_Power = stripos($tablerow->nodeValue, "PV1 Input Power"); if($PV1_Input_Power !== false) { $trimmed = trim($tablerow->nodeValue); $PV1_Input_Power = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "PV1 Strang Eingangsleistung: ",$PV1_Input_Power, PHP_EOL; $ID_PV1_Input_Power = @IPS_GetVariableIDByName("PV1 Strang Eingangsleistung", $_IPS['SELF']); if($ID_PV1_Input_Power === false) { $ID_PV1_Input_Power = IPS_CreateVariable(2); IPS_SetName($ID_PV1_Input_Power, "PV1 Strang Eingangsleistung"); IPS_SetParent($ID_PV1_Input_Power, $_IPS['SELF']); } SetValue($ID_PV1_Input_Power,$PV1_Input_Power); } $PV2_Input_Power = stripos($tablerow->nodeValue, "PV2 Input Power"); if($PV2_Input_Power !== false) { $trimmed = trim($tablerow->nodeValue); $PV2_Input_Power = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "PV2 Strang Eingangsleistung: ",$PV2_Input_Power, PHP_EOL; $ID_PV2_Input_Power = @IPS_GetVariableIDByName("PV2 Strang Eingangsleistung", $_IPS['SELF']); if($ID_PV2_Input_Power === false) { $ID_PV2_Input_Power = IPS_CreateVariable(2); IPS_SetName($ID_PV2_Input_Power, "PV2 Strang Eingangsleistung"); IPS_SetParent($ID_PV2_Input_Power, $_IPS['SELF']); } SetValue($ID_PV2_Input_Power,$PV2_Input_Power); } $Power_Now = stripos($tablerow->nodeValue, "Power Now"); if($Power_Now !== false) { $trimmed = trim($tablerow->nodeValue); $Power_Now = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Aktuelle Leistung PV W: ",$Power_Now, PHP_EOL; $ID_Power_Now = @IPS_GetVariableIDByName("Aktuelle Leistung PV W", $_IPS['SELF']); if($ID_Power_Now === false) { $ID_Power_Now = IPS_CreateVariable(2); IPS_SetName($ID_Power_Now, "Aktuelle Leistung PV W"); IPS_SetParent($ID_Power_Now, $_IPS['SELF']); } SetValue($ID_Power_Now,$Power_Now); } $Output_Current = stripos($tablerow->nodeValue, "Output Current"); if($Output_Current !== false) { $trimmed = trim($tablerow->nodeValue); $Output_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Aktuelle Leistung PV : ",$Output_Current, PHP_EOL; $ID_Output_Current = @IPS_GetVariableIDByName("Aktuelle Leistung PV A", $_IPS['SELF']); if($ID_Output_Current === false) { $ID_Output_Current = IPS_CreateVariable(2); IPS_SetName($ID_Output_Current, "Aktuelle Leistung PV A"); IPS_SetParent($ID_Output_Current, $_IPS['SELF']); } SetValue($ID_Output_Current,$Output_Current); } } // Aufrufen der Batterieseite um diese zu parsen curl_setopt($curl, CURLOPT_URL, 'http://www.solax-portal.com/m/User/battery/'.$Solax_ID); curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE); curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $overview_website = curl_exec($curl); //echo $overview_website; $dom_battery = new DOMDocument(); $dom_battery->loadHTML($overview_website); $tablerows = $dom_battery->getElementsByTagName('tr'); foreach ($tablerows as $tablerow) { $Batterie_Charge = stripos($tablerow->nodeValue, "Battery 1"); if($Batterie_Charge !== false) { $trimmed = trim($tablerow->nodeValue); $Batterie_Charge = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "Batterie Ladung: ",$Batterie_Charge, PHP_EOL; $ID_Batterie_Charge = @IPS_GetVariableIDByName("Batterie Ladung", $_IPS['SELF']); if($ID_Batterie_Charge === false) { $ID_Batterie_Charge = IPS_CreateVariable(2); IPS_SetName($ID_Batterie_Charge, "Batterie Ladung"); IPS_SetParent($ID_Batterie_Charge, $_IPS['SELF']); } SetValue($ID_Batterie_Charge,$Batterie_Charge); } $Battery_V = stripos($tablerow->nodeValue, "Battery V."); if($Battery_V !== false) { $trimmed = trim($tablerow->nodeValue); $Battery_V = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6)); echo "Batterie Spannung: ",$Battery_V, PHP_EOL; $ID_Battery_V = @IPS_GetVariableIDByName("Batterie Spannung", $_IPS['SELF']); if($ID_Battery_V === false) { $ID_Battery_V = IPS_CreateVariable(2); IPS_SetName($ID_Battery_V, "Batterie Spannung"); IPS_SetParent($ID_Battery_V, $_IPS['SELF']); } SetValue($ID_Battery_V,$Battery_V); } $Battery_I = stripos($tablerow->nodeValue, "Battery I."); if($Battery_I !== false) { $trimmed = trim($tablerow->nodeValue); $Battery_I = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Battery P: ",$Battery_I, PHP_EOL; $ID_Battery_I = @IPS_GetVariableIDByName("Batterie Strom", $_IPS['SELF']); if($ID_Battery_I === false) { $ID_Battery_I = IPS_CreateVariable(2); IPS_SetName($ID_Battery_I, "Batterie Strom"); IPS_SetParent($ID_Battery_I, $_IPS['SELF']); } SetValue($ID_Battery_I,$Battery_I); } $Battery_P = stripos($tablerow->nodeValue, "Battery P."); if($Battery_P !== false) { $trimmed = trim($tablerow->nodeValue); $Battery_P = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Batterie Leistung: ",$Battery_P, PHP_EOL; $ID_Battery_P = @IPS_GetVariableIDByName("Batterie Leistung", $_IPS['SELF']); if($ID_Battery_P === false) { $ID_Battery_P = IPS_CreateVariable(2); IPS_SetName($ID_Battery_P, "Batterie Leistung"); IPS_SetParent($ID_Battery_P, $_IPS['SELF']); } SetValue($ID_Battery_P,$Battery_P); } $Inner_T = stripos($tablerow->nodeValue, "Inner T."); if($Inner_T !== false) { $trimmed = trim($tablerow->nodeValue); $Inner_T = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13)); echo "Batterie Temperatur: ",$Inner_T, PHP_EOL; $ID_Inner_T = @IPS_GetVariableIDByName("Batterie Temperatur", $_IPS['SELF']); if($ID_Inner_T === false) { $ID_Inner_T = IPS_CreateVariable(2); IPS_SetName($ID_Inner_T, "Batterie Temperatur"); IPS_SetParent($ID_Inner_T, $_IPS['SELF']); } SetValue($ID_Inner_T,floatval($Inner_T)); } } ?>
Gruß
Fastsonic -
Hi@all
Falls es jemanden interessiert
Ich versuche mal einen MBUS zu WIFI Adapter und das ganze per Modbus anzubinden.
Hab das Teil bei Ali für 10 euro bestellt.
Wenn ich getestet habe, melde ich mich nochmal. Wäre vieleicht auch für andere Sensoren interessant.Gruß
Fastsonic -
Hallo,
darf man erfahren, ob das Ganze funktioniert hat? Wenn ja, wie? Stehe vor dem selben Problem.
-
Es ist toll. Die Lösung ist ziemlich gut. Ich habe die Community sehr genossen. roadrunner email Vielen Dank.
-
@fastsonic Hallo, hast du mittlerweile eine Lösung gefunden die Daten vom Solax auszulesen?
Gruß
samot13 -
moin,
falls noch SOLAX Bedarf bestehen sollte:
ich arbeite gerade an einer Lösung via iobroker.parser.
Die ersten Versuche sehen schon mal vielversprechend aus.Gruß
Thomas -
@kgw Ja ich habe noch Bedarf. Super das du da was machst!
Gruß
samot13 -
moin, Beispiel: Wechselrichter: SOLAX SK-SU5000E,
im iobroker den Adapter parser installieren.unter Instanzen/parser div. neue (Regeln) Datenpunkte anlegen:
B: 1:
Name: pv1_Curr
Url: http://xxx.xxx.xxx.xx/api/realTimeData.htm
RegEx: [+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)
Num: 5Im Testtext erscheint nach der url:
{"method":"uploadsn","version":"Solax_SI_CH_2nd_20160810_DE03","type":"AL_SE","SN":"DEC88A12","Data":[3.6,3.2,369.7,275.6,8.8,228.9,1986,30,12.8,14485.9,1774,1330,881,0.00,0.00,0,5,0,0.0,0.0,,,,,,,,,,,,,,,,,,,,,,11311.50,6468.50,,,,,,,,50.05,,,0.0,0.0,0,0.00,0,0,0,0.00,0,8,0,0,0.00,0,8],"Status":"2"}mit der o.a. num = 5 ergibt sich der aktuelle Current! bei iobroker.objects.parser.n.pv1_Curr!
mit der RegEx habe ich länger "herumgedoktort", da ich kein Experte bin!
Bei der Feed_In_Power gibt es auch noch ein Vorzeichen/int/float Problem, welches noch gelöst werden muss.
Konstanten s. https://community.home-assistant.io/t/solax-solar-inverter-setup-guide/48008
Live datastreamViel Spaß und Erfolg
Thomas -
hier noch eine akt. vis Implementation:
-
Stehe vor dem selben Problem, leider habe ich nicht wirklich verstanden wie das ganze Funktionieren soll.
Vielleicht hat ja jemand eine Anleitung wie das ganze klappt in iobroker zu integrieren. -
Hätte ebenfalls Interesse daran. Habe den Solax x1 mini.
Grüße
-
Hallo zusammen
Hätte auch Interesse.
Ich komme bei mir nicht weiter desweiteren ist mein Wechselrichter nicht erreichbar und der IP Adresse was ich habe
Wenn ich die API verwende kommt token invalid obwohl ich einen generiert habe in meiner solax cloud.
Grüße Holger
-
@kgw said in Solax Photovoltaik Portal in ioBroker:
https://community.home-assistant.io/t/solax-solar-inverter-setup-guide/48008
Hi, geht das bei dir noch? Seit einigen Wochen erreiche ich die API nicht mehr. Gabs da ein Update, bei dem die API abgeschalten wurden?
-
Hallo - auch ich nutze seit gestern Solax X1 mini. Funktioniert es (noch) mit dem Parser ? Gibt es irgendwo ein etwas detailllierte Anleitung, wie die Daten in ioBroker kommen können ?
Dsanke für eure Hilfe
laola -
Hallo, vielleicht hilft dir das weiter.
Ich habe einen X1-Boost/Air/Mini.
Da die Cloud Verbindung bei mir demnächst gekappt wird, musste ich auch einen Weg finden die Daten lokal zu bekommen.
Solax hat an dem Pocket-Wifi einen offenen Wlan-Zugang, welcher jedoch 1. nur einen Teilnehmer zulässt und nicht in meinem lokalen Netz ist.Ich habe jetzt einen einfachen kleinen ESP-01 genommen, der verbindet sich mit dem Solax Wlan, holt Daten ab, verbindet sich danach mit meinem lokalen Wlan und sendet die Daten an meinen MQTT Broker.
und wieder von vorn.....
hier ist der Arduino Code (P.S. im Online Editor kann ich nicht übersetzen, kommen Fehler, Lokal geht es):
https://create.arduino.cc/editor/kunigunde/19dce021-7701-4557-96cc-153a5e1f9bee/preview?F=ESP_SOLAX_MQTT.ino -
mittlerweile gibt es einen Adapter für Solax (https://github.com/simatec/ioBroker.solax)...
-
@kgw sagte in Solax Photovoltaik Portal in ioBroker:
Bei der Feed_In_Power gibt es auch noch ein Vorzeichen/int/float Problem, welches noch gelöst werden muss.
Hallo, hast du eine Lösung für das Vorzeichen?
-
@skorpion_inka
leider noch nicht weiter dran gewerkelt.Aber du bist ja mit deinem thread
"Parser auslesen von XML - Vorzeichen fehlt" vom 27.10.21 offensichtlich weitergekommen und kannst uns hier deine Antwort bzw. Lösung posten, damit alle etwas davon haben!