ioBroker / AdapterRequests

This Place is used to track the status of new Adapter-Requests.
248 stars 36 forks source link

Proplanta Agrarwetter #87

Open umbm opened 6 years ago

umbm commented 6 years ago

Ich weiss, es gibt schon Adapter für's Wetter, aber aus jahrelangen Erfahrungen in fhem muss ich für mich feststellen, dass ich mit den Daten von Proplanta (Agrarwetter) die höchste Trefferquote in den Vorhersagen erhalte. Ein ioBroker-Adapter dafür wäre deshalb genial https://www.proplanta.de/Agrar-Wetter/Deutschland/

Da es das für fhem schon lange gibt, wäre das evtl eine Basis für ioBroker-Anpassung https://svn.fhem.de/fhem/trunk/fhem/FHEM/59_PROPLANTA.pm

Apollon77 commented 6 years ago

Ist irgendeine API verfügbar bzw wie macht es FHEM denn?

umbm commented 6 years ago

Ich bin mir nicht sicher, aber ich denke das fhem-Modul nutzt die normal html-Seite als Quelle, wobei PLZ und Ort übergeben werden, z.B. https://www.proplanta.de/Wetter/profi-wetter.php?SITEID=60&PLZ=10969&STADT=Berlin&WETTERaufrufen=stadt&Wtp=&SUCHE=Wetter&wT=

Apollon77 commented 6 years ago

Hast Du den Parser Adapter versucht?

umbm commented 6 years ago

Für das Problem noch nicht, denn das wäre ein Wust an html-code, der da zurechtgeschnitten werden müsste. Das übersteigt irgendwie meine Möglichkeiten...

Hypnos3 commented 6 years ago

hier ist ein Script (Typescript) zum Auslesen der Wetterdaten:

// ########################################################################################################
// 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 = "Dresden";
let plz: string = "01157"; //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) {
        logError(err,' 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) {
        logError('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("* */3 * * *", readProplantaWetter);

Das ganze hat alpha Status und sicher noch einige Fehler.

Ich verwende bei mir die aktuellste Version des Javascript Adapters vom GitHub. Kann sein, das es daher bei jemand anderes auch generell noch nicht geht (Bsp. Definition von request fehlt oder ähnliches).

Das ganze geht auch nur in Deutschland. Das Script ist zwar für anderes vorbereitet, aber das ist weder getestet, noch kann ich mir vorstellen das es da funktioniert (nicht - deutsche Texte).

Ich habe auch beim entwickeln und testen festgestellt, das manchmal Tabellen fehlen (kurz nach 0 Uhr die Tabelle mit den aktuellen Wetter Daten). Auch haben sich in der letzten Woche Kleinigkeiten auf der Webseite geändert. Daher kann es auch passieren, das dieses Script zeitweise oder überhaupt nicht mehr funktioniert.

Aus diesen Gründen stelle ich das auch noch nicht in das Forum, sondern lasse es erstmal nur für interessierte hier stehen.

umbm commented 6 years ago

Heute nun endlich ein kurzer Test. Nach auskommentieren von Zeile 4 bleibt noch immer diese Fehlermeldung als einziges Ergebnis:

javascript.0 script.js.common.ProPlanta: TypeScript compilation failed: let ppBaseObjPath: string = 'javascript.' + instance + '.wetter.proplanta'; ^ ERROR: Cannot find name 'instance'. logError(err,' can not set ',id,value,type); ^ ERROR: Cannot find name 'logError'. Did you mean 'onerror'? logError('flasche Länderbezeichnung!'); ^ ERROR: Cannot find name 'logError'. Did you mean 'onerror'? request(options, function (error, response, body):void { ^ ERROR: Cannot find name 'request'. Did you mean 'Request'?
--
Hypnos3 commented 6 years ago

Du verwendest wahrscheinlich nicht die aktuellste Version vom Javascript adapter. Bei dir kennt die Typescript definition instance noch nicht.

Du kannst mal die Zeile:

//Wo sollen die Daten abgelegt werden?
let ppBaseObjPath: string = 'javascript.' + instance + '.wetter.proplanta';

ersetzen durch:

//Wo sollen die Daten abgelegt werden?
let ppBaseObjPath: string = 'javascript.0.wetter.proplanta';

Kann allerdings sein das noch mehr nicht geht.

Apollon77 commented 6 years ago

Instance ist aber als Variable immer schon da. Also wenn ist’s nur ne falsche Meldung weil in der typescript Definition das fehlt.

Hypnos3 commented 6 years ago

Ja, das fehlte in der Typescript definition und das scheint noch nicht im stable gelandet zu sein.

Anbima commented 1 month ago

Ist zwar schon etwas älter, aber gibt es mittlerweile einen passenden Adapter oder aktuelles Script für Proplanta?