Stiebel-Eltron mit CAN-Bus unter Verwendung eines C++-Wrappers

Begonnen von juerg5524, 14 Oktober 2015, 13:43:31

Vorheriges Thema - Nächstes Thema

Mastermind1

#75
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?

mmeine

#76
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

juerg5524

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

mmeine

#78
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

mmeine

#79
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

mmeine

#80
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.

juerg5524

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

parabacus

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..!
Stiebel Eltron LWZ 504 / FHEM auf Rasperry Pi 3 / THZ / Weather / TABLETUI / SB_SERVER / SB_PLAYER  / OBIS / Verkehrsinfo / speedtest / Presence / FRITZ / ZWDongle / ZWAVE / Calendar / CALVIEW/ IPCAM/ ABFALL / ESPEasy

intershopper

#83
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

mmeine

#84
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.

juerg5524

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

mmeine

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.

juerg5524

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

juerg5524

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

mmeine

Danke Jürg,

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

Gruß Markus