IPS-Einbindung eines Solarreglers von Resol?

Will das Thema nochmals aufgreifen:

Wir haben eine Citrin Solar Anlage auf dem Dach und einen Regler von Citrin CS3.2 - das entspricht dem Resol Regler DeltaSol E.

Hab mir nun einen VBus/USB Adapter von Resol zugelegt (Preis ~ 50 Eur). Angeklemmt - kein Problem, überträgt die Daten auf den Rechner in die Resol Software.
Ich wollte natürlich die Daten lieber in IPS visualisieren: in IPS einen Serial Port angelegt und den Com Port der USB Verbindung angegeben und siehe da, die Daten kommen im Rohformat in IPS an. Hierauf habe ich dann eine Register Variable Instanz referenziert.
Da Resol die Protokoll-Spezifikationen veröffentlicht hat, kann man nun mit den entsprechenden Positionen die verschiedenen Daten auslesen. Hierzu habe ich folgendes Skript erstellt:

<?php
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($IPS_SENDER == "RegisterVariable")
{
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($IPS_INSTANCE);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;
 if (strlen($data) < 256)
 {
 RegVar_SetBuffer($IPS_INSTANCE, $data);
 
 }
 else
 {
$data = bin2hex($data);
$aastart = strpos($data,'aa100021771000011135');
$data = substr($data, $aastart);
$data = substr($data,20);
$aapos = strpos($data,'aa');
$data = substr($data,0,$aapos);
$arr = str_split($data,2);
// print_r($arr);

if ($arr[4] & (1<<0))
{
$arr[0] = dechex(hexdec($arr[0]) + 128);
}
if ($arr[4] & (1<<1))
{
$arr[1] = dechex(hexdec($arr[1]) + 128);
}
if ($arr[4] & (1<<2))
{
$arr[2] = dechex(hexdec($arr[2]) + 128);
}
if ($arr[4] & (1<<3))
{
$arr[3] = dechex(hexdec($arr[3]) + 128);
}
$Temp_null = $arr[1].$arr[0];
$Temp_null = hexdec($Temp_null);
$Temp_null = $Temp_null / 10;
SetValue(52119 /*[Resol\Kollektor]*/,$Temp_null);

$Temp_eins = $arr[3].$arr[2];
$Temp_eins = hexdec($Temp_eins);
$Temp_eins = $Temp_eins / 10;
SetValue(39836 /*[Resol\Temp Speicher links oben]*/,$Temp_eins);

if ($arr[10] & (1<<0))
{
$arr[6] = dechex(hexdec($arr[6]) + 128);
}
if ($arr[10] & (1<<1))
{
$arr[7] = dechex(hexdec($arr[7]) + 128);
}
if ($arr[10] & (1<<2))
{
$arr[8] = dechex(hexdec($arr[8]) + 128);
}
if ($arr[10] & (1<<3))
{
$arr[9] = dechex(hexdec($arr[9]) + 128);
}

$Temp_drei = $arr[7].$arr[6];
$Temp_drei = hexdec($Temp_drei);
$Temp_drei = $Temp_drei / 10;


$Temp_vier = $arr[9].$arr[8];
$Temp_vier = hexdec($Temp_vier);
$Temp_vier = $Temp_vier / 10;
SetValue(30276 /*[Resol\Temp Speicher links unten]*/ ,$Temp_vier);

if ($arr[16] & (1<<0))
{
$arr[12] = dechex(hexdec($arr[12]) + 128);
}
if ($arr[16] & (1<<1))
{
$arr[13] = dechex(hexdec($arr[13]) + 128);
}
if ($arr[16] & (1<<2))
{
$arr[14] = dechex(hexdec($arr[14]) + 128);
}
if ($arr[16] & (1<<3))
{
$arr[15] = dechex(hexdec($arr[15]) + 128);
}


$Temp_fuenf = $arr[13].$arr[12];
$Temp_fuenf = hexdec($Temp_fuenf);
$Temp_fuenf = $Temp_fuenf / 10;
SetValue(48252 /*[Resol\Temp Speicher rechts unten]*/ ,$Temp_fuenf);

$Temp_sechs = $arr[15].$arr[14];
$Temp_sechs = hexdec($Temp_sechs);
$Temp_sechs = $Temp_sechs / 10;

if ($arr[28] & (1<<0))
{
$arr[24] = dechex(hexdec($arr[24]) + 128);
}
if ($arr[28] & (1<<1))
{
$arr[25] = dechex(hexdec($arr[25]) + 128);
}
if ($arr[28] & (1<<2))
{
$arr[26] = dechex(hexdec($arr[26]) + 128);
}
if ($arr[28] & (1<<3))
{
$arr[27] = dechex(hexdec($arr[27]) + 128);
}

$Temp_neun = $arr[25].$arr[24];
$Temp_neun = hexdec($Temp_neun);
$Temp_neun = $Temp_neun / 10;
SetValue(34638 /*[Resol\Temp Kollektor Vorlauf]*/ , $Temp_neun);

$Temp_zehn = $arr[27].$arr[26];
$Temp_zehn = hexdec($Temp_zehn);
$Temp_zehn = $Temp_zehn / 10;
SetValue(26313 /*[Resol\Temp Kollektor Rücklauf]*/ , $Temp_zehn);


// Relais Steuerung //

if ($arr[40] & (1<<0))
{
$arr[36] = dechex(hexdec($arr[36]) + 128);
}
if ($arr[40] & (1<<1))
{
$arr[37] = dechex(hexdec($arr[37]) + 128);
}
if ($arr[40] & (1<<2))
{
$arr[38] = dechex(hexdec($arr[38]) + 128);
}
if ($arr[40] & (1<<3))
{
$arr[39] = dechex(hexdec($arr[39]) + 128);
}

$Rel_eins = $arr[38];
$Rel_eins = hexdec($Rel_eins);
SetValue(20484 /*[Resol\Kollektor Pumpe]*/ ,$Rel_eins);

$Rel_zwei = $arr[39];
$Rel_zwei = hexdec($Rel_zwei);
if ($Rel_zwei == 100)
{
$Rel_zwei = true;
}
else
{
$Rel_zwei = false;
}

SetValue(57657 /*[Resol\Zulauf Speicher links oben]*/ ,$Rel_zwei);


$Rel_vier = $arr[43];
$Rel_vier = hexdec($Rel_vier);
if ($Rel_vier == 100)
{
$Rel_vier = true;
}
else
{
$Rel_vier = false;
}

SetValue(34079 /*[Resol\Zulauf Speicher links unten]*/ ,$Rel_vier);

$Rel_fuenf = $arr[44];
$Rel_fuenf = hexdec($Rel_fuenf);
if ($Rel_fuenf == 100)
{
$Rel_fuenf = true;
}
else
{
$Rel_fuenf = false;
}

SetValue(21075 /*[Resol\Zulauf Speicher rechts unten]*/ ,$Rel_fuenf);


    RegVar_SetBuffer($IPS_INSTANCE, "");
}
}
?>

