Crouzet Millenium 3 SPS Fussbodenheizung

Begonnen von cineflow, 04 November 2017, 18:41:23

Vorheriges Thema - Nächstes Thema

cineflow

Hallo fhem Forum,

in meinem Haus kümmert sich eine Crouzet Millenium 3 SPS um die Temperaturregelung der Räume. In jedem Raum gibt es Temperaturfühler und die SPS regelt das Öffnen und Schließen der entsprechenden Stellantriebe. Mit einem Schnittstellenumsetzer TCP<->RS232 ist sie an mein Netzwerk angebunden.
IST-Temperaturen abfragen, SOLL-Temperaturen festlegen und noch einiges mehr kann ich mit einer APP (PLC SmartHome).

Nun würde ich sie natürlich gern auch in fhem einbinden. Was brauche ich dafür und wie soll ich vorgehen?

Meine Fähigkeiten im Programmieren sind auf Level-Einsteiger, zumindest hab ich noch nie ein Modul geschrieben.

Hat jemand von euch einen hilfreichen Ratschlag für mich?

Liebe Grüße
cineflow

John

Die Frage ist, welches Protokoll die SPS unterstützt.

Im Internet findet man Hinweise darauf, daß Modbus RTU (serielle Schnittstelle) bzw. Modbus TCP unterstützt wird .

Dazu gibt es auch einen Wiki-Eintrag

https://wiki.fhem.de/wiki/Modbus


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

cineflow

#2
#Ich habe zwei nicht relevante Posts von mir selbst gelöscht#

Also, zum auslesen aller Werte muss ein ASCII codierter HEX Befehl per TCP an die SPS gesendet werden. So sieht das aus:

"3a 30 34 30 33 30 30 30 30 46 46 30 30 36 30 39 41 0d 0a" an <IP>:<Port>

Ich habe das mit dem PacketSender ausprobiert. Funktioniert super.
Die SPS schickt dann eine Antwort mit dem Status aller ihrer Adressen an den Anfragenden zurück. Die ersten 7 Bytes sind für mich unwichtig, dann kommen 192 Bytes an Daten (48 Adressen a 4 Bytes).

IST Temperatur für Raum 1 beispielsweise sind die Bytes 133-136.
So:

"30 38 37 37" also 0877 als HEX = 2167 DEC -> Raum 1 IST = 21,67 Grad Celsius

Ich brauche also ein Modul das folgendes kann:

- den Abfragebefehl senden ... der ist immer gleich, muss also (nur) per TCP gesendet werden
- die Antwort erhalten/speichern
- diese in diverse Byte Quartette zerlegen
- das Quartett in einen HEX Wert convertieren ... 30=0; 31=1; ... ; 39=9; 41=A; 42=B; ... ; 46=F
- den HEX Wert in einen dezimalen convertieren ... ?
- den DEC Wert als reading bereitstellen

Ich würde gern für 6 Räume (an welcher Stelle die Quartette sind weiß ich) die entsprechenden Werte lesen, darstellen und loggen können.
Wenn das geschafft ist denke ich über das Schreiben von SOLL Werten nach ;-).
Kann mir jemand da eine Starthilfe geben?

Liebe Grüße
cineflow

fiedel

Am "einfachsten" geht das mit dem Modul ECMD. Das ist für genau solche Fälle gemacht. Cooler wäre natürlich ein eigenes Modul, aber wenn man es geschafft hat die "classdef" zu verstehen und eine passende zu erstellen, ist der Weg dort hin wohl leichter. Mir steht das übrigens auch noch bevor...

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

cineflow

#4
Define als ECMD funktioniert und baut auch eine stabile Kommunikationsverbindung auf. Die classdef verstehe ich allerdings nicht mal im Ansatz. Ich habe versucht eine in der Wiki gefundene classdef (AVRNETIO) zu modifizieren, ohne Erfolg.
Ich habe auch festgestellt, dass das ECMD Modul eine dauerhafte Verbindung zu meiner SPS aufbaut und damit meine anderen Geräte, die Kommunikation mit ihr wollen ausschließt. Das ist suboptimal.

Da die Statusabfrage der SPS nur ein einziger Befehl und eine einzige Antwort sind, dachte ich man könnte das vielleicht auch mit einer Socket Verbindung lösen. Also hab ich das in meine myUtils geschrieben:


### crouzet ###

sub SPS_READALL {
my ($statusrequest) = "$_[0]";
my $SendData="";


$SendData = "$statusrequest";
my ($socket,$data);

$socket = new IO::Socket::INET(PeerAddr=>'192.168.178.238:1009',Proto=>'tcp',Listen=>1) or die "ERROR in Socket Creation : $!\n";
$socket->send($SendData);
my ($socket,$recieved_data);
$socket->recv($recieved_data,1024);

{fhem ("set SPS_recv ".$recieved_data)};

$socket->close();

}


In die fhem.config das hier:


define SPS_call at +*00:15:00 {SPS_READALL("3a 30 34 30 33 30 30 30 30 46 46 30 30 36 30 39 41 0d 0a")}


In der Hoffnung, dass alle 15 Minuten der Befehl zur Statusabfrage an die SPS gesendet wird, die antwortet und der erhaltene Datensatz in einen Dummy namens SPS_recv geschrieben wird, zur weiteren Verarbeitung eben.
Das passiert aber nicht.

Im Log steht das hier:


2017.11.23 00:36:45 1: ERROR evaluating {SPS_READALL("3a 30 34 30 33 30 30 30 30 46 46 30 30 36 30 39 41 0d 0a")}: send: Cannot determine peer address at ./FHEM/99_myUtils.pm line 47.

2017.11.23 00:36:45 3: SPS_call: send: Cannot determine peer address at ./FHEM/99_myUtils.pm line 47.



Was stimmt hier nicht, oder ist es gar mein Ansatz der falsch ist?

der Micha

SimonFoag

Hallo, bist du hier schon weitergekommen?
Grüße Simon

cineflow

Ja bin ich. Wofür suchst du eine Lösung?

Holsteiner_Jung

Moin,

Ich nutzt die selbe Sps nur für meine Aussenrollos, würde mich auch interessieren wie du es nun letztendlich gelöst hast.

Gruß Florian