Abfrage & Steuerung von Viessmann Heizungen

Hallo Peter, danke für die Arbeit.

Ich habe ein Problem immer wenn ich eine abfrage mache stoppt die Verbindung. Auch wenn ich getTempA per telnet aufrufe. Hast Du eine Idee.

Ich habe alles so gemacht wie es da steht. Wenn ich dass Script starte ist keine Verbindung zum Soket vorhanden.

Kurz danach ist das Ausrufezeichen aber wieder weg und er ist aktiv.

Update: Hat sich Erledigt läuft alles Danke.

Grumpf , auf IPS V4.0 hab ich folgendes „Problem“

Abfrage usw läuft und ich bekomme auch Daten ( wohl auch die richtigen ) ABER : ich bekomme immer im Meldungsfenster :

05.03.2016 17:30:08*| Serial Port*| Fehler beim Lesen: Das Handle ist ungültig

Die Daten kommen aber trotzdem ?!?!
Hat zufällig noch jemand dieses Phänomen ?

Anbei noch Debug vom Port : ( irgendwie funktioniert die Kopier Funktion in der Konsole nicht so richtig , daher als Bild

Gleiche Thematik auch bei mir :frowning:

Kannst du denn die Betriebsart ändern ? Ich bekomme keine Änderung hin, ich habe schon versucht mit Viess_Data die Betriebsart auf WWH (Warmwasser und Heizung ) zu setzen , aber auch das wird nicht vom IPS erkannt. Bist du sicher das die Daten zb. Betriebsart stimmen, bei Temperatur sieht es soweit gut aus .

Hallo,

nachdem ich meine Heizungsansteuerung erfolgreich in Betrieb genommen habe, möchte ich euch gern meine Scripte zur Verfügung stellen.

Ursprünglich hatte ich die Abfrage der Telnetschnittstelle der vcontrold mit einem Stack gelöst (s. auch hier), da man die Antwort ja irgendwie zu einer Abfrage zuordnen muss.
Die Idee von PumpkinEater mit der Erweiterung der Rückgabe um den aufrufenden Befehl hat mich aber mehr überzeugt. Deshalb habe ich alle Scripte daraufhin noch einmal angepasst.

Es gibt jetzt einen zentralen Script VitoCommandHelper:

Der Script ist zuständig, damit nur an einer Stelle eine Liste der Variablen, Commands und Var_Typen geführt werden muss.

<?

//der Helper ordnet die Variablen zu den vcontrold commands und Variablentypen
function getVarListArray()
{
return array(
#command,Var_ID,Var_Type,autoload
#################################
	array("getTempATiefpass" 	, 49087 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempAussen]*/,"float",1)
,	array("getStatusSLP" 		, 31558 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Speicherladepumpe]*/,"bool",0)
,	array("getBrennerstarts" 	, 57653 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Brennerstarts]*/,"integer",1)
,	array("getStundenBrenner" 	, 18311 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Brennerstunden]*/,"float",1)
,	array("getTempWW1Tiefpass" , 37274 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempSpeicherLadeSensor]*/,"float",1)
,	array("getTempWW2Tiefpass" , 13778 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempAuslauf]*/,"float",1)
,	array("getTempKist" 			, 59236 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempKollektor]*/,"float",1)
,	array("getSammelStoerung" 	, 41449 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Sammelstoerung]*/,"E_ST",1)
,	array("getStatusHKP_M2" 	, 11984 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\HeizkreisPumpeM2]*/,"E_ST",1)
);
}

//echo getCommandforVariable(getVariableFromCommand("getStatusHKP_M2"));


function getVariableFromCommand($command)
{
	$zuordnung=getVarListArray();
   $Var_ID=0;
	foreach ($zuordnung as &$zeile)
	{
      if($zeile[0]==$command)	$Var_ID=$zeile[1];
   }
	return $Var_ID;
}
function getVariableTypeFromCommand($command)
{
	$zuordnung=getVarListArray();
   $Var_Type=0;
	foreach ($zuordnung as &$zeile)
	{
      if($zeile[0]==$command)	$Var_Type=$zeile[2];
   }
	return $Var_Type;
}
function getCommandforVariable($var_ID)
{
	$zuordnung=getVarListArray();
   $command=0;
	foreach ($zuordnung as &$zeile)
	{
      if($zeile[1]==$var_ID)	$command=$zeile[0];
   }
	return $command;
}


?>

Dann gibt es einen Script (readAllVariablesTrigger), welcher die Anfragen startet, er ließt aus dem Helper die Liste der Datenbefehle und schickt sie zum vcontrold:

