Wert aus Webseite mit HTTPMOD und Regex auslesen

Begonnen von tommel, 10 Juni 2014, 18:11:28

Vorheriges Thema - Nächstes Thema

tommel

Hallo zusammen,

ich möchte gerne die Leistung meiner Solaranlage aus einem öffentlichen Webinterface ablesen.

Dazu habe ich diesen HTTPMOD definiert:

define Solaranlage HTTPMOD http://refulog.de/PlantPublicDetails.aspx?id=4300 60

In "buf" bekomme ich nun die HTML Response zurück. Ich wollte nun nach http://www.fhemwiki.de/wiki/Ger%C3%A4te_mit_Web-Interface irgendwie mit einer Regex den Wert auslesen. Auch wenn die Regex alleine schon nicht stimmt die ich mir zusammengebaut habe, funktioniert dieses zusammenspiel mit ReadingsName und ReadingsRegex irgendwie nicht richtig.

In buf steht z.B.:

<span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView_ctl04_lblActualPower">2.809,8 W</span></td> </tr><tr class="alt"> <th scope="row">Tagesenergie</th><td class="nr">

Meine Regex würde jetzt ungefähr so aussehen: /(ActualPower">)(.*?),.

Allerdings steht "Actual Power">" dann auch noch mit drin, was es nicht soll. Ich hätte gerne ein Reading in dem nur der Wert (auch ohne W) drin steht.

Kann ich das überhaupt so anwenden? Wenn ja, wie muss ich daran gehen? Kann mir jemand helfen?

Danke!

Gruß
Thomas

herrmannj

Hi

<.*?>(.*?)<.*

in der ersten und einzigen capture group stehen die Watt

vg
Jörg

tommel

Hi Jörg,

danke für deine Antwort!

Das ist dann wahrscheinlich eine korrekte Regex, aber verstehen tue ich sie nicht :-) Hast du die anhand meines Beispiels gebaut oder hast du dir zufällig die gesamte HTML Response angeschaut? Wenn ich bei RegExr deine Regex gegen die komplette Response prüfe, ist das Ergebnis fast die gesamte Eingabe :-).

Ich weiß auch nicht, wie ich die RegEx dann in ein Reading bekomme. Aktuell hab ich es so:

define Solaranlage HTTPMOD http://refulog.de/PlantPublicDetails.aspx?id=4300 60
attr Solaranlage readingsName1 Leistung
attr Solaranlage readingsName2 Power
attr Solaranlage readingsRegex1 /(ActualPower">)(.*?),.
attr Solaranlage readingsRegex2 ActualPower">"(.*)"

Readings1 und 2 sind zwei unterschiedliche Regex als Test, da ich die Syntax von readingsRegex einfach nicht verstehe.

Gruß
Thomas

herrmannj

Hi,

ZitatHast du die anhand meines Beispiels gebaut oder hast du dir zufällig

.... gewürfelt !  8) Ne, quatsch:

<.*?>(.*?)<.*  nimmt alles vom ersten "<" bis zum ersten ">".
<.*?>(.*?)<.* das möchtest Du haben in einer capture Group
<.*?>(.*?)<.* der Rest

damit triggert die regex fast alles (so wie Du sagst) und Dein Power steht in der ersten capture group. Ich gestehe allerdings das ich httpmod nicht verwende. Die commandref habe ich so interpretiert (ohne sie für besonders intuitiv zu halten  :-\ )

Vielleicht muss nochmal jemand mit "httpmod-background" draufschauen ob mein Verständnis der commandref stimmt. Die regex funktioniert auf alle Fälle so wie sie soll: "2.809,8 W" landen in der capture group.

vg
jörg

tommel

#4
Hi,

hört sich plausibel an, aber der Regex läuft über das hier:

HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 Set-Cookie: .ASPXANONYMOUS=NHn6Chq8zwEkAAAANWQyYzI5NWYtMDE0ZC00N2Q3LThmYTYtMTk5MDUzZTlmMWI3o2ajn6mOWFkmGjJFNuXWS9jkjEAVNCR20arKSwRtddY1; expires=Wed, 20-Aug-2014 01:57:05 GMT; path=/; HttpOnly Set-Cookie: ASP.NET_SessionId=czppe1yn5snonxyz42qqfflb; path=/; HttpOnly X-AspNet-Version: 4.0.30319 Set-Cookie: PREFERREDLANGUAGE=DE-DE; path=/ X-Powered-By: ASP.NET Date: Wed, 11 Jun 2014 15:17:04 GMT Connection: close Content-Length: 24805 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title> AE SiteLink - Anlagendetails 'Beerenstrom' </title> <!--[if IE 7]> <style> .button {display: block !important; height: 25px !important; padding-top: 6px;} .linkContainer {margin:0 !important;} .bsaContainer {margin-left: 30%;} #headertop .rightaligned {float: none;} </style> <![endif]--> <link href="App_Themes/REFU2/Images/favicon.ico" rel="shortcut icon" /> <link href="App_Themes/REFU2/Images/favicon.gif" rel="icon" type="image/gif" /> <script type="text/javascript" src="scripts/jquery-latest.min.js"></script> <script type="text/javascript" src="Scripts/date.js"></script> <script src="Scripts/Utils.js?v4.1" type="text/javascript"></script> <script type="text/javascript" src="Scripts/PopupControl.js"></script> <script type="text/javascript" src="Scripts/jquery.cookie.js"></script> <script type="text/javascript"> // Init local date. $(function () { SetTimeZoneDifferenceCookie(); }); </script> <link href="App_Themes/REFU2/CssBundle.min.css" type="text/css" rel="stylesheet" /></head> <body id="public"> <form method="post" action="PlantPublicDetails.aspx?id=4300" id="aspnetForm"> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="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" /> <script type="text/javascript"> //<![CDATA[ var __cultureInfo = {"name":"de-DE","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":",","IsReadOnly":true,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":".","CurrencySymbol":"€","NaNSymbol":"n. def.","CurrencyNegativePattern":8,"NumberNegativePattern":1,"PercentPositivePattern":1,"PercentNegativePattern":1,"NegativeInfinitySymbol":"-unendlich","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":",","NumberGroupSeparator":".","CurrencyPositivePattern":3,"PositiveInfinitySymbol":"+unendlich","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":",","PercentGroupSeparator":".","PercentSymbol":"%","PerMilleSymbol":"‰","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"","Calendar":{"MinSupportedDateTime":"\/Date(-62135596800000)\/","MaxSupportedDateTime":"\/Date(253402297199999)\/","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true},"DateSeparator":".","FirstDayOfWeek":1,"CalendarWeekRule":2,"FullDateTimePattern":"dddd, d. MMMM yyyy HH:mm:ss","LongDatePattern":"dddd, d. MMMM yyyy","LongTimePattern":"HH:mm:ss","MonthDayPattern":"dd MMMM","PMDesignator":"","RFC1123Pattern":"ddd, dd MMM yyyy HH\u0027:\u0027mm\u0027:\u0027ss \u0027GMT\u0027","ShortDatePattern":"dd.MM.yyyy","ShortTimePattern":"HH:mm","SortableDateTimePattern":"yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\u0027-\u0027MM\u0027-\u0027dd HH\u0027:\u0027mm\u0027:\u0027ss\u0027Z\u0027","YearMonthPattern":"MMMM yyyy","AbbreviatedDayNames":["So","Mo","Di","Mi","Do","Fr","Sa"],"ShortestDayNames":["So","Mo","Di","Mi","Do","Fr","Sa"],"DayNames":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"AbbreviatedMonthNames":["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""],"MonthNames":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],"IsReadOnly":true,"NativeCalendarName":"Gregorianischer Kalender","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""],"MonthGenitiveNames":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""]},"eras":[1,"n. Chr.",null,0]};//]]> </script> <script src="/ScriptResource.axd?d=5JW0dIegcSZybZ2HAFcVgmA19Xi0ZwFUBbzS0xtJOjwPqU2bNpO06zZtvta1sU4C-xDo_ADNsCybCLSPzr8LzOUlZCRa6oiJ4UxRnzvMrobzUZVKiFzXWKhsrj-JZGC_0&t=3a1336b1" type="text/javascript"></script> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdABoLaAX94y1j2ADsfyxeD6eKiFjbPiN8lZ/rhm//zMIj9fDhsc2Z2XAYHo520rk3xSoIqDAxd02T+jhQsARokB2PN3jBL47YfEUGukPLCmodDPEbZMYv093AQyIbuAQx3XQRBxy2zZg7CtDYNNKYRs7/eyf7kqH3CaDw5IWjNBR2SbAl2g0o17KP2gJ25daFRyulBNMy7dF57DWbH6jcV3wlax/zEz2hBCG5eKetC5OuUv90W8lt0W7zW3WYWvG17tb+nr3LlnQErkKjKjjwpQoi2cU7/NdQKNdtJWH36fDyR6/040m8Bs6ID5twrfn8G4Hs1Nd4UrgwnAmiVwWCfsUXfAcveTDZ+VK9g16f+imo7o8ELK8PFPo7WAVMbLeJJj9eTvLGsiBTckd/Py0lrdVSsv74L4Z4SKJekDsxAklHJqegIZp8Lu6kcaCRA7fjgC8W8oYDFa/W9hwTMbzmiM9sawrqKPrkQWLtKEHIOUz2Tl8uzDZU6VbKRVik1ABEtec8BLJKhBCvW/zN4hz4HfOa+QqIm48cvy1+3MJ2i1IuiQQlbMhqHWTBBa7cozf6vbq6cyrBpSmgQsWgGic7igen" /> <div id="coverall" class="donotcoverall"> <div id="modalpopup" class="modalpopupsmall"> <div id="modalpopupheader"> <span id="modalpopuptitle" class="leftaligned"></span><a href="javascript:ClosePopUpWindow();" id="toprightclose" class="iconedlink deleteicon rightaligned fixedheighticonedlink" style="margin-bottom: 1px; margin-right: 1px"><i>X</i></a> <div class="clearfloat"> </div> </div> <div id="modalpopupcontent"> <iframe id="modalpopupframe" title="Modal popup window" frameborder="0" longdesc="" src="PopupFiller.htm"></iframe> </div> </div> </div> <div id="container"> <div id="headertop"> <div class="rightaligned"> <table align="right" cellpadding="0" cellspacing="0" border="0"> <tr> <td> <input name="ctl00$txtUsernameMaster" type="text" maxlength="255" id="ctl00_txtUsernameMaster" tabindex="6" class="biginput tightinput" /> </td> <td class="vertsep"> </td> <td> <input name="ctl00$txtPasswordMaster" type="password" maxlength="255" id="ctl00_txtPasswordMaster" tabindex="7" class="biginput tightinput" /> </td> <td class="vertsep"> </td> <td> <input type="submit" name="ctl00$btnLoginMaster" value="Anmelden" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$btnLoginMaster", "", true, "LoginTop", "", false, false))" id="ctl00_btnLoginMaster" tabindex="8" class="btn" /> </td> </tr> <tr> <td> <table cellpadding="0" cellspacing="0"> <tr> <td> <span class="tightinput"><input id="ctl00_cbRememberMeMaster" type="checkbox" name="ctl00$cbRememberMeMaster" tabindex="9" /></span> </td> <td> <label for="ctl00_cbRememberMeMaster" id="ctl00_lblRememberMeTitle" title="Aktivieren Sie dieses Feld und Sie werden für den Rest des Tages nicht mehr automatisch vom System abgemeldet" class="tightinput">Angemeldet bleiben</label> </td> </tr> </table> </td> <td class="vertsep"> </td> <td> <a id="ctl00_lnkForgotPasswordMaster" tabindex="10" href="RecoverPassword.aspx">Passwort vergessen</a> </td> <td class="vertsep"> </td> </tr> </table> </div> <div class="linkholder rightaligned"> <div class="language-btn"> <a id="lnkCurrentLanguage" class="current closedmenu" href="#">Deutsch</a> <div class="language-box" style="opacity: 1; display: none;"> <table> <tr> <td class="col1"> <span id="ctl00_LanguageControl2_lblEurope" class="continent">Europa</span> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl00_LinkButton1" title="български език" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl00$LinkButton1','')">български език</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl01_LinkButton1" title="Ceština" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl01$LinkButton1','')">Ceština</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl02_LinkButton1" title="Deutsch" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl02$LinkButton1','')">Deutsch</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl03_LinkButton1" title="Ελληνικά" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl03$LinkButton1','')">Ελληνικά</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl04_LinkButton1" title="English" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl04$LinkButton1','')">English</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl05_LinkButton1" title="Español" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl05$LinkButton1','')">Español</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl06_LinkButton1" title="Français" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl06$LinkButton1','')">Français</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl07_LinkButton1" title="Magyar" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl07$LinkButton1','')">Magyar</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl08_LinkButton1" title="Italiano" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl08$LinkButton1','')">Italiano</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl09_LinkButton1" title="Nederlands" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl09$LinkButton1','')">Nederlands</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl10_LinkButton1" title="Język Polski" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl10$LinkButton1','')">Język Polski</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl11_LinkButton1" title="Română" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl11$LinkButton1','')">Română</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl12_LinkButton1" title="Русский язык" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl12$LinkButton1','')">Русский язык</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl13_LinkButton1" title="Türkçe" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl13$LinkButton1','')">Türkçe</a> <a id="ctl00_LanguageControl2_rptEuropeanLanguages_ctl14_LinkButton1" title="українська мова" class="languageSelect col1" href="javascript:__doPostBack('ctl00$LanguageControl2$rptEuropeanLanguages$ctl14$LinkButton1','')">українська мова</a> </td> <td class="col2"> <span id="ctl00_LanguageControl2_lblAmerica" class="continent">Amerika</span> <a id="ctl00_LanguageControl2_rptAmericanLanguages_ctl00_LinkButton1" title="English" class="languageSelect" href="javascript:__doPostBack('ctl00$LanguageControl2$rptAmericanLanguages$ctl00$LinkButton1','')">English</a> <span id="ctl00_LanguageControl2_lblAsia" class="continent continent-inside">Asien</span> <a id="ctl00_LanguageControl2_rptAsiaLanguages_ctl00_LinkButton1" title="日本語" class="languageSelect col2" href="javascript:__doPostBack('ctl00$LanguageControl2$rptAsiaLanguages$ctl00$LinkButton1','')">日本語</a> <a id="ctl00_LanguageControl2_rptAsiaLanguages_ctl01_LinkButton1" title="한국어" class="languageSelect col2" href="javascript:__doPostBack('ctl00$LanguageControl2$rptAsiaLanguages$ctl01$LinkButton1','')">한국어</a> <a id="ctl00_LanguageControl2_rptAsiaLanguages_ctl02_LinkButton1" title="ภาษาไทย" class="languageSelect col2" href="javascript:__doPostBack('ctl00$LanguageControl2$rptAsiaLanguages$ctl02$LinkButton1','')">ภาษาไทย</a> <a id="ctl00_LanguageControl2_rptAsiaLanguages_ctl03_LinkButton1" title="中國傳統" class="languageSelect col2" href="javascript:__doPostBack('ctl00$LanguageControl2$rptAsiaLanguages$ctl03$LinkButton1','')">中國傳統</a> <a id="ctl00_LanguageControl2_rptAsiaLanguages_ctl04_LinkButton1" title="汉语" class="languageSelect col2" href="javascript:__doPostBack('ctl00$LanguageControl2$rptAsiaLanguages$ctl04$LinkButton1','')">汉语</a> </td> </tr> </table> </div> </div> <script type="text/javascript"> $('.language-btn').mouseover(function () { if (!$('.language-box').is(':visible')) { $('.language-btn .language-box').animate({ opacity: 1.0, height: 'show' }, 400); } }); $('.language-btn').mouseleave(function () { $('.language-box').animate({ opacity: 1.0, height: 'hide' }, 400); }); // $('#lnkCurrentLanguage').click(function () { // if (!$('.language-box').is(':visible')) { // $('.language-btn .language-box').animate({ // opacity: 1.0, // height: 'show' // }, 400); // $('.language-btn #lnkCurrentLanguage').removeClass('closedmenu'); // $('.language-btn #lnkCurrentLanguage').addClass('openedmenu'); // } // else { // $('.language-box').animate({ // opacity: 1.0, // height: 'hide' // }, 400); // $('.language-btn #lnkCurrentLanguage').removeClass('openedmenu'); // $('.language-btn #lnkCurrentLanguage').addClass('closedmenu'); // } // return false; // }); </script> <div class="clearfloat"> </div> </div> <h1> <a id="ctl00_lnkProductTitle" class="producttitle" href="Default.aspx"><i>AE SiteLink</i> <img src="App_Themes/REFU2/Images/home.gif" alt="home" class="producttitlehome"/> </a> </h1> </div> <div id="menu"> <div class="companylogocontainer"> <a id="ctl00_lnkCompanyHomepage" href="http://www.refusol.com/"><i>REFUsol GmbH</i> <img src="App_Themes/REFU2/Images/companylogo.png" alt="company" class="companylogo" /> </a> </div> </div> <h2> <span id="ctl00_titlePlaceHolder_lblTitle">Anlagendaten</span> </h2> <div id="publiccontent"> <div id="ctl00_mainContentPlaceHolder_panelPlantDetails"> <div class="itemtitle"> <h3> <span id="ctl00_mainContentPlaceHolder_lblInfoTitle">Beerenstrom</span> </h3> </div> <div class="item"> <table cellpadding="0" cellspacing="10" border="0"> <tr> <td valign="top"> <a id="ctl00_mainContentPlaceHolder_lnkPlantImage" class="nooutline" href="Uploads/Plants/Images/4300.jpg" target="_blank"><img id="ctl00_mainContentPlaceHolder_imgPlant" class="imageholderprev" src="Uploads/Plants/Images/4300_prev.jpg" /></a> </td> <td valign="top" class="detailstable"> <table cellpadding="0" cellspacing="0" border="0" class="detailstable"> <tr> <td valign="top" class="infotablecell"> <div> <table class="infotable detailstable" cellspacing="0" rules="all" border="1" id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridStatic_gridView"> <tr> <th scope="row">Eigentümer</th><td><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridStatic_gridView_ctl02_lblOwner">Familie Beer</span></td> </tr><tr class="alt"> <th scope="row">Generatorleistung</th><td class="nr"><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridStatic_gridView_ctl03_lblInstalledPower">9,66 kWp</span></td> </tr><tr> <th scope="row">Wechselrichtertypen</th><td><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridStatic_gridView_ctl04_lblInverterTypes">REFUsol 010K (1)</span></td> </tr> </table> </div> </td> <td class="vertsep">   </td> <td valign="top" class="infotablecell"> <div> <table class="infotable detailstable" cellspacing="0" rules="all" border="1" id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView"> <tr> <th scope="row">Gesamtenergie</th><td class="nr"><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView_ctl02_lblTotalYield">15.921 kWh</span></td> </tr><tr class="alt"> <th scope="row">CO<span class='subscript'>2</span> Einsparung</th><td class="nr"><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView_ctl03_lblReducedCo2">8.757 kg</span></td> </tr><tr> <th scope="row">Aktuelle Leistung</th><td class="nr"><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView_ctl04_lblActualPower">1.602,2 W</span></td> </tr><tr class="alt"> <th scope="row">Tagesenergie</th><td class="nr"><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView_ctl05_lblYieldOfDay">15,3 kWh</span></td> </tr><tr> <th scope="row">Tagesenergie normiert</th><td class="nr"><span id="ctl00_mainContentPlaceHolder_plantDetailsControl_infoGridDynamic_gridView_ctl06_lblDailyYieldRelative">1,58 Wh/Wp</span></td> </tr> </table> </div> </td> </tr> </table> </td> </tr> </table> </div> </div> </div> <div id="footer"> <div class="footer_container"> <em> <a id="ctl00_FooterControl1_lnkCompany" href="http://www.refusol.com/">© REFUsol GmbH 2014</a></em> <span id="ctl00_FooterControl1_lblCorporateInfoSeparator"> | </span> <a id="ctl00_FooterControl1_lnkCorporateInfo" href="PublicContact.aspx">Impressum</a> <span id="ctl00_FooterControl1_lblPrivacyPolicySeparator"> | </span> <a id="ctl00_FooterControl1_lnkPrivacyPolicy" href="PrivacyPolicy.aspx">Datenschutz</a> <span id="ctl00_FooterControl1_lblTermsOfUseSeparator"> | </span> <a id="ctl00_FooterControl1_lnkTermsOfUse" href="TermsOfUse.aspx">Nutzungsvereinbarungen</a> </div> </div> </div> </form> <!-- Tracker code begin --> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-30442015-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <!-- Tracker code end --> </body> </html>

