Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. E3DC Hauskraftwerk steuern

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    E3DC Hauskraftwerk steuern

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      manu96 last edited by

      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 Reply Last reply Reply Quote 0
      • A
        ArnoD @smartboart last edited by

        @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 Reply Last reply Reply Quote 0
        • A
          ArnoD @manu96 last edited by

          @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 Reply Last reply Reply Quote 0
          • A
            ArnoD last edited by ArnoD

            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);
            
            umbm created this issue in ioBroker/AdapterRequests

            open Proplanta Agrarwetter #87

            1 Reply Last reply Reply Quote 0
            • A
              Abyss last edited by

              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 Reply Last reply Reply Quote 0
              • A
                ArnoD last edited by

                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 Reply Last reply Reply Quote 0
                • A
                  Abyss last edited by

                  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 Reply Last reply Reply Quote 0
                  • A
                    ArnoD last edited by ArnoD

                    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 Reply Last reply Reply Quote 0
                    • A
                      Abyss last edited by

                      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 Reply Last reply Reply Quote 0
                      • A
                        ArnoD last edited by

                        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 Reply Last reply Reply Quote 0
                        • A
                          Abyss last edited by

                          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 Reply Last reply Reply Quote 0
                          • A
                            ArnoD last edited by

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

                            1 Reply Last reply Reply Quote 0
                            • A
                              Abyss last edited by

                              Ich habe gestern das aktuelle Script 0.1.6 hinzugefügt und anschließend die Automatik eingeschalten.
                              Allerdings setzt mir die Automatik auch alle deine Werte, welche bei meiner normalen S10 leider nicht passen.
                              Folgende Werte musste ich manuell zurückändern:

                              • max Ladeleistung (S10 hat hier max. 3000W, wurde aber auf 12000W gesetzt)
                              • min Ladeleistung
                              • oberer Ladekorridor
                              • unterer Ladekorridor
                              • Speichergröße
                              • Einspeiselimit

                              Einspeiselimit und Speichergröße sollten durch die Automatik gar nicht verändert werden. Bei der Ladeleistung und Korridor sollte die verwendete Anlage berücksichtigt werden, oder die Werte auch unverändert bleiben.
                              Ich denke die Hauptsächliche Beeinflussung findet ja sowieso über die Ladezeiten und Ladeende statt, oder?

                              Gruß Abyss 😎

                              1 Reply Last reply Reply Quote 0
                              • A
                                ArnoD last edited by

                                Ich muss noch die Variablen der 5 möglichen Automatikprogramme in den User Bereich eintragen.
                                Hatte das bis jetzt noch nicht erledigt, da ich mit dem Experimentiern der richtigen Einstellung beschäftigt war.
                                Werde ich am Wochenende machen und dann wieder online stellen.
                                Die Parameter Speichergröße und Einspeiselimit werden aber auch benötigt, da man mit diesen die Ladekurve beeinflussen kann.
                                Als Beispiel kann man bei Speichergröße einen geringeren Wert eingeben, um mit einer höheren Ladeleistung beim Regelbegin zu starten und somit eine gleichmäßige Ladekurve zu erreichen.

                                Gruß Arno

                                A 1 Reply Last reply Reply Quote 0
                                • A
                                  Abyss @ArnoD last edited by

                                  @ArnoD
                                  Vielen Dank für die neuen Skripte.
                                  Auch die überarbeiteten Views sind super.
                                  Könntest du die neue View "Prognose History" vielleich noch etwas genauer Beschreiben. Sprich welche Datenpunkte geloggt werden müssen, history oder sourceanalytix etc.
                                  Wäre super, danke!!

                                  1 Reply Last reply Reply Quote 0
                                  • A
                                    ArnoD last edited by ArnoD

                                    Für die Prognose werden die Daten aus dem Script Proplanta, Globalstrahlung D0 und D1 verwendet und aus dem E3DC-Control Script die Prognosewerte von Forecast verwendet. Die tägliche PV-Leistung wird vom SourceAnalytix Adapter Version 0.3.0 (Version 0.4.2 funktioniert aktuell leider noch nicht) berechnet und von meinem Script täglich um 21:00 Uhr ausgelesen und gespeichert.

                                    Aus dem Script Proplanta:
                                    sGlobalstrahlung = 'javascript.0.wetter.proplanta.d0.Globalstrahlung';
                                    sGlobalstrahlungMorgen = 'javascript.0.wetter.proplanta.d1.Globalstrahlung';

                                    mein Script berechnet daraus die Prognose in kWh mit den Variablen "nModulFlaeche" und "nWirkungsgradModule" und speichert diesen Wert im State "PrognoseProp_kWh_datum" mit dem aktuellen Datum ab. Also für heute "PrognoseProp_kWh_28".
                                    Täglich um 5:10 Uhr werden von meinem Script die Prognosewerte von Forecast in W abgerufen und in kWh unter "PrognoseFore_kWh_datum" als Summe täglich gespeichert.Wenn in Vis der Schalter Automatik =true ist wird auch die
                                    Prognose mit Korrekturfaktor berechnet und unter "PronoseAuto_kWh_" täglich gespeichert.
                                    Mit dem Modul Sourceanalytix, wird die PV-Leistung was von der Modbus Schnittstelle übertragen wird, der Tageswert in kWh berechnet.
                                    sPvLeistung_kWh = 'sourceanalytix.0.modbus__0__holdingRegisters__40068_PV_Leistung.delivery.01_current_day';
                                    Diesen Wert lese ich täglich um 21:00 Uhr aus und speichere ihn im State "IstPvLeistung_kWh_datum".

                                    Aus diesen Werten
                                    PronoseAuto_kWh_
                                    IstPvLeistung_kWh_
                                    PrognoseProp_kWh_
                                    PrognoseFore_kWh_
                                    erstellt die Funktion makeJson() einen Json String für das Materialdesign-JSON Chart und Speichert diesen unter dem State "HistoryJSON" ab.
                                    Ab der Script Version 0.1.10 die ich gerade teste, wird der Json String für jedes Monat gespeichert, so das man 1 Jahr zurückverfolgen kann.

                                    1 Reply Last reply Reply Quote 0
                                    • A
                                      Abyss last edited by

                                      Danke für die Erklärung.
                                      hab jetzt mal Sourceanalytix auf 3.0 downgegraded, das Script 0.1.9 eingespielt und die Automatik aktiviert...mal kucken was passiert. 😉

                                      1 Reply Last reply Reply Quote 0
                                      • A
                                        Abyss last edited by

                                        @ArnoD said in E3DC Hauskraftwerk steuern:

                                        Aus dem Script Proplanta:
                                        sGlobalstrahlung = 'javascript.0.wetter.proplanta.d0.Globalstrahlung';
                                        sGlobalstrahlungMorgen = 'javascript.0.wetter.proplanta.d1.Globalstrahlung';

                                        mein Script berechnet daraus die Prognose in kWh mit den Variablen "nModulFlaeche" und "nWirkungsgradModule" und speichert diesen Wert im State "PrognoseProp_kWh_datum" mit dem aktuellen Datum ab. Also für heute "PrognoseProp_kWh_28".
                                        Täglich um 5:10 Uhr werden von meinem Script die Prognosewerte von Forecast in W abgerufen und in kWh unter "PrognoseFore_kWh_datum" als Summe täglich gespeichert.

                                        Muss ich hier noch irgendwo einen Trigger oder Cron setzen damit dies passiert? Mir ist gerade aufgefallen, dass ich nur an dem Tag als ich das Script hinterlegt habe aktuelle Werte bekommen habe und seitdem stehen immer die gleichen Werte in
                                        0_userdata.0.E3DC-Control.Allgemein.PrognoseFore_kWh_heute
                                        0_userdata.0.E3DC-Control.Allgemein.PrognoseProb_kWh_heute

                                        Drum bleibt auch die vis Prognose leer, da ich keine Prognosewerte habe....die PV-Leistung hat er mir gestern schon mal visualisiert.

                                        1 Reply Last reply Reply Quote 0
                                        • A
                                          ArnoD last edited by

                                          Nein , das macht das Script automatisch.
                                          Es muss nur der State Automatik = true sein.
                                          Im Log sollte beim Start dann folgendes stehen:
                                          script.js.common.E3DC_Control: registered 4 subscriptions and 6 schedules

                                          1 Reply Last reply Reply Quote 1
                                          • A
                                            Abyss last edited by

                                            Dann fehlt da wohl etwas.
                                            Ich hab grad das Script nochmal von den Settings angepasst und gespeichert, dann stand das unten im Log:
                                            "javascript.0 (982) script.js.VIS-Script.E3DC-Control: registered 3 subscriptions and 5 schedules"

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            652
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            70
                                            3330
                                            1344639
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo