Läuft: Heizung mit eBus-Schnittstelle

Begonnen von Prof. Dr. Peter Henning, 29 November 2014, 13:36:59

Vorheriges Thema - Nächstes Thema

steffen79

#2370
Hallo,

ich habe ein ähnliches System wie Mirko_2013 und auch dasselbe Problem.

Meine Geräte:
address 03: master #11
address 08: slave #11, scanned "MF=Vaillant;ID=HMU00;SW=0307;HW=0403", loaded "vaillant/bai.308523.inc", "vaillant/08.hmu.csv"
address 10: master #2
address 15: slave #2, scanned "MF=Vaillant;ID=70000;SW=0419;HW=4603", loaded "vaillant/15.700.csv"
address 31: master #8, ebusd
address 36: slave #8, ebusd
address 71: master #9
address 76: slave #9, scanned "MF=Vaillant;ID=VWZ00;SW=0307;HW=0403"

Zu 76 habe ich keine csv gefunden.
Das System ist Vaillant VWF 87/4 (Sole Wärmepumpe).

Viele Daten kann ich mit den vorhandenen CSV abrufen.

Interesse habe ich noch an Sole Temperatur Ein- und Ausgang sowie Soledruck.

Folgende Fragen:
1) Wo kann ich erkennen, welcher Master welche Funktion hat? Wofür steht bspw. "VWZ00"? Was ist HMU00, was ist BAI?

2) Wie kann ich am besten rausfinden, wonach ich fragen muss, um die Sole-Eingangstemperatur zu finden? (Dieser Wert wird an der Wärmepumpe in einem Menü angezeigt)

3) Ich habe immer wieder einige "unknown" Zeilen, die sich so oder ähnlich immer wieder wiederholen:
2017-10-01 21:47:56.379 [update notice] unknown MS cmd: 1076b5110101 / 09ff3b500aff750000ff
2017-10-01 21:47:56.645 [update notice] unknown MS cmd: 1076b512030f0201 / 07ae030000800f03
2017-10-01 21:47:57.177 [update notice] unknown MS cmd: 1076b51009000000ffffff010000 / 0101

Gibt es da Tips wie man am besten vorgeht? Oder einfach nur stumpf grab result decode und suchen?


Danke & Gruß,
Steffen

TiPpFeHlEr

Hi steffen

also, im Vaillant Ebus hat das Heizgerät immer die Master 03 + Slave 08 (bai)
Der erste Raumregler Master 10 + Slave 15 (VRC700)
Die 71/76 ist ein Weiteres Gerät zb. Solar?? könnte der VR71 sein?
In Luftwärmepumpen von Vaillant existieren immer 2 Geräte (Inneneinheit & Ausseneinheit), da du aber eine Sole WP (nur Inneneinheit?) hast, kann das ja nicht sein.

1. Was bedeutet HMU00, VWZ00, .... -> dies ist eine Vaillant Abkürzung (englisch), der ID
beim Raumregler ist die ID 70000 = MultiMatic700

2. nur durch auslesen, und vergleichen.
Ich habe dazu ein script verwendet das den kpl speicherbereich abfragt und die Antworten logt.
dann kann man nach der Temp suchen und kennt den Speicherbereich im Regler und erstellt daraus eine eigene CSV
script ist im Anhang
#!/bin/sh
port=8889
if [ "x$1" = "x-p" ]; then
  shift
  port=$1
  shift
fi
addr=08
if [ "x$1" = "x-a" ]; then
  shift
  addr=$1
  shift
