Stiebel Eltron Wärmepumpe WPL13 und CanBus Abfrage

Hallo,

angespornt durch http://messpunkt.org/blog/ mache ich mich derzeit auf den Weg zum Auslesen unserer Stiebel Eltron WPL13 Wärmepumpe mit dem WPMWII(Wärmepumpenmanager II - Das Teil mit dem Ipod Rädchen :slight_smile: ) über Can-Bus.
Ich war/bin nicht bereit für den sog. „ISG“ einen Haufen Geld hinzulegen. Und für das dauerhafte Monitoring ist das „optische Kabel“ mit der Stiebel Wartungssoftware leider nicht so recht zu gebrauchen.

Projektinventar:

  • Raspberry PI B+ (3.12.35+)

  • Canberry V1.1.1 (CAN BUS Interface) von „www.industrialberry.com
    mit MCP2515 SPI Controller, MCP2551 Transceiver und ner RTC DS1307Z
    Anschluss an Klemme 11 (CAN H) + 12 (CAN L) + 13 (Ground) im Wärmepumpenmanager

  • Abschlusswiderstand 120 Ohm am Canberry Anschluss (zwischen CAN H + CAN L)

Lt. Messpunkt.org hat die Stiebel WPL13 eine Bitrate von 20000 (20kBaud).

Leider komme ich da noch irgendwo nicht weiter…
Vielleicht hat da jemand nen Tipp… meine Linux Kenntnisse (vor mind. 12 Jahren - ) sind leider stark eingerostet…

Hier mal ein paar Auszüge aus diversen Befehlen:

Basiskonfigfile:

can-start.sh
#Can
insmod /lib/modules/3.12.35+/kernel/drivers/spi/spi-bcm2708.ko
insmod /lib/modules/3.12.35+/kernel/net/can/can.ko
insmod /lib/modules/3.12.35+/kernel/drivers/net/can/can-dev.ko
insmod /lib/modules/3.12.35+/kernel/net/can/can-raw.ko
insmod /lib/modules/3.12.35+/kernel/net/can/can-bcm.ko
insmod /lib/modules/3.12.35+/extra/spi-config.ko devices=\bus=0:cs=0:modalias=mcp2515:speed=20000:gpioirq=25:pd=20:pds32-0=16000000:pdu32-4=0X2002:force_release
insmod /lib/modules/3.12.35+/kernel/drivers/net/can/mcp251x.ko
ip link set can0 up type can bitrate 20000
#ip link set can0 up
#ifconfig can0

root@raspberrypi:~# ifconfig
can0 Link encap:UNSPEC Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metrik:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

root@raspberrypi:~# ip -s -d link show can0
4: can0: mtu 16 qdisc noop state DOWN mode DEFAULT qlen 10
link/can
can state STOPPED restart-ms 0
bitrate 0 sample-point 0.000
tq 0 prop-seg 0 phase-seg1 0 phase-seg2 0 sjw 0
mcp251x: tseg1 3…16 tseg2 2…8 sjw 1…4 brp 1…64 brp-inc 1 clock 8000000
re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0
RX: bytes packets errors dropped overrun mcast 0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns 0 0 0 0 0 0

root@raspberrypi:~# dmesg

[37612.050011] mcp251x spi0.0 can0: bit-timing not yet defined
[37612.050051] mcp251x spi0.0: unable to set initial baudrate!
[37612.922276] mcp251x spi0.0: CNF: 0x18 0xb5 0x01
[38041.517179] mcp251x spi0.0: CNF: 0x18 0xb5 0x01
[39925.570499] can: controller area network core (rev 20120528 abi 9)
[39925.570696] NET: Registered protocol family 29
[39925.600354] can: raw protocol (rev 20120528)
[39925.619351] can: broadcast manager protocol (rev 20120528 t)

root@raspberrypi:~# modinfo mcp251x
filename: /lib/modules/3.12.35+/kernel/drivers/net/can/mcp251x.ko
license: GPL v2
description: Microchip 251x CAN driver
author: Chris Elston <celston@katalix.com>, Christian Pellegrin <chripell@evolware.org>
srcversion: CF777FCDDC8E6DB144855BF
alias: spi:mcp2515
alias: spi:mcp2510
depends: can-dev
intree: Y
vermagic: 3.12.35+ preempt mod_unload modversions ARMv6
parm: mcp251x_enable_dma:Enable SPI DMA. Default: 0 (Off) (int)

Was mich wundert:

Im Konfigfile (can-start.sh) setze ich die Bitrate mittels:
ip link set can0 up type can bitrate 20000

unter „ip -s -d link show can0“ zeigt es „Bitrate 0“ an:
can state STOPPED restart-ms 0
bitrate 0 sample-point 0.000

Und unter „dmesg“ zeigt es an:
[37612.050011] mcp251x spi0.0 can0: bit-timing not yet defined
[37612.050051] mcp251x spi0.0: unable to set initial baudrate!

Hat mir hier jemand evtl. einen Tipp?

So ich habs hinbekommen :smiley:
Raspbian komplett neu installiert - nun ist 3.18.11+ installiert und es läuft
mit candump can0 sehe ich alles auf dem Canbus meiner Stiebel Eltron Wärmepumpe mit CanBus.

Ich möchte nur mitlesen (evtl. mal Änderungen per IPS mittels plink SSH und passendem Befehl…)
Bestimmte Werte muss man selbst zzyklisch abrufen (cansend can0 700 …)
Andere WErte gibt es mit candump can0 automatisch bei Statusänderungen (z.B. Wärmepumpe an / aus, Kühlbetrieb an/aus)…
Der Raspberry und mein Windows-IPS befinden sich im selben Netz.

Frage nun?
Wie lasse ich IPS (Windows) an den Infos des Raspberrys teilhaben?

Einerseits könnte ich eine Volkszähler DB auf dem Raspberry mitlaufen lassen, andererseits, weiss ich nicht wie gross die Datenbank auf lange Sicht wird.
Daher wäre es mir am liebsten wenn ich in IPS zyklisch bestimmte Abfragen losschicke und diese dann in IPS verarbeiten könnte.

Was meint Ihr, was wäre sinnvoll?

P.S. Mir ist klar das ich mich dann in Volkszähler DB oder oder dann selbst einlesen muss…
P.P.S mit dem Raspberry hats ja auch „fast“ ohne Probleme geklappt :slight_smile:

Hallo mastermind,

