Wirt es auch nicht mehr man muss sich mühselig alles zusammensuchen, aber wen es mal läuft bekommt man um einiges mehr an Werten und voralem läuft es lokal
Hallo vielleicht hat einer eine für mich eine Lösung. Bekomme seit längeren schon immer wider mal diese Fehlermeldung:
wodurch die Abfrage nicht funktioniert, dann geht es aufeinmal wider eine Zeitlang so richtig erklären kann ich mir das nicht. Die I/O Instanz geht auch auf Störung. Symcon läuft unter Windows 11 Pro Installiert ist die Aktuelle 7.0
Abfrage:
<?php
// 60 Sekunden Fehlermeldung Laufzeit unterdrücken
ini_set('max_execution_time', 150);
// Variablen Includieren
include( "ViessmannDeviceTools.inc.php" );
// Verbindung zur Heizung öffnen
ViessmannOpen();
// Wert Abfragen
ViessmannSetVariableByCommand( "BetriebsartHeizung", 52053 );
ViessmannSetVariableByCommand( "Warmwassertemperaturoben", 58530 );
ViessmannSetVariableByCommand( "VorlauftemperaturPrimaerquelle", 25814 )/10;
ViessmannSetVariableByCommand( "RuecklauftemperaturSekundaer", 55771 );
ViessmannSetVariableByCommand( "VorlauftemperaturSekundaer", 39911 );
ViessmannSetVariableByCommand( "BetriebsartLueftung", 50037 );
ViessmannSetVariableByCommand( "Ventil Heizen/WW", 23921 );
ViessmannSetVariableByCommand( "Heizkreispumpe", 18821 );
ViessmannSetVariableByCommand( "Primärpumpe", 22217 );
ViessmannSetVariableByCommand( "Verdichter", 55796 );
ViessmannSetVariableByCommand( "luftungablufttemperautr", 47634 );
ViessmannSetVariableByCommand( "luftungzulufttemperatur", 36363 );
ViessmannSetVariableByCommand( "luftungforttemperatur", 29711 );
ViessmannSetVariableByCommand( "luftungaussentemperatur", 30774 );
ViessmannSetVariableByCommand( "fortluftvolumenstrom", 50259 );
ViessmannSetVariableByCommand( "zuluftvolumenstrom", 43479 );
// Verbindung schliessen
ViessmannClose();
?>
ViessmannDeviceOutputHandlingKW.php:
<?php
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
SetValue( VIESSMANN_VARIABLE_RESULT, bin2hex($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, "");
}
}
?>
Danke
gruß Stefan
Moin, bin beim Aufräumen auch bei der Abfrage der Viessmann Heizung angekommen. Seit längerer Zeit (seit wann ?) liefern die rückgemeldeten Temperaturen zwischendurch unplausible Werte im mittleren Tausenderbereich. Hat diesen Effekt auch jemand und weiß eine Lösung ?
(IP-Symcon 7.0, Windows (amd64), 10.11.2023, 5a3864aee916)
Gruß Gerd
Ja ist bei mir auch schon länger so zusätzlich bekomme ich auch regelmäßig Fehlermeldungen. Die zu hohen bzw teilweise auch zu niedrigen Werte Filter ich heraus und werden auch nicht im Archiv angezeigt
Gruß Stefan
wenn ich mir die Werte ansehen, habe ich fast den Eindruck , dass sie im Fehlerfall um Faktor 100 zu groß sind. Verstehe bloß nicht woher das kommen sollte, da an der Viessmann-Seite nichts geändert wurde.
Fehlermeldungen sind mir bisher noch nicht aufgefallen.
Moin moin,
Ich kann seit gestern meine Viessmann Heizung nicht mehr abfragen. Dachte zuerst an die Limitierung, isses aber nicht. Sind noch genug Abfragen übrig. Es wird als Fehler „Bad Gateway“ angezeigt. Was bedeutet das?
Gruß Michael
Edit: Fehler wohl gefunden aber noch nicht behoben. Es liegt wohl an der Anlage. Ich komme mit VCare auch nicht mehr drauf. Ein ping auf das Kommunikationsmodul funktioniert.
Edit: alles geht wieder. War ein Fehler bei Viessmann. Die könnten dann auch mal besser kommunizieren. Wen es interessiert:
Bei mir genau das gleiche, habe aber die Störungsmeldung nicht gesehen und den Fehler vergeblich bei meiner Installation gesucht.
Als Fehlermeldung kam aber bei mir:
ERROR | TimerPool | VitoConnect (Update): invalid-token-request
Auch als ViCare wieder ging hat sich Symcon standhaft geweigert wieder zu funktionieren.
Ich mußte den Registrierungsvorgang wiederholen.
Kann man da nicht eine Art Recovery einbauen?
Ich bin auch erst nach gezielter Suche drauf gekommen. Als dann das VCare nicht ging, habe ich mich in die Viessmann Community eingeloggt. Dann war es klar.
Allerdings ging IPS dann wieder ohne zutun sofort. Aber ich würde mir auch eine „schönere“ Fehlerbehandlung wünschen, ggf. in einer eigenen Variable.
Gruß Michael
Ich habe das bei mir so gelöst.
Zuerst das automatische Update der Viessmann Instanz auf 0 gesetzt. Somit passiert kein Update mehr.
Das Update mache ich in einem eigenen Skript, welches jede Minute aufgerufen wird.
$status=IPS_RunScriptWait($vitodens200_update_script);
if (strpos($status,"Fetching data failed") > 0)
{
ips_sleep(2000);
$status="";
$status=IPS_RunScriptWait($vitodens200_update_script);
if (strpos($status,"Fetching data failed") > 0)
{
setvalue($vitodensonline,false);
}
else
{
setvalue($vitodensonline,true);
}
}
else
{
setvalue($vitodensonline,true);
}
Der Inhalt von „$vitodens200_update_script“
$vitodens200=51915;
VVC_Update($vitodens200);
$vitodens200 bekommt die ID der Vitodense Instanz. Wenn also beim Upadte ein Fehler zurückkommt, dann setze ich eine Variable ($vitodensonline) auf False. Ansonsten auf True.