BLUETOOTH® Smart Heizkörperthermostat von eQ-3

Begonnen von Hauswart, 20 Juli 2015, 09:34:36

Vorheriges Thema - Nächstes Thema

Michael20

Hat die schon jemand, und ist am mit sniffen?  :)

accessburn

Wenn es da auch immernoch um die BT Version geht bin ich direkt dabei...
Preislich wäre das natürlich der Oberhammer :-)
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

greg4b

ja, das wäre echt ein Hammer, denn Homematic ist preislich ziemlich der Plafond.

Würde mich auch sehr interessieren...
Bosch Indego Connect 1200, Neato BotVac 85 D, Raspberry Pi, JeeLink V3, Homematic, Sony KDL-40HX756,

Marc1993

Habe eine für mich funktionierende Lösung gefunden  ;D

Ich habe einen Slider-Dummy erstellt und übergebe den dort eingestellten Wert an ein Shell-Script.
Dort wird mittels gatttool das Heizkörperthermostat gesteuert. Bis jetzt funktioniert nur das einstellen der Temperatur.
Ist aber schon mal ein Anfang  ::)

Zunächst müsst ihr das Heizkörperthermostat anlernen. Das geht so:
bluetoothctl
scan on
<Dann etwas warten und die passende MAC Adresse eures Heizkörperthermostat kopieren. Sieht so aus:[NEW] Device 00:1A:23:27:F8:4E CC-RT-BLE>
scan off
<Das Heizkörperthermostat in den Pairing Modus setzen.>
pair <MAC>
trust <MAC>
disconnect <MAC>
exit


FHEM:
define Heizung dummy
attr Heizung room Wohnzimmer
attr Heizung setList state:slider,17,1,30
attr Heizung webCmd state

define Heizung_set notify Heizung.* {system("/home/server/eq.sh 00:1A:23:27:F8:4E $EVENT")}
attr Heizung_set room Wohnzimmer


Shell Script:
#!/bin/bash
echo "adress" $1 "temp" $2
typeset -i temp
temp=$2
temp=$temp*2
printf -v temp_hex "%x" "$temp"

gatttool -b $1 --char-write-req --char-write-req --handle=0x0411 --value="41"$temp_hex"E"


Hoffe das hilft dem ein oder anderen weiter :)

klausdor

das klingt ja schon sehr gut.   ;D

Wenn ich auch den Code im letzten noch nicht nachvollziehen kann, doch eine Frage zur Hardware.

Worauf läuft FHEM und welcher BT-Stick?

Wird der BT-Stick sofort in FHEM eingebunden oder was muß man tun?

Danke.

Grüße
Klaus
-------------------------------
Raspi2 mit V6.1; HMLAN; CUL868; ESA1000WZ-LED am Q3BA; FHT80TF-2; HM-CC-RT-DN und andere HM-Komponenten; 3x DECT200; xTrend9200_enigma2; Z-Wave als Versuch mit Einbaukomponenten hinter dem Schalter...

Marc1993

Der untere Code ist ein Shell-Script. Das wird aufgerufen mit dem notify define Heizung_set notify Heizung.* {system("/home/server/eq.sh 00:1A:23:27:F8:4E $EVENT")}
In das Notify muss man die MAC Adresse einsetzen. Die Temperatur wird mittels $EVENT an das Thermostat weitergegeben. Root rechte werden nicht benötigt.

Der Bluetooth Stick muss nicht in FHEM eingebunden werden. Der wird einfach mit dem Linux System gekoppelt. Das geschieht mittels bluetoothctl. Der Stick muss Bluetooth 4.0 unterstützen. Habe einfach den günstigsten aus dem Saturn geholt  ;D

Momente bin ich nicht zuhause. Die Tage werde ich noch versuchen die BOOST-Funktion und das abrufen der Temperatur zu integrieren.
Leider muss ich das über Shell Scripts machen, da ich mich mit Perl nicht auskenne  ::)

FHEM läuft bei mir auf Ubuntu 14.04.3 LTS x64.

klausdor

Danke!  Top!

