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

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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Daten aus einer Website mit Javascript

NEWS

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

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

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

Daten aus einer Website mit Javascript

Geplant Angeheftet Gesperrt Verschoben JavaScript
138 Beiträge 16 Kommentatoren 25.2k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • A ArnoD

    @smartboart werde deine Idee aufgreifen. Werd mal ein paar Versuche machen, was da sinnvoll ist. Entweder die Zeit der Anlage oder der Status WLAN von der Anlage. :thinking_face:

    Änderungen:

    • alle Werte von der Schnittstellenbeschreibung, die möglich sind bzw. eine sinnvolle Rückmeldung bei der SC18 liefern, hinzugefügt.
    • Der Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" sollte jetzt nicht mehr auftreten.
      Ich würde aber mit den Abfragezyklen nicht unter 15 sek. gehen, da sonst eine Steuerung über die App nicht mehr möglich ist.
      Die Antwortzeiten der SC18 ligt bei meinem Netzwerk bei 1,5 bis 4,5 sek. so das Abfragen unter 15 sek. wirklich nichts mehr bringen. Ich habe bei mir die Zeit auf 60 sek. eingestellt und ist für mich auch völlig ausreichend.

    Sollte jemand das erste Script bereits gestestet haben, dann vorher den Pfad "Gruenbeck" löschen so das alle states wieder neu angelegt werden.

    Geplante Änderungen:

    • Möglichkeit zum Starten der manuellen Regeneration
    • Vor dem Request prüfen, ob die SC18 online ist (ohne Ping).
    • Automatische Unterscheidung zwischen SC und MC um die richtigen Werte abzufragen.
    • Theoretische Berechnung vom Salzverbrauch integrieren, um eine ungefähre Anzeige in Vis zu ermöglichen.

    Über Rückmeldungen würde ich mich natürlich wie immer freuen.

    /************************************************************************
    Version: 1.6.1  - Nächster Versuch den Fehler "send flag true" abzufangen :-)
                    - State Salzverbrauch gesamt
    Version: 1.6.0  - Formel zum berechnen vom Salzverbrauch
                    - State Salzverbrauch in kg
    Version: 1.5.1  - Optimierung manuelle Regeneration von smartboart übernommen.
    Version: 1.5.0  - Neu State für das auslesen vom Fehlerspeicher hinzugefügt.
                    - zweiter send Befehl nach Änderung vom D_B_1 State unterbunden.
    Version: 1.4.2  - Auslösen einer manuelle Regeneration ist jetzt über Vis möglich
                    - State D_Y_6 für die Softwareversion hinzugefügt.
    Version: 1.4.1  - Fehler "send flag is true" beseitigt.
                    - Fehler in der Zeitsynchronisation beseitigt.
                    - State D_C_5_2 und D_D_2 und D_Y_8_10 entfernt (ohne Funktion bei SC18)
    Version: 1.4.0  - Fehler "send flag is true" sollte nur noch bei manuellen State Änderungen <18 Sek. auftreten.
    Version: 1.3.0  - Automatische Zeit Synchronisation wenn Regenerationszeitpunkt auf "1=fest" eingestellt ist
                    - Bei Änderung der Werte Ansprechverhalten,Regenerationszeitpunkt,Regenerationszeit wird
                      die Änderung an die SC18 gesendet. 
                    - Parameter C_C_5_3 Automatische Umschaltung Sommer-/Winterzeit entfernt (ohne Funktion bei SC18)
    
    Version: 1.2.2 - Konstante für Abfragezyklus eingefügt
    Version: 1.2.1 - Timeout Variable eingefügt
    Version: 1.2.0 - Änderung:Nur noch eine Abfrage wo alle Werte abgefragt werden.
    Version: 1.1.0 - Fehler korrigiert das bei kürzeren Abfragen der Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" auftritt.
                   - Alle Werte der Schnittstellenbeschreibung, die sinnvoll bei der SC18 abgefragt werden können, hinzugefügt.
    Version: 1.0.0 - Erstellung Script nach Vorlage  hiasii12
    *************************************************************************/
    
    // ++++++++++ USER ANPASSUNGEN ++++++++++++++++++++++
    
    // Hier IP Adresse der Anlage eintragen 
    var constIP = "192.168.1.230"
    // Hier Anlagen Typ eintragen SC18, SC23, MC32, MC38 (aktuelle geht nur SC18)
    var sTyp = "SC18" 
    // Instanz eintragen
    var instance    = '0';
    var instanz     = 'javascript.' + instance + '.';
    // Pfad innerhalb der Instanz
    var PfadEbene1 = 'Gruenbeck.SC18.';
    // Abfragezyklus in Sekunden eintragen ( <10 sek. sind nicht zu empfehlen)
    const constPollingCycle = 30
    // nur zur Fehleranalyse
    var debug = false;
    //++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++
    var PfadEbene2 = ['Parameter.', 'Allgemein.','Netzwerk.','Fehlerspeicher.','Aktualwerte.','Wasserverbrauch.','Regenerationen.', 'Ausseneingriff.']
    
    // erstelle States
    if (sTyp == 'SC18') {
        // Parameter mit Schreib- und Lesezugriff
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_D_1', {def: 0,name: 'Rohwasserhärte',type: 'number',role: 'number',desc: 'Rohwasserhärte',unit: '°dH'});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_A_4_1', {def: "-",name: 'Name Installateur',type: 'string',role: 'string',desc: 'Name Installateur',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_A_4_2', {def: "-",name: 'Tel Installateur',type: 'string',role: 'string',desc: 'Tel Installateur',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_A_4_3', {def: "-",name: 'E-Mail Installateur',type: 'string',role: 'string',desc: 'E-Mail Installateur',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_1_1', {def: 0,name: 'Sprache 0=De 1=En 3=Fr 4=Nl 5=Ru 6=Es 7=Zh',type: 'number',role: 'number',desc: 'Sprache 0=De 1=En 3=Fr 4=Nl 5=Ru 6=Es 7=Zh',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_2_1', {def: 0,name: 'Haerteeinheit 0=°dH 1=°f 2=°e 3=ppm 4=mol/m³',type: 'number',role: 'number',desc: 'Haerteeinheit 0=°dH 1=°f 2=°e 3=ppm 4=mol/m³',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_5_1', {def: 0,name: 'Ansprechverhalten 0=eco 1=Power',type: 'number',role: 'number',desc: 'Ansprechverhalten 0=eco 1=Power',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_4_1', {def: 0,name: 'Regenerationszeitpunkt 0= Auto 1= Fest',type: 'number',role: 'number',desc: 'Regenerationszeitpunkt 0= Auto 1= Fest',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_4_2', {def: "00:00",name: 'Uhrzeit',type: 'string',role: 'string',desc: 'Uhrzeit',unit: 'Uhr'});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_4_3', {def: "00:00",name: 'Startzeit Regeneration 1',type: 'string',role: 'string',desc: 'Startzeit Regeneration 1',unit: 'Uhr'});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_6_1', {def: 0,name: 'Aktives Display im Standby 0=deaktiviert 1=aktiviert',type: 'number',role: 'number',desc: 'Aktives Display im Standby 0=deaktiviert 1=aktiviert',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_7_1', {def: 0,name: 'Soll Service Intervalldauer',type: 'number',role: 'number',desc: 'Soll Service Intervalldauer',unit: 'Tage'});
        // Allgemein Parameter mit Lesezugriff
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_A_2_2', {def: 0,name: 'Tage bis zur nächsten Wartung',type: 'number',role: 'number',desc: 'Tage bis zur nächsten Wartung',unit: 'Tage'});
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_5', {def: 0,name: 'Aktueller Regenerationsschritt 0= keine Regeneration 1= Soletank füllen 2= Besalzen 3= Verdrängen 4= Rückspülen 5= Erstfiltrat',type: 'number',role: 'number',desc: 'Aktueller Regenerationsschritt 0= keine Regeneration 1= Soletank füllen 2= Besalzen 3= Verdrängen 4= Rückspülen 5= Erstfiltrat',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_7', {def: "--.--.--",name: 'Inbetriebnahme-Datum',type: 'string',role: 'string',desc: 'Inbetriebnahme-Datum',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_6', {def: "-",name: 'sw_version',type: 'string',role: 'string',desc: 'sw_version',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_8_11', {def: 0,name: 'Ergebnis letzter E-Mail Versand 0=keine Mail versandt 1=Mail erfolgreich versandt 2=Benutzerdaten fehlerhaft 3= kein Internetzugang/Server nicht bereit',type: 'number',role: 'number',desc: 'Ergebnis letzter E-Mail Versand 0=keine Mail versandt 1=Mail erfolgreich versandt 2=Benutzerdaten fehlerhaft 3= kein Internetzugang/Server nicht bereit',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_10_1', {def: 0,name: 'Aktuelle Restkapazität Austauscher',type: 'number',role: 'number',desc: 'Aktuelle Restkapazität Austauscher',unit: '%'});
        createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_B_1', {def: 0,name: 'Regeneration aktiv',type: 'number',role: 'number',desc: 'Regeneration aktiv',unit: ''});
        //Netzwerk
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_1', {def: "-",name: 'IP-Adresse WLAN',type: 'string',role: 'string',desc: 'IP-Adresse WLAN',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_2', {def: "-",name: 'Default Gateway WLAN',type: 'string',role: 'string',desc: 'Default Gateway WLAN',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_3', {def: "-",name: 'Primary DNS WLAN',type: 'string',role: 'string',desc: 'Primary DNS WLAN',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_4', {def: "-",name: 'Secondary DNS WLAN',type: 'string',role: 'string',desc: 'Secondary DNS WLAN',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_5', {def: 0,name: 'Status WLAN 1=verbunden',type: 'number',role: 'number',desc: 'Status WLAN 1=verbunden',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_7_1', {def: "-",name: 'IP-Adresse Access Point',type: 'string',role: 'string',desc: 'IP-Adresse Access Point',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_7_2', {def: "-",name: 'SSID Access Point',type: 'string',role: 'string',desc: 'SSID Access Point',unit: ''});
        createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_7_3', {def: 0,name: 'Status Access Point 1=verbunden',type: 'number',role: 'number',desc: 'Status Access Point 1=verbunden',unit: ''});
        
        //Fehlerspeicher
        for(var i = 1; i<= 16; i++) {
    	    if(i<10){
    		    createState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_0' + i, {def: "-",name: 'Fehlerspeicher ' + i ,type: 'string',role: 'string',desc: 'Fehlerspeicher ' + i ,unit: ''});
    	    }
    	    else {
    		    createState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_' + i, {def: "-",name: 'Fehlerspeicher ' + i ,type: 'string',role: 'string',desc: 'Fehlerspeicher ' + i ,unit: ''});	
    	    }
        }
        //**** Aktualwerte ***
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_1', {def: 0,name: 'Aktueller Durchfluss',type: 'number',role: 'number',desc: 'Aktueller Durchfluss',unit: 'm³/h'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_2', {def: 0,name: 'Restkapazität',type: 'number',role: 'number',desc: 'Restkapazität',unit: 'm³*°dH'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_3', {def: 0,name: 'Kapazitätszahl',type: 'number',role: 'number',desc: 'Kapazitätszahl',unit: 'm³*°dH'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_2_1', {def: 0,name: 'Restzeit/-menge Reg.Schritt',type: 'number',role: 'number',desc: 'Restzeit/-menge Reg.Schritt',unit: 'l oder min'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_3_1', {def: "-",name: 'Letzte Regeneration',type: 'string',role: 'string',desc: 'Letzte Regeneration',unit: 'h'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_3_2', {def: 0,name: 'Letzte Regeneration über',type: 'number',role: 'number',desc: 'Letzte Regeneration über',unit: '%'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch', {def: 0, name: 'Salzverbrauch in kg',type: 'number',role: 'number',desc: 'Salzverbrauch in kg',unit: 'kg'});
        createState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt', {def: 0, name: 'Salzverbrauch gesamt in kg',type: 'number',role: 'number',desc: 'Salzverbrauch gesamt in kg',unit: 'kg'});
        //**** Wasserverbrauch *** Regenerationen ***
        for(var i = 1; i<= 14; i++) {
    	    if(i<10){
    		    createState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_0' + i, {def: 0,name: 'Wasserverbrauch vor ' + i + 'Tagen',type: 'number',role: 'number',desc: 'Wasserverbrauch vor ' + i + ' Tagen',unit: 'Liter'});
    		    createState(instanz + PfadEbene1 + PfadEbene2[6] + 'D_Y_4_0' + i, {def: "-",name: 'Zeit letzte Regenereation ' + i + ' vor aktueller',type: 'string',role: 'string',desc: 'Zeit letzte Regenereation ' + i + ' vor aktueller',unit: ''});
    	    }
    	    else {
    		    createState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_' + i, {def: 0,name: 'Wasserverbrauch vor ' + i + 'Tagen',type: 'number',role: 'number',desc: 'Wasserverbrauch vor ' + i + ' Tagen',unit: 'Liter'});
    		    createState(instanz + PfadEbene1 + PfadEbene2[6] + 'D_Y_4_' + i, {def: "-",name: 'Zeit letzte Regenereation ' + i + ' vor aktueller',type: 'string',role: 'string',desc: 'Zeit letzte Regenereation ' + i + ' vor aktueller',unit: ''});	
    	    }
        }
        //*** Ausseneingriff ******
        createState(instanz + PfadEbene1 + PfadEbene2[7] + 'Fehlerspeicher' , {def:'false',name:'Fehlerspeicher ' ,type:'boolean',role:'State',desc: 'State zum auslesen vom Fehlerspeicher '});
        createState(instanz + PfadEbene1 + PfadEbene2[7] + 'Regenerationsstart', {def:'false',name:'Regenerationsstart',type:'boolean',role:'State',desc: 'State zum starten der Regeneration'});     
    };
    //*************************************************************************************************
    var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
    var parser = require('xmldom').DOMParser;
    var xhr = new XMLHttpRequest();
    var StatePfad = "";
    var Parameter;
    var sParSend = "";
    var sParGet = "";
    var neuerWert;
    var arryPfadEbene2;
    var KeineRueckmeldung = false;
    var TimeoutRueckmeldung;
    // Regenerationsstart von Vis
    const idRegStart = instanz + PfadEbene1 + PfadEbene2[7] + 'Regenerationsstart';
    // Regenerationsstart von SC18
    const idReg = instanz + PfadEbene1 + PfadEbene2[1] + 'D_B_1';
    
    //**************************************************************************************************
    /*xhr.onerror = function () 
    {
        console.error ("Es ist ein Fehler aufgetreten")
        console.error ("Status Text ist: " + xhr.statusText)
        if (xhr.statusText == "Error: connect EHOSTUNREACH 192.168.1.230:80" || xhr.statusText == "Error: connect ETIMEDOUT 192.168.1.230:80")
        {
            console.error("Keine W-Lan Verbindung zur SC18")
            ShowState (sParSend)
        }
    };*/
    
    
    //wird aufgerufen wenn Sendevorgang erfolgreich abgeschlossen wurde
    xhr.onload = function () 
    {
        if (debug) {console.log("Rueckmeldung SC18:" + xhr.responseText)}
        var str = xhr.responseText;
        switch (arryPfadEbene2)
        {
            case 0:
            case 1:
            case 2:
            case 4:
            case 5: 
            case 6:    
            regex = /<data><code>([^\<]+)<\/code><D_D_1>([^\<]+)<\/D_D_1><D_A_4_1>([^\<]+)<\/D_A_4_1><D_A_4_2>([^\<]+)<\/D_A_4_2><D_A_4_3>([^\<]+)<\/D_A_4_3><D_C_1_1>([^\<]+)<\/D_C_1_1><D_C_2_1>([^\<]+)<\/D_C_2_1><D_C_5_1>([^\<]+)<\/D_C_5_1><D_C_4_1>([^\<]+)<\/D_C_4_1><D_C_4_2>([^\<]+)<\/D_C_4_2><D_C_4_3>([^\<]+)<\/D_C_4_3><D_C_6_1>([^\<]+)<\/D_C_6_1><D_C_7_1>([^\<]+)<\/D_C_7_1><D_A_2_2>([^\<]+)<\/D_A_2_2><D_C_3_6_1>([^\<]+)<\/D_C_3_6_1><D_C_3_6_2>([^\<]+)<\/D_C_3_6_2><D_C_3_6_3>([^\<]+)<\/D_C_3_6_3><D_C_3_6_4>([^\<]+)<\/D_C_3_6_4><D_C_3_6_5>([^\<]+)<\/D_C_3_6_5><D_C_3_7_1>([^\<]+)<\/D_C_3_7_1><D_C_3_7_2>([^\<]+)<\/D_C_3_7_2><D_C_3_7_3>([^\<]+)<\/D_C_3_7_3><D_Y_5>([^\<]+)<\/D_Y_5><D_Y_7>([^\<]+)<\/D_Y_7><D_Y_6>([^\<]+)<\/D_Y_6><D_Y_8_11>([^\<]+)<\/D_Y_8_11><D_Y_10_1>([^\<]+)<\/D_Y_10_1><D_B_1>([^\<]+)<\/D_B_1><D_A_1_1>([^\<]+)<\/D_A_1_1><D_A_1_2>([^\<]+)<\/D_A_1_2><D_A_1_3>([^\<]+)<\/D_A_1_3><D_A_2_1>([^\<]+)<\/D_A_2_1><D_A_3_1>([^\<]+)<\/D_A_3_1><D_A_3_2>([^\<]+)<\/D_A_3_2><D_Y_2_1>([^\<]+)<\/D_Y_2_1><D_Y_4_1>([^\<]+)<\/D_Y_4_1><D_Y_2_2>([^\<]+)<\/D_Y_2_2><D_Y_4_2>([^\<]+)<\/D_Y_4_2><D_Y_2_3>([^\<]+)<\/D_Y_2_3><D_Y_4_3>([^\<]+)<\/D_Y_4_3><D_Y_2_4>([^\<]+)<\/D_Y_2_4><D_Y_4_4>([^\<]+)<\/D_Y_4_4><D_Y_2_5>([^\<]+)<\/D_Y_2_5><D_Y_4_5>([^\<]+)<\/D_Y_4_5><D_Y_2_6>([^\<]+)<\/D_Y_2_6><D_Y_4_6>([^\<]+)<\/D_Y_4_6><D_Y_2_7>([^\<]+)<\/D_Y_2_7><D_Y_4_7>([^\<]+)<\/D_Y_4_7><D_Y_2_8>([^\<]+)<\/D_Y_2_8><D_Y_4_8>([^\<]+)<\/D_Y_4_8><D_Y_2_9>([^\<]+)<\/D_Y_2_9><D_Y_4_9>([^\<]+)<\/D_Y_4_9><D_Y_2_10>([^\<]+)<\/D_Y_2_10><D_Y_4_10>([^\<]+)<\/D_Y_4_10><D_Y_2_11>([^\<]+)<\/D_Y_2_11><D_Y_4_11>([^\<]+)<\/D_Y_4_11><D_Y_2_12>([^\<]+)<\/D_Y_2_12><D_Y_4_12>([^\<]+)<\/D_Y_4_12><D_Y_2_13>([^\<]+)<\/D_Y_2_13><D_Y_4_13>([^\<]+)<\/D_Y_4_13><D_Y_2_14>([^\<]+)<\/D_Y_2_14><D_Y_4_14>([^\<]+)<\/D_Y_4_14><\/data>/;
    	    subst = regex.exec(str);
            if (subst)
    	    {
    		    var i = 2;
                setState(instanz + PfadEbene1 + 'Parameter.D_D_1' , parseFloat(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Parameter.D_A_4_1' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Parameter.D_A_4_2' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Parameter.D_A_4_3' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_1_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_2_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_5_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_4_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_4_2' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_4_3' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_6_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Parameter.D_C_7_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Allgemein.D_A_2_2' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_1' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_2' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_3' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_4' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_5' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_7_1' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_7_2' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_7_3' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Allgemein.D_Y_5' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Allgemein.D_Y_7' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Allgemein.D_Y_6' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Allgemein.D_Y_8_11' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Allgemein.D_Y_10_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Allgemein.D_B_1' , parseInt(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_1_1' , parseFloat(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_1_2' , parseFloat(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_1_3' , parseFloat(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_2_1' , parseFloat(subst[i++]) );
                setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_3_1' , subst[i++] );
                setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_3_2' , parseInt(subst[i]) );
                var iz = i;
    		    for(var iw = 1; iw<= 14; iw++) 
                {
    			    iz++;
    			    if(iw<10)
                    {
    				    setState(instanz + PfadEbene1 + 'Wasserverbrauch.D_Y_2_0' + iw , parseInt(subst[iz++]) );
    				    setState(instanz + PfadEbene1 + 'Regenerationen.D_Y_4_0' + iw , subst[iz] );
                    }
    			    else 
                    {
    				    setState(instanz + PfadEbene1 + 'Wasserverbrauch.D_Y_2_' + iw , parseInt(subst[iz++]) );
    				    setState(instanz + PfadEbene1 + 'Regenerationen.D_Y_4_' + iw , subst[iz] );
    			    }
                }
            }
            break;
            case 3:
            regex = /<data><code>([^\<]+)<\/code><D_K_10_1>([^\<]+)<\/D_K_10_1><D_K_10_2>([^\<]+)<\/D_K_10_2><D_K_10_3>([^\<]+)<\/D_K_10_3><D_K_10_4>([^\<]+)<\/D_K_10_4><D_K_10_5>([^\<]+)<\/D_K_10_5><D_K_10_6>([^\<]+)<\/D_K_10_6><D_K_10_7>([^\<]+)<\/D_K_10_7><D_K_10_8>([^\<]+)<\/D_K_10_8><D_K_10_9>([^\<]+)<\/D_K_10_9><D_K_10_10>([^\<]+)<\/D_K_10_10><D_K_10_11>([^\<]+)<\/D_K_10_11><D_K_10_12>([^\<]+)<\/D_K_10_12><D_K_10_13>([^\<]+)<\/D_K_10_13><D_K_10_14>([^\<]+)<\/D_K_10_14><D_K_10_15>([^\<]+)<\/D_K_10_15><D_K_10_16>([^\<]+)<\/D_K_10_16><\/data>/;
            subst = regex.exec(str);
            if (subst)
    	    {
    		    var iz = 2
                for(var iw = 1; iw<= 16; iw++) 
                {
    			    
                    if(iw<10)
                    {
    				    setState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_0'+ iw , subst[iz] );
                    }
    			    else 
                    {
    				    setState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_'+ iw , subst[iz] );
    			    }
                    iz++;
                }
            }
            break;
            default:
        }
    };
    
    // State SC18 String erstellen für Zyklisch abfragen
    on({time: "*/" + constPollingCycle + " * * * * *"}, function () {
    	if (KeineRueckmeldung == false){
            sParSend = "id=3369&show=D_D_1|D_A_4_1|D_A_4_2|D_A_4_3|D_C_1_1|D_C_2_1|D_C_5_1|D_C_4_1|D_C_4_2|D_C_4_3|D_C_6_1|D_C_7_1|D_A_2_2|D_C_3_6_1|D_C_3_6_2|D_C_3_6_3|D_C_3_6_4|D_C_3_6_5|D_C_3_7_1|D_C_3_7_2|D_C_3_7_3|D_Y_5|D_Y_7|D_Y_6|D_Y_8_11|D_Y_10_1|D_B_1|D_A_1_1|D_A_1_2|D_A_1_3|D_A_2_1|D_A_3_1|D_A_3_2|D_Y_2_1|D_Y_4_1|D_Y_2_2|D_Y_4_2|D_Y_2_3|D_Y_4_3|D_Y_2_4|D_Y_4_4|D_Y_2_5|D_Y_4_5|D_Y_2_6|D_Y_4_6|D_Y_2_7|D_Y_4_7|D_Y_2_8|D_Y_4_8|D_Y_2_9|D_Y_4_9|D_Y_2_10|D_Y_4_10|D_Y_2_11|D_Y_4_11|D_Y_2_12|D_Y_4_12|D_Y_2_13|D_Y_4_13|D_Y_2_14|D_Y_4_14~"
            ShowState (sParSend)
            arryPfadEbene2 = 0  
        } 
    });
    
    //Power- Eco-modus umschalten Int 0=eco 1=power
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_5_1', function (obj) 
    {
        if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_5_1').val;
            if (neuerWert == 1 || neuerWert == 0){ 
                ShowState ("edit=D_C_5_1>"+neuerWert+"&id=3369~")
            }
        }
    });
    
    //Regenerationszeitpunkt Int 0=auto 1=fest
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_1', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_1').val;
            if (neuerWert == 1 || neuerWert == 0){ 
                ShowState ("edit=D_C_4_1>"+neuerWert+"&id=3369~")
            }
        }
    });
    
    //Uhrzeit String hh:mm wird automatisch Synchronisiert wenn Regenerationszeitpunkt auf "1=fest" eingestellt ist
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_2', function (obj) 
    {
        if (KeineRueckmeldung == false){
            var sZeitState = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_2').val;
            var minutes = new Date();
            var Minuten = minutes.getMinutes(); Minuten = Minuten > 9 ? Minuten : '0' + Minuten; 
            var akkZeit = new Date().getHours()+":"+Minuten;
            // wenn Regenerationszeitpunkt = 1 (fest) und aktuelle Zeit nicht gleich Anlagenzeit
            if (getState(instanz + PfadEbene1 +PfadEbene2[0]+'D_C_4_1').val && akkZeit != sZeitState ){
                ShowState ("edit=D_C_4_2>"+ akkZeit +"&id=3369~")
            }
        }
    });
    
    //Startzeit Regeneration String hh:mm
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_3', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_3').val;
            ShowState ("edit=D_C_4_3>"+neuerWert+"&id=3369~")
        }   
    });
    
    //Rohwasserhärte Double °dH
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_D_1', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_D_1').val;
            ShowState ("edit=D_D_1>"+neuerWert+"&id=3369~")
        }
    });
    
    //Sprache Int 0=De 1=En 3=Fr 4=Nl 5=Ru 6=Es 7=Zh
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_1_1', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_1_1').val;
            ShowState ("edit=D_C_1_1>"+neuerWert+"&id=3369~")
        }
    });
    
    //Aktives Display im Standby Int 0=deaktiviert 1=aktiviert
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_6_1', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_6_1').val;
            if (neuerWert == 1 || neuerWert == 0){
               ShowState ("edit=D_C_6_1>"+neuerWert+"&id=3369~")
            }
        }
    });
    
    //Soll Service Intervalldauer Int Tage
    on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_7_1', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_6_1').val;
            if (neuerWert >= 0 && neuerWert <= 4){
                ShowState ("edit=D_C_7_1>"+neuerWert+"&id=3369~")
            }
        } 
    });
    
    //manuelle Regeneration Int 1=Start
    on({id:idRegStart,val:true,change:'ne'}, function (obj){
       if (KeineRueckmeldung == false){
            var Regeneration = getState(idReg).val;
            var Trigger = getState(idRegStart).val;
            setStateDelayed(idRegStart,false,1*1000);
            if (Regeneration === 0 && Trigger === true){
               ShowState ("edit=D_B_1>1&id=3369~")
            }else{
    	        if (debug) {console.log('Regeneration bereits aktiv')}
            } 
        }
    });
    
    //Fehlerspeicher Int 1=abfragen
    on(instanz+PfadEbene1+PfadEbene2[7]+'Fehlerspeicher', function (obj) 
    {
       if (KeineRueckmeldung == false){
            neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[7]+'Fehlerspeicher').val;
            if (neuerWert == 1){
                sParSend = "id=3369&code=245&show=D_K_10_1|D_K_10_2|D_K_10_3|D_K_10_4|D_K_10_5|D_K_10_6|D_K_10_7|D_K_10_8|D_K_10_9|D_K_10_10|D_K_10_11|D_K_10_12|D_K_10_13|D_K_10_14|D_K_10_15|D_K_10_16~"
                ShowState (sParSend)
                arryPfadEbene2 = 3; 
                setState(instanz + PfadEbene1 + PfadEbene2[7]+'Fehlerspeicher',false);
            }
        } 
    });
    
    // aktuelle State SC18 abrufen
    function ShowState (sParSend) 
    {
        if (KeineRueckmeldung == false)
        {
            if(typeof(sParSend) == "undefined")sParSend = "";
    		xhr.open("POST","http://" + constIP + "/mux_http", true);
    	    xhr.setRequestHeader("Content-type", "application/json");
    	    xhr.setRequestHeader("Content-length", sParSend.length);
    		xhr.setRequestHeader("Connection", "close");
    		xhr.responseType = "document";
            if (KeineRueckmeldung == false){
                xhr.send(sParSend);
                if (debug) {console.log (sParSend.length + " Byte an Daten wurden gesendet :" + sParSend)}
            }
            KeineRueckmeldung = true;
            TimeoutRueckmeldung = setInterval(function(){timeout_Rueckmeldung();} , 4000);
    		xhr.onreadystatechange = function()
    		{
    				if (xhr.readyState==4)
    				{
    					clearInterval(TimeoutRueckmeldung);
    					KeineRueckmeldung = false;
    				}
    			
    		}
    		
        }	
        else {return}
    }
    
    //Bei Timeout abbrechen
    function timeout_Rueckmeldung()
    {
    	KeineRueckmeldung = false;
    	xhr.abort();
    	clearInterval(TimeoutRueckmeldung);
        if (debug) {console.log("Timeout")}
    }
    
    
    // Salzverbrauch berechnen 
    on(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_01', function (obj){ 
    /*Formel Grünbeck bei Kapazitätszahl 8 m³x°dH und einem Härteunterschied von Rohwasser zu Brauchwasser 
      von 12 °dH  : 0,0285 kg x 12 °dH x 100 m³ = 34,2 kg Regeneriersalz
            Bei der min. Kapazitätszahl 6 m³x°dH entspricht der Salzverbrauch 0.025 kg
            Bei der max. Kapazitätszahl 14 m³x°dH entspricht der Salzverbrauch 0.039 kg
            Es wird von einem liniaren Salzverbrauch von 0.00175 kg pro m³x°dH ausgegangen.
            (((Kapazitätszahl-6)*0.00175)+0.025)x Rohwasserhärte x (Wasserverbrauch/1000)
    */
    var Rohwasserhaerte = getState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_D_1').val;
    var KapZahl = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_3').val;
    var Wasserverbrauch = getState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_01').val;
    var SalzverbrauchAlt = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch').val;
    var SalzverbrauchGesamt = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt').val;
    var SalzverbrauchNeu = (((KapZahl-6)*0.00175)+ 0.025)*Rohwasserhaerte*(Wasserverbrauch/1000)
    SalzverbrauchNeu = SalzverbrauchNeu+SalzverbrauchAlt;
    SalzverbrauchGesamt =SalzverbrauchGesamt+SalzverbrauchNeu;
    setState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch',SalzverbrauchNeu);
    setState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt',SalzverbrauchGesamt);
    
    if (debug) {console.log(SalzverbrauchAlt +" : "+ SalzverbrauchNeu)}
    
    });
    
    
    
    smartboartS Offline
    smartboartS Offline
    smartboart
    schrieb am zuletzt editiert von smartboart
    #100

    @ArnoD

    //manuelle Regeneration Int 1=Start
    
    on(instanz + PfadEbene1 + 'Allgemein.D_B_1', function (obj) 
    
    {
    
       StatePfad = instanz + PfadEbene1 +'Allgemein.D_B_1';
    
       Parameter = 'D_B_1'
    
       neuerWert = getState(StatePfad).val;
    
       if (neuerWert == 1)
    
       {
    
            EditState(StatePfad,Parameter,neuerWert);
    
        } 
    
    });
    

    Hi, hab dazu nochmal nachgedacht.. Must nicht gleich draufspringen, hast genug geleistet die letzten Tage...Ich wollte es nur nicht vergessen, deshalb schreibe ich es gleich mal nieder..
    Was passiert denn wenn die Regeneration fest oder auto losläuft. Dann fängt dieser Script Teil ja auch an loszulaufen. Das heist zusätzlich zu festen oder auto Regeneration würde die anlage nochmal den Befehl zum starten bekommen. Wenn ich das richtig sehe, wäre eine Lösung um das zu unterbinden mit einem Hiflsmerker oder zusätzlichen state zu arbeiten. Ansosnten behebt das natürlich erstmal mein beschriebenes Problem mit dem 2 Tastendruck.
    Den scriptteil würde ich aber mit ner zuzsätzlichen Bedingung / Hilfsmerker bei von der anlage gestarten Reg blockieren.
    Einfacher wäre vlt. nen eigen State als Trigger zu nehmen und die Regeneration / State D_B_1 nicht mit sich selbst zu triggern.

    smartboartS 1 Antwort Letzte Antwort
    0
    • smartboartS smartboart

      @ArnoD

      //manuelle Regeneration Int 1=Start
      
      on(instanz + PfadEbene1 + 'Allgemein.D_B_1', function (obj) 
      
      {
      
         StatePfad = instanz + PfadEbene1 +'Allgemein.D_B_1';
      
         Parameter = 'D_B_1'
      
         neuerWert = getState(StatePfad).val;
      
         if (neuerWert == 1)
      
         {
      
              EditState(StatePfad,Parameter,neuerWert);
      
          } 
      
      });
      

      Hi, hab dazu nochmal nachgedacht.. Must nicht gleich draufspringen, hast genug geleistet die letzten Tage...Ich wollte es nur nicht vergessen, deshalb schreibe ich es gleich mal nieder..
      Was passiert denn wenn die Regeneration fest oder auto losläuft. Dann fängt dieser Script Teil ja auch an loszulaufen. Das heist zusätzlich zu festen oder auto Regeneration würde die anlage nochmal den Befehl zum starten bekommen. Wenn ich das richtig sehe, wäre eine Lösung um das zu unterbinden mit einem Hiflsmerker oder zusätzlichen state zu arbeiten. Ansosnten behebt das natürlich erstmal mein beschriebenes Problem mit dem 2 Tastendruck.
      Den scriptteil würde ich aber mit ner zuzsätzlichen Bedingung / Hilfsmerker bei von der anlage gestarten Reg blockieren.
      Einfacher wäre vlt. nen eigen State als Trigger zu nehmen und die Regeneration / State D_B_1 nicht mit sich selbst zu triggern.

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

      nur ein Lösungsansatz..Werde es bei mir mal so testen...

      createState(instanz + PfadEbene1 + PfadEbene2[7] + 'Regenerationsstart', {def: 'false',name: 'Regenerationsstart',type: 'boolean',role: 'state',desc: 'State zum starten der Regeneration'});
      
      //manuelle Regeneration  true=Start
      
      const idRegStart = 'javascript.0.Status.Gruenbeck.SC18.Ausseneingriff.Regenerationsstart';
      const idReg = 'javascript.0.Status.Gruenbeck.SC18.Allgemein.D_B_1';
      
      on({id:idRegStart,val:true,change:'ne'}, function (obj){
      
         Parameter = 'D_B_1'
      
         var Regeneration = getState(idReg).val;
         
         var Trigger = getState(idRegStart).val;
         
         setStateDelayed(idRegStart,false,1*1000);
      
         if (Regeneration === 0 && Trigger === true){
      
              EditState(idReg,Parameter,1);
      		
         }else{
      	   
      	   if (debug) {console.log('Regeneration bereits aktiv')}
      		
      		
      
          } 
      
      });
      
      
      

      nur ein Lösungsvorschlag

      1 Antwort Letzte Antwort
      0
      • A Online
        A Online
        ArnoD
        schrieb am zuletzt editiert von
        #102

        Ja du hast recht, ist nich optimal gelöst.
        Wenn du dein Lösungsvorschlag getestet, hast und es funktioniert , werde ich es übernehmen :grinning:
        Ohne es selber getestet zu haben, aber kann der Function on mehr als drei Parameter übergeben werden?

        smartboartS 2 Antworten Letzte Antwort
        0
        • A ArnoD

          Ja du hast recht, ist nich optimal gelöst.
          Wenn du dein Lösungsvorschlag getestet, hast und es funktioniert , werde ich es übernehmen :grinning:
          Ohne es selber getestet zu haben, aber kann der Function on mehr als drei Parameter übergeben werden?

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

          @ArnoD
          werde es testen ich arbeite in Scripten immer mit const id / Konstanten und setze dann die id und arbeite in den logig Blöcken meistens mit variablen variablen.. var Trigger = getState usw. zur not passe ich es an

          1 Antwort Letzte Antwort
          0
          • A ArnoD

            Ja du hast recht, ist nich optimal gelöst.
            Wenn du dein Lösungsvorschlag getestet, hast und es funktioniert , werde ich es übernehmen :grinning:
            Ohne es selber getestet zu haben, aber kann der Function on mehr als drei Parameter übergeben werden?

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

            @ArnoD Also habs getestet. habe oben meinen Vorschlag aktualisiert. unten siehe log. Wenn jetzt während der regeneration nochmal gestartet wird, kommt der Hinweis im log bereits gestartet. Eine Regeneration durch das Gerät selbst läuft jetzt ins leere und triggert nicht mehr den Scriptblock...
            Unbenannt.PNG

            1 Antwort Letzte Antwort
            0
            • A Online
              A Online
              ArnoD
              schrieb am zuletzt editiert von
              #105

              Habe das Script mit deiner Optimierung aktualisiert. :+1:
              Macht natürlich auch für alle anderen änderbaren Werte sinn eine eigene ID für Änderungen in Vis anzulegen.

              Habe mir auch überlegt ob wir hier unter "Daten aus einer Webseite mit Javascript" noch richtig sind und es nicht besser wäre ein neues Thema aufzumachen wie "Grünbeck SC18" :wink:

              smartboartS 1 Antwort Letzte Antwort
              0
              • A ArnoD

                Habe das Script mit deiner Optimierung aktualisiert. :+1:
                Macht natürlich auch für alle anderen änderbaren Werte sinn eine eigene ID für Änderungen in Vis anzulegen.

                Habe mir auch überlegt ob wir hier unter "Daten aus einer Webseite mit Javascript" noch richtig sind und es nicht besser wäre ein neues Thema aufzumachen wie "Grünbeck SC18" :wink:

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

                @ArnoD ja da hast du Recht..mit allem...

                Generell ist es besser eigene States zum Triggern zu benutzen, aber bei den anderen steuerbaren states fällt es nicht so auf, da keine Aktion in dem Sinner erfolgt...Ist ja eigentlich nur eine Aktualisierung..Stört mich an den Stellen nicht so...
                Ein eigener Threat bietet sich an...Wäre sogar was für einen adapter...

                1 Antwort Letzte Antwort
                0
                • S Offline
                  S Offline
                  schmid_no1
                  schrieb am zuletzt editiert von
                  #107

                  Hallo Ihr zwei kleine Frage:

                  • Auf was bezieht sich der Fehlerspeicher bzw. kann man den nutzen um eine Fehlerausgabe in Echtzeit zu basteln, somit wirde man die Potentialfreien nicht brauchen.
                  • @ArnoD wie hast das mit dem Salzverbrauch in deiner Visu gemacht.
                  1 Antwort Letzte Antwort
                  0
                  • A Online
                    A Online
                    ArnoD
                    schrieb am zuletzt editiert von
                    #108

                    Die Anlage speichert jede Störung mit einem Störcode in einem Fehlerspeicher. Das Script liest diesen nur aus.
                    Man kann diesen sicher dazu nutzen bei einem neuen Fehler ein State auf true zu setzen und durch Quittieren wieder auf false.
                    Warum nutzt du eigentlich nicht die E-Mail Benachrichtigung der SC18, somit würdest du bei jedem Fehler eine E-Mail bekommen.

                    Ich muss erst noch im Script den Salzverbrauch berechnen, so das man hier eine sinnvolle Anzeige hat, im Moment habe ich nur einen Zähler, der bei jeder Regeneration um eins erhöht wird. Das ist natürlich sehr ungenau, da die Anlage ja nicht immer zu 100% regeneriert.

                    smartboartS 1 Antwort Letzte Antwort
                    0
                    • A ArnoD

                      Die Anlage speichert jede Störung mit einem Störcode in einem Fehlerspeicher. Das Script liest diesen nur aus.
                      Man kann diesen sicher dazu nutzen bei einem neuen Fehler ein State auf true zu setzen und durch Quittieren wieder auf false.
                      Warum nutzt du eigentlich nicht die E-Mail Benachrichtigung der SC18, somit würdest du bei jedem Fehler eine E-Mail bekommen.

                      Ich muss erst noch im Script den Salzverbrauch berechnen, so das man hier eine sinnvolle Anzeige hat, im Moment habe ich nur einen Zähler, der bei jeder Regeneration um eins erhöht wird. Das ist natürlich sehr ungenau, da die Anlage ja nicht immer zu 100% regeneriert.

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

                      @ArnoD Ich werte dazu den Wasserverbrauch aus. Sobald ich einmal Salz nachgefüllt habe, schaue ich wieviel Wasser durch ging. Mit der Infor bastle ich dann ein script.
                      @schmid_no1 die Idee von Arno ist garnicht schlecht...Mittels Script könnte man alle Fehler Speicher auslesen mittels oder Verknüpfung würde ein neuer Fehler einen State triggern wie z.B Anlage störung. Mit diesem Sate in vis anzeigen und ne pusch nachricht schicken..Ich werde das so umsetzen..vorausgesetzt wir packen das Auslesen noch in den Schedule...Fraglich ist nur ob das zu viel wird für die Kleine..Ansonsten ist der potentialfreie die bessere Wahl.Hier wird noch die Spannung mit überwacht
                      Aber das ginge auch über meine smartplug mit welcher ich die Sannung anzeige und den Strom mitlogge.
                      Email fällt bei mir raus weil alle meine Smarten Geräte fürs internet gesperrt sind...Habe nur das nötigste online..safety first

                      1 Antwort Letzte Antwort
                      0
                      • S Offline
                        S Offline
                        schmid_no1
                        schrieb am zuletzt editiert von
                        #110

                        Ich brauche ziemlich genau 2 x 25kg Sack Im Jahr bei 100 bis 120 m2. Ich könnte einfach einen Zähler rein machen der mich informieren soll wenns wieder soweit sein sollte. Oder wir bekommen tatsächlich ausgerechnet 😁.
                        Bin gerade noch dran die Codierung der fehlercods zu bekommen. Aber das mit dem State bei Änderung und dem popup wäre eine schöne Sache. Leider bin ich in Sachen scripte nicht fit und kann euch da nicht unterstützen.

                        smartboartS 1 Antwort Letzte Antwort
                        0
                        • S schmid_no1

                          Ich brauche ziemlich genau 2 x 25kg Sack Im Jahr bei 100 bis 120 m2. Ich könnte einfach einen Zähler rein machen der mich informieren soll wenns wieder soweit sein sollte. Oder wir bekommen tatsächlich ausgerechnet 😁.
                          Bin gerade noch dran die Codierung der fehlercods zu bekommen. Aber das mit dem State bei Änderung und dem popup wäre eine schöne Sache. Leider bin ich in Sachen scripte nicht fit und kann euch da nicht unterstützen.

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

                          @schmid_no1 Eine fehlerliste wäre nicht schlecht...Wie kommen denn die Fehler im Script an?
                          @ArnoD die States sind vom Typ String...Weist du ob diese im Klartext ausgegeben werden oder nur 0 und 1?

                          1 Antwort Letzte Antwort
                          0
                          • S Offline
                            S Offline
                            schmid_no1
                            schrieb am zuletzt editiert von
                            #112

                            @smartboart "E4_h5883" z.B. im Internet findet man halt leider gar nichts.

                            smartboartS 1 Antwort Letzte Antwort
                            0
                            • S schmid_no1

                              @smartboart "E4_h5883" z.B. im Internet findet man halt leider gar nichts.

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

                              @schmid_no1 eventuell mal beim Hersteller anfragen.

                              1 Antwort Letzte Antwort
                              0
                              • A Online
                                A Online
                                ArnoD
                                schrieb am zuletzt editiert von
                                #114

                                Ich weiß nur das die erste Position E4 der Fehlercode ist und _hxxxx wann der Fehler aufgetreten ist.
                                Ich habe jetzt die Berechnung Salzverbrauch nach Angaben und Formel der Fa. Grünbeck erstellt. Jetzt müssen wir nur noch 6 Monate warten, um zu sehen, ob diese Berechnung auch stimmt. :joy:

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

                                  Cool echt klasse!!!! Sehr gute Arbeit... Und wirklich durchdacht. Ohne Anpassung fuer jeden passend! Morgen gleich einpflegen... Dann Hab ich mir die Arbeit und Salz Menge messen ja gespart...
                                  Habe heute Kabel gezogen... Habe mich dazu entschlossen den potentialfreien stoermelde Kontakt im verteiler Schrank einzulesen... Mit dem raspi slave lese ich eh schon Klingel und netzausfall ueber Relais ein.. Hat den Vorteil das stoerung vom Geraet und netzausfall am Geraet Hardware maessig zusaetzlich überwacht sind... Das Kabel ist gut investiert.. Als nächstes wssserzaehler und Heizung noch mit einlesen...

                                  Ich werde die Tage ein Script Scheiben um bei Abwesenheit und unter 10% und Waschmaschine nicht an und reg nicht aktiv automatisch die reg gestartet wird.. Sowie wenn nur 1% dann unabhängig der Regel die reg gestartet wird wenn nicht bereits aktiv...
                                  evtl. Ist das ja auch was fuer euch...

                                  1 Antwort Letzte Antwort
                                  0
                                  • S Offline
                                    S Offline
                                    schmid_no1
                                    schrieb am zuletzt editiert von
                                    #116

                                    @ArnoD Richtig cool !!!!
                                    nur noch ne kleine Frage ist das der Salzverbrauch pro Tag? Wenn ja könnet man noch ein State dazufügen indem man eingeben kann wieviel Salz man eingefüllt hat und durch deine Doku des Täglich verbrauchten Salzes ausrechnet wie lange dieses noch halten würde.

                                    smartboartS 1 Antwort Letzte Antwort
                                    0
                                    • S schmid_no1

                                      @ArnoD Richtig cool !!!!
                                      nur noch ne kleine Frage ist das der Salzverbrauch pro Tag? Wenn ja könnet man noch ein State dazufügen indem man eingeben kann wieviel Salz man eingefüllt hat und durch deine Doku des Täglich verbrauchten Salzes ausrechnet wie lange dieses noch halten würde.

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

                                      @schmid_no1 Nein der Salzverbrauch bzw. die Berechnung wird getriggert durch den Wasserverbrauch vor einem Tag und dann immer dazu addiert. Im Prinzip bekommst du dadurch einen Salzverbrauch über alles. Wenn du den zurück setzen willst, gib einfach einen neuen Start Wert ein! Also Setze den State Salzverbrauch auf 0 nach dem Befüllen!
                                      Das hat Arno schon super gemacht... Jetzt könnete man im Script noch einfügen, wenn der Salzverbrauch 10 kg oder einen anderen Erfahrungswert, habe ich noch nicht....ab wieviel Verbrauch wird Wasserr sichtbar? erreicht hat, setze einen weiteren State Salz nachfüllen! Perfekt
                                      @ArnoD Wenn ich das richtig sehe, ist für die Berechnung ein gültiger Start Wert nötig oder? Also Salzverbrauch alt. Bei Scriptstart ist der Wert erstmal Null.... Es wird wahrscheinlich reichen den Wert in den objekten manuell zu beschreiben. Ansosnten könnte man es in dem Script konfigurierbar machen oder...Z.B ich habe schon 2 Kilo verbraucht also starten wir mit 2 Kilo... oder eben 25 oder was bis zum ersten Start des Skripts verbraucht wurde...Somit wäre das Thema mit der Null weg... Oder du gibst einfach 0 vor...Oder eben einfach nur ein Hinweis bei Scriptstart Verbrauch bis dahin Salz manuell berechnen und eintragen.. oder eben einfach das Ding voll machen und 0 eintragen..
                                      Korrigier mich wenn ich schwachsinn schreibe... :-)
                                      oder einfach :
                                      createState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch', {name: 'Salzverbrauch in kg',type: 'number',role: 'number',desc: 'Salzverbrauch in kg',unit: 'kg',def:'0'});
                                      für den ersten Scriptstart.

                                      1 Antwort Letzte Antwort
                                      0
                                      • S Offline
                                        S Offline
                                        schmid_no1
                                        schrieb am zuletzt editiert von
                                        #118

                                        In dem Fall passt das so für mich danke euch 😁

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

                                          Ich fände es gut den Scriptteil nochmal laufen zu lassen mit nem weiteren State Salzverbrauch über alles...Somit hätte man einen Gesamt Wert über den gesamten lifecycle der Anlage. Den anderen habe ich für den Salzwechsel zum zurücksetzen in vis .

                                          Wenn du willst kannst du das noch einpflegen...Ansosnten muss ich bei aktualisierungen deines Scripts halt aufpassen..

                                          Benutzt ihr Telegramm? Habe noch eine push Nachricht in den Salzverbrauch eingebaut..
                                          Ebenfalls eine Pushnachricht bei Sammelstörung ( GPIO ) potentialfrei mit Ansage am Tablet.
                                          Zusätzlich wird das Display eingeschaltet wenn der Raum betreten wird.
                                          Ausserdem Autoregeneration bei Abwesenheit und Waschmaschine aus und <10%
                                          oder bei unterschreiten 2 % mit rein genommen.
                                          Ist aber alles eher individuel..macht wahrscheinlich keinen Sinn das mit rein zunehmen.
                                          Aber vlt. möchte es ja jemand für sich anpassen..

                                           createState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt', {name: 'Salzverbrauch Gesamt in kg',type: 'number',role: 'number',desc: 'Salzverbrauch Gesamt in kg',unit: 'kg',def:'0'});
                                          
                                          // Salzverbrauch Gesamt berechnen 
                                          
                                          on(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_01', function (obj){ 
                                          
                                          /*Formel Grünbeck bei Kapazitätszahl 8 m³x°dH und einem Härteunterschied von Rohwasser zu Brauchwasser 
                                          
                                            von 12 °dH  : 0,0285 kg x 12 °dH x 100 m³ = 34,2 kg Regeneriersalz
                                          
                                                  Bei der min. Kapazitätszahl 6 m³x°dH entspricht der Salzverbrauch 0.025 kg
                                          
                                                  Bei der max. Kapazitätszahl 14 m³x°dH entspricht der Salzverbrauch 0.039 kg
                                          
                                                  Es wird von einem liniaren Salzverbrauch von 0.00175 kg pro m³x°dH ausgegangen.
                                          
                                                  (((Kapazitätszahl-6)*0.00175)+0.025)x Rohwasserhärte x (Wasserverbrauch/1000)
                                          
                                          */
                                          
                                          const idSalzverbrauchGesamt = instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt';
                                          
                                          var Rohwasserhaerte = getState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_D_1').val;
                                          
                                          var KapZahl = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_3').val;
                                          
                                          var Wasserverbrauch = getState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_01').val;
                                          
                                          var SalzverbrauchAlt = getState(idSalzverbrauchGesamt).val;
                                          
                                          var SalzverbrauchNeu = (((KapZahl-6)*0.00175)+ 0.025)*Rohwasserhaerte*(Wasserverbrauch/1000)
                                          
                                          SalzverbrauchNeu = SalzverbrauchNeu+SalzverbrauchAlt;
                                          
                                          setState(idSalzverbrauchGesamt,SalzverbrauchNeu);
                                          
                                          if (debug) {console.log(SalzverbrauchAlt +" : "+ SalzverbrauchNeu)}
                                          
                                           
                                          
                                          });
                                          
                                          // Pushnachricht bei Vebrauch > 10 kg
                                          
                                          
                                          on(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch', function (obj){ 
                                          
                                              const idSalzverbrauch = instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch';
                                          
                                              var Salzverbrauch = getState(idSalzverbrauch).val;
                                                  
                                                  if(Salzverbrauch >= 10){
                                                      
                                                  sendTo("telegram.0", "send", {text: (['Achtung: ',' Bitte Salz in Weichwasseranlage nachfüllen.Verbraucht wurden',getState(idSalzverbrauch).val,'kg.'].join(''))});
                                          
                                                  if (logging) log ('Slazmangel Weichwasseranlage');
                                              
                                              }
                                          
                                          });   
                                          
                                          // Pushnachricht bei Sammelstörung Weichwasseranlage Potentialfreier Kontakt
                                          
                                          on({id:'rpi2.1.gpio.23.state',val:false,change:'ne'}, function (obj){
                                          
                                          sendTo("telegram.0", "send", {text:'Achtung!!! Weichwasseranlage Sammelstörung. Überprüfen sie die Anlage!'});
                                          
                                          sendTo("paw.0",'all',{send:  'say', text:  'Achtung! Weichwasseranlage Sammelstörung . Überprüfen sie die Anlage!'});
                                          
                                          if (logging) log ('Sammelstörung Weichwasseranlage');
                                          });   
                                          
                                          // Display einschalten bei Betreten des Raum
                                          
                                          on({id:'zigbee.0.00158d0002bfc52d.opened'}, function (obj){
                                          const idTuer = 'zigbee.0.00158d0002bfc52d.opened';
                                          var Tuer = getState(idTuer).val;
                                              if(Tuer){
                                                  setState('javascript.0.Status.Gruenbeck.SC18.Parameter.D_C_6_1',1);
                                                          if (logging) log ('Display Weichwasseranlage ein geschaltet');
                                          
                                                  }else{
                                                  setState('javascript.0.Status.Gruenbeck.SC18.Parameter.D_C_6_1',0);
                                                  if (logging) log ('Display Weichwasseranlage aus geschaltet');
                                              }
                                          });  
                                          
                                          
                                          //Regeneration starten wenn niemand zu Hause und Level unterschritten oder Level bei nur 1%
                                          var logging = true
                                          
                                          function Autoregeneration() {
                                          
                                          var Anwesend = getState('javascript.0.Anwesenheitssteuerung.BewohnerAnwesend').val;
                                          
                                          var Kapazitaet = getState('javascript.0.Status.Gruenbeck.SC18.Allgemein.D_Y_10_1').val;
                                          
                                          var Waschmaschine = getState ('javascript.1.Statusmeldungen.Waschmaschine.Status').val;
                                          
                                          var Regeneration = getState(idReg).val;
                                          
                                          if (Regeneration===0 && Anwesend===false && Waschmaschine===false && Kapazitaet <=5){
                                          
                                          setState(idRegStart,true);
                                          
                                          if (logging) log ('Regeneration Weichwasseranlage wegen geringer Restkapazität während der Abwesenheit gestartet');
                                          
                                                   }else{
                                              
                                                      if(Regeneration===0 && Kapazitaet<=2 && Kapazitaet >1){
                                                  
                                                      setState(idRegStart,true);
                                          
                                                      if (logging) log ('Regeneration Weichwasseranlage kurz vor Kapazitätsende gestartet');
                                                  }
                                              }
                                          }
                                          
                                          on({id:'javascript.0.Anwesenheitssteuerung.BewohnerAnwesend',val:false,change:'ne'}, function (obj){
                                          Autoregeneration();    
                                          });
                                          
                                          on({id:'javascript.0.Status.Gruenbeck.SC18.Allgemein.D_Y_10_1',change:'ne'}, function (obj){
                                          Autoregeneration(); 
                                          });
                                          
                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          825

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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