NEWS
Daten aus einer Website mit Javascript
-
Noch mal abschließend:
Die Nutzung von request lege ich zur Seite, denn das Script mit xmlhhtprequest läuft jetzt ohne Fehler.
Meine Vermutung:
Während das Script vorgestern ja erst lief, habe ich parallel andere Abfragen gemacht. Die Webseite der Grünbeck war im Forefox offen, dann noch ein Test mit dem Firefox-Plugin HTTP Request Maker und die Android App war auch noch auf. Scheinbar war das das Problem. Zumindest seit gestern Nachmittag läuft das Script mit alleiniger Nutzung ohne Fehler durch. Den Abfrageintervall habe ich auf 15 Sekunden gestellt. -
@Marc_P Ok gut zu wissen, habe mir den gruenbeck nämlich schon bestellt.
-
-
Hatte mal wieder etwas Zeit und habe das Script von hiasii12 etwas umgebaut und optimiert.
Hoffe du bist nicht sauer deswegenÄnderungen:
- Die Werte der SC18 werden alle 15 sek. abgefragt, bis auf Wasserverbrauch und Regenerationen diese werden immer
um 00:00 Uhr abgefragt. - Habe den Pfad geändert auf javascript.0.Gruenbeck.SC18 um bei mir eine bessere Übersicht zu haben, was mit JS programmiert
wurde und zwischen der SC und MC zu unterscheiden (MC mache ich erst, wenn alles problemlos läuft). Wer den alten Pfad
haben will, muss das im Bereich User Anpassungen im Script ändern. - Power- Eco- Modus umschaltung über Vis integriert
- Die einzelnen Pfade werden jetzt beim Start angelegt so das nur noch ein Script benötigt wird und das Script State entfällt.
Habe das jetzt zwei Tage gestestet und es läuft bei mir ohne Fehler
Geplante Änderungen:
- Problem lösen, das bei kürzeren Abfragen hintereinander, der Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" auftritt.
- 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.
Es kann natürlich jeder noch Vorschläge machen und sich auch bei der Lösung beteiligen.
Meine Programmierkenntnise in JS, sind schon ziemlich eingerostet, sodas es bei mir etwas länger dauert. - Die Werte der SC18 werden alle 15 sek. abgefragt, bis auf Wasserverbrauch und Regenerationen diese werden immer
-
@ArnoD finde ich klasse das du hier weiter machst. Mit der Ablage der states war ich auch nicht ganz zufrieden. Wegen der Alarmmelung ohne ping haette ich ne Idee... Hier müssten einfach die abgerufenen states überwacht werden. Wenn nach einer festgelegten Zeit x keine aktualisierung erfolgt kann davon ausgegangen werden das es verbindungsprobleme gibt.
-
Ansonsten ueber wache ich ohnehin sämtliche Hardware im Netzwerk mit einem separaten Script mittels enum Funktion z. B WLAN geraete welche ich mittels tr64 Adapter Abfrage...Bei Abwesenheit gibt's ne push Nachricht mit der entsprechenden Meldung mit Verweis auf das Geraet
-
@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.
Ä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)} });
-
Super ich hoffe bald testen zu können... Meine Anlage haette eigentlich am Sa schon geliefert werden sollen... Hoffe sie kommt dann Anfang der Woche..
-
Mir ist noch was kleines eingefallen..Wie schaut es mit nem Urlaubsmodus aus...Evtl. kann man ja noch ein state für vis hinzufügen / Urlaub, welches als Bedingung für den Datenabruf true sein muss, sodass wenn die anlage während des Urlaubs still gesetzt bzw. ausgeschaltet wird, keine Fehler im log auftauchen...Ich mache das generell mit meinen Scripten so, dass ich immer zwischen automatik und manuell umschalten kann..In diesem Fall wäre es halt ein Urlaubsmodus, welcher wenn aktiv den Schedule /über clear Schedule deaktiviert...Nur so ne idee...
-
Das gibt es doch schon
Schau mal bei den Objekten unter Javascript.0.scriptEnabled.common.Gruenbeck dort den State auf "false" ändern, damit wird das script angehalten und mit "true" wieder gestartet. -
Ja das kann man natürlich auch machen...
-
Hallo ArnoD
Erstmal ein großes Lob an dein Grünbeck Script.
Ich habe dieses seit 4 Tagen am Laufen.
Alles Funktioniert soweit sehr gut ausser das es sich nach ca 1h einfach aufhängt.
Konntet ihr bei euch auch sowas feststellen ? -
Hallo Schnid_no1,
ich habe das Script noch mal verändert.
Laut Schnittstellenbeschreibung können über die Schnittstelle max. 1000 Byte übertragen werden.
Wenn ich alle Werte auf einmal Abfrage, komme ich auf 564 Byte beim Senden und 1630 Byte als Antwort, was eigentlich ja zu viel wäre. Bei mir läuft das aber ohne Probleme.
Ich habe aber festgestellt da die Antwortzeiten sehr stark variieren und zwar unabhängig von der Größe der übertragenen Daten. Ich habe jetzt die Antwortzeit auf 3 sek. bis zum Timeout begrenzt, da in 90% die Rückmeldung in 3 sek. erfolgt.
Ich habe aber auch festgestellt das zum Teil gar keine Rückmeldung von der Anlage kommt was dann immer zum Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" geführt hat.
Was ich noch feststellen konnte ist, dass beim Starten vom Script es manchmal drei Sendevorgänge benötigt bis die Schnittstelle Antwortet.
Es wäre natürlich hilfreich, wenn du hier posten könntest was für eine Fehlermeldung im Log kommt, wenn sich das Script bei dir aufhängt.
Es wäre auch interessant wie die Antwortzeiten der Schnittstelle bei anderen Anlagen ist.
Um das zu testen müsstest du im Script die Variable debug auf true setzen und im Log die Zeiten von „Daten wurden gesendet“ bis zu „Rueckmeldung SC18“ hier posten.
Habe mein Post weiter oben, das alte Script durch das geänderte Script korrigiert. -
Hallo ArnoD
Eine Fehlermeldung gabs leider keine.Das Script 1.1.0 hörte einfach auf in die Objekte zu schreiben.
Habe dein neues Script 1.2.0 schon am laufen und bekam im log folgendes.- javascript.0 2019-03-02 12:48:45.006 info script.js.Allgemein.Grünbeck120: Daten wurden gesendet
- javascript.0 2019-03-02 12:48:33.400 info script.js.Allgemein.Grünbeck120: Rueckmeldung SC18:<data><code>ok</code><D_D_1>22.0</D_D_1><D_D_2>-</D_D_2><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>0</D_C_1_1><D_C_2_1>0</D
- javascript.0 2019-03-02 12:48:30.022 info script.js.Allgemein.Grünbeck120: Daten wurden gesendet
- javascript.0 2019-03-02 12:48:18.458 info script.js.Allgemein.Grünbeck120: Rueckmeldung SC18:<data><code>ok</code><D_D_1>22.0</D_D_1><D_D_2>-</D_D_2><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>0</D_C_1_1><D_C_2_1>0</D
- javascript.0 2019-03-02 12:48:15.008 info script.js.Allgemein.Grünbeck120: Daten wurden gesendet
- javascript.0 2019-03-02 12:48:01.307 info script.js.Allgemein.Grünbeck120: registered 1 subscription and 1 schedule
- javascript.0 2019-03-02 12:48:01.261 info Start javascript script.js.Allgemein.Grünbeck120
Ich hoffe es war das was du brauchst.
Danke für deine Arbeit! -
Zudem ist mir aufgefallen das beim Script 1.1.0 jeder einzelne beschriebene Datenpunkt im Log aufgeführt wurde.
Beim Script 1.2.0 nur das wie oben aufgeführt. Und wenn ich die Variable debug auf false setze kommt nur 1x senden und 1x empfangen danach werden die Datenpunkte weiter beschrieben ohne das dies im Log aufgeführt wird.
Lasse die Variable debug jetzt auf true und schau mal was passiert. -
Ok danke, die Antwortzeiten sind vergleichbar wie bei mir um die 3 sek.
Beim Script 1.1.0 sind noch einige Fehler enthalten, bin erst am Anfang das ich einigermaßen verstehe wie die Schnittstelle auf Anfragen reagiert.
Ich vermute das die Schnittstelle der SC18 nicht die schnellste ist.
Habe bei mir die den Abfragetakt auf 30 Sek. eingestellt und das Timeout auf 15 sek. seitdem bekomme ich auf jeden Send Befehl auch ein Antwort nach 3 Sek.
Werde mich noch etwas mit den Einstellungen spielen um zu testen ab wann die Schnittstelle überfordert ist. -
Bin auf dein nächste Neuerung gespannt!
Weiter so!!! -
Ok, habe jetzt für mich die Richtigen Einstellungen gefunden.
Abfragezyklus 18 Sek. und Timeout 15 Sek.
Alles unter 18 Sek. führt bei mir dazu, dass ich sporadisch keine Rückantwort von der Anlage erhalte.
Script weiter oben mit diesen Einstellungen angepasst.
Werde mich jetzt mit den änderbaren Werten beschäftigen, da ich hier noch keine Lösung habe wie ich diese im Abfragezyklus so integriere das keine Überschneidung entsteht.
Wenn jemand da eine Lösung hat, würde ich mich freuen.
Da ich immer noch nicht weiß, wie man eine manuelle Regeneration starten kann, würde ich mich auch da über Unterstützung freuen.
Ich weiß bis jetzt nur das es über den Parameter D_B_1 gehen müsste, aber irgendwie funktioniert ein einfaches xhr.send("id=8871&edit=D_B_1>" + Status + "&show=D_B_1~") hier nicht. -
ArnoD leider kenne ich mich nur mit heidenhain und siemens840d aus javascript ist Neuland für mich also werde ich dir dabei leider nicht helfen können. Habe gerade noch 1.2.2 drauf gezogen. Und melde mich die nächsten drei Tage ab. Dir viel Spaß beim testen
-
So heute habe auch ich die Anlage in Betrieb genommen und vor 5 min das Script. Das Script hat auf Anhieb funktioniert. Wie es sich jetzt verhält kann ich dann die nächsten Tage auch berichten. Debug habe ich mal aktiviert.