Ich möchte gerne eine Telnet-Verbindung mit IPS aufbauen.
Bis hier kein Problem; Client-Socket mit IP und Port ist genau das Richtige dafür. Ich muss jedoch danach ein paar Zeichen mitgeben. Nachdem die Verbindung aufgebaut wurde muss ich ein Passwort eingeben, dann ENTER, dann ein DATA um die Datenverbindung zu aktivieren.
Hintergrund: ich habe hier einen RESOL vbus->LAN Adapter. Man kann also auch per LAN an die Rohdaten ran kommen. Hierzu muss erst eine Verbindung auf die IP/Port aufgebaut werden, dann ein „PASS password“ -> ENTER -> „DATA“ -> ENTER
Erst dann fließen die Rohdaten.
such mal nach „Client Socket“
ist zumindest schonmal nen guter ansatz zur Problemlösung
[edit]
huups sehe gerade der client socket scheint ja schon zu stehen…
dann lass ihn in den einstellungen geschlossen, öffne ihn per script und gib gleich deine Parameter mit…
das squeezebox script macht ähnliches
Client-Socket -> Cutter -> Regitervariable -> Script
Du mußt 26 Integer Variablen anlegen, da 13 Frames 'a 2 Werte übertragen werden und die ID’s im Script eintragen.
Dann hast Du die „Rohdaten“. Temperaturen müssen noch durch 10 und Volumenstrom durch 100 geteilt werden.
<?
If ($IPS_SENDER == "RegisterVariable"){
########### Konfigurationsteil #####################
$debug = false;
$VarID = array(58154,15102,58433,38606,41837,50241,27447,10322,11975,39467,11221,58115,23138,32828);
// dies sind die ID's der Variablen in die die Werte geschrieben werden
$cs = 16; // durch den Cutter wird das erste Byte abgeschnitten, hier wird der Wert wieder dazu genommen
########### Konfigurationsteil Ende ################
if ($debug) IPS_LogMessage("VBus-Debug","Es sind ".count($VarID)." IPS-Variablen angegeben");
for ($i=00; $i<=06; $i++){
$cs += ord($IPS_VALUE{$i}); //Headerbytes zur Checksumme zusammenaddieren
}
$cs = ~$cs;//Checksumme invertieren
$cs &= 127;//MSB aus Checksumme entfernen
if ($debug) IPS_LogMessage("VBus-Debug","Berrechnete Checksumme Header: $cs , Empfangene Checksumme: ".ord($IPS_VALUE{7}));
if ( $cs == ord($IPS_VALUE{7})){ // Checksumme ok?
if ($debug) IPS_LogMessage("VBus-Debug","HeaderChecksumme OK!");
$Byte = array();
$AnzahlFrames = ord($IPS_VALUE{6});
if ($debug) IPS_LogMessage("VBus-Debug","Anzahl der ermittelten Frames: $AnzahlFrames " );
for ($i=01; $i<=$AnzahlFrames; $i++){ // DeltaSol BS+ hat 7 Datenframes
$cs = 0;
$Septett = ord($IPS_VALUE{$i * 6 + 6});
for ($j=00; $j<=03; $j++){ // es sind immer 4 Bytes in einem Frame
$DatenByte = ord($IPS_VALUE{$i * 6 + 2 + $j});
$Byte[$j] = $DatenByte + 128 * (($Septett >> $j) & 1); //das komplette Datenbyte aus dem Byte und dem Teil des Septett zusammenfügen
$cs += $DatenByte;// Bytes zur Checksumme addieren
}
$cs += $Septett; // septett dazuaddieren
$cs = ~$cs;//Checksumme invertieren
$cs &= 127;//MSB aus Checksumme entfernen
if ($debug) IPS_LogMessage("VBus-Debug","Berrechnete Checksumme Frame $i: $cs , Empfangene Checksumme: ".ord($IPS_VALUE{$i * 6 + 7}));
if ($cs == ord($IPS_VALUE{$i * 6 + 7})){ // prüfen ob Checksumme i.o.
if ($debug) IPS_LogMessage("VBus-Debug","Frame Checksumme OK!");
$Wert1 = $Byte[0] + $Byte[1]*256; // ein Wert besteht aus 2 Bytes
$Wert2 = $Byte[2] + $Byte[3]*256; // in einem Frame sind 2 Werte
SetValue($VarID[$i*2-2],$Wert1); // in IPS abspeichern
SetValue($VarID[$i*2-1],$Wert2);
if ($debug) IPS_LogMessage("VBus-Debug","Wert1 (".IPS_GetName($VarID[$i*2-2]).") vom Frame $i = $Wert1 , Wert2 (".IPS_GetName($VarID[$i*2-1]).")= $Wert2 ");
}
else {
IPS_LogMessage("VBus","Checksummenfehler im Frame $i >> ermittelte Summe: $cs empfangene Summe: ".ord($IPS_VALUE{$i * 6 + 6}));
return;
}
}
}
else IPS_LogMessage("VBus","Checksummenfehler Header >>Checksumme berrechnet: $cs Checksumme soll: ".ord($IPS_VALUE{7}));
}
else echo "Script kann nur von der Register Variablen getriggert werden!";
?>
Ich danke Dir! Nur leider habe ich noch die Hürde, dass ich nicht so an die Daten heran komme wie gewünscht. Wenn ich einen Client Socket auf meinen vbus->LAN Adapter aufbaue, dann kommen nicht die Daten die ich brauche. Ich habe in einen Thread zuvor schon eine dump.txt mitgeschickt.
Kann ich einem Client Socket mitgeben welche „Sprache“ er sprechen soll?
Super gut! Jetzt läuft alles wie gewünscht.
Ich habe nur noch zwei Probleme:
die Kollektortemperatur liegt aktuell (nachts) bei unter 0 °C. Die Variable wird hier mit 65xxx (irgendwas mit 65000 und ein paar Zerquetschte). Woran liegt das?
mein Solarregler gibt 34 Werte aus … es werden aber nur 26 Variablen befüllt. Kann ich das in Deinem Script anpassen?
Dazu habe ich mir eine extra Float Variable angelegt und ein Ereignis erstellt das bei Variablenänderung der der Temperatur getriggert wird. Das Ereignis führt folgenden Code aus.:
Erläuterung:
SetValue($IPS_TARGET; setzte die Zielvariable
$IPS_VALUE; mit dem Wert der OrginalVariablen
65536*($IPS_VALUE >> 15); ziehe, wenn bit15 == true 65536 vom Wert ab, Wert wird negativ.
/10 ; teile den Wert durch 10 , da Temperaturen in 0,1 ° Schritten übertragen werden.
Dann werden Teperaturen unter 0° auch korrekt angezeigt.
hmm, aber auf deinem Screenshot werden aber nur 13 Frames angezeigt. Das sind 26 Werte .
Was fehlt denn ? Ich müßte sonst nochmal in die Protokollspec. reinschauen.
Ich habe mir das Protokoll nochmal genauer angeschaut. Einige Werte werden nur in einem Byte oder auch nur als Bit übertragen. Auch ist das bei jedem Regler anders. Ich habe eine XML Datei in der Resol Software gefunden, in der alle benötigten Informationen, aller Regler enthalten sind. Darauf werde ich das Script neu aufbauen und auch einen Installer integrieren, der die benötigten Variablen anlegt. Aber alles nachdem ich aus dem Urlaub zurück bin.
Das klingt nach viel Arbeit, jedoch mit tollem Resultat.
Wenn Du Hilfe brauchst, dann sag bitte Bescheid.
Heute morgen habe ich wieder ein neues Problem: die Pumpendrehzahl.
Bei mir kommt ein Wert 12801 an. Angegeben ist hier das es sich um die Pumpendrehzahl in % handelt. Selbst wenn ich das durch 100 dividiere ist es doch mit 128,01 % komisch.
Aus Sicht eines Arbeitgebers wäre das der perfekte Arbeitnehmer … 128 % Produktivität.
Ja , laut Anleitung sind 2 Drehzahlen in einen Wert. Lege bitte noch 2 Integervariablen an. Mach ein Script das bei Werteänderung dieser Drehzahvariablen getriggert wird. Dahinein kommt:
Als Änfänger in IPS habe ich heute meinen neuen Resol Vbus/LAn Adapter bekommen, kann also auch nur über LAN einbinden. Bin schon gespannt ob die obig beschriebene Lösung funktioniert. Werde berichten wie es klappt.
Meine Bitte: Vielleicht kann mal jemand - der schon weiter ist in der Umsetzung als ich - eine leicht verständliche Zusammenfassung geben, wie man vom Start weg die Sache in IPS konfiguriert und aufsetzt, da es einige Entwicklungen und Änderungen gegeben hat.
Habe mir die anderen Beiträge zu Vbus Resol durchgeschaut - hier ist allerdings bisher immer von RS232/USB die Rede gewesen.
Liebe Grüße und vielen Dank für jeden weiteren Hinweis oder erfolgreiche Umsetzungen!
Red Raz