FHEM Forum

FHEM - Anwendungen => Heizungssteuerung/Raumklima => Thema gestartet von: juerg5524 am 14 Oktober 2015, 13:43:31

Titel: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 14 Oktober 2015, 13:43:31
Hallo zusammen,

ich bin ein absoluter FHEM-/Perl-Anfänger. Mit meinem Modul können Daten aus der Wärmepumpe gelesen und verändert werden. Aus Vorsicht teste ich vorwiegend in einer Simulationsumgebung (Windows). Wenn jemand daran interessiert ist, werde ich gerne auch mehr dazu schreiben.

Viele Grüsse
Jürg

P.S.: Weitere Software dazu befindet sich unter http://juerg5524.ch im File can_progs_fhem_test.zip (später in can_progs.zip).
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Burny4600 am 22 Dezember 2015, 13:31:27
@juerg5524

Habe einen Raspberry inklusive PICAN.
Möchte mich damit in die bestehende Heizung mit dem Elfatherm E6 hängen.

Wie muß ich den PICAN in FHEM dafür konfigurieren?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 23 Dezember 2015, 15:54:10
Hallo Chris

der PICAN kann als SocketCAN-Schnittstelle konfiguriert werden. Die Bitrate für den E6 sollte bei 20000 bits/sec liegen:

# ip link set can0 up type can bitrate 20000

Dann kannst Du meine Software (ohne FEHM) verwenden. "can0" ist das Device, das Du verwenden kannst.

Zum Elfatherm E6 habe ich keine Zugriffsdaten (Zuordnung, zu welchem CAN-ID - Elster-Index - Paar man welchen Wert abfragen kann). Die benötigten Daten kannst Du aber selbst ermitteln. Dazu brauchst Du das Programm ComfortSoft. Warnung: Ist ziemlich kompliziert.

Viele Grüsse
Jürg 
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Burny4600 am 23 Dezember 2015, 20:05:11
@juerg5524

Danke für den Tipp vorerst einmal.
Werde ich nach den Feiertagen gleich einmal ein wenig testen.

Gab es eigentlich schon Einbindungen via CAN an Heizungsreglern usw. in FHEM?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Burny4600 am 31 Dezember 2015, 09:28:52
@juerg5524

Mit diesen Einstellungen kommen jetzt Daten an.
Wie kann ich die Schnittstelle jetzt in FHEM einbinden?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 Januar 2016, 13:42:35
Hallo Burny4600

Das Wrapper-Modul (Files elster_perl.so und elster_perl.pm) kannst Du mit dem Skript can_elster_perl.arm erzeugen. Diese beiden Files ins Library-Perl-Verzeichnis kopieren. Bei mir ist das:

/usr/lib/perl/5.14.2

Das Modul "50_Elster.pm" solltest Du auf Deine WP anpassen. Danach ins FHEM-Verzeichnis kopieren.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Burny4600 am 12 Januar 2016, 18:32:08
@juerg5524

Kannst du mir das etwas genauer erläutern was du mit dem Wrapper-Modul usw. meinst.

Ich finde zwar die Dateien aber wo muss ich mit dem Skript can_elster_perl.arm die Dateien erzeugen, bzw. wo muß ich das gesamte can_progs Verzeichnis am Raspi ablegen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 15 Januar 2016, 13:57:14
Hallo Chris

Das Wrapper-Modul elster_perl.so wird zur Laufzeit mit "use elster_perl;" in ein Perl-Programm eingebunden. Alle Methoden, die im File elster_perl.h aufgeführt sind, können dann vom Perl-Programm verwendet werden. In Deinem Fall solltest Du

elster_perl::setdev("can0");

verwenden. set_can232 solltest Du auskommentieren.

Wo das Verzeichnis can_progs steht, spielt keine Rolle. Am besten vielleicht in Deinem Home-Verzeichnis. Wechsle ins prog-Verzeichnis und starte can_elster_perl.arm:

>cd can_progs
>./can_elster_perl.arm

Dabei wird die Open-Source swig verwendet (generiert elster_perl_wrap.cxx).

Viele Grüsse und gutes Gelingen
Jürg 
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 03 Februar 2016, 21:14:48
Hallo zusammen,

Ich habe einen Raspberry und PICAN paltine.  Diese hängt an einer Tecalor TTL 15A .

Bekomme das Modul und das PICAN Board nicht zum laufen.

Kann jemand eine Detailierte Anleitung schreiben?

Danke und Gruß

NIWA
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 Februar 2016, 16:04:46
Hallo Niwa,

was alles geht nicht? Für den Einstieg gibt es eine Beschreibung auf messpunkt.org.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Brun am 04 November 2016, 12:59:44
Servus,

haben schon einige die Verbindung realisiert?
Ich wollte mich mal dran machen. Scheitere leider aber schon ein ein paar Punkten.

Ich wollte erstmal einen can_scan machen.
Aber die gewünschten informationen kommen leider nicht. Und ich bekomme immer was anderes.

root@rpi-keller:~/can_progs# ./can_scan ttyACM0 780 total
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

scan on CAN-id: 780
list of valid can id's:

  000 (a51a = 165-26)


root@rpi-keller:~/can_progs# ./can_scan ttyACM0 780 total
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

scan on CAN-id: 780
list of valid can id's:

  000 (a51a = 165-26)
  483 (a51a = 165-26)
  503 (4307 = 67-07)


root@rpi-keller:~/can_progs# ./can_scan ttyACM0 780 total
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

scan on CAN-id: 780
list of valid can id's:

  000 (a51a = 165-26)
  183 (a51a = 165-26)




Vorschläge?
Ideen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 10 November 2016, 10:31:50
Hallo Brun,

möglicherweise ist die Id 780 bereits vergeben. Könntest Du es bitte mit der Id 680 versuchen (und zunächst ohne den Zusatz "total").

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Brun am 15 November 2016, 17:54:16
Hallo Jürgen,

das Ergebnis ist reproduzierbar immer das selbe.
Ich bekomme immer eine ähnliche Ausgabe wie schon oben. Egal welche Sender ID ich nehme.

Gruß Brun
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 16 November 2016, 15:41:06
Hallo Burn,

es könnte auch an der Hardware liegen. Z.B., wenn keine galvanische Trennung vorliegt und ein Fehlerstrom fliest (kann die Hardware zerstören). Ebenfalls zu einem Fehlverhalten kann ein falsch abgeschlossener CAN-Bus führen. Ich nehme aber an, dass Du ein sehr kurzes Kabel (1 oder 2 Meter) verwendest, welches nicht abgeschlossen werden muss.

Wenn Du passiv die Daten am CAN-Bus analysierst, sind da Unregelmässigkeiten zu sehen (siehe Programm can_logger)?

Gibt es beim Wiederholen von

./can_scan ttyACM0 680 503.000b trace

auch Unregelmässigkeiten?

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Brun am 29 November 2016, 16:03:43
So. Habs jetzt endlich mal geschafft.

Angeschlossen habe ich den Adapter mit nur einen 10cm langen Kabel. Da der RPI direkt neben dem WPM ist. Hab ich da vielleicht schon was falsch gemacht?

mit can_scan bekomme ich nur etwa sowas:
./can_scan ttyACM0 680 503.000b trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] a1 03 fa 00 0b           .....
     680 00 [5] a1 03 fa 00 0b           .....
  0  29.11.2016 15:02:40.856       680 00 [5] a1 03 fa 00 0b           .....
no value read

Und das ändert sich auch permanent.

Sorry, aber von CAN habe ich leider kein blassen Schimmer.


Gruß Brun
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 30 November 2016, 16:52:14
Hallo Brun,

mich würde interessieren, welche CAN-IDs Deine WP verwendet. Mit dem Befehl

./can_logger ttyACM0

werden diese aufgelistet und mit

./can_logger ttyACM0 60 logfile

werden die Meldungen alle 60 Sekunden in "logfile..." abgespeichert. Mit einem solchen Log kann ich Dir eventuell weiterhelfen.

Viele Grüsse
Jürg

P.S.: Welchen CAN-Adapter hast Du im Einsatz?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Brun am 01 Dezember 2016, 14:41:10
Hallo Jürg,

mit can_log sehe ich immer folgende Adressen:
180
480
500

Ich Kann dir gerne so ein Logfile geben. Aber ungern öffentlich.

Als Adapter verwende ich den USBtin von Fischl.


Gruß Brun
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 02 Dezember 2016, 10:35:41
Hallo Brun,

dann sollte zu diesen Adressen mit

  ./can_scan ttyACM0 680 xxx.000b trace

eine Antwort kommen. (Anstelle von xxx 180, 480 oder 500 einsetzen.)

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 26 Januar 2017, 14:16:18
Hallo zusammen,
Hallo juerg5524,

ich habe meine Stiebel Eltron WPF13 mit WPM2 über CAN Bus an meinen RPI2 angeschlossen.
Verwendet habe ich ein PiCan2 Interface und ein aktuelles Jessie System.
Abschlusswiderstand 120 Ohm habe ich direkt auf dem PiCan Board durch die Brücke (JP) gesetzt

mit
ip link set can0 type can bitrate 20000
ifconfig can0 up

aktiviere ich das Can Interface.
danach habe ich folgende Daten empfangen:

pi@rpi_can:~/can/can_progs $ candump can0
  can0  602   [7]  66 02 FE 01 00 00 00
  can0  180   [7]  66 79 FE 01 00 00 00
  can0  480   [7]  A6 79 FE 01 00 00 00
  can0  602   [7]  66 02 FE 01 00 00 00
  can0  180   [7]  66 79 FE 01 00 00 00
  can0  480   [7]  A6 79 FE 01 00 00 00
  can0  601   [7]  60 01 52 00 00 00 00



es kommt aber nur alle paar Minuten mal ein Telegramm.
Ist das normal? oder ist das erstmal der Anfang?

Muss ich nun eine dieser Adressen mit dem 
./can_scan ttyACM0 680 xxx.000b trace
"anfragen" ?

Bin über jeden Hinweis dankbar.



Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 27 Januar 2017, 08:46:23
Nun habe ich mit ./can_logger can0 60 logfile.txt   folgende Aufzeichnung gemacht:

 
  0  26.1.2017 13:26:40.742       602 00 [7] 66 02 fe 01 00 00 00     f......
  1  26.1.2017 13:26:40.763       180 00 [7] 66 79 fe 01 00 00 00     fy.....
  2  26.1.2017 13:26:40.786       480 00 [7] a6 79 fe 01 00 00 00     .y.....
  3  26.1.2017 13:33:40.752       602 00 [7] 66 02 fe 01 00 00 00     f......
  4  26.1.2017 13:33:40.774       180 00 [7] 66 79 fe 01 00 00 00     fy.....
  5  26.1.2017 13:33:40.798       480 00 [7] a6 79 fe 01 00 00 00     .y.....
  6  26.1.2017 13:40:40.746       602 00 [7] 66 02 fe 01 00 00 00     f......
  7  26.1.2017 13:40:40.768       180 00 [7] 66 79 fe 01 00 00 00     fy.....
  8  26.1.2017 13:40:40.790       480 00 [7] a6 79 fe 01 00 00 00     .y.....
  9  26.1.2017 13:41:54.783       601 00 [7] 60 01 52 01 00 00 00     `.R....
10  26.1.2017 13:47:40.767       602 00 [7] 66 02 fe 01 00 00 00     f......
11  26.1.2017 13:47:40.789       180 00 [7] 66 79 fe 01 00 00 00     fy.....
12  26.1.2017 13:47:40.811       480 00 [7] a6 79 fe 01 00 00 00     .y.....
13  26.1.2017 13:51:24.766       601 00 [7] 60 01 52 00 00 00 00     `.R....
14  26.1.2017 13:54:40.773       602 00 [7] 66 02 fe 01 00 00 00     f......
15  26.1.2017 13:54:40.795       180 00 [7] 66 79 fe 01 00 00 00     fy.....
16  26.1.2017 13:54:40.817       480 00 [7] a6 79 fe 01 00 00 00     .y.....
17  26.1.2017 14:01:40.756       602 00 [7] 66 02 fe 01 00 00 00     f......
18  26.1.2017 14:01:40.778       180 00 [7] 66 79 fe 01 00 00 00     fy.....
19  26.1.2017 14:01:40.800       480 00 [7] a6 79 fe 01 00 00 00     .y.....
20  26.1.2017 14:08:40.769       602 00 [7] 66 02 fe 01 00 00 00     f......
21  26.1.2017 14:08:40.791       180 00 [7] 66 79 fe 01 00 00 00     fy.....
22  26.1.2017 14:08:40.813       480 00 [7] a6 79 fe 01 00 00 00     .y.....
23  26.1.2017 14:15:40.763       602 00 [7] 66 02 fe 01 00 00 00     f......
24  26.1.2017 14:15:40.785       180 00 [7] 66 79 fe 01 00 00 00     fy.....
25  26.1.2017 14:15:40.807       480 00 [7] a6 79 fe 01 00 00 00     .y.....
26  26.1.2017 14:22:40.783       602 00 [7] 66 02 fe 01 00 00 00     f......
27  26.1.2017 14:22:40.805       180 00 [7] 66 79 fe 01 00 00 00     fy.....
28  26.1.2017 14:22:40.827       480 00 [7] a6 79 fe 01 00 00 00     .y.....
29  26.1.2017 14:25:08.817       601 00 [7] 60 01 52 01 00 00 00     `.R....
30  26.1.2017 14:29:40.788       602 00 [7] 66 02 fe 01 00 00 00     f......
31  26.1.2017 14:29:40.810       180 00 [7] 66 79 fe 01 00 00 00     fy.....
32  26.1.2017 14:29:40.832       480 00 [7] a6 79 fe 01 00 00 00     .y.....
33  26.1.2017 14:34:38.779       601 00 [7] 60 01 52 00 00 00 00     `.R....
34  26.1.2017 14:36:40.788       602 00 [7] 66 02 fe 01 00 00 00     f......
35  26.1.2017 14:36:40.810       180 00 [7] 66 79 fe 01 00 00 00     fy.....
36  26.1.2017 14:36:40.832       480 00 [7] a6 79 fe 01 00 00 00     .y.....
37  26.1.2017 14:43:40.785       602 00 [7] 66 02 fe 01 00 00 00     f......



anbei meine log Datei als Anhang.

Sind darin nun meine Zugangsadressen?

Zitat von: juerg5524 am 02 Dezember 2016, 10:35:41

dann sollte zu diesen Adressen mit

  ./can_scan ttyACM0 680 xxx.000b trace

eine Antwort kommen. (Anstelle von xxx 180, 480 oder 500 einsetzen.)


Das werde ich nachher mal ausprobieren....


Oder hat jemand dazu noch einen weiteren Hinweis?





Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 27 Januar 2017, 09:04:02
Das Ergebnis meines scans:

pi@rpi_can:~/can/can_progs $ ./can_scan can0 680 180.0126 trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] 31 00 fa 01 26           1...&
  0  27.1.2017 07:58:46.969       680 00 [5] 31 00 fa 01 26           1...&
  1  27.1.2017 07:58:46.982       180 00 [7] d2 00 fa 01 26 3b 00     ....&;.

send ComfortSoft: 0d00030100fa0126800801ba   can232: t68053100FA0126
recv ComfortSoft: 03000d0200fa01263b00016e   can232: t1807D200FA01263B00

value: 3b00  (MINUTE  59)
pi@rpi_can:~/can/can_progs $ ./can_scan can0 680 480.0126 trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] 91 00 fa 01 26           ....&
  0  27.1.2017 07:59:57.829       680 00 [5] 91 00 fa 01 26           ....&
  1  27.1.2017 07:59:57.852       480 00 [7] d2 00 fa 01 26 00 00     ....&..

send ComfortSoft: 0d00090100fa0126800801c0   can232: t68059100FA0126
recv ComfortSoft: 09000d0200fa012600000139   can232: t4807D200FA01260000

value: 0000  (MINUTE  0)
pi@rpi_can:~/can/can_progs $ ./can_scan can0 680 602.0126 trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] c1 02 fa 01 26           ....&
  0  27.1.2017 08:00:20.507       680 00 [5] c1 02 fa 01 26           ....&
     680 00 [5] c1 02 fa 01 26           ....&
  1  27.1.2017 08:00:21.544       680 00 [5] c1 02 fa 01 26           ....&
  2  27.1.2017 08:00:21.551       602 00 [7] d2 00 fa 01 26 00 00     ....&..

send ComfortSoft: 0d000c0102fa0126800801c5   can232: t6805C102FA0126
recv ComfortSoft: 0c020d0200fa01260000013e   can232: t6027D200FA01260000

value: 0000  (MINUTE  0)
pi@rpi_can:~/can/can_progs $


(Ich hoffe ich habe jetzt nichts verstellt oder überschrieben)

Hmmmmmm....
:o :o :o
und was sagt mir das Ergebnis nun?

ich möchte gerne meine ganzen Wärmepumpen-Daten über das Fhem_Modul  aufzeichnen und darstellen?
Kann mir jemand den weiteren Weg beschreiben wie es nun weiter geht?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Gerhard am 27 Januar 2017, 15:40:39
Hallo Korre,

der CAN Bus ist ein multi Mater Bus, dh. alle fangen an zu senden nach ein IDL und hören gleichzeitig mit,
wobei der Knoten mit dem kleinstem ID gewinnt und sendet weiter und die Anderen hören ab da mit (Arbitrierung).
Also das war nur eine kleine Teorie die der Sache nicht weiter hilft, aber hilft dazu zu verstehen wie die einzelne
Messages aufgebaut sind.
Die Zahlen 680, 180 etc. sind CAN-Ids (werden in einem Bus von 1 bis 2047 vergeben).
Ein CAN-Message ist so Aufgebaut:

CAN-ID byte1 .. .. byte8 (maximal)

hier:
680 [len] 31 00 fa 01 26
hier muss man aufpassen (in dein CAN-Programm nachlesen) wie die einzelnen Bytes bei einem Word oder Long dargestellt werden (high low Folge).

Eine CAN-ID kann nur von einem Knoten gesendet werden aber alle können es empfangen.

Aus den CAN-IDs sieht man das es kein CANopen Protokol ist (dann wäre es einfacher gewisse dinge rauszufinden).

Als erstes muss man wissen was die einzelnen Messages transportieren und wie sie aufgebaut sind (vll. eine CAN Beschreibung
der einzelnen Messages von Hersteler?).
Wenn nicht muss man das rausfinden:
z.B. Etwas verstellen und schauen was gesendet wird und was geantwortet wird.
Wenn man dies hat, kann man sich an die Anbindung an fhem machen.

Gerhard
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 27 Januar 2017, 15:58:21
Hallo Korre,

Du hast damit nichts verstellt. Das ist eine einfache Anfrage, die vermutlich nur zur ID 180 die korrekten Minuten zurück gibt.

Wie zu Beginn dieses Beitrags, kannst Du den Wrapper zusammen mit 50_Elster.pm verwenden. Das Perl-Modul musst Du aber an Deine WP anpassen.

In 50_Elster.pm gibt es eine kleine Anleitung.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 30 Januar 2017, 16:47:21
Hallo zusammen,

habe nun wie in der 50_Elster - Anleitung beschrieben einen Total-scan gemacht.
Hatte dabei einige Unklarheiten.

Wenn ich nur ./can_scan can0 680 total trace durch führe konnte ich keine Aufzeichnung als Trace-Datei finden.
Weiß nicht genau wie das vorgesehen ist, aber ich dachte die Option "trace" erzeugt eine Datei. ???

Ich habe mir dann mit folgendem Befehl beholfen und die Ausgaben in eine Datei umgeleitet.
./can_scan can0 680 total trace >totalscan_korre

Die Datei im Anhang sieht sehr umfangreich und vielversprechend aus.
Ist die Datei korrekt und kann diese so weiterverwendet werden?

Ich habe versucht die Datei in CS_Brücke zu laden, kam leider nicht  weiter,
da beim "Start" die Meldung "serielle Schnittstelle konnte nicht geöffnet werden" erschien.
Ich muss bestimmt erst "com2com" starten, bzw. aus dem Internet downloaden. ( habe das Programm in Jürgs can_progs nicht finden können ....)

Kann mir jemand einen weiteren Tipp geben, bzw. könnte jemand meine totalscan-Datei mit comfortSoft umwandeln?



Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 31 Januar 2017, 10:52:26
Hallo Korre,

ich werde Dir helfen. Aber leider muss ich feststellen, dass in meiner Software ein Fehler auftritt, den ich zuerst korrigieren muss. Der Fehler äussert sich so, dass die Zuordnung im Scan verschoben ist. Bei den Zeilen aus Deinem Scan

45227  30.1.2017 14:54:05.563       680 00 [5] c1 02 fa fd b7           .....
45228  30.1.2017 14:54:05.582       602 00 [7] d2 00 fa fd b4 96 00     .......
  { 0x602, 0xfdb7, 0x9600},
     680 00 [5] c1 02 fa fd b8           .....
45229  30.1.2017 14:54:05.587       680 00 [5] c1 02 fa fd b8           .....
45230  30.1.2017 14:54:05.605       602 00 [7] d2 00 fa fd b6 80 00     .......
     680 00 [5] c1 02 fa fd b9           .....
45231  30.1.2017 14:54:05.610       680 00 [5] c1 02 fa fd b9           .....
45232  30.1.2017 14:54:05.628       602 00 [7] d2 00 fa fd b7 80 00     .......

ist die erste Anfrage zum Elster-Index fdb7, die Antwort taucht aber erst in der übernächsten Anfrage auf. Es mag auch damit zusammenhängen, dass ich für den Live-Test nur den Raspi verwendete. Windows und MAC wurden mit Simulationen getestet!

Ich hoffe, dass Du etwas Geduld aufbringen kannst.

Ja, es braucht zuerst com0com (und nicht com2com).

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 31 Januar 2017, 12:13:09
Hallo Jürg,

danke schonmal vorab, dass du dich der Sache annimmst.
Warum könnte das verschoben sein?
Habe ich was falsch gemacht mit meinem umleiten der Ausgaben in die Datei, oder reagiert bei meiner Konstellation etwas träge?
Ich habe es mit meinem Raspi B  und der PiCan Schnittstelle gescannt.

Klar habe ich etwas Geduld, auch wenn ich schon sehr gespannt bin, was bei diesem meinem Projekt als nächstes passiert. 8) 8) 8) .

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 03 Februar 2017, 14:45:46
Hsllo,
bin relativer Laie in der Thematik.

Habe vor einen WPMII über einen USBtin an einen Raspberry 3 anzubinden.

Probleme gehen schon los einen Totalscan zu machen.
Bei der Befehlseingabe kommt folgendes :

./can_scan.arm: Permission denied

Hab versucht was im Forum in Erfahrung zu bringen. Leider ohne Erfolg.

Wer kann helfen?

GRuß
niwa

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 Februar 2017, 11:18:14
Hallo niwa,

vermutlich kannst Du mit dem Befehl "chmod" das Ausführungsrecht freischalten:

chmod 777 can_scan.arm

eventuell auch

sudo chmod 777 can_scan.arm

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 04 Februar 2017, 11:27:25
Hallo Jürg,

danke für deine Hilfe.

Das Problem war die Berechtigung . Ich hab vor lauter Bäumen den Wald nicht gesehen.

ich bekomme nach dem kompelieren folgende Ausgabe

./can_scan /dev/ttyACM0 680

elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

list of valid can id's:

  000 (0000 = 0-00)


Sieht irgendwie nicht so gut aus, oder?

Gruß
Niwa
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 Februar 2017, 16:17:03
Hallo Niwa,

nein, sieht wirklich nicht gut aus! Welche WP hast du im Einsatz?

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 05 Februar 2017, 09:17:59
Hallo Korre,

im neusten can_progs.zip gibt es ein "fhem_tab_korre.inc" das Du in 50_Elster.pm einsetzen kannst. Damit ist 50_Elster.pm exakt auf Deine WP ausgelegt.

In "scan_data_korre.inc" sind die ausgefilterten Daten zu Deinem Scan. Eine ComfortSoft-Darstellung ist im Anhang ersichtlich.

Der Fehler beim Scan ist korrigiert.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 06 Februar 2017, 20:47:46
Hallo Jürg,

hab eine Tecalor TTL 15 AS mit einem WPM II im Einsatz.

Mein Buskabel ist ca. 30 cm lang und ist mit 120 Ohm am USBtin terminiert.

Mit der Version vom 25.01. habe ich mit folgendem Befehl was rausbekommen:

./can_scan /dev/ttyACM0 680 180

Mit der akutellen Version sieht es schlecht aus, sprich ich bekomme gar nix angezeigt.

GRuß
Niwa
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 07 Februar 2017, 07:40:52
Hallo Niwa,

danke für die Fehlermeldung. Bekommst Du denn mit

./can_logger ttyACM0 0

oder mit

./can_scan 680 180.000b trace

etwas?

Der Bus ist bereits an 2 Enden terminiert. Bei 30 cm sollte man nicht zusätzlich terminieren.

Mit dem USBtin solltest Du vorsichtig sein, da er nicht galvanisch trennt!

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 07 Februar 2017, 17:26:57
Hallo Jürg,

bei beiden Befehle bekomme ich Ausgaben

Gruß
Niwa
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 08 Februar 2017, 10:34:48
Hallo Niwa,

könntest Du bitte den Befehl, der nicht funktionierte, mit dem Zusatz "trace" ausführen:

./can_scan ttyACM0 680 180 trace

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 09 Februar 2017, 17:36:05
Hallo Jürg,

habe ich gemacht. Ich bekomme eine Ausgabe.
fhem
Welche Befehle muss ich ausführen, damit ich dein fhem Modul nutzen kann?

Gruß
Niwa
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 10 Februar 2017, 11:38:30
Hallo Niwa,

Du brauchst von der WP einen Scan. Mit den Daten des Scans kann man dann die richtige Tabelle in 50_Elster.pm einsetzen. Dazu müsste aber zu

./can_scan ttyACM0 680

eine Liste mit 4 bis 7 Geräten (IDs) angezeigt werden. Kriegst Du diese Liste mit der neusten Software? Wenn nein: Kannst Du einige Zeilen, welche

./can_logger ttyACM0 0

generiert, hier posten? Einfach um zu sehen, welche IDs bei Dir aktiv sind.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 10 Februar 2017, 15:05:49
Hallo Jürg,

bei ./can_scan ttyACM0 680 bekomme ich keine IDs angezeigt.

Beim ./can_logger ttyACM0 0 habe ich folgendes bekommen:


0  10.2.2017 14:02:37.803       601 00 [7] d2 00 fa 00 0b 80 00     .......
  1  10.2.2017 14:02:37.803       602 00 [7] d2 00 fa 00 0b 80 00     .......
  2  10.2.2017 14:02:37.806       180 00 [7] a0 79 0c ff fd 00 00     .y.....
  3  10.2.2017 14:02:37.806       480 00 [7] a1 00 fa 01 99 00 00     .......
  4  10.2.2017 14:02:37.806       500 00 [7] 92 00 fa 01 99 00 93     .......
  5  10.2.2017 14:02:37.806       480 00 [7] a1 00 fa 01 d6 00 00     .......
  6  10.2.2017 14:02:37.806       480 00 [7] a1 00 16 00 00 00 00     .......
  7  10.2.2017 14:02:37.807       500 00 [7] 92 00 fa 01 d6 01 c8     .......
  8  10.2.2017 14:02:37.809       480 00 [7] a1 00 fa 07 a8 00 00     .......
  9  10.2.2017 14:02:37.809       480 00 [7] a0 00 fa 02 ca 01 03     .......
10  10.2.2017 14:02:37.809       500 00 [7] 92 00 16 01 96 00 00     .......
11  10.2.2017 14:02:37.810       480 00 [7] a0 00 fa 09 17 00 00     .......
12  10.2.2017 14:02:37.810       180 00 [7] a0 79 0c ff fd 00 00     .y.....
13  10.2.2017 14:02:40.946       180 00 [7] a0 79 0c ff fd 00 00     .y.....
14  10.2.2017 14:02:42.929       480 00 [7] a1 00 fa 01 99 00 00     .......
15  10.2.2017 14:02:42.972       500 00 [7] 92 00 fa 01 99 00 93     .......
16  10.2.2017 14:02:44.942       480 00 [7] a1 00 fa 01 d6 00 00     .......
17  10.2.2017 14:02:44.960       480 00 [7] a1 00 16 00 00 00 00     .......
18  10.2.2017 14:02:44.977       480 00 [7] a1 00 fa 07 a8 00 00     .......
19  10.2.2017 14:02:44.996       480 00 [7] a0 00 fa 02 ca 00 ff     .......
20  10.2.2017 14:02:45.014       480 00 [7] a0 00 fa 09 17 00 00     .......
21  10.2.2017 14:02:45.031       480 00 [7] a1 00 fa 0a 36 00 00     ....6..
22  10.2.2017 14:02:45.049       480 00 [7] a1 00 fa 07 a8 00 00     .......
23  10.2.2017 14:02:45.174       500 00 [7] 92 00 fa 01 d6 01 c9     .......
24  10.2.2017 14:02:45.217       500 00 [7] 92 00 16 01 96 00 00     .......
25  10.2.2017 14:02:45.438       500 00 [7] 92 00 fa 07 a8 02 18     .......


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 13 Februar 2017, 18:56:30
Hallo ,
ich bekomme weder das mit dem totalscan als auch das importieren in die CS_Bruecke sowie die Verbindung zur Comfort Soft hin.

Wer kann mir weiterhelfen?


Gruß
Niwa
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 20 Februar 2017, 14:48:01
Hallo Niwa,

nach dem Log sind Deine IDs: 180, 480, 500, 601 und 602. Vermutlich sind 301 und 302 auch vorhanden. Was erhältst Du mit

./can_scan ttyACM0 680 180.000b

Anstelle von 180 kannst Du auch 480, 500 usw. einsetzen. Du solltest zu allen gültigen IDs einen Wert erhalten. Wenn der Wert = 8000 ist, dann gibt es zum Elster-Index 0199 (anstelle von 000b) einen gültigen Wert. Wenn Du nichts erhältst, dann würde mich die Ausgabe zu

./can_scan ttyACM0 680 180.000b trace

interessieren. Möglicherweise setzt der Raspi kein Telegramm ab.

Viele Grüsse
Jürg


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 20 Februar 2017, 18:10:45
Hallo Jürg,

Befehl 1 war leider erfolglos.

Folgende Ausgabe bekomme ich beim 2. Befehl:

./can_scan ttyACM0 680 180.000b trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] 31 00 fa 00 0b           1....
  0  20.2.2017 17:08:44.582       180 00 [7] d2 00 fa 00 0b 80 00     .......

send ComfortSoft: 0d00030100fa000b8008019e   can232: t68053100FA000B
recv ComfortSoft: 03000d0200fa000b80000197   can232: t1807D200FA000B8000

value: 8000  (GERAETE_ID  not available)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 21 Februar 2017, 14:24:20
Hallo Niwa,

das sieht schon mal nicht schlecht aus. Das heisst, Du kannst den Scan mit dem Zusatz "trace" machen. Die notwendigen Daten erhältst Du dann. Allerdings werden sehr viele Daten geliefert und wenn sie auf einem Flash-Speicher gespeichert werden, kann damit der Speicher zerschossen werden!

Befehl:

./can_scan ttyACM0 680 total trace

Wo der Fehler liegt, weiss ich momentan noch nicht. Ich werde aber versuchen, ihn zu finden.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 23 Februar 2017, 16:54:48
Hallo Jürg,

hab deinen Befehl eingegeben. Es kommen zw. 60 und 80 zeichen dann ist der Scan vorbei.

Es wird keine Datei geschrieben.

Gruß
Niwa
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 24 Februar 2017, 14:46:29
Hallo Niwa,

was genau kommt nach der Copyright-Zeile?

Nein, eine Datei wird nicht geschrieben. Dazu kann man z.B. die Ausgabe umlenken:

./can_scan ttyACM0 680 total trace >scan.inc

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: niwa83 am 24 Februar 2017, 15:25:26
Folgende Ausgabe habe ich bekommen

elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

scan on CAN-id: 680
list of valid can id's:

     680 00 [5] 01 00 fa 00 0b           .....
  0  24.2.2017 11:03:01.341       500 00 [7] 92 00 fa 01 d6 01 25     ......%
     680 00 [5] 01 01 fa 00 0b           .....
     680 00 [5] 01 01 fa 00 0b           .....
     680 00 [5] 01 01 fa 00 0b           .....
  5  24.2.2017 11:03:03.372       680 00 [5] 01 01 fa 00 0b           .....
     680 00 [5] 01 02 fa 00 0b           .....
  6  24.2.2017 11:03:03.379       680 00 [5] 01 02 fa 00 0b           .....
     680 00 [5] 01 03 fa 00 0b           .....
  7  24.2.2017 11:03:03.386       680 00 [5] 01 03 fa 00 0b           .....
     680 00 [5] 11 00 fa 00 0b           .....
  8  24.2.2017 11:03:03.391       680 00 [5] 11 00 fa 00 0b           .....
     680 00 [5] 11 01 fa 00 0b           .....
  9  24.2.2017 11:03:03.398       680 00 [5] 11 01 fa 00 0b           .....
     680 00 [5] 11 02 fa 00 0b           .....
10  24.2.2017 11:03:03.404       680 00 [5] 11 02 fa 00 0b           .....
     680 00 [5] 11 03 fa 00 0b           .....
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 25 Februar 2017, 13:43:56
Hallo Niwa,

es sieht so aus, als ob einzelne Befehle gehen, aber bei einer Befehls-Serie geht nichts. Wäre es denkbar, dass der Raspi den USBtin mit zu wenig Strom versorgt?

Viele Grüsse
Jürg

@all: Gibt es jemanden, der den Raspi 3 erfolgreich mit dem USBtin betreibt?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 01 März 2017, 13:46:47
Hallo zusammen,

ich wollte nun mein Gerät in FHEM anlegen mit

define WP Elster can0

hat nicht funktioniert. Modul konnte nicht geladen werden etc.


Dann habe ich versucht das Modul manuell zu laden.

reload 50_Elster.pm

Can't locate loadable object for module elster_perl in @INC (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl ./FHEM) at /usr/share/perl5/elster_perl.pm line 11.
Compilation failed in require at ./FHEM/50_Elster.pm line 60.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 60.


Ok. es haben sich wohl irgendwelche Verzeichnisse geändert da ich Perl5.20 auf einem aktuellen System habe ( mit FHEM 5.8 )
Alles klar. die beiden Daten elster_perl.pm und elster_perl.so /usr/lib/arm-linux-gnueabihf/perl/5.20.2 kopiert.



reload 50_Elster.pm
Can't load '/usr/lib/arm-linux-gnueabihf/perl/5.20/elster_perl.so' for module elster_perl: libperl.so.5.14: Kann die Shared-Object-Datei nicht öffnen: Datei oder Verzeichnis nicht gefunden at /usr/lib/arm-linux-gnueabihf/perl/5.20/DynaLoader.pm line 187.
at /usr/lib/arm-linux-gnueabihf/perl/5.20/elster_perl.pm line 11.
Compilation failed in require at ./FHEM/50_Elster.pm line 60.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 60.



Die Datei 'elster_perl.so' ist definitiv vorhanden,
weitere folgende Versuche mit reload 50_Elster.pm enden mit:

Attempt to reload elster_perl.pm aborted.
Compilation failed in require at ./FHEM/50_Elster.pm line 60.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 60.



in der Zeile 60 in der 50_Elster.pm steht

use elster_perl; # SWIG wrapper zu elster_perl.so (C++-Modul)

:o :o :o

Das Module "elster_perl.so " kann bei mir nicht geladen werden.
Weiß jemand Rat?

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 01 März 2017, 15:08:43
ich bin mir gerade nicht sicher ob vielleicht die Datei, "libperl.so.5.14" vermisst wird.
die habe ich nämlich so nicht gefunden sondern nur die Datei "libperl.so.5.20.2" ???

Wieso wird denn die Datei "libperl.so.5.14" gebraucht?
Wo kommt diese Abhängigkeit her? "libperl.so.5.20.2" habe ich gefunden.
Hat jemand ein aktuelles Jessie mit FHEM5.8 und dem Wrapper am laufen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 01 März 2017, 16:37:20
Habe mal noch swig installiert um die beiden Dateien
elster_perl.pm und elster_perl.so neu zu erzeugen leider ohne Erfolg:

sudo ./can_elster_perl.arm
elster_perl_wrap.cxx:743:20: fatal error: EXTERN.h: Datei oder Verzeichnis nicht gefunden
#include "EXTERN.h"
                    ^
compilation terminated.
elster_instance.cpp: In function 'void elster_instance::Undef()':
elster_instance.cpp:439:12: warning: deleting object of polymorphic class type 'KCanElster' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
     delete Can;
            ^


Wenn ich mir die Liste der Installierten Bibliotheken anschaue, erscheint libperl (mit falscher Version), aber keine "elster_perl"
sudo ldconfig -p | grep perl
        libperl.so.5.20 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libperl.so.5.20


:'( :'( :'(

Hat jemand eine Idee wie ich die beiden Dateien in ein aktuelles System integrieren kann um die WP auszulesen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 01 März 2017, 22:10:14
OK, bin einen Schritt weiter:

Die "falsche" perllib kommt aus meiner Builddatei weil das natürlich nicht angepasst wurde:
folgende Zeile musste an meinen neuen Gegebenheiten passen
CORE_PATH="/usr/lib/arm-linux-gnueabihf/perl/5.20.2/CORE"

Ein Linkerfehler besagte dann ständig, dass "lperl" nicht gefunden wurde.
nachstellen konnte ich das ganze mit

sudo ld -lperl --verbose

und tatsächlich, es ist ja auch libperl.so.5.20 vorhanden, anstelle libperl.so.
Also kurz einen Link anlegen mit:
sudo ln -s  /usr/lib/arm-linux-gnueabihf/libperl.so.5.20 /usr/lib/arm-linux-gnueabihf/libperl.so



Ok, eine paar Warnungen aber es hat geklappt:
sudo ./can_elster_perl.arm
In file included from elster_perl_wrap.cxx:745:0:
elster_perl_wrap.cxx: In function 'void boot_elster_perl(PerlInterpreter*, CV*)':
/usr/lib/arm-linux-gnueabihf/perl/5.20.2/CORE/XSUB.h:164:20: warning: unused variable 'items' [-Wunused-variable]
#define dITEMS I32 items = (I32)(SP - MARK)
                    ^
/usr/lib/arm-linux-gnueabihf/perl/5.20.2/CORE/XSUB.h:172:16: note: in expansion of macro 'dITEMS'
  dSP; dAXMARK; dITEMS
                ^
elster_perl_wrap.cxx:2505:3: note: in expansion of macro 'dXSARGS'
   dXSARGS;
   ^
elster_instance.cpp: In function 'void elster_instance::Undef()':
elster_instance.cpp:439:12: warning: deleting object of polymorphic class type 'KCanElster' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
     delete Can;
            ^
pi@rpi_can:~/can/20170301-can_progs/can_progs $


die beiden Dateien in "/usr/share/perl/5.20" kopieren.

shutdwn restart in fhem mit anschließend reload 50_Elster.pm und  ALLES GUT 8) 8) 8) 8)

nun noch define WP Elster can0
und siehe da ein neues Gerät ist da    ;D ;D ;D ;D

Und nun ????
Ist es bei euch auch so,  dass wenn ihr mit einem Klick auf den "get"-Knopf den Wert einer Variable abfragen wollt der Status auf disconnected umspringt?
Wie kann ich nun die Werte in FHEM mittracen???  Muss ich mich für jeden Wert neu connecten, oder ist in meinem Modul doch noch was faul?????

Readings err QUELLE_IST: value (01d4) not read 2017-03-01 22:20:11
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 02 März 2017, 11:52:16
Hallo Korre,

gratuliere zu Deinem Erfolg. Aber das mit dem Disconnect darf nicht sein. Ich werde es überprüfen.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 05 März 2017, 09:24:39
Hallo Jürg,
Hallo Kollegen,

ich habe mir die Sache nochmals in Ruhe angeschaut.

folgende Punkte:
1.)  beim Neustart des rpi muss ich die Can Schnittstelle konfigurieren und "up" bringen. (dazu habe ich nun ein kleines Script in der crontab @reboot)
          -Ist das auch bei euch so, bzw. ist das die normale Vorgehensweise?

2.) Elster zeigte sporadisch "disconnect" obwohl ich trotz disconnect Status Werte manuell (get Knopf) lesen kann.
          - bei Abfrage der gleichen Variablen (Readings)  hintereinander entstand das disconnect.
          - im Moment geht jedoch alles wie erwartet ( ein Abfragen der gleichen Variable im Sekundentakt funktioniert und connect bleibt erhalten).
          - hatte jemand ähnliches Verhalten?

3.) Werte aufzeichnen und in Logfile schreiben.
          - wird wohl am besten über ein notify oder at als "pull" -Abfrage umzusetzen sein?
          - Sollen dann alle gewünschten IDs (Readings) in einem notify seriell abgefragt werden?
          - schreibt ihr dann alle Readings in ein Logfile?
          - Wie habt ihr das gelöst?

Vielen Dank.



Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 05 März 2017, 13:48:38
Hallo Korre,

ich habe unter Windows mit einer Simulation das Modul 50_Elster getestet und Korrekturen vorgenommen. In "can_progs_20170305_test.zip" sind die Dateien dazu. Wenn Du mit dieser Version immer noch den "Disconnect" hast, werde ich es auch auf dem Raspi testen.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 06 März 2017, 16:34:33
Ich habe es mit dem Raspi getestet. Den Disconnect konnte ich mit der WP-Simulation (stiebel_simul) nicht feststellen.

stiebel_simul <==> CAN-Bus <= Raspi => fhem (50_Elster.pm)

Kleine Korrektur in can_progs_20170306_test.zip.

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: korreander12 am 06 März 2017, 21:02:05
Hallo Jürg,

anbei screenshots zu dem derzeitigen Verhalten.
Heute habe ich erst festgestellt, dass bei einem fhem Befehl bei der Eingabe in das Eingabefeld oben
zB  "get WP AUSSENTEMP" ein Popup Fenster erscheint. Das Modul möchte eigentlich was sagen  ......   aber Text fehlt.
Auch zu erkennen auf den Screenshots sind  Internals STATE "disconnected".

Muss ich nun nur die 50_ELSTER.PM Datei ersetzten oder alles bauen ???

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 07 März 2017, 06:39:44
Hallo Korre,

das Popup Fenster erhalte ich auch, allerdings bleibt es Connected. Mit einer falschen Anforderung z.B.

get WP aa

erscheint dasselbe Fenster, aber jetzt mit Inhalt. Bei

set WP MONAT 3

funktioniert es. Und bei

set WP MM 3

kommt eine andere Liste, als beim "get". Die Reihenfolge in den Listen verstehe ich nicht.

Die 50_Elster.pm bleibt unverändert. Ersetzen solltest Du elster_perl.so und elster_perl_pm.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 23 Juni 2017, 10:07:27
Erstmal hut ab, was für ein "hirnschmalz" und Aufwand da inzwischen in die CANBUS Kromschröder Abfrage gesteckt wurde!

Ich mache mich nach langer Zeit mal wieder an die Canbus Steuerung meiner WPL13 mit dem WPM2.
Canbus Raspi Interface mit Abschlusswiderstand + FEK Fernbedienung vorhanden.

Kurze Frage, da ich seit kurzem eine Photovoltaikanlage habe.

Ich möchte:
- die Kühlung -sofern genügend PV Strom vorhanden ist- ein und ausschalten können.
(Kuehlung EIN, Flaeche EIN)
- die WW Bereitung einschalten wenn genügend PV Strom vorhanden ist

(Die Logik mit der PV Strom Prüfung habe ich anderweitig bereits (IP-Symcon Modbus))

Ich habe parallel noch einen Windows 7 Mini PC im Heizraum.

Wie komme ich am einfachsten an diese Anforderung?

- Auf dem Windows PC die Kromschröder Software (liegt mir vor) installieren
- RASPI Canbus Interface über einen Virtuellen Comport mounten
- CSBRUECKE.EXE starten
- Kromschröder Comfortsoft starten und Änderung vornehmen
Die gemachten Änderungen werden angezeigt/mitgeschnitten?

Das könnte ich dann für die normale Ansteuerung direkt über RASPI verwenden?

P.S.
Ich denke das müsste lt. ElsterTable.inc hier zu suchen sein:
{ "KUEHLMODE"                                     , 0x0287, 0}, Wahrscheinlich Kühlung AUS/EIN
{ "FLAECHENKUEHLUNG"                        , 0x025f, 0}, Wahrscheinlich FBH Kühlung AUS/EIN
{ "KUEHL_FREIGABE_TEMPERATUR"        , 0x03dd, 0}, Wahrscheinlich gewünschte Raumptemperatur

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 24 Juni 2017, 20:32:35
anbei ein 24h log... nicht am datum/Uhrzeit stören... der raspi war noch unkonfiguriert...
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 25 Juni 2017, 09:49:33
Hallo Mastermind,

ich schlagen dir vor, alle Anforderungen auf dem Windows-PC zu realisieren. Beim WW kann man die Solltemperatur entsprechend anpassen. Dabei sollte man beachten, dass nicht allzu oft geändert wird, da die Solltemp. vermutlich in einem Flash-Speicher hinterlegt wird!

Wie für Perl, gibt es auch für PHP (IP-Symcon) die Möglichkeit, einen "SWIG-Wrapper" zu bilden. Ich habe dies gemacht. Leider kann ich den Wrapper nicht für Windows generieren. Dazu benötigt man Visual-Studio, das ich nicht besitze. Aber für den MAC funktioniert der Wrapper. Hast du Visual-Studio?

Wenn ich zu deinen simulierten Daten mit ComfortSoft die Kühlung einschalte, dann entspricht das den Kommandos:

./can_scan can0 680 180.0613.0002           LUEFT_STUFE_HAND = 2
./can_scan can0 680 180.0287.0001           KUEHL_MODE = 1

Kommandos beim Abschalten:

./can_scan can0 680 180.0613.0000
./can_scan can0 680 180.0287.8000

Viele Grüsse
Jürg

P.S.: Der Anhang wurde aus deinem totalscan1 generiert und kann in 50_Elster.pm eingesetzt werden.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 29 Juni 2017, 22:51:59
Zitat von: juerg5524 am 25 Juni 2017, 09:49:33
Hallo Mastermind,

ich schlagen dir vor, alle Anforderungen auf dem Windows-PC zu realisieren. Beim WW kann man die Solltemperatur entsprechend anpassen. Dabei sollte man beachten, dass nicht allzu oft geändert wird, da die Solltemp. vermutlich in einem Flash-Speicher hinterlegt wird!

Wie für Perl, gibt es auch für PHP (IP-Symcon) die Möglichkeit, einen "SWIG-Wrapper" zu bilden. Ich habe dies gemacht. Leider kann ich den Wrapper nicht für Windows generieren. Dazu benötigt man Visual-Studio, das ich nicht besitze. Aber für den MAC funktioniert der Wrapper. Hast du Visual-Studio?

Wenn ich zu deinen simulierten Daten mit ComfortSoft die Kühlung einschalte, dann entspricht das den Kommandos:

./can_scan can0 680 180.0613.0002           LUEFT_STUFE_HAND = 2
./can_scan can0 680 180.0287.0001           KUEHL_MODE = 1

Kommandos beim Abschalten:

./can_scan can0 680 180.0613.0000
./can_scan can0 680 180.0287.8000

Viele Grüsse
Jürg

P.S.: Der Anhang wurde aus deinem totalscan1 generiert und kann in 50_Elster.pm eingesetzt werden.
Danke für die Info.

Sorry für die späte Antwort. Hab keine Benachrichtigung erhalten...

Ich habe zusätzlich einen Mini PC 24*7 mit win 10. Dann muss ich mir noch anschauen, wie ich das canbus Modul vom Raspberry virtuell in das Windows einbinden kann, damit die kromschröder(stiebel) Software zufrieden ist.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 06 Juli 2017, 22:18:43
Zitat von: juerg5524 am 25 Juni 2017, 09:49:33
Hallo Mastermind,

ich schlagen dir vor, alle Anforderungen auf dem Windows-PC zu realisieren. Beim WW kann man die Solltemperatur entsprechend anpassen. Dabei sollte man beachten, dass nicht allzu oft geändert wird, da die Solltemp. vermutlich in einem Flash-Speicher hinterlegt wird!

Wie für Perl, gibt es auch für PHP (IP-Symcon) die Möglichkeit, einen "SWIG-Wrapper" zu bilden. Ich habe dies gemacht. Leider kann ich den Wrapper nicht für Windows generieren. Dazu benötigt man Visual-Studio, das ich nicht besitze. Aber für den MAC funktioniert der Wrapper. Hast du Visual-Studio?

Wenn ich zu deinen simulierten Daten mit ComfortSoft die Kühlung einschalte, dann entspricht das den Kommandos:

./can_scan can0 680 180.0613.0002           LUEFT_STUFE_HAND = 2
./can_scan can0 680 180.0287.0001           KUEHL_MODE = 1

Kommandos beim Abschalten:

./can_scan can0 680 180.0613.0000
./can_scan can0 680 180.0287.8000

Viele Grüsse
Jürg

P.S.: Der Anhang wurde aus deinem totalscan1 generiert und kann in 50_Elster.pm eingesetzt werden.


danke nochmals.
Zur Aktivierung der kühlung wird zusätzlich noch die Info gesetzt über welches Medium gekühlt werden kann.
Beim mir Fussbodenheizung (=FLAECHE EIN)

So lässt sich die Kühlung mit FBH bei mir aktivieren:

sudo ./can_scan can0 680 180.0287.0001           KUEHL_MODE = 1
sudo ./can_scan can0 680 180.0613.0002           LUEFT_STUFE_HAND = 2
???????sudo ./can_scan can0 680 180.025f.0100            FLAECHE EIN (256) ??????

FLAECHE EIN bereitet mir noch Probleme. wenn ich dies über den WPManager händisch mache, ist später per abfrage:
./can_scan can0 680 180.025f
Ergebnis:
0100 (256)

wie kann ich den wert per can_scan setzen? es kommt "VALUE NOT SET"

Die Reihenfolge der Kommandos habe ich auch noch gedreht, da man am WPM2 selbst auch erst die KUEHLUNG auf ein schalten muss, und dann die Parameter definiert.

Die Temperatur fürs kühlen definiert man dann bei bedarf
680 180.0261.xxxx  Kuehl Solltemperatur
xxxx (22 Grad = 00dc / 21 Grad = 00d2 / 20 Grad = 00c8)

hilft vielleicht manch anderem

Ich möchte die Kuehlung einschalten per Schalter in meiner Heimautomation - wenn genug PV Strom vom Dach kommt - :-)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 08 Juli 2017, 14:36:44
Hallo Mastermind,

hat ComfortSoft mit dem Setzen von "Fläche ein" auch Probleme?

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Radiator am 10 August 2017, 11:40:03
Lang nicht mehr reingeschaut...
... zu dem Post https://forum.fhem.de/index.php/topic,42248.msg593543.html#msg593543 habe ich dieselbe Beobachtung. Anscheinend sind die Buffer des USBTin zu klein. Immer wenn ich Daten schnell hintereinander abgefordert hatte, waren einige Antworten "verschwunden". Ab ca. 5 schnell hintereinander gesendeten Befehlen verschwanden Antworten. Einzelabfragen gingen immer einwandfrei. Ob das am Sende, oder Empfangsbuffer liegt - keine Ahnung. Ich habe daher in meinem Modul einen zusätzlichen Sendebuffer eingebaut. Seitdem funktioniert der USBTin wunderbar. Zusätzlich habe ich eine Bandbreitenbegrenzung realisiert, so daß ich nie mehr als 20% der CAN Buskapazität der Wärmepumpe benutze, ich will ja nicht den Bus blockieren und eine Störung in der Wärmepumpe verursachen. Seitdem habe ich keine verlorenen Werte mehr.

Zusätzlich habe ich die Register des USBTin so programmiert, dass nur Antworten direkt an mich durchgereicht werden. Das senkt die Rechnelast für fhem.
Letzte Version : https://forum.fhem.de/index.php/topic,35614.msg450042.html#msg450042

Gruß
Hartmut
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 29 August 2017, 08:36:49
Das mit dem "Puffer" konnte ich mit meinem Canberry ebenfalls feststellen...

ich schalte ja bisher nur die Kühlung ein/aus.

Ich mach in meiner Bash Routine einfach ne kurze Pause zwischen den Befehlen rein...

Und was mein Problem angeht zum einschalten der Kühlung...
So funktioniert das Aktivieren der Kühlung:
------------------------------------------------------------------
sudo ./can_scan can0 680 180.0287.0001           KUEHL_MODE = 1
sudo ./can_scan can0 680 180.0613.0002           LUEFT_STUFE_HAND = 2
sudo ./can_scan can0 680 180.025f.0100            FLAECHE EIN
sudo ./can_scan can0 680 180.0287.0001           KUEHL_MODE = 1
----------------------------------------------------------------
Ich setze Kühlung ein einfach zweimal, dann passts....

Kühlung aus:
./can_scan can0 680 180.0613.0000
./can_scan can0 680 180.0287.8000
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 28 September 2017, 10:10:44
Ich bin derzeit dran mein IP-SYMCON mit Canbus Daten zu füttern (ich hoffe das darf man hier schreiben)  ;D

Laut ElsterTable.inc gibt es ja die Wärmesummenmessung der WPM Steuerung (am Display des WPMW2 kann man die erzeugte Wärme für WW und Heizung ablesen).
Nun möchte ich das per Canbus machen.
Leider kommt bei allen Wärmesummenwerten

Value: 8000 (...... not available)

Hier laut Liste:

{ "WAERMEERTRAG_WW_TAG_WH"                           , 0x092a, 0},
{ "WAERMEERTRAG_WW_TAG_KWH"                          , 0x092b, et_double_val},
{ "WAERMEERTRAG_WW_SUM_KWH"                          , 0x092c, 0},
{ "WAERMEERTRAG_WW_SUM_MWH"                          , 0x092d, et_double_val},
{ "WAERMEERTRAG_HEIZ_TAG_WH"                         , 0x092e, 0},
{ "WAERMEERTRAG_HEIZ_TAG_KWH"                        , 0x092f, et_double_val},
{ "WAERMEERTRAG_HEIZ_SUM_KWH"                        , 0x0930, 0},
{ "WAERMEERTRAG_HEIZ_SUM_MWH"                        , 0x0931,}


Abruf ganz einfach per
./can_scan can0 680 180.0930
./can_scan can0 680 180.0931
./can_scan can0 680 180.092d

Beim allgemeinen Scan werden die Daten ebenfalls nicht "verarbeitet"
./can_scan can0 680 180

Gibt's das inzwischen? Evtl. ist meine can_scan Bibliothek auf meinem Raspi ja veraltet?
.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 29 September 2017, 15:56:45
Zitat von: Mastermind1 am 28 September 2017, 10:10:44
Ich bin derzeit dran mein IP-SYMCON mit Canbus Daten zu füttern (ich hoffe das darf man hier schreiben)  ;D

Laut ElsterTable.inc gibt es ja die Wärmesummenmessung der WPM Steuerung (am Display des WPMW2 kann man die erzeugte Wärme für WW und Heizung ablesen).
Nun möchte ich das per Canbus machen.
Leider kommt bei allen Wärmesummenwerten

Value: 8000 (...... not available)

Hier laut Liste:

{ "WAERMEERTRAG_WW_TAG_WH"                           , 0x092a, 0},
{ "WAERMEERTRAG_WW_TAG_KWH"                          , 0x092b, et_double_val},
{ "WAERMEERTRAG_WW_SUM_KWH"                          , 0x092c, 0},
{ "WAERMEERTRAG_WW_SUM_MWH"                          , 0x092d, et_double_val},
{ "WAERMEERTRAG_HEIZ_TAG_WH"                         , 0x092e, 0},
{ "WAERMEERTRAG_HEIZ_TAG_KWH"                        , 0x092f, et_double_val},
{ "WAERMEERTRAG_HEIZ_SUM_KWH"                        , 0x0930, 0},
{ "WAERMEERTRAG_HEIZ_SUM_MWH"                        , 0x0931,}


Abruf ganz einfach per
./can_scan can0 680 180.0930
./can_scan can0 680 180.0931
./can_scan can0 680 180.092d

Beim allgemeinen Scan werden die Daten ebenfalls nicht "verarbeitet"
./can_scan can0 680 180

Gibt's das inzwischen? Evtl. ist meine can_scan Bibliothek auf meinem Raspi ja veraltet?
.
Die neueste Bibliothek von Febr. bringt leider dieselbe Antwort..

Wie kann man eigentlich mitsniffen wenn ich die erzeugte Wärmemenge am wpmw2 Abrufe? Das könnte ich ja evtl. Mitlesen, und daraus die richtige abfrage ableiten?

Gesendet von meinem Redmi Note 2 mit Tapatalk

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 Oktober 2017, 10:49:48
Hallo Mastermind,

"mitsniffen" kannst du, indem du in einer weiteren Bash

./can_logger can0 0

laufen lässt. Die Kommunikation von can_scan wird dir mit dem Zusatz "trace" angezeigt:

./can_scan can0 680 180.092d trace

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 06 Oktober 2017, 07:43:16
Mit dem Trace wird ausgespuckt :-) :
Muss ich zusätzlich mal an sniffer testen, bei der Bedienung am Wärmepumpenmanager....

pi@raspberrypi ~/can_progs_neu $ ./can_scan can0 680 180.0930 trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] 31 00 fa 09 30           1...0
  0  6.10.2017 05:28:34.160       680 00 [5] 31 00 fa 09 30           1...0
  1  6.10.2017 05:28:34.175       180 00 [7] d2 00 fa 09 30 80 00     ....0..

send ComfortSoft: 0d00030100fa0930800801cc   can232: t68053100FA0930
recv ComfortSoft: 03000d0200fa0930800001c5   can232: t1807D200FA09308000

value: 8000  (WAERMEERTRAG_HEIZ_SUM_KWH  not available)



oder
pi@raspberrypi ~/can_progs_neu $ ./can_scan can0 680 180.092d trace
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

     680 00 [5] 31 00 fa 09 2d           1...-
  0  6.10.2017 05:27:41.678       680 00 [5] 31 00 fa 09 2d           1...-
  1  6.10.2017 05:27:41.690       180 00 [7] d2 00 fa 09 2d 80 00     ....-..

send ComfortSoft: 0d00030100fa092d800801c9   can232: t68053100FA092D
recv ComfortSoft: 03000d0200fa092d800001c2   can232: t1807D200FA092D8000

value: 8000  (WAERMEERTRAG_WW_SUM_MWH  not available)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 30 Oktober 2017, 14:51:47
Ich antworte mir mal selbst:-) Vielleicht für andere interessant...

Um die Wärmemenge (meiner Luft-WP SE WPL13 cool) abfrage 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...
keine Ahnung...

Nun kann ich endlich vollautomatisch "die schlechte JAZ" ausrechnen... Zumindest der Gang in den Keller kann ich mir sparen :-)



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"


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 05 November 2017, 14:17:12
Zitat von: juerg5524 am 07 März 2017, 06:39:44

Die 50_Elster.pm bleibt unverändert. Ersetzen solltest Du elster_perl.so und elster_perl_pm.

Viele Grüsse
Jürg

Hallo Jürg,

erstmal danke für deine Mühe. Ich habe auch ein CAN BUS modul am Raspberry und nun mit Hilfe der Hinweise von Knorre das Elster device im FHEM zum Laufen gebracht. Leider habe ich auch diesen disconnect state wie Knorre.
Ich habe die letzte http://juerg5524.ch/data/can_progs_20170715_test.zip heruntergeladen und die beiden Datei ausgetauscht. Leider bekomme ich nun gar keine Werte mehr in FHEM angezeigt. Nur ???? bei get AUSSENTEMPERATUR.

Wenn ich die Dateien aus dieser Version verwende http://juerg5524.ch/data/can_progs_20170125.zip
muss ich die beiden
elster_perl.so
elster_perl.pm
zwar nach der Anleitung von Knorre erneut übersetzen, aber ich sehe Werte im FHEM und kann auch Werte in der WPL 13 ändern. Scheinbar hast du bei den letzten Änderungen etwas verstellt.

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 06 November 2017, 14:07:30
Hallo Frank,

ich habe die Zwischenversion can_progs_20170305_test.zip auf juerg5524.ch gestellt. Wäre es dir vielleicht möglich zu prüfen, ob diese Version bereits fehlerhaft ist? Ich wäre dir dankbar.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 10 November 2017, 08:15:45
Zitat von: juerg5524 am 06 November 2017, 14:07:30
Hallo Frank,

ich habe die Zwischenversion can_progs_20170305_test.zip auf juerg5524.ch gestellt. Wäre es dir vielleicht möglich zu prüfen, ob diese Version bereits fehlerhaft ist? Ich wäre dir dankbar.

Viele Grüsse
Jürg

Hallo Jürg,

ich hatte erst jetzt Zeit das auszutesten. Leider funktioniert diese Version can_progs_20170305_test.zip auch nicht. Ich habe Jessie auf dem Raspberry laufen mit Perl 5.20.2 und musste die can_elster_perl.arm etwas anpassen.


swig -perl5 -module elster_perl -c++ elster_perl.i

#CORE_PATH="/usr/lib/perl/5.14/CORE"
[color=red]CORE_PATH="/usr/lib/arm-linux-gnueabihf/perl/5.20.2/CORE"
[/color]

${CROSS_COMPILE}g++ -shared -Wall -D__LINUX__ -D__ARM__ -D__CONSOLE__ -D__CAN__ -DSWIG -I${CORE_PATH} \
  -lc -lpthread -ldl -lperl \
  elster_perl.cpp elster_perl_wrap.cxx elster_instance.cpp \
  KIpSocket.cpp KThread.cpp KCriticalSection.cpp KCanDriver.cpp KComm.cpp KRPiCanDriver.cpp \
  KCanCommDriver.cpp KCanServer.cpp KStream.cpp NUtils.cpp NCanUtils.cpp KElsterTable.cpp KScanTable.cpp KCanElster.cpp \
  KCanTcpDriver.cpp KTcpClient.cpp [color=red]KSniffedFrame.cpp[/color] \
  -o elster_perl.so

# sudo cp elster_perl.so /usr/lib/perl/5.14.2
# sudo cp elster_perl.pm /usr/lib/perl/5.14.2
# sudo cp 50_Elster.pm /opt/fhem/FHEM

# sudo /etc/init.d/fhem start



KSniffedFrame.cpp hat in deiner Version gefehlt, sonst startet FHEM nicht.


perl: symbol lookup error: /usr/lib/arm-linux-gnueabihf/perl/5.20/elster_perl.so: undefined symbol: _ZN12KSniffedDataC1Ev


Der disconnect state und die Fragezeichen bei get Aussentemp sind aber auch schon in der März Version.

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 10 November 2017, 13:08:44
Hallo Frank,

danke für deine Tests. Ich werde es genauer anschauen. Das kann allerdings etwas dauern.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 27 November 2017, 15:51:24
Eine Frage in die Runde, hat sich schon jemand an das Auslesen und interpretieren des aktuellen Betriebsstatus gemacht?
Ich hab dazu per scan auf 680 180 folgende Dinge gefunden die auf "STATUS" schliessen lassen..

0059  -> Heizkreisstatus
0176  -> Betriebsstatus
01d2  -> Pumpenstatus
fdad   -> WP Pumpenstatus
005a  -> Speicherstatus
0063 -> Kesselstatus

Wenn die WP läuft und meiner Meinung nach WW macht, dann steht bei 680 180.0176 Betriebsstatus (65) drin.

Hat jemand eine Deutung der Statusangaben?

Interessieren würde mich:
- heizen
- Warmwasser
- Abtauen
- nur Heizkreispumpe


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 23 Dezember 2017, 15:44:28
Hallo,

ich versuche mich derzeit an der Einbindung meiner SE WPC 7cool (mit WPM3) in FHEM auf meinem Rispberry. Vielen Dank erstmal für euer Engagement und Eure umfangreichen Vorleistungen zu diesem Thema.

Ich habe PiCan-Schaltung mit galvanischer Trennung von Jürg nachgebaut, angeschlossen und nach der PiCan-Anleitung ins Linux eingebunden.
Übrigens in Jürg's Schaltbild PiCan.sch hat sich der Fehlerteufel eingeschlichen. Der Widerstand R8 darf nicht an Pin 5 des MCP2551 sondern muss an Pin 8. Danach hat es auch bei mir geklappt.

Dein ,,can_scan" funktioniert soweit einwandfrei und ich bekomme Daten zurück. Die ,,50_Elster.pm" habe ich entsprechend angepasst und die ,,elster_perl.pm" und ,,elster_perl.so" neu kompiliert und in das Verzeichnis (bei mir) ,,/usr/lib/arm-linux-gnueabihf/perl/5.24/" kopiert.
Nach dem Define-Befehl in FHEM hab ich jetzt die selben Probleme mit disconnect. Bekomme aber mit jedem get-Befehl aktuellere Werte gelesen.

Wie habt Ihr das jetzt mit dem Bufferüberlauf bzw. Begrenzung der Buslast gelöst, und wie bekomme ich die Werte bei Veränderung auf eine Variable geschrieben, damit ich Sie an meine SPS weiterleiten kann.

Ich bin sowohl Linux- als aus FHEM-Anfänger

Danke schon mal und viele Grüße.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 02 Januar 2018, 23:27:15
Mein Industrialcanberry Interface  (auf meinem Raspi Pi Model B) funktioniert nicht mehr (LED leuchtet nicht mehr.. - defekt)...

Kurze Frage: Welche Canbus Interfaces kann man mit einem Raspi Pi Modell B empfehlen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 12 Januar 2018, 16:20:03
Hallo Jürg,

ich hab deine 50_Elster.pm so halbwegs erfolgreich bei mir eingebunden. Allerdings läuft die Geschichte noch etwas instabil. Ich habe auch den Eindruck das die Buslast, bzw Rechenkapazität ziemlich ausgelastet wird. Die Werte werden nicht automatisch aktualisiert. Immer wenn ich jedoch den "get" befehl für einen Wert ausführe, werden gleich mehrere Werte (aber immer andere) aktualisiert. Mein Hauptproblem allerdings ist derzeit die Logdatei. Diese wird bei jedem "get" Befehl mir u.g. Daten zugemüllt, obwohl scheinbar ja nur ein Wert abgefragt wird . Selbst mit "Verbose=0" kann ich das Loggen nicht verhindern.  Da ich den "get" Befehl aller Minute zur Aktualisierung ausführen will, wird meine LOG-Datei rießig und gut für de SD-Card ist das sicher auch nicht.

Kannst du mir helfen, wie ich erstmal das mitloggen deaktivieren oder eingrenzen kann, und wo ich evt. das Zeitinterval für die autom. Aktualisierung einstellen kann.

Außerdem liest er nicht immer korrekte Werte ein. Beim "SAMMEL_RELAISSTATUS" liest er manchmal eine Dezimalzahl "4.1" oder "44.1" aus und manchmal wie benötigt eine ganze Zahl "364".

Wäre schön wenn du mir dabei helfen kannst.

Danke Markus.

Hier ein kurzer Ausschnitt des Logging:

1345900  13.1.2018 10:39:36.927       180 00 [7] 60 79 5a 02 00 00 00     `yZ....
1345903  13.1.2018 10:39:36.953       180 00 [7] 60 79 fa 0a 20 00 00     `y.. ..
1345935  13.1.2018 10:39:38.819       180 00 [7] 22 00 0c 00 0e 00 00     "......
1345964  13.1.2018 10:39:40.731       180 00 [7] d2 00 fa 01 01 00 00     .......
1345969  13.1.2018 10:39:40.862       180 00 [7] d2 00 fa 02 7e 00 00     ....~..
1345996  13.1.2018 10:39:41.948       180 00 [7] 22 00 0e 01 dd 00 00     "......
1346003  13.1.2018 10:39:42.559       180 00 [7] 22 00 16 01 13 00 00     "......
     680 00 [5] 31 00 fa 0a 20           1...
1346056  13.1.2018 10:39:46.302       680 00 [5] 31 00 fa 0a 20           1...
1346057  13.1.2018 10:39:46.312       680 00 [7] 61 02 fa 14 61 00 00     a...a..
get sniffed: 180 000e 47.7
get sniffed: 180 07fc 0.472
get sniffed: 180 0802 73
get sniffed: 180 000c 1.4
get sniffed: 180 0016 27.5
get sniffed: 180 01d4 18.1
get sniffed: 180 0a20 0
1346058  13.1.2018 10:39:46.320       180 00 [7] d2 00 fa 0a 20 00 00     .... ..
1346120  13.1.2018 10:39:49.385       180 00 [7] 22 00 0c 00 0e 00 00     "......
1346170  13.1.2018 10:39:51.918       180 00 [7] 22 00 0e 01 dd 00 00     "......
1346192  13.1.2018 10:39:53.114       180 00 [7] 22 00 16 01 13 00 00     "......
     680 00 [5] 31 00 fa 00 0c           1....
1346217  13.1.2018 10:39:54.557       680 00 [5] 31 00 fa 00 0c           1....
1346218  13.1.2018 10:39:54.572       180 00 [7] d2 00 fa 00 0c 00 0e     .......
1346323  13.1.2018 10:39:59.939       180 00 [7] 22 00 0c 00 0e 00 00     "......
     680 00 [5] 31 00 fa 0a 20           1...
1346352  13.1.2018 10:40:01.620       680 00 [5] 31 00 fa 0a 20           1...
1346353  13.1.2018 10:40:01.635       180 00 [7] d2 00 fa 0a 20 00 00     .... ..
1346371  13.1.2018 10:40:01.911       180 00 [7] 22 00 0e 01 dd 00 00     "......
1346393  13.1.2018 10:40:03.040       180 00 [7] 22 00 16 01 13 00 00     "......
1346411  13.1.2018 10:40:03.832       180 00 [7] 60 79 0c 00 0e 00 00     `y.....
1346412  13.1.2018 10:40:03.838       180 00 [7] 60 79 16 01 13 00 00     `y.....
1346413  13.1.2018 10:40:03.846       180 00 [7] 60 79 0e 01 dd 00 00     `y.....
1346415  13.1.2018 10:40:03.864       180 00 [7] 60 79 53 00 00 00 00     `yS....
1346417  13.1.2018 10:40:03.879       180 00 [7] 60 79 5a 02 00 00 00     `yZ....
1346420  13.1.2018 10:40:03.905       180 00 [7] 60 79 fa 0a 20 00 00     `y.. ..
     680 00 [5] 31 00 fa 0a 20           1...
1346439  13.1.2018 10:40:05.044       180 00 [7] d2 00 fa 0b 76 00 00     ....v..
1346440  13.1.2018 10:40:05.060       680 00 [5] 31 00 fa 0a 20           1...
1346441  13.1.2018 10:40:05.078       180 00 [7] d2 00 fa 0a 20 00 00     .... ..
     680 00 [5] 31 00 fa 0a 20           1...
1346523  13.1.2018 10:40:09.609       680 00 [5] 31 00 fa 0a 20           1...
1346524  13.1.2018 10:40:09.624       180 00 [7] d2 00 fa 0a 20 00 00     .... ..
1346530  13.1.2018 10:40:09.890       180 00 [7] 22 00 0c 00 0d 00 00     "......
1346581  13.1.2018 10:40:12.353       180 00 [7] 22 00 0e 01 dd 00 00     "......
1346592  13.1.2018 10:40:12.976       180 00 [7] 22 00 16 01 13 00
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 14 Januar 2018, 14:08:52
Hallo Markus

Ich habe einige Fehler korrigiert, getestet habe ich nur in einem Simulationsaufbau (can_progs_20180114.zip). Bitte nimm auch das neue 50_Elster.pm aus dem Verzeichnis fhem.

Setze in 50_Elster.pm (Zeile 73) "my $trace_all = 0;".

Die Zeile 523 mit "elster_perl::toggle_trace();" solltest du löschen.

Ich bin gespannt, ob damit deine Fehler verschwinden.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 15 Januar 2018, 10:14:14
Hallo Jürg,

danke erstmal für die schnelle Antwort. Hab die neuen Dateien eingespielt und siehe da, die Loggerei hat ein Ende. Prima  ;D
Eine automatische Aktualisierung erfolgt immer noch nicht, ist das OK so?

Wofür ist eigentlich "elster_perl::toggle_trace();" da?

Mir ist aufgefallen das anstelle der Errors beim auslesen jetzt "?" angezeigt werden. Das kann ich sicher programmtechnisch noch rausfiltern (bei ungültigen Empfang das Reading max. 5 mal wiederholen). Aber ist das normal, das die Fehllesung so häufig kommt? Hat jemand auch die Probleme? Ich hab dir mal mein Log angehängt.

2018.01.15 17:29:51 3: getstring(680 180 000c): 3.4
2018.01.15 17:30:26 3: getstring(680 180 0a20): ?
2018.01.15 17:30:36 3: getstring(680 180 0a20): ?
2018.01.15 17:30:41 3: getstring(680 180 0a20): ?
2018.01.15 17:30:43 3: getstring(680 180 0a20): ?
2018.01.15 17:30:44 3: getstring(680 180 0a20): 348
2018.01.15 17:33:07 3: getstring(680 480 fdac): ?
2018.01.15 17:33:12 3: getstring(680 480 fdac): ?
2018.01.15 17:33:14 3: getstring(680 480 fdac): 0
2018.01.15 17:33:26 3: getstring(680 480 0921): 0.732
2018.01.15 17:33:32 3: getstring(680 180 091d): 0.929
2018.01.15 17:33:35 3: getstring(680 180 0101): 0
2018.01.15 17:33:38 3: getstring(680 180 000c): 3.2
2018.01.15 17:33:42 3: getstring(680 180 0001): ?
2018.01.15 17:33:45 3: getstring(680 180 0001): ?
2018.01.15 17:33:47 3: getstring(680 180 0001): 0
2018.01.15 17:33:57 3: getstring(680 180 0053): ?
2018.01.15 17:34:00 3: getstring(680 180 0053): 256
2018.01.15 17:34:04 3: getstring(680 180 0287): ?
2018.01.15 17:34:08 3: getstring(680 180 0287): ?
2018.01.15 17:34:09 3: getstring(680 180 0287): ?
2018.01.15 17:34:10 3: getstring(680 180 0287): 0
2018.01.15 17:34:16 3: getstring(680 180 0805): ?
2018.01.15 17:34:18 3: getstring(680 180 0805): 0
2018.01.15 17:34:23 3: getstring(680 180 07fc): ?
2018.01.15 17:34:24 3: getstring(680 180 07fc): 0.493
2018.01.15 17:34:34 3: getstring(680 180 0802): ?
2018.01.15 17:34:36 3: getstring(680 180 0802): 75
2018.01.15 17:34:40 3: getstring(680 180 07ff): 0.000
2018.01.15 17:34:48 3: getstring(680 180 0112): Automatik
2018.01.15 17:34:53 3: getstring(680 180 0058): 2
2018.01.15 17:35:00 3: getstring(680 180 01d4): 3.6
2018.01.15 17:35:06 3: getstring(680 180 0016): ?
2018.01.15 17:35:07 3: getstring(680 180 0016): ?
2018.01.15 17:35:10 3: getstring(680 180 0016): ?
2018.01.15 17:35:14 3: getstring(680 180 0016): 26.7
2018.01.15 17:35:19 3: getstring(680 180 0a20): ?
2018.01.15 17:35:25 3: getstring(680 180 0a20): ?
2018.01.15 17:35:27 3: getstring(680 180 0a20): 348
2018.01.15 17:35:31 3: getstring(680 180 000e): ?
2018.01.15 17:35:33 3: getstring(680 180 000e): 45.8
2018.01.15 17:35:37 3: getstring(680 180 005a): 2
2018.01.15 17:35:42 3: getstring(680 180 0931): 3.836
2018.01.15 17:35:47 3: getstring(680 180 092d): 3.187
2018.01.15 17:35:52 3: getstring(680 180 01d6): 50.7
2018.01.15 17:36:04 3: getstring(680 480 fdac): 0
2018.01.15 17:36:08 3: getstring(680 180 027e): off


Danke Gruß Markus
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 16 Januar 2018, 07:33:29
Hallo,

habe festgestellt, das bei "can_scan" ebenfalls mal Werte gelesen werden und dann mal wieder nicht. Nutzt du die selben Proceduren in FHEM wie auch bei "can_scan" oder liegt das vielleicht doch an meiner Hardware?

Gruß Markus
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 26 Januar 2018, 14:38:37
Hallo Jürg,

hab mich wegen der automatischen Aktualisierung nochmal mit der "Elster_Read" beschäftigt. Ich habe das Problem, das diese nicht automatisch aufgerufen wird, wenn was im Emfangsbuffer "gesnifft" wird. Dazu habe ich in der "Elster_Define" unten die beiden Zeilen aktiviert.
 
$hash->{FD} = 8;
$selectlist{"$name.$dev"} = $hash;


ebenfalls habe ich in der "Elster_Undef" die folgenden Zeilen eingefügt.


my $dev = $hash->{DeviceName};
my $name = $hash->{NAME};

delete($selectlist{"$name.$dev"});
delete($hash->{FD});


Die "Elster_Read" wird nach einem RELOAD immer noch nicht ausgeführt. Ich vermute das die Übergabe des "$hash->{FD} = 8;" noch fehlerhabt ist. Laut meinen recherschen müsste dort eigentlich


$hash->{FD}=fileno($port);


angegeben werdn. Wie komme ich nun an die "Schnittstellennummer"? Was muß ich jetzt hier angeben. Ich nutze SocketCan "can0". Kannst du mir hier weiterhelfen?

Dankeschön.
Gruß Markus.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 29 Januar 2018, 17:13:10
Hallo Markus,

ja, can_scan und meine FHEM-Anbindung verwenden dieselben Prozeduren. Es sollte also zuerst mit can_scan zum Laufen gebracht werden. Verwende vielleicht auch eine ältere can_scan Version.

Was die auskommentierten Stellen machen sollten, das weiss ich nicht mehr. Vielleicht kann dir jemand vom Forum weiterhelfen. Ich bin kein guter Perl-Programmierer. Meine Stärken liegen bei Delphi und C++. Das ist auch der Grund, dass ich das "elster_perl"-Modul in C++ zur Verfügung gestellt habe.

"can0" wird in elster_perl geöffnet. can0 ist der Default-Wert. Für can1 müsste man

elster::perl::setdev("can1");

aufrufen. Mit "toggle_trace" wird das Tracing umgeschaltet (ein oder aus).

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: parabacus am 01 Februar 2018, 19:37:28
Zitat von: Mastermind1 am 02 Januar 2018, 23:27:15
Mein Industrialcanberry Interface  (auf meinem Raspi Pi Model B) funktioniert nicht mehr (LED leuchtet nicht mehr.. - defekt)...

Kurze Frage: Welche Canbus Interfaces kann man mit einem Raspi Pi Modell B empfehlen?

Hallo in die Runde..!

Ich hatte vor einigen Wochen auch vor ein Projekt mit Raspi 3 und CAN-Interface zu starten, um damit an meine LWZ-504 zu kommen.
Inzwischen habe ich aber dafür eine "elegantere" Lösung gefunden, da die 504 auch USB hat und es dazu das FHEM-Modul THZ gibt.

Kurz gesagt - ich hab zwei USB-Interface-Module übrig, die wahrscheinlich nur in der Schublade verschwinden würden.
Anzubieten hätte ich ein PiCAN 2-Modul passend für den Raspi und ein USBtin-Interface von Fischl.
Beide habe ich kurz vor Weihnachten 2017 bestellt und bekommen und sind daher praktisch neuwertig. Ich hab auf beiden lediglich ein Jumper-Stiftpaar für den Abschlusswiderstand gelötet und beide für wenige Tage zum sniffen betrieben, bevor ich auf die USB-Lösung getroffen bin.

Wenn du Mastermind1 oder jemand anders Interesse daran ha(s)t, einfach schreiben - hier oder per PN. Beim Preis lässt sich sicher reden...  ;)

Ciao..!
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 24 März 2018, 09:40:08
Hallo,

erst mal Danke an Jürg (juerg5524), das fhem modul funktioniert. Ich habe zwar immer wieder mal Fehlermeldungungen, das Werte nicht gelesen werden. Derzeit polle ich jede Minute die Werte über den CAN Bus. Es wäre schön, wenn sich die Werte ohne pull Methode von selbst aktualisieren würden.


defmod hzg.read.wpl13.status at +*00:01:00 {\
fhem "get WPL13 AUSSENTEMP";;\
        sleep 2;; \
        fhem "get WPL13 PROGRAMMSCHALTER";;\
sleep 2;; \
        fhem "get WPL13 RUECKLAUFISTTEMP";;\
sleep 2;; \
        fhem "get WPL13 WPVORLAUFIST";;\
sleep 2;; \
        fhem "get WPL13 PUFFERSOLL";;\
        sleep 2;;\
        fhem "get WPL13 SPEICHERISTTEMP";;\
        sleep 2;;\
        fhem "get WPL13 BETRIEBSSTATUS";;\
        sleep 2;;\
        fhem "get WPL13 INFO_TYP";;\
\
\
}
attr hzg.read.wpl13.status alias Betriebsstatus Überwachung
attr hzg.read.wpl13.status alignTime 00:00
attr hzg.read.wpl13.status group Status
attr hzg.read.wpl13.status room Heizung


Die CAN Adresse für WAERMEPUMPENSTATUS funktioniert bei mir nicht

  // nach chriss1980 / knx forum
  // Verdichter 1:                  0x0001
  // DHC 1:                          0x0002
  // DHC 2:                          0x0004
  // Pufferladepumpe:           0x0008
  // Warmwasserladepumpe: 0x0010
  // HK 1 Pumpe:                 0x0020
  // HK 2 Pumpe:                 0x0040
  // Mischer auf:                  0x0080
  // EVU-Sperre:                  0x0100
  // Quellenpumpe:              0x0200
  // Kuehlkreispumpe:          0x0800
  { "WAERMEPUMPEN_STATUS"                              , 0x0062, et_little_endian},



Ich habe mich deshalb BETRIEBSSTATUS und INFO_TYP bedient

  // Verdichter 1:                 0x0001
  // Verdichter 2:                 0x0002
  // Pufferladepumpe 1:        0x0040
  // Pufferladepumpe 2:        0x0080
  // DHC 1:                          0x1000
  // DHC 2:                          0x2000
  // Warmwasserladepumpe: 0x4000
  // EVU Sperre:                   0x8000
  { "BETRIEBS_STATUS"                                  , 0x0176, 0},

  // HK1 Pumpe:           0x0001
  // HK2 Punpe:            0x0002
  // Mischer auf:           0x0004
  // Mischer zu:            0x0008
  // Quellenpumpe:       0x0010
  // Solarpumpe:          0x0020
  // 2. WE:                   0x0040
  // Zirkulationspumpe: 0x0080
  { "INFO_TYP"                                         , 0x019c, 0},





Ich habe meine WPL13 um ein paar sinnvolle Usereadings erweitert. So kann Pumpen- und Verdichterstatus überwacht werden.

Verdichter {
  if(ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1){return "on"} else {return "off"}
},
Pufferladepumpe {
  if(ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 6){return "on"} else {return "off"}
},
Warmwasserladepumpe {
  if((ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 15) eq "1"){return "on"} else {return "off"}
},
Heizpatrone {
  if((ReadingsVal($NAME,"INFO_TYP",0) & 1 << 6) eq "1"){return "on"} else {return "off"}
},
DHC_1 {
  if((ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 12) eq "1"){return "on"} else {return "off"}
},
DHC_2 {
  if((ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 13) eq "1"){return "on"} else {return "off"}
},
Heizkreispumpe {
if((ReadingsVal($NAME,"INFO_TYP",0) & 1 ) eq "1"){return "on"} else {return "off"}
}, Zirkulationspumpe {if((ReadingsVal($NAME,"INFO_TYP",0) & 1 << 7) eq "1"){return "on"} else {return "off"}
}


Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 26 März 2018, 15:40:57
Hallo Frank,

das mit den Fehlermeldungen habe ich auch, dazu hab ich in der "sub Elster_Get($@)" nach der Zeile

my $res = elster_perl::getstring($Elster_str);


folgenden Code eingetragen


  my $counter = 1;
  while (($res eq '?') && ($counter <= 5)) # max. 5 Versuche falls Auslesen nicht geklappt
  {
select(undef, undef, undef, 1.0); # 1,0 Sekunden warten (Pause)
$res = elster_perl::getstring($Elster_str); # nochmal auslesen
$counter++;
Log3 ($name,4,"getstring($Elster_str): $res, Versuch: $counter");
  }


damit wird bei einem GET-Befehl max. 5mal neu ausgelesen falls eine Fehlauslesung passiert. Zwischendurch wird jeweils 1 sec gewartet, kann noch optimiert werden. Zumindest habe ich jetzt spätestens nach dem 3. Leseversuch meine Daten.

Das mit dem sniffen funktioniert bei mir leider auch nicht. Laut dem Forum sollt es ja noch bis zur Version vom 25.01.2017 funktioniert haben. Diese Version habe ich aber selbst nicht probiert. Keine Ahnung was seit dem geändert wurde.

Wird bei dir die "sub Elster_Read($)" regelmäßig ausgeführt? Bei mir nicht. Ich glaube die ist für das Anstoßen des sniffens notwendig. Ich weiß nicht ob das was mit der Zeile


  require "$attr{global}{modpath}/FHEM/DevIo.pm";


aus der "sub Elster_Initialize($)" und


DevIo_OpenDev( $hash, 0, "Elster_DevInit" );


aus der "sub Elster_Define($$)" in Version 25.01.17 zu tun hat, die gab es nähmlich nicht mehr in den jüngeren Versionen.  ???

Gruß Markus.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 30 März 2018, 14:16:50
Hallo Markus

Ich habe das Gerüst von Radiator übernommen. Er griff mittels Perl-Funktionen auf die serielle Schnittstelle zu. Deshalb das

require .... DevIo.pm"

Das wird aber hier nicht benötigt. Ebenso der Aufruf von DevIo_OpenDev.

Ich habe in can_progs_2018014_test.zip einiges korrigiert. Ich wäre deshalb froh, wenn ihr mir zu dieser Version Rückmeldungen geben könntet.

Danke und viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 02 April 2018, 08:51:07
Hallo Jürg,

danke für die Rückmeldung, wie bereits oben beschrieben funktioniert die Version vom 14.01.2018 recht stabil auf meinem Rispberry. Ich nutze sie derzeit aber nur zum Auslesen von ca. 12 Werten, also in einer "abgespeckten" Version.
- Die GET-Funktion läuft mit meinen oben beschriebenen Ergänzungen (nochmaliges lesen bei fehlerhaften Werten) gut und ich erhalte somit immer meine geswünschten Werte.
- Die SET-Funktion habe ich momentan noch nicht im Einsatz und somit auch nicht getestet.
- Die Sniffer-Funktion läuft garnicht. Wäre aber eine tolle Option um nicht alle Werte mit GET abzufragen.

Die Funktionen "Elster_Ready" und "Elster_Read", die meines erachtens für die Snifferei zuständig sind werden bei mir nicht aufgerufen. Warum auch immer???

Wenn du noch andere Angaben benötigtst, dann melde dich einfach.

Gruß Markus
und schöne Restostern.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 April 2018, 15:34:25
Hallo Markus

Danke für deine Rückmeldung. Ein getstring setzt bis zu dreimal eine Anfrage ab. Dieser Wert ist in KCanElster.h mit count = 3 vorgegeben:

bool Send(unsigned count = 3, bool WaitForAnswer = true, int inner_delay = 50);

Diesen Wert könnte man auch auf 10 oder 15 erhöhen. Das müsste dann zum selben Resultat führen.

Ich bin daran, die Sniffer-Funktion zu testen und zu korrigieren.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 05 April 2018, 15:53:03
Hallo

Mit can_progs_20180405_test.zip funktioniert das "Sniffen" wieder. Ich habe es in einer MAC-Simulation ausgetestet.

Für das Anstossen von Elster_Ready und Elster_Read ist

$readyfnlist{"$name.$dev"} = $hash;

zuständig. "DevIo_OpenDev" macht das vorher, obwohl die Prozedur mit einem Fehler endete.

Viel Vergnügen
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mmeine am 05 April 2018, 19:44:16
Danke Jürg,

ich werde es bei Gelegenheit testen, hab aber im Moment viel um die Ohren, kann also etwas dauern.

Gruß Markus
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 03 Mai 2018, 18:52:30
Hallo Jürg,

ich habe die Version vom 05.04.2018 im Einsatz und das sniffen funktioniert. Leider habe ich immer noch Fehler bei manchen get Aufrufen.

Da das sniffen nun geht könnte man auch ein sh Script auf dem PI laufen lassen, was jede Minute die Werte über can_send ... holt.

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 21 August 2018, 16:01:07
Ich spiele mal wieder an meiner Canbus Anbindung  ;)

Eine Frage, wo finde ich den den aktuellen Betriebsstatus. Gibt es so etwas?
Also Kühlung / Heizen / Warmwasser / Aus ?

ich hab probiert
680 180.fdae
680 180.0176 (Betriebsstatus)



Ein Tipp?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: stoeff99 am 22 August 2018, 21:06:32
@Juerg5524, erst ein mal ein riiiesiges Dankeschön für deine Arbeit. Ist wirklich toll was du da auf die Beine gestellt hast!!!

Bei mir habe ich die neuste Version von 50_Elster.pm am laufen. Die Werte kann ich mit "get" einzeln abholen. Das Sniffen geht aber leider nach wie vor nicht. Ich teste live auf meiner WP. Mein Ziel wäre die Werte alle 60 Sekunden oder so aus zu lesen und dann an meine Loxone Steuerung zu schicken.

Geht bei euch das Sniffen nun einwandfrei?

Gruss
Chris
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 28 Oktober 2018, 00:39:38
Hallo

Ich habe einen Raspi3, FHEM und die Stiebel Eltron WPL 18 e mit WPM II. Ganz euphorisch habe ich diesen Thread gefunden und wollte mich dieses Weekend mal damit auseinandersetzen. Hat es jemand schon mit Raspi3 zum Laufen gebracht?

Lg c
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mastermind1 am 28 Oktober 2018, 08:11:07
Zitat von: choetzu am 28 Oktober 2018, 00:39:38
Hallo

Ich habe einen Raspi3, FHEM und die Stiebel Eltron WPL 18 e mit WPM II. Ganz euphorisch habe ich diesen Thread gefunden und wollte mich dieses Weekend mal damit auseinandersetzen. Hat es jemand schon mit Raspi3 zum Laufen gebracht?

Lg c
Ob raspi 1 - 3 hat keine Bedeutung. :-)
Wichtiger ist eher das jew. verwendete canbus Interface zum laufen zu bekommen. Der Rest ist dank der tollen Arbeit mit dem Modul hier nur noch die Kür.... P.s. das Modul funktioniert auch ohne fhem ;-) ich nutze es nativ für ip-symcon.

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 28 Oktober 2018, 10:42:27
herzlichen Dank für dein Feedback, Mastermind1. Super schonmal. Ich habe mir soeben ein Pican2 bestellt. Sollte diese Woche kommen. ;)

Wie schätzt du folgendes ein? Ich habe vor 2.5 Jahren mit Fhem begonnen. Bis dato wusste ich noch nix von ssh, mysql, raspi, perl, fhem, regex, html, css und co.. Hab ich mir alles Schritt für Schritt angeeignet. Heute bin ich zwar weiter, aber sehr weit weg selber Codes zu programmieren geschweige denn komplizierte Scripts zu verstehen. CAN scheint mir nochmals ein neues Gebiet zu sein. Ist es für einen Anfänger wie mich möglich, diese Schnittstelle WPL <--> FHEM gemäss Anleitung von Jürg zu machen. Meine Euphorie ist etwas der Ernüchterung gewichen, beim Lesen der Posts und Juergs Anleitung...

Lg c

PS Jürg: Schwiiizer?



Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 03 November 2018, 00:56:10
guten Abend, resp. Morgen ;)

ich habe nun den PiCAN with GPS + Gyro +Accelerometer CAN-Bus for Raspberry Pi 3 (http://skpang.co.uk/catalog/pican-with-gps-gyro-accelerometer-canbus-for-raspberry-pi-3-p-1521.html) auf dem Raspi 3 (Testgerät) montiert. Doch nun stellt sich mir die erste Frage, wie, resp. mit welchem Kabel verbinde ich meine Stiebel Eltron WPL 18 e mit WPM II mit dem Pican? Für Euch scheint dies alles klar zu sein, da noch niemand diese Frage gestellt hat ;) Der Schaltplan von Jürg ist mir auch nicht schlüssig (http://juerg5524.ch/data/piCan_Schema.pdf)  Ich wäre mega froh um eine Hilfestellung. Nicht dass mir die Heizung kapputt geht, jetzt wo es kälter wird..

Danke. Lg c
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 03 November 2018, 15:38:14
Hallo Choetzu

Wie du an meiner Web-Seite sehen kannst, bin ich "Schwiizer".

Die Schaltung wurde von Schwanti (https://www.haustechnikdialog.de/Forum/t/169910/ComfortSoft-mit-CAN-BUS-Anbindung-Raspberry-Pi-verwenden?page=5) nachgebaut.

Am WPM 2 gibt es einen 4-poligen Stecker, dort musst du abgreifen, und zwar CANH, CANL und GND. Für meine Schaltung ist auch der 4. Pol (18 Volt) notwendig.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 03 November 2018, 16:35:46
Guten Tag Jürg,

danke für deine Hilfe. Ich habe deinen Link (Schwantis Schaltung) versucht zu interpretieren. Als Laie aber einfach viel zu hoch..

Siehe Bild, rotes Rechteck. Ist dies der 4-polige Stecker (X15). In der Bedienungsanleitung steht unter X15:

1 BUS High
2 BUS Low
3 Ground -
4 + (nur in Verbindung mit DFü-COntroller (DCO) angeschlossen

Geht 1 auf Can_H, 2 auf Can_L und 4 auf Gnd beim PiCAN? Ich denke ja, gell?

Muss ich irgendwo noch Ohm dazwischen stecken oder kann ich es direkt vom WPMII an den PiCAN stecken?

Lg c (auch aus der Schwiiz)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 04 November 2018, 15:00:42
Hallo Choetzu

Pin 4 solltest auf keinen Fall verwenden. GND steht für "ground".

Direkt ohne Widerstand anschliessen. Das Kabel, das vermutlich weniger als 2 Meter lang ist, braucht keine verdrillten Adernpaare.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 06 November 2018, 23:06:01
So, lieber Jürg, ich habe es endlich geschafft. Es funktioniert und ich bin brutal happy. Ich danke dir herzlich für dieses Modul... Da hast du ganz viel Arbeit reingesteckt, die mir nun zu Gute kommt.

Ich kann via Fhem mit GET auslesen und mit SET setzen. Da ich das Forum in den letzten Tagen ziemlich "gespamt" habe, ohne Antworten oder Hilfestellungen zu erhalten, habe ich der besseren Uebersicht halber meine 4 letzten Beiträge gelöscht. Dafür liefere ich folgend eine KURZANLEITUNG für Dummies wie mich. Klar, die Infos sind irgendwo erhältlich, aber m.E. irgendwie zu stark zerstreut... Es soll keine Kritik sein, sondern eine Hilfestellung für Gleichgesinnte (doofies wie ich):

Hardware (in meinem Fall):
1. Raspi3 mit Betriebssystem Stretch
2. Pican2  --> http://skpang.co.uk/catalog/pican-with-gps-gyro-accelerometer-canbus-for-raspberry-pi-3-p-1521.html
3. Cat5 Kabel. In meinem Fall nicht länger als 1,5 Meter. Sollte es nicht gehen, dann mit 120OHM versuchen, seitens Raspi.
4. Verbindung Pican2 mit der Wärmepumpe WPMII (bei mir Stiebel Eltron WPL 18e), siehe Bild:
- X15 (WPMII) Pin 1 (H) mit Can_H (Pican2) verbinden
- X15 (WPMII) Pin 2 (L) mit Can_L (Pican2) verbinden
- X15 (WPMII) Pin 3 (-) mit  GND (Pican2) verbinden
5. Raspi an Strom anschliessen und einschalten.

Software:
1. Stretch und Fhem müssen vorinstalliert sein
2. Auf juerg5524.ch die aktuellste can_progs.zip runterladen, entpacken und auf den Raspi hochladen. Bei mir in den Folder /home/pi/can_progs/ . Ich habe Schreibrechte 777 gegeben. Ich weiss, nicht optimal...
3. Die Datei http://www.skpang.co.uk/dl/can-test_pi2.zip runterladen, entpacken und auf Raspi hochladen. Bei mir in den Folder /home/pi/can-test_pi2/ . Auch hier habe ich Schreibrechte 777 gegeben.
4. Terminal öffnen und mit Raspi3 per SSh verbinden
5. CAN bootfähig (can0) machen, indem man im Terminal folgendes eingibt:
sudo nano /boot/conig.txt

Am Ende der Datei folgende Zeilen eingeben und dann speichern.
dtparam=i2c_arm=on
dtparam=spi=on
enable_uart=1
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay


6. Reboot

7. Terminal erneut starten und "cd /home/pi/can-test_pi2/" eingeben
8. CAN Schnittstelle aktivieren, indem man folgendes nacheinander eingibt

sudo ip link set can0 type can bitrate 20000
sudo ifconfig can0 up
sudo ifconfig can0
./candump can0


Wichtig ist dabei die bitrate 20000 bei der ersten Eingabe. Ansonsten geht das nicht.
Nach ./candump can0 sollte dann sowas ähnliches wie folgendes kommen:
  can0  480   [7]  A1 00 FA 01 D6 00 00
  can0  480   [7]  A1 00 16 00 00 00 00
  can0  500   [7]  92 00 FA 01 D6 01 1B
  can0  480   [7]  A1 00 FA 07 A8 00 00
  can0  480   [7]  A0 00 5F 04 00 00 00
  can0  500   [7]  92 00 16 01 17 00 00
  can0  500   [7]  92 00 FA 07 A8 00 08
  can0  180   [7]  A0 79 0C 00 4E 00 00
  can0  180   [7]  A0 79 FA 01 D7 01 01


9. Nun in den Ordner "cd /home/pi/can_progs/" wechseln
10. Sicherstellen, dass man swig (sudo apt-get install swig) und libperl-dev (sudo apt-get install libperl-dev) installiert hat. Dies war bei mir nicht der Fall.
11. Die Datei "/home/pi/can_progs/can_elster_perl.arm in einem Texteditor öffnen und den folgenden Pfad in der Datei anpassen (Perl Version kann anders sein). Den Pfad müsst Ihr überprüfen. Danach speichern.
CORE_PATH="/usr/lib/arm-linux-gnueabihf/perl/5.24.1/CORE"
12. sudo ./can_elster_perl.arm im Terminal auslösen. Dabei werden die Dateien elster_perl.so, elster_perl.pm kompiliert (sagt man dem so? :)
13. sudo cp elster_perl.so /opt/fhem/FHEM
14. sudo cp elster_perl.pm /opt/fhem/FHEM
15. sudo cd fhem (also in Pfad /home/pi/can_progs/fhem/ wechseln)
16. sudo cp 50_Elster.pm /opt/fhem/FHEM
17. In FHEM wechseln und "shutdown restart" oder im Terminal "sudo /etc/init.d/fhem start" eingeben
18. Das Device "define <name> Elster can0" eingeben.
19. Nachdem das Device erstellt ist, sollte im state "connected" stehen.
20. Mit "GET" die einzelnen Werte abfragen oder mit "SET" eingeben

So, ich hoffe das hilft einigen. Und sollte ich was vergessen haben, bitte melden.

Over and out.
Lg c

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 10 November 2018, 16:19:50
Zitat von: intershopper am 24 März 2018, 09:40:08
Hallo,

erst mal Danke an Jürg (juerg5524), das fhem modul funktioniert. Ich habe zwar immer wieder mal Fehlermeldungungen, das Werte nicht gelesen werden. Derzeit polle ich jede Minute die Werte über den CAN Bus. Es wäre schön, wenn sich die Werte ohne pull Methode von selbst aktualisieren würden.


defmod hzg.read.wpl13.status at +*00:01:00 {\
fhem "get WPL13 AUSSENTEMP";;\
        sleep 2;; \
        fhem "get WPL13 PROGRAMMSCHALTER";;\
sleep 2;; \
        fhem "get WPL13 RUECKLAUFISTTEMP";;\
sleep 2;; \
        fhem "get WPL13 WPVORLAUFIST";;\
sleep 2;; \
        fhem "get WPL13 PUFFERSOLL";;\
        sleep 2;;\
        fhem "get WPL13 SPEICHERISTTEMP";;\
        sleep 2;;\
        fhem "get WPL13 BETRIEBSSTATUS";;\
        sleep 2;;\
        fhem "get WPL13 INFO_TYP";;\
\
\
}
attr hzg.read.wpl13.status alias Betriebsstatus Überwachung
attr hzg.read.wpl13.status alignTime 00:00
attr hzg.read.wpl13.status group Status
attr hzg.read.wpl13.status room Heizung


Die CAN Adresse für WAERMEPUMPENSTATUS funktioniert bei mir nicht

  // nach chriss1980 / knx forum
  // Verdichter 1:                  0x0001
  // DHC 1:                          0x0002
  // DHC 2:                          0x0004
  // Pufferladepumpe:           0x0008
  // Warmwasserladepumpe: 0x0010
  // HK 1 Pumpe:                 0x0020
  // HK 2 Pumpe:                 0x0040
  // Mischer auf:                  0x0080
  // EVU-Sperre:                  0x0100
  // Quellenpumpe:              0x0200
  // Kuehlkreispumpe:          0x0800
  { "WAERMEPUMPEN_STATUS"                              , 0x0062, et_little_endian},



Ich habe mich deshalb BETRIEBSSTATUS und INFO_TYP bedient

  // Verdichter 1:                 0x0001
  // Verdichter 2:                 0x0002
  // Pufferladepumpe 1:        0x0040
  // Pufferladepumpe 2:        0x0080
  // DHC 1:                          0x1000
  // DHC 2:                          0x2000
  // Warmwasserladepumpe: 0x4000
  // EVU Sperre:                   0x8000
  { "BETRIEBS_STATUS"                                  , 0x0176, 0},

  // HK1 Pumpe:           0x0001
  // HK2 Punpe:            0x0002
  // Mischer auf:           0x0004
  // Mischer zu:            0x0008
  // Quellenpumpe:       0x0010
  // Solarpumpe:          0x0020
  // 2. WE:                   0x0040
  // Zirkulationspumpe: 0x0080
  { "INFO_TYP"                                         , 0x019c, 0},





Ich habe meine WPL13 um ein paar sinnvolle Usereadings erweitert. So kann Pumpen- und Verdichterstatus überwacht werden.

Verdichter {
  if(ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1){return "on"} else {return "off"}
},
Pufferladepumpe {
  if(ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 6){return "on"} else {return "off"}
},
Warmwasserladepumpe {
  if((ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 15) eq "1"){return "on"} else {return "off"}
},
Heizpatrone {
  if((ReadingsVal($NAME,"INFO_TYP",0) & 1 << 6) eq "1"){return "on"} else {return "off"}
},
DHC_1 {
  if((ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 12) eq "1"){return "on"} else {return "off"}
},
DHC_2 {
  if((ReadingsVal($NAME,"BETRIEBSSTATUS",0) & 1 << 13) eq "1"){return "on"} else {return "off"}
},
Heizkreispumpe {
if((ReadingsVal($NAME,"INFO_TYP",0) & 1 ) eq "1"){return "on"} else {return "off"}
}, Zirkulationspumpe {if((ReadingsVal($NAME,"INFO_TYP",0) & 1 << 7) eq "1"){return "on"} else {return "off"}
}


Gruß Frank

Hallo Frank,

danke für deine Vorlagen. Ich habe diesbezüglich eine Frage. Ich habe bei mir auch keine WAERMEPUMPENSTATUS. Aber ich krieg auch BETRIEBSSTATUS und INFO_TYP nicht hin.
ich habe eine WPL18e.

Was meinst du genau mit:
  { "BETRIEBS_STATUS"                                  , 0x0176, 0},
und   
{ "INFO_TYP"                                         , 0x019c, 0},

Wo genau muss ich diesen Code platzieren?

Danke für die Hilfe... lg c
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 18 November 2018, 18:05:36
Hallo choetzu,

0x0176 und 0x019c sind die CAN bus Adressen. Die sollten bei deiner WPL18 gleich sein.

Füge einfach die usereadings an der WPL Can object in Fhem im Attribute usereadings ein.

Dann sind neue Eigenschaften sichtbar.

Gruss Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: gbr am 03 Januar 2019, 13:53:58
Danke schonmal für die genauen Anleitungen und das FHEM Modul. Hat dadurch bei mir mit Raspi 3 + PiCan2 sofort geklappt!
Ich habe eine TTL 10 AC mit WPM II.
Generell passt schon vieles zusammen. Wahrscheinlich müsst ich auch mal die Logs laufen lassen, um alle Werte zu finden.
Ich würde auch gerne die Fehlermeldungen der WP verarbeiten, jedoch scheint Adresse 0001 nicht in der Vorlage/Plugin gemappt zu sein. Diese enthält wohl die Nummer des Fehlerspeichers für den aktuellen Fehler (ist es ein Ringspeicher?). Das Datum des Fehlers (wie in der Fehlerliste im WPM) bekommt man aber nicht per CAN Bus oder? D.h. man wartet auf Änderung von 0001 und baut sich so eine eigene Fehlerliste auf. Oder gibt es einen einfacheren Weg? Und wäre dies die erste Anlaufstelle um am schnellsten herauszufinden, ob etwas mit der Heizung gerade nicht i.O. ist oder anhand welcher Werte "alarmiert" ihr?

EDIT: Über die Anpassung der elster.pm Datei kann ich ja die fehlenden Adressen aufnehmen oder gibt es noch einen anderen Weg? Insbesondere wäre die Frage, wo das Wertemapping/Wertecasting stattfindet bzw. man den Dateityp anpassen kann oder muss man es dafür neu compilieren?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: gbr am 04 Januar 2019, 12:32:07
Mein FHEM Log war noch voll mit "elster: get sniffed.." Einträgen. Musste die Zeile "elster_perl::toggle_trace" entsprechend im PM-File auskommentieren. Wäre schön, wenn man das über das Plugin Trace Level steuern könnte o.ä. und es per Default eher aus wäre. Weil durch häufiges Schreiben geht ja auch schneller die SD Karte kaputt :)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: jodamm am 09 Januar 2019, 21:34:28
Hallo, ich habe es endlich auch mal geschafft meine LWZ504 anzuschließen. Das Modul hat nicht gleich mit der LWZ504 zusammen funktioniert, doch davon gibt es in einem späteren Post mehr, wenn ich alles fertig eingerichtet habe. Bei der Inbetriebnahme sind mir zwei Fehler in den Programmen aufgefallen. Die CAN Send Routine hat nicht auf die Antwort gewartet wenn sich ein anderes Telegram dazwischen gemogelt hat. Mir haben bei meinen Scans Werte gefehlt und das hat dann wohl zu den nicht erfoglreichen Gets geführt die hier im Thread erwähnt werden. Und im Elster Modul für fhem hat das Sniffen nicht funktioniert. Anbei sind die gefixten Programmdateien für die can_progs vom 20.05.18.
Der Fix für das Sniffen ist in den Zeilen 667 und 668 von 50_Elster.pm
        if (hex($el->{ID}) == hex($recv_id) &&
            hex($el->{EIdx}) == hex($elster_idx))

In der 50_Elster.pm habe ich auch noch den Befehl in Zeile 529 auskommentiert (siehe Beitrag zuvor).

Für den Fix für die verlorenen Antworttelegramme wurden die folgenden Zeilen nach Zeile 171 in die KCanElster.cpp eingefügt.
            else
              continue;

Der Bereich sieht dann so aus:
              Ok = true;
          #if !defined(__UVR__)
            if (Ok)           
              SniffedData.ClearSniffedValue(RecvFrame);
            else
              continue;
          #endif
            return Ok;


Für den Fix mit den verlorenen Telegrammen muss man dann die elster_perl lib neu kompilieren mit ./elster_perl.arm und dann die elster_perl.so in das passende Verzeichnis kopieren.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 12 Januar 2019, 14:19:27
Hallo jodamm

Vielen herzlichen Dank, deine Fehler-Korrektur in KCanElster.cpp ist für die Stabilität von grosser Bedeutung! Das mit dem Sniffen werde ich bei Gelegenheit anschauen.

Viele Grüsse
Jürg

P.S.: KCanElster.cpp ist in can_prog.zip korrigiert.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Phil_E am 15 Januar 2019, 12:52:06
Hallo

Stiebel hat nun zum 3. mal bei mir einen der beiden Kompressoren ausgetauscht (min. 3 Monate insgesamt mit Strom geheizt) und ich zweifle sehr, dass dies der letzte war.
Dieser Zweifel brachte mich zu diesem Forum, da ich meine WP überwachen und loggen möchte (die startet ja nach einem Fehler gleich wieder.)
Der Servicemonteur sagte mir bei Fragen mit Vernetzung, dass ein Freak aus der Schweiz die WP von Stiebel schon länger loggt..wird wohl Jürg sein  ;)

Ich möchte allen und vor allem Jürg danken für ihren Beitrag, der mir vielleicht hilft, dass meine Stromkosten nicht weiter explodieren und ich jetzt ein neues Hobby habe  ;) (Haus automatisieren)

Ich warte leider immer noch auf die CAN-Schnittstelle und werde danach meine Erfahrung mit euren Anleitungen und Software berichten.

CANBus
Ich werde beide Augen zudrücken und wie choetzu eine Stichleitung legen...bei dieser Baud. sollte es ja mit der Kabellänge keine Probleme geben.

Ist es richtig, dass hier noch niemand die Fehlermeldungen geloggt hat?

Nochmals vielen Dank und Grüsse...auch aus Schwiizerland(TG)

Philipp
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Phil_E am 16 Januar 2019, 17:56:14
Hallo nochmals

Ich habe mit RaPi FHEM, Perl und Python praktisch noch keine Erfahrung aber dank euren Posts kriege ich nun schon mal die Aussentemperatur rein, 8)
danach funktioniert die Struktur leider nicht mehr.
Vielen Dank nochmals!

Ich habe eine WPL33HT mit WPM 2.1, die eine andere Struktur hat als das Tabellenfile von Jürg.

