Die Suche ergab 24 Treffer

von Sven
27. April 2021, 23:31
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo Ulrich,
leider kann ich das Problem nicht nachvollziehen.
Habe es gerade probiert mit Licht ein aus.
Damit Funktioniert es super.
Pool_Licht_an.png
Pool_Licht_an.png (201.66 KiB) 283 mal betrachtet
Pool_Licht_Automatic.png
Pool_Licht_Automatic.png (167.92 KiB) 283 mal betrachtet
Evtl. überschreibt die Automatik deine manuellen Vorgabewerte.

Gruß Sven
von Sven
8. Februar 2020, 14:57
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo Cristian,
Sprich, der Adapter frägt ja nur die Datenbank, welche alle 15 min geschrieben wird ab.
Das verstehe ich leider nicht, welche Datenbank wird alle 15 min abgefragt?
Bei mir wird die Instanz vom Adpater Pollcontroller jede minute per cron abgefragt .
Und ja natürlich sind die Werte dann minütlich aktuell, denn es wird ja die GetState.csv vom Poolcontroller abgefragt.
Das mit dem Einbau ins iframe funktioniert leider nicht, da die Daten nicht vom Poolcontroller direkt zur Verfügung stehen.
Es ist halt doof, wenn z.B. einer der Belimos gerade aus- oder eingeschaltet hat, und dann noch 14 min. der falsche Zustand oder halt nicht der ist- Zustand angezeigt wird.
Stimmt, passiert ja auch nicht ;)
Poolcontroller VIS
Poolcontroller VIS
Pool_vis_01.png (241.8 KiB) 362 mal betrachtet
Ich hoffe das beantworted deine Fragen...

Steuern würde ich übrigens auch aus iobroker, leider gibt es keine einfache Schnittstelle dazu.
Die Bit schieberei habe ich mal angefangen, bin aber noch nicht wirklich weiter gekommen....
Es wäre nämlich gut, wenn meine PV genug überschuss bringt, dass dann die Pumpe in die nächste Drehzahlsstufe schalten würde :D

Gruß
Sven
von Sven
1. Oktober 2019, 19:21
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo,

@wburst
Ich hatte bis jetzt noch keine Berührung mit NodeRed und schon garnicht mit KNX, da mich die hohen Preise immer abgeschreckt haben.
Deshalb kann ich Dir da leider nicht weiter helfen.
Wie aber Raffke schon schrieb.....
Du kannst gerne aus meiner Vorarbeit einen Node-Red/KNX Adapter entwickeln ;)

Eine Info noch für alle:

Der Adapter läuft auch mit der kommenden js-controller 2.0 Version. Aktuell 2.0.17
Hier wurde "unter der Haube" einiges in Sachen Kommunikation (socket.io/TCP)verändert....
Das habe ich heute mal getestet....
Einem ioBroker "Latest" Update steht also in ca. 14 Tagen nichts im Wege.

Viele Grüße
Sven
von Sven
15. März 2019, 21:34
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo,

heute einge Änderungen im github übernommen.
Betrifft nur Kompatibilität zur aktuellen iobroker Version.
Ansonsten leider noch keine neuen Funktionen.
https://github.com/svenp/ioBroker.poolcontroller


Gruß
Sven
von Sven
25. Oktober 2018, 23:14
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo,
wer meine Version des angepassten ioBroker Adapter von Michael testen mag, sollte hier schauen..
https://github.com/svenp/ioBroker.poolcontroller

Aber immer bedenken, das ist die aktuelle Entwicklung, Fehler können vorhanden sein....

Gruß
Sven
von Sven
24. Oktober 2018, 22:16
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo,
für den IoBroker Adapter von Michael habe ich hier mal meine aktuelle Version mit vielen Verbessungen und Vorbereitungen zum Relay Status ändern.

Code: Alles auswählen

/**************************************************************************** 
*  Version 0.3                                                                   * 
*  Script zum einlesen der GetState.csv vom PoolController in IOBroker      *
*  Wichtig: Die Namen im Controller dürfen kein Punkte enthalten !!!        *
*  Also es darf kein "n.a." verwendet werden Leerzeichen werden für         *
*  IOBroker durch Unterstriche ersetzt.                                     *
*  Die URL muss entsprechend auf die IP des PoolController angepasst werden *
*                                                                           *
*  Funktion:                                                                *
*  Beim Skript start werden die Namen eingelesen und dann als Objekt unter  *
*  Javascript.0.Poolcontroller.XXX angelegt. Die Einheiten werden auch      *
*  automatisch zugeordnet. Danach wird alle 30 Sekunden die GetState.csv    *
*  abgerufen und die Variablen werden in IOBroker Objekte geschrieben       *
*  Die Berechnug offset + ( gain * value) erfolgt bereits in diesem Script  *
*                                                                           *
****************************************************************************/

var url='http://192.168.xx.xx:8080/GetState.csv'

//*********************************************************************
var result, json;
var stateanlegen = true;

//alle 30 Sekunden Werte neu einlesen
schedule("*/30 * * * * *", function () {
  ReadData();
});

// Abfrage der VIS_Buttons Relais Status
on({id: "javascript.0.PoolController.visButtons.Relais0", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(0);
});
on({id: "javascript.0.PoolController.visButtons.Relais1", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(1);
});
on({id: "javascript.0.PoolController.visButtons.Relais2", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(2);
});
on({id: "javascript.0.PoolController.visButtons.Relais3", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(3);
});
on({id: "javascript.0.PoolController.visButtons.Relais4", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(4);
});
on({id: "javascript.0.PoolController.visButtons.Relais5", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(5);
});
on({id: "javascript.0.PoolController.visButtons.Relais6", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(6);
});
on({id: "javascript.0.PoolController.visButtons.Relais7", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(7);
});
on({id: "javascript.0.PoolController.visButtons.Relais8", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(8);
});
on({id: "javascript.0.PoolController.visButtons.Relais9", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(9);
});
on({id: "javascript.0.PoolController.visButtons.Relais10", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(10);
});
on({id: "javascript.0.PoolController.visButtons.Relais11", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(11);
});
on({id: "javascript.0.PoolController.visButtons.Relais12", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(12);
});
on({id: "javascript.0.PoolController.visButtons.Relais13", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(13);
});
on({id: "javascript.0.PoolController.visButtons.Relais14", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(14);
});
on({id: "javascript.0.PoolController.visButtons.Relais15", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  visButtonChanged(15);
});


