Abfrage & Steuerung von Viessmann Heizungen

Hier meine XML’s
XMLS.zip (2.14 KB)
Für 20A5, 20AB, 2048

Es handelt sich dabei nur um die Daten die auch wirklich funktionieren und Werte liefern!
Ach ja wenn Werte ins Negative rutschen gibt es ein Problem mit der Version von Coyote. Hier mal ne Lösung für das Außentemperaturproblem:

   	  case "Temperature10Minus":
			  $lowByte = ord( $Data[0] );
			  $highByte = ord( $Data[1] );
			  if ($highByte == 255) {
			   return ((65536-(( $highByte * 256 ) + $lowByte ))/10)*-1;
				} else {
			  return (( $highByte * 256 ) + $lowByte ) / 10;
			  }
		  break;

Besten Dank. Ich schau mir die Liste heute Abend an!!

Huhu,

ich nutze auch das Script von Coyote. Vielen dank für die Mühe.
Ich lese momentan eine Vitotronic 200 KW2 damit aus ( ID 2098 ) und erstelle mir momentan die XML Datei dazu.

Jetzt meine Frage, wie lasst ihr die Abfragen über den Seriellen Port laufen. Ich habe gemerkt wenn ich alle Kommandos in einem Script durchlaufen lasse kommt recht schnell das PHP timeout.
Im moment Kaskadiere ich die Abfragen eine nach der anderen durch, heißt ich deaktiviere das eigene Ereignis und aktiviere das nächste. Ist recht mühsam aber scheint soweit zu funktionieren.

<?

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

    // Event IDs ermitteln
$eventidselfarray = IPS_GetChildrenIDs($IPS_SELF); // Eigenes Event 15 Minuten
$eventidself = $eventidselfarray[0]; // ID aus Array ziehen

  // Verbindung zur Heizung öffnen
  ViessmannOpen();

  // Wert Abfragen

  ViessmannSetVariableByCommand( "Sammelstoerung",25540 /*[Vitotronic 200 KW2\Heizungsdaten\Sammelstörung]*/ );

  // Verbindung schliessen
  ViessmannClose();

IPS_SetEventActive($eventidself, false); // Eigener Timer 15 Minuten deaktivieren
IPS_SetEventActive(32314 /*[Vitotronic 200 KW2\Heizungsdaten\Brennerleistung\Refresh\]*/ , true);

?>

Ich habe mich hier inspirieren lassen und lese einen Parameter nach dem anderen aus.

Ui … das ist natürlich auch eine Idee. Coole Sache danke dir. Werd mich da gleich mal ranmachen heute abend.

Gesendet von meinem GT-I9300 mit Tapatalk

Und da kommt auch gleich meine nächste Frage zu dem Thema.
Ich habe mir nu mal eine weile lang die werte aufgezeichnet und mit Highcharts ausgeplottet, und ich habe gemerkt das es sehr oft zu Fehlwerten kommt.
zb. die Speichertemperatur springt ab und zu mal auf 128 Grad oder eine Sammelstörung kommt mal sporadisch.

An was könnte das liegen ?

Unbenannt.PNG

Hallo
bei mir lag es daran, dass nur ein Teil übertragen wird, aber das Script dann aus dem halben Teil + dem Antwort Byte einen falschen Wert ermittelt. Ich habe die Abfrage dahin gehend geändert, dass die Werte vor Auswertung im Script geprüft wird, ob ein Antwortbyte von der Heizungsanlage mit dabei ist. Wenn das der Fall ist wird die Anfrage verworfen. Ich hänge morgen früh mal die PHP bei!

Ah okay,

danke dir ich freu mich drauf. Werd mich in der Zwischenzeit mal um das o.g. Script kümmern. :slight_smile:
… IPS macht nich Süchtig nein xD

Ähnliche Probleme hatte ich auch.
Habe meine Scripts vom Postnochmal erweitert.
Nun wird auch das Timeout richtig ausgewertet. Damit geht die Abfrage im Gut-Fall schneller. Bei mir ist ca. innerhalb von 3 Sekunden die Antwort da. Ich frage 7 Werte ab, das dauert ca. 20 Sekunden und liegt innerhalb des PHP-Timeouts.
Ebenso kann man nun statt der VariablenID auch 0 übergeben, damit wird der Wert in der Funktion zurückgegeben und man kann eine Fehlerbehandlung machen (siehe Viessmann_Send.ips.php). Die Funktion von Bastian für negative Temperaturen hab ich mit eingebaut, auch wenn ich das momentan nicht brauche.
Ebenso gibt es nun einen Fehlerzähler, der bei jedem erkannten Fehler hochgezählt wird. Den kann man auswerten. Ich habe ungefähr 10 Fehler pro Tag, was bei 3360 Abfragen pro Tag ok ist.