Ich konnte im Netz die Comfortsoft nirgends finden, da der Link nicht mehr gültig ist.

Könnte mir jemand das Scanfile im Anhang bearbeiten, damit ich es in die ElsterTable einbinden kann oder weiss jemand wo ich die Software kriegen kann?
merci

Grüsse Philipp

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 17 Januar 2019, 17:05:35
Hallo Philipp

Die Datei für deine WP findest du im Anhang.

Viel Spass
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: gbr am 17 Januar 2019, 21:21:54
Hallo Jürg,

Darf ich fragen wie du Fehler detektierst und anzeigst?

Danke und Gruß,
Gerrit

Edit: sorry Auto Korrektur
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Phil_E am 18 Januar 2019, 19:22:32
Hallo Jürg
Vielen herzlichen Dank für deine Bemühungen..ich habe die Änderungen in 50_Elster übernommen und habe gesehen, dass eigentlich nur die WPM-Adresse bei mir 300 ist.
Muss aber erstmal den RasPi neu aufsetzen, da der nicht mehr startet. :-\
Bin öfters Gesch. in Wohlen und müsste dir eigendlich min. eine Flasche Wein mal in den Briefkasten stellen ;)

Allerdings hat meine WP 2 FUs/ 2 Komp. und für meine Diagnose brauche ich unbedingt noch zusätzliche Daten der IWS.(siehe PDF)

Infos Temperaturen:
Am meisten interessiert mich die SauggastempHD, aber auch die anderen Daten wie Ströme, Drehzahl und Wärmemenge wären interessant.
Ich nehme an, das IWS ist Adresse 500 oder? Wie komme ich nun zu den Indizies?
Geht das mit Comfortsoft und deiner Brücke und woher bekomme ich die Software...soll ich mal Stiebel fragen?..die zittern schon wenn ich wieder anrufe ;) 

Ich nehme mal an, wenn ich die Fehler des HD-Verdichters(2.Seite PDF)  tracen will, muss ich das an FHEM vorbei lösen?

Nochmals vielen Dank
Gruss Philipp


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 20 Januar 2019, 09:57:14
Hallo Gerrit

Der Typ zum einzelnen Wert wird in der Datei ElsterTable.inc zugeordnet.

Wenn du einen Scan durchführst

./can_scan can0 680 total >scan.txt

und mir scan.txt gibst, kann ich dir die Werte, die von der Software ComfortSoft generiert werden, zukommen lassen. Für einen vollständigen Scan musst du zwingend die neuste can_progs.zip Software verwenden!

Im Anhang ist eine Fehlerliste von ComfortSoft.

FHEM verwende ich nur in einer Simulation, um Austesten zu können. Ich zeige deshalb keine Fehler an. 

Viele Grüsse
Jürg

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 20 Januar 2019, 10:13:04
Hallo Philipp

Danke, das mit der Flasche Wein ist lieb von dir, aber übertrieben!

Die Datei ElsterTable.inc enthält alle mir bekannten "Elster-Paare" und diese Paare stimmen nicht zwingend. ComfortSoft liefert keine zusätzlichen Werte.

Kannst du z.B. die "SAUGGASTEMP" im WPM anzeigen? Wenn du das kannst, dann muss der WPM den Wert von ID 180 abfragen, d.h. er ist auf dem CAN-Bus sichtbar.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: thorschtn am 21 Januar 2019, 10:52:21
Zitat von: Phil_E am 15 Januar 2019, 12:52:06
Stiebel hat nun zum 3. mal bei mir einen der beiden Kompressoren ausgetauscht (min. 3 Monate insgesamt mit Strom geheizt) und ich zweifle sehr, dass dies der letzte war.

Hallo Phillip,

die elektrische Zusatzheizung ist bei mir separat abgesichert. Seitdem ich unmittelbar nach Einzug mal einen Defekt hatte und daraufhin unwissentlich mit Heizstab geheizt habe, ist die Sicherung bei mir permanent aus. Das heisst, wenn Dein Kompressor mal wieder kaputt ist, wirds zwar kalt in der Hütte, so bekommst Du aber sofort mit, wenns Probleme gibt und heizt nicht ohne Dein Wissen mit Heizstab.

Gruß,

Thorsten
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Phil_E am 21 Januar 2019, 13:01:34
Zitat von: thorschtn am 21 Januar 2019, 10:52:21
die elektrische Zusatzheizung ist bei mir separat abgesichert. Seitdem ich unmittelbar nach Einzug mal einen Defekt hatte und daraufhin unwissentlich mit Heizstab geheizt habe, ist die Sicherung bei mir permanent aus. Das heisst, wenn Dein Kompressor mal wieder kaputt ist, wirds zwar kalt in der Hütte, so bekommst Du aber sofort mit, wenns Probleme gibt und heizt nicht ohne Dein Wissen mit Heizstab.
Hallo Thorsten
Danke für deine Info, aber mein DHC springt erst bei Notbetrieb an und den stelle ich manuell ein. Der Heizwendel im Speicher (für Not-Notbetrieb) ist eh abgeschaltet, da ich den nicht am Sperrschütz habe. ;)
Ich habe so lange mit Strom geheizt, da Stiebel jedes Mal mind. 3 Wochen braucht, bist der Kompressor getauscht ist!
Gruss Philipp
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Phil_E am 21 Januar 2019, 13:35:55
Hallo Jürg
Danke für die Antwort. Ich überlege mir mal bei Stiebel die kompletten Adressen und Eigenschaften der Parameter anzufragen.
Die schulden mir noch was!

Ist das IWS nicht ID500?
Ich habe den Bus mal aufgezeichnet, bin dann runter in den Keller und habe den WPM auf Infos Temp "SAUGGASTEMPHD" gestellt
Danach kann man im File sehen, dass nur im unteren Bereich gewisse neue Werte beiI D500 auftauchen.
Da ich zuerst auf Aussentemp gestellt habe und danach nach 0C suchte, nahm ich an, dass die 2Byte FA05 die Adresse des Sauggastemp ist--> gedreht 05FA.

Das war falsch..inzwischen habe ich gemerkt, dass die Adresse in Byte 4/5 ist und nicht gedreht werden muss!
--> gelbe Markierung 1Byte nach rechts

Danach habe ich einen Eintrag in der ElsterTable.inc und 50Elster.pm gemacht.(ist das ok)?
{ "SAUGGASTEMPHD"                                , 0x05d7, et_dec_val},
"SAUGGASTEMPHD"   => { EIdx => "05d7", ID => "500" } ,

In FHEM Sauggastemp ausgewählt...kam der Wert ohne Komma zurück.
So habe ich auch den Strom gefunden!

Habe nur jetzt die Möglichkeit aufzuzeichnen, da ich sonnst wieder auf <-5° ein Jahr warten muss  ;)
So, jetzt gehts ans ploten oder DB, die Zeit drängt ;)

Gruss Philipp
 
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: gbr am 21 Januar 2019, 23:18:19
Zitat von: juerg5524 am 20 Januar 2019, 09:57:14
Im Anhang ist eine Fehlerliste von ComfortSoft.
Hallo Jürg, vielen Dank für die Infos. Hab im Bauexpertenforum noch einen Beitrag von 2014 von dir gefunden, in dem du die Fehlerfeld Struktur näher erläuterst. Da das mit der Fehlernummer aus Adresse 0001 zufällig gepasst hatte (genau in dem Feld war zufällig der gleiche Fehlercode wie aktuell, aber eben doch anderer Zeitpunkt in den Feldern davor), hat ich mir die Daten ansonsten nicht mehr angeschaut. Aber alle Daten der Historie mit Zeitangaben sind in den Feldern aufgeteilt. Der letzte Fehler aktuell im letzen Fehler-Feld 139. In der ElsterTable.inc hab ich noch weitere Felder gefunden, die vllt mehr Infos zum aktuellen geben (oder ist bei mir jetzt immer der aktuelle Fehler in Feld 139?). Zwar Schade zum Testen aber zum Glück gibts aktuell nicht so häufig Fehler ;) (Alle paar Monate mal einer)
Ich werde die neueste Version heut oder morgen zum Laufen bringen und dann Feedback geben!
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 26 Januar 2019, 14:19:28
Hallo Philipp

Die Einträge in ElsterTable.inc und 50_Elster.pm sind richtig, aber hast du auch die folgende Zeile entfernt?

{ "LEISTUNGSREDUZIERUNG_KUEHLEN"                     , 0x05d7, 0},

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 24 Februar 2019, 14:40:27
Guten Tag,
Bei mir läuft das Elster Modul seit einiger Zeit stabil. Danke Jürg für das tolle Modul und deinen unermüdlichen Support! Einfach super.

Frage in die Runde: wie habt ihr nun die Steuerung der Heizung in Fhem umgesetzt? Welche notify und DOIFS habt ihr? Welche Readings beobachtet ihr?

Ich habe lediglich ein at zum Auslesen der Readingss

defmod Timer_WPL18e_auslesen at +*00:05:00 {\
fhem "get WPL18e AUSSENTEMP";;\
        sleep 2;; \
        fhem "get WPL18e PROGRAMMSCHALTER";;\
sleep 2;; \
        fhem "get WPL18e RUECKLAUFISTTEMP";;\
sleep 2;; \
        fhem "get WPL18e WPVORLAUFIST";;\
sleep 2;; \
        fhem "get WPL18e PUFFERSOLL";;\
        sleep 2;;\
        fhem "get WPL18e SPEICHERISTTEMP";;\
}
attr Timer_WPL18e_auslesen alias Betriebsstatus Überwachung
attr Timer_WPL18e_auslesen alignTime 00:00
attr Timer_WPL18e_auslesen group Status
attr Timer_WPL18e_auslesen room Heizung
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: gbr am 04 Oktober 2019, 17:36:02
Habe aktuell Probleme das Perl-Modul zu bauen (mit Perl lib 5.28.1 von raspbian buster, Raspi 3, can_progs Feb 2019, CORE_PATH angepasst)
Das so. File wird nicht gebaut, zwischendrin gibt es einen Error beim Kompilieren:

In file included from /usr/include/features.h:424,
                 from /usr/include/arm-linux-gnueabihf/sys/ioctl.h:21,
                 from KRPiCanDriver.cpp:24:
/usr/include/arm-linux-gnueabihf/bits/socket.h:282:45: error: flexible array member 'cmsghdr::__cmsg_data' not at end of 'struct timehdr'
     __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */


Habe das arm-Build File noch angepasst, aber auch das hat nicht geholfen (64-bit und fPic Flag entfernt, damit gleich Aufruf aus älterer can_progs Version)

Hat das jemand schon erfolgreich unter raspbian buster gebaut?

EDIT: mit dem alten so-File und einem manuellen Link von 5.28 auf libperl.5.24.1.so (damit war die so gelinkt) geht es noch, nur der state vom Modul wird mit ??? Fragezeichen angezeigt. Neu bauen geht aktuell aber nicht mehr
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Ratzefummel am 23 Oktober 2019, 19:21:56
Hallo Zusammen,

vielen Dank für die grandiose Arbeit von euch Allen.
Ich habe euren Anleitungen folgen können und alles installiert. Elster-Modul läuft und empfängt FHEM Readings. Allerdings scheinen die Zuordnungen nicht immer richtig zu sein.

Leider schaffe ich es nicht, die ComfortSoft zum laufen zu bringen. Daher möchte ich euch bitten, das Scanfile im Anhang zu bearbeiten, damit ich es in die ElsterTable einbinden kann.
Anlage: WPM3, Hydraulikmodul THM eco, Wärmepumpe Tecalor TTL 15 A(C)S (ohne Kühlung).

Danke im Voraus

Liebe Grüsse
Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 26 Oktober 2019, 13:07:04
Hallo Ratzefummel

Leider unterstützt ComfortSoft den WPM3 nicht mehr. Aber du kannst mit "special/log_to_scan" aus deinem log-File ein File im "scan_data"-Format erzeugen (siehe Anhang). Was dabei auffällt, sind die vielen CAN-Ids:

  100
  180
  379
  380
  480
  500
  579
  601
  680
  700

Da die 680 auch vorkommt, solltest du sie zum Sannen nicht verwenden!

Die fhem-include-Datei kannst du mit "fhem/LogAnalyze" aus dem Scan erzeugen (siehe Anhang).

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: chris128 am 29 Dezember 2019, 15:08:41
Hallo gbr,
ich bin zwar neu hier, kann dir aber helfen, da ich die gleichen Probleme hatte!
Das kommt wohl von der neuen Raspbian-Version.
Die Lösung ist, in der Datei KSocketCanDriver.cpp die Struktur timehdr umzusortieren. (Zeile 109).

Gruß
Christian
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: chris128 am 29 Dezember 2019, 15:19:36
Hallo Jürg,
nach Anfagsproblemen, konnte ich mittlerweile deine Tools (vom 8.2.19) kompilieren, habe scans erstellt, konvertiert und jetzt ein lauffähiges FHEM-Modul.
Vielen Dank für die intensiven Vorarbeiten!

Nach dem Durchschauen der gets und sets in FHEM ist mir aufgefallen, das das Tool LogAnalize die IDs rausgelassen hat, die im Scan einen Inhalt von 0 geliefert hatten.
Etwas zur Vorgeschichte ist in HT-Dialog-Forum nachzulesen:
http://www.htdialog.de/Forum/t/169910/ComfortSoft-mit-CAN-BUS-Anbindung-Raspberry-Pi-verwenden?page=8 (http://www.htdialog.de/Forum/t/169910/ComfortSoft-mit-CAN-BUS-Anbindung-Raspberry-Pi-verwenden?page=8)

Ich könnte da jetzt per Hand Einträge ergänzen, jedoch habe ich Bedenken, da ich die jeweiligen Datentypen nicht kenne.
Ich habe eine LWZ 304 Trend.
Du schreibst, dass die Software Comfortsoft nicht mehr mit dem WPM3 zurechtkommt.
Wie finde ich heraus, welcher bei mir verbaut ist?

Gruß
Christian
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: labe am 02 Januar 2020, 15:14:41
Hallo Zusammen,
ich habe eine Stiebel Eltron LWZ 304 SOL (Baujahr 2018) und würde für diese gerne mit Hilfe von Jürgs Tools einen KNX Wrapper bauen. Leider bin ich nach Lektüre von diesem Thread und der Readme noch nicht ganz sicher, wie ich die Tools dafür verwenden muss. Als ersten Schritt habe ich einen Raspberry Pi 3 mit dem CAN Modul von IndustrialBerry bestückt und an die Heizung angeschlossen. Das funktioniert soweit, über candump kann ich Nachrichten mitsniffen und auch über das Tool can_logger kann ich Daten aufzeichnen. Die initiale Abfrage mit can_send zum scannen der IDs läuft bei mir allerdings ins Leere und ergibt keine gefundenen Werte.

./can_scan can0 680 total
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

scan on CAN-id: 680
list of valid can id's:





Meine Vermutung ist, dass dies mit einer ID zusammenhängt, die wohl etwas untypisch ist im Vergleich zu dem was ich hier sonst so gelesen habe (ID 6a1, die ich mit Hilfe des can_logger herausgefunden habe).

Die Abfrage der Minuten liefert leider kein Ergebnis:
./can_scan can0 700 180.0126
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

no value read


Wisst ihr, wie ich weiter vorgehen kann, um meine Heizung zum Antworten zu bewegen? Muss ich mich zum Beispiel initial als "Bedienteil" identifizieren?

Viele Grüße
labe
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: chris128 am 05 Januar 2020, 10:34:11
Hallo labe,
ich war vor einem Monat in der gleichen Situation mit meiner LWZ304 Trend.
Die Tools von Jürg müssen ein wenig angepasst werden, weil die ID 680 nicht mehr funktioniert.
Wenn du ein aktuelles Raspbian (Buster) hast, musst du noch ein wenig mehr anpassen, damit die Tools wieder compilieren.

Meine ersten Versuche habe ich mit Informationen aus dem Haustechnik-Dialog-Forum gemacht.
Hier habe ich auch eine Zusammenfassung meiner Schritte gepostet.
http://www.htdialog.de/Forum/t/169910/ComfortSoft-mit-CAN-BUS-Anbindung-Raspberry-Pi-verwenden?page=8 (http://www.htdialog.de/Forum/t/169910/ComfortSoft-mit-CAN-BUS-Anbindung-Raspberry-Pi-verwenden?page=8)
Schau dir erst mal den letzten Eintrag an und dann ggf weiter zurück.

Gruß
Christian
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 08 Februar 2020, 14:43:49
Zitat von: gbr am 04 Oktober 2019, 17:36:02
Habe aktuell Probleme das Perl-Modul zu bauen (mit Perl lib 5.28.1 von raspbian buster, Raspi 3, can_progs Feb 2019, CORE_PATH angepasst)
Das so. File wird nicht gebaut, zwischendrin gibt es einen Error beim Kompilieren:

In file included from /usr/include/features.h:424,
                 from /usr/include/arm-linux-gnueabihf/sys/ioctl.h:21,
                 from KRPiCanDriver.cpp:24:
/usr/include/arm-linux-gnueabihf/bits/socket.h:282:45: error: flexible array member 'cmsghdr::__cmsg_data' not at end of 'struct timehdr'
     __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */


Habe das arm-Build File noch angepasst, aber auch das hat nicht geholfen (64-bit und fPic Flag entfernt, damit gleich Aufruf aus älterer can_progs Version)

Hat das jemand schon erfolgreich unter raspbian buster gebaut?

EDIT: mit dem alten so-File und einem manuellen Link von 5.28 auf libperl.5.24.1.so (damit war die so gelinkt) geht es noch, nur der state vom Modul wird mit ??? Fragezeichen angezeigt. Neu bauen geht aktuell aber nicht mehr

hallo, wie hast du das mit dem "manuellen Link" hingekriegt? ich weiss nicht genau, wo ich das machen muss. Danke. Lg C
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: gbr am 09 Februar 2020, 13:51:10
Jetzt hier noch die aktuelle Lösung mit neuestem canprogs.zip:

can_elster_perl.arm ausführbar machen: chmod +x can_elster_perl.arm

Anpassung von can_elster_perl.arm
CORE_PATH="/usr/lib/arm-linux-gnueabihf/perl/5.28/CORE"

Und Anpassung von KSocketCanDriver.cpp
Zeile 107 und 108 tauschen

das ganze bauen: ./can_elster_perl.arm

Danach dann die pm, so und die 50_elster.pm aus dem fhem ordner nach opt/fhem/FHEM kopieren
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 09 Februar 2020, 16:53:35
Zitat von: gbr am 09 Februar 2020, 13:51:10
Jetzt hier noch die aktuelle Lösung mit neuestem canprogs.zip:

can_elster_perl.arm ausführbar machen: chmod +x can_elster_perl.arm

Anpassung von can_elster_perl.arm
CORE_PATH="/usr/lib/arm-linux-gnueabihf/perl/5.28/CORE"

Und Anpassung von KSocketCanDriver.cpp
Zeile 107 und 108 tauschen

das ganze bauen: ./can_elster_perl.arm

Danach dann die pm, so und die 50_elster.pm aus dem fhem ordner nach opt/fhem/FHEM kopieren

als Ergänzung: Auf http://juerg5524.ch/list_data.php gibts die neuste can_progs (version 20200209), die auch für Buster gehen. Dann, wie von gbr beschrieben kompilieren und verschieben.  Ich musste die Anpassung vonKSocketCanDriver.cpp nicht machen, wieso auch immer.

Danke Jürg für die neue can_progs Version.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Damu am 27 August 2020, 17:15:06
Hallo

Suche ein PICAN Modul das Galvanisch getrennt ist.
Habe nur ein Dual Modul gefunden:
https://buyzero.de/products/pican2-duo-isolated (https://buyzero.de/products/pican2-duo-isolated)
Finde kein Fertiges Modul so wie es Juerg5524 beschreibt.



Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: LDSign am 27 November 2020, 14:44:47
Hallo zusammen

Ich habe es tatsächlich geschafft mit der super Arbeit von Jürg und diesem Thread meine WPL mittels einem Pican anzubinden. Fhem dient hier nur als Bridge, denn ich nutze ioBroker auf einem weiteren Pi. Es läuft alles soweit :) Fhem kann die Werte auslesen und ioBroker bekommt sie mittels Telnet weitergereicht. Einzig eine Sache funktioniert nicht - ich kann das Aktualisieren der Werte jeweils nur manuell per get anstoßen (siehe Screenshot). Dann wird der jeweilige Wert auch sofort aktualisiert.

Wie bekomme ich es denn hin, dass Fhem diese bei Änderung automatisch erhält oder (als Workaround?) in einem bestimmten Interval abruft?

Bonusfrage: Warum sind diese Zeitstempel eigentlich rot? ;)

Gruß
Frank

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 02 Dezember 2020, 09:59:47
Hallo Frank,

ich bin ebenfalls über das Problem gestolpert, dass die Readings nicht automatisch aktualisiert werden. Ich habe etwas Entwicklungserfahrung und habe mir mal die 50_Elster.pm angesehen. Dort gibt es eine sub Elster_read() die das über ein singleReadingUpdate behandeln sollte. Hier habe ich einen Fehler entdeckt und korrigiert


sub Elster_Read($)
{
  my ($hash) = @_;
  my @cList = keys %Elster_gets;
 
  if ($sniffed_set != 1)
  {
    return;
  }
  my $buf = elster_perl::getsniffedvalue();
  while (length($buf) > 10)
  {
    my @arr = split /\s+/, $buf;
    my $recv_id = shift @arr;
    my $elster_idx = shift @arr;
    my $value = join(" ", @arr);
 
    #printf "elster_read_: $recv_id $elster_idx $value\n";
    $buf = elster_perl::getsniffedvalue();
    for my $key (@cList)
    {
      my $el = $Elster_gets{$key};
      if ($el)
      {
        #printf "id: $el->{ID} $el->{EIdx}\n";
        if ($el->{ID} == hex($recv_id) &&
            $el->{EIdx} == hex($elster_idx))
        {
          #printf "single update: $key $value\n";
          readingsSingleUpdate($hash, "$key", "$value", 1);
          last;
        }
      }
    }
    $buf = elster_perl::getsniffedvalue();
  }
  return;
}


Im If Statement werden leider hexWerte mit dezimal Werten verglichen und dadurch wird die readingsSingleUpdate Funktion nie aufgerufen.

Ich habe es mal angepasst und noch einen Check hinzugefügt, da bei mir die PUFFERTEMP_UNTEN1 ständig über den CAN Bus geht und mit das reading dauernd aktualisiert werden würde, obwohl der Value gleich ist.


sub Elster_Read($)
{
  my ($hash) = @_;
  my @cList = keys %Elster_gets;
  my $myTime = localtime();
 
  if ($sniffed_set != 1)
  {
    return;
  }
  my $buf = elster_perl::getsniffedvalue();
 
  while (length($buf) > 10)
  {
    #Log3 ($buf,3, "Buffer length > 10");
 
    my @arr = split /\s+/, $buf;
    my $recv_id = shift @arr;
    my $elster_idx = shift @arr;
    my $value = join(" ", @arr);
 
    my $newValue = 'id:' . $recv_id . ' idx:' . $elster_idx . ' val:' . $value;
   
    #printf "elster_read_: id: $recv_id  $hex_recv_id index: $elster_idx $hex_elster_idx value: $value\n";
    #printf "$oldValue \n";
 
    $buf = elster_perl::getsniffedvalue();
    for my $key (@cList)
    {
      my $el = $Elster_gets{$key};
      if ($el)
      {
        #printf "----------------> id: $el->{ID} hex($el->{ID}) $el->{EIdx} \n";
       
        if (hex($el->{ID}) == hex($recv_id) &&
            hex($el->{EIdx}) == hex($elster_idx) &&
            $oldValue ne $newValue )
        {
          #print strftime "%Y-%m-%d %H:%M:%S", localtime time;
          printf "$myTime single update: $key $value\n";
          $oldValue = $newValue;
          readingsSingleUpdate($hash, "$key", "$value", 1);
          last;
        }
      }
    }
    $buf = elster_perl::getsniffedvalue();
  }
  return;
}


Weiter oben habe ich noch eine globale Variable angelegt my $oldValue ='empty';

my $sniff = 0;
my $oldValue = 'empty';

#####################################################
# Elster_Initialize($)                              #
# Parameter hash                                    #
#####################################################
sub Elster_Initialize($)



Einfach die /opt/fhem/FHEM/50_Elster.pm mit meiner Version überschreiben, dann sollten die Readings automatisch aktualisiert werden, sobald sie auf dem CAN-Bus erscheinen

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: LDSign am 02 Dezember 2020, 10:28:04
Hallo Namensvetter :)

Wow sehr geil - vielen Dank! Ich habe es bei mir (vorerst) mit einem regelmäßigen Poll per

FHEM Update Command:
define WPL_UPDATE at +*00:00:10
get WPL HEIZKURVE;;
get WPL HZK_PUMPE;;
get WPL LAUFZEIT;;
get WPL PROGRAMMSCHALTER;;
get WPL SOLARBETRIEB;;
get WPL SOMMERBETRIEB;;
get WPL STATUS_HEIZKREIS;;
get WPL STATUS_KESSEL;;
get WPL STATUS_SPEICHER;;
get WPL STATUS_WP_PUMPEN;;
get WPL STATUS_WP;;
get WPL TEMP_AUSSEN;;
get WPL TEMP_HILFSKESSEL_SOLL;;
get WPL TEMP_KESSEL_SOLL;;
get WPL TEMP_MAX_WW;;
get WPL TEMP_PUFFER_SOLL;;
get WPL TEMP_RAUM_SOLL;;
get WPL TEMP_RAUM_SOLL_NACHT;;
get WPL TEMP_RUECKLAUF_IST;;
get WPL TEMP_SOLAR;;
get WPL TEMP_SPEICHER_UNTEN;;
get WPL TEMP_VORLAUF_IST;;
get WPL TEMP_WARMWASSER_IST;;
get WPL TEMP_WARMWASSER_SOLL;;
get WPL TEMP_WARMWASSER_SOLL_NACHT;;


"gelöst". Aber das hat sich schon bei der Umsetzung nicht richtig angefühlt ;) Aber es funktioniert immerhin...

Deine Lösung probiere ich mal aus - das wäre perfekt :)

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 30 Dezember 2020, 10:21:50
Hallo,

ich habe die Feiertage mal genutzt um meinen WPM4 weitere Daten zu entlocken. Die ElsterTablebe.inc habe ich um neue Adressen erweitert.

Nun kann ich die gesamten Prozessdaten der Wärmepumpe sehen
- WP_Volumenstrom
- Lufteintrittstemperatur
- Verdichter Frequenz
- Verdampfertemperatur
- Fortlufttemperratur
- WP Verdichter Starts
- ...

Dabei wurde ersichtlich, das der WPM4 an die CANID 100 die Anfrage sendet und dann die CAN ID 514 antwortet. Eine Anfrage auf der Kommandozeile mit ./can_scan can0 680 514.xxx erhielt ich ebenfalls meine Ergebnisse. Die ElsterTable.inc habe ich auch um die richtigen Datentypen erweitert.

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: intershopper am 08 Januar 2021, 16:14:51
Ich habe weitere Werte rechnerisch ermittelt:
Wärmstrom über den WP_WASSERVOLUMENSTOM l/min * 4,18/60 * (VLtemp -RLtemp)

WAERMELEISTUNG {
  sprintf("%.2f",(ReadingsVal($NAME,"WP_WASSERVOLUMENSTROM",0) * (4.18 / 60) * (ReadingsVal($NAME,"WPVORLAUFIST",0) -
  ReadingsVal($NAME,"RUECKLAUFISTTEMP_WP_IWS",0)))*1)
}

damit kann man in den Diagramm sehr schön die WärmeLeistung ablesen und mit der aufgenommen elektrischen Energie vergleichen. Ich greife die Leistung direkt vom Drehstromzähler ab und kann somit den realen COP errechnen.

COP_real = WAERMELEISTUNG / (aktuelle Leistung Drehstromzähler)

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Araktos am 06 Februar 2021, 16:11:32
Hallo zusammen,

ich bin recht frisch in der FHEM Welt, was Modulprogrammierung und Perl angeht. Ich habe aber schon länger die Programme von Jürg (can_prog) bei mir im Einsatz
und wollte dies nun auch in FHEM einbinden.

Mein Aufbau:
Ich habe eine Stiebel Eltron WPL18 als Außengerät, WPM2 mit einem Heizkreis. Ein RaspberryPi3 + PiCAN2 dient dabei als Schnittstelle. Hier ist auch FHEM installiert.
Da ich sporadisch Probleme mit der Anlage habe und nicht ständig in den Keller laufen wollte, habe ich mit den can_prog und der ComfortSoft
die Möglichkeit Fehler auszulesen und Daten aufzuzeichnen. 

FHEM läuft auch auf dem RaspPi und so kam auch das 50_Elster.pm Modul zur Installation. Die Änderungen und Anpassungen in diesem Forum wurden eingepflegt,
das Modul funktioniert... Mir ist aber aufgefallen das die Systemlast am RaspPi deutlich angestiegen ist.
Ich habe mich auf die Suche gegeben und das Modul 50_Elster.pm grundliegend geändert.

Das würde ich gerne hier vorstellen.

Vorher:
Das Modul registriert sich in der $readyfnlist und somit wird von FHEM die Elster_Ready($) aufgerufen. Diese Funktion soll nun die (fehlende) Verbindung aufbauen.
Da die Verbindung bereits in der Elster_Define($) aufgebaut wurde und die Elster_Ready($) nicht richtig beendet wird, bleibt es in dieser schleife...
Zusätzlich wird bei jeden durchlauf die Elster_Read($) aufgerufen, welche Daten vom C++ Wrapper empfängt und in Readings schreibt.
Bei vielen Readings geht das ordentlich auf die CPU. Interhopper hat dem bereits entgegengewirkt, indem nur Readings geschrieben werden,
die sich auch geändert haben. Das entlastet das System, da nicht mehr so viele events gefeuert werden.

Beschreibung (Nachher):
Das Modul wurde nun wie folgt angepasst, so dass es jetzt stabiler und Ressourcenschonender laufen sollte.
Das Modul verwendet nun einen Timer, welcher in regelmäßigen Abständen die Daten abholt. Der Timer lässt sich bei der Definition übergeben.
Define Heizung Elster can0 [Timer]
Dieser wird in Sekunden angegeben und ist optional. Wird kein Wert übergeben, so wird 10s als default angenommen. Das lässt sich unter DEF später auch noch ändern.

Nach dem hinzufügen versucht das Modul über den C++ Wrapper eine Verbindung aufzubauen. Gelingt dies, wird STATE=connected gesetzt und der Aktualisierungtimer wird gestartet.
Meldet das C++ Wrapper einen Fehler, wird nach 30s versucht die Verbindung erneuert aufzubauen. STAT wird solange auf disconnected gesetzt.

Steht die Verbindung, wird die Elster_Read($) (und noch weitere Funktionen) nach Ablauf des Timers aufgerufen und die Daten verarbeitet. Die Daten kommen so rein wie diese auf dem Bus auftauchen.
Wenn sehr viele Daten kommen, steigt auch hier die CPU last an, da ich den code von Interhopper wieder entfernt habe. Besser ist es, wenn wir das Attribut event-on-change-reading  [.*] setzen. Das hat den gleichen Effekt. Der Benutzer hat aber mehr Kontrolle...

Attribute:
Es sind auch Attribute hinzugekommen.

Weitere Funktionen

Das ist der aktuelle Stand.

ToDo´s:

Bei mir kann ich zurzeit keine Werte über den CAN Bus setzen, auch nicht über ComfortSoft.
Früher ging das.
Ich weiß noch nicht, woran das liegt. So ist die SET Funktion im Modul nicht getestet!!!

Ich hoffe das sich ein paar Leute finden, die das Modul aufspielen und Testen könnten. Freu mich auf Verbesserungsvorschläge oder Feedback.
Bitte beachtet das die Anleitungen die bei den can_progs beiliegen immer noch gültig sind und eventuell Anpassungen an dem Modul erfordern.

!!! Die Verwendung geschieht auf eigene Gefahr !!!

Gruß Niko.


Update

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Ratzefummel am 10 Februar 2021, 11:28:56
Hallo Araktos,

ich habe Deine neue 50_Elster.pm seit gestern Abend im Einsatz.
Das Modul funktioniert bisher einwandfrei und macht genau das, was Du beschrieben hast. GET-Werte werden dem Timer entsprechend abgefragt und neue Readings erscheinen, wenn man es so möchte. Die Fehler-Liste ist super übersichtlich und nützlich. Ich werde weiter ausgiebig testen.

Anregung: Nicht jeder Wert muss unbedingt im Timer-Takt abgefragt werden. Beim Fehlerspeicher z.B. würde mir ein tägliches Intervall genügen. Vielleicht könnte man dem autoPullReadings Attribut neben dem Namen noch ein Intervall mitgeben. Ohne Intervall in Attribut gilt der Timer des DEFINE.  Z.B. attr autoPullReadings Name1:60 Name2 Name3:360
Es würde reichen, wenn die Fehlerliste nur die Fehler anzeigt und nicht alle leeren Slots.

Klasse Arbeit. Hut ab!!! Ich bin begeistert.
Danke

Gruß Frank
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Araktos am 17 Februar 2021, 22:02:47
Hallo Ratzefummel,

vielen Dank für das Feedback.

Ich habe noch ein wenig weiter an dem Modul geschraubt und 2 weitere Funktionen hinzugefügt. Siehe oben in meinem Post.

Zu deinen Anregungen:
Die Funktionen _Fehlerliste, _Leistung, _Systemzeit sind von dem Intervall nicht betroffen. Allein bei der _Fehlerliste schon über 100 Werte gelesen werden, habe ich darauf verzichtet. Mein Gedanke war die Fehler über ein at einmal am Tag abzurufen, oder "händisch" im Device.
Ich habe auch entfernt, das leere Zeilen angezeigt werden.

Das gleiche gilt auch für die _Systemzeit und _Leistungsdaten.

Verschiedene Intervalle bei den verschiedenen Readings ist mit deutlich mehr Aufwand verbunden. Ich müsste für theoretisch unendlich viele Readings
Timer vorsehen und diese verwalten...
Wenn es dazu bedarf gibt, kann ich mich gerne damit beschäftigen :)

Als Workaroung verwende ich FHEM Funktionen, die im Modul schon vorhanden sind:
event-on-change-reading .*  -- um weniger Events zu erzeugen,
event-min-interval [reading:int]  -- hab ich selber nicht, soll aber das machen, was du oben gemeint hats,
DBLogExklusive .* / DBLogInclusive [reading:int], [reading:int], ..  -- für Readings die ich in eine Datenbank logge.

Ich bin auch immer für Vorschläge offen und lasse mich auch gerne umstimmen ;)


Ich habe auch in der ElsterTable.inc einige Fehler gefunden und korrigiert. Ich hänge diese Datei ebenfalls oben bei.

Da bin ich mir noch nicht ganz sicher, ob ich diese Dateien auch zum Download anbieten darf. Wenn du die dies Datei verwenden möchtest,
muss diese in das can_progs kopiert werden und dann alle programme neu kompiliert werden.
Auch das mit dem Scannen und Analysieren, muss erneuert gemacht werden...

Gruß Niko.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: N(Zgazucs am 19 März 2021, 09:34:54
Hallo,

ich bin neu hier und stoße wegen meiner Tecalor TSBC 200, TTL 15 ACS, WPM4 und FEK zu Euch. Dazu möchte ich mit Euch meine ersten Eindrücke zum CAN-Setup teilen. Fragen werden sicherlich in Zukunft von mir noch kommen.

Den CAN Bus zapfe ich z.Zt. direkt am FEK ab und nutze dazu einen Raspberry 4B mit PiCAN2 Erweiterung und Raspberry Pi OS Lite. Aussagen im Netz (https://forum-raspberrypi.de/forum/thread/46135-pican2-can-bus-auf-raspberry-pi-4/), dass PiCAN2 mit einem Raspberry 4 nicht funktioniert, sind falsch.

Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux


Unter Hinzufügen von

dtparam=spi=off
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi0-2cs


nach

/boot/config.txt

wird der PiCAN2 erkannt und mit dem Anlegen des can0 interfaces in

/etc/network/interfaces

mit folgendem Inhalt

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

# CAN-Bus
auto can0
iface can0 can static
  bitrate 50000


wird das can0 interface bei jedem Boot automatisch aktiviert. Ich bitte zu beachten, dass die hier im Forum kolportierte 20000 bit/s Baudrate bei mir nicht funktioniert und ich stattdessen 50000 bit/s Baudrate nutze.

Ein erster Scan mit CAN ID 780 brachte folgendes magere Ergebnis:

pi@raspberrypi:~/can_progs $ ./can_scan can0 780
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

list of valid can id's:

  100 (8000 = 502-02-)
  401 (8000 = 501-02-)
  500 (4604 = 70-04)



Das Nutzen der Sender CAN ID 680, welche ausdrücklich nicht für WPM3 empfohlen wird, war da ergiebiger:

pi@raspberrypi:~/can_progs $ ./can_scan can0 680
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

list of valid can id's:

  000 (8000 = not available)
  100 (8000 = 502-02-)
  180 (8000 = 449-04-)
  200 (8000 = 449-04-)
  201 (8000 = 449-04-)
  202 (8000 = 449-04-)
  301 (8000 = 449-04-)
  302 (8000 = not available)
  303 (8000 = not available)
  304 (8000 = 449-04-)
  401 (8000 = 501-02-)
  480 (8000 = 449-04-)
  500 (8000 = 446-04-)
  601 (8000 = 449-04-)
  602 (8000 = not available)
  603 (8000 = not available)
  604 (8000 = 449-04-)
  605 (8000 = 449-04-)
  606 (8000 = 449-04-)


Ein ausführlichen Scan habe ich mit scan.txt angehängt.

Die ersten Fragestellungen, die mich nun umtreiben sind:

Ich freue mich über Hilfestellung, ansonsten schaue ich mal wie weit ich selber komme und berichte dann hier.

Gruß
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Araktos am 21 März 2021, 23:51:32
Hallo N(Zgazucs,

ich habe mir dein scan mal in den Simulator geladen, aber seltsamerweise kann ComfortSoft keine Geräte finden.
Könnest du bei Gelegenheit aus ein scan mit der ID 780 machen. Vielleicht ist da was anders.

Ich habe im Code noch folgendes gefunden was eventuell helfen könnte:


...
my $direkt    = "000";
my $kessel    = "180";
my $bedien_1  = "301";
my $bedien_2  = "302";
my $manager   = "480";
my $heiz      = "500";
my $mischer_1 = "601";
my $mischer_2 = "602";
...


In der Elster Tabelle findet sich diesen Kommentar:

  { "SOFTWARE_VERSION"                                 , 0x019a, 0},
  { "SPEICHER_ZEIT_STATUS"                             , 0x019b, 0},
// HK1 Pumpe:         0x0001
// HK2 Punpe:         0x0002
// Mischer auf:       0x0004
// Mischer zu:        0x0008
// Quellenpumpe:      0x0010
// Solarpumpe:        0x0020
// 2. WE:             0x0040
// Zirkulationspumpe: 0x0080
  { "INFO_TYP"                                         , 0x019c, 0},
  { "MISCHERPARAMETER_ZU"                              , 0x019d, 0},
  { "WW_BETRIEB"                                       , 0x019e, 0},


Der Kommentar bezieht sich auf das Register 0x019c.
Wenn du die Zirkulationspumpe über das Panel ein und ausschalten kannst, würde ich das tun und diesen Wert beobachten.
Wenn es der richtige ist, sollte er sich ändern.
Danach kannst du versuchen über CAN den Wert zu setzen.

Gruß Niko.

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: N(Zgazucs am 22 März 2021, 16:02:11
Hi Niko,

danke für Dein erstes Feedback. Im Anhang findest Du die Scans mit der CAN ID 700 bzw. 780. Nach meinem ersten Eindruck stellen diese keine weiteren Informationen, über den Scan mit der CAN ID 680 heraus, bereit.

Soweit ich den Austausch hier im Thread und auch in anderen Foren verstanden habe, kann ComfortSoft mit WPM3 und neuer nicht umgehen.

Dein Vorschlag
{"INFO_TYP", 0x019c, 0}
zu nutzen, scheint vielversprechend zu sein. Im Moment resultiert das bei mir in 0x81 und könnte dazu passen, dass sowohl die HK1- und Zirkulationspumpe bei Abfrage eingeschaltet waren.

Allerdings um die Zirkulationspumpe damit an- oder auszuschalten, ist das vermutlich nicht der richtige Weg. "INFO TYP" lässt eher darauf schließen, dass man hier abfragen und nicht setzen/schreiben kann. Würde auch wenig Sinn machen, da man sonst unbeabsichtigt beim Schalten der Zirkulationspumpe die anderen Pumpenzustände überschreibt. Hier muss ich noch auf die Suche gehen, welcher Index der Richtige sein könnte. Das muss ich vermutlich mitsniffen, wenn ich am WPM die Pumpe schalte.

Ich bin weiterhin offen für weitere Vorschläge.

Gruß
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Araktos am 22 März 2021, 19:18:35
Hallo N(Zgazucs,

was mir gerade noch durch den Kopf ging:

Du hast schon recht der Index "INFO..." deutet auch eine Information hin :)
Andersrum, der Ausgang für die Zirkulationspumpe ist auf dem WPM. Würde ich das WPM Designen, würde ich den direkten Ausgang nicht über CAN schalten lassen...
Der Ausgang wird durch das Programm im WPM geschaltet. Die Uhrzeiten sollten aber über CAN gesetzt werden können.

Was ist wen du die Zeiten setzt und der Rest macht der WPM3?

Gruß Niko.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: N(Zgazucs am 22 März 2021, 20:57:42
Exakt Niko,

das ist auch das was mir vorschwebt, nur ein bisschen angepasst. Ich programmiere die Zeiten der Zirkulationspumpe durchgängig 24 Stunden am Tag und schalte dann entsprechend der WPM Einstellungen

Zirkulationspumpe Aus
bzw.
Zirkulationspumpe Programm

Ich werde weiter berichten, sobald ich mal Zeit habe die Befehle am Raspy mitzuschneiden, während ich die Befehle am WPM auslöse.

Ein weiteres Problem ist bei mir auch noch das Auslesen der relativen Luftfeuchte und Raumtemperatur meiner Fernbedienung FET. Da weiß ich noch nicht, wie ich am Besten vorgehe :-(

Gruß
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: N(Zgazucs am 23 März 2021, 19:09:17
So langsam laufe ich mich warm.

Wem es hilft, die relative Luftfeuchte und die Raumtemperatur des FEKs bekommt man über

  { "RAUMTEMPERATUR_FEK"                               , 0x4ec7, et_dec_val},
  { "LUFTFEUCHTE_FEK"                                  , 0x4ec8, et_dec_val},


Das FEK hat bei mir die CAN ID 401.

./can_scan can0 680 401.4ec7
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

value: 00d2  (RAUMTEMPERATUR_FEK  21.0)


./can_scan can0 680 401.4ec8
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

value: 021e  (LUFTFEUCHTE_FEK  54.2)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: momad am 12 Mai 2021, 13:21:33
Hallo zusammen,

auch bei mir klappt alles wunderbar , siehe unten  :)
Schreiben (SET) klappt auch bisher getestet nur RAUMSOLL.
Lässt sich eigentlich den SG Ready Modus (PV Anlage Überschuss nutzen) hier auch via CAN-BUS ansteuern?
Falls ja hat es jemanden bereits probiert und welches Wert sollte hierfür aktiviert werden?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 02 Dezember 2021, 20:43:21
Hallo zusammen.
Ich bin neu hier im Forum und hab mir ein Projekt vorgenommen, meine Stiebel Eltron WPF 07 in die Haussteuerung zu integrieren.
Dazu bin ich sehr schnell auf die Seite juerg5524.ch gestoßen und letztendlich in diesem Forum gelandet.

Mein Vorhaben ist, einen ESP32 Microcontroller mit einem MCP2515 auszustatten.
Dieser wird vom fertigen ESP-Home Projekt (https://esphome.io/components/canbus.html) supportet.
Und das ESP-Home Projekt ist wiederum ausgezeichnet im Home-Assistant (https://www.home-assistant.io/) integriert.
Mein Home-Assistant erlaubt mir, meine KNX-Haussteuerung zu regeln und z.B. Heizungsstellwerte zu kontrollieren oder Temperatur-Regler zu steuern.
Über ESP-Home habe ich auch Bodentemperaturfühler eingebunden und die Daten werden via Home Assistant an den KNX Heizungsregler gesendet.

Die wesentliche Arbeit für mich ist also zunächst mich gründlich Einzulesen, den ESP32 an den CAN-Bus der Heizung zu hängen und hoffentlich Daten über ESP-Home zu scannen und an den HomeAssistant zu übermitteln. Vorteil an der ganzen Sache: Die Anzeige der Daten, die ich von der Heizung erhalte übernimmt der Home Assistant in der fertigen Webanwendung.
Außerdem ist der ESP32 preislich unschlagbar günstig.
Auf der Seite von Jürg habe ich ein Paket mit dem Beinamen ESP32 gefunden aber leider noch keine näheren Infos dazu entdeckt.
Wie weit ist denn das Projekt schon fortgeschritten? Wo gibt es nähere Infos dazu? Oder hat schon jemand etwas ähnliches umgesetzt?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 05 Dezember 2021, 21:42:14
Hallo robob,

ich nutze ESPHOME mit einem ESP8266 und lese damit seit einigen Tagen die Daten aus meiner Stiebel Eltron Wärmepumpensteuerung aus und visualisiere sie in Home Assistant.
Das funktioniert mittlerweile gut.

Wir scheinen uns sehr gut zu ergänzen, denn als nächsten Schritt möchte ich gerne einen KNX Fussbodenheizungsregler einsetzen und habe auch schon so wie Du überlegt, einen ESPHome Temperatursensor zu verwenden, denn der ist ja deutlich günstiger als die KNX Lösungen.

Ich poste hier einfach mal meine Esphome Configuration, welche noch recht chaotisch ist, denn als Python Programmierer kenne ich eigentlich keinen Switch Case  ;):

globals:
  - id: el_aufnahmeleistung_ww_tag_wh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_tag_wh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_ww_tag_kwh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_tag_kwh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_wh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_wh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_kwh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_kwh_flag
    type: bool
    restore_value: yes 
  - id: el_aufnahmeleistung_ww_total_kWh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_kWh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_mWh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_mWh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_kWh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_kWh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_mWh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_mWh_flag
    type: bool
    restore_value: yes

sensor:
  - platform: template
    name: "Außentemperatur"
    id: temperature_kitchen
    unit_of_measurement: "°C"
    icon: "mdi:water-percent"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
  - platform: template
    name: "Stromverbrauch Warmwasser heute"
    id: daily_electric_energy_water
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "measurement"
    accuracy_decimals: 3
  - platform: template
    name: "Stromverbrauch Heizung heute"
    id: daily_electric_energy_heating
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "measurement"
    accuracy_decimals: 3   
  - platform: template
    name: "Stromverbrauch Warmwasser total"
    id: total_electric_energy_water
    unit_of_measurement: "mWh"
    device_class: "energy"
    state_class: "measurement"
    accuracy_decimals: 3
  - platform: template
    name: "Stromverbrauch Heizung total"
    id: total_electric_energy_heating
    unit_of_measurement: "mWh"
    device_class: "energy"
    state_class: "measurement"
    accuracy_decimals: 3
   
binary_sensor:
  - platform: template
    name: "EVU Sperre"
    id: "evu_lock"
 
time:
  - platform: homeassistant
    id: homeassistant_time
    on_time:
     
      - seconds: 50
        then:
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x1c,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x1d,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x20,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x21,0x00,0x00 ]
              can_id: 0x680
          - delay: 10s
          - lambda: |-
              if (id(el_aufnahmeleistung_ww_total_mWh_flag) and id(el_aufnahmeleistung_ww_total_kWh_flag)){
              id(el_aufnahmeleistung_ww_total_mWh) += id(el_aufnahmeleistung_ww_total_kWh_float);
              id(total_electric_energy_water).publish_state(id(el_aufnahmeleistung_ww_total_mWh));
              };
              id(el_aufnahmeleistung_ww_total_mWh_flag)=false;
              id(el_aufnahmeleistung_ww_total_kWh_flag)=false;
          - lambda: |-
              if (id(el_aufnahmeleistung_heiz_total_mWh_flag) and id(el_aufnahmeleistung_heiz_total_kWh_flag)){
              id(el_aufnahmeleistung_heiz_total_mWh) += id(el_aufnahmeleistung_heiz_total_kWh_float);
              id(total_electric_energy_heating).publish_state(id(el_aufnahmeleistung_heiz_total_mWh));
              };
              id(el_aufnahmeleistung_heiz_total_mWh_flag)=false;
              id(el_aufnahmeleistung_heiz_total_mWh_flag)=false;       

          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x1b,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x1a,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x1e,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x09,0x1f,0x00,0x00 ]
              can_id: 0x680
          - delay: 10s
          - lambda: |-
              if (id(el_aufnahmeleistung_ww_tag_kwh_flag) and id(el_aufnahmeleistung_ww_tag_wh_flag)){
              id(el_aufnahmeleistung_ww_tag_kwh) += id(el_aufnahmeleistung_ww_tag_wh_float);
              id(daily_electric_energy_water).publish_state(id(el_aufnahmeleistung_ww_tag_kwh));
              };
              id(el_aufnahmeleistung_ww_tag_kwh_flag)=false;
              id(el_aufnahmeleistung_ww_tag_wh_flag)=false;
          - lambda: |-
              if (id(el_aufnahmeleistung_heiz_tag_kwh_flag) and id(el_aufnahmeleistung_heiz_tag_wh_flag)){
              id(el_aufnahmeleistung_heiz_tag_kwh) += id(el_aufnahmeleistung_heiz_tag_wh_float);
              id(daily_electric_energy_heating).publish_state(id(el_aufnahmeleistung_heiz_tag_kwh));
              };
              id(el_aufnahmeleistung_heiz_tag_kwh_flag)=false;
              id(el_aufnahmeleistung_heiz_tag_wh_flag)=false;
          - canbus.send:
              data: [ 0xa1, 0x14, 0xfa,0x00,0x74,0x00,0x00 ]
              can_id: 0x680
          - lambda: |-
              ESP_LOGD("main", "EVU Sperre requested");
       
spi:
  id: McpSpi
  clk_pin: GPIO16
  mosi_pin: GPIO5
  miso_pin: GPIO4

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO14
    can_id: 4
    bit_rate: 20kbps
    on_frame:
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xA0 and x[1]==0x79 and x[2]==0x0C) {
              float temperature =float(float((int((x[4])+( (x[3])<<8))))/10);
              id(temperature_kitchen).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }
    - can_id: 0x514
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09) {
              if(x[4]==0x1b){
              id(el_aufnahmeleistung_ww_tag_kwh) =float(int((x[6])+( (x[5])<<8)));
              id(el_aufnahmeleistung_ww_tag_kwh_flag)=true;
              ESP_LOGD("main", "el_aufnahmeleistung_ww_tag_kwh received over can is %f", id(el_aufnahmeleistung_ww_tag_kwh));}
              else if(x[4]==0x1f){
                id(el_aufnahmeleistung_heiz_tag_kwh) =float(int((x[6])+( (x[5])<<8)));
                id(el_aufnahmeleistung_heiz_tag_kwh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_tag_kwh received over can is %f", id(el_aufnahmeleistung_heiz_tag_kwh));}
              else if(x[4]==0x1d){
              id(el_aufnahmeleistung_ww_total_mWh) =float(int((x[6])+( (x[5])<<8)));
              id(el_aufnahmeleistung_ww_total_mWh_flag)=true;
              ESP_LOGD("main", "el_aufnahmeleistung_ww_total_mWh received over can is %f", id(el_aufnahmeleistung_ww_total_mWh));}
              else if(x[4]==0x21){
                id(el_aufnahmeleistung_heiz_total_mWh) =float(int((x[6])+( (x[5])<<8)));
                id(el_aufnahmeleistung_heiz_total_mWh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_total_mWh received over can is %f", id(el_aufnahmeleistung_heiz_total_mWh));}
            }

    - can_id: 0x514
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09) {
              if (x[4]==0x1a){
                id(el_aufnahmeleistung_ww_tag_wh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_ww_tag_wh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_ww_tag_kwh received over can is %f", id(el_aufnahmeleistung_ww_tag_wh_float));}
              else if (x[4]==0x1e){
                id(el_aufnahmeleistung_heiz_tag_wh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_heiz_tag_wh_flag) = true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_tag_wh received over can is %f", id(el_aufnahmeleistung_heiz_tag_wh_float));}
              else if (x[4]==0x1c){
                id(el_aufnahmeleistung_ww_total_kWh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_ww_total_kWh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_ww_total_kkWh received over can is %f", id(el_aufnahmeleistung_ww_total_kWh_float));}
              else if (x[4]==0x20){
                id(el_aufnahmeleistung_heiz_total_kWh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_heiz_total_kWh_flag) = true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_total_kWh received over can is %f", id(el_aufnahmeleistung_heiz_total_kWh_float));}
              }
              if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x00 and x[4]==0x74){
              if(x[5]==0x80 and x[6]==0x00){
                id(evu_lock).publish_state(false);
                }
              else{
                id(evu_lock).publish_state(true);
              };
            };
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 05 Dezember 2021, 21:51:53
Zitat von: momad am 12 Mai 2021, 13:21:33
Hallo zusammen,

auch bei mir klappt alles wunderbar , siehe unten  :)
Schreiben (SET) klappt auch bisher getestet nur RAUMSOLL.

Hallo author=momad, Dein Screenshot sieht so aus als wäre er von Home Assistant. Wenn dem so ist, könntest Du einmal beschreiben, wie Du das technisch gelöst hast?

Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 06 Dezember 2021, 16:46:27
Hallo Vincent,

klar, gerne gebe ich unten Hinweise zu den Temperaturfühlern.
Woher weiß ich, welche Adresse mein FEK bzw. meine Heizung hat?
Nutzt du auch einen Pegelwandler wie bei ESPHome (https://esphome.io/components/canbus.html?highlight=can#mcp2515-component) empfohlen, oder betreibst du deinen Aufbau ohne Pegelwandler?
Könntest du evtl. Fotos von deinem Aufbau schicken?
Ich möchte bei der Heizung nichts kaputt machen.
Danke für die Config. Langsam komme ich dahinter, mit dem File "Telegramm-Aufbau.txt" von Jürg.




Ich nutze als Temperatursensoren die DS18B20 (1-wire).
Die gibt es z.B. bei Amazon oder dem Onlinehändler der Wahl Edelstahlummantelt mit entsprechendem Kabel.
Die Sensoren habe ich im Estrich verlegt, indem ich an ein Ende eines Kabelschlauches eine passende Kupferhülse verlegt hab. Damit der Fühler auch tatsächlich die Estrichtemperatur misst, hab ich etwas Graphitpaste als Wärmeleitpaste in die Endhülsen gegeben.
Hier ein Link zu den Kupferhülsen: https://www.etherma.com/de/produkte/26881

Die DS18B20 lassen sich über 1-wire parasitär betreiben und haben eine eigene Adresse für den seriellen Bus. Man kommt also mit 2 Adern aus.
Die Fühler werden auf der ESP-Home Seite ganz gut beschrieben inklusive Beispielcode: https://esphome.io/components/sensor/dallas.html

Wichtig ist folgender Eintrag, der den jeweiligen verwendeten Pin beschreibt:

dallas:
  - pin: GPIO4


Und dann noch die Beschreibung der Sensoren mit der jeweiligen Adresse.
Die Adresse bekommt man raus, indem man die Fühler zunächst ohne Adressangabe betreibt und sich das Logfile ansieht.
Diese ist v.a. wichtig, wenn mehrere Fühler am gleichen Gerät hängen.

sensor:
  - platform: dallas
    address: 0x11012032E38A2028
    name: "T.HzgVorlaufDG"
  - platform: dallas
    address: 0x17012032C8D95828
    name: "T.HzgRücklaufDG"


Einmal konfiguriert erscheinen die Fühler normalerweise direkt im Home-Assistant.
Vom Home-Assistant übertrage ich die Fühlertemperaturen dann an den KNX-Bus, indem ich in der config.yaml den Abschnitt "expose" wie folgt editiere

    expose:

      - type: 'temperature'
        entity_id: 'sensor.t_hzgvorlaufdg'
        address: '3/0/5'

      - type: 'temperature'
        entity_id: 'sensor.t_hzgrucklaufdg'
        address: '3/0/6'


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 07 Dezember 2021, 22:33:53
Hallo robob,

Fotos ist gerade schlecht, weil alles gut verbaut ist. Hier ist das aber gut dargestellt: https://elkement.wordpress.com/2016/08/24/hacking-my-heat-pump-part-2-logging-energy-values/
Aber das Einzige, was Du machen musst, ist CAN High und CAN Low vom MCP2515 anschließen. Ground habe ich entgegen des Beispiels nicht angeschlossen, sollte auch nicht nötig sein.
Vergesse, nicht den Jumper für den Abschlusswiderstand am MCP2515 zu entfernen.

Da ich die Komponenten eigentlich für was Anderes einsetzen wollte, wo kein Platz war für den Pegelwandler arbeite ich mit der Variante ohne Pegelwandler.

Du siehst die Adressen (welche bei dem Protokoll ja anscheinend die CAN ID´s sind), wenn Du den CAN Konfigurierst und Dir dann den Log Output anschaust. Es werden da scheinbar alle Nachrichten im Log ausgegeben.


Wie in der Config zu entnehmen ist, sende ich auf ID 0x680. Ob das immer richtig und gut ist weiß ich nicht.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 12 Dezember 2021, 13:04:07
So mein ESP-WROOM-32 hängt jetzt via MCP2515 an meiner Heizung.
Hier ist das Pinout-Diagramm dazu:
http://esp32.net/images/Magic-Cauldron/ESP-WROOM-32-Breakout/Magic-Cauldron_ESP-WROOM-32-Breakout_V2.0a_DiagramPinout.png (http://esp32.net/images/Magic-Cauldron/ESP-WROOM-32-Breakout/Magic-Cauldron_ESP-WROOM-32-Breakout_V2.0a_DiagramPinout.png)

Ursprünglich wollte ich über den DC-DC-Konverter die Spannung direkt bei meiner Heizung abgreifen. Aber dann fällt das Heizungsdisplay aus.
Also hab ich das jetzt doch via USB-Stecker gelöst.

Unten angehängt ein paar Bilder.
Und hier die Einstellungen die ich an der ESP-Home Config verwende - der Rest ist derzeit gleich wie bei Vincent und muss noch mit den CAN-IDs an meine Umgebung angepasst werden.

spi:
  id: McpSpi
  clk_pin: GPIO23
  mosi_pin: GPIO22
  miso_pin: GPIO21

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO19
    can_id: 4
    bit_rate: 20kbps
    on_frame:


Was mich dazu vor allem interessiert: Ich erhalte offenbar Pakete von 6 verschiedenen CAN-IDs?!
100, 180, 301, 480, 514, 700
Woher kommt das und woher weiß ich, welche CAN-ID von der Heizung oder von der FEK-Fernbedienung kommt?
Weiters bekomme ich die falschen Werte für den Stromverbrauch.

[12:47:11][D][canbus:066]: received can message std can_id=0x100 size=7
[12:47:11][D][canbus:066]: received can message std can_id=0x180 size=7
[12:47:11][D][canbus:066]: received can message std can_id=0x301 size=7
[12:47:12][D][sensor:121]: 'Stromverbrauch Heizung heute': Sending state 32800.76953 kWh with 3 decimals of accuracy
[12:47:12][D][canbus:032]: send extended id=0x680 size=7
[12:47:12][D][main:193]: EVU Sperre requested
[12:47:12][D][canbus:066]: received can message std can_id=0x514 size=7
[12:47:12][D][canbus:066]: received can message std can_id=0x480 size=7
[12:47:12][D][canbus:066]: received can message std can_id=0x700 size=7
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 14 Dezember 2021, 21:24:45
So,
ich hab jetzt an alle Adressen die im Log angezeigt werden eine Anfrage für einen Wert aus der Elster-Tabelle gesendet.
Ich bekomme eine Antwort von id514 bzw. id 51e. Aber der Wert stimmt nicht mit der am Display gezeigten Leistung an der Heizung überein.


     
spi:
  id: McpSpi
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO15
    can_id: 680
    use_extended_id: false
    bit_rate: 20kbps
    on_frame:

    - can_id: 0x100
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID100: %f", wert);
            }

    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID180: %f", wert);
            }


    - can_id: 0x301
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID301: %f", wert);
            }
           
    - can_id: 0x401
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x4e and x[4]==0xc7) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID401 - Bedienteil: %f", wert);
            }
    - can_id: 0x402
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x4e and x[4]==0xc7) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID401 - Bedienteil: %f", wert);
            }
           
    - can_id: 0x480
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID480: %f", wert);
            }


    - can_id: 0x504
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID504: %f", wert);
            }

    - can_id: 0x514
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID514: %f", wert);
            }

    - can_id: 0x700
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09 and x[4]==0x1c) {
              float wert =float(float((int((x[4])+( (x[3])<<8))))/10);
              ESP_LOGD("main", "Antwort von ID301: %f", wert);
            }



Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 15 Dezember 2021, 20:48:23
Hmm ich weiß nicht ob es Dir bewusst ist aber die Stellen vor dem Komma und nach dem Komma kommen als eigene CAN Nachrichten als Signed 16 bit werte. Die baue ich dann im Nachgang zusammen wie das Display es macht. Läuft hier vielleicht was schief?

...und ich sehe in Deiner Konfig gar keine Anfragen. Schau in meinem Code wie ich Anfragen sende.

Die Werte der Leistungsaufnahmen kommen alle an der CAN ID 0x514. Ich sehe nach einer Anfrage die ID´s aus der Elster Tabelle mehrfach auf dem CAN. Es scheint als reicht ein Teilnehmer die Anfrage immer weiter.

Es scheint also für angefragte Werte nur die Antwort der ID 0x514 relevant zu sein. Bitte schaue Dir noch mal meinen (zugegebenermaßen noch recht chaotischen) Code an.

Noch ein Thema. Hier wird die elektrische Leistungsaufnahme geloggt, nicht die erzeugte Wärmemenge. Vertauscht Du vielleicht die Werte?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 15 Dezember 2021, 20:53:14
...und noch was. Die Protokollbeschreibung angehängt am Ticket habe ich mal im Netz gefunden. Das Adressen stimmen nicht mit denen bei mir überein aber man bekommt eine Idee, welche Teilnehmer es so gibt.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 16 Dezember 2021, 17:48:41
Hi,
danke für die Liste.
Hier der aktuelle Status:
Ich habe die Kontakte umgelötet auf Pins, die lt. einer Spezifikationstabelle empfohlen werden.
Das mit den Adressen verstehe ich inzwischen einigermaßen. Allerdings - wie errechnet sich z.B. die Adresse 69E bzw. 6A0 für das CAN-Bus Paket?
Und ich hab sowohl die Werte vom Stromverbrauch als auch die der Warmwasserleistung verglichen. Ich erhalte immer die gleiche Antwort.
Was ich noch nicht verstanden habe - ich habe zwar gesehen, dass du in deinem Code die Hex-Werte in der if-Anweisung vergleichst.
Aber ich hab noch nicht verstanden, wie sich die Werte berechnen. Mir fehlen da einige Basics beim Programmiercode.
Was bedeutet <<8?

Sorry wegen meinem Code oben - ich hab den einige Male bearbeitet. Da dürfte sich der falsche reingeschummelt haben.

Ich habe inzwischen den MCP2515 an ein NI USB-8473 in der Garage gehängt um mitzuprotokollieren.
Der funktioniert zwar nur mit 125kbs, aber ich sehe dann wenigstens was beim Sendevorgang passiert:
Beim Senden der folgenden Anfragen im Code sehe ich nur zwei Einträge in der Log-Ausgabe am NI Device. Nämlich den mit der Sende-ID 0x100 (4E C7) und den mit der Sende-ID 0x780 (09 20). Die anderen beiden Pakete werden nicht gelogged. Woran könnte das liegen?
Ich hab auch schon versucht ein Delay von 1000 ms dazwischen zu hängen - gleiches Resultat.
Und ich kann auch Pakete vom NI-Device an mein MCP2515 senden. Ich sehe dann die Pakete auch im Logscreen.



time:
  - platform: homeassistant
    id: homeassistant_time
    on_time:
     
      - seconds: /10
        then:
          - canbus.send:
              data: [ 0x61, 0x11, 0xfa,0x4e,0x20,0x00,0x00 ]
              can_id: 0x100

          - canbus.send:
              data: [ 0x61, 0x12, 0xfa,0x4e,0xc7,0x00,0x00 ]
              can_id: 0x100

         
         

          - canbus.send:
              data: [ 0xa1, 0x1e, 0xfa,0x09,0x1c,0x00,0x00 ]
              can_id: 0x780


          - canbus.send:
              data: [ 0xa1, 0x1e, 0xfa,0x09,0x20,0x00,0x00 ]
              can_id: 0x780




Ich hab jetzt die Config so angepasst, dass ich alle Pakete von den Adressen die so herumschwirren als HEX-Wert ausgebe.
Ich frage die Werte 0126 (=Uhrzeit - Minute), 092d (= WM WW Summe) sowie 0931 (=WM Heizen Summe) ab.
Zumindest die Minuten müssten sich nach einiger Zeit ändern.
Unten die Config und ein Auszug aus dem Logfile.
Auffallend ist vor allem, dass ich als Antwort immer 80 00 als Antwort-Wert empfange.

captive_portal:



time:
  - platform: homeassistant
    id: homeassistant_time
    on_time:
     
      - seconds: /10
        then:

          - canbus.send:
              data: [ 0xa1, 0x1e, 0xfa,0x09,0x31,0x00,0x00 ]
              can_id: 0x780
          - delay: 200ms


          - canbus.send:
              data: [ 0xa1, 0x1e, 0xfa,0x09,0x2d,0x00,0x00 ]
              can_id: 0x780
          - delay: 200ms

          - canbus.send:
              data: [ 0xa1, 0x1e, 0xfa,0x01,0x26,0x00,0x00 ]
              can_id: 0x780
          - delay: 200ms



       
spi:
  id: McpSpi
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO15
    can_id: 780
    use_extended_id: false
    bit_rate: 20kbps
    on_frame:


    - can_id: 0x100
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGD("main", "Antwort von 100 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);

    - can_id: 0x180
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGD("main", "Antwort von 180 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);

    - can_id: 0x301
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGD("main", "Antwort von 301 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);

    - can_id: 0x480
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGD("main", "Antwort von 480 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);

    - can_id: 0x514
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGD("main", "Antwort von 514 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);

    - can_id: 0x51e
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGI("main", "Antwort von 51e Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);

    - can_id: 0x700
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              ESP_LOGD("main", "Antwort von 700 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);






[18:56:28][D][main:158]: Antwort von 700 Hex: 92 0 fa fe 4c 0 12
[18:56:30][D][canbus:032]: send extended id=0x780 size=7
[18:56:30][D][canbus:066]: received can message std can_id=0x51e size=7
[18:56:30][I][main:146]: Antwort von 51e Hex: f2 0 fa 9 31 80 0
[18:56:30][D][canbus:032]: send extended id=0x780 size=7
[18:56:30][D][canbus:066]: received can message std can_id=0x51e size=7
[18:56:30][I][main:146]: Antwort von 51e Hex: f2 0 fa 9 2d 80 0
[18:56:30][D][canbus:032]: send extended id=0x780 size=7
[18:56:30][D][canbus:066]: received can message std can_id=0x51e size=7
[18:56:30][I][main:146]: Antwort von 51e Hex: f2 0 fa 1 26 80 0
[18:56:31][D][canbus:066]: received can message std can_id=0x480 size=7
[18:56:31][D][main:122]: Antwort von 480 Hex: e0 0 fa fe 1e 0 0
[18:56:31][D][canbus:066]: received can message std can_id=0x700 size=7
[18:56:31][D][main:158]: Antwort von 700 Hex: 92 0 fa fe 1e 0 0
[18:56:33][D][canbus:066]: received can message std can_id=0x480 size=7
[18:56:33][D][main:122]: Antwort von 480 Hex: e1 0 fa fe 4c 0 0
[18:56:33][D][canbus:066]: received can message std can_id=0x480 size=7
[18:56:33][D][main:122]: Antwort von 480 Hex: e1 0 fa fd f3 0 0
[18:56:33][D][canbus:066]: received can message std can_id=0x480 size=7
[18:56:33][D][main:122]: Antwort von 480 Hex: e1 0 fa fe 7 0 0
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 16 Dezember 2021, 21:18:39
In diesem Forum https://community.symcon.de/t/stiebel-eltron-waermepumpe-wpl13-und-canbus-abfrage/37485/7 (https://community.symcon.de/t/stiebel-eltron-waermepumpe-wpl13-und-canbus-abfrage/37485/7)
wird erklärt dass häufig auch die Adresse 180 zum Auslesen verwendet wird.

Ich konnte jetzt mit Hilfe Anpassung des obigen Codes via Anfrage an Adresse 180 (0x31, 0x00, 0xfa,0x01,0x26,0x00,0x00) die Uhrzeit-Minuten ablesen. Außerdem sind die Werte für Wärmemenge VD Heizen Summe auf die MWh genau übereinstimmend mit den Werten aus der Heizung.
Langsam komme ich der Sache näher.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 17 Dezember 2021, 15:49:36
Ok, dann gibt es wohl andere Versionen der Steuerung, wo man mit 0x180 statt 0x680 anfragen muss.

Zur Frage was bedeutet <<8? Die ESPHhome lib gibt den Payload der Nachricht ja als C++ Vektor mit einem Element pro Byte zurück. Den Payload muss ich ja dann zu den Signed Int 16 (=2Byte) Variablen umwandeln. Mit <<8 sagt man, dass man die Variable ab bit 8 beschreiben will.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 19 Dezember 2021, 11:39:33
Danke, die Erklärung hat mehr als geholfen.

Ich hab deine Config ein bisschen erweitert auf die anderen fehlenden Wärme-Ertragsdaten.
Auskommentiert hab ich darin noch u.a. die Anfragen für die Verdichter-Laufzeiten.
Da kommt bei mir von der ID 180 keine passende Antwort. Und ich konnte auch sonst keine ID finden die ein Antwortpaket sendet.

Die Luftfeuchtigkeit und Raumtemperatur brauche ich nicht aktiv von der FEK abzufragen - die kommt bei mir alle paar Minuten von der ID 301 und wird an ID 601 als Änderung gesendet.
(Paket C0 01 75 xx xx bzw. C0 01 11 xx xx)
Etwas sorgen macht mir noch, dass im Homeassistant der Aufruf des Sensor-Zustandsverlaufs - z.B. Temperaturverlauf - mehrere Minuten dauert bis alles angezeigt wird.
Ich weiß nicht woran das liegt. Hast du auch das Problem beim Zustandsverlauf?
Hier der Code:


captive_portal:

globals:
  - id: el_aufnahmeleistung_ww_tag_wh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_tag_wh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_ww_tag_kwh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_tag_kwh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_wh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_wh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_kwh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_tag_kwh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_kWh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_kWh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_mWh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_ww_total_mWh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_kWh_float
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_kWh_flag
    type: bool
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_mWh
    type: float
    restore_value: yes
  - id: el_aufnahmeleistung_heiz_total_mWh_flag
    type: bool
    restore_value: yes


  - id: waermemertrag_ww_tag_wh_float
    type: float
    restore_value: yes
  - id: waermemertrag_ww_tag_wh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_ww_tag_kwh
    type: float
    restore_value: yes
  - id: waermemertrag_ww_tag_kwh_flag
    type: bool
   
  - id: waermemertrag_electr_ww_tag_wh_float
    type: float
    restore_value: yes
  - id: waermemertrag_electr_ww_tag_wh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_electr_ww_tag_kwh
    type: float
    restore_value: yes
  - id: waermemertrag_electr_ww_tag_kwh_flag
    type: bool   
    restore_value: yes

  - id: waermemertrag_heiz_tag_wh_float
    type: float
    restore_value: yes
  - id: waermemertrag_heiz_tag_wh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_heiz_tag_kwh
    type: float
    restore_value: yes
  - id: waermemertrag_heiz_tag_kwh_flag
    type: bool
    restore_value: yes

  - id: waermemertrag_electr_heiz_tag_wh_float
    type: float
    restore_value: yes
  - id: waermemertrag_electr_heiz_tag_wh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_electr_heiz_tag_kwh
    type: float
    restore_value: yes
  - id: waermemertrag_electr_heiz_tag_kwh_flag
    type: bool
    restore_value: yes

  - id: waermemertrag_ww_total_kWh_float
    type: float
    restore_value: yes
  - id: waermemertrag_ww_total_kWh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_ww_total_mWh
    type: float
    restore_value: yes
  - id: waermemertrag_ww_total_mWh_flag
    type: bool
    restore_value: yes

  - id: waermemertrag_heiz_total_kWh_float
    type: float
    restore_value: yes
  - id: waermemertrag_heiz_total_kWh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_heiz_total_mWh
    type: float
    restore_value: yes
  - id: waermemertrag_heiz_total_mWh_flag
    type: bool
    restore_value: yes

  - id: waermemertrag_electr_heiz_total_kWh_float
    type: float
    restore_value: yes
  - id: waermemertrag_electr_heiz_total_kWh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_electr_heiz_total_mWh
    type: float
    restore_value: yes
  - id: waermemertrag_electr_heiz_total_mWh_flag
    type: bool
    restore_value: yes

  - id: waermemertrag_electr_ww_total_kWh_float
    type: float
    restore_value: yes
  - id: waermemertrag_electr_ww_total_kWh_flag
    type: bool
    restore_value: yes
  - id: waermemertrag_electr_ww_total_mWh
    type: float
    restore_value: yes
  - id: waermemertrag_electr_ww_total_mWh_flag
    type: bool
    restore_value: yes




sensor:
  - platform: template
    name: "Außentemperatur"
    id: temperature_outside
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1

  - platform: template
    name: "Quellentemperatur"
    id: temperature_source
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1

  - platform: template
    name: "Warmwassertemperatur"
    id: temperature_water
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1

  - platform: template
    name: "Vorlauftemperatur Heizung"
    id: temperature_forerun
    unit_of_measurement: "°C"
    icon: "mdi:waves-arrow-right"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
  - platform: template
    name: "Heizkreis Vorlauf"
    id: temperature_forerun_heating
    unit_of_measurement: "°C"
    icon: "mdi:waves-arrow-right"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1


  - platform: template
    name: "Rücklauftemperatur Heizung"
    id: temperature_return
    unit_of_measurement: "°C"
    icon: "mdi:waves-arrow-left"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1

  - platform: template
    name: "Luftfeuchtigkeit Wohnraum"
    id: humidity_inside
    unit_of_measurement: "%rH"
    icon: "mdi:water-percent"
    device_class: "humidity"
    state_class: "measurement"
    accuracy_decimals: 1
  - platform: template
    name: "Temperatur Wohnraum"
    id: temperature_inside
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
  - platform: template
    name: "Stromverbrauch Warmwasser heute"
    id: daily_electric_energy_water
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "measurement"
    accuracy_decimals: 3
    icon: "mdi:transmission-tower"
  - platform: template
    name: "Stromverbrauch Heizung heute"
    id: daily_electric_energy_heating
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "measurement"
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3   
  - platform: template
    name: "Stromverbrauch Warmwasser total"
    id: total_electric_energy_water
    unit_of_measurement: "MWh"
    device_class: "energy"
    state_class: "measurement"
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
  - platform: template
    name: "Stromverbrauch Heizung total"
    id: total_electric_energy_heating
    unit_of_measurement: "MWh"
    device_class: "energy"
    icon: "mdi:transmission-tower"
    state_class: "measurement"
    accuracy_decimals: 3

  - platform: template
    name: "WM Heizung heute"
    id: daily_heating_energy
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: "mdi:water-boiler"
    state_class: "measurement"
    accuracy_decimals: 3
   
  - platform: template
    name: "WM Heizen total"
    id: total_heating_energy
    unit_of_measurement: "MWh"
    device_class: "energy"
    icon: "mdi:water-boiler"
    state_class: "measurement"
    accuracy_decimals: 3

  - platform: template
    name: "WM Warmwasser heute"
    id: daily_heating_energy_water
    unit_of_measurement: "kWh"
    device_class: "energy"
    icon: "mdi:water-boiler"
    state_class: "measurement"
    accuracy_decimals: 3

  - platform: template
    name: "WM Warmwasser total"
    id: total_heating_energy_water
    unit_of_measurement: "MWh"
    device_class: "energy"
    icon: "mdi:water-boiler"
    state_class: "measurement"
    accuracy_decimals: 3

   
  - platform: template
    name: "WM elektr. Warmwasser total"
    id: total_electric_heating_energy_water
    unit_of_measurement: "MWh"
    device_class: "energy"
    icon: "mdi:water-boiler"
    state_class: "measurement"
    accuracy_decimals: 3


  - platform: template
    name: "WM elektr. heizen total"
    id: total_electric_heating_energy
    unit_of_measurement: "MWh"
    device_class: "energy"
    icon: "mdi:water-boiler"
    state_class: "measurement"
    accuracy_decimals: 3


binary_sensor:
  - platform: template
    name: "EVU Sperre"
    id: "evu_lock"



time:
  - platform: homeassistant
    id: homeassistant_time
    on_time:
     
      - seconds: /180
        then:


#WM NE WW Summe wh  - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x22,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#WM NE WW Summe kwh  - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x23,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms


#WM NE Heizen Summe wh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x26,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#WM NE Heizen Summe kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x27,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms


#WM WW Tag wh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x2a,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#WM WW Tag kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x2b,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#WM WW Summe kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x2c,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#WM WW Summe Mwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x2d,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#WM Heizen Tag wh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x2e,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#WM Heizen Tag kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x2f,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#WM Heizen Summe kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x30,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#WM Heizen Summe Mwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x31,0x00,0x00 ]
              can_id: 0x680
          - delay: 10s

          - lambda: |-
              if (id(waermemertrag_electr_ww_total_mWh_flag) and id(waermemertrag_electr_ww_total_kWh_flag)){
              id(waermemertrag_electr_ww_total_mWh) += id(waermemertrag_electr_ww_total_kWh_float);
              id(total_electric_heating_energy_water).publish_state(id(waermemertrag_electr_ww_total_mWh));
              };
              id(waermemertrag_electr_ww_total_mWh_flag)=false;
              id(waermemertrag_electr_ww_total_kWh_flag)=false;
          - lambda: |-
              if (id(waermemertrag_electr_heiz_total_kWh_flag) and id(waermemertrag_electr_heiz_total_mWh_flag)){
              id(waermemertrag_electr_heiz_total_mWh) += id(waermemertrag_electr_heiz_total_kWh_float);
              id(total_electric_heating_energy).publish_state(id(waermemertrag_electr_heiz_total_mWh));
              };
              id(waermemertrag_electr_heiz_total_kWh_flag)=false;
              id(waermemertrag_electr_heiz_total_mWh_flag)=false;       

          - lambda: |-
              if (id(waermemertrag_ww_total_mWh_flag) and id(waermemertrag_ww_total_kWh_flag)){
              id(waermemertrag_ww_total_mWh) += id(waermemertrag_ww_total_kWh_float);
              id(total_heating_energy_water).publish_state(id(waermemertrag_ww_total_mWh));
              };
              id(waermemertrag_ww_total_mWh_flag)=false;
              id(waermemertrag_ww_total_kWh_flag)=false;
          - lambda: |-
              if (id(waermemertrag_heiz_total_kWh_flag) and id(waermemertrag_heiz_total_mWh_flag)){
              id(waermemertrag_heiz_total_mWh) += id(waermemertrag_heiz_total_kWh_float);
              id(total_heating_energy).publish_state(id(waermemertrag_heiz_total_mWh));
              };
              id(waermemertrag_heiz_total_kWh_flag)=false;
              id(waermemertrag_heiz_total_mWh_flag)=false;       
          - lambda: |-
              if (id(waermemertrag_heiz_tag_kwh_flag) and id(waermemertrag_heiz_tag_wh_flag)){
              id(waermemertrag_heiz_tag_kwh) += id(waermemertrag_heiz_tag_wh_float);
              id(daily_heating_energy).publish_state(id(waermemertrag_heiz_tag_kwh));
              };
              id(waermemertrag_heiz_tag_kwh_flag)=false;
              id(waermemertrag_heiz_tag_wh_flag)=false;
          - lambda: |-
              if (id(waermemertrag_ww_tag_kwh_flag) and id(waermemertrag_ww_tag_wh_flag)){
              id(waermemertrag_ww_tag_kwh) += id(waermemertrag_ww_tag_wh_float);
              id(daily_heating_energy_water).publish_state(id(waermemertrag_ww_tag_kwh));
              };
              id(waermemertrag_ww_tag_kwh_flag)=false;
              id(waermemertrag_ww_tag_wh_flag)=false;










#el. Leistungsaufnahme WW Tag Wh -  ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x1a,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#el. Leistungsaufnahme WW Tag kWh -  ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x1b,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms


#el. Leistungsaufnahme WW Summe kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x1c,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#el. Leistungsaufnahme WW Summe Mwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x1d,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms


#el. Leistungsaufnahme Heizen Tag Wh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x1e,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#el. Leistungsaufnahme Heizen Tag Wh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x1f,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms


#el. Leistungsaufnahme Heizen Summe kwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x20,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#el. Leistungsaufnahme Heizen Summe Mwh - ok
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x09,0x21,0x00,0x00 ]
              can_id: 0x680
          - delay: 10s

          - lambda: |-
              if (id(el_aufnahmeleistung_ww_total_mWh_flag) and id(el_aufnahmeleistung_ww_total_kWh_flag)){
              id(el_aufnahmeleistung_ww_total_mWh) += id(el_aufnahmeleistung_ww_total_kWh_float);
              id(total_electric_energy_water).publish_state(id(el_aufnahmeleistung_ww_total_mWh));
              };
              id(el_aufnahmeleistung_ww_total_mWh_flag)=false;
              id(el_aufnahmeleistung_ww_total_kWh_flag)=false;
          - lambda: |-
              if (id(el_aufnahmeleistung_heiz_total_mWh_flag) and id(el_aufnahmeleistung_heiz_total_kWh_flag)){
              id(el_aufnahmeleistung_heiz_total_mWh) += id(el_aufnahmeleistung_heiz_total_kWh_float);
              id(total_electric_energy_heating).publish_state(id(el_aufnahmeleistung_heiz_total_mWh));
              };
              id(el_aufnahmeleistung_heiz_total_mWh_flag)=false;
              id(el_aufnahmeleistung_heiz_total_mWh_flag)=false;       
          - lambda: |-
              if (id(el_aufnahmeleistung_ww_tag_kwh_flag) and id(el_aufnahmeleistung_ww_tag_wh_flag)){
              id(el_aufnahmeleistung_ww_tag_kwh) += id(el_aufnahmeleistung_ww_tag_wh_float);
              id(daily_electric_energy_water).publish_state(id(el_aufnahmeleistung_ww_tag_kwh));
              };
              id(el_aufnahmeleistung_ww_tag_kwh_flag)=false;
              id(el_aufnahmeleistung_ww_tag_wh_flag)=false;
          - lambda: |-
              if (id(el_aufnahmeleistung_heiz_tag_kwh_flag) and id(el_aufnahmeleistung_heiz_tag_wh_flag)){
              id(el_aufnahmeleistung_heiz_tag_kwh) += id(el_aufnahmeleistung_heiz_tag_wh_float);
              id(daily_electric_energy_heating).publish_state(id(el_aufnahmeleistung_heiz_tag_kwh));
              };
              id(el_aufnahmeleistung_heiz_tag_kwh_flag)=false;
              id(el_aufnahmeleistung_heiz_tag_wh_flag)=false;
             
          - lambda: |-
              ESP_LOGD("main", "EVU Sperre requested");



#Außentemperatur 1/10 °C et dec value - ok /10
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x00,0x0c,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#Vorlauftemperatur  - ok 1/10
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x00,0x0d,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms
#Vorlauftemperatur Hzg - ok 1/10
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x00,0x0f,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#Rücklauftemperatur Hzg - ok 1/10
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x00,0x16,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#WW Temperatur - ok + offset
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x00,0x0e,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms

#Quelle IST: - ok 1/10
          - canbus.send:
              data: [ 0x31, 0x00, 0xfa,0x01,0xd4,0x00,0x00 ]
              can_id: 0x680
          - delay: 200ms




#Laufzeit VD Heizen - nok 180 - nok 301 - nok 480 - nok 500
#          - canbus.send:
#              data: [ 0x31, 0x00, 0xfa,0x05,0xa5,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Laufzeit VD Kühlen - nok 180 - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x05,0xa6,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Laufzeit VD WW - nok 180 - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x05,0xa7,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Laufzeit VD NHZ WW - nok 180 - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x05,0xa8,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Laufzeit VD NHZ Heizen - nok 180  - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x05,0xa9,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms

#Laufzeit VD NHZ Heizen - nok 180  - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x05,0xa9,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms


#Volumenstrom 1/10 l/min: - nok 180 - nok 301 - nok 480 - nok 514
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x01,0xda,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Heißgastemperatur 1/10 °C: - ok 1/10
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x02,0x65,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Volumenstrom HZK 1/10 l/min: - nok 180 - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x02,0xe3,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
#Volumenstrom Pumpe WW Pri 1/10 l/min: - nok 180 - nok 301 - nok 480
#          - canbus.send:
#              data: [ 0xa1, 0x00, 0xfa,0x02,0xe5,0x00,0x00 ]
#              can_id: 0x680
#          - delay: 200ms
       
spi:
  id: McpSpi
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO15
    can_id: 680
    use_extended_id: false
    bit_rate: 20kbps
    on_frame:



#Warmwasser-Temperaturabfrage + Offset 3.9 °C
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[3]==0x00 and x[4] == 0x0e) {
              float temperature =float((float((int((x[6])+( (x[5])<<8))))/10)+3.9);
              id(temperature_water).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }
#Quellen-Temperaturabfrage
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[3]==0x01 and x[4] == 0xd4) {
              float temperature =float(float((int((x[6])+( (x[5])<<8))))/10);
              id(temperature_source).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }

#Vorlauftemperaturabfrage
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[3]==0x00 and x[4] == 0x0d) {
              float temperature =float(float((int((x[6])+( (x[5])<<8))))/1000);
              id(temperature_forerun).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }
           
#Vorlauftemperaturabfrage Heizkreis
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[3]==0x00 and x[4] == 0x0f) {
              float temperature =float(float((int((x[6])+( (x[5])<<8))))/1000);
              id(temperature_forerun_heating).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }
#Rücklauftemperaturabfrage
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[3]==0x00 and x[4] == 0x16) {
              float temperature =float(float((int((x[6])+( (x[5])<<8))))/10);
              id(temperature_return).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }


#Außentemperaturabfrage
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[3]==0x00 and x[4] == 0x0c) {
              float temperature =float(float((int((x[6])+( (x[5])<<8))))/10);
              id(temperature_outside).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }

#Luftfeuchtigkeit FEK mitlesen
    - can_id: 0x301
      then:
        - lambda: |-
            if(x[0]==0xc0 and x[1]==0x01 and x[2]==0x75) {
              float humidity =float(float((int((x[4])+( (x[3])<<8))))/10);
              id(humidity_inside).publish_state(humidity);
              ESP_LOGD("main", "Humidity received over can is %f", humidity);
            }
#Raumtemperatur FEK mitlesen
    - can_id: 0x301
      then:
        - lambda: |-
            if(x[0]==0xc0 and x[1]==0x01 and x[2]==0x11) {
              float temperature =float(float((int((x[4])+( (x[3])<<8))))/10);
              id(temperature_inside).publish_state(temperature);
              ESP_LOGD("main", "Temperature received over can is %f", temperature);
            }



#Elektrische Leistungsaufnahme Wh /kWh
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09) {
              if (x[4]==0x1a){
                id(el_aufnahmeleistung_ww_tag_wh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_ww_tag_wh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_ww_tag_kwh received over can is %f", id(el_aufnahmeleistung_ww_tag_wh_float));}
              else if (x[4]==0x1e){
                id(el_aufnahmeleistung_heiz_tag_wh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_heiz_tag_wh_flag) = true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_tag_wh received over can is %f", id(el_aufnahmeleistung_heiz_tag_wh_float));}
              else if (x[4]==0x1c){
                id(el_aufnahmeleistung_ww_total_kWh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_ww_total_kWh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_ww_total_kkWh received over can is %f", id(el_aufnahmeleistung_ww_total_kWh_float));}
              else if (x[4]==0x20){
                id(el_aufnahmeleistung_heiz_total_kWh_float) = (float((int((x[6])+( (x[5])<<8))))/1000);
                id(el_aufnahmeleistung_heiz_total_kWh_flag) = true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_total_kWh received over can is %f", id(el_aufnahmeleistung_heiz_total_kWh_float));}
              }
              if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x00 and x[4]==0x74){
              if(x[5]==0x80 and x[6]==0x00){
                id(evu_lock).publish_state(false);
                }
              else{
                id(evu_lock).publish_state(true);
              };
            };

#Elektrische Leistungsaufnahme kWh / MWH
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09) {
              if(x[4]==0x1b){
              id(el_aufnahmeleistung_ww_tag_kwh) =float(int((x[6])+( (x[5])<<8)));
              id(el_aufnahmeleistung_ww_tag_kwh_flag)=true;
              ESP_LOGD("main", "el_aufnahmeleistung_ww_tag_kwh received over can is %f", id(el_aufnahmeleistung_ww_tag_kwh));}
              else if(x[4]==0x1f){
                id(el_aufnahmeleistung_heiz_tag_kwh) =float(int((x[6])+( (x[5])<<8)));
                id(el_aufnahmeleistung_heiz_tag_kwh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_tag_kwh received over can is %f", id(el_aufnahmeleistung_heiz_tag_kwh));}
              else if(x[4]==0x1d){
              id(el_aufnahmeleistung_ww_total_mWh) =float(int((x[6])+( (x[5])<<8)));
              id(el_aufnahmeleistung_ww_total_mWh_flag)=true;
              ESP_LOGD("main", "el_aufnahmeleistung_ww_total_mWh received over can is %f", id(el_aufnahmeleistung_ww_total_mWh));}
              else if(x[4]==0x21){
                id(el_aufnahmeleistung_heiz_total_mWh) =float(int((x[6])+( (x[5])<<8)));
                id(el_aufnahmeleistung_heiz_total_mWh_flag)=true;
                ESP_LOGD("main", "el_aufnahmeleistung_heiz_total_mWh received over can is %f", id(el_aufnahmeleistung_heiz_total_mWh));}
            }


#Wärmeertrag WW/Heizung MWh / kWH
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09) {
              if(x[4]==0x23){
                id(waermemertrag_electr_ww_total_mWh) =float(int((x[6])+( (x[5])<<8)));
                id(waermemertrag_electr_ww_total_mWh_flag)=true;
                ESP_LOGD("main", "waermemertrag_electr_ww_tag_kwh received over can is %f", id(waermemertrag_electr_ww_total_mWh));}
              else if(x[4]==0x27){
                id(waermemertrag_electr_heiz_total_mWh) =float(int((x[6])+( (x[5])<<8)));
                id(waermemertrag_electr_heiz_total_mWh_flag)=true;
                ESP_LOGD("main", "waermemertrag_electr_heiz_tag_kwh received over can is %f", id(waermemertrag_electr_heiz_total_mWh));}
              else if(x[4]==0x2b){
              id(waermemertrag_ww_tag_kwh) =float(int((x[6])+( (x[5])<<8)));
              id(waermemertrag_ww_tag_kwh_flag)=true;
              ESP_LOGD("main", "waermemertrag_ww_tag_kwh received over can is %f", id(waermemertrag_ww_tag_kwh));}
              else if(x[4]==0x2d){
              id(waermemertrag_ww_total_mWh) =float(int((x[6])+( (x[5])<<8)));
              id(waermemertrag_ww_total_mWh_flag)=true;
              ESP_LOGD("main", "waermemertrag_ww_total_mWh received over can is %f", id(waermemertrag_ww_total_mWh));}
              else if(x[4]==0x2f){
                id(waermemertrag_heiz_tag_kwh) =float(int((x[6])+( (x[5])<<8)));
                id(waermemertrag_heiz_tag_kwh_flag)=true;
                ESP_LOGD("main", "waermemertrag_heiz_tag_kwh received over can is %f", id(waermemertrag_heiz_tag_kwh));}
              else if(x[4]==0x31){
                id(waermemertrag_heiz_total_mWh) =float(int((x[6])+( (x[5])<<8)));
                id(waermemertrag_heiz_total_mWh_flag)=true;
                ESP_LOGD("main", "waermemertrag_heiz_total_kWh_float received over can is %f", id(waermemertrag_heiz_total_mWh));}
            }


#Wärmeertrag WW/Heizung Wh / kWH
    - can_id: 0x180
      then:
        - lambda: |-
            if(x[0]==0xd2 and x[1]==0x00 and x[2]==0xfa and x[3]==0x09) {
              if(x[4]==0x22){
                id(waermemertrag_electr_ww_total_kWh_float) =float(int((x[6])+( (x[5])<<8)))/1000;
                id(waermemertrag_electr_ww_total_kWh_flag)=true;
                ESP_LOGD("main", "waermemertrag_electr_ww_tag_wh_float received over can is %f", id(waermemertrag_electr_ww_total_kWh_float));}
              else if(x[4]==0x26){
                id(waermemertrag_electr_heiz_total_kWh_float) =float(int((x[6])+( (x[5])<<8)))/1000;
                id(waermemertrag_electr_heiz_total_kWh_flag)=true;
                ESP_LOGD("main", "waermemertrag_electr_heiz_tag_wh_float received over can is %f", id(waermemertrag_electr_heiz_total_kWh_float));}
              else if(x[4]==0x2a){
              id(waermemertrag_ww_tag_wh_float) =float(int((x[6])+( (x[5])<<8)))/1000;
              id(waermemertrag_ww_tag_wh_flag)=true;
              ESP_LOGD("main", "waermemertrag_ww_tag_wh_float received over can is %f", id(waermemertrag_ww_tag_wh_float));}
              else if(x[4]==0x2c){
              id(waermemertrag_ww_total_kWh_float) =float(int((x[6])+( (x[5])<<8)))/1000;
              id(waermemertrag_ww_total_kWh_flag)=true;
              ESP_LOGD("main", "waermemertrag_ww_total_kWh_float received over can is %f", id(waermemertrag_ww_total_kWh_float));}
              else if(x[4]==0x2e){
                id(waermemertrag_heiz_tag_wh_float) =float(int((x[6])+( (x[5])<<8)))/1000;
                id(waermemertrag_heiz_tag_wh_flag)=true;
                ESP_LOGD("main", "waermemertrag_heiz_tag_wh_float received over can is %f", id(waermemertrag_heiz_tag_wh_float));}
              else if(x[4]==0x30){
                id(waermemertrag_heiz_total_kWh_float) =float(int((x[6])+( (x[5])<<8)))/1000;
                id(waermemertrag_heiz_total_kWh_flag)=true;
                ESP_LOGD("main", "waermemertrag_heiz_total_kWh_float received over can is %f", id(waermemertrag_heiz_total_kWh_float));}
            }



    - can_id: 0x100
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 100 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 100 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 100 Dez.: %i %i", wert5, wert6);

    - can_id: 0x500
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 500 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 500 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 500 Dez.: %i %i", wert5, wert6);



    - can_id: 0x514
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 514 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 514 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 514 Dez.: %i %i", wert5, wert6);


    - can_id: 0x700
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 700 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 700 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 700 Dez.: %i %i", wert5, wert6);

    - can_id: 0x402
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 402 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 402 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 402 Dez.: %i %i", wert5, wert6);


    - can_id: 0x401
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 401 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 401 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 401 Dez.: %i %i", wert5, wert6);
    - can_id: 0x69f
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 69f Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 69f Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 69f Dez.: %i %i", wert5, wert6);

    - can_id: 0x69e
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 69e Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 69e Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 69e Dez.: %i %i", wert5, wert6);



    - can_id: 0x480
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGD("main", "Antwort von 480 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGD("main", "Antwort von 480 Float: %f", wert7);
              ESP_LOGD("main", "Antwort von 480 Dez.: %i %i", wert5, wert6);


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 19 Dezember 2021, 21:11:52
Also das Problem, dass das Laden des Zustandsverlaufs so lange dauert, habe ich nicht.

Ich habe 2 Ideen zur Ursache:

1. Irgend etwas wird super hochfrequent aufgezeichnet. Zum Beispiel einer oder Mehrere der Werte, die ohne Anfragen am Bus liegen.

2. Die SD Karte hat Probleme. Ich arbeite mit SSD Festplatte und InfluxDB und Grafana. SD Karte ist für so einen Anwendungsfall ungeeignet.
Anleitungen wie man das macht, gibt es im Netz zu genüge.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 22 Dezember 2021, 10:28:31
Hallo,

Ich hab noch ein Problem gelöst.
Die Temperatur wurde bei mir teilweise falsch ausgegeben.
Bsp.: Die Außentemperatur - es hat heute Minusgrade - zeigte 6549.2 °C
Die Lösung war, den Integer-Vektor als int16_t zu deklarieren
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 07 Januar 2022, 18:00:45
Jetzt habe ich ein Problem:

Ich möchte von W-Lan auf Ethernet umsteigen und habe mir dazu dieses Board zugelegt: https://www.olimex.com/Products/IoT/ESP32/ESP32-POE/open-source-hardware.

Leider bekomme ich mit dem Angeschlossenen MCP 2515 keine funktionierende CAN Kommunikation hin. Folgende GPIO´s nutze ich:


spi:
  id: McpSpi
  clk_pin: GPIO14
  mosi_pin: GPIO13
  miso_pin: GPIO16

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO4
    can_id: 5
    bit_rate: 20kbps
    use_extended_id: false


@robob hast Du vielleicht eine Idee?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 12 Januar 2022, 21:29:57
Ich finde die Tatsache dass es PoE-Devices gibt cool.

Werden deine CAN-Anfragen lt. Log abgesetzt?
Wie ermittelst du, dass keine Daten empfangen werden - unten mein Codeschnipsel mit dem ich die Pakete mitlogge.
Ich nutze übrigens CAN-ID 680, aber ich glaube das hat keine echte Auswirkung.

Ich hab mit meinem ESP WROOM32 das Problem, dass nach einigen Tagen die Daten nicht aktualisiert werden. dH es sind immer die letztgültigen Temperaturen, Verbrauchswerte etc. gültig und ändern sich nicht mehr in Homeassistant. Es werden zwar lt. Log-Screen im ESP-Device CAN-Pakete abgesetzt, aber es fehlt der Hinweistext dass eine Antwort zurück kommt. Ich spiele dann die Firmware neu ein, danach gehts wieder. Obs auch ein simpler Reset tut weiß ich noch nicht - schätze aber ja.
Ausfallzeit einmal um ca. 23:00 Uhr, fünf Tage später um ca. 21:00 Uhr, vier Tage später um ca. 10:00 Uhr, zwei Tage später um ca. 20:00 Uhr.
Zuletzt habe ich die Delay-Zeit zwischen denen die CAN-Pakete abgesetzt werden auf 500 ms verdoppelt. k.A. ob dadurch die Zeit bis zum Ausfall auf zwei Tage gefallen ist.


    - can_id: 0x180
      then:
        - lambda: |-
              int wert0 = int(x[0]);
              int wert1 =int(x[1]);
              int wert2 =int(x[2]);
              int wert3 =int(x[3]);
              int wert4 =int(x[4]);
              int wert5 =int(x[5]);
              int wert6 =int(x[6]);
              float wert7 = float(int((x[6])+( (x[5])<<8)));
              ESP_LOGI("main", "Antwort von 180 Hex: %x %x %x %x %x %x %x", wert0, wert1, wert2, wert3, wert4, wert5, wert6);
              ESP_LOGI("main", "Antwort von 180 Float: %f", wert7);
              ESP_LOGI("main", "Antwort von 180 Dez.: %i %i", wert5, wert6);
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 26 Januar 2022, 21:25:17
Ich habe zwei ESP8266 mit ebenso 2 MCP2515 auf dem CANBus. Der eine sendet, der Andere empfängt ohne Probleme, das sehe ich den Logs.

Ich schwenke jetzt um auf Rasperry PI mit Waveshare CAN Hat und programmiere das komplett selbst in Python dann weiß man was man hat ;-)
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 01 Februar 2022, 20:58:45
Schade dass du keinen Erfolg mehr damit hattest.
Raspberry Pis sind derzeit ja leider auch Mangelware.

Ich habe inzwischen eine Automatisierung in HomeAssistant implementiert, die mein ESP-Device einmal täglich resettet.
Dadurch hatte ich seither keine Ausfälle mehr.
Mir gefällt die Lösung mit dem ESP32 ganz gut.
Ich schalte damit jetzt außerdem im Heizraum das Licht.

Ich hab aber gerade ein ähnliches Problem seit ich was an der Config geändert hab: Ich habe die Lambda-Funktionen im Code verschoben. Jetzt funktioniert der Code nicht mehr wie erwartet. Es wird nur der CAN-Befehl abgesendet und die Antworten nicht abgearbeitet.
Es ist aber gut möglich, dass sich das mit etwas anderem überschnitten hat und gar nichts mit der Änderung des Codes zu tun hat. Ein paar Stunden davor sehe ich im logging fehlerhafte Einträge.

Ich hab deshalb das ESP-Device mit neuem Namen integriert. So wie es aussieht ohne Erfolg

-Nachtrag - es war das Kabel
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 06 Februar 2022, 19:18:54
Ich habe das jetzt über einen Rasperry Pi in Python umgesetzt. Code werde ich dann auch noch mal teilen, wenn erfolgreich getestet.

Folgendes Problem konnte ich bisher in Esphome nämlich auch nicht zuverlässig lösen:

Jedes Mal um Mitternacht wird von der Wärmenpumpensteuerung der Tagesverbrauch in den Speicher für den Lifetimeverbrauch geschrieben. Wenn man also einen aktuellen Lifetimeverbrauch haben will, muss man den Tagesverbrauch auf den Lifetimeverbrauch addieren (so macht es auch das Display).

Mit Esphome habe ich es bisher nicht geschafft, immer die Aktualiserung des Lifetime-Verbrauchs im richtigen Moment zu machen. Oft haut das beim Warmwasser nicht hin.

Mit eigenem Code ist es da deutlich einfacher einen passenden Check einzubauen.

Was mir bisher noch an Info fehlt ist die Info, in welcher Nachricht wie die Info zu den Statusicons zu finden sind, also
Verdichter an/aus
Wamwasser an/aus
Heizen an/aus
Abtauen an/aus

Kann hier jemand helfen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 07 Februar 2022, 21:50:09
Das erklärt mir gerade warum mein COP bei der Berechnung immer den gleichen Wert ausgibt. Wenn ich den aus dem Gesamtverbrauch ermittle fehlt die Information vom Tagesverbrauch.

Aber warum ist das zeitlich ein Problem? Es gilt doch dann zu jeder Tageszeit z.B. <WW Tag> + <WW Gesamt> + <WW elektrische Nachheizung> = <WW Gesamt aktuell>

Wie überträgst du dann die Daten von deinem Raspberry in deinen Homeassistant? Via MQTT?
Helfen diese Einträge weiter?

  { "LZ_VERD_1_HEIZBETRIEB"                            , 0x07fc, et_mil_val},
  { "LZ_VERD_2_HEIZBETRIEB"                            , 0x07fd, et_mil_val},
  { "LZ_VERD_1_2_HEIZBETRIEB"                          , 0x07fe, et_mil_val},
  { "LZ_VERD_1_KUEHLBETRIEB"                           , 0x07ff, et_mil_val},
  { "LZ_VERD_2_KUEHLBETRIEB"                           , 0x0800, et_mil_val},
  { "LZ_VERD_1_2_KUEHLBETRIEB"                         , 0x0801, et_mil_val},
  { "LZ_VERD_1_WW_BETRIEB"                             , 0x0802, 0},
  { "LZ_VERD_2_WW_BETRIEB"                             , 0x0803, 0},
  { "LZ_VERD_1_2_WW_BETRIEB"                           , 0x0804, 0},
  { "ABTAUUNGAKTIV"                                    , 0x0061, 0}
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 08 Februar 2022, 20:08:07
Helfen diese Einträge weiter?
Ja diese Einträge könnten es wohl sein. Ich habe sie nur noch nicht auf dem Bus gefunden. Eigentlich sollte man die ja nicht anfragen müssen, denn die Informationen werden ja permanent auf dem Display angezeigt und werden deshalb zyklisch oder on change gesendet.  Was bedeutet "et_mil_val"?


Aber warum ist das zeitlich ein Problem?

Die machen das ja so, dass die den Wert im nichtflüchtigen Speicher nur 1x am Tag aktualisieren, weil der Speicher nicht zu viele Schreibzugriffe verträgt. Ich bin mir nicht sicher, ob Lesezugriffe auch problematisch sind. Deshalb frage ich nur 1x zu Mitternacht an. Wenn das ganze Zeitlich nicht 100%ig passt, kommt es zu fehlern. Gleiches gilt übrigens bei den Tageswerten auch, wenn man erst die stellen vor dem Komma anfragt, dann die nach dem Komma, es inzischen aber einen Übersprung bei den Vorkommastellen gab.
Solche Dinge kann man mit ESPhome sicherlich auch abfangen aber für mich gestaltete sich das in Python einfacher.

Wie überträgst du dann die Daten von deinem Raspberry in deinen Homeassistant?
Die Daten übertrage ich per MQTT an Homeassistant.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 08 Februar 2022, 20:39:49
Habe gerade in Erfahrung gebracht "et_mil_val" heisst, der Umrechnungsfaktor ist 0,001. Dann ist es aber kein Status.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 13 Februar 2022, 11:24:19
Zitat von: Vincent82 am 08 Februar 2022, 20:08:07
Ich bin mir nicht sicher, ob Lesezugriffe auch problematisch sind. Deshalb frage ich nur 1x zu Mitternacht an.

Aber von Stiebel Eltron gibt es ja auch ein Internet Service Gateway. Das wird die gleichen Lesezugriffe vornehmen.
Denkst du wirklich dass Lesezugriffe problematisch sind?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 25 April 2022, 18:28:58
Hallo,

von Stiebel Eltron gibt es ja auch ein Energie Management System (EMI)
https://www.stiebel-eltron.at/content/dam/ste/de/de/home/services/Downloadlisten/Bedienungsanleitung%20EMI.pdf (https://www.stiebel-eltron.at/content/dam/ste/de/de/home/services/Downloadlisten/Bedienungsanleitung%20EMI.pdf)

Ich möchte im Grunde das gleiche über CAN-Bus und in Eigenentwicklung umsetzen.
Also Warmwasser auf erhöhte Temperatur setzen, wenn ich genug PV-Strom erzeuge und senken, wenn nicht genug verfügbar ist.
Weiß zufällig jemand, wie dieses System die erhöhte Temperatur umsetzt?

Ich könnte ja rund um die Uhr auf Komfort-Betrieb fahren und via CAN-Bus die Komfort Soll-Temperatur erhöhen sobald genug PV-Strom verfügbar ist. Und dann wieder am Abend die Komfort Soll-Temperatur auf niedrigere Temperatur senken.
Aber laufe ich da Gefahr, dass ich dem internen Speicher schade?

Die Anlage ist von 2019, also noch nicht so alt.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 25 April 2022, 19:33:31
Hallo Also, wenn Du ein paar mal am Tag die Temperatur veränderst ist das sicherlich kein Problem.

Irgendwo abe ich auch schon mal gelesen, dass es jemand so macht wie Du es vorhast. Ich habe selbst noch keine PV aber mein Freund und bei ihm möchte ich es demnächst auch so realisieren.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 27 April 2022, 19:32:10
Also lt. Handbuch vom EMI stellt dieses Gerät die Zeit für das Warmwasserprogramm ein.
dH wenn der Forecast sagt, dass die Sonne scheint, dann wird in dieses Zeitfenster das Warmwassprogramm gelegt.

Ich hab das jetzt gerade auch ausprobiert, weil sich so etwas gut umsetzen ließe, wenn gerade genug Strom auf der PV-Anlage ist.

Warmwasserprogramm Mo-So ist die Adresse 0x17a0
Der Tag dabei wird in 24x15 Minuten-Intervalle aufgeteilt. Der Hexwert an 6. Stelle das CAN-Pakets gibt die Startzeit des Programm-Intervalls an. Die 7. Stelle die Ende-Zeit.
Ich hab mir dazu im Excel eine Tabelle für jede Viertelstunde des Tages erstellt und die entsprechende Codierung in Dezimal bzw. Hexadezimal in eine weitere Spalte.

00:15 = 1; 00:30 = 2, ...
für ein Zeitintervall von 11:30 Uhr bis 13:30 (länger braucht die Heizung normal nicht für rd. 10-15 °C von Eco- zu Komfort-Temperatur) kommt entsprechend raus (Dezimal) 46 bis 54.

Das CAN-Paket sieht dann so aus:

0x30 0x00 0xfa 0x17 0xa0 0x2e 0x36

Mir fehlt noch der Weg, wie ich die Start- und Ende-Zeit in ein Script im Homeassistant bekomme.
Evtl. über Dezimalstunden: 0:15=0,25=1/4; 0:30=0,5=2/4; 0:45=0,75=3/4...

Vielleicht ist aber doch der Weg über die Temperaturerhöhung und -Absenkung einfacher
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 29 April 2022, 20:53:13
Ja die Frage stelle ich mir auch wieso nicht einfach die Solltemperatur dynamisch anpassen?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: momad am 14 Juli 2022, 12:18:27
Zitat von: Vincent82 am 05 Dezember 2021, 21:51:53
Hallo author=momad, Dein Screenshot sieht so aus als wäre er von Home Assistant. Wenn dem so ist, könntest Du einmal beschreiben, wie Du das technisch gelöst hast?
Hallo Vincent,
Sorry ich war ewig nicht mehr hier und habe erst deine Frag hier gesehen.
Ich schulde dir hier eine Antwort und zwar ich habe bei mir die Lösung damals für Faule per mqtt von Fhem@PI3 alles Richtung Homeassitant zu schicken und dort die Sensoren und Daten zu verarbeiten.
Bei Interesse kann ich gerne meine config hier posten.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: momad am 14 Juli 2022, 12:23:06
Offen ist noch bei mir das Thema :
Lässt sich eigentlich den SG Ready Modus (PV Anlage Überschuss nutzen) hier auch via CAN-BUS ansteuern?
Falls ja hat es jemanden bereits probiert und welches Wert sollte hierfür aktiviert werden?
Sind die CAN BUS Adressen für den SG-Ready Betriebsmodis bekannt?
Damit lässt sich den ISG Web Plus fast komplett ersetzen.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 14 Juli 2022, 13:29:53
Ich steuer bei mir bei Bedarf einfach die Warmwasser Temperatur auf einen höheren Wert wenn PV Überschuss vorhanden.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 05 August 2022, 07:04:10
Ich suche schon länger eine Möglichkeit die Stiebel-Eltron (WPL 13 mit WPM II)  Wärmepumpe einzubinden. Eigentlich möchte ich diese Warmwasser aufbereiten lassen, wenn genügen PV-Strom da ist. Aktuell habe ich aber das Problem, dass die IWS (Steuerung in der WPL 13) zwischen durch auf Störung geht und ich nicht weiss warum. HD/ND-Fehler bis anhin nur im Sommerbetrieb und ziemlich exakt jeweils nach einem Jahr im Juli, nun aber öfters. Der Sache möchte ich  auf den Grund gehen. Gefunden habe ich dazu mal folgendes:
https://www.haustechnikdialog.de/Forum/t/140804/Sammelstoerung-HD-ND-Fehler-bei-Stiebel-WPL18

Mit FHEM (läuft auf einem Standard PC mit Debian) und einem CAN Bus USB-Adapter erhoffe ich mir, zumindest den Zustand beim Eintreten des Fehlers loggen zu können. Als Adapter den hier z.B.:
https://linux-automation.com/de/products/candlelight.html
wobei ich mich bei dem Adapter Frage wie anschliessen (wo ist CAN_L, GND?). Ist die Belegung des SUB-D-Stecker «normiert»? Also so wie hier (bzgl. der beschrifteten Seite passt es):
https://www.opendcc.de/info/can/can_connector.html

Irgendwelche Tipps bzgl. Adapter usw.?

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 17 August 2022, 23:20:48
Hallo Frank

Zitat von: intershopper am 24 März 2018, 09:40:08
Ich habe meine WPL13 um ein paar sinnvolle Usereadings erweitert. So kann Pumpen- und Verdichterstatus überwacht werden.

Wir haben auch eine WPL13 und ich versuche eine passende 50_Elster.pm zu generieren. Nun finde ich im Internet die Software ComfortSoft nirgends und wenn ich sie finden würde fehlt mir ein Windows (evtl. würde die Software aber in Wine oder so laufen).

Hast du ein 50_Elster.pm passen für eine WPL13 (dann könnte ich mir das gennerien sparen) oder weisst du wo ich ComfortSoft noch runter laden könnte.

Bis jetzt bin ich wie hier beschrieben vorgegangen:
https://forum.fhem.de/index.php/topic,128767.0.html

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: juerg5524 am 18 August 2022, 15:29:26
Hallo tomix

ComfortSoft läuft nicht unter Wine, leider.

Viele Grüsse
Jürg
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 18 August 2022, 21:52:40
Zitat von: juerg5524 am 18 August 2022, 15:29:26
ComfortSoft läuft nicht unter Wine, leider.
Wann hast du das zum letzten mal probiert? Aber zuerst müsste man mal die Software haben. Dann würde ich nochmals einen Versuch machen und ansonsten irgend eine virtuelle Maschine nehmen und irgend ein Windows auftreiben.

Ich habe aber noch ein paar grundlegende Verständnisfragen. Das hier habe ich mal gemacht:
https://forum.fhem.de/index.php/topic,128767.0.html

Dazu noch ein:

./can_scan can0 680 180 | tee ../log_can_scan.log


Die Datei ist weiter unten als Code-Block eingebunden.

Zur 50_Elster.pm habe ich dann noch folgendes dazu gefügt:

  "BETRIEBS_STATUS"   => { EIdx =>"0176", ID => "180" },
  "INFO_TYP"   => { EIdx => "019c", ID => "180" },

was auch funktioniert.

Diverse Werte führen bei einem get zu einen «?». Ich nehme an diese stehen einfach nicht zur Verfügung bei unserer Wärmepumpe (also wird keine Antwort erfolgen). Eine automatischen Abfrage alle 10 Sekunden (Standardintervall) erfolgt ebenfalls nicht. Wie könnte ich das Intervall erhöhen? Ich vermute mal die vielen «?» brauchen da mehr Zeit, somit sollte die get Liste bereinigt werden.

Stimmt meine Annahme, dass mindestens die Werte aus der Log-Datei funktionieren? Wie kommt man zu den anderen die es noch gibt? Also z.B. "BETRIEBS_STATUS" und "INFO_TYP"?

Via Comfortsoft käme ich dann noch zu den passenden set Befehlen, oder?

Wie loggt man einfach alles, was über den Bus läuft? Z.B. könnte ich mit loggen lassen und dann via WPMII ein Reset der IWS durchführen, dann müsste ich das entsprechende Kommando dafür doch sehen.

Die Hilfe am Schluss der 50_Elster.pm wird in FHEM nicht ausgegeben/erkannt, wieso? Stimmt da noch was grundlegendes nicht?

Danke für die Grundlagenarbeit von dir. Ich dachte schon ich finde gar keine Lösung, um die WP irgendwie sinnvoll einbinden und evtl. sogar steuern zu können.

Gruss
tomix

elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

  { 0x180, 0x0001, 0x0045},  // FEHLERMELDUNG: 69
  { 0x180, 0x0002, 0x0032},  // KESSELSOLLTEMP: 5.0
  { 0x180, 0x0003, 0x01a4},  // SPEICHERSOLLTEMP: 42.0
  { 0x180, 0x0004, 0x0032},  // VORLAUFSOLLTEMP: 5.0
  { 0x180, 0x0005, 0x00c8},  // RAUMSOLLTEMP_I: 20.0
  { 0x180, 0x0006, 0x00c8},  // RAUMSOLLTEMP_II: 20.0
  { 0x180, 0x0007, 0x00c8},  // RAUMSOLLTEMP_III: 20.0
  { 0x180, 0x0008, 0x0096},  // RAUMSOLLTEMP_NACHT: 15.0
  { 0x180, 0x0009, 0x0917},  // UHRZEIT: 23:09
  { 0x180, 0x000a, 0x1008},  // DATUM: 16.08.
  { 0x180, 0x000b, 0xa507},  // GERAETE_ID: 165-07
  { 0x180, 0x000c, 0x00c6},  // AUSSENTEMP: 19.8
  { 0x180, 0x000d, 0xfe70},  // SAMMLERISTTEMP: -40.0
  { 0x180, 0x000e, 0x00dc},  // SPEICHERISTTEMP: 22.0
  { 0x180, 0x000f, 0xfe70},  // VORLAUFISTTEMP: -40.0
  { 0x180, 0x0010, 0x0031},  // GERAETEKONFIGURATION: 49
  { 0x180, 0x0013, 0x01f4},  // EINSTELL_SPEICHERSOLLTEMP: 50.0
  { 0x180, 0x0016, 0x00ed},  // RUECKLAUFISTTEMP: 23.7
  { 0x180, 0x0022, 0x001e},  // HYSTERESEZEIT: 3.0
  { 0x180, 0x0023, 0x0000},  // MAX_HYSTERESE: 0
  { 0x180, 0x0026, 0x0014},  // SPERRZEIT: 20
  { 0x180, 0x0028, 0x01f4},  // MAX_TEMP_KESSEL: 50.0
  { 0x180, 0x002b, 0x6400},  // TN: 100
  { 0x180, 0x0030, 0x0100},  // ACCESS_EEPROM: 1
  { 0x180, 0x0051, 0x0000},  // MULTIFUNKTION_ISTTEMP: 0.0
  { 0x180, 0x0053, 0x0000},  // HZK_PUMPE: 0
  { 0x180, 0x0058, 0x2e00},  // MISCHER_ZU: 46
  { 0x180, 0x0059, 0x0000},  // HEIZKREIS_STATUS: 0
  { 0x180, 0x005a, 0x0200},  // SPEICHER_STATUS: 2
  { 0x180, 0x0060, 0x0000},  // SCHALTFKT_IWS: 0
  { 0x180, 0x0063, 0x0000},  // KESSELSTATUS: 0
  { 0x180, 0x0064, 0x0000},  // SAMMLER_PUMPE: 0
  { 0x180, 0x00fe, 0x0100},  // INITIALISIERUNG: 1
  { 0x180, 0x0101, 0x0000},  // ANTILEGIONELLEN: 0
  { 0x180, 0x0109, 0x0000},  // RAUMFUEHLERKORREKTUR: 0
  { 0x180, 0x010d, 0x03e8},  // CODENUMMER: 1000
  { 0x180, 0x010e, 0x0037},  // HEIZKURVE: 0.55
  { 0x180, 0x010f, 0x0500},  // RAUMEINFLUSS: 1280
  { 0x180, 0x0111, 0x001e},  // HZK_KURVENABSTAND: 3.0
  { 0x180, 0x0112, 0x0200},  // PROGRAMMSCHALTER: Automatik
  { 0x180, 0x0113, 0x0000},  // SPRACHE: 0
  { 0x180, 0x011a, 0x0000},  // ESTRICHFUNKTION: 0
  { 0x180, 0x011b, 0x0100},  // FERIENANFANG_TAG: 1
  { 0x180, 0x011c, 0x0100},  // FERIENANFANG_MONAT: 1
  { 0x180, 0x011d, 0x0500},  // FERIENANFANG_JAHR: 5
  { 0x180, 0x011e, 0x0100},  // FERIENENDE_TAG: 1
  { 0x180, 0x011f, 0x0100},  // FERIENENDE_MONAT: 1
  { 0x180, 0x0120, 0x0500},  // FERIENENDE_JAHR: 5
  { 0x180, 0x0121, 0x0200},  // WOCHENTAG: 2
  { 0x180, 0x0122, 0x1000},  // TAG: 16
  { 0x180, 0x0123, 0x0800},  // MONAT: 8
  { 0x180, 0x0124, 0x1600},  // JAHR: 22
  { 0x180, 0x0125, 0x1700},  // STUNDE: 23
  { 0x180, 0x0126, 0x0900},  // MINUTE: 9
  { 0x180, 0x0127, 0x2900},  // SEKUNDE: 41
  { 0x180, 0x0135, 0x0100},  // WARMWASSERMODE: 1
  { 0x180, 0x0137, 0x02bc},  // KESSELSOLLTEMP_2WE: 70.0
  { 0x180, 0x0181, 0x028a},  // MAX_WW_TEMP: 65.0
  { 0x180, 0x0183, 0x0000},  // FERNBEDIENUNGSZUORDNUNG: 0
  { 0x180, 0x01ac, 0xff38},  // BIVALENTPARALLELTEMPERATUR_HZG: -20.0
  { 0x180, 0x01ad, 0xffce},  // BIVALENTPARALLELTEMPERATUR_WW: -5.0
  { 0x180, 0x01ae, 0xff38},  // BIVALENZALTERNATIVTEMPERATUR_HZG: -20.0
  { 0x180, 0x01af, 0xff38},  // BIVALENZALTERNATIVTEMPERATUR_WW: -20.0
  { 0x180, 0x01b0, 0xffce},  // QUELLENSOLLTEMPERATUR: -5.0
  { 0x180, 0x01b1, 0x000b},  // SOLLTEMP_ANZEIGE_0_1: 11
  { 0x180, 0x01b2, 0x0017},  // SOLLTEMP_ANZEIGE_0_2: 23
  { 0x180, 0x01b3, 0x001f},  // SOLLTEMP_ANZEIGE_0_3: 31
  { 0x180, 0x01b4, 0x0014},  // SOLLTEMP_ANZEIGE_1_1: 20
  { 0x180, 0x01b5, 0x0018},  // SOLLTEMP_ANZEIGE_1_2: 24
  { 0x180, 0x01b6, 0x001a},  // SOLLTEMP_ANZEIGE_1_3: 26
  { 0x180, 0x01b7, 0x0032},  // AUSSENTEMPERATUR_WARMWASSER: 5.0
  { 0x180, 0x01b8, 0x001e},  // SOLARDIFFERENZ: 3.0
  { 0x180, 0x01b9, 0x0258},  // SOLARTEMP_MAX: 60.0
  { 0x180, 0x01ba, 0x0001},  // ESTRICH_STEIGUNG_PRO_TAG: 1
  { 0x180, 0x01bb, 0x00fa},  // ESTRICH_SOCKELTEMPERATUR: 25.0
  { 0x180, 0x01bc, 0x0002},  // ESTRICH_HALTEN_SOCKELTEMPERATUR: 2
  { 0x180, 0x01bd, 0x0190},  // ESTRICH_MAX_TEMPERATUR: 40.0
  { 0x180, 0x01be, 0x0000},  // ESTRICH_HALTEN_MAX_TEMPERATUR: 0
  { 0x180, 0x01bf, 0x00c8},  // SW_AUSSENTEMP: 20.0
  { 0x180, 0x01c0, 0x0000},  // FESTWERT: 0
  { 0x180, 0x01c1, 0x0000},  // GESAMTERTRAG_WATT: 0
  { 0x180, 0x01c2, 0x0000},  // GESAMTERTRAG_KWATT: 0
  { 0x180, 0x01c3, 0x0000},  // GESAMTERTRAG_MWATT: 0
  { 0x180, 0x01c4, 0x2132},  // LAUFZEIT_WP1: 8498
  { 0x180, 0x01c5, 0x0000},  // LAUFZEIT_WP2: 0
  { 0x180, 0x01c6, 0x0000},  // LAUFZEIT_WP3: 0
  { 0x180, 0x01c7, 0x0000},  // LAUFZEIT_WP4: 0
  { 0x180, 0x01c8, 0x0000},  // LAUFZEIT_WP5: 0
  { 0x180, 0x01c9, 0x0000},  // LAUFZEIT_WP6: 0
  { 0x180, 0x01ca, 0x0000},  // LAUFZEIT_SOLAR: 0
  { 0x180, 0x01cb, 0x19f1},  // LAUFZEIT_2WE: 6641
  { 0x180, 0x01d4, 0xfe70},  // QUELLE_IST: -40.0
  { 0x180, 0x01d5, 0x0032},  // PUFFERSOLL: 5.0
  { 0x180, 0x01d6, 0x00f2},  // WPVORLAUFIST: 24.2
  { 0x180, 0x01d7, 0x0050},  // HILFSKESSELSOLL: 8.0
  { 0x180, 0x01d8, 0xfe70},  // FUEHLER_1: -40.0
  { 0x180, 0x01d9, 0xfe70},  // FUEHLER_2: -40.0
  { 0x180, 0x01da, 0x0000},  // VOLUMENSTROM: 0
  { 0x180, 0x01db, 0x0000},  // ERTRAG_AKT: 0
  { 0x180, 0x01dc, 0x0000},  // ERTRAG_TAG_W: 0
  { 0x180, 0x01dd, 0x0000},  // ERTRAG_TAG_KW: 0
  { 0x180, 0x01e8, 0x023a},  // MAX_HEIZUNG_TEMP: 57.0
  { 0x180, 0x027e, 0x0001},  // WW_ECO: on
  { 0x180, 0x0a00, 0x0028},  // AUSSEN_FROSTTEMP: 4.0
  { 0x180, 0x0a06, 0x01a4},  // EINSTELL_SPEICHERSOLLTEMP2: 42.0
  { 0x180, 0x0b00, 0x0019},  // FEHLERFELD_0: 25
  { 0x180, 0x0b01, 0x0014},  // FEHLERFELD_1: 20
  { 0x180, 0x0b02, 0x0003},  // FEHLERFELD_2: 3
  { 0x180, 0x0b03, 0x0008},  // FEHLERFELD_3: 8
  { 0x180, 0x0b04, 0x0016},  // FEHLERFELD_4: 22
  { 0x180, 0x0b05, 0x0004},  // FEHLERFELD_5: 5
  { 0x180, 0x0b06, 0x0001},  // FEHLERFELD_6: ERR 1
  { 0x180, 0x0b07, 0x0003},  // FEHLERFELD_7: 3
  { 0x180, 0x0b08, 0x0009},  // FEHLERFELD_8: 9
  { 0x180, 0x0b09, 0x0004},  // FEHLERFELD_9: 4
  { 0x180, 0x0b0a, 0x0008},  // FEHLERFELD_10: 8
  { 0x180, 0x0b0b, 0x0016},  // FEHLERFELD_11: 22
  { 0x180, 0x0b0c, 0x0004},  // FEHLERFELD_12: 5
  { 0x180, 0x0b0d, 0x0001},  // FEHLERFELD_13: ERR 1
  { 0x180, 0x0b0e, 0x0004},  // FEHLERFELD_14: 4
  { 0x180, 0x0b0f, 0x0009},  // FEHLERFELD_15: 9
  { 0x180, 0x0b10, 0x0005},  // FEHLERFELD_16: 5
  { 0x180, 0x0b11, 0x0008},  // FEHLERFELD_17: 8
  { 0x180, 0x0b12, 0x0016},  // FEHLERFELD_18: 22
  { 0x180, 0x0b13, 0x0004},  // FEHLERFELD_19: 5
  { 0x180, 0x0b14, 0x0001},  // FEHLERFELD_20: ERR 1
  { 0x180, 0x0b15, 0x0025},  // FEHLERFELD_21: 37
  { 0x180, 0x0b16, 0x0009},  // FEHLERFELD_22: 9
  { 0x180, 0x0b17, 0x0005},  // FEHLERFELD_23: 5
  { 0x180, 0x0b18, 0x0008},  // FEHLERFELD_24: 8
  { 0x180, 0x0b19, 0x0016},  // FEHLERFELD_25: 22
  { 0x180, 0x0b1a, 0x0004},  // FEHLERFELD_26: 5
  { 0x180, 0x0b1b, 0x0001},  // FEHLERFELD_27: ERR 1
  { 0x180, 0x0b1c, 0x0007},  // FEHLERFELD_28: 7
  { 0x180, 0x0b1d, 0x000a},  // FEHLERFELD_29: 10
  { 0x180, 0x0b1e, 0x0005},  // FEHLERFELD_30: 5
  { 0x180, 0x0b1f, 0x0008},  // FEHLERFELD_31: 8
  { 0x180, 0x0b20, 0x0016},  // FEHLERFELD_32: 22
  { 0x180, 0x0b21, 0x0004},  // FEHLERFELD_33: 5
  { 0x180, 0x0b22, 0x0001},  // FEHLERFELD_34: ERR 1
  { 0x180, 0x0b23, 0x002a},  // FEHLERFELD_35: 42
  { 0x180, 0x0b24, 0x000a},  // FEHLERFELD_36: 10
  { 0x180, 0x0b25, 0x0005},  // FEHLERFELD_37: 5
  { 0x180, 0x0b26, 0x0008},  // FEHLERFELD_38: 8
  { 0x180, 0x0b27, 0x0016},  // FEHLERFELD_39: 22
  { 0x180, 0x0b28, 0x0004},  // FEHLERFELD_40: 5
  { 0x180, 0x0b29, 0x0001},  // FEHLERFELD_41: ERR 1
  { 0x180, 0x0b2a, 0x0003},  // FEHLERFELD_42: 3
  { 0x180, 0x0b2b, 0x0011},  // FEHLERFELD_43: 17
  { 0x180, 0x0b2c, 0x0005},  // FEHLERFELD_44: 5
  { 0x180, 0x0b2d, 0x0008},  // FEHLERFELD_45: 8
  { 0x180, 0x0b2e, 0x0016},  // FEHLERFELD_46: 22
  { 0x180, 0x0b2f, 0x0004},  // FEHLERFELD_47: 5
  { 0x180, 0x0b30, 0x0001},  // FEHLERFELD_48: ERR 1
  { 0x180, 0x0b31, 0x0006},  // FEHLERFELD_49: 6
  { 0x180, 0x0b32, 0x0009},  // FEHLERFELD_50: 9
  { 0x180, 0x0b33, 0x0006},  // FEHLERFELD_51: 6
  { 0x180, 0x0b34, 0x0008},  // FEHLERFELD_52: 8
  { 0x180, 0x0b35, 0x0016},  // FEHLERFELD_53: 22
  { 0x180, 0x0b36, 0x0004},  // FEHLERFELD_54: 5
  { 0x180, 0x0b37, 0x0001},  // FEHLERFELD_55: ERR 1
  { 0x180, 0x0b38, 0x000d},  // FEHLERFELD_56: 13
  { 0x180, 0x0b39, 0x0009},  // FEHLERFELD_57: 9
  { 0x180, 0x0b3a, 0x0007},  // FEHLERFELD_58: 7
  { 0x180, 0x0b3b, 0x0008},  // FEHLERFELD_59: 8
  { 0x180, 0x0b3c, 0x0016},  // FEHLERFELD_60: 22
  { 0x180, 0x0b3d, 0x0004},  // FEHLERFELD_61: 5
  { 0x180, 0x0b3e, 0x0001},  // FEHLERFELD_62: ERR 1
  { 0x180, 0x0b3f, 0x001b},  // FEHLERFELD_63: 27
  { 0x180, 0x0b40, 0x0010},  // FEHLERFELD_64: 16
  { 0x180, 0x0b41, 0x0007},  // FEHLERFELD_65: 7
  { 0x180, 0x0b42, 0x0008},  // FEHLERFELD_66: 8
  { 0x180, 0x0b43, 0x0016},  // FEHLERFELD_67: 22
  { 0x180, 0x0b44, 0x0004},  // FEHLERFELD_68: 5
  { 0x180, 0x0b45, 0x0001},  // FEHLERFELD_69: ERR 1
  { 0x180, 0x0b46, 0x0006},  // FEHLERFELD_70: 6
  { 0x180, 0x0b47, 0x0009},  // FEHLERFELD_71: 9
  { 0x180, 0x0b48, 0x0008},  // FEHLERFELD_72: 8
  { 0x180, 0x0b49, 0x0008},  // FEHLERFELD_73: 8
  { 0x180, 0x0b4a, 0x0016},  // FEHLERFELD_74: 22
  { 0x180, 0x0b4b, 0x0004},  // FEHLERFELD_75: 5
  { 0x180, 0x0b4c, 0x0001},  // FEHLERFELD_76: ERR 1
  { 0x180, 0x0b4d, 0x002e},  // FEHLERFELD_77: 46
  { 0x180, 0x0b4e, 0x000e},  // FEHLERFELD_78: 14
  { 0x180, 0x0b4f, 0x0008},  // FEHLERFELD_79: 8
  { 0x180, 0x0b50, 0x0008},  // FEHLERFELD_80: 8
  { 0x180, 0x0b51, 0x0016},  // FEHLERFELD_81: 22
  { 0x180, 0x0b52, 0x0004},  // FEHLERFELD_82: 5
  { 0x180, 0x0b53, 0x0001},  // FEHLERFELD_83: ERR 1
  { 0x180, 0x0b54, 0x0009},  // FEHLERFELD_84: 9
  { 0x180, 0x0b55, 0x0009},  // FEHLERFELD_85: 9
  { 0x180, 0x0b56, 0x000a},  // FEHLERFELD_86: 10
  { 0x180, 0x0b57, 0x0008},  // FEHLERFELD_87: 8
  { 0x180, 0x0b58, 0x0016},  // FEHLERFELD_88: 22
  { 0x180, 0x0b59, 0x0004},  // FEHLERFELD_89: 5
  { 0x180, 0x0b5a, 0x0001},  // FEHLERFELD_90: ERR 1
  { 0x180, 0x0b5b, 0x0016},  // FEHLERFELD_91: 22
  { 0x180, 0x0b5c, 0x0010},  // FEHLERFELD_92: 16
  { 0x180, 0x0b5d, 0x000a},  // FEHLERFELD_93: 10
  { 0x180, 0x0b5e, 0x0008},  // FEHLERFELD_94: 8
  { 0x180, 0x0b5f, 0x0016},  // FEHLERFELD_95: 22
  { 0x180, 0x0b60, 0x0004},  // FEHLERFELD_96: 5
  { 0x180, 0x0b61, 0x0001},  // FEHLERFELD_97: ERR 1
  { 0x180, 0x0b62, 0x0039},  // FEHLERFELD_98: 57
  { 0x180, 0x0b63, 0x0010},  // FEHLERFELD_99: 16
  { 0x180, 0x0b64, 0x000a},  // FEHLERFELD_100: 10
  { 0x180, 0x0b65, 0x0008},  // FEHLERFELD_101: 8
  { 0x180, 0x0b66, 0x0016},  // FEHLERFELD_102: 22
  { 0x180, 0x0b67, 0x0004},  // FEHLERFELD_103: 5
  { 0x180, 0x0b68, 0x0001},  // FEHLERFELD_104: ERR 1
  { 0x180, 0x0b69, 0x0016},  // FEHLERFELD_105: 22
  { 0x180, 0x0b6a, 0x000b},  // FEHLERFELD_106: 11
  { 0x180, 0x0b6b, 0x000b},  // FEHLERFELD_107: 11
  { 0x180, 0x0b6c, 0x0008},  // FEHLERFELD_108: 8
  { 0x180, 0x0b6d, 0x0016},  // FEHLERFELD_109: 22
  { 0x180, 0x0b6e, 0x0004},  // FEHLERFELD_110: 5
  { 0x180, 0x0b6f, 0x0001},  // FEHLERFELD_111: ERR 1
  { 0x180, 0x0b70, 0x002d},  // FEHLERFELD_112: 45
  { 0x180, 0x0b71, 0x000e},  // FEHLERFELD_113: 14
  { 0x180, 0x0b72, 0x000b},  // FEHLERFELD_114: 11
  { 0x180, 0x0b73, 0x0008},  // FEHLERFELD_115: 8
  { 0x180, 0x0b74, 0x0016},  // FEHLERFELD_116: 22
  { 0x180, 0x0b75, 0x0004},  // FEHLERFELD_117: 5
  { 0x180, 0x0b76, 0x0001},  // FEHLERFELD_118: ERR 1
  { 0x180, 0x0b77, 0x0012},  // FEHLERFELD_119: 18
  { 0x180, 0x0b78, 0x000f},  // FEHLERFELD_120: 15
  { 0x180, 0x0b79, 0x000b},  // FEHLERFELD_121: 11
  { 0x180, 0x0b7a, 0x0008},  // FEHLERFELD_122: 8
  { 0x180, 0x0b7b, 0x0016},  // FEHLERFELD_123: 22
  { 0x180, 0x0b7c, 0x0004},  // FEHLERFELD_124: 5
  { 0x180, 0x0b7d, 0x0001},  // FEHLERFELD_125: ERR 1
  { 0x180, 0x0b7e, 0x0005},  // FEHLERFELD_126: 5
  { 0x180, 0x0b7f, 0x0009},  // FEHLERFELD_127: 9
  { 0x180, 0x0b80, 0x000c},  // FEHLERFELD_128: 12
  { 0x180, 0x0b81, 0x0008},  // FEHLERFELD_129: 8
  { 0x180, 0x0b82, 0x0016},  // FEHLERFELD_130: 22
  { 0x180, 0x0b83, 0x0004},  // FEHLERFELD_131: 5
  { 0x180, 0x0b84, 0x0001},  // FEHLERFELD_132: ERR 1
  { 0x180, 0x0b85, 0x0004},  // FEHLERFELD_133: 4
  { 0x180, 0x0b86, 0x0009},  // FEHLERFELD_134: 9
  { 0x180, 0x0b87, 0x000f},  // FEHLERFELD_135: 15
  { 0x180, 0x0b88, 0x0008},  // FEHLERFELD_136: 8
  { 0x180, 0x0b89, 0x0016},  // FEHLERFELD_137: 22
  { 0x180, 0x0b8a, 0x0004},  // FEHLERFELD_138: 5
  { 0x180, 0x0b8b, 0x0001},  // FEHLERFELD_139: ERR 1
  { 0x180, 0x1410, 0x1050},  // HEIZPROG_1_MO: 04:00-20:00
  { 0x180, 0x1411, 0x8080},  // HEIZPROG_1_MO_SCHALT_2: not used time domain
  { 0x180, 0x1412, 0x8080},  // HEIZPROG_1_MO_SCHALT_3: not used time domain
  { 0x180, 0x1420, 0x1050},  // HEIZPROG_1_DI: 04:00-20:00
  { 0x180, 0x1421, 0x8080},  // HEIZPROG_1_DI_SCHALT_2: not used time domain
  { 0x180, 0x1422, 0x8080},  // HEIZPROG_1_DI_SCHALT_3: not used time domain
  { 0x180, 0x1430, 0x1050},  // HEIZPROG_1_MI: 04:00-20:00
  { 0x180, 0x1431, 0x8080},  // HEIZPROG_1_MI_SCHALT_2: not used time domain
  { 0x180, 0x1432, 0x8080},  // HEIZPROG_1_MI_SCHALT_3: not used time domain
  { 0x180, 0x1440, 0x1050},  // HEIZPROG_1_DO: 04:00-20:00
  { 0x180, 0x1441, 0x8080},  // HEIZPROG_1_DO_SCHALT_2: not used time domain
  { 0x180, 0x1442, 0x8080},  // HEIZPROG_1_DO_SCHALT_3: not used time domain
  { 0x180, 0x1450, 0x1050},  // HEIZPROG_1_FR: 04:00-20:00
  { 0x180, 0x1451, 0x8080},  // HEIZPROG_1_FR_SCHALT_2: not used time domain
  { 0x180, 0x1452, 0x8080},  // HEIZPROG_1_FR_SCHALT_3: not used time domain
  { 0x180, 0x1460, 0x1050},  // HEIZPROG_1_SA: 04:00-20:00
  { 0x180, 0x1461, 0x8080},  // HEIZPROG_1_SA_SCHALT_2: not used time domain
  { 0x180, 0x1462, 0x8080},  // HEIZPROG_1_SA_SCHALT_3: not used time domain
  { 0x180, 0x1470, 0x1050},  // HEIZPROG_1_SO: 04:00-20:00
  { 0x180, 0x1471, 0x8080},  // HEIZPROG_1_SO_SCHALT_2: not used time domain
  { 0x180, 0x1472, 0x8080},  // HEIZPROG_1_SO_SCHALT_3: not used time domain
  { 0x180, 0x1510, 0xffff},  // HEIZPROG_2_MO: not used time domain
  { 0x180, 0x1511, 0xffff},  // HEIZPROG_2_MO_SCHALT_2: not used time domain
  { 0x180, 0x1512, 0xffff},  // HEIZPROG_2_MO_SCHALT_3: not used time domain
  { 0x180, 0x1520, 0xffff},  // HEIZPROG_2_DI: not used time domain
  { 0x180, 0x1521, 0xffff},  // HEIZPROG_2_DI_SCHALT_2: not used time domain
  { 0x180, 0x1522, 0xffff},  // HEIZPROG_2_DI_SCHALT_3: not used time domain
  { 0x180, 0x1530, 0xffff},  // HEIZPROG_2_MI: not used time domain
  { 0x180, 0x1531, 0xffff},  // HEIZPROG_2_MI_SCHALT_2: not used time domain
  { 0x180, 0x1532, 0xffff},  // HEIZPROG_2_MI_SCHALT_3: not used time domain
  { 0x180, 0x1540, 0xffff},  // HEIZPROG_2_DO: not used time domain
  { 0x180, 0x1541, 0xffff},  // HEIZPROG_2_DO_SCHALT_2: not used time domain
  { 0x180, 0x1542, 0xffff},  // HEIZPROG_2_DO_SCHALT_3: not used time domain
  { 0x180, 0x1550, 0xffff},  // HEIZPROG_2_FR: not used time domain
  { 0x180, 0x1551, 0xffff},  // HEIZPROG_2_FR_SCHALT_2: not used time domain
  { 0x180, 0x1552, 0xffff},  // HEIZPROG_2_FR_SCHALT_3: not used time domain
  { 0x180, 0x1560, 0xffff},  // HEIZPROG_2_SA: not used time domain
  { 0x180, 0x1561, 0xffff},  // HEIZPROG_2_SA_SCHALT_2: not used time domain
  { 0x180, 0x1562, 0xffff},  // HEIZPROG_2_SA_SCHALT_3: not used time domain
  { 0x180, 0x1570, 0xffff},  // HEIZPROG_2_SO: not used time domain
  { 0x180, 0x1571, 0xffff},  // HEIZPROG_2_SO_SCHALT_2: not used time domain
  { 0x180, 0x1572, 0xffff},  // HEIZPROG_2_SO_SCHALT_3: not used time domain
  { 0x180, 0x1710, 0x232f},  // W_WASSERPROG_1_MO: 08:45-11:45
  { 0x180, 0x1711, 0x313e},  // W_WASSERPROG_1_MO_SCHALT_2: 12:15-15:30
  { 0x180, 0x1712, 0x414a},  // W_WASSERPROG_1_MO_SCHALT_3: 16:15-18:30
  { 0x180, 0x1720, 0x232f},  // W_WASSERPROG_1_DI: 08:45-11:45
  { 0x180, 0x1721, 0x313e},  // W_WASSERPROG_1_DI_SCHALT_2: 12:15-15:30
  { 0x180, 0x1722, 0x414a},  // W_WASSERPROG_1_DI_SCHALT_3: 16:15-18:30
  { 0x180, 0x1730, 0x232f},  // W_WASSERPROG_1_MI: 08:45-11:45
  { 0x180, 0x1731, 0x313e},  // W_WASSERPROG_1_MI_SCHALT_2: 12:15-15:30
  { 0x180, 0x1732, 0x414a},  // W_WASSERPROG_1_MI_SCHALT_3: 16:15-18:30
  { 0x180, 0x1740, 0x232f},  // W_WASSERPROG_1_DO: 08:45-11:45
  { 0x180, 0x1741, 0x313e},  // W_WASSERPROG_1_DO_SCHALT_2: 12:15-15:30
  { 0x180, 0x1742, 0x414a},  // W_WASSERPROG_1_DO_SCHALT_3: 16:15-18:30
  { 0x180, 0x1750, 0x232f},  // W_WASSERPROG_1_FR: 08:45-11:45
  { 0x180, 0x1751, 0x313e},  // W_WASSERPROG_1_FR_SCHALT_2: 12:15-15:30
  { 0x180, 0x1752, 0x414a},  // W_WASSERPROG_1_FR_SCHALT_3: 16:15-18:30
  { 0x180, 0x1760, 0x232f},  // W_WASSERPROG_1_SA: 08:45-11:45
  { 0x180, 0x1761, 0x313e},  // W_WASSERPROG_1_SA_SCHALT_2: 12:15-15:30
  { 0x180, 0x1762, 0x414a},  // W_WASSERPROG_1_SA_SCHALT_3: 16:15-18:30
  { 0x180, 0x1770, 0x232f},  // W_WASSERPROG_1_SO: 08:45-11:45
  { 0x180, 0x1771, 0x313e},  // W_WASSERPROG_1_SO_SCHALT_2: 12:15-15:30
  { 0x180, 0x1772, 0x414a},  // W_WASSERPROG_1_SO_SCHALT_3: 16:15-18:30
  { 0x180, 0xfda7, 0x0000},  // SCHNELLAUFHEIZUNG: 0
  { 0x180, 0xfda8, 0x0100},  // FEHLERANZAHL: 256
  { 0x180, 0xfdaa, 0x0000},  // BUSKONTROLLE: 0
  { 0x180, 0xfdad, 0x0000},  // WP_PUMPENSTATUS: 0
  { 0x180, 0xfdae, 0x0100},  // WP_STATUS: 1
  { 0x180, 0xfdaf, 0x0000},  // DAUERLAUF_PUFFERLADEPUMPE: 0
  { 0x180, 0xfdb0, 0x1400},  // SCHALTWERKDYNAMIKZEIT: 20
  { 0x180, 0xfdb1, 0x1e00},  // STILLSTANDZEIT: 30
  { 0x180, 0xfdb2, 0x0100},  // PUMPENZYKLEN: 1
  { 0x180, 0xfdb3, 0x0100},  // GEBAEUDEART: 1
  { 0x180, 0xfdb4, 0x0100},  // SOMMERBETRIEB: on
  { 0x180, 0xfdb6, 0x0000},  // IMPULSRATE: 0
  { 0x180, 0xfdb7, 0x0000},  // SOLARBETRIEB: 0
  { 0x180, 0xfdb8, 0x0100},  // WAERMEMENGE: 1
  { 0x180, 0xfdb9, 0x0000},  // AUTOMATIK_WARMWASSER: off
  { 0x180, 0xfdba, 0x0100},  // ZWEITER_WE_STATUS: 256
  { 0x180, 0xfdbb, 0x0000},  // WPSTUFEN_WW: 0
  { 0x180, 0xfdbc, 0x0000},  // WW_MIT_2WE: 0
  { 0x180, 0xfdbd, 0x0000},  // SPERREN_2WE: 0
  { 0x180, 0xfdbf, 0x0000},  // DYNAMIK: 0
  { 0x180, 0xfdc0, 0x0000},  // PARTYSTUNDEN: 0


Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 29 August 2022, 15:16:37
@robob @HGButte setzt Ihr die Befehle zur Veränderung der Soll-Wassertermperatur auf dem Haupt- CAN, auf dem auch das Steuergerät der Wärmepumpe liegt ab oder an dem CAN für das ISG Gateway?
Ein Freund von mir hat eine Tecalor Wärmepumpe und eine Photovoltaikanlage. Für ihn möchte ich gerne das was einige User hier vorhaben mit Hilfe eines Scripts, welches im Home assistant Appdaemon läuft, umsetzen. Zusätzlich soll die Wettervorhersage einfließen, so dass der Pufferspeicher frühmorgens hochgefahren wird im Niedrigtarif wenn keine Sonne zu erwarten ist und umgekehrt damit gewartet wird bis die Sonne scheint. Das Script werde ich dann auch mal an passender Stelle publizieren.
Ich denke ich habe so weit alles zusammen. Nur bei meiner eigenen Stiebel Eltron Wärmepumpte lese ich bisher nur Daten aus. Deshalb stelle ich mir die Frage, ob ich für Befehle auf dem ISG Gateway/FE CAN bus absenden (CAN B im Handbuch des WPM, https://www.tecalor.de/content/dam/tec/cdbassets/current/bedienungs-_u_installationsanleitungen/wpm_installationmanual_doc-00060140.pdf) absenden muss?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 03 September 2022, 02:50:39
Zitat von: Vincent82 am 29 August 2022, 15:16:37
@robob @HGButte setzt Ihr die Befehle zur Veränderung der Soll-Wassertermperatur auf dem Haupt- CAN, auf dem auch das Steuergerät der Wärmepumpe liegt ab oder an dem CAN für das ISG Gateway?
Ich blick da noch nicht durch. Aber es gibt doch nur einen Bus und jedes Gerät hat eine Nummer oder habe ich was falsch verstanden?

Was ist überhaupt was?

  can0  480   [7]  96 00 FD 01 00 00 00
  can0  180   [7]  36 00 FD 01 00 00 00
  can0  300   [7]  66 00 FD 00 00 00 00
  can0  680   [7]  D6 00 FD 00 00 00 00
  can0  500   [7]  A6 00 FD 01 00 00 00
  can0  180   [7]  66 79 FE 01 00 00 00
  can0  480   [7]  A6 79 FE 01 00 00 00
  can0  180   [7]  C6 03 FE 01 00 00 00
  can0  180   [7]  60 79 23 00 00 00 00


Scan ich mit ./can_scan can0 700 680 | tee ../log_can_scan_680.log usw. folgerte ich aus den Logdateien:
180: liefert gleiche Werte wie 300 und 480???
300: dito 180???
480: dito 180???
500: liefert keine Werte
680: liefert noch mehr Werte die zugeordnet werden, aber alle haben den Wert 0, wieso?

Nach 50_Elster.pm
my $direkt    = "000";
my $kessel    = "180";
my $bedien_1  = "301";
my $bedien_2  = "302";
my $manager   = "480";
my $heiz      = "500";
my $mischer_1 = "601";
my $mischer_2 = "602";

my $sender_id = "680";


Ich hätte nur zwei «Geräte» erwartet, die Steuerung in der Wärmepumpe (IWS?) und den WPMII. Was ist nun was und was soll als «sender can id» verwendet werden? Ich habe nun mal 700 eingesetzt, um nicht zwei mal 680 zu haben. Mal gucken ob sich die Verbindung zum Bus nun nicht mehr zwischen durch «aufhängt».

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Vincent82 am 04 September 2022, 09:39:20
Zum zweiten CAN:
Im WPM Installationmanual ist von CAN A und B die Rede, siehe hier: https://www.stiebel-eltron.de/content/dam/ste/cdbassets/current/bedienungs-_u_installationsanleitungen/wpm_installationmanual_doc-00060432.pdf
Kann aber auch sein, dass das zwei Steckplätze für den selben CAN sind.

Zum Protokoll:
Im KNX Userforum hat jemand eine sehr gute Doku zum Protokoll gepostet: https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/38306-plugin-f%C3%BCr-stiebel-eltron-lwz-304-404-can-bus (dritter Beitrag). Diese Beschreibung sollte Deine Fragen beantworten.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 06 September 2022, 21:40:47
Zitat von: Vincent82 am 04 September 2022, 09:39:20
Zum Protokoll:
Im KNX Userforum hat jemand eine sehr gute Doku zum Protokoll gepostet: https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/38306-plugin-f%C3%BCr-stiebel-eltron-lwz-304-404-can-bus (dritter Beitrag). Diese Beschreibung sollte Deine Fragen beantworten.

Das habe ich auch mal gefunden, aber mangels Benutzerkonto dort konnte ich es nicht runterladen. Dann muss ich mich wohl dort auch mal noch anmelden.

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 06 September 2022, 22:12:09
Zitat von: Vincent82 am 04 September 2022, 09:39:20
Zum zweiten CAN:
Im WPM Installationmanual ist von CAN A und B die Rede, siehe hier: https://www.stiebel-eltron.de/content/dam/ste/cdbassets/current/bedienungs-_u_installationsanleitungen/wpm_installationmanual_doc-00060432.pdf
Kann aber auch sein, dass das zwei Steckplätze für den selben CAN sind.

Habe einen WPMII der hat nur einen CAN Anschluss an welchem die WP hängt. Dazwischen haben ich nun den CAN-Bus-Adapter angeschlossen. Leider kann ich zwischen durch keinen Werte mehr abrufen. Da meistens ein «shutdown restart» in FHEM reicht, vermute ich ein Problem mit der 50_Elster.pm.

Bilder von der Verdrahtung sind angehängt.

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 08 September 2022, 21:10:09
Nach einiger Zeit (etwas 1 Tag) lande ich bei diesem Fehler:
./can_progs/can_scan can0 700 680
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)


Aktuell bin ich etwas ratlos, wieso das so ist. Meine suche ergab, dass es evtl. damit zusammenhängt das zu viele «Verbindungen» offen sind, also irgendwelche nicht beendet werden?

Ich habe nun mal zum testen in FHEM alles mit CAN-Bus rausgenommen und logge mal mit folgendem BASH-Skript (aufruf via Cron alle 5 Minuten):

#!/bin/bash

# Format der Einträge in der Log-Datei:
# 2022-09-08_21:30:06 Stiebel SPEICHERISTTEMP: 42.8

LOGDATEI="/opt/fhem/log/Stiebel_FileLog-2022.log"

TRENNER=" "
ZEITPUNKT=$(date +%Y-%m-%d_%H:%M:%S)
GERAET="Stiebel"

WERT1=$(/usr/local/bin/can_scan can0 700 180.000e |grep value)
WERT1=${WERT1#*\(} # alles vor und mit der ( Klammer löschen
WERT1=${WERT1%\)*} # alles ab und mit der ) Klammer löschen
BEZEICHNUNG1=$WERT1
BEZEICHNUNG1=${BEZEICHNUNG1%\ *} # alles ab dem Leerzeichen löschen
BEZEICHNUNG1=${BEZEICHNUNG1%?}":" # letztes Zeichen löschen (Leerzeichen)
WERT1=${WERT1#*\ } # Alles vor und mit dem Leerzeichen löschen

echo $ZEITPUNKT $TRENNER $GERAET $TRENNER $BEZEICHNUNG1 $WERT1 >> "$LOGDATEI"

WERT2=$(/usr/local/bin/can_scan can0 700 180.000c |grep value)
WERT2=${WERT2#*\(} # alles vor und mit der ( Klammer löschen
WERT2=${WERT2%\)*} # alles ab und mit der ) Klammer löschen
BEZEICHNUNG2=$WERT2
BEZEICHNUNG2=${BEZEICHNUNG2%\ *} # alles ab dem Leerzeichen löschen
BEZEICHNUNG2=${BEZEICHNUNG2%?}":" # letztes Zeichen löschen (Leerzeichen)
WERT2=${WERT2#*\ } # Alles vor und mit dem Leerzeichen löschen

echo $ZEITPUNKT $TRENNER $GERAET $TRENNER $BEZEICHNUNG2 $WERT2 >> "$LOGDATEI"

Mal sehen ob damit länger als einen Tag Werte kommen.

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 11 September 2022, 19:23:12
Zitat von: tomix am 08 September 2022, 21:10:09
Ich habe nun mal zum testen in FHEM alles mit CAN-Bus rausgenommen und logge mal mit folgendem BASH-Skript (aufruf via Cron alle 5 Minuten):
...
Mal sehen ob damit länger als einen Tag Werte kommen.
Scheint stabil zu laufen. Werde das nun weiter beobachten und falls dies so weiter stabil läuft, werde ich die zu loggenden Daten mal erhöhen. Falls es dann immer noch stabil ist, versuche ich dann die 50_Elster.pm zu verstehen bzw. werde eine Lösung suchen, um den Warmwasserwert ändern zu können.

Läuft leider auch nicht stabil, nur etwas länger, aber nach einiger Zeit bin ich beim selben Fehler:

/usr/local/bin/can_scan can0 700 180.000e
elster-kromschroeder can-bus address scanner and test utility
copyright (c) 2014 Jürg Müller, CH-5524

socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)
socket error (write) 105: ENOBUFS (No buffer space available)
no value read


dmesg meint jeweils:

usb 2-2: USB disconnect, device number 73
gs_usb 2-2:1.0 can0: Couldn't shutdown device (err=-19)

Evtl. stimmt auch etwas mit dem USB-Port nicht. Werde mal weiter nach der Ursache suchen.

Der USB-Port verabschiedet sich etwa jeden Tag wie folgt:

usb usb5-port2: disabled by hub (EMI?), re-enabling...


Anschliessen hängt vermutlich auch der CAN-Bus (erscheint mir nicht logisch, aber die Heizung will dann auch nicht mehr).

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: robob am 29 Oktober 2022, 19:08:52
Hallo,

ich hab mal eine Verständnisfrage zu den Adressen:

Jürg gab ja den Hinweis auf seiner Seite, dass die CAN-Adressen über die Bitmaske 8*(X0 & F0)+(0Y & 0F) definiert werden.
Wobei hierbei X den 1. Digit und Y den 4. Digit darstellt.

Das funktioniert wunderbar mit einer Adresse wie 0x180 => 180/8 = hex 30 == 8*(30&F0)+(00&0F) = 180

Jemand empfängt aber Telegramme von der Adresse 0x1C0. Hier funktioniert das nicht: 1C0/8 = hex 38 != 8*(30&F0) + (08&0F) = 188

Welche Digits müssen hier an die Stelle der Adresse im Anfrage-Telegramm?
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomix am 10 November 2022, 19:31:17
Zitat von: tomix am 11 September 2022, 19:23:12
dmesg meint jeweils:

usb 2-2: USB disconnect, device number 73
gs_usb 2-2:1.0 can0: Couldn't shutdown device (err=-19)

Evtl. stimmt auch etwas mit dem USB-Port nicht. Werde mal weiter nach der Ursache suchen.

Inzwischen läuft es stabil. Mit einem neuen USB-Kabel (1.5 m) ohne Verlängerung wurde es noch schlimmer. Also habe ich die Leitung für den USB-Adapter aus dem Verteilkasten rausgeführt und zusätzlich verdrillt. Dann reicht das USB-Kabel ohne Verlängerung und die Verbindung läuft nun seit Ende September stabil.

Jetzt werde ich mal zurück auf die 50_Elster.pm wechseln.

Was mir bis jetzt beim manuellen setzen der Speichertemperatur (Warmwassertemperatur) aufgefallen ist, dass bei einer zu tiefen Speichertemperatur für die Nacht, am Tag dann der Speicher nicht hoch geheizt wird. Beides runter zu setzen und dann gegen Ende der Ferien hoch zu setzten, war allerdings kein Problem.

Gruss
tomix
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: momad am 04 Dezember 2022, 19:27:46
Hallo zusammen,

hat jemanden vielleicht hier bereits ein SET Befehl via MQTT erfolgreich implementiert bzw. im Einsatz?
ich habe ein Homeassitant und Empfange dort erfolgreich alle Daten von meiner Stiebel via MQTT.
Nun möchte ich gerne aus dem Homeassitant die Temperatur setzen via "SET" und finde hierfür bisher keine Lösung.

Vielen Dank!
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tywe am 22 Dezember 2022, 21:29:16
Guten Abend allerseits!
Wer FEK hat, sieht bitte, welche Pakete und an welche Adressen es sendet, wenn es eingeschaltet ist.
Interessiert daran, wie WPMi feststellt, dass ein FEK im Bus aufgetaucht ist.
Ich möchte eine Nachahmung machen.
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: choetzu am 06 Januar 2023, 12:23:51
Guten Mittag,
ich habe gestern meinen Raspi4 von Buster auf Bullseye upgegraded.. Lief eigentlich alles rund, bis auf das Elster Modul, das läuft leider nicht mehr. Siehe Log Eintrag.
Was könnte da die Ursache sein? Bei Tante Google kam ich irgendwie nicht weiter.

2023.01.06 11:51:28 1:  reload: Error:Modul 50_Elster deactivated:
Can't load './FHEM/elster_perl.so' for module elster_perl: libperl.so.5.28: Kann die Shared-Object-Datei nicht öffnen: Datei oder Verzeichnis nicht gefunden at /usr/lib/arm-linux-gnueabihf/perl-base/DynaLoader.pm line 187, <$fh> line 1203.
at FHEM/elster_perl.pm line 11.
Compilation failed in require at ./FHEM/50_Elster.pm line 64, <$fh> line 1203.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 64, <$fh> line 1203.

2023.01.06 11:51:28 0:  Can't load './FHEM/elster_perl.so' for module elster_perl: libperl.so.5.28: Kann die Shared-Object-Datei nicht öffnen: Datei oder Verzeichnis nicht gefunden at /usr/lib/arm-linux-gnueabihf/perl-base/DynaLoader.pm line 187, <$fh> line 1203.
at FHEM/elster_perl.pm line 11.
Compilation failed in require at ./FHEM/50_Elster.pm line 64, <$fh> line 1203.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 64, <$fh> line 1203.


Danke für Eure Hilfe.

Lg c


EDIT GELOEST: -> es lag nicht am Modul sondern an der libperl.so.5.28 Datei. .. Mit folgendem Code konnte ich es beheben

ln -s /usr/lib/arm-linux-gnueabihf/libperl.so.5.32 /usr/lib/arm-linux-gnueabihf/libperl.so.5.28

Evtl. noch ein sudo davor...
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: jailbreaker07 am 03 Februar 2023, 08:30:23
Hallo, ich versuche auch seid einiger Zeit die Stiebel WPF 13 bei Fhem einzubinden. Die Aktuelle Can-Progs habe ich herunter geladen und die Dateien nach Anleitung verschoben. Jedoch bekomme ich beim öden von den Modul immer folgenden Fehler: Can't locate elster_perl.pm in @INC (you may need to install the elster_perl module) (@INC contains: ./lib ./FHEM . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.32.1 /usr/local/share/perl/5.32.1 /usr/lib/arm-linux-gnueabihf/perl5/5.32 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl-base /usr/lib/arm-linux-gnueabihf/perl/5.32 /usr/share/perl/5.32 /usr/local/lib/site_perl) at ./FHEM/50_Elster.pm line 64.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 64.
Was muss ich hier ggf. noch anpassen? Den Raspberry habe ich mit fhem komplett neu aufgesetzt...

Vielen Dank

Gruß

Thorsten
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: jailbreaker07 am 07 Februar 2023, 07:54:09
Ich habe es jetzt hin bekommen das fhem das Modul lädt. Anfangs klappt das auch mit den Abfragen der Werte. Jedoch, nach kurzer Steig kommt als Antwor immer nur ein "?". Auch ein Neustart bringt nichts. Das einzigen was teilweise hilft ist das löschen des Moduls mit anschließenden Neustart von fhem und einen neu Anlegen des Elster Device. Dann funktioniert es wieder für kurze Zeit....
Den Raspberry habe ich schon komplett neu aufgesetzt....

In der 50_Elster.pm haben Ich für  mein USBtin folgendes stehen:
# Adaptertyp hier definieren!
  # Default device:
  #   Linux: can0 / SocketCAN
  #   Win: COM1 / can232
  #
elster_perl::set_can232(); # USBtin
  # elster_perl::set_cs();     # für das optische In>
  elster_perl::toggle_trace();


Vielen Dank

Gruß

Thorsten
Titel: Antw:Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 09 Februar 2023, 20:45:39
Zitat von: tywe am 22 Dezember 2022, 21:29:16
Guten Abend allerseits!
Wer FEK hat, sieht bitte, welche Pakete und an welche Adressen es sendet, wenn es eingeschaltet ist.
Interessiert daran, wie WPMi feststellt, dass ein FEK im Bus aufgetaucht ist.
Ich möchte eine Nachahmung machen.

Das würde mich auch brennend interessieren.

Hier im Thread sind ja ein paar Posts zu FEK.
Also ich kann per
601 0011 Raumtemperatur
601 0012 Raumtemperatur soll
Abfragen.

Bekomme beides Mal -40.0 gesendet.
Versuche ich als Raumtemperatur was anderes als -40.0 zu setzen bekomme ich einen Fehler. -40.0 wird aber positiv quittiert.

Ich bin mir nicht sicher ob an Klemme X2 alle 4 Leitungen (H, L, T und +) belegt werden müssen damit der WPM eine FEK oder das Gateway erkennen. In einer Anleitung steht dass selbst beim Gateway alle 4 Leitungen angeklemmt werden müssen obwohl das Gateway separat mit Strom versorgt wird.
Ich bin aktuell nur auf H und L mit dem CAN Bus.
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: tomcat am 25 Juni 2023, 18:15:01
Warum den umständlichen Weg über eine FEK Simulation gehen?
Num doch einfach einen langsam laufenden PID Controller.
Input ist die Raumtemp des Zielraumes. Setpoint die Heizkurve oder Komforttemperatur.
Dann hast Du das gleiche und alles was Du dafür brauchst ist bekannt und dokumentiert.
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 08 Oktober 2023, 23:58:36
Komme nicht mehr weiter. Habe heute meinen Raspi auf Bookworm aktualisiert.

Nachdem Neustart läuft das Elster Modul nicht mehr hoch.

RuntimeError Usage: setsniffedframe(params); at ./FHEM/50_Elster.pm line 495, <$fh> line 1794.

Ich habe jetzt alles versucht.
Can Controller ist per cannelloni über einen zweiten Raspi angebunden.
Danke für die Hilfe.

//Edit:
Habs gefunden. Umstieg auf perl 5.36
CORE_PATH in "can_elster_perl.arm" auf 5.36 angepasst.
Anschließend nochmal "can_elster_perl.arm" ausgeführt.

Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: mwuerr am 30 Oktober 2023, 21:56:44
Hallo,
Hat irgendjemand von euch CAN an der Tecalor THZ 504 / Stiebel Eltron LWZ 504 / Stiebel Eltron LWZ 8 CS Premium
am laufen?

Oder nutzt ihr alle USB?
Zitat von: parabacus am 01 Februar 2018, 19:37:28... an meine LWZ-504 zu kommen.
Inzwischen habe ich aber dafür eine "elegantere" Lösung gefunden, da die 504 auch USB hat und es dazu das FHEM-Modul THZ gibt.


Bei mir Läuft es mehr schlecht als recht. Insbesondere scheitert der scan.
Ich habe mir alle Werte die ich habe durch zuhören oder ausprobieren herausgesucht.

Akut bin ich auf der Suche nach "Istwert HK1" laut Bezeichnung auf dem Display. In der "ElsterTabelle.inc" von @juerg5524 werde ich dazu nicht fündig, vermutlich heißt es ganz anders, oder ich bin einfach blind.

Welche CanID/Elsterid hat "Istwert HK1" bei euch?
Unabhängig davon ob ihr eine 504 habt, und insbesondere falls ihr eine habt.


Falls es jemand anderem hilft hier die IDs die ich gefunden habe:

switch(msg.payload.canElsterIndexNotWellDecoded){
    case 0xFA0001:
        msg.payload.canElsterVariableName = "Fehlermeldung(en)"; // ungetestet
        break;
    case 0xFA0003:
        msg.payload.canElsterVariableName = "Speichertemperatur Soll";
        break;
    case 0xFA0004:
        msg.payload.canElsterVariableName = "VORLAUFSOLLTEMP";
        break;
    case 0xFA000C:
        msg.payload.canElsterVariableName = "Außentemperatur";
        break;
    case 0xFA000E:
        msg.payload.canElsterVariableName = "Speichertemperatur";
        break;
    case 0xFA000F:
        msg.payload.canElsterVariableName = "Vorlauftemperatur";
        break;
       
    case 0xFA0013:
        msg.payload.canElsterVariableName = "WW-Soll-Tag";
        break;


    case 0xFA0016:
        msg.payload.canElsterVariableName = "Rücklauftemperatur";
        break;
    case 0xFA0112:
        msg.payload.canElsterVariableName = "PROGRAMMSCHALTER";
        break;
    case 0xFA0121:
        msg.payload.canElsterVariableName = "WOCHENTAG";
        break;   
    case 0xFA0122:
        msg.payload.canElsterVariableName = "TAG";
        break;
    case 0xFA0123:
        msg.payload.canElsterVariableName = "MONAT";
        break;
    case 0xFA0124:
        msg.payload.canElsterVariableName = "JAHR";
        break;
    case 0xFA0125:
        msg.payload.canElsterVariableName = "STUNDE";
        break;
    case 0xFA0126:
        msg.payload.canElsterVariableName = "MINUTE";
        break;
    case 0xFA0176:
        msg.payload.canElsterVariableName = "BETRIEBS_STATUS";
        break;
    case 0xFA019C:
        msg.payload.canElsterVariableName = "INFO_TYP";
        break;
    case 0xFA019A:
        msg.payload.canElsterVariableName = "Versionsnummer";
        break;
    case 0xFA01DA:
        msg.payload.canElsterVariableName = "VOLUMENSTROM";
        break;
    case 0xFA05BB:
        msg.payload.canElsterVariableName = "Wärmeerzeuger Heizstufe";
        break;
       
       
       
    case 0xFA091E:
        msg.payload.canElsterVariableName = "Stromverbrauch Heizung/Tag Wh";
        break;
    case 0xFA091F:
        msg.payload.canElsterVariableName = "Stromverbrauch Heizung/Tag kWh";
        break;
    case 0xFA0920:
        msg.payload.canElsterVariableName = "Stromverbrauch Heizung Gesamt kWh";
        break;
    case 0xFA0921:
        msg.payload.canElsterVariableName = "Stromverbrauch Heizung Gesamt MWh";
        break;
    case 0xFA091D:
        msg.payload.canElsterVariableName = "Stromverbrauch Warmwasser Gesamt MWh";
        break;
    case 0xFA091A:
        msg.payload.canElsterVariableName = "Stromverbrauch Warmwasser/Tag Wh";
        break;
    case 0xFA091B:
        msg.payload.canElsterVariableName = "Stromverbrauch Warmwasser/Tag kWh";
        break;
    case 0xFA091C:
        msg.payload.canElsterVariableName = "Stromverbrauch Warmwasser Gesamt kWh";
        break;
    case 0xFA091D:
        msg.payload.canElsterVariableName = "Stromverbrauch Warmwasser Gesamt MWh";
        break;
       

/*    case 0xFA0xx:
        msg.payload.canElsterVariableName = "xxx";
        break;
*/
    default:
        msg.payload.unknownVariableName = "unknown variable: " + msg.payload.canElsterIndexNotWellDecoded;
}
return msg;

Spannend ist auch noch wen (CAN Adresse) man danach Fragen muss damit man eine Antwort erhält;
auf einige Dinge kann ich auch nur zugreifen weil sie sowieso zyklisch gesendet werden.

Export der relevanten NodeRed nodes die die Abfragenachrichten erzeugen:
[{"id":"caebafbe5b874c1d","type":"change","z":"9d748d77a2d1bacd","name":"read Stromverbrauch Heizung Gesamt kWh","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA09200000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":510,"y":980,"wires":[["5391972865057a22"]]},
{"id":"8b1241d67d41ca43","type":"change","z":"9d748d77a2d1bacd","name":"Stromverbrauch Warmwasser/Tag Wh","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA091A0000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":1020,"wires":[["5391972865057a22"]]},
{"id":"4c1294631967543b","type":"change","z":"9d748d77a2d1bacd","name":"Stromverbrauch Warmwasser/Tag kWh","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA091B0000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":1060,"wires":[["5391972865057a22"]]},
{"id":"34a0456f0f8cab83","type":"change","z":"9d748d77a2d1bacd","name":"Stromverbrauch Heizung/Tag Wh","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA091E0000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":1100,"wires":[["5391972865057a22"]]},
{"id":"2dc5e8ae2f52d8e2","type":"change","z":"9d748d77a2d1bacd","name":"Stromverbrauch Heizung/Tag kWh","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA091F0000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":1140,"wires":[["5391972865057a22"]]},
{"id":"a63408a1ee45b62d","type":"change","z":"9d748d77a2d1bacd","name":"read Wärmeerzeuger Heizstufe","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA05BB0000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":1200,"wires":[["5391972865057a22"]]},
{"id":"040fc12184373e8e","type":"change","z":"9d748d77a2d1bacd","name":"read Speichertemperatur Soll","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA00030000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1260,"wires":[["5391972865057a22"]]},
{"id":"c4701bd5d0e88d14","type":"change","z":"9d748d77a2d1bacd","name":"read INFO_TYP","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#6101FA019C0000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":1420,"wires":[["5391972865057a22"]]},
{"id":"f163edae1a9af930","type":"change","z":"9d748d77a2d1bacd","name":"read PROGRAMMSCHALTER","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3100FA01120000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":510,"y":1480,"wires":[["5391972865057a22"]]},
{"id":"cbd6d1d62571ebce","type":"change","z":"9d748d77a2d1bacd","name":"read Betriebsart","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#6101FA00680000","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":1560,"wires":[["5391972865057a22"]]}]

Und der bisher einzige Wert den ich, ausgelöst durch PV-Optimierung, schreibe.
WW-Soll-Tag wird zwischen 45 Grad und 50 Grad geschalten wenn viel PV Strom übrig ist.
[{"id":"39dd63507e3f6fbb","type":"change","z":"834b82ada2d2fbf5","name":"write WW-Soll-Tag 50 Grad (erhöht)","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3000FA001301F4","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":860,"y":100,"wires":[["e5c1a91fc13c9346","256d63a9bbcad41a"]]},
{"id":"7f2e1d0947e4843c","type":"change","z":"834b82ada2d2fbf5","name":"write WW-Soll-Tag 45 Grad (default)","rules":[{"t":"set","p":"payload","pt":"msg","to":"6A2#3000FA001301C2","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":870,"y":180,"wires":[["e5c1a91fc13c9346","73e836762720f1df"]]}]


relevante Links die anderen helfen könnten:
* SE vs THZ namen: https://www.stiebel-eltron.de/de/home/unternehmen/stiebel-eltron-tipp-14/inverterregelung-neue-namen-integralgeraete.html
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 26 November 2023, 10:48:31
Sucht du die Ist-Variable der Heizkurve 1?

Bei meiner Tecalor TTF7 ist das
  "HEIZKURVE_1"   => { EIdx => "010e", ID => "301" }

Weiß nicht ob dir das hilft.
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: oldscrewdriver am 28 Januar 2024, 20:39:32
Hallo, ich hab auf Debian Bookworm auch das Problem mit dem Modul 50_Elster.pm.

im Forum ist der Fehler schon so ähnlich mehrfach aufgetreten: die libc6.so wurde da nicht gefunden.
Die symbolischen links habe ich gesetzt und den CORE PATH auf die 5.36 angepasst.

CORE_PATH="/usr/lib/aarch64-linux-gnu/perl/5.36.0/CORE".

Ein reload der 50_Elster.pm bringt mir trotzdem ständig:

Can't load './FHEM/elster_perl.so' for module elster_perl: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./FHEM/elster_perl.so) at /usr/lib/aarch64-linux-gnu/perl/5.28/DynaLoader.pm line 187.
 at FHEM/elster_perl.pm line 11.
Compilation failed in require at ./FHEM/50_Elster.pm line 68.
BEGIN failed--compilation aborted at ./FHEM/50_Elster.pm line 68.

Es sieht so aus als ob er die elster_perl.so einfach nicht laden möchte.
Habt Ihr eine Idee wie ich vorgehen könnte um den Fehler zu finden?

Mit freundlichen Grüßen
Oldscrewdriver
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 29 Januar 2024, 05:58:28
Hast du noch

ZitatAnschließend nochmal "can_elster_perl.arm" ausgeführt

ausgeführt?
Damit wird elster_perl.so neu gebaut.
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: oldscrewdriver am 29 Januar 2024, 06:44:17
Jo, mehrfach!
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 29 Januar 2024, 08:06:21
Hast du Bibliothek auch in den fhem/FHEM Ordner kopiert?

Ansonsten kann ich nochmal heute Abend schauen auf meinem System schauen
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: oldscrewdriver am 29 Januar 2024, 09:19:27
ja , habe ich gemacht, nach Anleitung hier und in den can_progs, schon mehrfach. Irgend etwas habe ich nicht richtig auf dem Raspi installiert denke ich. Woher kommt das:

/usr/lib/aarch64-linux-gnu/perl/5.28/DynaLoader.pm line 187
in der Fehlermeldung? , wie schon geschrieben, den CORE_PATH habe ich auf "5.36" geändert

Könnte das von der FHEM version gesetzt werden?
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 29 Januar 2024, 20:16:48
Was mich gerade stutzig macht ist dass deine DynaLoader.pm auf perl Pfad mit Version 5.28 verweist.

Hast du schon mal den CORE PATH AUF das hier gesetzt

CORE_PATH="/usr/lib/aarch64-linux-gnu/perl/5.28/CORE"

Ich habe bei mir 5.36 installiert.

Was zeigt bei dir der Output von
perl -van.

Bei mir kommt
This is perl 5, version 36, subversion 0 (v5.36.0) built for arm-linux-gnueabihf-thread-multi-64int
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: oldscrewdriver am 29 Januar 2024, 20:38:37
ja, habe ich ausprobiert:
CORE_PATH="/usr/lib/aarch64-linux-gnu/perl/5.28/CORE"

perl -v gibt mir das aus:

perl -v
This is perl 5, version 36, subversion 0 (v5.36.0) built for aarch64-linux-gnu-thread-multi
(with 53 registered patches, see perl -V for m

bei mir war die v 5.28 nie drauf, weil ich den Raspi mit Debian bookworm aufgesetzt hatte, Vllt. liegt daran?

Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 29 Januar 2024, 21:15:35
Den Ordner scheints ja aber zu geben oder?
/usr/lib/aarch64-linux-gnu/perl/5.28
Mein /usr/lib/arm-linux-gnueabihf/perl sieht so aus:
/usr/lib/arm-linux-gnueabihf/perl $ ls -la
insgesamt 92
drwxr-xr-x  5 root root  4096  9. Okt 18:06 .
drwxr-xr-x 69 root root 73728 17. Jan 20:51 ..
lrwxrwxrwx  1 root root     6  8. Jan 2023  5.36 -> 5.36.0
drwxr-xr-x 33 root root  4096  8. Okt 20:20 5.36.0
lrwxrwxrwx  1 root root    19  8. Jan 2023  cross-config -> cross-config-5.36.0
drwxr-xr-x  2 root root  4096  8. Okt 20:20 cross-config-5.36.0
drwxr-xr-x  2 root root  4096  8. Okt 20:20 debian-config-data-5.36.0


Wie sieht denn dein Output von 'can_elster_perl.am' aus?


Der SWIG Aufruf generiert bei mir die 'elster_perl.pm', darin wird aufgeführt:
use base qw(DynaLoader);

Bei mir werden folgende drei Dateien generiert:
-rwxr----- 1 pi   pi       1671 29. Jan 21:03  elster_perl.pm
-rwxr-xr-x 1 pi   pi     451252 29. Jan 21:03  elster_perl.so
-rwxr----- 1 pi   pi      70540 29. Jan 21:03  elster_perl_wrap.cxx

Passiert das bei dir?


Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: oldscrewdriver am 29 Januar 2024, 21:18:36
ich werde diese Woche mal ein Debian 11 (Bullseye) aufsetzen und damit probieren.
Wenns dann läuft mache ich ein Update auf Debian 12 Bookworm.

Danke erstmal für Deine Hilfe HGButte!
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: oldscrewdriver am 29 Januar 2024, 21:23:28
hat sich jetzt überschnitten :-)

ja bei mir werden auch die 3 Dateien neu erzeugt.

ls -l /usr/lib/aarch64-linux-gnu/perl
total 12
lrwxrwxrwx  1 root root   36 Jan 27 13:31 5.28 -> /usr/lib/aarch64-linux-gnu/perl/5.36
lrwxrwxrwx  1 root root    6 Jan  8  2023 5.36 -> 5.36.0
drwxr-xr-x 33 root root 4096 Jan 29 17:24 5.36.0
lrwxrwxrwx  1 root root   19 Nov 25 21:59 cross-config -> cross-config-5.36.0
drwxr-xr-x  2 root root 4096 Jan 13 10:37 cross-config-5.36.0
drwxr-xr-x  2 root root 4096 Jan 13 10:37 debian-config-data-5.36.0
lrwxrwxrwx  1 root root   37 Jan 27 20:16 libperl.so -> /usr/lib/aarch64-linux-gnu/libperl.so
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: HGButte am 29 Januar 2024, 21:57:04
Habe da auch auch nur gefährliches Halbwissen.

"5.28" ist ja nur ein symbolic link auf 5.36.

Würde ihn trotzdem entfernen:

unlink 5.28
Ein letzter Versuch meinerseits.
Titel: Aw: Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers
Beitrag von: Mihca am 11 März 2024, 14:36:23
Liebe CAN-Bus Experten,
ich erhalte nach dieser Anleitung https://forum.iobroker.net/topic/70215/can-bus-interface-esp32-mqtt-und-stiebel-eltron-wp-steuern/2 (https://forum.iobroker.net/topic/70215/can-bus-interface-esp32-mqtt-und-stiebel-eltron-wp-steuern/2) Daten vom CAN-Bus (CAN-BUS X.1.19) einer Stiebel Eltron Wärmepumpe WPE-I 08 HK 230 Premium die Daten per MQTT in fhem. Hier das RAW:

define CAN_BusWP MQTT2_DEVICE CAN_MQTT_Client
attr CAN_BusWP readingList CAN_MQTT_Client:cansniffer/canSend:.* canSend\
CAN_MQTT_Client:cansniffer/alive:.* alive\
CAN_MQTT_Client:cansniffer/pload:.* { json2nameValue($EVENT) }
attr CAN_BusWP room Energie,MQTT2_DEVICE
#   CID        CAN_MQTT_Client
#   DEF        CAN_MQTT_Client
#   FUUID      65b0da27-f33f-e676-502d-22075823b77f37ca
#   IODev      MQTTServer
#   LASTInputDev MQTTServer
#   MQTTServer_CONN MQTTServer_192.168.0.129_53788
#   MQTTServer_MSGCNT 27548
#   MQTTServer_TIME 2024-03-11 12:19:20
#   MSGCNT     27548
#   NAME       CAN_BusWP
#   NR         159
#   STATE      ???
#   TYPE       MQTT2_DEVICE
#   eventCount 27550
#   READINGS:
#     2024-03-11 12:19:20   Data            92 00 FA FD F4 00 F5
#     2024-03-11 12:19:20   ID              0x700
#     2024-03-09 11:51:56   IODev           MQTTServer
#     2024-03-11 12:19:20   Len             7
#     2024-03-11 12:19:17   alive           6345430
#     2024-03-11 10:33:33   canSend         INIT
#
setstate CAN_BusWP 2024-03-11 12:19:20 Data 92 00 FA FD F4 00 F5
setstate CAN_BusWP 2024-03-11 12:19:20 ID 0x700
setstate CAN_BusWP 2024-03-09 11:51:56 IODev MQTTServer
setstate CAN_BusWP 2024-03-11 12:19:20 Len 7
setstate CAN_BusWP 2024-03-11 12:19:17 alive 6345430
setstate CAN_BusWP 2024-03-11 10:33:33 canSend INIT


Ich scheitere daran, aus den beiden Readings "Data" und "ID" einfach "lesbare" Readings zu erzeugen. Meine Idee wäre, über "userReadings" jeweils den Aufruf einer Routine in 99_myUtils.pm zu triggern, die dann die Readings in dem MQTT-Device entsprechend setzt. Bin ich da auf der falschen Denkroute und es gibt elegantere Wege?

Kann jemand helfen.

Danke vorab!

(P.S.: Falls jemand Informationen zu dem ESP, dem MCP2515 CAN Bus Modul, dem Sketch und der Verschaltung benötigt, stelle ich die gerne zur Verfügung.)