Funktioniert einwandfrei. Momentanes Manko:

  • die Schnittstelle aktualisiert sich momentan ca. alle 4 Sekunden. Da ich ein paar Werte loggen will, sind das doch enorme Datenmengen. Allerdings habe ich noch nicht herausgefunden wie man das Register Variable Instanz für eine gewisse Zeitdauer pausieren kann.
  • das Skript funktioniert nur für den Regler DeltaSol E (bei anderen Reglern sind die Offsets unterschiedlich belegt - siehe Protokoll - kann bei Resol gedownloaded werden)
  • nur Protokoll Version 1 - d.h. nur Daten mitlessen (reicht für mich momentan aus)

Axel

Ich habe das Problem, dass ich ebenfalls meine Resol-Daten in IPS überführen möchte. Nun habe ich ab und an „komische Werte“. Das passiert wohl wenn gewisse Werte in ihrer reiner Zahlenmenge varieren. Also z.B.

Array
(
    [0] => 1
    [1] => 4
    [2] => :
    [3] => 1
    [4] => 3
    [5] => :
    [6] => 2
    [7] => 7
    [8] => 	
    [9] => 4
    [10] => 3
    [11] => ,
    [12] => 6
    [13] => 	
    [14] => 2
    [15] => 7
    [16] => ,
    [17] => 3
    [18] => 	
    [19] => 6
    [20] => 1
    [21] => ,
    [22] => 4
    [23] => 	
    [24] => 8
    [25] => 8
    [26] => 8
    [27] => ,
    [28] => 8
    [29] => 	
    [30] => 8
    [31] => 8
    [32] => 8
    [33] => ,
    [34] => 8
    [35] => 	
    [36] => 8
    [37] => 8
    [38] => 8
    [39] => ,
    [40] => 8
    [41] => 	
    [42] => 3
    [43] => 0
    [44] => ,
    [45] => 0
    [46] => 	
    [47] => 2
    [48] => 3
    [49] => ,
    [50] => 1
    [51] => 	
    [52] => 0
    [53] => ,
    [54] => 0
    [55] => 0
    [56] => 	
    [57] => 2
    [58] => 0
    [59] => 3
    [60] => 	
    [61] => 7
    [62] => 0
    [63] => 	
    [64] => 0
    [65] => 	
    [66] => 0
    [67] => 	
    [68] => 0
    [69] => 	
    [70] => 0
    [71] => 	
    [72] => 0
    [73] => 	
    [74] => 1
    [75] => 4
    [76] => :
    [77] => 0
    [78] => 9
    [79] => 	
    [80] => 1
    [81] => 	
    [82] => 0
    [83] => 	
    [84] => 0
    [85] => 	
    [86] => 0
    [87] => 	
    [88] => 0
    [89] => 	
    [90] => 0
    [91] => 	
    [92] => 1
    [93] => 	
    [94] => 1
    [95] => 9
    [96] => 7
    [97] => 	
    [98] => 0
    [99] => 	
    [100] => 0
    [101] => 	
    [102] => 0
    [103] => 	
    [104] => 0
    [105] => 	
    [106] => 0
    [107] => 	
    [108] => 1
    [109] => 2
    [110] => 6
    [111] => 3
    [112] => 2
    [113] => 2
    [114] => 	
    [115] => 
    [116] => 

)