Gruß Thomas

Hiho,

danke dir, habe deine Scripte gerade übernommen. Mal schauen ob sich das beruhigt, werd das mal beobachten.

Zum Abfragen nutze ich jetzt das Script :

<?

include( "ViessmannDeviceTools.inc.php" );
$step = GetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/);

if(($IPS_SENDER <> "TimerEvent")and($step == 0)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 1);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Aussentemperatur",42389 /*[Vitotronic 200 KW2\Mitte\IST - Temperaturen\Aussentemperatur]*/ );
    	ViessmannClose();
    return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 1)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 2);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Kesseltemperatur",12612 /*[Vitotronic 200 KW2\Mitte\IST - Temperaturen\Kesseltemperatur]*/ );
    	ViessmannClose();
    return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 2)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 3);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Speichertemperatur",11245 /*[Vitotronic 200 KW2\Mitte\IST - Temperaturen\Warmwasserspeicher]*/ );
    	ViessmannClose();
    return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 3)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 4);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Vorlauftemperatur",58221 /*[Vitotronic 200 KW2\Mitte\IST - Temperaturen\Vorlauftemperatur]*/ );
    	ViessmannClose();
    return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 4)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 5);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Sammelstoerung",25540 /*[Vitotronic 200 KW2\Rechts\Wartung & Störung\Sammelstörung]*/);
    	ViessmannClose();
    return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 5)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 6);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Brennerstoerung",27009 /*[Vitotronic 200 KW2\Rechts\Wartung & Störung\Brennerstörung]*/);
    	ViessmannClose();
   return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 6)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 7);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Speicherladepumpe",19704 /*[Vitotronic 200 KW2\Rechts\Anlagen\Speicherladepumpe]*/);
    	ViessmannClose();
   return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 7)){
    SetValue(28063 /*[Vitotronic 200 KW2\Links\Abfrage\Abfrageintervall]*/, 0);
    IPS_SetScriptTimer($IPS_SELF, 10);
    	ViessmannOpen();
    	ViessmannSetVariableByCommand( "Zirkulationspumpe",33397 /*[Vitotronic 200 KW2\Rechts\Anlagen\Zirkulationspumpe]*/);
    	ViessmannClose();
   return;
}


?>

Das rufe ich alle 2 Minuten durch einen extra Timer auf und wird dann abgearbeitet durch die Step Variable.

So,

das Script von Thomas hat wirkung gezeigt, vielen Lieben dank nochmal dafür.
Nun hat sich das ganze beruhigt.

Nun mal eine ganz doofe Frage … ich schäm mich schon fast dafür.
Kann mir jemand Quick & Dirty erklären wie aus einer F3 01 49,9 °C werden ? Hab den ganzen Nachmittag gegoogelt wie ein Irrer … ich komm einfach nicht drauf. Ich hab mir Hex to Decimal Converter angeschaut … wenn ich den Hex Wert F3 01 eingebe dann kommt da in Dezimal 62209 raus. Ich kapiers einfach net :slight_smile: auch das Script leuchtet mir noch net ganz ein.

AHHHHHH … jetzt hats Klick gemacht.
Ich versuchs mal zu erklären.

Das ist der Teil an dem der Hex bzw. ASCII zu nem Temperaturwert wird :

		  case "Temperature10":
			  $lowByte = ord( $Data[0] );
			  $highByte = ord( $Data[1] );
			  return (( $highByte * 256 ) + $lowByte ) / 10;
			  break;

Im Debugger steht zb. CA 02 auf ASCII Ê<STX> ( wobei <STX> kein Zeichen ist sondern ein Steuerzeichen. )

CA = LowByte
02 = HighByte

In Dezimal

CA = 202
02 = 2

Die Formel sieht dann so aus :
(( 2 * 256 ) + 202 ) / 10 = 71,4

Das heißt die Kesseltemperatur beträg 71,4 °C

Habe ich das soweit richtig kapiert ? :slight_smile: … boah ich liebe sowas xD

Hi Flobo,

ich habe auch lange wie ein Irrer an den HexWerten gewerkelt, daher auch mein Script für negative Werte. Mit 2 Bytes (2x 8 Bit = 16 Bit) ist es eigentlich schlecht negative Werte darzustellen, daher schickt die Viessmann Therme also den größten Wert raus. Ein Wort = 16 Bits / man kann auch sagen Integer 65535 (2x256).