function visButtonChanged(relaisNumber){
    ReadData();
    var visRelaisState = getState('javascript.0.PoolController.visButtons.Relais'+relaisNumber).val;
   // console.log(visRelaisState);
    var relaisState = getState('javascript.0.PoolController.Relais'+relaisNumber).val;
   // console.log(visRelaisState);
    if (visRelaisState != relaisState){
        var ena,state;
        console.log("Status Relais ändern");
        if (visRelaisState===0 && relaisState > 1){
            // 00 = 0 Aus / Automatik
             ena = 0 & ~(0x01<< relaisNumber);
             state = 0 & ~(0x01<< relaisNumber )
        }
        
        if (visRelaisState===1 && relaisState ===3){
            // 01 = 1 Aus / Manuell
             ena = 0 & ~(0x01<< relaisNumber);
             state = 1 |(0x01<< relaisNumber)
        }
        if (visRelaisState===2){
            // 10 = 2 Ein / Automatik
            ena = 1 | (0x01<< relaisNumber)
             state = 0 & ~(0x01<< relaisNumber)
        }
        if (visRelaisState===3){
            // 11 = 3 Ein / Manuell
             ena = 1 | (0x01<< relaisNumber)
             state = 1 |(0x01<< relaisNumber)
        }
        console.log('Relais: '+ena);
        console.log('State: '+state);
    }
    else{
        console.log("Kein Änderung nötig");
    }
    
/**
00 = 0 Aus / Automatik
01 = 1 Aus / Manuell
10 = 2 Ein / Automatik
11 = 3 Ein / Manuell
den Status holen und das passende Relais bit maskieren ( entweder löschen oder setzen)
löschen = ena = ena & ~(0x01<< RELAIS ) // mit Relais von 0..15)
setzen = ena = ena | (0x01<< RELAIS ) // mit Relais von 0..15)

das Gleiche für State
löschen = state = state & ~(0x01<< RELAIS ) // mit Relais von 0..15)
setzen = state = state | (0x01<< RELAIS ) // mit Relais von 0..15)**/
    
}

