Alpha Innotec Wärmepumpe über Lan anbinden

Hallo zusammen,

ich habe eine Alpha Innotec Wärmepumpe und möchte diese über IPS auslesen. Die Anlage vefügt über einen Luxcontroller 2 und hat einen Lan-Anschluss. Auf diesen kann ich auch vom Server aus zugreifen, da die WP als Netzwerkteilnehmer (über Router) erkannt wird und einen eigenen Webserverdienst inkl. App hat.

Ich habe in IPS ein Client Socket mit der IP der WP und dem zugehörigen Port angelegt. Interface öffnet auch. Die Anlage sendet aber noch keine Werte. Wie kann ich nun die Anlage ansprechen, damit sie mir die Werte ausgibt, welche ich dann zerlegn kann. User kadorf hat eine vergeleichbare AI-Anlage über einen Comport angebunden und sendet einen String mit „1800“ und die WP antwortet. Wie kann ich die Anlage jetzt (mit 1800) ansprechen? Bin im skripten noch nicht so firm.

Vielen Dank im Voraus.

Hallo Houbi

Meine WP läuft nun seit 2 Jahren und seither lese ich sie auch halbstündlich aus. Mir reichen diese Werte.
Ich habe die Scripte in ein Zip gepackt. Dazu gehört auch die php_sockets.dll. Diese dll muss beim IPS Start geladen werden. Wahrscheinlich geht das auch auf einem anderen Weg, nur weiss ich nicht wie.

Versuch mal dein Glück, sonst kann ich eventuell genaueres beschreiben wies bei mir aussieht.

gruss
tschewie

alphainnotec.zip (20 KB)

Hallo tschewie,

das funktioniert, danke.
Aber ich muss die Anlage über IPS auslesen und zerlegen, da ich mir die Werte im LCN-Bus weiterverwerten möchte. Da muss es ja eine Möglichkeit ähnlich wie bei den COMPorts geben.

Hallo Houbi

Machen die Scripte doch! IPS sendet ein Request und der Luxtronic antwortet mit den Werten. Das sind dann ca. 30 Variablen die gefüllt werden.

thx
tschewie

Morgen,
ok das ist gut. Dann versuche ich die Werte in die entsprechenden Variablen zu schreiben. Bisher öffnet sich für kurze Zeit ein Popup mit den Werten, was sich beim runterscrollen aber automatisch wieder schließt. Wie lädst du denn die dll? Evtl. benötige ich noch weitere Tipps von dir :wink:
Vielen Dank schon mal für deine Hilfe!

Ich lese meine Alpha Innotec auch mit Ip-Symcon aus. Dazu habe ich folgende Instanzen erstellt:

IP-Symcon_AI.PNG

und in GetValues ist folgender Code:

<?
$temp = decbin(ord(substr($_IPS['VALUE'], 72, 1))).decbin(ord(substr($_IPS['VALUE'], 73, 1))).decbin(ord(substr($_IPS['VALUE'], 74, 1))).decbin(ord(substr($_IPS['VALUE'], 75, 1)));
$temp = bindec($temp) & 0xFFFFFFFF;

SetValue(59887 /*[Luxtronik IP Port\Luxtronik Output\GetValues\Aussentemperatur]*/, $temp/10);
?>

Ich lese dabei momentan nur die Aussentemperatur aus, die ist an Position 72-75 und im binären 2er-Komplement, darum die komplizierte Umwandlung.

Im Timer, welcher alle 1 Minuten ausgeführt wird, sende ich den Befehl zum Auslesen der Werte an die Luxtronik:

CSCK_SendText(59002, chr(0x00).chr(0x00).chr(0x0b).chr(0xbc));
CSCK_SendText(59002, chr(0x00).chr(0x00).chr(0x00).chr(0x00));

59002 ist der Luxtronik IP Port.

Hallo Houbi

Sorry wird halt manchmal spät mit der Arbeit.

Das hier ist mein Scriptcode. Die Variable wird angelegt wenn sie nicht existiert. Lege das Script in unter ein Dummy Modul. Die anderen inludes hast du schon aus dem Zip.

<?php
//includes
include "innotec_wp";
include "java_daten";

//Dummy Modul anlegen als Heimat der Messdaten im Selben Pfad wie das Script
$parentobject = IPS_GetObject($_IPS['SELF']);
$parentID = $parentobject['ParentID'];

//Variablen
$sBuff = 0;
$time1 = time();
$filename = "test.tst";
$JavaWerte = 0;
$refreshtime = 5; //sekunden

echo '<meta http-equiv="refresh" content="5" >';

// connecten
$socket = socket_create(AF_INET, SOCK_STREAM,0);
$connect = socket_connect($socket, $IpWwc, $WwcJavaPort) || exit("socket_connect fehlgeschlagen");


if ($connect = 1)
	echo "PASS: Verbunden mit WWC Java Console $IpWwc Port: $WwcJavaPort <br>";
else
	echo "ERROR: Nicht verbunden mit WWC Java Console  <br>";

$timestamp= time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i:s",$timestamp);
printf('============================================================== <br>');
printf('Ausleszeit: %s - %s Uhr <br>',$datum,$uhrzeit);
printf('Refresh alle 5s !<br>');
printf('! TEST !<br>');
printf('============================================================== <br>');
//---------------------------------------------------------------------------

// Daten holen
$msg = pack('N*',3004);
//printf('msg:%s <br>',$msg);
$send=socket_write($socket, $msg, 4); //3004 senden
//printf('Bytes send:%d <br>',$send);


$msg = pack('N*',0);
//printf('msg:%s <br>',ord($msg));
$send=socket_write($socket, $msg, 4); //0 senden
//printf('Bytes send:%d <br>',$send);


socket_recv($socket,$Test,4,MSG_WAITALL);  // Lesen, sollte 3004 zurückkommen
$Test = unpack('N*',$Test);
//printf('read:%s <br>',implode($Test));

socket_recv($socket,$Test,4,MSG_WAITALL); // Status
$Test = unpack('N*',$Test);
printf('Status:%s <br>',implode($Test));

socket_recv($socket,$Test,4,MSG_WAITALL); // Länge der nachfolgenden Werte
$Test = unpack('N*',$Test);
printf('Länge der nachfolgenden Werte:%s <br>',implode($Test));

$JavaWerte = implode($Test);
printf('============================================================== <br>');

for ($i = 0; $i < $JavaWerte; ++$i)//vorwärts
{
socket_recv($socket,$InBuff[$i],4,MSG_WAITALL);  // Lesen, sollte 3004 zurückkommen
$daten_raw[$i] = implode(unpack('N*',$InBuff[$i]));
//printf('InBuff(%d): %d <br>',$i,$daten_raw[$i]);
}
//socket wieder schliessen
socket_close($socket);

// Werte anzeigen
for ($i = 0; $i < $JavaWerte; ++$i)//vorwärts
{
if ($i >= 10 & $i <= 28) // Temperaturen
	{($daten_raw[$i] = $daten_raw[$i]*0.1);
	  //printf('(%d)%s : %.1f &#176C<br>',$i,$java_dataset[$i],$daten_raw[$i]);
	  $varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "Temperatur_200_C", $i);//float
	  setValueFloat($varid,$daten_raw[$i]);
	}
if ($i == 56) // Zähler
	{($daten_raw[$i] = $daten_raw[$i]/3600);
	  //printf('(%d)%s : %.2f h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
	  $varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
	  setValueFloat($varid,$daten_raw[$i]);
	}
if ($i == 57) // Zähler
	{($daten_raw[$i] = $daten_raw[$i]);
	  //printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
	  $varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
	  setValue($varid,$daten_raw[$i]);
	}
if ($i == 58) // Zähler
	{($daten_raw[$i] = $daten_raw[$i]/3600);
	  //printf('(%d)%s : %.2f h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
	  $varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
	  setValueFloat($varid,$daten_raw[$i]);
	}
if ($i == 59) // Zähler
	{($daten_raw[$i] = $daten_raw[$i]);
	  //printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
	   $varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
	  setValue($varid,$daten_raw[$i]);
	}
if ($i >= 60 & $i <= 66) // Zähler
	{($daten_raw[$i] = $daten_raw[$i]/3600);
	  //printf('(%d)%s : %d h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
	   $varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
	  setValueFloat($varid,$daten_raw[$i]);
	}
if ($i >= 95 & $i <= 99) // Errors
	{
	  //printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
   	$varid = CreateVariableByName($parentID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
		$FehlerDatum = date("m.d.y",$daten_raw[$i]);
		setValueString($varid,$FehlerDatum);
	}

if ($i >= 100 & $i <= 105) // Errors
	{
	  //printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
   	$varid = CreateVariableByName($parentID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
		setValueString($varid,$daten_raw[$i]);
	}
}

function CreateVariableByName($id, $name, $type, $ident, $profile, $position)
{
    $vid = @IPS_GetObjectIDByIdent ($ident, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetIdent($vid, $ident);
        IPS_SetInfo($vid, "");
        IPS_SetPosition($vid, $position);

		  if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}
?>

gruss
tschewie

Vielen Dank Leute!
Funktioniert alles so, wie ich es mir vorgestellt habe! :slight_smile:

ich hab das ueber eine I/O Instance und einem Cutter gemacht.
Mein Script liest derzeit noch nicht alle Daten aus, aber wer die Vorab Version haben moecht kann sich gerne Melden.
Leider sehen die Temperaturen derzeit im MultiChart noch nicht so toll aus.

Hallo MiniBlister

Die Lösung mit der Connect.dll finde ich auch nicht so schön. Wahrscheinlich muss man die bei php Versionswechsel
auch wieder suchen. Dann ist die I/O Version besser.
Kannst du die mir die Vorabversion zukommen lassen?

thx
tchewie

Hallo,

ich habe mein Skript abgeleitet von eine Skript von raketenschnecke (danke an der Stelle)
Wie schon geschrieben, ist das Skript noch bei weitem nicht fertig oder laenger getestet.

Zusammen mit den Bildern sollte die Installation hoffentlich klappen.

NOVELAN.CommandManager

//Fügen Sie hier Ihren Skriptquellcode ein
	include "27536.ips.php";
	include "23362.ips.php"; 

	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'];

      $unpacked_data = unpack('N*',$data);
		
		//Set Temperatur_TVL
		NOVELANSetValue("Temperatur_TVL", $unpacked_data[14]/10, 2, $NOVELAN_PID);
		NOVELANSetValue("Temperatur_TRL", $unpacked_data[15]/10, 2, $NOVELAN_PID);
		NOVELANSetValue("Sollwert_TRL_HZ", $unpacked_data[16]/10, 2, $NOVELAN_PID);
		NOVELANSetValue("Temperatur_TRL_ext", $unpacked_data[17]/10, 2, $NOVELAN_PID);

		// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    	//RegVar_SetBuffer($_IPS['INSTANCE'], $data);
	}

NOVELAN.VariableManager

//Fügen Sie hier Ihren Skriptquellcode ein
   function NOVELANSetValue($item, $value, $vtype, $pid) {

		$itemID = @IPS_GetVariableIDByName ($item, $pid);
		
		echo $itemID;
		
		// Variablen-Wert updaten
		switch($vtype)
		{
			case 0: //Variablen-Typ Boolean
				SetValueBoolean($itemID, $value);
			break;

			case 1: //Variablen-Typ Integer
				SetValueInteger($itemID, $value);
			break;

			case 2: //Variablen-Typ Float
				SetValueFloat($itemID, $value);
			break;

			case 3: //Variablen-Typ String
				SetValueString($itemID, $value);
			break;
		}

	}

NOVELAN.Functions

	//$NOVELAN_KatID = IPS_GetCategoryIDByName("04_NOVELAN", 0);
	if (IPS_GetObjectIDByName("NOVELAN Client Socket", 0) >0)
	{
		$id = IPS_GetObjectIDByName("NOVELAN Client Socket", 0);
	}
	else
	{
		echo "die ID des NOVELAN Client Sockets kann nicht ermittelt werden/n ->
			Client Socket angelegt?/n Name richtig geschrieben (NOVELAN Client Socket)?";
	}
	

	$msg = pack('N*',3004);
	CSCK_SendText($id, $msg);
	$msg = pack('N*',0);
	CSCK_SendText($id, $msg);

NOVELAN.Config

//Fügen Sie hier Ihren Skriptquellcode ein
	$NOVELAN_PID = 44311 /*[01_Programme\04_NOVELAN]*/; 
	
 

@tschewie hat auf Anhieb perfekt geklappt, noch ein Ereignis hinzugefügt, die Variablen verlinkt und umbenannt, herrlich :smiley:

Danke!

Hallo,

ich kann jetzt mit folgendem Script die Parameter in meiner Novelan Wärmepumpe setzen:


<?

$IpWwc = "192.168.0.248"; // IP der Wärmepumpe
$WwcJavaPort = "8888"; // Port der Wärmepumpe

// connecten
$socket = socket_create(AF_INET, SOCK_STREAM,0);
$connect = socket_connect($socket, $IpWwc, $WwcJavaPort) || exit("socket_connect fehlgeschlagen");


if ($connect == 1) //korrigiert
    echo "PASS: Verbunden mit WWC Java Console $IpWwc Port: $WwcJavaPort <br>";
else
    echo "ERROR: Nicht verbunden mit WWC Java Console  <br>";


// Daten senden
$msg = pack('N*',3002); //3002 senden aktivieren
$send=socket_write($socket, $msg, 4);

//SetParameter senden;
$msg = pack('N*',4); //Parameter: 4: Warmwasser Betriebsart
$send=socket_write($socket, $msg, 4); 

//Value senden;
$msg = pack('N*',0); //Value: 0:Auto - 2: Party  - 4:Off
$send=socket_write($socket, $msg, 4);



/*
gefunden bei:
https://github.com/mhop/fhem-mirror/blob/master/fhem/FHEM/23_LUXTRONIK2.pm

Parameter:
1: Temperatur SetBack
	Value: -5 bis +5
   Allow only integer temperature or with decimal .5
	$setValue = int($realValue * 2) * 5;

2: Brauchwasser Soll Temperatur
	Value 30 - 65
   Allow only integer temperature or with decimal .5
	$setValue = int($realValue * 2) * 5;

3: Heizung Betriebsart
   Value: 0:Auto - 2: Party  - 4:Off

4: Warmwasser Betriebsart
   Value: 0:Auto - 2: Party  - 4:Off
*/

socket_recv($socket,$Test,4,MSG_WAITALL);  // lesen, sollte 3002 zurückkommen
$Test = unpack('N*',$Test);
printf('read:%s <br>',implode($Test));

socket_recv($socket,$Test,4,MSG_WAITALL); // lesen, sollte Status zurückkommen
$Test = unpack('N*',$Test);
printf('Status:%s <br>',implode($Test));


socket_close($socket);

?>


Vielleicht kann es noch wer brauchen.

Gruß

Rudi

Hallo Rudi,
muss es oben nicht
if ($connect == 1)
heißen? Vergleich ist bei Php mit ==.

Gruß
dfhome

Sent from my iPhone using Tapatalk

Moin.Ich muss diesen alten Thread nochmal hoch holen.Hab versucht,die Lösung von Tschewie umzusetzen.Wenn ich im Webfront das Skript auslöse,bekomme ich auch die Meldung,das die Verbindung steht aber bei ‚Status‘ und ‚folgende Nachrichten‘ steht immer 0. Ausserdem werden die Variablen unter meinem Dummy Modul nicht angelegt.Es kommt mir vor,als ob das Skript nach dem schließen des socket nicht weiter läuft.kann mir jemand helfen?

Nachtrag: Klar hört das Skript auf,die for Schleife kriegt ja 0 übergeben…Aber warum?? Muss man die Wärmepumpe noch irgendwie freischalten oder so?

Hallo Sven

Die WP braucht sicher eine IP-Adresse und die wird in der Datei innotec_wp eingetragen

<?php
// Hier werden die Config Variablen gespeichert
$IpWwc = "192.168.0.68";
$WwcJavaPort = "8888";
$SiteTitle = "WÄRMEPUMPE";
?>

Stelle sicher das die Verbindung über lan geht. Wenn keine Daten von der WP kommen werden auch keine Variablen in der Dummy Instanz angelegt.

thx tschewie

Hi. Die IP hatte ich schon eingestellt. Dein Skript meldet ja auch Verbindung,aber es kommen keine Daten

Kannst du mir bitte erklären,wie man die dll lädt? Da bin ich mir nicht sicher…

So… ich habe jetzt beide Versionen ausprobiert und die Lösung scheint die WP selbst zu sein.
Ich schicke 3004 und 0 und danach kommt die 3004 und eine menge Nullen zurück…also keine Daten. Muss man die WP noch irgendwie freischalten oder so was?

Ich wäre echt für Tipps dankbar!!!

Hilfe…

Sven