Und da ist das Ergebnis leider ein anderes :-)

Ich habe allerdings ein kleines Ergebnis erzielt:

define Solaranlage HTTPMOD http://refulog.de/PlantPublicDetails.aspx?id=4300 60
attr Solaranlage readingsName1 Leistung
attr Solaranlage readingsRegex1 ActualPower">(.*?),.
attr Solaranlage room Scheune
attr Solaranlage stateFormat {sprintf("%.3f Watt", ReadingsVal($name,"Leistung",0))}

Liefert mir die aktuelle Wattzahl bis zur Komma Stelle, nach dem Komma das bekomm ich nicht hin :) das scheint dieser sprintf zu sein, da stimmt irgendwas erst zu 95% :)

Danke dir auf jeden Fall.

EDIT:

Und hier die Lösung für die Kommastelle:

Die Capture Group hat das Komma nicht umschlossen. Also alles was man später in dem Reading haben möchte, muss in () stehen:

attr Solaranlage readingsRegex1 ActualPower">(.*?,.)

Mit %s im sprintf könnte man dann das komplett Wort mit Kommastelle anzeigen:

attr Solaranlage stateFormat {sprintf("%s Watt", ReadingsVal($name,"Leistung",0))}

Jetzt nur noch ein Log und einen Plot :) Dann bin ich Happy