<?
define ("ID_RaspiVito_SOCKET", 40978 /*[Raspi_Vito]*/);

//den VitoCommandoHelper einbinden
include(IPS_GetScript(54897 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\receiveDataViessmann\VitoCommandHelper]*/)['ScriptFile']);

//jeden Eintrag durchgehen
$zuordnung=getVarListArray();
foreach ($zuordnung as &$zeile)
{
   if($zeile[3]==1)//autoload==1
	{
		sendVitoCommand($zeile[0]);
		IPS_Sleep(3000);
	}
}

function sendVitoCommand($command)
{
   CSCK_SendText(ID_RaspiVito_SOCKET, $command.CHR(13).CHR(10));
}

?>

Und zu guter Letzt der Empfangsscript (receiveDataScript), welcher natürlich an die Registervariable angeknüpft ist und die empfangenen Daten verarbeitet. Es ist im Übrigen nicht nötig einen Cutter zwischenzuschalten. Die nicht verarbeitbaren Antworten, werden einfach ignoriert.

<?
function L($text) //kleine LOGFunktion im Meldungsfenster
{
   IPS_LogMessage("receiveDataScript",$text);
}
include(IPS_GetScript(54897 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\receiveDataViessmann\VitoCommandHelper]*/)['ScriptFile']);

L($_IPS['VALUE']);
	//1. Befehl ermitteln und abtrennen
	$tmp=explode("|",$_IPS['VALUE']); //z.B.: "getTempATiefpass|9.900000 Grad Celsius"
	$command=$tmp[0];
	$tmp=$tmp[1];
	//L($command);
	
	//2. Wert von Einheit abtrennen (durch Leerzeichen getrennt)
	$tmp=explode(" ",$tmp); //z.B.: "9.900000 Grad Celsius"
	$val=$tmp[0];
	
	//3. VariablenID aus Helper ermitteln
	$varID=getVariableFromCommand($command);
	//4. VariablenTyp aus Helper ermitteln
	$varType=getVariableTypeFromCommand($command);
	
	switch($val)
	{
	   case "vctrld>":
	   break;
	   default:
			switch($varType)
			{
			   case "float":
		        	SetValueFloat($varID,$val);
		        	break;
			   case "bool":
		        	SetValueBoolean($varID,$val);
		        	break;
			   case "integer":
		        	SetValueInteger($varID,$val);
		        	break;
				case "E_ST": //enum VitocontrolD (AUS|EIN)
				   SetValueBoolean($varID,($val == "EIN" ? true : false));
				   break;
				default: //falls nix sinnvolles mitgeliefert wurde
			}
	}
?>