Dann habe ich schon mal die Richtung. (Wobei ich nicht programmieren kann... :( )

Aber bei meinem Sohn habe ich das Teil stand-alone eingebaut und das spielt für den Preis super.


Grüße
Klaus
-------------------------------
Raspi2 mit V6.1; HMLAN; CUL868; ESA1000WZ-LED am Q3BA; FHT80TF-2; HM-CC-RT-DN und andere HM-Komponenten; 3x DECT200; xTrend9200_enigma2; Z-Wave als Versuch mit Einbaukomponenten hinter dem Schalter...

neocron

#22
servus.
ich habe diese Bluetooth Thermostate im Einsatz. Nach dem letzten Firmwareupdate von eq-3 laufen diese auch endlich zuverlaessig.
Ich habe diese mit einer eigenen Implementierung von piHome im Einsatz, da ich FHEM als overkill ansehe.

Nichts desto trotz, habe ich dieses Forum hier seit laengerem im Blick.
Und ich dachte ich Teile meine Erfahrungen mal, die ich bald auch vermutlich auf einer dedizierten Seite bereitstellen moechte.
Ich habe mir die Werte auch gesnifft. Der Boost Wert, der ebenfalls auf Handle 0x0411 gesetzt wird ist:
- '4501' auf Handle 0x0411 um den Boost anzuschalten
- '4500' auf Handle 0x0411 um den Boost auszuschalten ...

also:
gatttool -b $1 --char-write-req --char-write-req --handle=0x0411 --value="450"$status_hex //status=0 (boost aus) status = 1 (boost ein)

Ich habe einige andere dieser Codes bereits dokumentiert, ich werde diese heute abend hier ergaenzen, sobald ich daheim bin, ich habe nicht mehr alle im Kopf.
Marc1993. Ich waere dankbar, wenn du deine Erkenntnisse auch teilen koenntest.
ein Hinweis jedoch:
gatttool ... "41"$temp_hex"E"
das "E" am Ende ist meines Erachtens nicht relevant, oder welchen Grund hat dies?

Probleme habe ich beim Auslesen dieser Daten. Den ersten Status, den das Ventil an die App schickt (mit allen derzeitigen Einstellungen) bzw. die App vom Ventil holt konnte ich noch nicht "entschluesseln"
dort sollte dann zB. der Status des Boost enthalten sein, welcher Modus gerade laeuft, die aktuell (auch manuell am Ventil) eingestellte Temperatur, ...
Meine Hoffnung ist auch, dass es eine Handle bzw. eine Moeglichkeit gibt um den Temperatursensor am Ventil auszulesen ... diesbezueglich habe ich noch ueberhaupt keine Hinweise ... die App unterstuetzt dies nicht, womit es nichteinmal sicher ist, dass man diesen Temp Sensor ueber BT ueberhaupt auslesen kann. Wuerde mich aber wundern, wenn dies von EQ-3 nicht zumindest zu debugzwecken ihrerseits eingebaut haetten ...


Soweit sogut, ich melde mich spaeter nochmal ...

neocron

#23
so, da bin ich nochmal ...
also, es laeuft alles ueber Handle 0x0411 mit write-req!
- 41cc ist temperatur setzen, wobei cc= (der temp Wert in C * 2 in HEX) ist
- 4000 -> automatic mode
- 4040 -> manual mode
- 44 -> nachtmodus
- 43 -> tagmodus
- 14cctt -> fenster-offen modus, wobei cc = temperatur (siehe oben) und tt = Zeit in 5 Minuten Schritten im HEX (5 min = 01, 10 min = 02, 15 min = 03, ... , 60 min = 0C)
- 11tttt ist die komfort minimum (hier bin ich mir noch nicht ganz sicher)
- 40ccttyy..mm ist der Urlaubsmodus, wobei cc=temp; tt=tag (HEX) ; yy=letzten 2 Ziffern des Jahres (HEX); .. weiss ich noch nicht so recht; mm=monat (HEX)

Habe mir auch gerade etwas Zeit genommen wegen des Auslesens des Status:
Der Status wird meines Erachtens auch ueber die Handle 0x0411 ausgelesen ... da bin ich aber noch nicht gaenzlich schlau draus.
ein 03 Wert darauf und man erhaelt so ein paar Daten auf Handle 0x0421.

Meines Erachtens kann man mit 03 auch noch weitere Daten schicken ... da sehe ich noch 6 weitere zweistellige HEX Werte, ich vermute da ist das aktuelle datum und die Uhrzeit dabei, um die Uhren in den Thermostaten zu synchronisieren.
zurueck erhaelt man dann meist 6 hexwerte in Folge zB.
02 01 08 00 04 22
- die 22 ist die aktuell eingestellte temperatur. in diesem Beispiel also HEX 22 = DEZ 34 -> / 2 = 17 Grad C
- die 08 markiert den Modus (08 = automatik; 09 = manuell; 0a = urlaubsmodus; 0d = boost aktiviert; 18 = fenster auf modus aktiviert)
bei urlaubsmodus gibt's hinten dran noch einige Daten (4x zweistellige Hexwerte) ueber den Urlaubsmodus, zB. 0b 10 12 03 -> tag; eine 10 die ich nicht interpretieren kann; die Uhrzeit bis zum Ende des Urlaubsmodus; und der Monat.
Hinweis zur Uhrzeit: Uhrzeit in 30 min Schritten ab 0:00 begonnen mit 00, also hier HEX 12 = DEC 18 -> 18 x 30 Minuten begonnen von 0:00 = 9:00 Uhr!


Marc1993

#24
Du hast mir eine menge Arbeit gespart :D
Super das du die Werte schon hast  ;D

gatttool ... "41"$temp_hex"E" -> Das E setzt hinter dem Komma eine 0, ein F eine 5.

Ich habe mich noch mal dem auslesen des Temp sensors gewidmet und habe auch noch keine Ergebnisse.



Habe allerdings noch ein kleines Problem. Vielleicht konntest du das schon lösen. Nach einem Reboot verbindet sich mein Rechner automatisch mit den Thermostaten. Der gatttool Befehl gibt dann immer "connect: Device or resource busy (16)" aus. Erst nach trennen der Verbindung unter bluetoothctl funktioniert alles wunderbar. :-\

Edit:
echo -e '\ndisconnect 00:1A:22:07:F8:3E' | bluetoothctl
Könnte das Problem beheben  ;D

neocron

ha, das Problem hatte ich auch gelegentlich, hab dann immer den adapter neugestartet ..., deine Loesung ist da eleganter :)

Bei der Temperatur bin ich mir nicht sicher mit dem E
bei mir ist es tatsaechlich die Temperatur *2 in Hex.
17.5 Grad waeren dann alse 35 in HEX = 23
Ich weiss aber nicht genau was fuer welte der FHEM da nach dem Slider rausgibt.

Beim Auslesen hatte ich gestern noch Erfolge, jedoch auch einen groesseren Rueckschlag.
Zum Auslesen in einem Kommando waere es folgender:
gatttool -b $1 --char-write-req --char-write-req --handle=0x0411 --value="03" --listen

dies schickt den Wert, und horcht dann auf Notifications (was noetig ist, um die Werte auszulesen).
Problem dabei: der Befehl stoppt nicht. Er laesst quasi das Programm nach dem Empfang weiter horchen. Es gibt, soweit ich sehe, keine Moeglichkeit einfach auf die erste Notifikation zu warten ...
Fuer die Einbindung in FHEM (in eurem Fall) bzw. PHP (in meinem Fall) ist das sehr ungluecklich. Man muesste irgend wie gleichzeitig das gatttool noch grillen.
Ich hatte bereits angefangen das mal in python zu ueberfuehren, jedoch scheitere ich am Bluetooth modul von Python (dort haette ich dann nur auf die erste Antwort gehorcht).
Es gaebe auch noch die Moeglichkeit das Gatttool anzupassen, aber das ist natuerlich auch etwas aufwendiger fuer so ein kleines Problem ...

CANivore

Hallo alle,
ich hab diesen Thread mit Interesse gelesen, und auch mal gatttool auf das Teil losgelassen. Da die Android-App den Thermostat bei mir gar nicht erkennt, ist die Steuerung über den Rechner wohl der einzig gangbare Weg, das Bluetooth-Interface zu nutzen. Hier das, was mir bisher bekannt ist (eure Erkenntnisse habe ich mit eingepflegt):

Verfügbare handles und UUIDs:

handle = 0x0100, uuid = 00002800-0000-1000-8000-00805f9b34fb
handle = 0x0110, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0111, uuid = 00002a00-0000-1000-8000-00805f9b34fb
handle = 0x0120, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0121, uuid = 00002a01-0000-1000-8000-00805f9b34fb
handle = 0x0130, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0131, uuid = 00002a02-0000-1000-8000-00805f9b34fb
handle = 0x0140, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0141, uuid = 00002a03-0000-1000-8000-00805f9b34fb W 1-6
handle = 0x0150, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0151, uuid = 00002a04-0000-1000-8000-00805f9b34fb
handle = 0x0200, uuid = 00002800-0000-1000-8000-00805f9b34fb
handle = 0x0210, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0211, uuid = 00002a05-0000-1000-8000-00805f9b34fb
handle = 0x0220, uuid = 00002902-0000-1000-8000-00805f9b34fb W AUTH
handle = 0x0300, uuid = 00002800-0000-1000-8000-00805f9b34fb
handle = 0x0310, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0311, uuid = 00002a29-0000-1000-8000-00805f9b34fb
handle = 0x0320, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0321, uuid = 00002a24-0000-1000-8000-00805f9b34fb
handle = 0x0400, uuid = 00002800-0000-1000-8000-00805f9b34fb
handle = 0x0410, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0411, uuid = 3fa4585a-ce4a-3bad-db4b-b8df8179ea09 W 1-16
handle = 0x0420, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0421, uuid = d0e8434d-cd29-0996-af41-6c90f4e0eb2a W 1-16
handle = 0x0430, uuid = 00002902-0000-1000-8000-00805f9b34fb W AUTH
handle = 0xff00, uuid = 00002800-0000-1000-8000-00805f9b34fb
handle = 0xff01, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0xff02, uuid = e3dd50bf-f7a7-4e99-838e-570a086c666b W 1-5
handle = 0xff03, uuid = 00002902-0000-1000-8000-00805f9b34fb W 1-2
handle = 0xff04, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0xff05, uuid = 92e86c7a-d961-4091-b74f-2409e72efe36 W 1-20
handle = 0xff06, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0xff07, uuid = 347f7608-2e2d-47eb-913b-75d4edc4de3b


Legende: W: Schreibzugriffe möglich,
AUTH: Authentifizierung erforderlich,
Zahlen: min.-max. Länge der geschriebenen Daten in Bytes


handle=0x0411:

00 -> Antwort immer: 01 6a 00 00 7d 75 81 60 68 64 69 68 62 60 96 (Identifizierung?)

03 -> YYMMDDHHMM Datum und Uhrzeit setzen, Werte in Hex
   
   
   03 ohne Parameter: Auslesen diverser Einstellungen: Antwort als Notification auf Handle 0421.
   
   Ausgabeformat: 02 01 XX 00 04 TT [ DD ?? HH MM ]
   
   XX: Status:
      Bitmaske:   01: Manueller Modus
                  02: Urlaubsmodus
                  04: Boost-Modus
                  08: DST-Modus (Sommer/Winterzeitumstellung)
                  10: Fenster-Auf-Modus

   TT: momentane Einstellung der Temperatur, wie auf dem Display angezeigt (0,5°C-Schritte)

   [ DD ?? HH MM ] nur bei Urlaubsschaltung. DD Tag, MM Monat, HH Zeit in 0,5 Stunden-Schritten

10 -> XX Programmierung für Wochentag eingeben

   XX: 00=Sa 01=Su 02=Mo 03=Tu 04=We 05=Th 06=Fr 07=Sa+Su 08=Mo-Fr 09=Mo-Su
   
   es folgen bis zu 7 2-byte-Gruppen für jeden Schaltplatz
   Gruppe besteht aus:
      a) Temperatur in 0,5°C-Schritten, beginnend bei 00:00 Uhr
      b) Uhrzeit, zu der der nächste Schritt beginnt, in 10-Minuten-Schritten

   Die Uhrzeit beim letzten Schritt wird gespeichert, aber ignoriert (immer 23:59)
   
11 -> XXYY XX=Temperatur Tag-Modus(Sonnensymbol) YY Temperatur Nacht(Mondsymbol). Antwort wie bei 03

13 -> XX = 00-0f ???

14 -> XXYY Fenster-Offen XX=Temperatur(0,5°C-Schritte) YY=Zeit in 5-Min.-Schritten

20 -> XX Auslesen der  Programmplätze für die Wochentage (wie unter 10).
      XX: 00=Sa 01=Su 02=Mo 03=Tu 04=We 05=Th 06=Fr

40 -> XX Manuell/Auto/Urlaubsmodus: XX=00 Auto XX=40: Manuell

41 -> XX Temperatur einstellen (wie am Stellrad) (XX=Temperatur in °C *2 als Hex-Wert, 09 = Off) Abfrage: XX weglassen

43 -> Tages-Modus (Sonne). Antwort wie bei 03

44 -> Nacht-Modus (Mond). Antwort wie bei 03

45 -> XX>00: Boost-Modus 300 Sekunden Start; XX==00:Boost-Modus aus

80 -> 01:Kindersicherung einschalten (LOC); 00: ausschalten

A0 -> Update   Achtung! Danach neue Adaptierfahrt nötig!

A1 ??? Wahrscheinlich: Daten für den Update übermitteln. Besonderheit: Antwort kommt früher als bei den anderen Kommandos

F0 Werksreset Achtung! Danach neue Adaptierfahrt nötig!

Offene Fragen:

Wie wird der Urlaubsmodus programmiert?
Wie wird die aktuelle Uhrzeit/ das Datum aus dem Regler ausgelesen?
Wie wird die autom. Sommerzeitumstellung ein/ausgeschaltet?
Wie wird die aktuelle Ist-Temperatur ermittelt?
Kann man remote den Batteriezustand ermitteln?

RasPi_Bastler

#27
Hallo zusammen,

auch ich verfolge den Beitrag mit grossen Interesse.
Mein Ziel ist eine Abwesenheitssteuerung die die Heizkörper "zudreht" wenn keiner mehr im Haus ist.
Das ganze erstmal nur mit Raspberrys (Jessie), WLan, Bluetooh und div. Scripts.

Leider kann ich zum auslesen der unbekannten Parameter wenig beitragen.

Zum auslesen der bekannten Parameter mit Python, hab ich zusammen mit Google und "Try and error" folgendes Script gebastelt.
Evtl. kann's ja jemand brauchen.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pexpect # install with: pip install pexpect
import sys

bluetooth_adr = sys.argv[1]
#bluetooth_adr = '00:1A:22:07:70:DA'
gatt_handle = sys.argv[2]
gatt_value = sys.argv[3]

# start and connect gatttool
tool = pexpect.spawn('gatttool -b ' + bluetooth_adr + ' --interactive')
tool.expect('\[LE\]>')
tool.sendline('connect')
tool.expect('Connection successful')
# write to the handle
tool.sendline('char-write-req ' + gatt_handle + ' ' + gatt_value)
# get back notifications
tool.expect('Notification handle = .*')
# make some nicer output
handle = tool.after.split('\n')[0].split(': ')[0].split()[3]
values = tool.after.split('\n')[0].split(': ')[1]
print handle + ': ' + values
print '   dec:',
for value in values.split():
    print str(int(value, 16)),
print ''
print '-----------------------'

# play with the values
mode = values.split()[2]
vent = int(values.split()[3], 16)
temp = int(values.split()[5], 16) / 2.0
modestr = 'Unbekannt'
if mode == '08':
    modestr = 'Automatik'
if mode == '09':
    modestr = 'Manuell'
if mode == '0a':
    modestr = 'Urlaub'
if mode == '0c':
    modestr = 'Boost'
if mode == '18':
    modestr = 'Fenster auf'
if mode == '28':
    modestr = 'Locked'
print ' Modus: ' + modestr
if not modestr == 'Unbekannt':
    print 'Ventil: ' + str(vent) + '%'
    print ' Temp.: ' + str(temp) + '°C'

# disconnect gatttool
tool.sendline('disconnect')
tool.sendline('quit')


Aufruf: python scriptname bluetooth_adr handle value
python eq-3.py 00:1A:22:07:70:9A 0x0411 03
0x0421: 02 01 08 19 04 2e
   dec: 2 1 8 25 4 46
-----------------------
Modus: Automatik
Ventil: 25%
Temp.: 23.0°C


Vielen Dank für die interessanten Beiträge hier!
Rainer

RasPi_Bastler

#28
Hallo,
die Werte für den Modus stimmten bei mir nicht mit euren überein.
(08-Auto, 09-Manu, 0a-Urlaub, 0c-Boost, 18-Fenster auf, 28-Locked (Kindersicherung))
Ausserdem hab ich noch einen Wert gefunden:
Der vierte bei der Ausgabe von 03 ist die Ventilöffnung in Prozent.
Ich hab das Script im obigen Post angepasst.

Gruß

DerLernende

Hallo zusammen,
Hab probeleme beim Verbinden von dem Thermostat und dem Pi..
Gibt es dazu inzwischen eine komplette Anleitung bzw ein video oder ähnliches.
Wäre schön die Heizung über den Pi steuern zu können.
Mit freundlichen Grüßen