herrmannj

Zitathört sich plausibel an, aber der Regex läuft über das hier: ...

sag das doch gleich  :D  Schön das es jetzt funtioniert, Glückwunsch  :)

vg
jörg

mircoby

Hi zusammen,

möchte aus einer Wetterstation diverse Werte in FHEM übernehmen. Der Zugriff klappt per HTTPMOD, leider scheitere ich an der Regex.

Dies ist ein Ausschnitt aus dem Buffer, der durchsucht werden soll:

</div><div style='position:absolute; z-index:4; top:550px; left:100px; width:150px; height:150px'><img width='150' height='150' usemap='#map5' src='transdot.gif'></div><map name='map5'><area href='start.php?group=Wetterstation&id=1010&command=getValue' alt='getValue' coords='0,0,150,150' shape='rect'> </map> </div><div style='position:absolute; z-index:1; text-align:center; top:550px; left:300px' ><div style='position:absolute; z-index:1; text-align:center; top:5500; left:0px' ><img width='150' height='150' src='value.png' ></div><div style='position:absolute; z-index:2; text-align:center; top:5500; left:0px' ><img width='150' height='150' src='value.png' ></div></div><div style='position:absolute; z-index:2; font-size:1.5em; text-align:center; top:670px; left:310px; width:150px' >32.6</div><div style='position:absolute; z-index:2; font-size:1.5em; text-align:center; top:635px; left:282px; width:150px' ></div><div style='position:absolute; z-index:3; font-size:1.0em; text-align:center; top:690px; left:300px; width:150px' ><br>&nbsp&nbspTemp In [°C]<br><br></div><div style='position:absolute; z-index:4; top:550px; left:300px; width:150px; height:150px'><img width='150' height='150' usemap='#map6' src='transdot.gif'></div><map name='map6'><area href='start.php?group=Wetterstation&id=1007&command=getValue' alt='getValue' coords='0,0,150,150' shape='rect'> </map> </div><div style='position:absolute; z-index:1; text-align:center; top:550px; left:500px' ><div style='position:absolute; z-index:1; text-align:center; top:5500; left:0px' ><img width='150' height='150' src='value.png' ></div><div style='position:absolute; z-index:2; text-align:center; top:5500; left:0px' ><img width='150' height='150' src='value.png' ></div></div><div style='position:absolute; z-index:2; font-size:1.5em; text-align:center; top:670px; left:510px; width:150px' >9.7</div><div style='position:absolute; z-index:2; font-size:1.5em; text-align:center; top:635px; left:482px; width:150px' ></div><div style='position:absolute; z-index:3; font-size:1.0em; text-align:center; top:690px; left:500px; width:150px' ><br>&nbsp&nbspTemp Out [°C]<br><br></div><div style='position:absolute; z-index:4; top:550px; left:500px; width:150px; height:150px'><img width='150' height='150' usemap='#map7' src='transdot.gif'></div>


