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.