Zum Schluss nur noch die ID’s der Scripte und Variablen eintragen und los geht`s.

Viele Grüße
tommes

Ich habe nach der Anleitung von Peter gearbeitet. #167

Klappt!

Besten Dank Peter!!

Hab mal eine Frage:
Es gibt ja auch die Vitoconnect 100 - OPTO1, diese läuft aber über den Viessmann Server, kann man die Daten vom Viessmann Server auch über IPS auslesen?

Danke für die Info!

Hallo!

Ich bin auch gerade am Auslesen meiner Viessmann Vitocal 200 S Steuerung 204D.

Protokoll ist das 300er.

Habe Folgendes Problem das wenn ich den Port kurz öffne, sich bei der Variable „Steuerungstp“ nicht wie erhoft 204D steht sondern 0505? Siehe Anhang:

Die ComPorts habe ich wie folgt Konfiguriert:

comport.JPG

Die XML Datei hab ich nach meinen Steuerungstyp konfiguriert!

Danke!

Ist noch jemand an diesen Thema dran?

Bald :(((

Gesendet von iPhone mit Tapatalk

Ich habe die Vitronic 200 WO1C Regelung und das 300er Protokoll.
Leider hab ich Probleme beim Auslesen der Daten. Kann es sein das, das Script von Seite 1 „Viessmann Device“ nicht für das 300 er Protokoll ist?

Moin Michl,

lesen hilft auch in diesem Fall :). Das erste Skript funktioniert leider nicht mit der 300er-Version…

Viele Grüße

Wango


Kabellabor - Alles automatisch

Ja, das hab ich schon gelesen das, das nicht funktioniert. Deshalb bin ich auf der Suche nach jemanden der das 300er Protokoll mit einen passenden Script ausgelesen hat. Die Adressen der Wo1c hab ich auf der openv gefunden.

Ich weiß ist URALT, aber hat das jemand implementiert ? Ich komme bei der Umrechnung nicht klar.

im Debug bekomme ich ein 01 29…müste ja heißen Pumpe an auf 55%… aber ich komme ums verrecken nicht auf 55%

siehe VControl …

VControl.png

Ich hofe mir kann wer helfen ich verwende die Abfrage vom ersten Post des geht so weit auch recht gut solange ich nur wert wie zb Raumtemperatur Soll, Warmwasser Soll Temp, Betriebsart usw. auslese, will ich zb Ist Wert wie Aussentemp, Vorlauftemp,…… auslesen geht das nicht.
Woran kann das liegen?
Gruß Stefan

Was geht denn mit V-Control bei dir ?? Kommen da denn die Werte ?

Tippe auf falsche Adressen …

nein da kommen auch keine Werte :frowning:
das mit den Adressen hab ich mir auch schon gedacht aber solten die richtigen sein hast du einen Tip für mich wie ich an die richtigen Adressen kommen kann ID 204B
gruß Stefan

ViessmannDevice204B

<device id="204B" description="VVBC702-AW" protocol="KW1">
  <modes>
    <mode id='0' description='Abschaltbetrieb' />
    <mode id='1' description='Warmwasser' />
    <mode id='2' description='Warmwasser + Heizung' />
  </modes>
  <commands>
    <command name='SollTempRaum' action='ReadOnly'>
      <address>2000</address>
      <length>2</length>
      <description>SollTempRaum</description>
      <format>Temperature10</format>
    </command>
    <command name='NiveauderHeizkennlinie' action='ReadOnly'>
      <address>2006</address>
      <length>2</length>
      <description>NiveauderHeizkennlinie</description>
      <format>Temperature10</format>
    </command>
    <command name='NeigungderHeizkennlinie' action='ReadOnly'>
      <address>2007</address>
      <length>2</length>
      <description>NeigungderHeizkennlinie</description>
      <format>Temperature10</format>
    </command>
    <command name='BetriebsartHeizung' action='ReadOnly'>
      <address>B000</address>
      <length>2</length>
      <description>BetriebsartHeizung</description>
      <format>Counter</format>
    </command>
    <command name='VorlauftemperaturM2' action='ReadOnly'>
      <address>01C1</address>
      <length>3</length>
      <description>Vorlauftemperatur M2</description>
      <format>Temperature10</format>
    </command>
    <command name='Warmwassertemperaturoben' action='ReadOnly'>
      <address>01CD</address>
      <length>3</length>
      <description>Warmwassertemperaturoben</description>
      <format>Temperatur10</format>
    </command>
  </commands>
</device>

Abfrage Skript

<?

  // Variablen Includieren
  include( "ViessmannDeviceTools.inc.php" );

  // Verbindung zur Heizung öffnen
  ViessmannOpen();

  // Wert Abfragen
  ViessmannSetVariableByCommand( "SollTempRaum", 30170 /*[skribt\Viessmann\Abfragen\SollTempRaum]*/ );
  ViessmannSetVariableByCommand( "NiveauderHeizkennlinie", 11346 /*[skribt\Viessmann\Abfragen\Niveau Heizkennlinie]*/ );
  ViessmannSetVariableByCommand( "NeigungderHeizkennlinie", 12822 /*[skribt\Viessmann\Abfragen\Neigung Heizkennlinie]*/ );
  ViessmannSetVariableByCommand( "BetriebsartHeizung", 52053 /*[skribt\Viessmann\Abfragen\Betriebsart]*/ );
  ViessmannSetVariableByCommand( "Warmwassertemperaturoben", 33052 /*[skribt\Viessmann\Abfragen	est]*/ );
  

  // Verbindung schliessen
  ViessmannClose();

?>

ViessmannDeviceOutputHandlingKW

<?
  include( "ViessmannVariables.inc.php");

  // Constants
  define( "VIESSMANN_PING",             chr(0x05) );
  define( "VIESSMANN_KW_READ_PRAEFIX",  chr(0x01).chr(0xF7) );
  define( "VIESSMANN_KW_WRITE_PRAEFIX", chr(0x01).chr(0xF4) );

  // init variables
  $CurrentAction   = ""; $CurrentProtocol = ""; $CurrentCommand  = "";
  $CurrentLength   = ""; $CurrentSetValue = "";

  $ViessmannDeviceID = GetValueString( VIESSMANN_VARIABLE_DEVICE );

  // get current Command if available or determine Device ID automatically
  $Command = GetValueString( VIESSMANN_VARIABLE_COMMAND );
  if ( $ViessmannDeviceID == "" AND strlen( $Command ) == 0 )
  {
	 $Command = "R:KW:00F8:2: "; // retrieve Device ID
	 SetValueString( VIESSMANN_DEVICE_COMMAND, $Command );
  }

  if ( $Command != "" )
  {
    $CommandArray = explode(":", $Command);
    $parts = count( $CommandArray );
    if ( $parts > 0 ) $CurrentAction   = $CommandArray[0];
    if ( $parts > 1 ) $CurrentProtocol = $CommandArray[1];
    if ( $parts > 2 ) $CurrentAddress  = $CommandArray[2];
    if ( $parts > 3 ) $CurrentLength   = $CommandArray[3];
    if ( $parts > 4 ) $CurrentSetValue = $CommandArray[4];
  }

  // Get remaining data in the com port via the buffer of the register variable
  $ComData = RegVar_GetBuffer( VIESSMANN_VARIABLE_REGISTER );
  // and merge it together with the passed data
  $ComData .= $IPS_VALUE;
echo $CurrentAction."-";
if ($ComData == VIESSMANN_PING ) echo "Ping"; else echo strlen( $ComData );
  // Process Com Data ----------------------------------------------------------
  if (   $ComData == VIESSMANN_PING AND
		 ( $CurrentAction == "R" OR $CurrentAction == "W" ) )
  {
    // No data expected (Command available), so execute command if available

    // Check, if expected Action and Command capabilities fit

    // Prepare Command Address + Length
    $Address =  chr(hexdec(substr($CurrentAddress,0,2)));
    $Address .= chr(hexdec(substr($CurrentAddress,2,2)));
    switch ( $CurrentAction )
    {
      case "R": // Read
        $CommandString = VIESSMANN_KW_READ_PRAEFIX.$Address.chr($CurrentLength);
        $Command[0] = "-"; // Mark Command as executed
        break;
      case "W": // Write
        $CommandString = VIESSMANN_KW_WRITE_PRAEFIX.$Address.chr($CurrentLength).$CurrentSetValue;
        $Command = ""; // Clear command
        break;
      default:
        $CommandString = "";
        break;
    }
    if ( $CommandString != "" )
    {
      SetValueString( VIESSMANN_VARIABLE_COMMAND, $Command );
	   // Clear current result
      SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
		// Send command to Viessmann heating device via COM Port
		COMPort_SendText( VIESSMANN_VARIABLE_COMPORT, $CommandString );
    }
  }
  else
  {
	  if ( $CurrentAction == "-" and strlen( $ComData ) >= $CurrentLength )
	  {
		  // Com Data is equal or longer as needed
		  $Result = substr( $ComData, 0, $CurrentLength );
		  // Set Result in IPS Variable
        SetValueString( VIESSMANN_VARIABLE_RESULT, $Result );

        // if Device ID is initial and command was to retrieve device ID
        if ( $ViessmannDeviceID == "" AND $Command == "-:KW:00F8:2: " )
        {
			 // set device ID
			 $DeviceID = "";
          for( $x=0; $x < strlen($Result); $x++)
          {
            if ( ord($Result[$x]) < 10 ) $DeviceID .= "0";
            $DeviceID .= strtoupper(dechex(ord($Result[$x])));
          }
          SetValueString( VIESSMANN_VARIABLE_DEVICE, $DeviceID );
        }

        // clear command and remaining buffer of register variable
	  	  SetValueString( VIESSMANN_VARIABLE_COMMAND, "" );
        RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, "" );
	  }
	  else
	  {
        // as a result is expected and the current length of data is not
        // sufficient, write the data back to the buffer of the register var
        if ( $Command != "" AND $CurrentAction == "-" )
          RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, $ComData);
		  else
		    RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, "");
    }

  }
?>

Die Kennung ist mir vollkommen unbekannt , die hab ich nirgends gefunden . Was ist das denn für eine Anlage ?

Schau mal auf der openV Seite
https://openv.wikispaces.com/Adressen

Diese kennung gibt es dort nicht habe eine vitocal 222-g Wo1C und vitovent 300-f die datenpuncktlieste hab ich von viessmann bin dem ziel schon etwas näher gekommen das broblem liegt im viessmann device skript im teil lenght da gehört nicht 2 sondern 3 hinein da bekomme ich schon deutlich bessere werte

Gesendet von meinem SM-A510F mit Tapatalk