Die Aufgabe besteht nun darin die Temperaturen "Temp In" und "Temp Out" herauszufiltern. In diesem Beispiel ist der Wert "Temp In" = 32.6; "Temp Out" = 9.7

Meine Idee war zunächst mit einem Lookbehind nach "Temp In" zu suchen und von da aus die nächste Zahl zwischen zwei Spitzen Klammern >32.6< zu suchen.

Hier der Ansatz:

(?<=Temp In)|>([0-9]{1,2}\.[0-9]{1})


Ergebnis:
- Die gewünschte Zahl (32.6) jetzt in dem Reading Temp In.
- Ersetze ich nun "Temp In" durch "Temp Out" bleibt das Ergebnis das gleiche (32.6). Es reicht aus "Te" als Suchkriterium einzugeben um das Ergebnis zu erhalten.
- Den Wert 9.7 erhalte ich in dem ich die Anzahl der Ziffern vor dem Punkt auf 1 setze [0-9]{1,1}

Habe bereits einige Tutorials gelesen, gegoogelt und vieles getestet. Komme jedoch leider nicht weiter. Würde mich über ein paar tipps sehr freuen.

Vielen Dank
Gruß Mirko
FHEM 6.2 auf Intel NUC mit Ubuntu 20.04 LTS
BUSWARE CUL, HM-RC-12, HM-SEC-RHS, HM-WDS30-OT2-SM, HM-ES-PMSw1-DR, CCU3, Sourceforge/hausbus (Beleuchtung + Rolläden + Audio), YAMAHA_AVR

