Telnet-Verbindung mit IPS

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.

Geht das mit IPS?

Das sich noch keiner gemeldet hat bedeutet das es nicht geht?
Hat den das noch niemand versucht? Alternativ geht es doch vllt. per php-Script?! :frowning:

Hi,

such mal nach „Client Socket“
ist zumindest schonmal nen guter ansatz zur Problemlösung :wink:

[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

[edit]

Also die Kombination aus Client Socket UND Script. :wink:
Und was gebe ich mit dem Script mit?

Hallo Honk,

probier das mal

CSCK_SetOpen(12345,true);
CSCK_SendText(12345,"PASS passwort".CHR(13)."DATA".CHR(13));

Gruß
Attain

Im Prinzip total genial!!
Ich musste es zwar in

CSCK_SetOpen(27054  /*[Client Socket RESOL]*/,true);
CSCK_SendText(27054  /*[Client Socket RESOL]*/,"PASS passwort".CHR(13));
CSCK_SendText(27054  /*[Client Socket RESOL]*/,"DATA".CHR(13));

ändern, aber nun bin ich drin. :smiley:

Leider spuckt er noch komisches aus (siehe dump.txt).
Heraus kommen müsste allerdings (siehe screenshots).
Jemand eine Idee?

dump.txt (4.69 KB)

Hallo,

ich habe HIER das Protokoll auseinander genommen.

Gruß
Attain

Hallo Attain,

SUPER GUT! Leider komme ich nicht an die Daten, so wie man es gewohnt ist von einer seriellen Verbindung. Muss ich hier irgendwas konvertieren?

Hallo honk,
Eigentlich musst Du nur den com-Port durch den Client-Soket ersetzen. Auch musst Du 26 Variablen anlegen und in das Array eintragen.

Gruß
Attain

Ich habe NICHT den vbus->COM sondern den vbus->LAN Adapter.
Der Rest wird dann sicher identisch sein, jedoch muss ich erstmal soweit kommen.

Richtig.

Aufbau ist folgender:

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!";

?> 

:smiley:
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. :confused:
Kann ich einem Client Socket mitgeben welche „Sprache“ er sprechen soll?

Hallo Honk,

Die Daten passen schon so. Mach mal im Debug Fenster den Haken bei „HEX Ansicht“, dann siehst Du das das alles seine Richtigkeit hat.

Gruß

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.:

SetValue($IPS_TARGET,($IPS_VALUE - 65536*($IPS_VALUE >> 15))/10);

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.

Gruß

:slight_smile: :slight_smile: :slight_smile:
Was soll ich sagen … es läuft nun alles bestens!

Eine Sache habe ich jedoch noch: die Wärmemenge.
Mein aktuelle Wert ist: 683577 Wh
Dein Script macht daraus zwei Werte (21, 22): 557, 683

Ist das bei Dir auch so? Wie hast Du diese beiden Werte „verheiratet“?

Einfach zusammengerechnet.

683*1000+557

mein Solarregler gibt 34 Werte aus …

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.

Ski Heil
Attain

Das klingt nach viel Arbeit, jedoch mit tollem Resultat. :slight_smile:
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. :wink:

EDIT: aktuell 23041 … :confused:

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:

<?
$IDPumpe1 = 12345; // ANPASSEN
$IDPumpe2 = 23456; // ANPASSEN

$a = $IPS_VALUE / 256;
$b = $IPS_VALUE % 256;
SetValue($IDPumpe1,(int)$a);
SetValue($IDPumpe2,$b);
?>

12801 = 50% Pumpe 1 und 1% Pumpe 2
23041 = 90% Pumpe 1 und 1% Pumpe 2

Hallo Zusammen!

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