Helios KWL EC 300 PRO

Nimm die Anleitung von Pokeys57E, ab hier

Clientsocket mit der Helios-IP erstellen, Port ist auch hier 502

Splitter mit übergeordnete Instance mit gerade erstelltem Clientsocket, User ID ist hier 180, soviel ich gelesen habe.

Naja, und dann kannst Du die ersten Modbusinstancen mit der übergeordnsten Instanc des Client Socket, laut PDF erstellen, zB 16bit Word, Partybetrieb ADR 94 und schauen was Du zurück bekommst.

Wie ich gelesen habe kommt Char, das muß man dann ev. über ein Script mit PHP umwandeln.

Gruß Helmut

ich hab das jetzt mal so eingestellt, aber versteh nicht wie ich jetzt was senden kann?
Bzw. was empfange ich hier? (siehe anhang)

mega kompliziert auch mit der umrechnung von hex.

Ich will eigentlich nur die 4 Lüftungsstufen steuern

Hast doch schon viel erreicht, nun noch 'ne Modbusinstance mit Adressen ab PDF Seite 11, mit untergeordnetem Client.

Versuchen würde ich mit Dwort zB Adresse 102, da wird was in Char kommen. Das heißt Du mußt ein Script mit der Wandlung in PDF von Char nach Dez machen, bzw Du ziehst die Hex 30 bzw Dezimal 48 von dem da kommenden Wert ab.

Beim "Stufen schreiben " kannst Du Hex30 nicht direkt geben, mußt also 48dez + der Lüfterstufe, die Du willst, direkt mal testen, also zB. 50 für Stufe 2 :wink:

Aber schau erst einmal was da kommt, mach’ 'ne Hardcopy und poste sie.

Gruß Helmut

Hallo thka,

um mal auf das Original-Thema zurückzukommen:

Schau mal hier in der letzten initi.py - ich arbeite gerade weitere Register für meine 300Pro ein (Stufenregelung der Lüfter in % usw - lauter Feinheiten halt). Die Registerkonstanten oben im py-Script sollten selbsterklärend sein - vielleicht ist auch für Dein IPS-Script was dabei.

Soweit ich weiss, kommuniziert auch die -W immer noch über natives 485 z.B. mit dem KNX-Modul, daher dürfte das auch für die neue Anlage verwendbar sein (wenn wohl auch mit den Modbus-Registern, die ich bis jetzt gesehen habe, nicht mehr notwendig).

Frage an die Community: Hat es schon mal jemand geschafft, die Fernbedienungen per Software einzuschalten? Wenn ja - wie? Bzw. was passiert am Bus mit den FB, wenn man die Anlage anschaltet? Welche Kommandos werden dabei auf dem Bus übertragen?

Hintergrund meiner Frage: Ein manuelles Einschalten der FB zieht immer ein Zurücksetzen der Anlage auf die Grundlüftungsstufe nach sich. Somit haut das jegliche Programmlogik kaputt. :frowning: (z.B. automatischer Sommer-Kühl-Modus, selbst gesteuerte Kamin-/Stosslüftung etc - halt diverse Sachen, an denen ich gerade programmiere).

Hat da schon jemand Erfahrungen? Wäre über ein paar Tips von den Profis dankbar, bis demnächst,

/tom

danke, ich glaub eigentlich müsse es jetzt funktionieren aber ich bekomme immer „illegal write data value“ im IP-Symcon sowie auch im Modpoll test programm?

Da stimmt doch was mit meiner KWL nicht oder?

C:>modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -0 2.0 192.168.2.31 0x7630 0x3030 0
x3034 0x3d31 0x312e 0x3132 0x2e31 0x3300 -h
modpoll: Illegal write data value! Try -h for help.

C:>modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -0 2.0 192.168.2.31 0x7630 0x3030 0
x3034 0x3d31 0x312e 0x3132 0x2e31 0x3300 -h
modpoll: Illegal write data value! Try -h for help.

C:>modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -0 2.0 192.168.2.31 0x7630 0x3030 0
x3034 0x0000
modpoll: Illegal write data value! Try -h for help.

C:>modpoll -m tcp -a 180 -t4:hex -r1 -0 -1 -0 2.0 192.168.2.31 0x7630 0x3030 0x
3034 0x0000
modpoll: Illegal write data value! Try -h for help.

C:>modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -0 2.0 192.168.2.31 0x7630 0x3030 0
x3034 0x0000
modpoll: Illegal write data value! Try -h for help.

C:>