mircoby

Hallo zusammen,

ich beziehe mich noch einmal auf meine letzten post, da ich immer noch nicht die passende Lösung gefunden habe.

Die folgenden beiden Regexen funktionieren in einem Online regex tester (https://regex101.com), jedoch nicht im HTTPMOD -> Fehlermeldung: Response didn't match Reading(s)


(?=1007).+?>([0-9]{1,2}\.[0-9]{1})<
(?=1010).+?>([0-9]{1,2}\.[0-9]{1})<


Es wird nach den beiden ids 1007 und 1010 gesucht. Im weiteren Verlauf wird so lange gesucht bis ein Numerischer wert zwischen 2 spitzen Klammern steht und dieser dann in ein reading überführt werden.

Sobald ich diesen Ausdruck als Attribut im HTTPMOD Modul definiere erhalte ich folgende Fehlermeldung im log:

Zitat
2015.04.10 23:15:11 3: hb_WS2300: Response didn't match Reading(s) dummy

Ich vermute einen Fehler in der Syntax der speziellen Regex, denn grundsätzlich läuft HTTPMOD.

Folgende Regex liefert zwar noch nicht den gewünschten Wert, jedoch steht später eine aus dem Buffer Zahl im reading und es gibt keine Fehlermeldung im Log. -> Daraus schließe ich, dass das Modul Grundsätzlich in Ordnung sein sollte!?

(?<=Temp In)|>([0-9]{1,2}\.[0-9]{1})
   

Was mache ich hier falsch?

Vielen Dank vorab für Eure mithilfe.

Gruß Mirko
FHEM 6.2 auf Intel NUC mit Ubuntu 20.04 LTS
BUSWARE CUL, HM-RC-12, HM-SEC-RHS, HM-WDS30-OT2-SM, HM-ES-PMSw1-DR, CCU3, Sourceforge/hausbus (Beleuchtung + Rolläden + Audio), YAMAHA_AVR

hoods

Hallo liebe Gemeinde,

ich scheitere leider an dem gleichen Problem.
Die online regexp Prüfung ist erfolgreich aber fhem meldet "Read response to Update didn't match any Reading(s).

Der HTTP Request liefert:
[ { "oid" : 11365, "label" : "SystemState.Global.Measurement.AcPowerTotal", "type" : "i", "val" : "769", "uitext" : "AC Power", "savetype" : 2, "factor" : 1.000000, "unit" : "W", "portal" : 0, "AutoZero" : 1, "fb" : 1 }, { "oid" : 11470, "label" : "SystemState.Global.Measurement.TemperatureInverter", "type" : "i", "val" : "292", "uitext" : "Inverter temperature", "savetype" : 2, "factor" : 0.100000, "unit" : "°C", "portal" : 2, "AutoZero" : 1, "fb" : 1 } ]

Die regexp für den ersten Wert sieht aktuell so aus:
SystemState.Global.Measurement.AcPowerTotal.*?val" : "([\d\.]+)


Was mache ich falsch?

Viele Grüße,
hoods
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD