Go Down

Topic: Viessmann Heizungssteerung auslesen (Read 16917 times) previous topic - next topic

Scherheinz

Vll musst du hinter deinem 0x16 und deinen 0x00 jeweils ein /NL oder /CR mitsenden.

Gruß
Hier könnte ihre Werbung stehen

VerirrtesSchaf

So.....um hier mal die Neuigkeiten rein zu bekommen.....

man sollte halt mit dem richtigen Protokoll arbeiten. Meine Heizungsregelung spricht nicht das 300er-Protokoll von Viessmann, sondern lediglich das KW-Protokoll. Nach ein paar Versuchen antwortet die Heizung nun auch.

Dann werd ich das mal weiter vertiefen :)


VerirrtesSchaf

Scherheinz

Welche Daten bekommst du bis jetzt heraus?
Hier könnte ihre Werbung stehen

michael_x

Bin nicht sicher ob viess-data 2.0 neben 300 auch noch das KW Protokoll unterstützt.
Ich denke, mehr als da realisiert ist, geht nicht.


Scherheinz

Bin nicht sicher ob viess-data 2.0 neben 300 auch noch das KW Protokoll unterstützt.
Ich denke, mehr als da realisiert ist, geht nicht.


Och mir würde das vollkommen reichen :)
Hier könnte ihre Werbung stehen

VerirrtesSchaf

Ja das was da realisiert ist, ist mehr als genug. Ich bekomme natürlich die Temperaturen von Kessel, Außenfühler, Wasserspeicher, etc, aber auch Pumpenstati, Brennerstatus und auch die Solardaten von der Vitosolic 100 (ist über den KM-Bus mit der Heizung verbunden)

Scherheinz

Ja das was da realisiert ist, ist mehr als genug. Ich bekomme natürlich die Temperaturen von Kessel, Außenfühler, Wasserspeicher, etc, aber auch Pumpenstati, Brennerstatus und auch die Solardaten von der Vitosolic 100 (ist über den KM-Bus mit der Heizung verbunden)
Dann merkst du ja auch sofort wenn die Heizung mal ausfallen sollte und zwar bevor die Bude kalt wird.
Musst nur noch die Meldung aufs Handy etc bringen  8)
Hier könnte ihre Werbung stehen

probono

#22
Jun 21, 2015, 03:01 pm Last Edit: Jun 21, 2015, 03:03 pm by probono
Klasse Thread. Gibt es schon einen Sketch und eine Schaltung dazu? Wäre klasse, wenn ihr die auf github posten könntet. Danke! Man könnte dann mal versuchen, das Ganze auf einen ESP8266 zu portieren, somit könnte man die Heizung für unter 5 EUR ins WLAN bringen samt HTML-Interface...

https://github.com/esp8266/Arduino

VerirrtesSchaf

Mal wieder ein aktueller Stand:
Da ich nicht viel Zeit habe daran zu basteln, läuft es zwar langsam aber es läuft. Der Veruschsaufbau war vielversprechend. Schaltung etc kommt noch.
Ich hab inzwischen die Frontblende der Vototronic zerlegt und anstatt dem Lichtleiter die IR-Diode und den Fototransistor eingebaut. Jetzt kommt noch eine kleine Platine in die Frontblende und dann hoffe ich, dass die 4800 Baud-Schnittstelle die knapp 5 Meter bis zum Arduino schafft. Denke aber mit einem geschirmten Kabel sollte das klappen.
Schaltplan und Bilder folgen noch. Einen Sketch hab ich noch nicht, bisher hab ich den Arduino nur als Gateway und Pegelwandler benutzt.
Geplant ist noch folgendes: Der Arduino soll zum einen die Heizung auslesen (nur gewisse Werte natürlich), über die Heizung kann ich auch die Solaranlage auslesen. Außerdem will ich meine Tankanzeige (hat auch eine RS232-Schnittstelle) auslesen. Das ganze soll dann auf einem kleinen Webserver auf dem Arduino angezeigt werden. Vermutlich im XML-Format.

michael_x

#24
Aug 03, 2015, 04:30 pm Last Edit: Aug 03, 2015, 04:30 pm by michael_x
Quote from: VerirrtesSchaf
Der Veruschsaufbau war vielversprechend
Glückwunsch!
4800 Baud ist ja nicht so viel. Bei mir gehen 1,5m einfaches Telefonkabel (ungeschirmt, 4 Adern) problemlos. Die IR-Sendediode kriegt etwa 15 mA direkt über die Leitung, in Empfangsrichtung geht der Phototransistor direkt an der Heizung auf einen Transistor, der 5V / 1k = 5mA schaltet. Das sollte auch störsicher genug sein.

Quote from: probono
Man könnte dann mal versuchen, das Ganze auf einen ESP8266 zu portieren
Gute Idee. Melde dich, wenn du das probierst ;)


Ich zeige zum Spass per 300er Protokoll via atmega328 ein paar Daten auf einem 5110-Display an, und bin nicht motiviert genug, einen SD-Datenlogger dranzuhängen. (Turnschuh - Netzwerk ist irgendwie out)

Das openv - Forum kennt ihr hoffentlich? Sehr informativ, aber nicht so lebendig wie hier.
 

VerirrtesSchaf

#25
Aug 08, 2015, 03:51 pm Last Edit: Aug 08, 2015, 03:56 pm by VerirrtesSchaf
So, um das ganze hier mal wieder aufzufrischen. Anbei mal der Schaltplan. Nicht sehr kompliziert, aber effektiv :)

An X1 hängt der Arduino.

X1-1 -> TX-Pin am Arduino
X1-2 -> Arduino 5V
X1-3 -> RX-Pin am Arduino
X1-4 -> Arduino GND

X2 ist die Sendediode:
X2-1 -> Diode Anode
X2-2 -> Diode Kathode

X3 ist der Fototransistor
X3-1 -> Emitter
X3-2 -> Collector

michael_x

Quote
Nicht sehr kompliziert, aber effektiv
Minimalistischer gehts nicht. ( Ein Transistor+Widerstand weniger als bei mir )

Schön zu hören, dass selbst die Richtung Heizung -> Arduino über 5m funktioniert.

Danke für die Info.

probono

Hier http://rocktagon.de/forum/viewtopic.php?f=24&t=84 gibt es eine Schaltung und einen Sketch (habe ich noch nicht versucht)

Code: [Select]
#define sim 0 //Siumliert einen direkten COM Port zum durchschleifen für Dekstop Programme
byte answer[8]="0000000";
byte answerCount=0;
byte answerPos=0;
byte aktMsgNr=255;
byte aktMsgWait=255;
byte allmsg=0;
long lastRead=0;

byte msgs[22][5]={ //msgbyte1,msgbyte2,answerlänge,answer(2 Byte)
  //Ist Werte
  {
    0x55,0x25,2,0,0  }
  ,//Aussentemperatur
  {
    0x08,0x00,2,0,0  }
  ,//Aussentemp Sensor 1
  {
    0x08,0x02,2,0,0  }
  ,//Kesseltemp Sensor 3
  {
    0x08,0x04,2,0,0  }
  ,//Speichertemp Sensor 5
  {
    0x08,0x06,2,0,0  }
  ,//Speichertemp 2 Sensor5B
  {
    0x08,0x08,2,0,0  }
  ,//Abgastemp Ses 15
  {
    0x08,0x0A,2,0,0  }
  ,//Rücklauftemp
  {
    0x08,0x0C,2,0,0  }
  ,//Vorlauftemp
  {
    0x39,0x00,2,0,0  }
  ,//Vorluaftemp M2
  {
    0x39,0x02,2,0,0  }
  ,//Vorlauftemp M3
  {
    0xA3,0x09,2,0,0  }
  ,//Kesseltemp
  {
    0x08,0x10,2,0,0  }
  ,//Kesseltemp Tiefpass
  {
    0x08,0x12,2,0,0  }
  ,//Speichertemp Tiefp
  {
    0x08,0x14,2,0,0  }
  ,//Speichertemp2 Teifp
  {
    0x00,0xF8,2,0,0  }
  ,//Kennung
  {
    0x63,0x00,2,0,0  }
  ,//Warmwasser soll
  //Sollwerte
  {
    0x25,0x44,2,0,0  }
  ,//Vorlaufsolltemp A1M1
  {
    0x55,0x5A,2,0,0  }
  ,//Kesselsolltemp
  //Steuerung
  {
    0x23,0x01,1,0,0  }
  ,// Betriebsart A1M1
  {
    0x33,0x01,1,0,0  }
  ,// Betriebsarte M2
  {
    0x23,0x02,1,0,0  }
  ,// Sparbetrieb A1M1
  {
    0x23,0x03,2,0,0  }// Partybetrieb

};

void setStat(byte msgNr,byte wert1,byte wert2=0){
  Serial1.write(0x01); //Start
  Serial1.write(0xF4); //Schreiben
  for (byte i=0;i<3;i++)
    Serial1.write(msgs[msgNr][i]); //Msg schreiben
  Serial1.write(wert1);
  if (msgs[msgNr][2]>1)
    Serial1.write(wert2);
}

void sendMsg(byte msgnr,bool ack=true){
  Serial.print(msgnr);
  Serial.print(": ");
  if (ack)        Serial1.write(0x01); //Start
  Serial1.write(0xF7); //Lesen
  aktMsgNr=msgnr;
  for (byte i=0;i<3;i++)
  {
    Serial.print(msgs[msgnr][i],HEX);
    Serial.write(" ");
    Serial1.write(msgs[msgnr][i]); //Msg schreiben
  }
  Serial.print(" -> ");
}

byte getStat(byte readto=0){
  if ((aktMsgWait!=255) &&  (Serial1.available()))
  {
    byte val = Serial1.read();
    if (aktMsgWait==245) //Datenempfang
    {
      Serial.print(val,HEX);
      Serial.print(" ");
      /*        Serial.print(answerPos);
       Serial.print(" ");
       Serial.println(answerCount);*/
      answer[answerPos]=val; 
      answerPos++;
      if (answerCount==answerPos) { //alles empfangen - Antwort ist nun in answer. Länge=answerCount
        msgs[aktMsgNr][3]=answer[0]; //Antwort in die Msg eintragen
        msgs[aktMsgNr][4]=answer[1];
        aktMsgWait=255;
        answerPos=0;
        Serial.println("");
        if (readto>0 && aktMsgNr==readto)
          return aktMsgNr;

        if (readto>0 && aktMsgNr<readto){
          //Direk nächste anfrage senden
          sendMsg(aktMsgNr+1,false);
          answerCount=msgs[aktMsgNr+1][2];
          aktMsgWait=245;
          answerPos=0;
          return aktMsgNr-1;
        }
        else
          return 245;

      }
    }
    if ( (val==5) && (aktMsgWait<200)) //Heizung senden im intervall 05, danach kann Übertragung starten
    {
      /*
        aktMsgWait:
       0.. 243-> msgnummer die auf sendung wartet
       245 -> innerhalb einer sendung
       255 -> nix zu tun
       */
      sendMsg(aktMsgWait);
      answerCount=msgs[aktMsgWait][2];
      aktMsgWait=245;
      answerPos=0;
    }
    lastRead = millis(); //Zeit des letzten bytes

      if ((answerPos==7)||((answerPos>0) && (millis()-lastRead>2000)))//Wenn am lesen und zu lange kein byte empfangen = reset
    {
      aktMsgWait=255;
      answerPos=0;
      return false;
    }
  }
  return false;
}
/*
  {0x55,0x25,2,0,0},//Aussentemperatur
 {0x08,0x00,2,0,0},//Aussentemp Sensor 1
 {0x08,0x02,2,0,0},//Kesseltemp Sensor 3
 {0x08,0x04,2,0,0},//Speichertemp Sensor 5
 {0x08,0x06,2,0,0},//Speichertemp 2 Sensor5B
 {0x08,0x08,2,0,0},//Abgastemp Ses 15
 {0x08,0x0A,2,0,0},//Rücklauftemp
 {0x08,0x0C,2,0,0},//Vorlauftemp
 {0x39,0x00,2,0,0},//Vorluaftemp M2
 {0x39,0x02,2,0,0},//Vorlauftemp M3
 {0xA3,0x09,2,0,0},//Kesseltemp
 {0x08,0x10,2,0,0},//Kesseltemp Tiefpass
 {0x08,0x12,2,0,0},//Speichertemp Tiefp
 {0x08,0x14,2,0,0},//Speichertemp2 Teifp
 //Sollwerte
 {0x25,0x44,2,0,0},//Vorlaufsolltemp A1M1
 {0x55,0x5A,2,0,0},//Kesselsolltemp
 //Steuerung
 {0x23,0x01,1},// Betriebsart A1M1
 {0x33,0x01,1},// Betriebsarte M2
 {0x23,0x02,1},// Sparbetrieb A1M1
 {0x23,0x03,2}// Partybetrieb
 */
void p(char *fmt, ... ){
  char tmp[128];
  va_list args;
  va_start (args, fmt );
  vsnprintf(tmp, 128, fmt, args);
  va_end (args);
  //        return tmp;
  Serial.println(tmp);
}

void printStats(){
  p("Aussentemp %d %d",msgs[0][3],msgs[0][4]);
  p("Aussentemp lowpass %d %d",msgs[1][3],msgs[1][4]);
  p("Kesseltemp %d %d",msgs[2][3],msgs[2][4]);
  p("Speichertemp %d %d",msgs[3][3],msgs[3][4]);
  p("Vorlauftemp %d %d",msgs[7][3],msgs[7][4]);
  p("Kesseltemp %d %d",msgs[10][3],msgs[10][4]);
  p("Warmwasser soll %d %d",msgs[15][3],msgs[15][4]);
}

void setup()
{
#if sim
  Serial.begin(4800,SERIAL_8E2);
#else
  Serial.begin(9600);
#endif
  //Hardware port    UCSR0C=0x0E; // 8n2
  //  SERIAL_8E2 0x2E
  Serial.println("start");
  Serial1.begin(4800,SERIAL_8E2);
  aktMsgWait=0; //Msg 0 abrufen
}


void loop() {
  /* getStat im loop lassen
   Zum senden einer nachricht aktMsgWait auf die Msg nummer setzen
   Wenn danach getStat==Msg Nummer wurde die Msg komplett empfangen */
#if sim
  if (Serial1.available()) Serial.write(Serial1.read());
  if (Serial.available()) Serial1.write(Serial.read());
#else

  //Zum neu einlesen einfach : aktMsgWait=0; - oder die msg die gelesenw erden soll
  if (getStat(19)==19)
    printStats();
#endif
}

probono

Mein Setup mit Verlegung eines langen Telefonkabels läuft, aber we es per WLAN versuchen möchte, ich könnte mir vorstellen dass

https://github.com/beckdac/ESP8266-transparent-bridge

funktioniert. Auf dem Host Computer würde dann die ganz normale vcontrold Software laufen, man muss aber den Host nicht im Keller stehen haben. WLAN sollte dann aber gut abgesichert sein :)

Guzzi-Charlie

Hallo zusammen,

ich bin zufällig auf diese Beiträge gestossen. Ich betreibe auch eine Viessmann Heizung die ich gerne auslesen würde. Die Heizung ist schon etwas älter und hat noch keine Optilink-Schnittstelle, sondern nur die 2-Draht-Bus (KM-Bus) Schnittstelle. Ich suche schon eine ganze Weile, konnte aber leider noch nirgends das vollständige Protokoll finden.

Hat Jemand hier vielleicht einen Tip wo ich die Doku zum Protokoll des KM-Busses findeen kann?

Ich bin noch ziemlich am Anfang meines ganzen "Smart Home" Projekts. Im Endeffekt möchte ich aber natürlich soviel wie möglich darin einbinden.

Gruß und Danke

Go Up