gratuliere zu Deinem Erfolg! Ausgewählte Daten in eine Datenbank zu schreiben ist ein guter Ansatz. Die DB darf aber nicht auf einem Flash-Speicher (Raspi) sein. Die Daten kannst Du mit meinem Programm „can_vz“ in die DB schreiben. Anstelle von candump kann man auch „can_logger“ verwenden. Zu den Programmen gibt es „readme’s“ (siehe http://juerg5524.ch).

can_logger lauscht am Bus; can_vz fordert die Daten aktiv an.

Wenn Du das optische Interface an den IPS anschliessen kannst, könnte ich can_vz für diese Schnittstelle erweitern. Dann bräuchtest Du den Raspi nicht.

Viele Grüsse
Jürg

@juerg5524

Vielen Dank erstmal für deine klasse Entwicklungen!
Ich schau mir das dann mal mit der Datenbank an.
D.h. auf dem IPS Rechner lass ich ne DB mitlaufen, in die der Raspi und dein Tool reinschreiben darf.
Das versuche ich dann mit IPS auszulesen…

Das Originale Optische Interface liegt rum :slight_smile:
Mein IPS Rechner steht in einem anderen Raum, von daher war der Raspi mit Canbusinterface die kostengünstigste Variante.

Als Info für andere, ich hab die Fernbedienung FEK im Einsatz (wird für die Kühlfunktion) benötigt.

Da ich mit dem Raspberry und dem Canbusinterface zwischen Wärmepumpensteuerung und FEK Fernbedienung hänge, wird kein Abschlusswiderstand 120Ohm benötigt. D.h. in Canbus ist nur an den Enden mit einem Abschlusswiderstand zu versehen.

P.S:
Vielleicht hab ich ja noch irgendwann mal das Glück auch noch günstig an ein Opentherm Gateway zu kommen…
dann kommt die Lüftungsanlage (Viessmann Vitovent 300 baugleich Renovent HR Large) dran.

Ich hatte da auch mal so ein ähnliches Problem und da hat die Neuinstallation echt geholfen. Die Wärmepumpe funktioniert auch wieder.

Gibt es ein Nachschlagewerk, wo man das „can_vz“ nachlesen kann? Das klingt sehr interessant mit der Datenbank und ich würde mir da auch gerne die ein oder andere Information über meine Wärmepumpe nachschauen wollen. :slight_smile:

Hallo OertliJens

Ich gehe davon aus, dass Du eine Oertli WP betreibst und meine Software überhaupt nicht passt. Welche Daten-Schnittstellen hat Deine WP? CAN-Bus oder RS232?

Viele Grüsse
Jürg

Ich bin nun endlich soweit dass ich die Canbus Daten meiner Stiebel WPL gerne durch IPS einlesen und visualisieren möchte.

Ein paar kleine Spielereien wie Kühlung an / aus im Sommer funktionert per Bashroutine schon mal.

Nun habe ich verständnsiprobleme mit dem verarbeiten von Arrays per „explode Befehl“

Meine Kommandozeilenausgabe sieht wie folgt aus:
canbus.JPG

Wie kann ich diesen Text per explode auf den letzten Wert (=mein Ergebnis) beschränken?
Ich setze „explode“ bereits bei meinem USB VOC Luftgütesensor ein:

$wert=  system("/home/pi/airsensor/airsensor -o");
$wert1=explode(' ', $wert);
$wert2=$wert1[3];
$wert3=explode(',', $wert2);
$wert4=$wert3[0];
settype($wert4,"Integer"); 
Setvalue($luftqid, $wert4);

usb_VOC.JPG

Wie baue ich das Explode aus meinem bisherigen Beispiel um?

Für andere mal ein paar „interessante“ Werte der Stiebel Canbus abfrage:

Hier ein Beispiel:

Indixes 680 180
Abruf per ./can_scan can0 680 180:
Global alle Werte (dauert sehr lange)
./can_scan can0 680 180

Abruf der Aussentemperatur (000c):
./can_scan can0 680 180.000c spuckt aus:
can_at.JPG

Abruf der Vorlauftemperatur (000f) -
./can_scan can0 680 180.000f:

Abruf der Rücklauftemperatur (0016):
Abruf der erzeugten Wärme Warmwasser in MWh (092d):
Abruf der erzeugten Wärme heizung in MWh (0931):
Abruf der heute erzeugten Wärme Warmwasser in MWh (092b):
Abruf der heute erzeugten Wärme Heizung in MWh (092f):
Abruf der aktuellen Heizkurve (010e):

Indixes 680 301:
Abruf der Raumisttemperatur des Führungsraums (0011).
./can_scan can0 680 301.0011

can_IT.JPG

Die erzeugte Wärmemenge für heizen + WW lässt sich nun bei mir ebenfalls abrufen.
Da wir einen Youless Zähler auf unserem WP Stromzähler haben, kann man damit dann ganz bequem die JAZ der WP errechnen.
Erzeugte Wärmemenge (WW+Heizen) : Stromverbrauch im gleichen Zeitraum = AZ bzw. JAZ.

Um die Wärmemenge (meiner Luft-WP SE WPL13 cool) abfragen zu können, muss ich folgende Indixes (über die Canbus ID 500) abrufen…
Ansonsten rufe ich eigentlich alles über 180 / 301 ab… In anderen Foreneinträgen, wird die WM ebenfalls per 180 abgerufen… Wird bei mir wohl an der Softwareversion liegen…

Code: [Auswählen]

680 500.
und dann:
092b WAERMEERTRAG_WW_TAG_KWH
092f WAERMEERTRAG_HEIZ_TAG_KWH
092d WAERMEERTRAG_WW_SUM_MWH
0931 WAERMEERTRAG_HEIZ_SUM_MWH
0923 WAERMEERTRAG_2WE_WW_TAG_KWH
0925 WAERMEERTRAG_2WE_WW_SUM_MWH
0927 WAERMEERTRAG_2WE_HEIZ_TAG_KWH0016 RUECKLAUFISTTEMP

Also z.B. „can_scan can0 680 500.092b“

In IPS:

//Warmwassermodus
$wwmodus=exec("/home/pi/can_progs/can_scan can0 680 180.005a");
$wwmodus1=substr($wwmodus,-2,-1);
SetValue(28466 /*[Haus\Haus\Heizung\HEIZKURVE]*/,$wwmodus1);
//Waermeertrag WW Tag in kWh
$wwtag=exec("/home/pi/can_progs/can_scan can0 680 500.092b");
$wwtag1=substr($wwtag,-7,-1);
SetValue(47965 /*[Haus\Haus\Heizung\HEIZKURVE]*/,$wwtag1);
//Waermeertrag Heizen Tag in kWh
$heizentag=exec("/home/pi/can_progs/can_scan can0 680 500.092f");
$heizentag1=substr($heizentag,-8,-1);
SetValue(12742 /*[Haus\Haus\Heizung\HEIZKURVE]*/,$heizentag1);
//Waermeertrag WW Summe in MWh
$wwsumme=exec("/home/pi/can_progs/can_scan can0 680 500.092d");
$wwsumme1=substr($wwsumme,-7,-1);
SetValue(51560 /*[Haus\Haus\Heizung\HEIZKURVE]*/,$wwsumme1);
//Waermeertrag HeizenSumme in MWh
$heizensumme=exec("/home/pi/can_progs/can_scan can0 680 500.0931");
$heizensumme1=substr($heizensumme,-8,-1);
SetValue(47013 /*[Haus\Haus\Heizung\HEIZKURVE]*/,$heizensumme1);

auf dem Raspi:
can_ergebnisse.JPG

Übersicht: