Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. E3DC Hauskraftwerk steuern

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

E3DC Hauskraftwerk steuern

Geplant Angeheftet Gesperrt Verschoben JavaScript
3.4k Beiträge 70 Kommentatoren 1.6m Aufrufe 61 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • A Offline
    A Offline
    ArnoD
    schrieb am zuletzt editiert von ArnoD
    #1

    Ich habe dieses Topic eröffnet, um gemeinsam an einer Überschusssteuerung des E3DC Hauskraftwerks in ioBroker zu arbeiten.
    Dankeschön an dieser Stelle an Eberhard und sein Programm E3DC-Control, ohne ihn wäre das alles nicht möglich gewesen.
    Großes Lob und Danke auch an Uli, der den Adapter e3dc-rscp programmiert hat, über den die Steuerung im ioBroker erst möglich wurde.

    Ziel der Steuerung ist:
    Mit der Steuerung soll erreicht werden, dass der Batteriespeicher möglichst schonend geladen wird, um die Lebensdauer zu erhöhen.

    • Speicher soll nie längere Zeit auf 100 % geladen werden oder auf 0 % entladen werden.
    • Möglichst gleichmäßige Ladeleistung beim Laden.
    • PV-Überschuss soll gespeichert werden, um nicht in die 70 % Abriegelung zu kommen.
    • Bei Überschreitung WR Begrenzung soll Überschuss in die Batterie gespeichert werden.

    ioBroker
    Es werden folgende Adapter benötigt:

    • Javascript (NPM-Module: axios, is-it-bst)
    • e3dc-rscp

    Für die View Beispiele in VIS werden noch folgende Adapter benötigt:

    • vis-hqwidgets
    • vis-materialdesign
    • vis-timeandweather

    Beispiel View zum Importieren und das Skript Charge-Control, sowie eine Anleitung findet ihr auf GitHub:
    https://github.com/ArnoD15/iobroker_E3DC

    Einstellbare Parameter:
    Unload: Wenn der SoC Wert der Batterie > Wert „Unload“ ist, wird der Batteriespeicher mit Beginn Solarproduktion bis Beginn Regelzeitraum, auf SOC Wert Parameter "Unload" entladen. Ist Unload < Ladeschwelle wird bis Ladeschwelle geladen und Unload ignoriert.

    Ladeschwelle: Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen. Danach wird bis SOC Wert „Ladeende“ gleichmäßig geladen, mit Ausnahme, wenn die PV-Leistung das Einspeiselimit oder die WR-Maxleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder WR-Limit einhalten zu können. Bei unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird wieder mit neu berechneter Ladeleistung, gleichmäßig bis „Ladeende" geladen. Bei großem Überschuss kann die gleichmäßige Ladeleistung bis auf 0 abgesenkt werden. Parameter "Ladeschwelle" hat Vorrang vor "Unload", d.h. "Unload" wird ignoriert, falls "Ladeschwelle" größer sein sollte als „Unload“.

    Ladeende: SoC Wert Speicher, der zum Ende des Regelzeitraums erreicht werden soll.

    Ladeende2: SoC Wert Speicher, der zum Ende Sommer Ladeende erreicht werden sollten.

    Unterer Ladekorridor: Der „Untere Ladekorridor“ definiert nur den min. Wert, ab dem mit dem Laden der Batterie gestartet wird. Erst wenn die berechnetet Ladeleistung den Wert „unteren Ladekorridor“ übersteigt, wird mit dem Laden der Batterie gestartet.

    Offset Regelbeginn Zeit in hh:mm, die von der Astro Zeit "solarNoon" (höchster Sonnenstand) abgezogen wird.

    Offset Regelende Zeit in hh:mm, die zu der Astro Zeit "solarNoon" (höchster Sonnenstand) dazu addiert wird.

    Offset Ladeende Zeit in hh:mm, die von der Astro Zeit "sunset" (Sonnenuntergang) abgezogen wird.

    70c4baad-fc5b-45bb-8c02-45b0b14f89ea-grafik.png
    Eigenverbrauch: Der geschätzte Eigenverbrauch pro Tag in kWh. Wird für die Überschussberechnung der Prognose verwendet.

    Notstrom min.: Speicherreserve in % bei Wintersonnenwende 21.12

    Notstrom Sockel: min. SOC Wert bei Tag-/Nachtgleiche 21.3./21.9.

    Berechnung Notstrom: 21.12 (Wintersonnenwende) ist der Bezugs-SoC = Wert „Notstrom min“ und wird bis zum 21.3 (Tag-/Nachtgleiche) auf Wert „Notstrom Sockel“ reduziert und bis zum 20.06 (Sommersonnenwende) um ca. weitere 10% reduziert. Ab dem 20.06 (Sommersonnenwende) steigt der Bezugs-SoC wieder bis zum 21.09 (Tag-/Nachtgleiche) auf den Wert „Notstrom Sockel“ und bis zum 21.12 (Wintersonnenwende) auf den Wert „Notstrom min“. Je Monat ändert sich somit der SoC um ca. +- 3,3%. Mit Notstrom min. und Notstrom Sockel kann man eine Dynamische Notstromreserve vorhalten, Vorteil ist, dass der Speicher nicht alle 3 Wochen entladen wird wie bei der Notstromreserve von E3DC.

    Starten wir am 21.12 (Wintersonnenwende) der kürzeste Tag, da wird der Speicher bis auf Notstrom min = 20% entladen.
    Ab jetzt werden die Tage immer länger, bis zum 21.3 (Tag-/Nachtgleiche) wo die Tage und Nächte gleich lang sind.
    Das bedeutet deine Speicherreserve kann immer geringer werden je länger die Tage sind, da ja mehr PV-Leistung zur Verfügung steht. Es wird somit jeden Monat die Speichergrenze um ca.3,33% reduziert bis zum 21.03 auf den Wert Notstrom Sockel = 10%.

    Ab dem 21.03 werden die Tage immer länger bis zum 20.06 (Sommersonnenwende) dem längsten Tag im Jahr.
    Es wird also die Speichergrenze weiter jeden Monat um ca. 3,33% reduziert bis zum 20.06 auf 0%,
    Ab diesem Zeitpunkt werden die Tage wieder kürzer bis zum 21.9 (Tag-/Nachtgleiche) wo die Tage und Nächte wieder gleich lang sind und die Speicherreserve wird jeden Monat um ca. 3,33% erhöht auf Notstrom Sockel = 10%.
    Die Tage werden immer kürzer bis zum 21.12 (Wintersonnenwende) und die Speichergrenze wird weiter jeden Monat um ca. 3,33% erhöht auf den Wert Notstrom min = 20%

    Notstrom Sockel ist somit der min. SOC Wert, wenn die Tage und Nächte gleich lang sind, also am 21.3 und 21.09 und
    Notstrom min wenn die Tage am kürzesten sind am 21.12 .

    Laderegelung:
    Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen oder bis zum SOC Wert Unload entladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen.

    Mit Start Regelzeitraum wird die benötigte Ladeleistung berechnet, um den SOC Ladeende bis zum Ende Regelzeitraum zu erreichen.

    Bei Überschreitung der Zeit, Ende Regelzeitraum wird die benötigte Ladeleistung neu berechnet, um den SOC Ladeende2 bis zur Zeit Ladeende zu erreichen.

    Wenn die Zeit Ladeende erreicht ist und die Batterie noch nicht den SOC Ladeende2 erreicht hat, wird das Laden mit maximal noch zur Verfügung stehender PV-Leistung freigegeben.

    Ausnahme: Wenn die PV-Leistung das Einspeiselimit oder die maximale Wechselrichterleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder die maximale Wechselrichterleistung einhalten zu können. Bei Unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird mit neu berechneter Ladeleistung, gleichmäßig geladen.

    smartboartS S N 19 Antworten Letzte Antwort
    3
    • A ArnoD

      Ich habe dieses Topic eröffnet, um gemeinsam an einer Überschusssteuerung des E3DC Hauskraftwerks in ioBroker zu arbeiten.
      Dankeschön an dieser Stelle an Eberhard und sein Programm E3DC-Control, ohne ihn wäre das alles nicht möglich gewesen.
      Großes Lob und Danke auch an Uli, der den Adapter e3dc-rscp programmiert hat, über den die Steuerung im ioBroker erst möglich wurde.

      Ziel der Steuerung ist:
      Mit der Steuerung soll erreicht werden, dass der Batteriespeicher möglichst schonend geladen wird, um die Lebensdauer zu erhöhen.

      • Speicher soll nie längere Zeit auf 100 % geladen werden oder auf 0 % entladen werden.
      • Möglichst gleichmäßige Ladeleistung beim Laden.
      • PV-Überschuss soll gespeichert werden, um nicht in die 70 % Abriegelung zu kommen.
      • Bei Überschreitung WR Begrenzung soll Überschuss in die Batterie gespeichert werden.

      ioBroker
      Es werden folgende Adapter benötigt:

      • Javascript (NPM-Module: axios, is-it-bst)
      • e3dc-rscp

      Für die View Beispiele in VIS werden noch folgende Adapter benötigt:

      • vis-hqwidgets
      • vis-materialdesign
      • vis-timeandweather

      Beispiel View zum Importieren und das Skript Charge-Control, sowie eine Anleitung findet ihr auf GitHub:
      https://github.com/ArnoD15/iobroker_E3DC

      Einstellbare Parameter:
      Unload: Wenn der SoC Wert der Batterie > Wert „Unload“ ist, wird der Batteriespeicher mit Beginn Solarproduktion bis Beginn Regelzeitraum, auf SOC Wert Parameter "Unload" entladen. Ist Unload < Ladeschwelle wird bis Ladeschwelle geladen und Unload ignoriert.

      Ladeschwelle: Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen. Danach wird bis SOC Wert „Ladeende“ gleichmäßig geladen, mit Ausnahme, wenn die PV-Leistung das Einspeiselimit oder die WR-Maxleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder WR-Limit einhalten zu können. Bei unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird wieder mit neu berechneter Ladeleistung, gleichmäßig bis „Ladeende" geladen. Bei großem Überschuss kann die gleichmäßige Ladeleistung bis auf 0 abgesenkt werden. Parameter "Ladeschwelle" hat Vorrang vor "Unload", d.h. "Unload" wird ignoriert, falls "Ladeschwelle" größer sein sollte als „Unload“.

      Ladeende: SoC Wert Speicher, der zum Ende des Regelzeitraums erreicht werden soll.

      Ladeende2: SoC Wert Speicher, der zum Ende Sommer Ladeende erreicht werden sollten.

      Unterer Ladekorridor: Der „Untere Ladekorridor“ definiert nur den min. Wert, ab dem mit dem Laden der Batterie gestartet wird. Erst wenn die berechnetet Ladeleistung den Wert „unteren Ladekorridor“ übersteigt, wird mit dem Laden der Batterie gestartet.

      Offset Regelbeginn Zeit in hh:mm, die von der Astro Zeit "solarNoon" (höchster Sonnenstand) abgezogen wird.

      Offset Regelende Zeit in hh:mm, die zu der Astro Zeit "solarNoon" (höchster Sonnenstand) dazu addiert wird.

      Offset Ladeende Zeit in hh:mm, die von der Astro Zeit "sunset" (Sonnenuntergang) abgezogen wird.

      70c4baad-fc5b-45bb-8c02-45b0b14f89ea-grafik.png
      Eigenverbrauch: Der geschätzte Eigenverbrauch pro Tag in kWh. Wird für die Überschussberechnung der Prognose verwendet.

      Notstrom min.: Speicherreserve in % bei Wintersonnenwende 21.12

      Notstrom Sockel: min. SOC Wert bei Tag-/Nachtgleiche 21.3./21.9.

      Berechnung Notstrom: 21.12 (Wintersonnenwende) ist der Bezugs-SoC = Wert „Notstrom min“ und wird bis zum 21.3 (Tag-/Nachtgleiche) auf Wert „Notstrom Sockel“ reduziert und bis zum 20.06 (Sommersonnenwende) um ca. weitere 10% reduziert. Ab dem 20.06 (Sommersonnenwende) steigt der Bezugs-SoC wieder bis zum 21.09 (Tag-/Nachtgleiche) auf den Wert „Notstrom Sockel“ und bis zum 21.12 (Wintersonnenwende) auf den Wert „Notstrom min“. Je Monat ändert sich somit der SoC um ca. +- 3,3%. Mit Notstrom min. und Notstrom Sockel kann man eine Dynamische Notstromreserve vorhalten, Vorteil ist, dass der Speicher nicht alle 3 Wochen entladen wird wie bei der Notstromreserve von E3DC.

      Starten wir am 21.12 (Wintersonnenwende) der kürzeste Tag, da wird der Speicher bis auf Notstrom min = 20% entladen.
      Ab jetzt werden die Tage immer länger, bis zum 21.3 (Tag-/Nachtgleiche) wo die Tage und Nächte gleich lang sind.
      Das bedeutet deine Speicherreserve kann immer geringer werden je länger die Tage sind, da ja mehr PV-Leistung zur Verfügung steht. Es wird somit jeden Monat die Speichergrenze um ca.3,33% reduziert bis zum 21.03 auf den Wert Notstrom Sockel = 10%.

      Ab dem 21.03 werden die Tage immer länger bis zum 20.06 (Sommersonnenwende) dem längsten Tag im Jahr.
      Es wird also die Speichergrenze weiter jeden Monat um ca. 3,33% reduziert bis zum 20.06 auf 0%,
      Ab diesem Zeitpunkt werden die Tage wieder kürzer bis zum 21.9 (Tag-/Nachtgleiche) wo die Tage und Nächte wieder gleich lang sind und die Speicherreserve wird jeden Monat um ca. 3,33% erhöht auf Notstrom Sockel = 10%.
      Die Tage werden immer kürzer bis zum 21.12 (Wintersonnenwende) und die Speichergrenze wird weiter jeden Monat um ca. 3,33% erhöht auf den Wert Notstrom min = 20%

      Notstrom Sockel ist somit der min. SOC Wert, wenn die Tage und Nächte gleich lang sind, also am 21.3 und 21.09 und
      Notstrom min wenn die Tage am kürzesten sind am 21.12 .

      Laderegelung:
      Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen oder bis zum SOC Wert Unload entladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen.

      Mit Start Regelzeitraum wird die benötigte Ladeleistung berechnet, um den SOC Ladeende bis zum Ende Regelzeitraum zu erreichen.

      Bei Überschreitung der Zeit, Ende Regelzeitraum wird die benötigte Ladeleistung neu berechnet, um den SOC Ladeende2 bis zur Zeit Ladeende zu erreichen.

      Wenn die Zeit Ladeende erreicht ist und die Batterie noch nicht den SOC Ladeende2 erreicht hat, wird das Laden mit maximal noch zur Verfügung stehender PV-Leistung freigegeben.

      Ausnahme: Wenn die PV-Leistung das Einspeiselimit oder die maximale Wechselrichterleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder die maximale Wechselrichterleistung einhalten zu können. Bei Unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird mit neu berechneter Ladeleistung, gleichmäßig geladen.

      smartboartS Offline
      smartboartS Offline
      smartboart
      schrieb am zuletzt editiert von
      #2

      @ArnoD sau geil.... Hatte schon die S10EPro bestellt soll im juni kommen.. Konnte noch switchen weil im Juli die infinity Version raus kommt... Toll das es schon WAs gibt..

      1 Antwort Letzte Antwort
      0
      • A Offline
        A Offline
        ArnoD
        schrieb am zuletzt editiert von
        #3

        Hallo smartboart :-)
        Das freut mich das du dann auch ein E3DC Speicher hast.
        Können ja dann wieder gemeinsam optimieren.

        smartboartS 1 Antwort Letzte Antwort
        0
        • A ArnoD

          Hallo smartboart :-)
          Das freut mich das du dann auch ein E3DC Speicher hast.
          Können ja dann wieder gemeinsam optimieren.

          smartboartS Offline
          smartboartS Offline
          smartboart
          schrieb am zuletzt editiert von smartboart
          #4

          @ArnoD ja Freue mich schon drauf...morgen kommen die panels und alles was aufs Dach muss... Kann mir dann mit der Montage bis Juli Zeit lassen...kabelwege habe ich schon ausgebaut und den Verteiler hab ich auch schon umgebaut... . Hoffe der 52 MW Deckel ist dann noch nicht erreicht...
          Bin dann mal neugierig wie du das visualisiert hast....
          Hab dann ja noch so einiges aufzuholen..

          1 Antwort Letzte Antwort
          0
          • smartboartS Offline
            smartboartS Offline
            smartboart
            schrieb am zuletzt editiert von
            #5

            @ArnoD sagte in E3DC Hauskraftwerk steuern:

            Hallo Arno,
            warum benutzt du das proplantascript? Geben die Wetteradapter z.B das Wetter, die nötigen states nicht her oder sind dir die Daten zu ungenau?
            das script von github läuft bei mir noch nicht...
            Das Wetter liefert Daten zum Bewölkungsgrad stündlich...

            1 Antwort Letzte Antwort
            0
            • A Offline
              A Offline
              ArnoD
              schrieb am zuletzt editiert von
              #6

              Habe den Adapter das Wetter ehrlich gesagt nicht probiert.
              Kann man sich da die Globalstrahlung ausgeben lassen?
              Das ist eigentlich der wichtigste Wert, den ich benötige. Die Bewölkung sagt leider nichts über die PV-Leistung aus, es kann an einem leicht bewölkten Tag sogar eine höhere PV-Leistung rauskommen, wegen der Reflexion der Wolken.

              1 Antwort Letzte Antwort
              0
              • A Offline
                A Offline
                ArnoD
                schrieb am zuletzt editiert von ArnoD
                #7

                Beispiel View ModBus Daten vom E3DC:

                vis1.png

                Modbus.txt

                Das Hintergrund Bild muss natürlich jeder auf seine PV-Anlage anpassen.

                View E3DC-Control: Stand 04.10.2020

                E3DC-Control.png
                view-e3dc-control.txt

                View Modbus: Stand 25.06.2020
                Mit dem neuen Update der Modbus Schnittstelle ist es möglich die Leistung der drei Phasen auszulesen.

                Modbus.png
                Modbus.txt

                View Prognose: Stand 30.08.2020
                Ab der Scriptversion 0.1.8 habe ich einen JSON String erstellt für die Darstellung der Prognose mit dem Widget Materialdesign-Json Chart.

                Prognose.png
                view-Prognose.txt

                smartboartS Basti97B 2 Antworten Letzte Antwort
                0
                • A ArnoD

                  Beispiel View ModBus Daten vom E3DC:

                  vis1.png

                  Modbus.txt

                  Das Hintergrund Bild muss natürlich jeder auf seine PV-Anlage anpassen.

                  View E3DC-Control: Stand 04.10.2020

                  E3DC-Control.png
                  view-e3dc-control.txt

                  View Modbus: Stand 25.06.2020
                  Mit dem neuen Update der Modbus Schnittstelle ist es möglich die Leistung der drei Phasen auszulesen.

                  Modbus.png
                  Modbus.txt

                  View Prognose: Stand 30.08.2020
                  Ab der Scriptversion 0.1.8 habe ich einen JSON String erstellt für die Darstellung der Prognose mit dem Widget Materialdesign-Json Chart.

                  Prognose.png
                  view-Prognose.txt

                  smartboartS Offline
                  smartboartS Offline
                  smartboart
                  schrieb am zuletzt editiert von smartboart
                  #8

                  @ArnoD wow cool...hast du an einem Tracker 2 Strings x 13 Panels? Ist dann nicht der Strom zu hoch für die S10E Pro? Was hastn für panels?
                  Frage weil ich das auch erst so machen wollte um mir den 2 Tracker offen zu halten.
                  Der E3DC konfigurator meckert dann aber bei meinen panels...

                  Die Globalstrahlung leider nicht...

                  A 1 Antwort Letzte Antwort
                  0
                  • M Offline
                    M Offline
                    manu96
                    schrieb am zuletzt editiert von
                    #9

                    Moin zusammen,

                    klinke mich mal hier mit ein. Mich würde die Steuerung ebenfalls interessieren um ggf. eine Klimaanlage bei genug Leistung zu aktivieren um den Strom so gut wie möglich selber zu nutzen im Sommer.

                    LG,
                    Manuel

                    A 1 Antwort Letzte Antwort
                    0
                    • smartboartS smartboart

                      @ArnoD wow cool...hast du an einem Tracker 2 Strings x 13 Panels? Ist dann nicht der Strom zu hoch für die S10E Pro? Was hastn für panels?
                      Frage weil ich das auch erst so machen wollte um mir den 2 Tracker offen zu halten.
                      Der E3DC konfigurator meckert dann aber bei meinen panels...

                      Die Globalstrahlung leider nicht...

                      A Offline
                      A Offline
                      ArnoD
                      schrieb am zuletzt editiert von
                      #10

                      @smartboart
                      Als Modul habe ich die Vitovolt 300 M300PB von Viessmann der Strom ist nach dem Konfigurator von E3DC nicht zu hoch.
                      Das hängt natürlich von den verwendeten Modulen ab.

                      1 Antwort Letzte Antwort
                      0
                      • M manu96

                        Moin zusammen,

                        klinke mich mal hier mit ein. Mich würde die Steuerung ebenfalls interessieren um ggf. eine Klimaanlage bei genug Leistung zu aktivieren um den Strom so gut wie möglich selber zu nutzen im Sommer.

                        LG,
                        Manuel

                        A Offline
                        A Offline
                        ArnoD
                        schrieb am zuletzt editiert von
                        #11

                        @manu96
                        Hallo Manuel,
                        die Steuerung von Eberhard, steuert "nur" die Ladung der Batterie, um zu verhindern, dass man in die 70% Abregelung kommt und somit Leistung verliert.
                        Ist fast wie der Versuch von E3DC mit der Wetterprognose, dass zu verhindern, nur das Eberhards Steuerung einfach besser und zuverlässiger funktioniert.
                        Der zweite große Vorteil ist das durch die gleichmäßige Ladung und nicht ganz vollladen der Batterie diese geschont wird und somit länger halten sollte.

                        1 Antwort Letzte Antwort
                        0
                        • A Offline
                          A Offline
                          ArnoD
                          schrieb am zuletzt editiert von ArnoD
                          #12

                          Habe einige Fehler korrigiert damit das Script soweit läuft.
                          Es ist aber noch verbesserungswürdig und liest manchmal die Daten nicht aus.
                          Leider konnte ich den Fehler noch nicht finden da das nur sehr selten passiert.
                          Muss was mit einer Daten Type Änderung von einem Wert auf der Homepage von Proplanta zu tun habe.
                          Typescript Proplanta um die Wetterdaten auszulesen:

                          // ########################################################################################################
                          // Proplanta Wetter auswerten
                          // Version 1.0 - alpha
                          //########################################################################################################
                          // @ts-check
                          "use strict";
                          /// <reference types="node" />
                          /// <reference types="iobJS" />
                          /// <reference types="myOwn" />
                          ///< script> var exports = {}; < / script>
                          
                          //based on: https://svn.fhem.de/fhem/trunk/fhem/FHEM/59_PROPLANTA.pm
                          //https://github.com/ioBroker/AdapterRequests/issues/87
                          
                          /**************************************************************************************************
                          * Initiale Optionen
                          **************************************************************************************************/
                          //Welcher Ort soll abgefragt werden?
                          let country: string = "de"; //at, ch, fr, it
                          let ort: string = "xxxxxxxxxxxxxxxx";
                          let plz: string = "xxxxx"; //eventuell kann hier auch der Ortsname verwendet werden
                          
                          //Wo sollen die Daten abgelegt werden?
                          let ppBaseObjPath: string = 'javascript.' + instance + '.wetter.proplanta';
                          
                          /**************************************************************************************************
                          * TypeScript Definitionen
                          **************************************************************************************************/
                          //import request = require("request");
                          
                          type stateValueType = "number" | "text" | "image" | "textBool" | "textList";
                          
                          interface iRequestOptions {
                          		url: string;
                          		headers: any;
                          }
                          /**************************************************************************************************
                          * Lokale Definitionen
                          **************************************************************************************************/
                          let baseUrls = {
                                  "de" : "https://www.proplanta.de/Wetter/profi-wetter.php?SITEID=60&PLZ=#PLZ#&STADT=#ORT#&WETTERaufrufen=stadt&Wtp=&SUCHE=Wetter&wT=",
                                  "at" : "https://www.proplanta.de/Wetter-Oesterreich/profi-wetter-at.php?SITEID=70&PLZ=#PLZ#&STADT=#ORT#&WETTERaufrufen=stadt&Wtp=&SUCHE=Wetter&wT=",
                                  "ch" : "https://www.proplanta.de/Wetter-Schweiz/profi-wetter-ch.php?SITEID=80&PLZ=#PLZ#&STADT=#ORT#&WETTERaufrufen=stadt&Wtp=&SUCHE=Wetter&wT=",
                                  "fr" : "https://www.proplanta.de/Wetter-Frankreich/profi-wetter-fr.php?SITEID=50&PLZ=#PLZ#&STADT=#ORT#&WETTERaufrufen=stadt&Wtp=&SUCHE=Wetter-Frankreich&wT=",
                                  "it" : "https://www.proplanta.de/Wetter-Italien/profi-wetter-it.php?SITEID=40&PLZ=#PLZ#&STADT=#ORT#&WETTERaufrufen=stadt&Wtp=&SUCHE=Wetter-Italien&wT=",
                              };
                          
                              
                          const intensity = {
                              "keine" : 0,
                              "nein" : 0,
                              "gering" : 1,
                              "leicht" : 1,
                              "ja" : 1,
                              "mäßig" : 2,
                              "m&auml;&szlig;ig" : 2,
                              "stark" : 3,
                          }
                          
                          const timeObjs = [{
                              id: '00Uhr',
                              name:'0 Uhr',
                              search:'0|',
                          },{
                              id: '03Uhr',
                              name:'3 Uhr',
                              search:'3|',
                          },{
                              id: '06Uhr',
                              name:'6 Uhr',
                              search:'6|',
                          },{
                              id: '09Uhr',
                              name:'9 Uhr',
                              search:'9|',
                          },{
                              id: '12Uhr',
                              name:'12 Uhr',
                              search:'12|',
                          },{
                              id: '15Uhr',
                              name:'15 Uhr',
                              search:'15|',
                          },{
                              id: '18Uhr',
                              name:'18 Uhr',
                              search:'18|',
                          },{
                              id: '21Uhr',
                              name:'21 Uhr',
                              search:'21|',
                          }];
                          
                          /**************************************************************************************************
                          * generische Funktionen
                          **************************************************************************************************/
                          
                          function stripTagSpecial(data:string):string {
                              //entfernt allt tags, bei img tags, lässt es die srcr stehen:
                              data = data.replace(/(<script(.|\n|\r)+?(?=<\/sc)<\/script>|<style(.|\n|\r)+?(?=<\/)<\/style>)/ig, "");
                              //data = data.replace( /((\.gif|\.png|\.jpg|\.jpeg|\.ico|\.bmp|\.xbm|\.pdf|\.svg|\.tif|\.tiff))([^>]+)>/ig,
                              data = data.replace( /<img([^>]+)>/ig,
                                  function ($0, $1) {
                                      //logInfo($0,$1);
                                      if ($0.indexOf('symbole/') >0) {
                                          let src = $0.indexOf('src=');
                                          let alt = $0.indexOf('alt=');
                                          if ((alt > -1) && (src > -1)) {
                                              let srcs = $0.substring(src + 5).split(/["']/)[0];
                                              let altss = $0.substring(alt + 5).split(/["']/)[0];
                                              return srcs + '##' + altss;
                                          }
                                      }
                                      return ""; //($1 ? $1 + "" : $0)
                                  }
                              );
                              data = data.replace(/(&nbsp;|<([^>]+)>)/ig, '');
                              data = data.replace(/&#48;/g, '0').replace(/&#49;/g, '1').replace(/&#50;/g, '2').replace(/&#51;/g, '3').replace(/&#52;/g, '4').replace(/&#53;/g, '5').replace(/&#54;/g, '6').replace(/&#55;/g, '7').replace(/&#56;/g, '8').replace(/&#57;/g, '9');
                              return data.replace(/&#([^;]+);/g, '');
                              
                          }
                          
                          function stripTables(data:string):string {
                              return data.replace(/<\/tr>/ig, "\n").replace(/<\/table>/ig, "XXTABLEENDXX").replace(/<\/td>/ig, "|");
                          }
                          
                          function getValue(body:string, start:string, end:string):string {
                              let startp:number =body.indexOf(start) + start.length;
                              if (startp >= 0) {
                                  let stopp:number =body.indexOf(end,startp);
                                  if (stopp >=0) {
                                      return body.substring(startp,stopp);
                                  }
                                  return body.slice(startp);   
                              }
                              return '';
                          }
                          
                          function getPart(data:{body:string, text:string}, search:string):void {
                              let searchp:number = data.body.indexOf(search);
                              if (searchp >= 0) {
                                  data.text = data.body.substring(0,searchp);
                                  data.body = data.body.slice(searchp + search.length);
                              }
                          }
                          
                          function addLine(data:{body:string, text:string}, start:string, end:string, id:string, type: stateValueType):string[] {
                              let mvs = getValue(data.text, start, end).split('|');
                          
                              for(let i=0;i<4;i++) {
                                  mySetState('d' + String(i) + '.' + id, mvs[i], type);
                              }
                              return mvs;
                          }
                          
                          function mySetState(id:string, value:string, type: stateValueType){
                              try {
                              if (type === 'number') {
                                  let xValue:any = value.replace(/[^0-9$.,]/g, '').replace(',','.');
                                  //logInfo(ppBaseObjPath + '.' + id,type, value, ' - ',xValue,' - ',Number(xValue));
                                  if (isNaN(xValue)) {
                                      xValue = 0;
                                  }
                                  setState(ppBaseObjPath + '.' + id,Number(xValue));
                              } else if (type === 'image') {
                                  let data = value.split('##');
                                  //logInfo(ppBaseObjPath + '.' + id,type,data);
                                  setState(ppBaseObjPath + '.' + id+'Image', data[0]);
                                  setState(ppBaseObjPath + '.' + id, data[1]);
                              } else if (type === 'textBool') {
                                      let b = (value.trim() == 'ja');
                                      //logInfo(ppBaseObjPath + '.' + id,type,b);
                                      setState(ppBaseObjPath + '.' + id, b);
                              } else if (type === 'textList') {
                                  //logInfo(ppBaseObjPath + '.' + id,type,value);
                                  setState(ppBaseObjPath + '.' + id, intensity[value.trim()]);
                              } else { //if (type === 'text') {
                                  //logInfo(ppBaseObjPath + '.' + id,type,value);
                                  setState(ppBaseObjPath + '.' + id, value.trim());
                              }
                              } catch(err) {
                                  log('can not set '+id +value +type);
                              }
                          }
                          
                          function addBlock(data:{body:string, text:string}, nextend:string, id:string, type: stateValueType) {
                              getPart(data,nextend);
                              //logInfo(id);
                              for(let j=0;j<8;j++) {
                                  addLine(data,timeObjs[j].search, '|\n',timeObjs[j].id + '.' + id, type);
                              }
                          }
                          /**************************************************************************************************
                          * Implementierung
                          **************************************************************************************************/
                          function initializeWetterReadout():void {
                              //logInfo('initialisiere Script ' + name + '!');
                              createState(ppBaseObjPath + '.aktuell.Temperatur', '', false, {
                                  name: 'Temperatur',
                                  type: "number",
                                  role: 'value',
                                  unit: '°C',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Luftdruck', '', false, {
                                  name: 'Luftdruck',
                                  type: "number",
                                  role: 'value',
                                  unit: 'hPa',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Wetterzustand', '', false, {
                                  name: 'Wetterzustand',
                                  type: "string",
                                  role: 'text',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.WetterzustandImage', '', false, {
                                  name: 'Wetterzustand Image',
                                  type: "string",
                                  role: 'text.url',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.relativeFeuchte', '', false, {
                                  name: 'relative Feuchte',
                                  type: "number",
                                  role: 'value',
                                  unit: '%',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Taupunkt', '', false, {
                                  name: 'Taupunkt',
                                  type: "number",
                                  role: 'value',
                                  unit: '°C',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Sichtweite', '', false, {
                                  name: 'Sichtweite',
                                  type: "number",
                                  role: 'value',
                                  unit: 'km',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Wolkenuntergrenze', '', false, {
                                  name: 'Höhe der Wolkenuntergrenze',
                                  type: "number",
                                  role: 'value',
                                  unit: 'm',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Windrichtung', '', false, {
                                  name: 'Windrichtung',
                                  type: "string",
                                  role: 'text',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.WindrichtungImage', '', false, {
                                  name: 'Windrichtung Image',
                                  type: "string",
                                  role: 'text.url',
                                  read: true,
                                  write: false});
                              createState(ppBaseObjPath + '.aktuell.Windgeschwindigkeit', '', false, {
                                  name: 'Windgeschwindigkeit',
                                  type: "number",
                                  role: 'value',
                                  unit: 'km/h',
                                  read: true,
                                  write: false});
                          
                              for(let i=0;i<4;i++) {
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Datum', 0, false, {
                                      name: 'Datum',
                                      type: "string",
                                      role: 'text',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.TemperaturMax', 0, false, {
                                      name: 'maximale Temperatur',
                                      type: "number",
                                      role: 'value',
                                      unit: '°C',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.TemperaturMaxGefuehlt', 0, false, {
                                      name: 'maximale gefühlte Temperatur',
                                      type: "number",
                                      role: 'value',
                                      unit: '°C',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.TemperaturMin', 0, false, {
                                      name: 'minimale Temperatur',
                                      type: "number",
                                      role: 'value',
                                      unit: '°C',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.TemperaturMinGefuehlt', 0, false, {
                                      name: 'minimale gefühlte Temperatur',
                                      type: "number",
                                      role: 'value',
                                      unit: '°C',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.TemperaturMinNacht', 0, false, {
                                      name: 'minimale Temperatur der folgenden Nacht',
                                      type: "number",
                                      role: 'value',
                                      unit: '°C',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.NiederschlagsrisikoTag', 0, false, {
                                      name: 'Niederschlagsrisiko tagsüber',
                                      type: "number",
                                      role: 'value',
                                      unit: '%',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.NiederschlagsrisikoNacht', 0, false, {
                                      name: 'Niederschlagsrisiko nachts',
                                      type: "number",
                                      role: 'value',
                                      unit: '%',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Niederschlagsstunden', 0, false, {
                                      name: 'Niederschlagsstunden',
                                      type: "number",
                                      role: 'value',
                                      unit: 'h',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Bodenfrost', 0, false, {
                                      name: 'Bodenfrost',
                                      type: "boolean",
                                      role: 'value',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Verdunstung', 0, false, {
                                      name: 'Verdunstung',
                                      type: "number",
                                      role: 'value',
                                      read: true,
                                      write: false,
                                      states: {   0: "kein",
                                                  1: "gering",
                                                  2: "mäßig",
                                                  3: "stark"}
                                      });
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Taubildung', 0, false, {
                                      name: 'Taubildung',
                                      type: "number",
                                      role: 'value',
                                      read: true,
                                      write: false,
                                      states: {   0: "kein",
                                                  1: "gering",
                                                  2: "mäßig",
                                                  3: "stark"}
                                  });
                                  createState(ppBaseObjPath + '.d' + String(i) + '.relativeFeuchteTag', '', false, {
                                      name: 'relative Feuchte Tag',
                                      type: "number",
                                      role: 'value',
                                      unit: '%',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.relativeFeuchteNacht', '', false, {
                                      name: 'relative Feuchte Nacht',
                                      type: "number",
                                      role: 'value',
                                      unit: '%',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Sonnenscheindauer', '', false, {
                                      name: 'Sonnenscheindauer',
                                      type: "number",
                                      role: 'value',
                                      unit: '%',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.UV-Index', '', false, {
                                      name: 'UV-Index',
                                      type: "number",
                                      role: 'value',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Globalstrahlung', '', false, {
                                      name: 'Globalstrahlung',
                                      type: "number",
                                      role: 'value',
                                      unit: 'kWh/qm',
                                      read: true,
                                      write: false});
                          
                                  for(let j=0;j<8;j++) {
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Wetterzustand', '', false, {
                                          name: 'Wetterzustand',
                                          type: "string",
                                          role: 'text',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.WetterzustandImage', '', false, {
                                          name: 'Wetterzustand',
                                          type: "string",
                                          role: 'text.url',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Temperaturverlauf', '', false, {
                                          name: 'Temperaturverlauf',
                                          type: "number",
                                          role: 'value',
                                          unit: '°C',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Niederschlagsrisiko', '', false, {
                                          name: 'Niederschlagsrisiko',
                                          type: "number",
                                          role: 'value',
                                          unit: '%',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Niederschlagsmenge', '', false, {
                                          name: 'Niederschlagsmenge',
                                          type: "number",
                                          role: 'value',
                                          unit: 'mm',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Luftfeuchtigkeit', '', false, {
                                          name: 'Relative Luftfeuchtigkeit',
                                          type: "number",
                                          role: 'value',
                                          unit: '%',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Verdunstung', '', false, {
                                          name: 'Verdunstung',
                                          type: "number",
                                          role: 'value',
                                          read: true,
                                          write: false,
                                          states: {   0: "kein",
                                                      1: "gering",
                                                      2: "mäßig",
                                                      3: "stark"}
                                          });
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Bodentemperatur', '', false, {
                                          name: 'Relative Luftfeuchtigkeit',
                                          type: "number",
                                          role: 'value',
                                          unit: '°C',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Bedeckungsgrad', '', false, {
                                          name: 'Bedeckungsgrad des Himmels',
                                          type: "number",
                                          role: 'value',
                                          unit: '%',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Windrichtung', '', false, {
                                          name: 'Windrichtung',
                                          type: "string",
                                          role: 'text',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.WindrichtungImage', '', false, {
                                          name: 'Windrichtung',
                                          type: "string",
                                          role: 'text.url',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.WindrichtungGrad', '', false, {
                                          name: 'WindrichtungGrad',
                                          type: "number",
                                          role: 'value',
                                          unit: '°',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Windgeschwindigkeit', '', false, {
                                          name: 'Windgeschwindigkeit',
                                          type: "number",
                                          role: 'value',
                                          unit: 'km/h',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Windstärke', '', false, {
                                          name: 'Windstärke',
                                          type: "number",
                                          role: 'value',
                                          unit: 'Bft',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Windböen', '', false, {
                                          name: 'Windböen',
                                          type: "number",
                                          role: 'value',
                                          unit: 'km/h',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Luftdruck', '', false, {
                                          name: 'Luftdruck',
                                          type: "number",
                                          role: 'value',
                                          unit: 'hPa',
                                          read: true,
                                          write: false});
                                      createState(ppBaseObjPath + '.d' + String(i) + '.' + timeObjs[j].id + '.Nullgradgrenze', '', false, {
                                          name: 'Luftdruck',
                                          type: "number",
                                          role: 'value',
                                          unit: 'm',
                                          read: true,
                                          write: false});
                                  }
                                  createState(ppBaseObjPath + '.d' + String(i) + '.Niederschlagsmengein24h', '', false, {
                                      name: 'Niederschlagsmenge in 24 Stunden',
                                      type: "number",
                                      role: 'value',
                                      unit: 'mm',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.morgens.Wetterzustand', '', false, {
                                      name: 'Wetterzustand morgens',
                                      type: "string",
                                      role: 'text',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.morgens.WetterzustandImage', '', false, {
                                      name: 'Wetterzustand morgens',
                                      type: "string",
                                      role: 'text.url',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.tagsüber.Wetterzustand', '', false, {
                                      name: 'Wetterzustand tagsüber',
                                      type: "string",
                                      role: 'text',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.tagsüber.WetterzustandImage', '', false, {
                                      name: 'Wetterzustand tagsüber',
                                      type: "string",
                                      role: 'text.url',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.abends.Wetterzustand', '', false, {
                                      name: 'Wetterzustand abends',
                                      type: "string",
                                      role: 'text',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.abends.WetterzustandImage', '', false, {
                                      name: 'Wetterzustand abends',
                                      type: "string",
                                      role: 'text.url',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.nachts.Wetterzustand', '', false, {
                                      name: 'Wetterzustand abends',
                                      type: "string",
                                      role: 'text',
                                      read: true,
                                      write: false});
                                  createState(ppBaseObjPath + '.d' + String(i) + '.nachts.WetterzustandImage', '', false, {
                                      name: 'Wetterzustand abends',
                                      type: "string",
                                      role: 'text.url',
                                      read: true,
                                      write: false});
                              }
                              //initiales lesen
                              readProplantaWetter();
                          }
                          
                          function readProplantaWetter():void {
                              let baseurl =baseUrls[country];
                              if (baseurl == null || typeof baseurl === undefined) {
                                  log('flasche Länderbezeichnung!');
                              }
                              baseurl = baseurl.replace(/#PLZ#/ig, plz).replace(/#ORT#/ig, ort);
                              //logInfo("baseurl=",baseurl);
                              try {
                          		let options:iRequestOptions = {
                          			url: baseurl,
                          			headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'}
                                  };
                                  
                          		request(options, function (error, response, body):void {
                                      if (!error && response.statusCode == 200) {			  // kein Fehler, Inhalt in body
                                          body=body.replace(/(\s*\t|<\s*\/*br\s*>)\s*/g, ' ');
                                          body=body.replace(/(\n|\r)/g, '');
                                          let start:number =body.indexOf('id="table_INHALT_MITTE"');                
                                          if (start>-1) { body=body.slice(start); }
                                          //logInfo('XXX-START-XXX');                
                                          body=stripTagSpecial(stripTables(body));
                                          body=body.replace(/\n\s*(\|\s*)+\n/g, '\n').replace(/\s+\|\s*/g, '|');
                                          //logInfo(body);
                                          //logInfo('XXX-END-XXX');
                                          
                                          let result : {body:string, text:string}
                                          //aktuelles Wetter
                                          start = body.indexOf('Wetter Aktuell|');
                                          if (start > -1) {
                                              result = {
                                                  body:body=body.slice(start),
                                                  text:''
                                              }
                                              getPart(result,'XXTABLEENDXX');//Wetterprognose start
                                              //logInfo('Wetter Aktuell');
                                              mySetState('aktuell.Temperatur',getValue(result.text, 'Temperatur||', '|\n'),'number');
                                              mySetState('aktuell.Luftdruck',getValue(result.text, 'Luftdruck||', '|\n'),'number');
                          
                                              mySetState('aktuell.Wetterzustand',getValue(result.text, 'Wetterzustand||', '|\n'),'image');
                          
                                              mySetState('aktuell.relativeFeuchte',getValue(result.text, 'relative Feuchte||', '|\n'),'number');
                                              mySetState('aktuell.Taupunkt',getValue(result.text, 'Taupunkt||', '|\n'),'number');
                                              mySetState('aktuell.Sichtweite',getValue(result.text, 'Sichtweite||', '|\n'),'number');
                                              mySetState('aktuell.Wolkenuntergrenze',getValue(result.text, 'Wolkenuntergrenze||', '|\n'),'number');
                          
                                              mySetState('aktuell.Windrichtung',getValue(result.text, 'Windrichtung||', '|\n'),'image');
                          
                                              mySetState('aktuell.Windgeschwindigkeit',getValue(result.text, 'Windgeschwindigkeit||', '|\n'),'number');
                          
                                              //logInfo('--',getValue(result.text, 'Temperatur||', '|\n').replace(/\D/g,''),'-- Temperatur');
                                              //logInfo('--',getValue(result.text, 'Luftdruck||', '|\n').replace(/\D/g,''),'-- Luftdruck');
                                              //logInfo('--',getValue(result.text, 'Wetterzustand||', '|\n'),'-- Wetterzustand');
                                              //logInfo('--',getValue(result.text, 'relative Feuchte||', '|\n').replace(/\D/g,''),'-- relative Feuchte');
                                              //logInfo('--',getValue(result.text, 'Taupunkt||', '|\n').replace(/\D/g,''),'-- Taupunkt');
                                              //logInfo('--',getValue(result.text, 'Sichtweite||', '|\n').replace(/\D/g,''),'-- Sichtweite');
                                              //logInfo('--',getValue(result.text, 'Wolkenuntergrenze||', '|\n').replace(/\D/g,''),'-- Wolkenuntergrenze');
                                              //logInfo('--',getValue(result.text, 'Windrichtung||', '|\n'),'-- Windrichtung');
                                              //logInfo('--',getValue(result.text, 'Windgeschwindigkeit||', '|\n').replace(/\D/g,''),'-- Windgeschwindigkeit');
                                          } else {
                                              start = body.indexOf('Wetterprognose');
                                              if (start < 0) {
                                                  throw new Error('auf der Webseite fehlen Daten!!');
                                              }
                                              //logInfo(start);
                                              body=body.slice(start);
                                              result = {
                                                  body:body=body.slice(start),
                                                  text:''
                                              }
                                          }
                                          getPart(result,'Wetterzustand|');//Wetterprognose start
                                          //logInfo('Wetterprognose');
                                          //logInfo(result);
                                          addLine(result, 'Datum|', '|\n', 'Datum', 'text');
                                          addLine(result, 'max. Temperatur|', '|\n', 'TemperaturMax','number');
                                          addLine(result, 'hlte max. Temp.|', '|\n', 'TemperaturMaxGefuehlt','number');
                                          addLine(result, 'min. Temperatur|', '|\n', 'TemperaturMin','number');
                                          addLine(result, 'hlte min. Temp.|', '|\n', 'TemperaturMinGefuehlt','number');
                                          addLine(result, 'Nacht|', '|\n', 'TemperaturMinNacht','number');
                                          addLine(result, 'Niederschlagsrisiko tags�ber|', '|\n', 'NiederschlagsrisikoTag','number');
                                          addLine(result, 'Niederschlagsrisiko nachts|', '|\n', 'NiederschlagsrisikoNacht','number');
                                          addLine(result, 'Niederschlagsstunden|', '|\n', 'Niederschlagsstunden','number');
                                          addLine(result, 'Bodenfrost|', '|\n', 'Bodenfrost', 'textBool');
                                          addLine(result, 'Verdunstung|', '|\n', 'Verdunstung', 'textList');
                                          addLine(result, 'Taubildung|', '|\n', 'Taubildung', 'textList');
                                          addLine(result, 'Feuchte des Tages|', '|\n', 'relativeFeuchteTag','number');
                                          addLine(result, 'Feuchte der Nacht|', '|\n', 'relativeFeuchteNacht','number');
                                          addLine(result, 'Sonnenscheindauer|', '|\n', 'Sonnenscheindauer','number');
                                          addLine(result, 'UV-Index|', '|\n', 'UV-Index','number');
                                          addLine(result, 'Globalstrahlung|', '|\n', 'Globalstrahlung','number');
                          
                                          addBlock(result, 'Temperaturverlauf|', 'Wetterzustand','image');
                                          addLine(result,'morgens|', '|\n','morgens.Wetterzustand','image');
                                          addLine(result,'tags�ber|', '|\n','tagsüber.Wetterzustand','image');
                                          addLine(result,'abends|', '|\n','abends.Wetterzustand','image');
                                          addLine(result,'nachts|', '|\n','nachts.Wetterzustand','image');
                          
                                          addBlock(result, 'Niederschlagsrisiko|', 'Temperaturverlauf','number');
                                          addBlock(result, 'Niederschlagsmenge', 'Niederschlagsrisiko','number');
                          
                                          addBlock(result, 'Relative Luftfeuchtigkeit|', 'Niederschlagsmenge','number');
                                          addLine(result,'in 24 Stunden|', '|\n','Niederschlagsmengein24h','number');
                          
                                          addBlock(result, 'Verdunstung|', 'Luftfeuchtigkeit','number');
                                          addBlock(result, 'Bodentemperatur (in 5 cm H&ouml;he)|', 'Verdunstung','textList');
                                          addBlock(result, 'Bedeckungsgrad des Himmels|', 'Bodentemperatur','number');
                                          addBlock(result, 'Windrichtung Kompass|', 'Bedeckungsgrad','number');
                                          addBlock(result, 'Windrichtung Grad|', 'Windrichtung','image');
                                          addBlock(result, 'Windgeschwindigkeit|', 'WindrichtungGrad','number');
                                          addBlock(result, 'Windst�rke|', 'Windgeschwindigkeit','number');
                                          addBlock(result, 'max. Windb�en|', 'Windstärke','number');
                                          addBlock(result, 'Luftdruck|', 'Windböen','number');
                                          addBlock(result, 'Nullgradgrenze|', 'Luftdruck','number');
                                          addBlock(result, 'Astrodaten|', 'Nullgradgrenze','number');
                                          /*
                                          logInfo('--',getValue(result.body, 'Sonnenaufgang|', '|\n'),'-- Sonnenaufgang');
                                          logInfo('--',getValue(result.body, 'Sonnenuntergang|', '|\n'),'-- Sonnenuntergang');
                                          logInfo('--',getValue(result.body, 'Mondaufgang|', '|\n'),'-- Mondaufgang');
                                          logInfo('--',getValue(result.body, 'Monduntergang|', '|\n'),'-- Monduntergang');
                                          logInfo('--',getValue(result.body, 'D�mmerungsanfang|', '|\n'),'-- Dämmerungsanfang');
                                          logInfo('--',getValue(result.body, 'D�mmerungsende|', '|\n'),'-- Dämmerungsende');
                                          logInfo('--',getValue(result.body, 'Mondphase|', '|\n'),'-- Mondphase');
                                          */
                          			} else {
                          				//logInfo("StatusCode="+response.statusCode);
                          				//logError(error);							   // Error beim Einlesen
                          				log(error,'error');
                          			}
                          		});
                          	} catch (e) {
                          		//logError('Fehler (try) leseWebseite: ' + e);
                          		log('Fehler (try) leseWebseite: ','error');
                          	}
                          }
                          
                          initializeWetterReadout();
                          
                          /*
                           # *  *  * *  *  command to execute
                           # ¦ ¦ ¦ ¦ ¦
                           # ¦ ¦ ¦ ¦ ¦
                           # ¦ ¦ ¦ ¦ +----- day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
                           # ¦ ¦ ¦ +---------- month (1 - 12)
                           # ¦ ¦ +--------------- day of month (1 - 31)
                           # ¦ +-------------------- hour (0 - 23)
                           # +------------------------- min (0 - 59)
                          */
                          schedule({hour: 5, minute: 0}, readProplantaWetter);
                          
                          1 Antwort Letzte Antwort
                          0
                          • A Offline
                            A Offline
                            Abyss
                            schrieb am zuletzt editiert von
                            #13

                            Danke erstmal für die Scripte.
                            Ich wollte mir das jetzt mal einrichten, allerdings im ersten Schritt erstmal nur die Steuerung über die VIS-View.
                            Mir ist aber irgendwie der Zusammenhang noch nicht ganz klar.
                            Ich habe mir jetzt das Javascript angepasst und angelegt, sowie deine View des E3dc-Control.

                            Dort verweisen aber alle Steuerelemente auf "javascript.1.E3DC....."
                            Dein oben hinterlegtes Javascript legt aber alle Objekte unter "0_userdata.0.E3DC-Control" an.
                            Auch ist dort die Rede von mehreren Settings.

                            Fehlt hier noch etwas? Nutzt du für die Steuerung über Vis andere Scripte?

                            Danke schonmal.

                            1 Antwort Letzte Antwort
                            0
                            • A Offline
                              A Offline
                              ArnoD
                              schrieb am zuletzt editiert von
                              #14

                              Hallo Abyss,

                              welches view hast du dir runtergeladen ?
                              Habe es noch mal geprüft, das View E3DC-Control (E3DC-Control View.txt) verwendet die neue ID 0_userdata.0.E3DC-Control.

                              1 Antwort Letzte Antwort
                              0
                              • A Offline
                                A Offline
                                Abyss
                                schrieb am zuletzt editiert von
                                #15

                                Ui, danke für den Hinweis.
                                Hatte die ziemlich nach erstellen des Beitrags heruntergeladen und schon mal vorbereitet.
                                War dann wohl eine alte Version. ;)
                                Grad nochmal neu gemacht, jetzt passen die Datenpunkte....da kann ich lang suchen ;)

                                Der Knopf "Daten lesen" holt jetzt rein die Werte aus den Objekten?
                                Sprich ich muss mir die Werte erst mal alle so einstellen wie ich sie gern hätte und kann sie dann schreiben lassen? Und beim schreiben ändert er auch die e3dc.config.txt ?

                                1 Antwort Letzte Antwort
                                0
                                • A Offline
                                  A Offline
                                  ArnoD
                                  schrieb am zuletzt editiert von ArnoD
                                  #16

                                  Nein, mit "Daten lesen" werden die Werte aus der e3dc.config.txt ausgelesen und unter den entsprechenden States gespeichert.
                                  Erst die Einstellungen so machen wie du sie benötigst, dann wird mit "Daten schreiben" eine neue e3dc.config.txt, mit diesen Werten erstellt.
                                  Erst danach kannst du jederzeit mit "Daten lesen" die einmal abgespeicherten Werte wieder herstellen oder mit "Daten schreiben" die Änderungen speichern.

                                  1 Antwort Letzte Antwort
                                  0
                                  • A Offline
                                    A Offline
                                    Abyss
                                    schrieb am zuletzt editiert von
                                    #17

                                    Danke für die Aufklärung.
                                    Hatte gleich am Anfang versucht mit dem "Daten lesen" die bestehende Config einzulesen, was allerdings nicht funktioniert hat.
                                    Aber dann passt es ja jetzt.
                                    Macht das Anpassen der einzelnen Werte deutlich komfortabler!!

                                    Und mit dem Schalter "Automatik" aktiviert man dann vermutlich die Prognose von Proplanta? sprich dann werden die config Werte dynamisch angepasst?

                                    S 1 Antwort Letzte Antwort
                                    0
                                    • A Offline
                                      A Offline
                                      ArnoD
                                      schrieb am zuletzt editiert von
                                      #18

                                      Richtig.
                                      Es werden die werte Globalstrahlung von Proplanta und Forecast abgerufen.
                                      Von den beiden Prognosen wird der niedrigere Wert verwendet, habe bei mir festgestellt, dass so die Prognose ziemlich genau zutrifft bis auf ein paar Ausreiser.
                                      Bei klarem Himmel im Sommer hat meine PV- Anlage nie über 100 kWh pro Tag geliefert, so das ich als "nMaxPvLeistungTag_kWh" 100 eingestellt habe. Wenn die Prognose über 100 kWh ist, wird von 100 kWh ausgegangen und alles darüber ignoriert. Das Gleiche kann man mit "nMinPvLeistungTag_kWh" für die niedrigste PV-Leistung bei stark bewölktem Himmel einstellen. Da ich auch da noch mindestens 12 kWh erreiche, habe ich hier im Script 12 eingetragen.
                                      Aber das muss jeder für sich ermitteln.

                                      1 Antwort Letzte Antwort
                                      0
                                      • A Offline
                                        A Offline
                                        Abyss
                                        schrieb am zuletzt editiert von
                                        #19

                                        Vielen Dank für die Aufklärung.
                                        den Wert für MaxPvLeistung hab ich gefunden und angepasst.
                                        Der Wert "nMinPvLeistung" ist im Javascript aber nicht vorhanden?!?

                                        1 Antwort Letzte Antwort
                                        0
                                        • A Offline
                                          A Offline
                                          ArnoD
                                          schrieb am zuletzt editiert von
                                          #20

                                          Ups, stimmt.
                                          Habe die neue Version noch nicht hochgeladen :-)
                                          Soeben erledigt, Version 0.1.6 ist online.

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          639

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe