Bosch Junkers Control CT100

Begonnen von Mike_GKA, 21 Juli 2017, 11:10:45

Vorheriges Thema - Nächstes Thema

Mike_GKA

Meine Bosch Junkers Control CT100 habe ich mit den Modulen BDKM und KM200 nicht ansprechen können und ich habe sehr viel Zeit investiert.
Bei KM200 kommt die Fehlermeldung: No proper Communication with Gateway: write error: Connection reset by peer
und bei BDKM: communication ERROR in state reading ids ERROR - retrying every 60s: write error: Connection reset by peer

Bei meinen Recherchen fand ich den nefit-easy-server: https://github.com/robertklep/nefit-easy-http-server

Diesen habe ich erfolgreich installiert und mit FHEM angesprochen.
Wie man dies macht beschreibe ich nachfolgend für Raspberry Model 1 (sollte auch für neuere Raspberry Modell funktionieren, jedoch muss dort ein anderes node-Paket genommen werden)
Der nefit-easy-server braucht node (in neuerer Version), das zuerst installiert werden muss.

cd ~
wget https://nodejs.org/dist/v6.11.1/node-v6.11.1-linux-armv6l.tar.xz
tar -xvf node-v6.11.1-linux-armv6l.tar.xz
cd node-v6.11.1-linux-armv6l/
sudo cp -R * /usr/local/
node -v


Ich bekam dann einen Fehler wegen fehlender Abhängigkeiten, die ich noch installieren musste:
sudo apt-get install gcc-4.8 g++-4.8

Damit lief node und jetzt wird der nefit-easy-server installiert:
sudo npm i nefit-easy-http-server -g

Das dauert eine ganze Weile. Man kann den Erfolg dann prüfen mit:
easy-server -h

Um den easy-server zu starten und dann auch bei einem Restart vom Raspberry neu zu starten habe ich ein kleines Skript start_nefit-easy-http-server.sh  erstellt mit folgendem Inhalt:
#!/bin/bash
easy-server --serial=<serial> --access-key=<access-kex> --password=<password> --host=<host>


<serial>: ist der Name vom CT100, eine 9 stellige Nummer ohne die Lerrzeichen
<access-key>: steht hinten auf der CT100
<password>: ist das Passwort, das man selber vergeben hat bei der Inbetriebnahme vom CT100
--host=<host>: ist optional. Default ist 127.0.0.1 dann kann man nur innerhalb des Raspberry auf den easy-server zugreifen, sonst setzt man hier halt die IP-Adresse des Raspberry.

Damit nicht jeder diese Daten sehen kann:
sudo chmod 711 start_nefit-easy-http-server.sh

Zum Autostart verwende ich pm2 (könnte man auch anders machen):
sudo npm install pm2@latest –g
sudo pm2 start <path>/start_nefit-easy-http-server.sh
sudo pm2 save


<path> muss entsprechend angepasst werden.
Das dauert auch wieder eine ganze Weile, also Geduld!

Damit pm2 auch automatisch startet und damit dann auch der nefit-easy-http-server.

sudo pm2 startup


So jetzt müsste also eigentlich alles laufen und wir testen z.B. mit:
curl http://127.0.0.1:3000/api/status

Statt 127.0.0.1 muss hier die IP-Adresse des Raspberry stehen, falls man oben host gesetzt hat.
Die Antwort ist ein JSON-String, der z.B. die Temperatur im Haus, die Soll-Temperatur und die Außen-Temperatur enthält.
Mit:
curl -XPOST http:// 127.0.0.1:3000/bridge/heatingCircuits/hc1/temperatureRoomManual -d '{"value":20}' -H 'Content-Type: application/json'

kann man dann z.B. die Soll-Temperatur setzen.
Interessant ist auch:
curl http:// 127.0.0.1:3000/bridge/ecus/rrc/recordings/yearTotal

Damit bekommt den Verbrauch seit Jahresbeginn in kWh.

Weitere Infos zum easy-server und dem api findet man unter:
https://github.com/robertklep/nefit-easy-http-server
https://github.com/robertklep/nefit-easy-core/wiki/List-of-endpoints

Da wir jetzt den easy-server mit http ansprechen können, ist natürlich in FHEM das Modul HTTPMOD bestens geeignet. Also definieren wir in FHEM:
define CT100_Status HTTPMOD http://127.0.0.1:3000/api/status 900
attr CT100_Status userattr reading01JSON reading01Name reading02JSON reading02Name reading03JSON reading03Name
attr CT100_Status reading01JSON in house temp
attr CT100_Status reading01Name t_inhouse
attr CT100_Status reading02JSON temp setpoint
attr CT100_Status reading02Name t_setpoint
attr CT100_Status reading03JSON outdoor temp
attr CT100_Status reading03Name t_outdoor


Zum Lesen der Verbrauchsdaten definieren wir ein weiteres HTTPMOD-Device:
define CT100_yearTotal HTTPMOD http://127.0.0.1:3000/bridge/ecus/rrc/recordings/yearTotal 900
attr CT100_yearTotal userattr reading01JSON reading01Name reading02JSON reading02Name
attr CT100_yearTotal reading01JSON value
attr CT100_yearTotal reading01Name value
attr CT100_yearTotal reading02JSON unitOfMeasure
attr CT100_yearTotal reading02Name unit


Der Rest ist dann Standard, also bei Bedarf Logfiles und svg-Grafiken definieren.

Geht man in https://github.com/robertklep/nefit-easy-core/wiki/List-of-endpoints die ,,List of endpoints" durch, dann kann man da noch eine ganze Menge machen. Aber mir reichte das mal für den Anfang.

Es ist meiner Meinung nach auch suboptimal für jeden ,,Endpoint" ein HTTPMOD-Device zu definieren. Das kann man sicher geschickter machen, aber da reichen meine FHEM Kenntnisse nicht aus.
Vielleicht greift ja mal ein anderer diesen Ansatz auf.

PS: Das ist mein erster Beitrag hier im Forum. Nachdem ich so viel in den letzten Monaten von den unzähligen Beiträgen als FHEM-Anfänger profitiert habe, dachte ich es wäre vielleicht mal Zeit, selber etwas bei zu steuern.

chriz

Hi Mike,

klasse Arbeit, habe hier ebenfalls einen CT100 am Start und habe lange nach einer Einbindung in FHEM gesucht. Mittlerweile habe ich das HEATRONIC  Modul im Einsatz (via USB Adapter an der Junkers Therme). Damit kann ich aber leider nur den BUS lesen, also keine Werte setzen.

Kann man mit dem nefit-easy-server nicht sogar den Betriebsdruck der Therme auslesen? Hab das mal auf einigen Screenshots gesehen.



Grüße
Chris


FHEM auf Intel NUC D34010WYK Core i3, SSD, Ubuntu. HomeMatic mit HMLAN (Groundplane Antenne), Fritz DECT!200, FritzBox 7490, EnerGenie EG-PMS2-LAN, Yamaha RX-V475, Netatmo, Withings, Philips hue, Osram Lightify, Flukso Energy Meter, Harmony, RooWifi, Junkers ZSB 24-4 C Heizung via Heatronic HT-BUS

Mike_GKA

Hi Chris,

wie soeben probiert geht das auch:

curl http://127.0.0.1:3000/api/pressure
liefert
{"pressure":25.5,"unit":"bar"}

und alternativ

curl http://127.0.0.1:3000/bridge/system/appliance/systemPressure
liefert
{"id":"/system/appliance/systemPressure","type":"floatValue","recordable":0,"writeable":0,"value":25.5,"unitOfMeasure":"bar","minValue":0,"maxValue":25}

Die unzähligen "api-calls" und "endpoints" sind gelistet (aber nicht sonderlich dokumentiert) zu finden unter:
https://github.com/robertklep/nefit-easy-http-server
https://github.com/robertklep/nefit-easy-core/wiki/List-of-endpoints

Da ich da kein Spezialist in Sachen Heizung bin, ist das bei mir immer raten und probieren.

Gruß
Mike

Mike_GKA

Nachtrag:
Gerade habe ich das Ganze auch auf PI Modell 3 installiert:
Dies gelang völlig analog. Die Annahme, dass node auf dem Modell 3 anders installiert werden muss, stimmte nicht.
Es musste aber nicht die fehlende Abhängigkeit `GLIBCXX_3.4.18' insatlliert werden.

Noch etwas war extrem augenscheinlich: Die Installation erfolgte um ein vielfaches schneller  ;)

Dabei ist mir noch folgendes aufgefallen:
Der PI3 auf dem ich gerade installiert habe läuft in einem völlig anderen Netz, trotzdem funktionierte der Zugriff auf die CT100 einwandfrei.

Das kann für den ein oder anderen ein Vorteil sehe; ich sehe das aber eher etwas kritisch:
Zumindest der Kommunikationsaufbau vom easy-server zur CT100 erfolgt immer über einen Dritten (Bosch, Junkers). Das wollte ich eigentlich vermeiden.
Aber ich hatte das zuvor schon vermutet, da beim Starten des easy-servers keine IP-Adresse angeben werden muss.


SouzA

Moin,

danke für deine Arbeit.
Mir ist noch nicht ganz klar, wir der nefit Server an die Daten kommt. Auch beim zweiten durchschauen habe ich keine URL im Github gefunden, die auf den Bosch-Server deuten könnte.

Ansonsten könnte ich mir vorstellen, dass das HTTPMOD auch ohne den Server hinbekommen könnte. Es fehlt halt die URL...
Da muss ich mich aber auch noch einlesen.

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

Mike_GKA

Hi SouzA,

die URL ist in nefit-easy-core (https://github.com/robertklep/nefit-easy-core/blob/master/lib/index.js) definiert:

[...]
   host : 'wa2-mz36-qrmzh6.bosch.de'
[...]

und dahinter steckt anscheinend ein XMPP-Server.

So wie ich das verstehe (was jetzt nicht unbedingt stimmen muss) ist netfit-easy-core ein XMPP-Client, der fest mit dem Bosch XMPP-Server verbunden ist. Mit der Installation von nefit-easy-http-server werden natürlich auch alle Abhängigkeiten installiert, und darunter ist dann auch netfit-easy-core. In netfit-easy-core findet auch einiges an Ver-/Entschlüsselung statt.

Wenn man alles so wie beschrieben installiert hat, findet man die Abhängigkeiten unter /usr/local/lib/node_modules/nefit-easy-http-server/node_modules/. Und das ist eine ganze Menge!


Gruß
Mike

SouzA

Hi,

hatte da auch nochmal geschaut.
Das es ein XMPP ist, hatte ich auch schon rausgelesen. Die URL hatte ich nicht gefunden ;)
Da fällt der HTTPMOD eigentlich ja schon raus...

Für FHEM gibt es ja auch ein XMPP-Modul. Inwieweit das damit zu realisieren ist, hab ich aus zeitlichen Gründen noch nicht prüfen können.

Btw.:
In deinen aufgeführten Links werden ja auch Diskussionen über den Nefit-Server geführt. Da ist von einer nicht Erreichbarkeit bzw. Netzwerktrennung des CT100 die Rede, wenn der Nefit-Server zum Einsatz kommt. Hast du diese Erfahrungen auch gemacht?

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

Mike_GKA

Hi SouzA,

das mit dem XMPP-Modul in fhem hatte ich noch gar nicht auf dem Schirm. Ich schätze aber, dass das schwierig wird. Im nefit-core wird viel verschlüsselt. Und eine Lösung ist das dann auch nicht, da der XMPP-Server bei Bosch steht. Man müsste direkt auf die CT-100 kommen ohne den Bosch-Server, die IP-Adresse hat man ja. Ich hoffe mal, dass der XMPP-Server lediglich für den Kommunikationsaufbau ist und die eigentliche Kommunikation dann direkt zwischen CT-100 und Client erfolgt. Wenn dem nicht so sein sollte, dann hat man eh keine Chance.

Netzwerk-Trennungen hatte ich häufiger (subjektiv mehrmals am Tag) am Anfang nach der CT-100-Inbetriebnahme, aber da lief noch kein Nefit-Server. Irgendwann hat sich das ohne mein Zutun stabilisiert.
Seit Juli läuft bei mir der Nefit-Server auf 3 Raspberrys (Produktiv, Test, Development) und ich hatte noch keinerlei Ausfall.

Mittlerweile habe ich übrigens ein kleines php-Skript geschrieben, das alle von mir gewünschten Daten vom Nefit-Server holt und als JSON zurückgibt. In fhem brauche ich dann nur noch ein HTTPMOD um alles zu bekommen. Das macht die Sache einfacher, schlanker und leichter pflegbar.

Gruß
Mike

SouzA

Zitat von: Mike_GKA am 06 Oktober 2017, 17:36:35
Und eine Lösung ist das dann auch nicht, da der XMPP-Server bei Bosch steht. Man müsste direkt auf die CT-100 kommen ohne den Bosch-Server, die IP-Adresse hat man ja.

DAS wir schwierig, da ich denke, dass die URL von Bosch in der FW des CT100 steckt. Das CT100 wird auf nix anderes "hören"... Ganz genau weiß man das nicht ;)

Werde mir da auch mal nen Test Raspi aufbauen. Würdest du das Script zur Verfügung stellen?

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

SouzA

Hi,

hab den Server wohl soweit am laufen... ABER ich bekomme keine vernünftige Meldung raus.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Error: Invalid character in statusMessage.<br> &nbsp; &nbsp;at ServerResponse.writeHead (_http_server.js:195:11)<br> &nbsp; &nbsp;at ServerResponse.writeHead (/usr/local/lib/node_modules/nefit-easy-http-server/node_modules/on-headers/index.js:55:19)<br> &nbsp; &nbsp;at ServerResponse._implicitHeader (_http_server.js:157:8)<br> &nbsp; &nbsp;at ServerResponse.OutgoingMessage.end (_http_outgoing.js:574:10)<br> &nbsp; &nbs.....................................................
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

Mike_GKA

Das Skript kann ich auch gerne öffentlich machen. Es ist eigentlich recht simpel.


<?php

$basicurl "http://192.168.1.88:3000";
$result = array();

$json json_decode(file_get_contents($basicurl "/api/status"), true);
$result['t_inhouse'] = $json['in house temp'];
$result['t_setpoint'] = $json['temp setpoint'];
$result['t_outdoor'] = $json['outdoor temp'];
if ($json['boiler indicator'] == "off") {
$result['boiler'] = 0;
} else {
$result['boiler'] = 1;
}

$json json_decode(file_get_contents($basicurl "/api/pressure"), true);
$result['pressure'] = $json['pressure'];

$json json_decode(file_get_contents($basicurl "/bridge/ecus/rrc/recordings/yearTotal"), true);
$result['yearTotal'] = $json['value'];

$json json_decode(file_get_contents($basicurl "/bridge/heatingCircuits/hc1/actualSupplyTemperature"), true);
$result['actualSupplyTemperature'] = $json['value'];

header('Content-Type: application/json');
Echo json_encode($result);

?>


Mike_GKA

Hi SouzA,

auf welche Anfrage bekommst Du diese "Error-Seite"?

Welche Antwort bekommst Du, wenn Du auf dem Raspberry mit dem Nefit-Server in einer Terminalsitzung folgenden Befehl absetzt:

curl http://127.0.0.1:3000/api/status

?

Gruß
Mike

SouzA

Hi,

Danke für die Antwort und das Script.
Ich bekomme bei dem von dir genannten Befehl im Terminal den von mir beschriebenen Fehler.
Keine Ahnung, was da nicht stimmt.

Bis denn SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

Mike_GKA

#13
Hallo SouzA,

sehr eigentümlich, ich hatte zwar bei der Entwicklung dieser Lösung eine ganze Menge von Fehlern zu lösen, diese lagen aber immer alle in node.js selber, bzw. wie ich das installiert habe. Als ich dann node.js am Laufen hatte gabe es mit dem Nefit-Server absolut keinerlei Probleme.

Was gibt der PM2 Status zurück?

sudo pm2 status


Schau Dir mal den Log vom Nefit-server an, diesen erhälst Du z.B. mit:

sudo pm2 logs start_nefit-easy-http-server

Dann machst Du in einem zweiten Terminal

curl http://127.0.0.1:3000/api/status


Dann müsste im Log was kommen. Bei mir ist es:

0|start_ne | 127.0.0.1 - - [10/Oct/2017:09:02:49 +0000] "GET /api/status HTTP/1.1" 200 571 "-" "curl/7.38.0"


Vielleicht sagt uns das dann etwas??

Noch was: Welche Rasbian-Version hast Du installiert? Mit dem neuen Debian-Stretch habe ich es noch nicht getestet. Ich hoffe bis Ende nächster Woche das auch ausprobiert zu haben.

Gruß
Mike

[Nachtrag:
Auf Debian Stretch habe ich es auch ausprobiert (allerdings noch ohne Einbindung in fhem):
node.js Installation funktionierte völlig identisch,
ebenso die Installation vom Nefit-Server und PM2.
Die Abfrage des CT100-Status mit curl funktionierte ebenso fehlerfrei.
Also auf Stretch läuft das auch]

SouzA

Hi,

Danke, dass du helfen willst.
Zur Zeit ist bei mir echt voll und ich bin noch nicht dazu gekommen mal weiter zu testen.
Wenn wieder Luft ist, werde ich die Ergebnisse schreiben.

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee