Seite 1 von 2

[V3.5.1] Kostal-Wechselrichter per http-API ansprechen

Verfasst: Di Jun 09, 2020 2:11 pm
von Eraser
Ich möchte bei mir gerne ein paar Werte vom PV-Wechselrichter auslesen.
Dieser ist ein Kostal Piko 4.2 (altes Modell).
kostal.jpg

Auf der HTTP-Seite des Wechselrichters bekommt man ohne Einloggen bereits die aktuellen Leistungswerte angezeigt.
Web.png
Diese möchte ich nun aus dieser Seite extrahieren.


HTTP-Seite:

Code: Alles auswählen

<head><style type="text/css">@charset "UTF-8";[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>
   <link rel="icon" href="/assets/favicon.ico">
   <title ng-bind="inverterTypeName + ' <> ' + inverterName" class="ng-binding">PIKO 4.2 &lt;&gt; Photovoltaik</title>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=Edge">
   <!--Deaktivate Chaching to avoid problems-->
   <meta http-equiv="cache-control: private, max-age=0, no-cache" content="no-store">
   <meta http-equiv="expires" content="0">
   <meta http-equiv="pragma" content="no-cache">

   <!-- compiled CSS -->
   <link rel="stylesheet" type="text/css" href="assets/kbApp-1.1.4.css">
   
</head>
<body>
<!-- Loading -->
<div kb-hide-after-init="" class="loader" style="z-index: 3000; display: none;">
   <div class="loader-inner-big">
      <i class="icon-spinner animate-spin"></i>
      <div id="errorMsg"></div>
   </div>
</div>
<!-- Page -->
<div class="kbContainer">
   <div class="kbBanner">
      <div class="kbLogoPrim"></div>
      <div class="kbLogoSec"></div>
      <div class="kbLanguageSelectBar ng-scope" ng-controller="languageSelCtrl">
         <!-- ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)" class="active">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_de_DE"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_en_GB"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_es_ES"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_it_IT"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_fr_FR"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_el_GR"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_pt_PT"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_nl_NL"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_cs_CZ"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_hu_HU"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_zh_HANS"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages --><div ng-repeat="language in languages" class="ng-scope">
            <div kb-language-select-item=""><div id="languageSelectItem">
   <a href="" ng-click="selectLanguage(language)">
      <div ng-class="'img_language_flags_f_' + language" class="img_language_flags_f_pl_PL"></div>
   </a>
</div></div>
         </div><!-- end ngRepeat: language in languages -->
      </div>
   </div>
   <div class="kbPage">
      <div class="kbDivider"></div>
      <div class="kbNav ng-scope" ng-controller="navigationCtrl">
         <kb-navigation nodes="menu" class="ng-isolate-scope"><ul class="ng-scope">
   <!-- ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/home" ng-class="{'active':isActive()}" class="active">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-house"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_289" class="ng-scope">Home</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 --><div ng-if="node.nodes.length > 0" class="ng-scope">
      <a ng-click="toggleCollapse()">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-gauge"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_290" class="ng-scope">Momentanwerte</div>
      </a>
   </div><!-- end ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 --><ul ng-if="node.nodes.length > 0" class="ng-scope" style="display: none;">
      <!-- ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/current-values/pv-generator" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_291" class="ng-scope">PV-Generator</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/current-values/battery" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_200" class="ng-scope">Batterie</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/current-values/home" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_292" class="ng-scope">Haus</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/current-values/grid" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_202" class="ng-scope">Netz</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/current-values/analog-inputs" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_293" class="ng-scope">Analogeingänge</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/current-values/s0-in" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_351" class="ng-scope">S0-Eingang</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --></ul><!-- end ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 --><div ng-if="node.nodes.length > 0" class="ng-scope">
      <a ng-click="toggleCollapse()">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-graph-bar"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_294" class="ng-scope">Statistik</div>
      </a>
   </div><!-- end ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 --><ul ng-if="node.nodes.length > 0" class="ng-scope" style="display: none;">
      <!-- ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/statistics/day" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_311" class="ng-scope">Tag</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/statistics/total" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_312" class="ng-scope">Gesamt</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/statistics/log-data" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_372" class="ng-scope">Logdaten</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --></ul><!-- end ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 --><div ng-if="node.nodes.length > 0" class="ng-scope">
      <a ng-click="toggleCollapse()">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-cog"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_6" class="ng-scope">Einstellungen</div>
      </a>
   </div><!-- end ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 --><ul ng-if="node.nodes.length > 0" class="ng-scope" style="display: none;">
      <!-- ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 --><div ng-if="node.nodes.length > 0" class="ng-scope">
      <a ng-click="toggleCollapse()">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_295" class="ng-scope">Allgemein</div>
      </a>
   </div><!-- end ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 --><ul ng-if="node.nodes.length > 0" class="ng-scope" style="display: none;">
      <!-- ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/general/inverter-name" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_9" class="ng-scope">Wechselrichtername</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/general/date-time" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_11" class="ng-scope">Datum/Uhrzeit</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/general/login" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_315" class="ng-scope">Login</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --></ul><!-- end ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 --><div ng-if="node.nodes.length > 0" class="ng-scope">
      <a ng-click="toggleCollapse()">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_12" class="ng-scope">Kommunikation</div>
      </a>
   </div><!-- end ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 --><ul ng-if="node.nodes.length > 0" class="ng-scope" style="display: none;">
      <!-- ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/communication/inverter-address" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_319" class="ng-scope">Wechselrichter Adresse</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/communication/network" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_320" class="ng-scope">Netzwerk (TCP/IP)</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/communication/rs485" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_321" class="ng-scope">RS485</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/communication/modem" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_373" class="ng-scope">Modem</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --></ul><!-- end ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/portal-configuration" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_15" class="ng-scope">Portalkonfiguration</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/data-logger" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_296" class="ng-scope">Datenlogger</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/overvoltage-protection" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_443" class="ng-scope">Überspannungsschutz</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/generator-configuration" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_421" class="ng-scope">Generatorkonfiguration</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/battery-configuration" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_297" class="ng-scope">Batteriekonfiguration</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/switching-output" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_298" class="ng-scope">Schaltausgang</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/settings/analog-inputs" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_293" class="ng-scope">Analogeingänge</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --></ul><!-- end ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope">
   <!-- ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 --><div ng-if="node.nodes.length > 0" class="ng-scope">
      <a ng-click="toggleCollapse()">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-lightbulb"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_300" class="ng-scope">Info</div>
      </a>
   </div><!-- end ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 --><ul ng-if="node.nodes.length > 0" class="ng-scope" style="display: none;">
      <!-- ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/info/events" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_301" class="ng-scope">Ereignisse</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --><kb-navigation-node ng-repeat="node in node.nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/info/versions" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' -->
         <div translate="ID_302" class="ng-scope">Versionen</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in node.nodes --></ul><!-- end ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope separation">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/login" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-login"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_315" class="ng-scope">Login</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes --><kb-navigation-node ng-repeat="node in nodes" node="node" class="ng-scope ng-isolate-scope"><li ng-show="showNode(node.options)" ng-class="{separation: node.options.separation}" class="ng-scope ng-hide separation">
   <!-- ngIf: node.nodes.length <= 0 --><div ng-if="node.nodes.length <= 0" class="ng-scope">
      <a href="#/logout" ng-class="{'active':isActive()}">
         <!-- ngIf: node.icon != '' --><i ng-if="node.icon != ''" class="icon-logout"></i><!-- end ngIf: node.icon != '' -->
         <div translate="ID_364" class="ng-scope">Logout</div>
      </a>
   </div><!-- end ngIf: node.nodes.length <= 0 -->

   <!-- ngIf: node.nodes.length > 0 -->

   <!-- ngIf: node.nodes.length > 0 -->
</li></kb-navigation-node><!-- end ngRepeat: node in nodes -->
</ul></kb-navigation>
         <div class="kbLogoSlogan"></div>
      </div>
      <div class="kbContent">
         <div class="kbContentHeading">
            <div class="kbInfo">
               <div class="kbInverter">
                  <span class="inverterType ng-binding"> PIKO 4.2</span>
                  <span class="inverterName ng-binding"> (Photovoltaik)</span>
               </div>
               <div class="kbUserAndDate">
                  <div><i class="icon-calendar"><span class="ng-binding">09.06.20 13:17</span></i></div>
                  <div><i class="icon-user"><span class="ng-binding">Gast</span></i></div>
               </div>
            </div>
            <div class="kbNavTitle ng-scope" ng-controller="navigationCtrl">
               <kb-navigation-breadcrumb breadcrumbs="breadcrumbs" class="ng-isolate-scope"><div class="breadcrumb">
   <div class="breadcrumbAnchor"></div>
   <!-- ngRepeat: node in breadcrumbs --><div ng-repeat="node in breadcrumbs" class="ng-scope">
      <p class="breadcrumbItem ng-scope" translate="ID_289">Home</p>

      <div ng-class="{'breadcrumbSeparator':!$last}"></div>
   </div><!-- end ngRepeat: node in breadcrumbs -->
</div></kb-navigation-breadcrumb>
            </div>
         </div>
         <div class="kbContentView">
            <div ng-show="appPageInfo.loadingInProgress" class="loader ng-hide" style="z-index: 2000">
               <div class="loader-inner">
                  <i class="icon-spinner animate-spin"></i>
               </div>
            </div>
            <div ng-show="appPageInfo.loadingFailed" class="loader ng-hide" style="z-index: 2000">
               <div class="loader-inner">
                  <i class="icon-error"></i>
               </div>
            </div>
            <div ng-show="appPageInfo.submitInProgress" class="loader-transparent ng-hide" style="z-index: 2000">
               <div class="loader-inner">
                  <i class="icon-spinner animate-spin"></i>
               </div>
            </div>
            <!-- ngView:  --><div class="kbView ng-scope" ng-view=""><form name="form" novalidate="" class="ng-pristine ng-valid ng-scope">
   
   <fieldset>
      <legend translate="ID_31" class="ng-scope">Leistungswerte</legend>
      
      <div class="row">
         <label translate="ID_1" class="ng-scope">DC-Eingang Gesamt</label><div class="value ng-binding">781,4W</div>
      </div>
      
      <div class="row">
         <label translate="ID_34" class="ng-scope">Ausgangsleistung</label><div class="value ng-binding">733,5W</div>
      </div>
      
      <!-- ngIf: appIsMatchingProperties("EXT_CURRENT_SENS") --><div class="row ng-scope" ng-if="appIsMatchingProperties(&quot;EXT_CURRENT_SENS&quot;)">
         <label translate="ID_273" class="ng-scope">Eigenverbrauch</label><div class="value ng-binding">0,3W</div>
      </div><!-- end ngIf: appIsMatchingProperties("EXT_CURRENT_SENS") -->
   </fieldset>
   
   <!-- ngIf: appIsMatchingProperties("BATTERY") -->
   
   <fieldset>
      <legend translate="ID_49" class="ng-scope">Status</legend>
      
      <div class="row">
         <label translate="ID_388" class="ng-scope">Betriebsstatus</label><div class="value ng-binding">Einspeisen (MPP)</div>
      </div>
   </fieldset>
</form></div>
            <div class="kbViewInfo ng-hide" ng-show="appPageInfo.submitSuccessful || appPageInfo.submitFailed">
               <div ng-show="appPageInfo.submitSuccessful" class="ng-hide">
                  <i class="icon-ok info-ok ng-binding"></i>
               </div>
               <div ng-show="appPageInfo.submitFailed" class="ng-hide">
                  <i class="icon-error info-error ng-binding"></i>
               </div>
            </div>
         </div>
      </div>
   </div>
   <div class="kbFooter">
      <div class="kbWebversion">v1.1.4</div>
   </div>
</div>

<!-- compiled JavaScript -->
<script type="text/javascript" src="assets/kbApp-1.1.4.js"></script>


</body>
Mir geht es dabei um die zwei Leistungswerte in Watt und den aktuellen Betriebsmodus:
Unbenannt.png

Ein direkter Login mit http://user:password@192.168.1.30 ist bei dieser Seite anscheinend nicht möglich, was toll wäre, denn man würde dann noch mehr Daten rausbekommen. Aber die aktuellen Werte wäre schon mal ein guter Anfang.

Re: Kostal-Wechselrichter

Verfasst: Do Jun 24, 2021 4:34 pm
von ms20de
Hallo Wolfgang,

kann der nichts mit JSON? Das HTML auswerten ist immer unschön.
In Internet habe ich was mit
http://${HOSTNAME}/api/dxs.json gefunden.

Viele Grüße,
Matthias

Re: Kostal-Wechselrichter

Verfasst: Fr Jun 25, 2021 1:09 pm
von Eraser
Hallo Matthias

Der Beitrag von mir ist schon etwas älter, habe es nun seit ein paar Monaten eh per JSON in NodeRed gemacht und funktioniert einwandfrei.
Danke für deine Antwort.

Re: Kostal-Wechselrichter

Verfasst: Fr Jun 25, 2021 3:26 pm
von StefanW
Hallo Wolfgang,

Am Thema Web-API mit JSON arbeiten wir und daher wäreN Details interessant für uns gewesen

Lg

Stefan

Re: Kostal-Wechselrichter

Verfasst: Fr Jun 25, 2021 9:04 pm
von Eraser
Hallo Stefan,

folgend die Infos zur Abfrage:

URL:

Code: Alles auswählen