Also FF FF

 F:  15 ·     1 =     15
 F:  15 ·    16 =    240
 F:  15 ·   256 =   3840
 F:  15 ·  4096 =  61440
                  ——————
                          65535

Sind es also draußen -5°C dann sendet die Viessmann CD FF

Also (65.535 - (255 * 256 + 205))/10 *-1 =

Hier die entsprechende Zeile:

return ((65536-(( $highByte * 256 ) + $lowByte ))/10)*-1; 

Und so sieht die komplette Berechnung aus:

case "Temperature10Minus": 
              $lowByte = ord( $Data[0] ); 
              $highByte = ord( $Data[1] ); 
              if ($highByte == 255) { 
               return ((65536-(( $highByte * 256 ) + $lowByte ))/10)*-1; 
                } else { 
              return (( $highByte * 256 ) + $lowByte ) / 10; 
              } 
          break; 

Viel Spass beim rechnen! :smiley:

P.S. Allerdings funktioniert diese Funktion nur bis -25,5°C, da ich das highByte mit FF Abfrage, wird es kälter sinkt dieser HighByte auf FE, das ist dann die Temperatur von -25,6°C bis -51°C usw.

Evtl müsste die If Abfrage so lauten:

if ($highByte >= 245)  

Damit wäre diese Funktion immer erfüllt selbst bei 0 Kelvin :wink: Dann würde die Antwort der Heizung so aussehen (haben dann eher Supraleiter) F5 54 => (65536 - ((245*265)+84))/10 *-1 = 273,1°C oder 0° Kelvin

Guten Abend,

ich kämpfe seit geraumer Zeit mit Schreiben Richtung Anlage … :confused:

Versuche einfach den Partybetrieb über IP-Symcon einzuleiten. Abgekürzt so darstellbar:


RegVar_SendText($id_com, chr(0x04));
RegVar_SendText($id_com, chr(0x16).chr(0x00).chr(0x00));

$IPS_Party_SET= chr(0x41).chr(0x06).chr(0x00).chr(0x02).chr(0x23).chr(0x03).chr(0x01).chr(0x01);

RegVar_SendText($id_com, $IPS_Party_SET);

Hat jemand eine Idee ob ich auf den richtigen Weg bin? Hat das schon jemand gemacht über Protokoll 300?

Herzlichen Dank!

Hiho,

ich versuche momentan das Script für das KW Protokoll umzuschreiben, bin aber auf ein Problem mit den Integerwerten gestoßen.

Ich bekomme die Hex Antwort der Heizung : 33 D5 01 00
Der Integerwert sollte 120115 sein.

hat jemand ne Ahnung wie genau das zum Umrechnen ist ? Kleine Kniffelaufgabe xD … ich bin schon gescheitert, habe auch nicht aus dem Script rauslesen können wie genau die Mathematische Formel dafür ist.

Hi, hab da eine Idee aber um festzustellen ob die nicht kompletter Blödsinn ist benötige ich ein zweites Beispiel, also Hex und Integerwert!

Huhu,

ich hätte da noch die Brennerbetriebsstunden.

B3 D2 0B 06
… sagt IPS, ich weiß das man diesen Wert durch 3600 teilen muss um auf die Stunden zu kommen.

Vitosoft sagt 28177,26 Stunden

Gleiche Zeit der Abfrage.

Hallo zusammen,
die Integer und Hexzahlen sind doch komplett identisch.
120115dez entspricht 01D533 in hex
und 060BD2B3 ist 101437200 Sekunden und damit 28177,26 Stunden.
Ich versteh jetzt das Problem nicht?

Gruß Thomas.

Hiho,

warum von Hinten nach Vorne ? :slight_smile: … sorry ich kapier das mit diesem Hex Integer kram nur so halb, bis jetzt is der Groschen noch nicht gefallen^^

Der erste Wert sind die Brennerbetriebsstunden, dort funktioniert der Trick mit den Zahlen von Hinten nach vorne nicht.

Ich habe :

Hex : 00 01 D5 38
Dec ( von Hinten nach vorne ) : 0 1 213 56
Tatsächlicher Wert ( Aus der Viessmann Software Vitosoft ) : 120120

passt also irgendwie net zusammen grübel

Mit welcher Addresse fragst du ab ?

Wenn du mit BetriebsstundenStufe 1 08A7 abfragst … versuch mal mit 0886 , stimmt bei mir genau :wink: wenn man es durch 3600 teilt