Grünbeck Enthärtungsanlage softliQ:SD

Hallo Zusammen,

die neue softliQ:SD Serie (bspw. SD18, SD21, SD23, MD…) hat nun einen LAN-Anschluss, jedoch funktioniert die bisherige Auslesemethode der SC Serie mit den neuen Modellen nicht mehr:

From: Service Abteilungspostfach <service@gruenbeck.de>
Sent: Wednesday, September 11, 2019 8:40 AM
Subject: AW: Internet -Kontaktanfrage

Sehr geehrter Herr XY,

vielen Dank für Ihre Anfrage und entschuldigen Sie die späte Antwort.

Für die SD- Anlagen ist keine Schnittstellendokumentation vorgesehen. Die einzige Möglichkeit auf die Anlage zuzugreifen besteht durch die Verwendung der myproduct App.

Für weitere Fragen stehe ich Ihnen gerne zur Verfügung

Mit freundlichen Grüßen

i. A.
XY
Service - Kundenbetreuung

Für ioBroker gibt es nun bereits eine Auslesemöglichkeit für die Grünbeck SD-Serie:
GitHub - TA2k/ioBroker.gruenbeck: ioBroker Grünbeck Adapter (ab v0.0.13 vom 2019-09-13)

Wie bekomme ich anhand der Erkenntnisse dieses Skript-Erstellers nun Daten in IP-Symcon?
Ich wäre sehr dankbar, wenn mir jemand unter die Arme greifen könnte.

Wie kann ich diesen Loginvorgang in IP-Symcon realisieren:

	login() {
		return new Promise((resolve, reject) => {
			const [code_verifier, codeChallange] = this.getCodeChallenge();
			const axiosInitConfig = {
				headers: {
					"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
					"Accept-Encoding": "br, gzip, deflate",
					"Connection": "keep-alive",
					"Accept-Language": "de-de",
					"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1"
				},
			};
			axios.get("https://gruenbeckb2c.b2clogin.com/a50d35c1-202f-4da7-aa87-76e51a3098c6/b2c_1_signinup/oauth2/v2.0/authorize?state=NzZDNkNBRkMtOUYwOC00RTZBLUE5MkYtQTNFRDVGNTQ3MUNG&x-client-Ver=0.2.2&prompt=select_account&response_type=code&code_challenge_method=S256&x-client-OS=12.4.1&scope=https%3A%2F%2Fgruenbeckb2c.onmicrosoft.com%2Fiot%2Fuser_impersonation+openid+profile+offline_access&x-client-SKU=MSAL.iOS&code_challenge=" + codeChallange + "&x-client-CPU=64&client-request-id=FDCD0F73-B7CD-4219-A29B-EE51A60FEE3E&redirect_uri=msal5a83cc16-ffb1-42e9-9859-9fbf07f36df8%3A%2F%2Fauth&client_id=5a83cc16-ffb1-42e9-9859-9fbf07f36df8&haschrome=1&return-client-request-id=true&x-client-DM=iPhone", axiosInitConfig)
				.then((response) => {
					// handle success
					let start, end;
					start = response.data.indexOf("csrf") + 7;
					end = response.data.indexOf(",", start) - 1;
					const csrf = response.data.substring(start, end);
					start = response.data.indexOf("transId") + 10;
					end = response.data.indexOf(",", start) - 1;
					const transId = response.data.substring(start, end);
					start = response.data.indexOf("policy") + 9;
					end = response.data.indexOf(",", start) - 1;
					const policy = response.data.substring(start, end);
					start = response.data.indexOf("tenant") + 9;
					end = response.data.indexOf(",", start) - 1;
					tenant = response.data.substring(start, end);
					const filteredCookies = response.headers["set-cookie"].map(element => {
						return element.split("; ")[0];
					});
					const cookie = filteredCookies.join("; ");
					const axiosConfig = {
						headers: {
							"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
							"X-CSRF-TOKEN": csrf,
							"Accept": "application/json, text/javascript, */*; q=0.01",
							"X-Requested-With": "XMLHttpRequest",
							"Origin": "https://gruenbeckb2c.b2clogin.com",
							"Referer": "https://gruenbeckb2c.b2clogin.com/a50d35c1-202f-4da7-aa87-76e51a3098c6/b2c_1_signinup/oauth2/v2.0/authorize?state=NzZDNkNBRkMtOUYwOC00RTZBLUE5MkYtQTNFRDVGNTQ3MUNG&x-client-Ver=0.2.2&prompt=select_account&response_type=code&code_challenge_method=S256&x-client-OS=12.4.1&scope=https%3A%2F%2Fgruenbeckb2c.onmicrosoft.com%2Fiot%2Fuser_impersonation+openid+profile+offline_access&x-client-SKU=MSAL.iOS&code_challenge=PkCmkmlW_KomPNfBLYqzBAHWi10TxFJSJsoYbI2bfZE&x-client-CPU=64&client-request-id=FDCD0F73-B7CD-4219-A29B-EE51A60FEE3E&redirect_uri=msal5a83cc16-ffb1-42e9-9859-9fbf07f36df8%3A%2F%2Fauth&client_id=5a83cc16-ffb1-42e9-9859-9fbf07f36df8&haschrome=1&return-client-request-id=true&x-client-DM=iPhone",
							"Cookie": cookie,
							"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1"
						},
					};
					axios.post("https://gruenbeckb2c.b2clogin.com" + tenant + "/SelfAsserted?tx=" + transId + "&p=" + policy, querystring.stringify({
							request_type: "RESPONSE",
							logonIdentifier: this.config.mgUser,
							password: this.config.mgPass,
						}), axiosConfig)
						.then((response) => {
							const filteredCookies = response.headers["set-cookie"].map(element => {
								return element.split("; ")[0];
							});
							let cookie = filteredCookies.join("; ");
							cookie += "; x-ms-cpim-csrf=" + csrf;
							const axiosGetConfig = {
								maxRedirects: 0,
								headers: {
									"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
									"Accept-Encoding": "br, gzip, deflate",
									"Connection": "keep-alive",
									"Accept-Language": "de-de",
									"Cookie": cookie,
									"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1"
								},
							};
							axios.get("https://gruenbeckb2c.b2clogin.com" + tenant + "/api/CombinedSigninAndSignup/confirmed?csrf_token=" + csrf + "&tx=" + transId + "&p=" + policy, axiosGetConfig)
								.then((response) => {
									this.log.warn(response);
								}).catch((error) => {
									// handle error
									if (error.response && error.response.status === 302) {
										if (error.response.data.indexOf("code") !== -1) {
											start = error.response.data.indexOf("code%3d") + 7;
											end = error.response.data.indexOf(">here") - 1;
											const code = error.response.data.substring(start, end);
											const axiosPostConfig = {
												maxRedirects: 0,
												headers: {
													"Host": "gruenbeckb2c.b2clogin.com",
													"x-client-SKU": "MSAL.iOS",
													"Accept": "application/json",
													"x-client-OS": "12.4.1",
													"x-app-name": "Grünbeck myProduct",
													"x-client-CPU": "64",
													"x-app-ver": "1.0.4",
													"Accept-Language": "de-de",
													"Accept-Encoding": "br, gzip, deflate",
													"client-request-id": "4719C1AF-93BC-4F7B-8B17-9F298FF2E9AB",
													"User-Agent": "Gruenbeck/320 CFNetwork/978.0.7 Darwin/18.7.0",
													"x-client-Ver": "0.2.2",
													"x-client-DM": "iPhone",
													"return-client-request-id": "true",
													"cache-control": "no-cache",
													"Connection": "keep-alive",
													"Content-Type": "application/x-www-form-urlencoded"
												},
											};
											axios.post("https://gruenbeckb2c.b2clogin.com" + tenant + "/oauth2/v2.0/token", querystring.stringify({
													"client_info": "1",
													"scope": "https://gruenbeckb2c.onmicrosoft.com/iot/user_impersonation openid profile offline_access",
													"code": code,
													"grant_type": "authorization_code",
													"code_verifier": code_verifier,
													"redirect_uri": "msal5a83cc16-ffb1-42e9-9859-9fbf07f36df8://auth",
													"client_id": "5a83cc16-ffb1-42e9-9859-9fbf07f36df8"
												}), axiosPostConfig)
												.then((response) => {
													accessToken = response.data.access_token;
													refreshToken = response.data.refresh_token;
													setInterval(() => this.startRefreshToken(), 50 * 60 * 1000); //50min
													this.setState("info.connection", true, true);
													resolve();
												}).catch((error) => {
													// handle error
													this.log.error(error);
												});
										}
									} else {
										this.log.error(error);
									}
								});
						}).catch((error) => {
							// handle error
							this.log.error(error);
						});
				})
				.catch((error) => {
					// handle error
					this.log.error(error);
				});
		});
	}

Ich scheitere bereits am Setzen der Variable „codeChallange“, welche in der ersten URL verwendet wird:

return new Promise((resolve, reject) => {
			const [code_verifier, codeChallange] = this.getCodeChallenge();

Hallo Brovning,
bist du weiter gekommen bei der Einbindung in IPS? Das Github-Modul wird ja stetig weiter entwickelt/gefixt.
Mich würde das demnächst auch interessieren.
Viele Grüße
Papaschlumpf

Hallo Papaschlumpf,

leider steht nur das Grundgerüst:
GitHub - Brovning/gruenbeck: IP-Symcon (IPS) Modul für Grünbeck softliQ:SD und softliQ:MD Enhärtungsanlagen.

Wäre für jede Unterstützung dankbar.

1 „Gefällt mir“

Hallo zusammen,

Gibt es hier schon Neuigkeiten? Konnte schon jemand die SD-Anlage erfolgreich auslesen? Ich habe mal danach gesucht in anderen Foren und habe bei einem was gefunden bei dem es läuft. Gibt es jemanden der dies auch für IPS umsetzen kann?
Schönes Wochenende…

Hallo RSRS,

nachdem ich mir im November selber eine softliQ:SD18 zugelegt habe, hatte ich mehrfach
Kontakt mit dem Support.
Laut deren Aussage soll im 1.Q. 2021 eine Anbindung an MQTT fertig sein und OTA per Update
auf die Anlagen eingespielt werden.

Antwort von Gruenbeck:

besten Dank für Ihre Anfrage.
 
Aktuell ist es nicht möglich Anlagendaten ohne die Azure Cloud zu erhalten. 
Es gibt derzeit gewisse Tricks wie einen „IO Broker“. 
Für das Jahr 2021 hat sich die Entwicklung allerdings auf die Agenda gesetzt 
eine offene API via. MQTT zu realisieren um auch den kleinen Teil an Kunden, 
meist sehr technisch Affiner Kundenteil, zufrieden zu stellen. 
 
Wann und Wie diese Schnittstelle genau aussehen wird, kann ich 
zu jetzigem Zeitpunkt noch nicht sagen. 

Ich hoffe Sie haben hierfür Verständnis. 
 

Das wäre echt super, wenn Grünbeck hier endlich umdenkt!

Hallo DVB-Freak,

ja das bei IOBriker habe ich auch gefunden. Wie machen die das denn? Lesen die die Daten aus der Cloud von Grünbeck aus? Sowas würde mir auch reichen, wen auch direkt vom Gerät besser währe.

Hallo RSRS,

die machen es genau so, wie ich bei mir im Modul begonnen habe und nicht mehr weiter gemacht hatte…

Hallo,

soweit ich das bei meinen Recherchen herausgefunden habe konnte, man bis zu einem gewissen Firmwarestand die Daten mit IO.Brocker abgreifen.
Dies geht bei den neueren Anlagen (wie meiner) nicht mehr.
Hier werden die Daten an die Azure Cloud von Grünbeck gesendet und dort lassen die keinen ran. Es gibt noch nicht einmal ein Webinterface…
Für die derzeitige Lösung ist zwingend die Cloud-Anbindung der Anlage nötig.
Soweit ich weiss, soll die MQTT Lösung auch Inhouse funktionieren, ohne das Daten ins Internet gesendet werden. Was mir sehr entgegen kommen würde :slight_smile:
Aber warten wir mal ab was von Grünbeck kommt…

Hallo zusammen,

ich habe nachdem vor kurzem hier im Forum über IOBroker berichtet wurde dies mal installiert. Ich habe auch das Modul von Grünbeck mal getestet und ich kann mit meiner SD18 die die aktuellste Firmware drauf hat die Daten auslesen. Die Möglichkeit um die Daten ohne Anbindung an der Cloud von Grünbeck zu kommen würde mir auch besser gefallen.
Dann warten wir mal ab. Die Lösung über die Cloud wie bei IOBroker bleibt ja immer noch.

Daten werden auch mit io.Broker direkt von der Cloud abgegriffen und es wird so getan, als ob man die App am Smartphone wäre.
Komplett ohne Cloud geht es mit der SD aktuell nicht.

Das nötige für einen Login hatte ich damals hochgeladen, aber nicht mehr weitergemacht, da ich mich um mein E3DC und mein Fronius Modul gekümmert hatte.
Sofern Grünbeck wirklich in diesem Jahr eine API für die SD-Modelle veröffentlicht, würde ich mich dem Thema wieder annehmen.

Hallo Brovning,

das hört sich gut an :blush:… Ich kann da aber leider nicht helfen… :smirk: Dein Modul hatte ich mir schon angesehen. Vielleicht gibt es den ein oder anderen hier im Forum der dazu beitragen kann.

Vielen Dank für die Info…

Hallo,

ich habe jetzt erstmal den Zwischenweg: iobroker-gruenbeck->mqtt->ips gewählt. Funktioniert soweit ganz gut. Leider gibt es die Beschränkung von 360 sec. für die Anmeldung an der Grünbeck Cloud.

Hallo,

das sieht gut aus!
Könntest du hierzu noch ein paar Details posten?
Würde vermutlich dann als Übergangslösung auf meiner Synology DS ebenfalls iobroker laufen lassen…

Hallo Broving,

gerne…
iobroker auf der Synology installieren (Anleitung):
https://smarthome.buanet.de/
Bitte bis zum Ende (Verzeichnis auf Volumen auslagern) abarbeiten.
Den Grünbeck Adapter installieren:
Unter iobroker - Adapter „Grünbeck“ suchen und installieren.
Anmeldedaten eingeben… Fertig
Unter iobroker - Adapter „MQTT“ suchen und installieren
Daten von IPS MQTT eingeben…

In IPS MQTT-Konfigurator dann die Telegramme von Gruenbeck/0/SoftliQ/ abonieren…

und schon sind die Daten in IPS

Dann habe ich mir noch ein Script gemacht, welches die Daten von Gruenbeck/0/SoftliQ/D/BSxxxxxx/water.value aufteilt geschrieben um den Wert Wasserverbrauch Vortag zu haben und von String in eine Integer umwandelt.
Diese wird in eine neue Variable geschrieben. Das Script hat einen Timer und wird täglich um 00:05 Uhr ausgeführt. Die Variable ist geloggt und als Zähler archiviert und somit habe ich die täglichen Werte automatisch…

<?php
// Water String aus MQQT Grünbeck
$wasser = GetValueString(10525);

//Auflösung und Umwandlung
$rest = substr($wasser, 1, -1);  
$str1 = explode("},{", $rest);
$str2 = substr($str1[0], 1);  
$str3 = str_replace(" ", "", $str2);
$str4 = explode(":", $str3);
$lastday = (int)$str4[2]; //Umwandlung von String in Integre

// Wert von Vortag in Variable schreiben
SetValueInteger(36443, $lastday);

Anpassungen müssen in Zeile 3 und der letzen Zeile gemacht werden.
Das Script kann man sicher eleganter machen, aber mir recht das so, da
es ja nur eine Übergangslösung ist.

Die Visualisierung habe ich dann mit IPS-View gemacht.

Hoffe das hilft Dir weiter…

Guten Morgen,
Ich habe das jetzt auch mal so gemacht mit dem IOBROKER. Die Daten kommen im MQTT-Konfigurator auch an, nur wenn ich die benötigten Variablen anlegen werden sie im Baum nicht aktualisiert. Das sind alles String Variablen die doch nicht aktualisiert. Im Konfigurator sind Daten drin Was mach ich hier falsch??

Hi RSRS,

nix falsch gemacht…

Ich habe ganz einfach einen Neustart Timer auf den iobroker MQTT gemacht mit alle 30 min. :wink:

Vergessen reinzuschreiben…

Das Script habe ich auch nochmal verbessert:

<?php
// Werte String aus MQTT Grünbeck

// Wasser verbrauch Vortag auslesen
$water=GetValueString(10525); //Holt Text aus Variable Water String Mqtt
var_dump(json_decode($water));
var_dump(json_decode($water, true));
$water1 = json_decode($water, true);
SetValueInteger(36443, $water1[0]['value']); Wasserverbrauch Vortag

// Salzverbrauch Vortag auslesen
$salt=GetValueString(59702); //Holt Text aus Variable Salt String Mqtt
var_dump(json_decode($salt));
var_dump(json_decode($salt, true));
$salt1 = json_decode($salt, true);
SetValueInteger(41314, $salt1[0]['value']); /Salzverbrauch Vortag

Zwei Variabeln anlegen Wasserverbrauch und Salzverbrauch. Beide sind Archiviert und dort als Zähler deklariert.

Zu den MQTT Strings; einfach eine Ebene drüber den Variabeln Typ anpassen
Unbenannt

Gruß
Frank

Hallo,

hier das fertige IPS-View Formular von mir.

Das reicht mir erstmal, bis die Lösung von Grünbeck kommt.
Dann brauche ich nur noch die Datenpunkte anzupassen und fertig ist.

Gruß
Frank

Hallo, ich habe das jetzt nach langem probieren auch hin bekommen. :blush: Nur habe ich noch eine Frage zum Wasserverbrauch vom Vortag. Der Wasserverbrauch vom vor Tag wird im Broker angezeigt. Leider kommen die Daten nicht in IPS an. Woran kann das liegen? Es gibt noch einen Wasserverbrauch der Angezeigt wird, aber der zeigt Daten an die vom ersten Tag der Inbetriebnahme sind.

Gruß René