der Wert „$data[9].$data[10].$data[11].$data[12]“ ist hier die Kollektortemperatur. Wenn dieser Wert unter 10 oder ohne Komma vorliegt, dann müsste ich eigentlich „$data[9].$data[10].$data[11]“ auswerten, da alles irgendwie „nach oben rutscht“. Die Wärmemenge (hier:


[108] => 1
[109] => 2
[110] => 6
[111] => 3
[112] => 2
[113] => 2

) passt dann überhaubt nicht mehr. Es sind dann nicht mehr 126322 W/h sondern 26322 W/h, weil die 1 plötzlich auf [107] abgelegt wird. Ich habe es mit

versucht, aber dann kommt nur

Array
(
    [0] => 4
    [1] => 3
    [2] => ,
    [3] => 2
)

heraus.

Häng doch mal dein file an.

Gerne. :slight_smile:
Die Datei findest Du hier.

Das Resultat des „Datenkuddelmuddel“ sieht man hier (Anhang).

Das ist das Ergebnis.

Array
(
    [0] => 23.07.2011 15:31:57
    [1] => 32,2
    [2] => 27,6
    [3] => 59,3
    [4] => 888,8
    [5] => 888,8
    [6] => 888,8
    [7] => 34,9
    [8] => 23,5
    [9] => 0,00
    [10] => 100
    [11] => 30
    [12] => 0
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 15:27
    [18] => 1
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
    [24] => 1
    [25] => 198
    [26] => 0
    [27] => 0
    [28] => 0
    [29] => 0
    [30] => 0
    [31] => 126322
    [32] => 

)

Mit welchem „Trenner“ hast Du gearbeitet " " oder " "?
Bei mir sieht es so

Array
(
    [0] => 1
    [1] => 6
    [2] => :
    [3] => 0
    [4] => 9
    [5] => :
    [6] => 4
    [7] => 0
    [8] => 	
    [9] => 4
    [10] => 5
    [11] => ,
    [12] => 2
    [13] => 	
    [14] => 2
    [15] => 7
    [16] => ,
    [17] => 7
... 

aus.

Du musst mit arbeiten, da es Tabulator getrennt ist. Mit Leerzeichen wird das nix.

$file = file(IPS_GetKernelDir()."TextData_".date("Ymd").".log");

$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuell -1 einsetzen
$resoldata = explode("	", $lastentry); // Daten in ein Array  schreiben

print_r($resoldata);

Wie oben beschreiben, kommt wenn ich

<?
$file = file("Y:\RESOL\TextData_" . date("Ymd") . ".log");
$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuel -1 einsetzen
$resoldata = explode("	", $lastentry); // Daten in ein Array  schreiben

$Datum = $resoldata[0];
$data = str_split($resoldata[1]);

print_r($data);
SetValueString(39589 /*[Scripte\Resol\DatumResol]*/,  $Datum); // ID anpassen

SetValue(46150 /*[Scripte\Resol\Kollektortemperatur in °C]*/, $data[9].$data[10].$data[11].$data[12]); // Kollektortemp
SetValue(25427 /*[Scripte\Resol\untere Speichertemperatur in °C]*/, $data[14].$data[15].$data[16].$data[17]); // untere Speichertemp
SetValue(58974 /*[Scripte\Resol\obere Speichertemperatur in °C]*/, $data[19].$data[20].$data[21].$data[22]); // obere Speichertemp
SetValue(56635 /*[Scripte\Resol\Vorlauftemperatur in °C]*/, $data[42].$data[43].$data[44].$data[45]); // Vorlauftemp
SetValue(10476 /*[Scripte\Resol\Rücklauftemperatur in °C]*/, $data[47].$data[48].$data[49].$data[50]); // Rücklauftemp
// usw.

?>

das:

Array
(
    [0] => 4
    [1] => 6
    [2] => ,
    [3] => 8
)

dabei heraus.

Wenn Du das Script so ausführst, müsste es doch Fehlermeldungen hageln. Soviele Array Einträge sind doch gar nicht vorhanden. :confused:

FEHLER GEFUNDEN!
Anstatt

<?
$file = file("Y:\RESOL\TextData_" . date("Ymd") . ".log");
$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuel -1 einsetzen
$resoldata = explode("	", $lastentry); // Daten in ein Array  schreiben

$Datum = $resoldata[0];
$data = str_split($resoldata[1]);

print_r($data);
SetValueString(39589 /*[Scripte\Resol\DatumResol]*/,  $Datum); // ID anpassen

SetValue(46150 /*[Scripte\Resol\Kollektortemperatur in °C]*/, $data[9].$data[10].$data[11].$data[12]); // Kollektortemp
SetValue(25427 /*[Scripte\Resol\untere Speichertemperatur in °C]*/, $data[14].$data[15].$data[16].$data[17]); // untere Speichertemp
SetValue(58974 /*[Scripte\Resol\obere Speichertemperatur in °C]*/, $data[19].$data[20].$data[21].$data[22]); // obere Speichertemp
SetValue(56635 /*[Scripte\Resol\Vorlauftemperatur in °C]*/, $data[42].$data[43].$data[44].$data[45]); // Vorlauftemp
// usw.

?>

muss es

<?
$file = file("Y:\RESOL\TextData_" . date("Ymd") . ".log");
$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuel -1 einsetzen
$resoldata = explode("	", $lastentry); // Daten in ein Array  schreiben

$Datum = $resoldata[0];
$data = str_split($resoldata[1]);

print_r($resoldata);
SetValueString(39589 /*[Scripte\Resol\DatumResol]*/,  $Datum); // ID anpassen

SetValue(46150 /*[Scripte\Resol\Kollektortemperatur in °C]*/, $data[9].$data[10].$data[11].$data[12]); // Kollektortemp
SetValue(25427 /*[Scripte\Resol\untere Speichertemperatur in °C]*/, $data[14].$data[15].$data[16].$data[17]); // untere Speichertemp
SetValue(58974 /*[Scripte\Resol\obere Speichertemperatur in °C]*/, $data[19].$data[20].$data[21].$data[22]); // obere Speichertemp
SetValue(56635 /*[Scripte\Resol\Vorlauftemperatur in °C]*/, $data[42].$data[43].$data[44].$data[45]); // Vorlauftemp
// usw.

?>

(Zeile 9 „data“ -> „resoldata“) lauten.
DANKE!!!

Jo, die Zeile hat da auch nichts zusuchen.

$data = str_split($resoldata[1]); 

Eine Sache noch. Ich bekomme folgende Fehler:

Notice:  Undefined offset: 7 in C:\IP-Symcon\scripts\18733.ips.php on line 15

Warning:  Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\18733.ips.php on line 15

Notice:  Undefined offset: 8 in C:\IP-Symcon\scripts\18733.ips.php on line 16

Warning:  Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\18733.ips.php on line 16

Notice:  Undefined offset: 10 in C:\IP-Symcon\scripts\18733.ips.php on line 17

Warning:  Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\18733.ips.php on line 17

Notice:  Undefined offset: 11 in C:\IP-Symcon\scripts\18733.ips.php on line 18

Warning:  Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\18733.ips.php on line 18

Notice:  Undefined offset: 25 in C:\IP-Symcon\scripts\18733.ips.php on line 19

Warning:  Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\18733.ips.php on line 19

Notice:  Undefined offset: 31 in C:\IP-Symcon\scripts\18733.ips.php on line 20

Warning:  Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\18733.ips.php on line 20

Das 18733 ist in diesem Fall das Datenholscript, also das Script das diesen Fehler produziert selbst.

Zeig mal dein ganzes Script. Mit Angabe der Variablen String, Integer, Float.

<?
$file = file("Y:\RESOL\TextData_" . date("Ymd") . ".log");
$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuel -1 einsetzen
$resoldata = explode("	", $lastentry); // Daten in ein Array  schreiben

$Datum = $resoldata[0];
$data = str_split($resoldata[1]);

print_r($resoldata);
SetValueString(39589 /*[Scripte\Resol\DatumResol]*/,  $Datum); // ID anpassen

SetValue(46150 /*[Scripte\Resol\Kollektortemperatur in °C]*/, $data[1]); // Kollektortemp
SetValue(25427 /*[Scripte\Resol\untere Speichertemperatur in °C]*/, $data[2]); // untere Speichertemp
SetValue(58974 /*[Scripte\Resol\obere Speichertemperatur in °C]*/, $data[3]); // obere Speichertemp
SetValue(56635 /*[Scripte\Resol\Vorlauftemperatur in °C]*/, $data[7]); // Vorlauftemp
SetValue(10476 /*[Scripte\Resol\Rücklauftemperatur in °C]*/, $data[8]); // Rücklauftemp
SetValue(28374 /*[Scripte\Resol\Einstrahlung in W/m²]*/, $data[10]); // Einstrahlung
SetValue(31229 /*[Scripte\Resol\Pumpendrehzahl in %]*/, $data[11]); // Pumpendrehzahl
SetValue(59046 /*[Scripte\Resol\Betriebsstunden in h]*/, $data[25]); // Betriebsstunden
SetValue(56897 /*[Scripte\Resol\Wärmemenge in W/h]*/, $data[31]); // Wärmemenge

?>

Das ist das Script. Erstellt wird folgendes Array.

Array
(
    [0] => 23.07.2011 18:15:03
    [1] => 41,3
    [2] => 28,1
    [3] => 56,2
    [4] => 888,8
    [5] => 888,8
    [6] => 888,8
    [7] => 28,3
    [8] => 23,2
    [9] => 0,00
    [10] => 164
    [11] => 50
    [12] => 0
    [13] => 0
    [14] => 0
    [15] => 0
    [16] => 0
    [17] => 18:10
    [18] => 1
    [19] => 0
    [20] => 0
    [21] => 0
    [22] => 0
    [23] => 0
    [24] => 1
    [25] => 200
    [26] => 0
    [27] => 0
    [28] => 0
    [29] => 0
    [30] => 0
    [31] => 126322
    [32] => 

)

Alle Variablen sind float. Habe ich Informationen vergessen?

Dein setzen der Variablen ist falsch.

So ist es richtig.

$resoldata[1] usw...

so wie es hier drinnen steht ist alles richtig. Du hättest einfach den Pfad anpassen müssen.:slight_smile:

Zitat:
Zitat von RWN
und hier für (txt)

PHP-Code:
$file = file(„C:\Daten\Protokolldaten\TextData.txt“);

$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuell -1 einsetzen
$resoldata = explode(" ", $lastentry); // Daten in ein Array schreiben

print_r($resoldata);
$Datum = $resoldata[0];

SetValueString(11755 /[Resolprotokoll\DatumResol]/, $Datum); // ID anpassen
SetValue(22285, $resoldata[1]);
SetValue(23618 /[Resolprotokoll\Float1]/, $resoldata[2]);
SetValue(45263 /[Resolprotokoll\Float2]/, $resoldata[3]);
//usw.

Im zweiten (Deinem) Post auf Seite 3, in einem ersten Entwurf, steht es mit $data und auch „$data = str_split($data[1]);“ … das hat mir von Beginn an als Grundlage gedient. Später dann lief alles mit $resoldata und das ist dann wohl irgendwie an mir vorbei. :o
Jetzt läuft es wie es soll. Vielen Dank für die Unterstützung.

Das war auch eine andere Auswertung und hat letztendlich mit der aktuellen nichts zutun. :wink:

Ich habe ein Problem mit einem bestimmten Wert …
Ich weiß jetzt nur nicht, ob es Sinn macht es hier reinzuschreiben, oder besser einen separaten Thread aufzumachen.

<?
$file = file("Y:\RESOL\TextData_" . date("Ymd") . ".log");
$lastentry = $file[count($file)-1]; // letzte Zeile extrahieren , eventuel -1 einsetzen
$resoldata = explode("	", $lastentry); // Daten in ein Array  schreiben

$Datum = $resoldata[0];
$data = str_split($resoldata[1]);

print_r($resoldata);
SetValueString(39589 /*[Scripte\Resol\DatumResol]*/,  $Datum); // ID anpassen

SetValue(12014 /*[Scripte\Resol\Volumenstrom in m³/h]*/, $resoldata[9]); // Volumenstrom
SetValue(55154 /*[Scripte\Resol\Wärmemenge in W/h]*/, $resoldata[31]); // Wärmemenge
?>

liest den Wert des Volumenstroms (in m³/h) und die Wärmemenge (in W/h) aus. Ich will nun diese Wert umrechnen lassen. Volumenstrom soll in Liter/h und die Wärmemenge in kW/h abgelegt werden. Ich habe also zwei weiter Variablen angelegt und das Script von oben um

SetValue(49469 /*[Scripte\Resol\Volumenstrom in l/h]*/ , $resoldata[9]*1000); // Volumenstrom in Liter
SetValue(21925 /*[Scripte\Resol\Wärmemenge in kW/h]*/,$resoldata[31]/1000); // Wärmemenge in kW

erweitert. Die Watt pro Stunde werden nun von z.B. 123456 in 123,456 umgerechnet. Prima!
Die m³ pro Stunde werden jedoch von z.B. 0,12 in 0 umgerechnet.
Ich habe versucht dem Phänomen mal mal auf den Grund zu gehen und habe unten ein

$liter = getvaluefloat (12014) * 1000;
echo $liter

dran gehängt. Und siehe da … in der Ausgabe steht ein 120. Ich verstehe nicht warum! Weiß jemand Rat?

probier es mal so.

(float)$resoldata[9]*1000