function ReadData(){
    try {
    require("request")(url, function (error, response, result) {
     // console.log(result);
    result = result.replace(/ /g, '_');  //alle Leerzeichen durch Unterstrich ersetzten
    var data=CSVToArray(result);         //CSV in ein Array einlesen
    json = JSON.stringify(data);         //Array in einen String formatieren
    var jdata = JSON.parse(json);        //Json Array erzeugen
    var arr1 = jdata[0];                 // Array 0 von ingesamt 6, weil 6 Zeilen im CVS mit \n getrennt
    var arr2 = jdata[1];                 // Array 1-5 haben je 42 einzelne  Daten
    var arr3 = jdata[2];
    var arr4 = jdata[3];
    var arr5 = jdata[4];
    var arr6 = jdata[5];
   
//Debug Ausgaben der Arrays
  /*console.log(arr1);
    console.log(arr2);
    console.log(arr3);
    console.log(arr4);
    console.log(arr5);
    console.log(arr6);
 */

  if (stateanlegen === true){

//SYSINFO Variablen anlegen
       createState('javascript.0.PoolController.SYSINFO.VERSION', {
        name: 'VERSION',
        type: 'string',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.CPU_TIME', {
        name: 'CPU_TIME',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.RESET_ROOT_CAUSE', {
        name: 'RESET_ROOT_CAUSE',
        type: 'number',
        write: false,
        read:  true
        });
         createState('javascript.0.PoolController.SYSINFO.NTP_FAULT_STATE', {
        name: 'NTP_FAULT_STATE',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.CONFIG_OTHER_ENABLE', {
        name: 'CONFIG_OTHER_ENABLE',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.DOSAGE_CNTRL', {
        name: 'DOSAGE_CNTRL',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.pH+_DOSAGE_RELAIS_ID', {
        name: 'pH+_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.pH-_DOSAGE_RELAIS_ID', {
        name: 'pH-_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.Chlor_DOSAGE_RELAIS_ID', {
        name: 'Chlor_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
    // User Variablen anlegen Achtung keine Punkte im Namen verwenden. 
    var i=16;
      
    for (i=16; i<=23;i++){
        createState('javascript.0.PoolController.visButtons.Relais'+[i-16],'', {
        name: ''+jdata[1][i],
        type: 'number',
        write: true,
        read:  true
        });
       }
       i=28;
       for (i=28; i<=35;i++){
        createState('javascript.0.PoolController.visButtons.Relais'+[i-20],'', {
        name: ''+jdata[1][i],
        type: 'number',
        write: true,
        read:  true
        });
        }
     i=0;
    for (i=0; i<=41;i++){
        if (i===0){
        createState('javascript.0.PoolController.'+jdata[1][i],'', {
        name: ''+jdata[1][i],
        type: 'string',
        write: false,
        read:  true
        });
        }
        if (i>=1 && i<=5){
        createState('javascript.0.PoolController.ADC'+[i-1],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===6){
        createState('javascript.0.PoolController.Redox', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===7){
        createState('javascript.0.PoolController.pH', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i>=8 && i<=15){
        createState('javascript.0.PoolController.Temperatur'+[i-7],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i>=16 && i<=23){
        createState('javascript.0.PoolController.Relais'+[i-16],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i>=24 && i<=27){
        createState('javascript.0.PoolController.Digital_Input'+[i-23],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i>=28 && i<=35){
        createState('javascript.0.PoolController.Relais'+[i-20],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===36){
        createState('javascript.0.PoolController.CL_Rest', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===37){
        createState('javascript.0.PoolController.pH-_Rest', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===38){
        createState('javascript.0.PoolController.pH+_Rest', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===39){
        createState('javascript.0.PoolController.Cl_consumption', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
        if (i===40){
        createState('javascript.0.PoolController.pH-_consumption', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
         if (i===41){
        createState('javascript.0.PoolController.pH+_consumption', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
    }
    console.log("Variablen angelegt");
    stateanlegen = false;
  }
  else {
  
  //SYSINFO Variablen mit aktuellen Werten beschreiben 
    setState('javascript.0.PoolController.SYSINFO.VERSION', jdata[0][1]);
    setState('javascript.0.PoolController.SYSINFO.CPU_TIME', parseFloat(Number(jdata[0][2]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.RESET_ROOT_CAUSE', parseFloat(Number(jdata[0][3]).toFixed(2))); 
    setState('javascript.0.PoolController.SYSINFO.NTP_FAULT_STATE', parseFloat(Number(jdata[0][4]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.CONFIG_OTHER_ENABLE', parseFloat(Number(jdata[0][5]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.DOSAGE_CNTRL', parseFloat(Number(jdata[0][6]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.pH+_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][7]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.pH-_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][8]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.Chlor_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][9]).toFixed(2)));
  
  
   // User Variablen mit aktuellen Werten beschreiben
   i=0; 
    for (i=0; i<=41;i++){
        //var wert = offset + ( gain * value);
    	var offset =  parseFloat(jdata[3][i]);
    	var gain =   parseFloat(jdata[4][i]);
    	var value =   parseFloat(jdata[5][i]);
      	var wert =  offset + ( gain * value);
      
      	if (i===0) {
      	    wert = ((wert>>8)<10?0:'')+''+(wert>>8)+':'+((wert&0xFF)<10?0:'')+''+(wert&0xFF);
      	  /**  var hour = (wert/256).toFixed(0);
      	    var minute = (wert%256).toFixed(0);
      	   if (minute <10){
      	       wert = (hour+':0'+minute);
      	   }
      	   else{
      	        wert = (hour+':'+minute);
      	   }*/
      	   setState('javascript.0.PoolController.Time',wert);
      	}
      	if (i>=1 && i<=5){
            setState('javascript.0.PoolController.ADC'+[i-1], parseFloat(Number(wert).toFixed(2)));
      	}
      	if (i===6){
      	    setState('javascript.0.PoolController.Redox', parseFloat(Number(wert).toFixed(2)));
      	}
        if (i===7){
        	setState('javascript.0.PoolController.pH', parseFloat(Number(wert).toFixed(2)));
      	}
        if (i>=8 && i<=15){
            setState('javascript.0.PoolController.Temperatur'+[i-7], parseFloat(Number(wert).toFixed(2)));  
        }
        if (i>=16 && i<=23){
            setState('javascript.0.PoolController.Relais'+[i-16], parseFloat(Number(wert).toFixed(2)));  
        }
        if (i>=24 && i<=27){   
            setState('javascript.0.PoolController.Digital_Input'+[i-23], parseFloat(Number(wert).toFixed(2)));  
        }
        if (i>=28 && i<=35){
            setState('javascript.0.PoolController.Relais'+[i-20], parseFloat(Number(wert).toFixed(2)));   
        }
        if (i===36){
           setState('javascript.0.PoolController.CL_Rest', parseFloat(Number(wert).toFixed(2)));   
        }
        if (i===37){
            setState('javascript.0.PoolController.pH-_Rest', parseFloat(Number(wert).toFixed(2)));   
        }
      	if (i===38){
      	    setState('javascript.0.PoolController.pH+_Rest', parseFloat(Number(wert).toFixed(2)));  
      	}
      	if (i===39){
      	    setState('javascript.0.PoolController.Cl_consumption', parseFloat(Number(wert).toFixed(2))); 
      	}
      	if (i===40){
      	     setState('javascript.0.PoolController.pH-_consumption', parseFloat(Number(wert).toFixed(2)));
      	}
      	if (i===41){
      	    setState('javascript.0.PoolController.pH+_consumption', parseFloat(Number(wert).toFixed(2)));
      	}
      	}    
 //   console.log("Variablen updated");
  }
    }).on("error", function (e) {console.error(e);});
  } catch (e) { console.error(e); }
}

/**
* Javascript Transmit Function to set 16 Bit Relais Status
*/

function TransmitPost(relaisNumber, relaisStatus)
{
  var i; var ena; var state;
  ena = 0;
  state = 0;
  //window.clearInterval(timerHandle);
  //timerHandle = 0;
  //with(document)
  {
    for(i=0;i<16;i++)
      {
	if(relaisNumber.val == "2")
	{
	  ena |= 0x0001<<i;
	}
	else if(getElementById("IR"+i+"_0").value == "true")
	{
	  ena |= 0x0001<< i;
	  state |= 0x0001<< i;
	}
      }
  }
  PostBuffer = "ENA="+ena+","+state+"&MANUAL=1";
  //AjaxPostRequest("usrcfg.cgi",PostBuffer,Call);
}



/**
* Javascript CSV To Array
*/

function CSVToArray( strData, strDelimiter ){
    // Check to see if the delimiter is defined. If not,
    // then default to comma.
    strDelimiter = (strDelimiter || ",");

    // Create a regular expression to parse the CSV values.
    var objPattern = new RegExp(
        (
            // Delimiters.
            "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

            // Quoted fields.
            "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

            // Standard fields.
            "([^\"\\" + strDelimiter + "\\r\\n]*))"
        ),
        "gi"
        );


    // Create an array to hold our data. Give the array
    // a default empty first row.
    var arrData = [[]];

    // Create an array to hold our individual pattern
    // matching groups.
    var arrMatches = null;


    // Keep looping over the regular expression matches
    // until we can no longer find a match.
    while (arrMatches = objPattern.exec( strData )){

        // Get the delimiter that was found.
        var strMatchedDelimiter = arrMatches[ 1 ];

        // Check to see if the given delimiter has a length
        // (is not the start of string) and if it matches
        // field delimiter. If id does not, then we know
        // that this delimiter is a row delimiter.
        if (
            strMatchedDelimiter.length &&
            strMatchedDelimiter !== strDelimiter
            ){

            // Since we have reached a new row of data,
            // add an empty row to our data array.
            arrData.push( [] );

        }

        var strMatchedValue;

        // Now that we have our delimiter out of the way,
        // let's check to see which kind of value we
        // captured (quoted or unquoted).
        if (arrMatches[ 2 ]){

            // We found a quoted value. When we capture
            // this value, unescape any double quotes.
            strMatchedValue = arrMatches[ 2 ].replace(
                new RegExp( "\"\"", "g" ),
                "\""
                );

        } else {

            // We found a non-quoted value.
            strMatchedValue = arrMatches[ 3 ];

        }


        // Now that we have our value string, let's add
        // it to the data array.
        arrData[ arrData.length - 1 ].push( strMatchedValue );
    }

    // Return the parsed data.
    return( arrData );
}

Mir wäre auch an einem Adapter gelegen, deshalb habe ich mal angefangen mein script auf michales Adapter zu portieren.
Gruß
Sven
von Sven
24. Oktober 2018, 17:39
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Adapter für die Anbindung an den ioBroker
Antworten: 7
Zugriffe: 426

Re: Adapter für die Anbindung an den ioBroker

Hallo Michael,

freut mich das ich Dich für einen Adapter inspirieren konnte :D
Ich habe den Adapter mal über das ioBroker manuell per github Adresse installiert.
Nachdem das fertig war, wurde der Adapter zwar als installiert angezeigt, aber unter Instanz war keine Instanz vorhanden.

Erst nachdem ich mit dem Plus Zeichen beim Adapter eine neue Instanz hinzugefügt habe, wurde diese sichtbar und ich konnte die Adresse eingeben.

Danach lief alles ab wie gewohnt, erster Abruf, Datenpunkte erzeugt, beim zweiten Durchlauf kamen die Werte...
Schon mal Danke für den Adapter und mach bitte weiter z.B. mit dem Pumpen Zustands Änderungen, dazu bin ich mangels Zeit leider auch noch nicht gekommen :roll:

Falls ich was testen soll, nur her damit
Irgendwie nicht vollständig das ganze oder?
Poolcontroller_script.png
Poolcontroller_script.png (118.34 KiB) 345 mal betrachtet
Und die Benennung mit ADC und Relais etc. war bei mir auch Absicht
Poolcontroller_instanz.png
Poolcontroller_instanz.png (166.78 KiB) 345 mal betrachtet
Naja aber das ist Geschmacksache

Viele Grüße
Sven
von Sven
31. Mai 2018, 10:12
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo Sven,
1. Wozu erst das CSV in ein Array, dann in ein JSON und zuletzt wieder in ein Array umwandeln? Sind die letzten 2 Schritte nicht überflüssig?
Das ich keine Programmier Leuchte bin hatte ich auch bereits erwähnt :lol:
Für mich ist es einfacher mit einem JSON formatierten Array zu arbeiten weil ich dann an exakter stelle auf die Daten zugreifen kann [data] wie das in einem CSV Array geht, keine Ahnung ;)
2. Im ersten Durchlauf werden nur die Variablen angelegt, noch nicht die Werte gesetzt
Ja das ist Absicht, weil bei ersten Durchlauf vor einem setstate erstmal die Variable da sein muss, dafür wird sie beim ersten Start des scriptes aus dem Array gelesen und dann mit createstate erzeugt.
Danach werden nur noch die Daten mit setstate geändert.

Ich hoffe das konnte deine Fragen beantworten.
Du darfst das Script aber gerne optimieren, wenns was besseres gibt baue ich das genre bei mir ein, aktuell kann ich damit ganz gut leben :D

Viele Grüße
Sven
von Sven
26. Januar 2018, 12:11
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: CODESCHNIPSEL: PERL
Antworten: 33
Zugriffe: 1637

Re: CODESCHNIPSEL: PERL

Frankie hat geschrieben: du meinst die Relais in den (A)utomatik zustand setzen ?
ist etwas komplexer , weil du vorher den aktuellen Zustand aller max 16 Relais abfragen musst und die entsprechenden bitpositionen maskieren musst
mit einem POST Aufruf kannst du dann den Zustand ALLER max 16 Relais zurückschicken ( nach der bit Maskierung)
da steht dann für jedes Relais drin ob es manuel oder Auto betrieben werden soll und im Fall von manuell, welchen Zustand soll das Relais haben
kann ich dir per mail erklären was du tun müsstest , würde hier an dieser Stelle den Rahmen sprengen
gruß
Frank
Hallo Frank,
mich interessiert das auch wie man die Ausgänge extern ,in meinem Fall IOBroker (Javascript) Anzeige auf Wand Tablet, verändern kann. Auto/Ein/Aus
Das mit den 16Bit hört sich jetzt erst einmal nicht ganz so komplex an. Hast Du eine Beschreibung wie man vorgehen muss?

Gruß
Sven
von Sven
8. Januar 2018, 20:53
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

ja ich kann damit arbeiten, ich hole mir die Daten aber schon über den Fhem Adapter in den IO-Broker.
Ja das hatte ich auch erst so, aber ich habe Fhem inzwischen abgeschaltet, deshalb jetzt dieser Weg.
host.debian 2018-01-08 09:24:00.214 error instance system.adapter.javascript.0 terminated with code 0 (OK)
Kann es sein das Du das Script unter Global angelegt hast? Da darf es nämlich nicht rein.
Vielleicht kannst du ja daraus auch einen Adapter bauen.
Ich fürchte dafür reichen meine anfänglichen Javascript Kentnisse (noch ) nicht aus ;)

Und als Javascript macht es ja genau was es soll :mrgreen:
Gruß
Sven
von Sven
7. Januar 2018, 20:15
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

@Michael danke für die Info, freut mich das es funktioniert, leider sind die Bilder so klein das man kaum etwas erkennen kann. Kannst Du denn mit den Daten so arbeiten oder sollte noch etwas anders sein?

@Alex Danke für den Einzeiler, ich verstehe Ihn zwar nicht aber hab den jetzt mal ins Script eingebaut.
Der Test mut modulo256 war auch erfolgreich. Doku müsste dann mal angepasst werden ;)

Hier die aktuelle Version mit berechneter Uhrzeit

Code: Alles auswählen

/**************************************************************************** 
*                                                                           * 
*  Script zum einlesen der GetState.csv vom PoolController in IOBroker      *
*  Wichtig: Die Namen im Controller dürfen kein Punkte enthalten !!!        *
*  Also es darf kein "n.a." verwendet werden Leerzeichen werden für         *
*  IOBroker durch Unterstriche ersetzt.                                     *
*  Die URL muss entsprechend auf die IP des PoolController angepasst werden *
*                                                                           *
*  Funktion:                                                                *
*  Beim Skript start werden die Namen eingelesen und dann als Objekt unter  *
*  Javascript.0.Poolcontroller.XXX angelegt. Die Einheiten werden auch      *
*  automatisch zugeordnet. Danach wird alle 30 Sekunden die GetState.csv    *
*  abgerufen und die Variablen werden in IOBroker Objekte geschrieben       *
*  Die Berechnug offset + ( gain * value) erfolgt bereits in diesem Script  *
*                                                                          
*  Version 0.2
****************************************************************************/

var url='http://192.168.X.X:8080/GetState.csv'

//*********************************************************************
var result, json;
var stateanlegen = true;

//SYSINFO Variablen anlegen
       createState('javascript.0.PoolController.SYSINFO.VERSION', {
        name: 'VERSION',
        type: 'string',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.CPU_TIME', {
        name: 'CPU_TIME',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.RESET_ROOT_CAUSE', {
        name: 'RESET_ROOT_CAUSE',
        type: 'number',
        write: false,
        read:  true
        });
         createState('javascript.0.PoolController.SYSINFO.NTP_FAULT_STATE', {
        name: 'NTP_FAULT_STATE',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.CONFIG_OTHER_ENABLE', {
        name: 'CONFIG_OTHER_ENABLE',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.DOSAGE_CNTRL', {
        name: 'DOSAGE_CNTRL',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.pH+_DOSAGE_RELAIS_ID', {
        name: 'pH+_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.pH-_DOSAGE_RELAIS_ID', {
        name: 'pH-_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.Chlor_DOSAGE_RELAIS_ID', {
        name: 'Chlor_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });


//alle 30 Sekunden Werte neu einlesen
schedule("*/30 * * * * *", function () {
  try {
    require("request")(url, function (error, response, result) {
   //   console.log(result);
    result = result.replace(/ /g, '_');  //alle Leerzeichen durch Unterstrich ersetzten
    var data=CSVToArray(result);         //CSV in ein Array einlesen
    json = JSON.stringify(data);         //Array in einen String formatieren
    var jdata = JSON.parse(json);        //Json Array erzeugen
    var arr1 = jdata[0];                 // Array 0 von ingesamt 6, weil 6 Zeilen im CVS mit \n getrennt
    var arr2 = jdata[1];                 // Array 1-5 haben je 42 einzelne  Daten
    var arr3 = jdata[2];
    var arr4 = jdata[3];
    var arr5 = jdata[4];
    var arr6 = jdata[5];
   
/** Debug Ausgaben der Arrays
    console.log(arr1);
    console.log(arr2);
    console.log(arr3);
    console.log(arr4);
    console.log(arr5);
    console.log(arr6);
 */

  if (stateanlegen === true){
    // User Variablen anlegen Achtung keine Punkte im Namen verwenden. 
    var i=0;
    for (i=0; i<=41;i++){
        if (i===0){
        createState('javascript.0.PoolController.'+jdata[1][i],'', {
        name: ''+jdata[1][i],
        type: 'string',
        write: false,
        read:  true
        });
        }
        else{
        createState('javascript.0.PoolController.'+jdata[1][i],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
        }
    }
    console.log("Variablen angelegt");
    stateanlegen = false;
  }
  else {
  
  //SYSINFO Variablen mit aktuellen Werten beschreiben 
    setState('javascript.0.PoolController.SYSINFO.VERSION', jdata[0][1]);
    setState('javascript.0.PoolController.SYSINFO.CPU_TIME', parseFloat(Number(jdata[0][2]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.RESET_ROOT_CAUSE', parseFloat(Number(jdata[0][3]).toFixed(2))); 
    setState('javascript.0.PoolController.SYSINFO.NTP_FAULT_STATE', parseFloat(Number(jdata[0][4]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.CONFIG_OTHER_ENABLE', parseFloat(Number(jdata[0][5]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.DOSAGE_CNTRL', parseFloat(Number(jdata[0][6]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.pH+_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][7]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.pH-_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][8]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.Chlor_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][9]).toFixed(2)));
  
  
   // User Variablen mit aktuellen Werten beschreiben
   i=0; 
    for (i=0; i<=41;i++){
        //var wert = offset + ( gain * value);
    	var offset =  parseFloat(jdata[3][i]);
    	var gain =   parseFloat(jdata[4][i]);
    	var value =   parseFloat(jdata[5][i]);
      	var wert =  offset + ( gain * value);
      
      	if (i===0) {
      	    wert = ((wert>>8)<10?0:'')+''+(wert>>8)+':'+((wert&0xFF)<10?0:'')+''+(wert&0xFF);
      	  /**  var hour = (wert/256).toFixed(0);
      	    var minute = (wert%256).toFixed(0);
      	   if (minute <10){
      	       wert = (hour+':0'+minute);
      	   }
      	   else{
      	        wert = (hour+':'+minute);
      	   }*/
      	   setState('javascript.0.PoolController.Time',wert);
      	}
      	else{
        setState('javascript.0.PoolController.'+jdata[1][i], parseFloat(Number(wert).toFixed(2)));
      	}
      	    
      	}    
    console.log("Variablen updated");
  }
    }).on("error", function (e) {console.error(e);});
  } catch (e) { console.error(e); }
});


/**
* Javascript CSV To Array
*/

function CSVToArray( strData, strDelimiter ){
    // Check to see if the delimiter is defined. If not,
    // then default to comma.
    strDelimiter = (strDelimiter || ",");

    // Create a regular expression to parse the CSV values.
    var objPattern = new RegExp(
        (
            // Delimiters.
            "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

            // Quoted fields.
            "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

            // Standard fields.
            "([^\"\\" + strDelimiter + "\\r\\n]*))"
        ),
        "gi"
        );


    // Create an array to hold our data. Give the array
    // a default empty first row.
    var arrData = [[]];

    // Create an array to hold our individual pattern
    // matching groups.
    var arrMatches = null;


    // Keep looping over the regular expression matches
    // until we can no longer find a match.
    while (arrMatches = objPattern.exec( strData )){

        // Get the delimiter that was found.
        var strMatchedDelimiter = arrMatches[ 1 ];

        // Check to see if the given delimiter has a length
        // (is not the start of string) and if it matches
        // field delimiter. If id does not, then we know
        // that this delimiter is a row delimiter.
        if (
            strMatchedDelimiter.length &&
            strMatchedDelimiter !== strDelimiter
            ){

            // Since we have reached a new row of data,
            // add an empty row to our data array.
            arrData.push( [] );

        }

        var strMatchedValue;

        // Now that we have our delimiter out of the way,
        // let's check to see which kind of value we
        // captured (quoted or unquoted).
        if (arrMatches[ 2 ]){

            // We found a quoted value. When we capture
            // this value, unescape any double quotes.
            strMatchedValue = arrMatches[ 2 ].replace(
                new RegExp( "\"\"", "g" ),
                "\""
                );

        } else {

            // We found a non-quoted value.
            strMatchedValue = arrMatches[ 3 ];

        }


        // Now that we have our value string, let's add
        // it to the data array.
        arrData[ arrData.length - 1 ].push( strMatchedValue );
    }

    // Return the parsed data.
    return( arrData );
}

von Sven
7. Januar 2018, 16:52
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo,
in der Beschreibung steht, das man die Urhzeit folgendermaßen berechnet:

Code: Alles auswählen

hh = (Wert/256)
mm = (Wert Modulo 60)
In Javascript sieht das dann folgendermaßen aus:

Code: Alles auswählen

var hour = (wert/256).toFixed(0);
var minute = (wert%60).toFixed(0);
      	   if (minute <10){
      	       wert = (hour+':0'+minute);
      	   }
      	   else{
      	        wert = (hour+':'+minute);
      	   }
Leider wird die minute nicht korrekt dargestellt- Die Anzeige ist immer 32 Minuten zuweit vorne.
Die Modulo Berechnug mit dem Taschenrechner kommt allerdings auf das selbe Ergebnis.
Kann es sein das Modulo 60 nicht mehr korrekt ist?
Gruß
Sven
von Sven
5. Januar 2018, 15:03
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Re: Anbindung an IOBROKER

Hallo,
nachdem ich mich nun mit Javascript auseinader gesetzt habe ist nachfolgendes Script entstanden.
Ich habe viel von anderer Stelle zusammen getragen und in diesem Script verabeitet, vielen Dank an alle die dazu beigetragen haben.
Anregungen und Erfahrungsaustausch ist willkommen :D

Gruß
Sven

Code: Alles auswählen

/**************************************************************************** 
*                                                                           * 
*  Script zum einlesen der GetState.csv vom PoolController in IOBroker      *
*  Wichtig: Die Namen im Controller dürfen kein Punkte enthalten !!!        *
*  Also es darf kein "n.a." verwendet werden Leerzeichen werden für         *
*  IOBroker durch Unterstriche ersetzt.                                     *
*  Die URL muss entsprechend auf die IP des PoolController angepasst werden *
*                                                                           *
*  Funktion:                                                                *
*  Beim Skript start werden die Namen eingelesen und dann als Objekt unter  *
*  Javascript.0.Poolcontroller.XXX angelegt. Die Einheiten werden auch      *
*  automatisch zugeordnet. Danach wird alle 30 Sekunden die GetState.csv    *
*  abgerufen und die Variablen werden in IOBroker Objekte geschrieben       *
*  Die Berechnug offset + ( gain * value) erfolgt bereits in diesem Script  *
*                                                                           *
****************************************************************************/

var url='http://192.168.x.x:8080/GetState.csv'

//*********************************************************************
var result, json;
var stateanlegen = true;

//SYSINFO Variablen anlegen
       createState('javascript.0.PoolController.SYSINFO.VERSION', {
        name: 'VERSION',
        type: 'string',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.CPU_TIME', {
        name: 'CPU_TIME',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.RESET_ROOT_CAUSE', {
        name: 'RESET_ROOT_CAUSE',
        type: 'number',
        write: false,
        read:  true
        });
         createState('javascript.0.PoolController.SYSINFO.NTP_FAULT_STATE', {
        name: 'NTP_FAULT_STATE',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.CONFIG_OTHER_ENABLE', {
        name: 'CONFIG_OTHER_ENABLE',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.DOSAGE_CNTRL', {
        name: 'DOSAGE_CNTRL',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.pH+_DOSAGE_RELAIS_ID', {
        name: 'pH+_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.pH-_DOSAGE_RELAIS_ID', {
        name: 'pH-_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });
        createState('javascript.0.PoolController.SYSINFO.Chlor_DOSAGE_RELAIS_ID', {
        name: 'Chlor_DOSAGE_RELAIS_ID',
        type: 'number',
        write: false,
        read:  true
        });


//alle 30 Sekunden Werte neu einlesen
schedule("*/30 * * * * *", function () {
  try {
    require("request")(url, function (error, response, result) {
   //   console.log(result);
    result = result.replace(/ /g, '_');  //alle Leerzeichen durch Unterstrich ersetzten
    var data=CSVToArray(result);         //CSV in ein Array einlesen
    json = JSON.stringify(data);         //Array in einen String formatieren
    var jdata = JSON.parse(json);        //Json Array erzeugen
    var arr1 = jdata[0];                 // Array 0 von ingesamt 6, weil 6 Zeilen im CVS mit \n getrennt
    var arr2 = jdata[1];                 // Array 1-5 haben je 42 einzelne  Daten
    var arr3 = jdata[2];
    var arr4 = jdata[3];
    var arr5 = jdata[4];
    var arr6 = jdata[5];
   
/** Debug Ausgaben der Arrays
    console.log(arr1);
    console.log(arr2);
    console.log(arr3);
    console.log(arr4);
    console.log(arr5);
    console.log(arr6);
 */

  if (stateanlegen === true){
    // User Variablen anlegen Achtung keine Punkte im Namen verwenden. 
    var i=0;
    for (i=0; i<=41;i++){
        createState('javascript.0.PoolController.'+jdata[1][i],'', {
        name: ''+jdata[1][i],
        type: 'number',
        unit: ''+jdata[2][i],
        write: false,
        read:  true
        });
    }
    console.log("Variablen angelegt");
    stateanlegen = false;
  }
  else {
  
  //SYSINFO Variablen mit aktuellen Werten beschreiben 
    setState('javascript.0.PoolController.SYSINFO.VERSION', jdata[0][1]);
    setState('javascript.0.PoolController.SYSINFO.CPU_TIME', parseFloat(Number(jdata[0][2]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.RESET_ROOT_CAUSE', parseFloat(Number(jdata[0][3]).toFixed(2))); 
    setState('javascript.0.PoolController.SYSINFO.NTP_FAULT_STATE', parseFloat(Number(jdata[0][4]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.CONFIG_OTHER_ENABLE', parseFloat(Number(jdata[0][5]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.DOSAGE_CNTRL', parseFloat(Number(jdata[0][6]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.pH+_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][7]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.pH-_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][8]).toFixed(2)));
    setState('javascript.0.PoolController.SYSINFO.Chlor_DOSAGE_RELAIS_ID', parseFloat(Number(jdata[0][9]).toFixed(2)));
  
  
   // User Variablen mit aktuellen Werten beschreiben
   i=0; 
    for (i=0; i<=41;i++){
        //var wert = offset + ( gain * value);
    	var offset =  parseFloat(jdata[3][i]);
    	var gain =   parseFloat(jdata[4][i]);
    	var value =   parseFloat(jdata[5][i]);
      	var wert =  offset + ( gain * value);
        setState('javascript.0.PoolController.'+jdata[1][i], parseFloat(Number(wert).toFixed(2)));
      	}    
    console.log("Variablen updated");
  }
    }).on("error", function (e) {console.error(e);});
  } catch (e) { console.error(e); }
});


/**
* Javascript CSV To Array
*/

function CSVToArray( strData, strDelimiter ){
    // Check to see if the delimiter is defined. If not,
    // then default to comma.
    strDelimiter = (strDelimiter || ",");

    // Create a regular expression to parse the CSV values.
    var objPattern = new RegExp(
        (
            // Delimiters.
            "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

            // Quoted fields.
            "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

            // Standard fields.
            "([^\"\\" + strDelimiter + "\\r\\n]*))"
        ),
        "gi"
        );


    // Create an array to hold our data. Give the array
    // a default empty first row.
    var arrData = [[]];

    // Create an array to hold our individual pattern
    // matching groups.
    var arrMatches = null;


    // Keep looping over the regular expression matches
    // until we can no longer find a match.
    while (arrMatches = objPattern.exec( strData )){

        // Get the delimiter that was found.
        var strMatchedDelimiter = arrMatches[ 1 ];

        // Check to see if the given delimiter has a length
        // (is not the start of string) and if it matches
        // field delimiter. If id does not, then we know
        // that this delimiter is a row delimiter.
        if (
            strMatchedDelimiter.length &&
            strMatchedDelimiter !== strDelimiter
            ){

            // Since we have reached a new row of data,
            // add an empty row to our data array.
            arrData.push( [] );

        }

        var strMatchedValue;

        // Now that we have our delimiter out of the way,
        // let's check to see which kind of value we
        // captured (quoted or unquoted).
        if (arrMatches[ 2 ]){

            // We found a quoted value. When we capture
            // this value, unescape any double quotes.
            strMatchedValue = arrMatches[ 2 ].replace(
                new RegExp( "\"\"", "g" ),
                "\""
                );

        } else {

            // We found a non-quoted value.
            strMatchedValue = arrMatches[ 3 ];

        }


        // Now that we have our value string, let's add
        // it to the data array.
        arrData[ arrData.length - 1 ].push( strMatchedValue );
    }

    // Return the parsed data.
    return( arrData );
}

von Sven
3. Januar 2018, 17:22
Forum: ANBINDUNG AN EXTERNE SOFTWARE
Thema: Anbindung an IOBROKER
Antworten: 76
Zugriffe: 1740

Anbindung an IOBROKER

Hallo,
hat schon jemand Erfahrung mit der Anbindung an IOBroker?
Ich persönlich habe bisher Fhem genutzt, nochmal vielen Dank für das Fhem Modul, und bin jetzt fast mit der Umstellung von Fhem auf http://iobroker.org fertig. Nie wieder Perl :D
Da stellt sich nun die Frage, hat schon jemand einen Adpater oder JavaScripte zur Anbindung an den Pool Controller umgesetzt bzw. in Planung?

Falls ja könnte man sich ja mal darüber austauschen :)

Viele Grüße
Sven
von Sven
7. Juni 2016, 21:51
Forum: ARCHIV
Thema: Der "Wer hat was neues"- Thread 2016
Antworten: 38
Zugriffe: 344

Re: Der "Wer hat was neues"- Thread 2016

Hallo,
Da wir ja bei wer hat was neues sind, hier mal meine LowCost Variante vom elektrischem DN63 Solar Ventil.

Es lebe der 3D Druck :D

Gruß
Sven
von Sven
30. Mai 2016, 23:29
Forum: SONSTIGES
Thema: ERFAHRUNGSWERTE BADU 90 ECO VS
Antworten: 48
Zugriffe: 625

Re: ERFAHRUNGSWERTE BADU 90 ECO VS

Mario hat geschrieben:
Die Verrohrung ist komplett in 50'er?
Das Umschaltventil ist eine 11/2" Version?
Zwischen Pumpe und Filter sind das ~2,5-3m?
Das Manometer sitzt oben am Kessel und zeigt nur die Drücke an die ab dort entstehen, das was vorher passiert bekommst in dem Fall gar nicht mit.
Bedeutet,
das längere Rohr, die paar Winkel und das für die Menge zu kleine Umschaltventil erzeugen bei der maxi Durchflussmenge garantiert zusammen nochmal 0,5-0,7bar Gegendruck.
Somit bist du an der Pumpe bei 1,2-1,4bar und wenn du dann auf die Kennlinie schaust, kommen dann auch nur noch ~16m³/h hinten raus...
Pumpe sollte also funktionieren.
Für die komplette Menge ist die Verrohrung halt nicht ganz so optimal...
Nun Verrohrung ist in 63 bis auf den Abfluss der ist 50 ;-)
11/2" ?? kann sein war beim Filter dabei... ist nur 50er Anschluss dran
Das mit dem Manometer auf dem Kessel leuchtet ein, habe ich noch nicht drüber nachgedacht das der Druck an der Pumpe viel höher ist bei guten 3Meter 63 Rohr.
@All
Aber was mich immer wieder wundert diese Angaben m³ / Watt etc. wie messt Ihr den Durchfluss und wie seit Ihr sicher das es auch stimmt?
Oder werden nur Kenlinien abgeschätzt?

Gruß
Sven
von Sven
26. Mai 2016, 09:19
Forum: SONSTIGES
Thema: ERFAHRUNGSWERTE BADU 90 ECO VS
Antworten: 48
Zugriffe: 625

Re: ERFAHRUNGSWERTE BADU 90 ECO VS

Hallo Stefan,
ja ich habe jetzt mal die Werte von Dudo übernommen.

M11: 63 mm (Aussendurchmesser)
M12: 3.25 mm (Wandstärke)
M13: 56.5 mm (Innendurchmesser)
M14: 5 (PVC) (Rohrmaterial)
M15: 0 (keine Rohrauskleidung innen)
M25: 39.7885 mm (Display the transducer mounting spacing or distance) (Abst
and der beiden Geber)

Wobei mein Roohr eine etwas dicke Wandstärke hat. Nun der Abstand gibt der TUF mit 4cm vor.
Nur wie kann ich prüfen ob die Anzeige stimmt?
Eigendlich doch nur so wie ich das gemacht habe. Also Wasser in Abfluss pumpen und anhand des Wasserverlustes den Durchfluss berechnen.
Wie überprüft Du ob dein Tuf auch das richtige anzeigt?

Zur Fördermenge:
Worin der Sinn einer geregelten Pumpe liegt hängt ja letztendlich vom Einzelfall ab.
Da ich eine kleine PV Anlage (2,88KWP) mit Überschußeinspeisung samt Zweirichtunugszähler habe, macht es bei mir sinn möglichst den Überschuß nicht einzuspeisen sondern lieber direkt zu verbrauchen.
Also soll meine Pumpe wenn viel PV Leistung da ist auch viel fördern um die Umwälzung in möglichst kurzer Zeit zu realisieren.
Spart für mich mehr Geld als wenn die Pumpe 24h mit 250W vor sich hin läuft.
Zudem habe ich dann auch genug Bewegung auf der Oberfäche um diese zu reinigen. Bei 250W ist nichts mit Oberflächenabsaugung der Blätter und co.

Viele Grüße
Sven
von Sven
25. Mai 2016, 19:14
Forum: SONSTIGES
Thema: ERFAHRUNGSWERTE BADU 90 ECO VS
Antworten: 48
Zugriffe: 625

Re: ERFAHRUNGSWERTE BADU 90 ECO VS

So ich hab mal Bilder gemacht....
Ich hoffe die sind soweit Verständlich.
Filter.jpg
Filter.jpg (138 KiB) 299 mal betrachtet
Salz.jpg
Salz.jpg (119.75 KiB) 299 mal betrachtet
Pumpe.jpg
Pumpe.jpg (132.61 KiB) 299 mal betrachtet
Steuerung.jpg
Steuerung.jpg (97.72 KiB) 299 mal betrachtet
Gruß
Sven
von Sven
25. Mai 2016, 10:00
Forum: SONSTIGES
Thema: ERFAHRUNGSWERTE BADU 90 ECO VS
Antworten: 48
Zugriffe: 625

Re: ERFAHRUNGSWERTE BADU 90 ECO VS

Fotos mache ich heute Abend.
Das mit dem Gegendruck zum Becken meinte ich so:
Filter Betrieb 850mbar dann zum Kanal (50er) Rohr 15meter... 710mbar. Also 850-710 ergibt den Druckverlust zum Becken......
von Sven
25. Mai 2016, 07:42
Forum: SONSTIGES
Thema: ERFAHRUNGSWERTE BADU 90 ECO VS
Antworten: 48
Zugriffe: 625

Re: ERFAHRUNGSWERTE BADU 90 ECO VS

Hallo Peter,
Gute Frage ich kann nur ablesen ;)
Ne im Ernst keine Ahnung dachte das wäre normal. Wenn er vorwärts etwa 850mbar hat, dann ergibt sich rückwärts doch abzüglich der Leistungsverluste zum Becken eben diese 710 oder?
Gruß
Sven