Wasserenthärter
Gepostet am 30. Dezember 2021 • 2 Minuten • 420 Wörter
Table of contents
Die “smarten” Features unserer Wasserentkalkungsanlage von Ecowater ist sehr enttäuschend. Der Hersteller versteht unter intelligent lediglich die Internetkonnektivität. Ecowater sammelt somit Daten über den Wasserverbrauch, die dem Endkunden über das Portal aufbereitet zur Verfügung gestellt werden. Ein weiterer generierter Mehrwert soll die E-Mail-Benachrichtigung sein, wenn das Salz nachgefüllt werden muss. Eine API für SmartHome-Systeme bietet Ecowater nicht an.
Nun möchte ich aber die Daten in mein System integrieren. Kyle Johnson hat sich vor einem Jahr die Arbeit gemacht und einen Scraper in Python geschrieben , der sich im Portal anmeldet und mit dem Token die aktuellen Daten abfragt. Dieses Response-Json wird dann an den MQTT Broker übermittelt. Somit existiert eine Schnittstelle, die wieder durch die meisten Systeme abgefragt werden kann.
Lange Zeit ließ ich dieses Script minütlich durch einen Cronjob ausführen. Durch das Pythongeraffel sind bei der Einrichtung allerdings ein paar Abhängigkeiten zu installieren. Ich habe jetzt dieses Script in einen Docker-Container verpackt und auf docker hub gepusht . Das Script habe ich allerdings an meine Bedürfnisse angepasst, was sich hauptsächlich auf die verschlüsselte Verbindung zum Broker bezieht. Das Script nochmal zu generalisieren steht auf meiner nie endenen Todo-Liste…
Durch meinen Unraid-Ausfall pünktlich zu Weihnachten habe ich festgestellt, dass das Zusammensuchen der notwendigen und natürlich nur minimal dokumentierten Konfiguration doch recht auffändig ist, weshalb ich nun auch ein ecowater2mqtt-Template für Unraid erstellt habe. Eine Installationsanleitung ist im Github enthalten.

Home Assistant
Die Home Assistant-Integration ist bereits durch Kyle Johnson in seinem Post beschrieben.
openHab
Für openHab sind Konfigurationen an 2 Stellen erforderlich:
// mqtt.things
Bridge mqtt:broker:secureBroker [ ... ] {
Thing topic watersoftener "Watersoftener" @ "HAR" {
Channels:
Type number: water_flow "water_flow" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.water_flow"]
Type number: salt_level "salt_level" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.salt_level"]
Type number: out_of_salt_days "out_of_salt_days" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.out_of_salt_days"]
Type number: salt_level_percent "salt_level_percent" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.salt_level_percent"]
Type number: water_today "water_today" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.water_today"]
Type number: water_avg "water_avg" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.water_avg"]
Type string: out_of_salt "out_of_salt" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.out_of_salt"]
Type string: time "time" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.time"]
Type string: water_units "water_units" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.water_units"]
Type switch: online "online" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.online", on="true", off="false"]
Type number: water_avail "water_avail" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.water_avail"]
Type switch: rechargeEnabled "rechargeEnabled" [stateTopic="ecowater/stat", transformationPattern="JSONPATH:$.rechargeEnabled", on="true", off="false"]
}
}
und
// watersoftener.items
Group WaterSoftener "Wasserentkalker" <softener> (Har) ["Water"]
Number WaterSoftener_WaterFlow "WaterFlow [%d]" <flow> (WaterSoftener) ["Sensor"] {channel="mqtt:topic:secureBroker:watersoftener:water_flow"}
Number WaterSoftener_SaltLevel "Salt-Level [%d]" (WaterSoftener) ["Sensor"] {channel="mqtt:topic:secureBroker:watersoftener:salt_level"}
Number WaterSoftener_OutOfSalt "Out of salt [%d]" (WaterSoftener) ["Sensor"] {channel="mqtt:topic:secureBroker:watersoftener:out_of_salt_days"}
Number WaterSoftener_SaltLevelPercent "Salt Level [%.2f %%]" (WaterSoftener) ["Sensor"] {channel="mqtt:topic:secureBroker:watersoftener:salt_level_percent"}
Number WaterSoftener_WaterToday "Water today [%d l]" <water> (WaterSoftener) ["Measurement", "Water"] {channel="mqtt:topic:secureBroker:watersoftener:water_today"}
Number WaterSoftener_WaterAvg "Water avg [%d l]" <water> (WaterSoftener) ["Measurement", "Water"] {channel="mqtt:topic:secureBroker:watersoftener:water_avg"}
String WaterSoftener_Time "Time [%s]" <time> (WaterSoftener) ["Timestamp"] {channel="mqtt:topic:secureBroker:watersoftener:time"}