http://192.168.1.30/api/dxs.json?&dxsEntries=33555202&dxsEntries=33555201&dxsEntries=33555203&dxsEntries=33555458&dxsEntries=33555457&dxsEntries=33555459&dxsEntries=33556736&dxsEntries=67109378&dxsEntries=67109377&dxsEntries=67109379&dxsEntries=67109634&dxsEntries=67109633&dxsEntries=67109635&dxsEntries=67109890&dxsEntries=67109889&dxsEntries=67109891&dxsEntries=67109120&dxsEntries=67110400&dxsEntries=67110656&dxsEntries=67110144&dxsEntries=251658754&dxsEntries=251658753&dxsEntries=251658496&dxsEntries=16780032

Mit den verschiedenen dxsEntries definiert man welche Werte man erhalten möchte.

Das bekommt man dann zurück:

Code: Alles auswählen

{"dxsEntries":[{"dxsId":33555202,"value":0.000000},{"dxsId":33555201,"value":0.000000},{"dxsId":33555203,"value":0.000000},{"dxsId":33555458,"value":0.000000},{"dxsId":33555457,"value":0.000000},{"dxsId":33555459,"value":0.000000},{"dxsId":33556736,"value":0.000000},{"dxsId":67109378,"value":0.000000},{"dxsId":67109377,"value":0.000000},{"dxsId":67109379,"value":0.000000},{"dxsId":67109634,"value":0.000000},{"dxsId":67109633,"value":0.000000},{"dxsId":67109635,"value":0.000000},{"dxsId":67109890,"value":0.000000},{"dxsId":67109889,"value":0.000000},{"dxsId":67109891,"value":0.000000},{"dxsId":67109120,"value":0.000000},{"dxsId":67110400,"value":0.000000},{"dxsId":67110656,"value":1.000000},{"dxsId":67110144,"value":100.000000},{"dxsId":251658754,"value":15442.085938},{"dxsId":251658753,"value":2904.166016},{"dxsId":251658496,"value":2808},{"dxsId":16780032,"value":0}],"session":{"sessionId":0,"roleId":0},"status":{"code":0}}
Ich hoffe das hilft euch.

Re: Kostal-Wechselrichter

Verfasst: Do Dez 21, 2023 10:48 am
von hans4711
Könntest du bitte mal Screenshots einstellen wie du das im Timberwolf Server eingestellt hast? Ich habe die Abfrage so im TWS eingestellt, es kommt aber kein Rückgabewert, bin aber leider kein HTTP-API Profi. Vielen Dank und viele Grüße

Re: Kostal-Wechselrichter

Verfasst: Do Dez 21, 2023 12:06 pm
von StefanW
Hallo Mods,

bitte den Betreff des Treads bearbeiten, das ist kein Titel, bei dem jemand was später wiederfindet

Merci

Stefan

Re: [V???] Kostal-Wechselrichter per http-API ansprechen

Verfasst: Do Dez 21, 2023 3:08 pm
von hans4711
Mein Fehler war die https Voreinstellung. Mit http bekomme ich eine Rückmeldung:
Bild
Leider bin ich jetzt völlig überfragt wie ich z.b. folgenden Wert auslesen kann und z.B. in eine Zeitserie speichern kann:
"dxsId": 251658753,
"value": 55616.855469

Kann mir hier bitte jemand weiterhelfen? Vielen Dank und viele Grüße

Re: [V???] Kostal-Wechselrichter per http-API ansprechen

Verfasst: Do Dez 21, 2023 3:27 pm
von gbglace
ist diese dxsId immer konstant und immer an der gleichen relativen Position zu den anderen?

In Dem JSON ist es ein Array in den [] da suchst Du also den 22. Wert und davon den Parameter value.
Wenn die Position bei jedem Abruf eine andere ist, dann wird es hässlich das zu selektieren.

Bei konstanter Anordnung nimm den JSON kopiere den bei BING ins Suchfeld zusammen mit der Frage wie selektiere ich den value zur dxsld 251658753 aus dem obigen JSON. In der Chat-Funktion antwortet Dir dann das Chat-GPT mit der fertigen Code-Zeile für den Selektor.

Re: [V???] Kostal-Wechselrichter per http-API ansprechen

Verfasst: Do Dez 21, 2023 4:08 pm
von hans4711
Danke für deine Hilfe, jetzt klappt es. Bing und http://jsonselector.com/process sagt folgende Schreibweise: ['dxsEntries'][20]['value']
Die TWS Hilfe sagt folgende: dxsEntries[20].value. Diese funktioniert auch, bei o.g. kommt eine Fehlermeldung.

Ist das ein Bug? Ich kann die Objekteinheit und das Format im Nachgang nicht mehr ändern:
Bild

Weiß jemand wann die Sendefilter und die Manipulation der Werte kommt? Ich würde gerne den Wattstundenwert in kwh ausgeben und abspeichern.