Mach doch mal Hardcopy von der Modbus-Instance, dem Client und dem Splitter, ich werde mir nur das von IPSymcon ansehen und nicht noch andere Programme analysieren.

Mein Vorschlag hast Du nie ausprobiert? Wenn doch: bitte nimm diese Adresse bei der Hardcopy

Gruß Helmut

Hi Helmut,

ok kein thema poste die IPsymcon Scrrenshot so schnell wie möglich. Hab da die gleiche Fehlermeldung bekommen auch wo ich deine vorschläge hinschickte. Dachte halt wenns es so 1:1 in der PDF der KWL steht und auch nicht funktioniert, dass es dann mit IPsymcon garnicht funktionieren kann, weils eher an der Anlage liegt. Hab parallel jetzt auch den Helios support angeschrieben.

danke dir

so jetzt die sceenshots

Joo,
dann trage mal bitte, in Bild 4 glaube ich, in diese Heliosinstance die Adresse 102 ein und schaue was da wieder kommt.

Nix schreiben nur lesen

Bitte mit Screenshot hier mal den Inhalt der Variablen wenn Word nimmst und einmal alternativ, wenn Du Dword nimmst.

Gruß Helmut

meinst du hier?

da kommt leider nix an. bei word und dword

Im Objektbaum unter der Heliosinstanz in der Variablen, die dann entsteht, wenn man die Instance erstellt, was steht da drin?
Ein Screencopy davon wäre gut
Gruß Helmut

Null steht hier drin wieso?

so hat es jetzt über die Batchdatei funktioniert…wenns jetzt mit ipsymcon noch funktionieren würde wärs klasse

modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -o 2.0 192.168.2.31 0x7630 0x3031 0x3032 0x3d34 0x0000

C:>modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -o 2.0 192.168.2.31 0x7630 0x3031 0
x3032 0x3d34 0x0000
modpoll 3.4 - FieldTalk™ Modbus® Master Simulator
Copyright © 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: MODBUS/TCP
Slave configuration…: address = 180, start reference = 1 (PDU), count = 1
Communication…: 192.168.2.31, port 502, t/o 2.00 s, poll rate 1000 ms
Data type…: 16-bit register (hex), output (holding) register table

Written 5 references.

Das hätte ich jetzt nicht gedacht, da mußt Du solche Verbiegungen machen um stinknormale Modbusregister zu lesen.

Wie kommt man auf so’n Schwachsinn?

Warum machen Die das denn nicht über normale Adressierung, kann ich nicht glauben…

Hattest Du beim Heliossupport eine Antwort bekommen?

Gruß Helmut

ja irgendwie ziemlich umständlich alles… :frowning:

jetzt steuer ich die batchdateien mit ipsymcon…des klappt und kann so die lüfterstufen steuern
aber ich kann eben keine temperaturen usw. auslesen.

bekomm ich des mit ips dann garnicht hin?

ne vom support kam (noch) kein antwort

gibts mittlerweile eigentlich auch die möglichkeit dies mit IP symcon zu steuern bzw. werte auszulesen?

Ich steuere meine Kwl schon seit 2013 mit IPS ohne Probleme, hab mein Beispiel Script ja bereitgestellt…

hier noch mein Script für den Datenempfang:
Serial RS485: 9600 8N1
Cutter auf Eingabelänge: 6 und Sync Zeichen: 01 HEX


<?

$ID_Betrieb = 56270 /*[Scripte\Helios KWL\Wohnraumbelüftung\Betrieb]*/;
$CO2_Status = 34275 /*[Scripte\Helios KWL\Wohnraumbelüftung\CO2 Status]*/;
$Luftfeuchte_Status = 36549 /*[Scripte\Helios KWL\Wohnraumbelüftung\%RH Status]*/;
$Heizung_Status = 44493 /*[Scripte\Helios KWL\Wohnraumbelüftung\Heizung Status]*/;
$Filter_Status = 15183 /*[Scripte\Helios KWL\Wohnraumbelüftung\Filterwechsel]*/;
$Heizung_Indikator = 21099 /*[Scripte\Helios KWL\Wohnraumbelüftung\Heizung indicator]*/;
$Fehler_Indikator = 16917 /*[Scripte\Helios KWL\Wohnraumbelüftung\Fehler Indicator]*/;
$Service = 12524 /*[Scripte\Helios KWL\Wohnraumbelüftung\Service]*/;