fi
for i in $(seq 16000 99999)
do
  h=`printf "%4.4X" $i`
  ret=`echo "hex ${addr}b509030d${h##??}${h%%??}"|nc localhost $port|head -n 1`
  echo $i "=" ${h##??}${h%%??} "=" $ret
  echo $i "=" ${h##??}${h%%??} "=" $ret >> ebusregister.txt
done

bei port bitte deinen Adapterport eintragen
bei addr bitte die zu scannende Ebus Adresse eintragen (08, 15, 76,...)
bei seq die Speicher/Register von bis eintragen die abgefragt werden sollen (seq 1 10000) 1-10000
das Ergebniss wird in der ebusregister.txt gespeichert.

3. + 4. es gibt einen Ebus standart nach dem die Nachrichten aufgebaut sind suche mal nach ebus spezifikation.

mfg maik

steffen79

Hallo TiPpFeHlEr,

vielen Dank erstmal für Deine Infos!
Speicherbereich durchsuchen... na  gut, wieso nicht :) Aber woher weiß ich welchen?
Da würde ich aber gerne noch Details zu Deiner herangehensweise wissen.

Ich habe ja 3 "interessante" Master: 08, 15, 76 (gut, könnte ich alle durchsuchen)

"hex ${addr}b509 03 0d${h##??}${h%%??}"

b5 ist klar (vaillant), aber wieso soll ich gerade nach 09 suchen?
03 ist auch klar (Länge)...
Aber 0D? wieso gerade das?

Um die Temperatur (zb 12.3 Grad) zu finden muss man die in den hex-ausgaben ja auch erstmal erkennen. Wie machst Du das?


Danke & Gruß,
Steffen

Prof. Dr. Peter Henning

Die Protokolle sind systematisch aufgebaut - nur leider kennen wir die volle Systematik nicht. Insofern sind die Vorschläge durchaus sinnvoll, siehe Anlage.

LG

pah

Sven77

Zitat von: steffen79 am 02 Oktober 2017, 08:47:36
Um die Temperatur (zb 12.3 Grad) zu finden muss man die in den hex-ausgaben ja auch erstmal erkennen. Wie machst Du das?
Genau hier ist ja die (Hand)Arbeit gefragt!

Mit dem genannten Script kannst Du bestimmte Bereiche abfragen.
WELCHE Bereiche Du abfragst, musst Du durch Probieren herausfinden. Entweder mal in CSVs anderer Wärmepumpen suchen oder die "unknown MS" als Anhaltspunkt nehmen. Dazu vorher wie schon von den Vorrednern angesprochen erstmal ein Grundwissen zum Aufbau der EBus-Nachrichten anlesen.

Ich habe dann, nachdem ich einen oder mehrere Bereiche gefunden hatte die irgendwelche Hex-Daten zurückgeben, die Ausgabe in eine Textdatei geschrieben und das ganze mehrmals am Tag wiederholt. Danach dann die Ausgabe(n) vergleichen, um zu sehen welche Werte sich wann ändern.
Außerdem am Besten gleich bei der Aufnahme die Ist-Werte der gesuchten Temperaturen mit notieren, dann kann man gleich versuchen mit den bekannten Datentypen (s. Wiki) aus den Hex-Daten genau diesen Wert zu finden.

Ich hatte mir mal ein Script geschrieben, was versucht die Hex-Ausgabe in alle möglichen Datentypen umzurechnen. Es müsste evtl. angepasst werden, weil ich mich auf die spezifische Rückgabe der VRC700 konzentriert hatte:
#!/bin/bash

RESONLY=0
if [ "$1" == "-" ] ; then
    RESONLY=1
else
    INP=$1
fi
#export RESONLY
if [ "$INP" == "" ] ; then
    INP="-"
fi

cat $INP | /usr/bin/awk '
/.+/ {
    hex = "X"
    if ($2 == "/") {
        hexmsg = $3
    } else if ($3 == "/") {
        hexmsg = $4
    } else {
        hexmsg = $1
    }
    if (length(hexmsg) > 11) {
        # assume trailing register of VRC700 messages
        if (length(hexmsg) > 17) {
            hex = substr(hexmsg, length(hexmsg) - 7)
        } else if (length(hexmsg) == 16) {
            hex = substr(hexmsg, length(hexmsg) - 5)
        } else if (length(hexmsg) == 14) {
            hex = substr(hexmsg, length(hexmsg) - 3)
        } else if (length(hexmsg) == 12) {
            hex = substr(hexmsg, length(hexmsg) - 1)
        }
        # otherwise assume trailing length for normal messages
    } else if (length(hexmsg) > 9) {
        hex = substr(hexmsg, length(hexmsg) - 7)
    } else if (length(hexmsg) == 8) {
        hex = substr(hexmsg, length(hexmsg) - 5)
    } else if (length(hexmsg) == 6) {
        hex = substr(hexmsg, length(hexmsg) - 3)
    } else if (length(hexmsg) == 4) {
        hex = substr(hexmsg, length(hexmsg) - 1)
    }

    # convert reverse hex to dec
    dec=0
    sch=0
    uch=0
    sint=0
    uint=0
    ulng=0
    exptype=0
    expcls=0
    if (length(hex) > 1) {
        dec += index("123456789abcdef",tolower(substr(hex,2,1)))
        sch  = dec + (index("123456789abcdef",tolower(substr(hex,1,1)))%8)*16
        if (int(index("123456789abcdef",tolower(substr(hex,1,1)))/8) == 1) sint = -sint
        dec += index("123456789abcdef",tolower(substr(hex,1,1)))*16
        uch  = dec
    }
    if (length(hex) > 3) {
        dec += index("123456789abcdef",tolower(substr(hex,4,1)))*256
        sint = dec + (index("123456789abcdef",tolower(substr(hex,3,1)))%8)*4096
        if (int(index("123456789abcdef",tolower(substr(hex,3,1)))/8) == 1) sint = -sint
        dec += index("123456789abcdef",tolower(substr(hex,3,1)))*4096
        uint = dec
    }
    if (length(hex) > 5) {
        dec += index("123456789abcdef",tolower(substr(hex,6,1)))*65536
        exptype = dec + (index("123456789abcdef",tolower(substr(hex,5,1)))%8)*1048576
        # + 1<<23
        exptype += 8388608
        if (int(index("123456789abcdef",tolower(substr(hex,7,1)))/8) == 1) exptype = -exptype
        dec += index("123456789abcdef",tolower(substr(hex,5,1)))*1048576
    }
    if (length(hex) > 7) {
        dec += index("123456789abcdef",tolower(substr(hex,8,1)))*16777216
        dec += index("123456789abcdef",tolower(substr(hex,7,1)))*268435456
        ulng = dec

        expcls =int(index("123456789abcdef",tolower(substr(hex,5,1)))/8)
        expcls+=index("123456789abcdef",tolower(substr(hex,8,1)))*2
        expcls+=(index("123456789abcdef",tolower(substr(hex,7,1)))%8)*32
    }

    if (expcls < 120) {
        exptype = 0
    } else {
        # exptype = exptype / exp( (150-expcls) * log(2))
        exptype = exptype / (2 ^ (150-expcls))
    }

    if ("'"$RESONLY"'" == "0") {
        printf $0
        if (length(hex) == 2) printf "        --> "
        else if (length(hex) == 4) printf "      --> "
        else if (length(hex) == 6) printf "    --> "
        else if (length(hex) == 8) printf "  --> "
    }
    if (length(hex) == 8) {
        printf "ULG:%10d", ulng
        if (hex != "ffffff7f") printf " ; EXP: " exptype
    } else if (length(hex) == 6) {
        # special case for time and date
        sch  = index("123456789abcdef",tolower(substr(hex,2,1)))
        sch += index("123456789abcdef",tolower(substr(hex,1,1)))*16
        printf "%3d /", sch
        sch  = index("123456789abcdef",tolower(substr(hex,4,1)))
        sch += index("123456789abcdef",tolower(substr(hex,3,1)))*16
        printf "%3d /", sch
        sch  = index("123456789abcdef",tolower(substr(hex,6,1)))
        sch += index("123456789abcdef",tolower(substr(hex,5,1)))*16
        printf "%3d", sch
    } else if (length(hex) == 4) {
        printf "UIN:%5d ; D2B:%8.3f ; D2C:%8.2f", uint, (sint/256), (sint/16)
    } else if (length(hex) == 2) {
        printf "UCH:%3d ; D1C:%5.1f", uch, (uch/2)
    }
    print ""
}
'

Dieses kann einfach zum Pipen der Ausgabe eines anderen Scriptes benutzt werden.

VG, Sven
VG, Sven

cs-online

Hallo,

ich bin von EBUSD 1.1 auf 3.0 umgestiegen und habe nun ein Problem: Bislang konnte ich die Teillast (hier WW) mit

w -c bai#install partloadhwckw 10


einstellen. Nun kommt aber die Fehlermeldung

ERR: element not found


obwohl "partloadhwckw" unter find aufgelistet wird. In der CSV ist das mit "wi" gekennzeichnet, das wurde bislang immer mit "#install" geschrieben.

Wie mach ich das denn richtig ?
FHEM auf RPI 4 4GB, HM-WLAN-Gateway, einige HM-Aktoren,2x EBUSD an Heizung+Solar, ESP8266 am Strom-,Gas-,Wasserzähler, in WLAN-Steckdosen und Relaisleisten, Sonoff S20, Shelly1,2 und 2.5,Lacrosse-Gateway und Sensoren,Sduino,Alexa-Fhem,Huawei PV mit Speicher, alles auf einem RPI und da geht noch mehr

steffen79

Sven77, vielen Dank, ich werde das mal als Grundlage nehmen!  :)

john30

Zitat von: cs-online am 06 Oktober 2017, 23:06:47
obwohl "partloadhwckw" unter find aufgelistet wird. In der CSV ist das mit "wi" gekennzeichnet, das wurde bislang immer mit "#install" geschrieben.

Wie mach ich das denn richtig ?
am einfachsten ebusd mit zusätzlichem Parameter "--accesslevel=*" starten.
author of ebusd

cs-online

BINGO :-) und dann ohne das #install, dann läufts :-)

Daaaaanke !!!
FHEM auf RPI 4 4GB, HM-WLAN-Gateway, einige HM-Aktoren,2x EBUSD an Heizung+Solar, ESP8266 am Strom-,Gas-,Wasserzähler, in WLAN-Steckdosen und Relaisleisten, Sonoff S20, Shelly1,2 und 2.5,Lacrosse-Gateway und Sensoren,Sduino,Alexa-Fhem,Huawei PV mit Speicher, alles auf einem RPI und da geht noch mehr

sua

Hallo,

ich habe Probleme beim Schreiben/Verändern des HwcOPMode bei meiner Vaillant calorMATIC 470/4.
Der ebusd ist aktuell aus der git kompiliert, die csv-Dateien sind auch aus der git der ebusd-configuration.
Der HwcOPMode ist in der vaillant/15.470.csv als " r;w,,HwcOPMode... " abgeändert.

Der ebusd arbeitet ansonst (lesen und senden, auch in Version 2.x) seit ca. 12 Monaten völlig "lautlos" und ohne
weitere Probleme (Dank an john30 und pah und Reinhart und allen weiteren Zuarbeitern hierfür).  :)

Erreichen möchte ich eine Zustandsänderung des HwcOPMode von "auto" auf "off" bzw. von "off" auf "auto".

Das senden des Befehls (ebusctl w -c 470 HwcOPMode off) wird ohne Fehler ausgeführt, eine Umschaltung in
der 470er findet jedoch nicht statt.
Hier z.B. gab es wohl auch schon Probleme mit dem HwcOPMode der 470er, eine richtige Lösung für
mein Problem kann ich da dann aber nicht rauslesen.

a)
Gibt es ggf. eine andere Möglichkeit, um den Warmwasserkreis von "auto" auf "aus" bzw. zurück
per ebusd zu ändern (z.B. per "Umweg" per bai?)?

b)
Wie und wo muß ich jetzt ansetzen/testen/ausspielen, um ein Werteänderung des HwcOPMode
auch in meiner starrköpfig 470/4er-Version zu ermöglichen?

Danke schon 'mal im voraus,
sua

PS:
Hier die Ausgabe der ebusd-Konfiguration und die Befehle/Ergebnisse dazu:

root@DietPi2B:~# ebusctl info
version: ebusd 3.0.v3.0-10-g2adbe24
signal: acquired
symbol rate: 25
max symbol rate: 148
reconnects: 0
masters: 3
messages: 449
conditional: 2
poll: 1
update: 9
address 03: master #11
address 08: slave #11, scanned "MF=Vaillant;ID=BAI00;SW=0113;HW=9602", loaded "vaillant/bai.0010015600.inc" ([PROD='0010015600']), "vaillant/08.bai.csv"
address 10: master #2
address 15: slave #2, scanned "MF=Vaillant;ID=47000;SW=0420;HW=1403", loaded "vaillant/15.470.csv"
address 31: master #8, ebusd
address 36: slave #8, ebusd

root@DietPi2B:~# ebusctl r -f -c 470 HwcOPMode
auto

root@DietPi2B:~# ebusctl w -c 470 HwcOPMode off
done

root@DietPi2B:~# ebusctl r -f -c 470 HwcOPMode
auto

root@DietPi2B:~# ebusctl w -c 470 HwcOPMode 0
done

root@DietPi2B:~# ebusctl r -f -c 470 HwcOPMode
auto

cs-online

#2380
Hallo,

bei mir sehen die Einträge in der Klassendatei für Warmwasser so aus:

set Speicher_laden cmd {"w -c 470 hwcOPMode 6\n"}
set Partymodus cmd {"w -c 470 hwcOPMode 4\n"}
set Speicherautomatik cmd {"w -c 470 hwcOPMode 2\n"}


und für Sommer / WInterbetrieb der Heizung


set Sommerbetrieb cmd {"w -c 470 hc1opmode 5\n"}
set Heizautomatik cmd {"w -c 470 hc1opmode 2\n"}


Das Display der 470 braucht einen Moment, bis es umschaltet.

Die CSV musste ich bei mir zum Schreiben so ändern (nur der Anfang der Zeile)

r;w,,HwcOPMode,Betriebsart Warmwasserkreis,,,,"4200".......................

Grüße

Christian
FHEM auf RPI 4 4GB, HM-WLAN-Gateway, einige HM-Aktoren,2x EBUSD an Heizung+Solar, ESP8266 am Strom-,Gas-,Wasserzähler, in WLAN-Steckdosen und Relaisleisten, Sonoff S20, Shelly1,2 und 2.5,Lacrosse-Gateway und Sensoren,Sduino,Alexa-Fhem,Huawei PV mit Speicher, alles auf einem RPI und da geht noch mehr

sua

#2381
Hallo Christian,

danke für Deine Infos, damit sollten meine o.g. Versuche ja prinzipiell schon 'mal richtig sein.
Zitat von: cs-online am 15 Oktober 2017, 19:46:08
bei mir sehen die Einträge in der Klassendatei für Warmwasser so aus:
set Speicher_laden cmd {"w -c 470 hwcOPMode 6\n"}
set Partymodus cmd {"w -c 470 hwcOPMode 4\n"}
set Speicherautomatik cmd {"w -c 470 hwcOPMode 2\n"}

... Das Display der 470 braucht einen Moment, bis es umschaltet.
Bei mir erfolgt dann leider keine Umschaltung, auch nicht nach einer Wartezeit...

Ich denke, ich habe da so eine 470/4-er-Version, die sich 'mal wieder von den allg. 470-er Version unterscheidet. :-(

Deshalb meine o.g. Frage b):
Wo/wie soll ich da jetzt ansetzen?
An welchem Sende-Wert, bzw. an welcher Sende-Befehlsänderung, wäre da der sinnvollste Ansatzpunkt zum Ändern und Austesten?

Danke,
sua

cs-online

Hallo,

was kommt denn dabei heraus, wenn Du nach dem Setzen mit r -f hwcOPMode abfragst, ob das gesetzt wurde ? Ich weiß, daß ich zuerst da auch Probleme mit hatte...
FHEM auf RPI 4 4GB, HM-WLAN-Gateway, einige HM-Aktoren,2x EBUSD an Heizung+Solar, ESP8266 am Strom-,Gas-,Wasserzähler, in WLAN-Steckdosen und Relaisleisten, Sonoff S20, Shelly1,2 und 2.5,Lacrosse-Gateway und Sensoren,Sduino,Alexa-Fhem,Huawei PV mit Speicher, alles auf einem RPI und da geht noch mehr

sua

Hallo Christian,

ja, ich hatte das mit dem zu beachteten "-f" auch schon etwas weiter vorne bei Dir gelesen, das ist aber leider wohl hier nicht mein Problem...

Bei mir ändert sich der Wert (nach dem ebusd-schreiben) weder in der 470/4-er (weder mit warten, noch direkt), als auch nicht per ebusd-Abfrage, trotz der vorherigen positiven ebusd-schreib-Rückmeldung.
Oben, im angehängten Konsolen-log auf dem Linux-System mit dem ebusd, sieht man die Befehle und das Ergebnis, ich hänge die hier aber noch einmal direkt an.
root@DietPi2B:~# ebusctl r -f -c 470 HwcOPMode
auto
root@DietPi2B:~# ebusctl w -c 470 HwcOPMode off
done
root@DietPi2B:~# ebusctl r -f -c 470 HwcOPMode
auto

root@DietPi2B:~# ebusctl w -c 470 HwcOPMode 0
done
root@DietPi2B:~# ebusctl r -f -c 470 HwcOPMode
auto


Jedes anderes Schreiben auf den ebus per ebusd funktioniert in der 470/4-er (z.B. Warmwassersolltemperatur = HwcTempDesired),
nur eben der HwcOPMode (mit gesetzten "r;w,, ...") nicht...

Watt nu?
;-(

sua

cs-online

...und mit 2, 4 oder 6 tut sich auch nichts beim wieder auslesen ?

Dann fällt John vielleicht noch was ein ?
FHEM auf RPI 4 4GB, HM-WLAN-Gateway, einige HM-Aktoren,2x EBUSD an Heizung+Solar, ESP8266 am Strom-,Gas-,Wasserzähler, in WLAN-Steckdosen und Relaisleisten, Sonoff S20, Shelly1,2 und 2.5,Lacrosse-Gateway und Sensoren,Sduino,Alexa-Fhem,Huawei PV mit Speicher, alles auf einem RPI und da geht noch mehr