$ID_Luefterstufe = 35107 /*[Scripte\Helios KWL\Wohnraumbelüftung\Lüfterstufe]*/;
$ID_Aussenluft =23300 /*[Scripte\Helios KWL\Wohnraumbelüftung\Außenluft]*/;
$ID_Fortluft =33790 /*[Scripte\Helios KWL\Wohnraumbelüftung\Fortluft]*/;
$ID_Abluft =15875 /*[Scripte\Helios KWL\Wohnraumbelüftung\Abluft]*/;
$ID_Zuluft =11353 /*[Scripte\Helios KWL\Wohnraumbelüftung\Zuluft]*/;

$ID_Temp = 59745 /*[Scripte\Helios KWL\KNX\Zwischenspeicher]*/;


// Tabelle zur Temperatur Umrechnung
$Temperatur = array(
"-74", "-70", "-66", "-62", "-59", "-56", "-54", "-52", "-50", "-48", "-47",
"-46", "-44", "-43", "-42", "-41", "-40", "-39", "-38", "-37", "-36", "-35",
"-34", "-33", "-33", "-32", "-31", "-30", "-30", "-29", "-28", "-28", "-27",
"-27", "-26", "-25", "-25", "-24", "-24", "-23", "-23", "-22", "-22", "-21",
"-21", "-20", "-20", "-19", "-19", "-19", "-18", "-18", "-17", "-17", "-16",
"-16", "-16", "-15", "-15", "-14", "-14", "-14", "-13", "-13", "-12", "-12",
"-12", "-11", "-11", "-11", "-10", "-10", "-9", "-9", "-9", "-8", "-8", "-8",
"-7", "-7", "-7", "-6", "-6", "-6", "-5", "-5", "-5", "-4", "-4", "-4", "-3",
"-3", "-3", "-2", "-2", "-2", "-1", "-1", "-1", "-1", "0", "0", "0", "1", "1",
"1", "2", "2", "2", "3", "3", "3", "4", "4", "4", "5", "5", "5", "5", "6", "6",
"6", "7", "7", "7", "8", "8", "8", "9", "9", "9", "10", "10", "10", "11", "11",
"11", "12", "12", "12", "13", "13", "13", "14", "14", "14", "15", "15", "15",
"16", "16", "16", "17", "17", "18", "18", "18", "19", "19", "19", "20", "20",
"21", "21", "21", "22", "22", "22", "23", "23", "24", "24", "24", "25", "25",
"26", "26", "27", "27", "27", "28", "28", "29", "29", "30", "30", "31", "31",
"32", "32", "33", "33", "34", "34", "35", "35", "36", "36", "37", "37", "38",
"38", "39", "40", "40", "41", "41", "42", "43", "43", "44", "45", "45", "46",
"47", "48", "48", "49", "50", "51", "52", "53", "53", "54", "55", "56", "57",
"59", "60", "61", "62", "63", "65", "66", "68", "69", "71", "73", "75", "77",
"79", "81", "82", "86", "90", "93", "97", "100", "100", "100", "100", "100",
"100", "100", "100", "100");

// 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;


// Befehle zum Regeln der Lüfterstufe
#Stufe1	 | "\01\x11\x10\x29\x01\x4C"
#Stufe2	 | "\01\x11\x10\x29\x03\x4E"
#Stufe3	 | "\01\x11\x10\x29\x07\x52"
#Stufe4	 | "\01\x11\x10\x29\x0F\x5A"
#Stufe5	 | "\01\x11\x10\x29\x1F\x6A"
#Stufe6	 | "\01\x11\x10\x29\x3F\x8A"
#Stufe7	 | "\01\x11\x10\x29\x7F\xCA"
#Stufe8	 | "\01\x11\x10\x29\xFF\x4A"

// Lüfterstufe Status auslesen


				$Funktion=substr($data,0,6);// Funktion ausfiltern
				switch($Funktion)
					{
					case "\x01\x11\x10\x29\x01\x4C": // Lüfterstufe 1
						SetValue($ID_Luefterstufe , 1);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 1)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 1);
						}

					break;
					case "\x01\x11\x10\x29\x03\x4E": // Lüfterstufe 2
						SetValue($ID_Luefterstufe , 2);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 2)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 2);
						}
					break;
					case "\x01\x11\x10\x29\x07\x52": // Lüfterstufe 3
						SetValue($ID_Luefterstufe , 3);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 3)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 3);
						}
					break;
					case "\x01\x11\x10\x29\x0F\x5A": // Lüfterstufe 4
						SetValue($ID_Luefterstufe , 4);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 4)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 4);
						}
					break;
					case "\x01\x11\x10\x29\x1F\x6A": // Lüfterstufe 5
						SetValue($ID_Luefterstufe , 5);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 5)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 5);
						}
					break;
					case "\x01\x11\x10\x29\x3F\x8A": // Lüfterstufe 6
						SetValue($ID_Luefterstufe , 6);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 6)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 6);
						}
					break;
					case "\x01\x11\x10\x29\x7F\xCA": // Lüfterstufe 7
						SetValue($ID_Luefterstufe , 7);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 7)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 7);
						}
					break;
					case "\x01\x11\x10\x29\xFF\x4A": // Lüfterstufe 8
						SetValue($ID_Luefterstufe , 8);
						$Stufe = GetValue (43355 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status\Value]*/);
						if ($Stufe <> 8)
						{
						EIB_Scale(40372 /*[Scripte\Helios KWL\KNX\KWL Lüfterstufe Status]*/, 8);
						}
					break;
					}


##############
#KWL schreibt zu allen Zuluft Temperatur 35
#01 11 20 35 9E 05

#KWL schreibt zu allen Abluft Temperatur 34
#01 11 20 34 A0 06

#KWL schreibt zu allen Fortluft Temperatur 33
#01 11 20 33 8E F3

#KWL schreibt zu allen Außenluft Temperatur 32
#01 11 20 32 87 EB

#return;
// Temperaturen auslesen

				$Funktion1=substr($data,0,4);// Funktion ausfiltern
				switch($Funktion1)
					{
					case "\x01\x11\x20\x35": // Zuluft Temperatur
                  $Zuluft=substr($data,4,1);// Temperatur ausfiltern
						$ZuluftTemp = ord($Zuluft); // Chr in Dezimal umwandeln
						SetValue($ID_Temp , $Temperatur[$ZuluftTemp]); // Wert in temporäre Variable schreiben
						$Status = GetValue($ID_Temp); //
						$Status1 = GetValue(53141 /*[Scripte\Helios KWL\KNX\KWL Zuluft\Value]*/); //
						if ($Status <> $Status1)
						EIB_Value(46912 /*[Scripte\Helios KWL\KNX\KWL Zuluft]*/, $Status);
					break;
					case "\x01\x11\x20\x34": // Abluft Temperatur
                  $Abluft=substr($data,4,1);// Temperatur ausfiltern
						$AbluftTemp = ord($Abluft); // Chr in Dezimal umwandeln
						SetValue($ID_Temp , $Temperatur[$AbluftTemp]);
						$Status = GetValue($ID_Temp); //
						$Status1 = GetValue(26671 /*[Scripte\Helios KWL\KNX\KWL Abluft\Value]*/); //
						if ($Status <> $Status1)
						EIB_Value(47246 /*[Scripte\Helios KWL\KNX\KWL Abluft]*/, $Status);
					break;
					case "\x01\x11\x20\x33": // Fortluft Temperatur
                  $Fortluft=substr($data,4,1);// Temperatur ausfiltern
						$FortluftTemp = ord($Fortluft); // Chr in Dezimal umwandeln
						SetValue($ID_Temp , $Temperatur[$FortluftTemp]);
						$Status = GetValue($ID_Temp); //
						$Status1 = GetValue(46295 /*[Scripte\Helios KWL\KNX\KWL Fortluft\Value]*/); //
						if ($Status <> $Status1)
						EIB_Value(13665 /*[Scripte\Helios KWL\KNX\KWL Fortluft]*/, $Status);
					break;
					case "\x01\x11\x20\x32": // Außenluft Temperatur
                  $Aussenluft=substr($data,4,1);// Temperatur ausfiltern
						$AussenluftTemp = ord($Aussenluft); // Chr in Dezimal umwandeln
						SetValue($ID_Temp , $Temperatur[$AussenluftTemp]);
						$Status = GetValue($ID_Temp); //
						$Status1 = GetValue(38797 /*[Scripte\Helios KWL\KNX\KWL Außenluft\Value]*/); //
						if ($Status <> $Status1)
						EIB_Value(30455 /*[Scripte\Helios KWL\KNX\KWL Außenluft]*/, $Status);
					break;

					case "\x01\x11\x21\xA3": // Anlagen Status
                  $Status=substr($data,4,1);// Status ausfiltern
						$StatusDez = ord($Status);

						if (getBitState($StatusDez, 0))  // KWL Betriebsstatus an Bit0 auslesen
						{
                     if (getValue(53528 /*[Scripte\Helios KWL\KNX\KWL Betrieb\Value]*/) == false)
							 EIB_Switch(48079 /*[Scripte\Helios KWL\KNX\KWL Betrieb]*/, true);
						}
  						else
						{
                     if (getValue(53528 /*[Scripte\Helios KWL\KNX\KWL Betrieb\Value]*/) == true)
							 EIB_Switch(48079 /*[Scripte\Helios KWL\KNX\KWL Betrieb]*/, false);
						}

						#if (getBitState($StatusDez, 1))  // KWL CO2 adjust state an Bit1 auslesen
    						#SetValueBoolean($CO2_Status , true);
  						#else
	    					#SetValueBoolean($CO2_Status,false);

						#if (getBitState($StatusDez, 2))  // KWL %RH adjust state an Bit2 auslesen
    						#SetValueBoolean($Luftfeuchte_Status , true);
  						#else
	    					#SetValueBoolean($Luftfeuchte_Status,false);

						if (getBitState($StatusDez, 3))  // KWL Heating state an Bit3 auslesen
						{
                     if (getValue(17603 /*[Scripte\Helios KWL\KNX\KWL Heizung Status\Value]*/) == false)
							 EIB_Switch(33368 /*[Scripte\Helios KWL\KNX\KWL Heizung Status]*/, true);
						}
  						else
						{
                     if (getValue(17603 /*[Scripte\Helios KWL\KNX\KWL Heizung Status\Value]*/) == true)
							 EIB_Switch(33368 /*[Scripte\Helios KWL\KNX\KWL Heizung Status]*/, false);
						}

						if (getBitState($StatusDez, 4))  // KWL Filterguard indicator an Bit4 auslesen
						{
                     if (getValue(13257 /*[Scripte\Helios KWL\KNX\KWL Filterwechsel\Value]*/) == false)
							 EIB_Switch(35334 /*[Scripte\Helios KWL\KNX\KWL Filterwechsel]*/, true);
						}
  						else
						{
                     if (getValue(13257 /*[Scripte\Helios KWL\KNX\KWL Filterwechsel\Value]*/) == true)
							 EIB_Switch(35334 /*[Scripte\Helios KWL\KNX\KWL Filterwechsel]*/, false);
						}

						if (getBitState($StatusDez, 5))  // KWL Heating indicator an Bit5 auslesen
						{
                     if (getValue(57091 /*[Scripte\Helios KWL\KNX\KWL Heizung indicator\Value]*/) == false)
							 EIB_Switch(43957 /*[Scripte\Helios KWL\KNX\KWL Heizung indicator]*/, true);
						}
  						else
						{
                     if (getValue(57091 /*[Scripte\Helios KWL\KNX\KWL Heizung indicator\Value]*/) == true)
							 EIB_Switch(43957 /*[Scripte\Helios KWL\KNX\KWL Heizung indicator]*/, false);
						}

						if (getBitState($StatusDez, 6))  // KWL Fault indicator an Bit6 auslesen
						{
                     if (getValue(41986 /*[Scripte\Helios KWL\KNX\KWL Fehler Indicator\Value]*/) == false)
							 EIB_Switch(13399 /*[Scripte\Helios KWL\KNX\KWL Fehler Indicator]*/, true);
						}
    						
  						else
						{
                     if (getValue(41986 /*[Scripte\Helios KWL\KNX\KWL Fehler Indicator\Value]*/) == true)
							 EIB_Switch(13399 /*[Scripte\Helios KWL\KNX\KWL Fehler Indicator]*/, false);
						}

						if (getBitState($StatusDez, 7))  // KWL Service reminder an Bit7 auslesen
						{
                     if (getValue(52845 /*[Scripte\Helios KWL\KNX\KWL Service\Value]*/) == false)
							 EIB_Switch(59077 /*[Scripte\Helios KWL\KNX\KWL Service]*/, true);
						}
    						
  						else
						{
                     if (getValue(52845 /*[Scripte\Helios KWL\KNX\KWL Service\Value]*/) == true)
							 EIB_Switch(59077 /*[Scripte\Helios KWL\KNX\KWL Service]*/, false);
						}

					break;

					}


}

  function getBitState($Value, $BitNo)
  {
    return (($Value & pow(2, $BitNo)) != 0);
  }

?>

Danke ja aber du steuerst deine kwl über Serial oder? Ich würde das gerne über den TCP Modusbus mit Easycontrol von Helios machen damit ich alle Werte auch auslesen kann.

bin über RS485 verbunden, Simuliere damit ein Bedienteil und kann auch alle Werte auslesen.