BLUETOOTH® Smart Heizkörperthermostat von eQ-3

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

Vorheriges Thema - Nächstes Thema

RasPi_Bastler

Hallo zusammen,

da ich immer wieder mal private Nachrichten bzgl. meines Python Scripts erhalte, hier nochmal eine Zusammenfassung, dann hat jeder was davon.

Der Thermostat sollte natürlich gepairt sein, wie im Post von Marc1993 beschrieben.
https://forum.fhem.de/index.php/topic,39308.msg403841.html#msg403841

Danach kann die Verbindung mit gatttool getestet werden.

root@raspi# gatttool -b 00:1A:22:07:70:9A --interactive
[00:1A:22:07:70:9A][LE]> connect
Attempting to connect to 00:1A:22:07:70:9A
Connection successful
[00:1A:22:07:70:9A][LE]> char-write-req 0x0411 03
Characteristic value was written successfully
Notification handle = 0x0421 value: 02 01 29 00 04 09
[00:1A:22:07:70:9A][LE]> quit
root@raspi#


Sollte hier ein "Device or resource busy..." erscheinen, dann liegt das daran das sich der Raspberry nach einen Neustart
automatisch mit den Thermostaten verbindet.

Trennen der Verbindung mit:

root@raspi# echo -e "disconnect 00:1A:22:07:70:9A\nquit" | bluetoothctl


Mein Script, bzw. das Python Modul "pexpect" macht jetzt nichts anderes als den gatttool Aufruf von oben
zu automatisieren, die zurückgegebenen Werte anzuzeigen, und leserlich auszugeben.

Das Script kann irgendwo unter beliebigen Namen gespeichert werden.
Aufruf: python /wo/auch/immer/scriptname.py MAC_des_Thermostaten handle wert

Beispiele
Aktuelle Werte auslesen:

root@raspi# python eq-3.py 00:1A:22:07:70:9A 0x0411 03
0x0421: 02 01 29 00 04 09
   dec: 2 1 41 0 4 9
-----------------------
Modus: Locked
Ventil: 0%
Temp.: 4.5°C
root@raspi#


Temperatur auf 16 Grad stellen:

root@raspi# python eq-3.py 00:1A:22:07:70:9A 0x0411 4120
0x0421: 02 01 29 00 04 20
   dec: 2 1 41 0 4 32
-----------------------
Modus: Locked
Ventil: 0%
Temp.: 16.0°C
root@raspi#


Modus Manuell:

root@raspi# python eq-3.py 00:1A:22:07:70:9A 0x0411 4040
0x0421: 02 01 09 00 04 14
   dec: 2 1 9 0 4 20
-----------------------
Modus: Manuell
Ventil: 0%
Temp.: 10.0°C
root@raspi#


Modus Automatik:

root@raspi# python eq-3.py 00:1A:22:07:70:9A 0x0411 4000
0x0421: 02 01 08 00 04 2e
   dec: 2 1 8 0 4 46
-----------------------
Modus: Automatik
Ventil: 0%
Temp.: 23.0°C
root@raspi#


Die Handles und Werte die zu übergeben sind, stehen alle im Post von CANivore.
https://forum.fhem.de/index.php/topic,39308.msg409367.html#msg409367

Wie man das Script in FHEM einbindet und der mit den ausgegebenen Werten umgeht, kann ich leider nicht sagen,
weil ich den selbst nicht verwende.


Auch hab ich das Thema nicht weiter verfolgt, da ich in absehbarer Zeit eh meine Heizung erneuere und keine Thermostate mehr brauche.

Hope that helps!!

RasPi_Bastler


zoggermaster

Supi das bringt mich schonmal viel weiter. Leider bekomme ich bei aufruf deines Scriptes folgenden fehler: -bash: /usr/bin/python: /usr/bin/python: Defekter Interpreter: Zu viele Ebenen aus symbolischen Links.

RasPi_Bastler

Dann hast Du das script mit ziemlicher Sicherheit in den Windows Editor kopiert und auf Deine Linuxbüchse übertragen.

->  http://sysadminscorner.uherbst.de/shell/crlf.html

zoggermaster

Hab deinen Text kopiert und direkt in Pyton eine neue Datei erstellt. Alles direkt über Raspian.

Bastix87

#49
Hallo,

Ich habe mir mal die Python-Scripte angeschaut, da ich ebenfalls die Bluetooth-Variante der Module habe und schon länger darauf gewartet habe,
das jemand eine Lösung findet.

Ich bin absoluter Programmier-Anfänger was Python betrifft (eigentlich was Programmierung allgemein anbelangt ;) ).
Die Scripte funktionieren jetzt soweit, dass ich meine Ventile auslesen und Temperatur und Modus einstellen kann.
Das Ganze habe ich in Fhem eingebunden, in dem ich die  Scripte um eine GET - Abfrage an Fhem erweitert habe.
Wie gesagt, alles sicher nicht gerade sauber programmiert, da ich eben nicht wirklich was mit Python am Hut habe ;)

Folgende Ausgangssituation:
Wohnzimmer mit 3 Heizkörpern, alle sollen gleichzeitig und identisch programmiert und ausgelesen werden.
Ausreichend sind erstmal Temperatur und Modi.
Das Auslesen der aktuellen Werte erfolgt per Knopfdruck (Button in Tablet UI) oder sobald mal die Temperatur ändert.

Ich habe für alle 3 Ventile jeweils ein Python-Script angelegt.Diese sind dann in einem Shell-Script zusammengeführt. Vor Ausführung der Python-Scripte lasse ich nochmal alle BT-Verbindungen
trennen. Die MAC-Adresse und der Handle stehen nun fest drin und müssen nicht beim Aufruf übergeben werden.
Im Script übergebe ich die Temperatur, Ventilöffnung und Modus an eine URL (in meinem Fall 3):

fhem = "http://<user>:<password>@192.168.xxx.xxx:<Port>/fhem?cmd=setreading%20HeizVentil_mitte%20Temperatur%20" + str(temp)
fhem2 = "http://<user>:<password>@192.168.xxx.xxx:<Port>/fhem?cmd=setreading%20HeizVentil_mitte%20Stellung%20" + str(vent)
fhem3 = "http://<user>:<password>@192.168.xxx.xxx:<Port>/fhem?cmd=setreading%20HeizVentil_mitte%20Modus%20" + modestr
<...>
urllib.urlopen(fhem)
urllib.urlopen(fhem2)
urllib.urlopen(fhem3)
<...>


Im Fhem gibt es jetzt den dazugehörigen Dummy:


define HeizVentil_mitte dummy
attr HeizVentil_mitte icon icoKLIMA
attr HeizVentil_mitte room Heizung
attr HeizVentil_mitte stateFormat T: Temperature P: Stellung M: Modus


Aussehen im Tablet UI siehe Anhang.


dertester

Hallo,
habe eben das script mit 3 Thermostaten zum laufen bekommen.

Leider gibt ein Thermostat komische werte zurück..

Habt ihr eine Idee?


Teilweise war der modus auch 0d und das script gab dann unbekannt aus.
Aber auch in Beispiel unten stimmen weder Modus noch Temp mit dem Display oder
der Android App überein.

Firmware ist laut App aktuell.

Auslesen:
odroid@odroid-jessie64:~/dev$ python eq3.py 00:1A:22:06:B7:C1 0x0411 03
0x0421: 02 01 09 00 04 09
   dec: 2 1 9 0 4 9
-----------------------
Modus: Manuell
Ventil: 0%
Temp.: 4.5°C


BOOST setzen:
odroid@odroid-jessie64:~/dev$ python eq3.py 00:1A:22:06:B7:C1 0x0411 4501
0x0421: 02 01 0d 50 04 09
   dec: 2 1 13 80 4 9
-----------------------
Modus: Unbekannt



Beim Pairing:
[bluetooth]# pair 00:1A:22:06:B7:C1
Attempting to pair with 00:1A:22:06:B7:C1
[CHG] Device 00:1A:22:06:B7:C1 Connected: yes
[CHG] Device 00:1A:22:06:B7:C1 UUIDs:
        00001800-0000-1000-8000-00805f9b34fb
        00001801-0000-1000-8000-00805f9b34fb
        0000180a-0000-1000-8000-00805f9b34fb
        3e135142-654f-9090-134a-a6ff5bb77046
        9e5d1e47-5c13-43a0-8635-82ad38a1386f
[CHG] Device 00:1A:22:06:B7:C1 Paired: yes
Pairing successful
[bluetooth]# trust 00:1A:22:06:B7:C1
[CHG] Device 00:1A:22:06:B7:C1 Trusted: yes
Changing 00:1A:22:06:B7:C1 trust succeeded
[bluetooth]# disconnect 00:1A:22:06:B7:C1

CoolTux

Ich klinke mich hier mal ein. Nicht weil ich so ein Thermostat habe, sondern weil ich vor habe ein gatttool IODev Modul zu schreiben auf das dann andere Module zugreifen konnen. So auch ein HM BT Thermostate Modul.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

RasPi_Bastler

@dertester,

wirklich nur bei einem Thermostat?

Hab das ganze eben mal bei meinen zwei Thermostaten duchgespielt.
es gibt wohl einen Unterschied beim "Boost" wenn Manuell oder Automatik eingestellt ist.

Wenn Du das script um:if mode == '0c':
    modestr = 'Boost Auto'
if mode == '0d':
    modestr = 'Boost Manu'

erweiterst, passt's wieder.

Gruß
RasPi_Bastler

dertester

#53
Es ist nur das eine, 3 weiter funktionieren wie sie sollen.
Habe es eben auch mal resettet.

Es gibt einfach falsche Werte zurück.

Nach dem Reset bekomme ich immer:
python eq3.py 00:1A:22:06:B7:C1 0x0411 03
0x0421: 02 01 08 00 04 20
   dec: 2 1 8 0 4 32
-----------------------
Modus: Automatik
Ventil: 0%
Temp.: 16.0°C


Auch wenn auf dem Display 21°C steht. Mit dem Smartphone wird die Temp richtig angezeigt.
Wenn ich sie ändere, gibt mir das Skript trotzdem keine anderen Werte.

//EDIT

Wenn ich mit 4120 die Temperatur setze, wird diese auch gespeichert und korrekt mit 03 ausgelesen. Es ist nur so, dass es nichts am Display des Thermostat und der App ändert und auch nicht am Verhalten.

Kann es sein, dass es anderer Handle oder Speicherbereich ist? Kann ich das irgendwie herrausfinden? Kenne mit leider mit den Bluetooth Befehlen nicht gut aus.

zlies

Ich hab das Ding eben mal aufgeschraubt, da ich vor allem am Auslesen der aktuellen Temperatur interessiert bin. Leider konnnte ich auf der Platine keinen Temperatursensor erkennen. Kann es sein, dass es ohne Sensor arbeitet und sich eher auf Richtwerte verlässt?

Humpelstilzchen

#55
zlies: Hast du zufällig ein Foto? Für ohne Sensor regelt der zuviel. Und die Fenster-Auf-Erkennung braucht auch eine Basis.

-

Habe ein Problem mit dem Python-Skript. Die Ausführung setzt bei mir die Uhrzeit zurück und damit funktionieren die Zeitschaltungen natürlich nicht mehr. Habe das Skript entsprechend angepasst, scheint soweit zu klappen.

zlies

Na klar! Hier die Fotos :)
Qualität ist leider nicht überragend, aber das beste was ich bei wenig licht mit meinem iPhone rausholen konnte

dertester

Vll hat der soc oder der bluetooth chip einen integrierten Temperatursensor.

Hab beim überfliegen der Datasheets nichts gefunden aber beim bluetoothmodul sind verschiedene Anwendungen und vor allem ein Ausgleich für Temperaturänderungen vorgesehen.


Kawaci

Habe jetzt alles zusammen gebracht es funktioniert auch in fhem! jetzt würde ich gerne was optimieren!
wie kann ich dieses 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"


und dieses

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

import pexpect # install with: pip install pexpect
import sys
import argparse #um den Namen vom Config File anzugeben
import urllib #das macht den eigentlichen Zauber
import json #in dem Format ist meine Config gespeichert

#bluetooth_adr = sys.argv[1]
bluetooth_adr = '00:1A:22:##:##:##'
gatt_handle = '0x0411'
gatt_value = '03'

# start and connect gatttool
#pexpect.spawn('echo -e "disconnect 00:1A:22:##:##:##\nquit" | bluetoothctl')
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'

# fhem Kommando erzeugen
fhem = "http://user:password@192.168.xx.xx:Port/fhem?cmd=setreading%20HeizVentil_rechts%20Temperature%20" + str(temp)
fhem2 = "http://user:password@192.168.xx.xx:Port/fhem?cmd=setreading%20HeizVentil_rechts%20Stellung%20" + str(vent)
fhem3 = "http://user:password@192.168.xx.xx:Port/fhem?cmd=setreading%20HeizVentil_rechts%20Modus%20" + modestr
# so wird dann ein Befehl an fhem abgesetzt
urllib.urlopen(fhem)
urllib.urlopen(fhem2)
urllib.urlopen(fhem3)

# disconnect gatttool
tool.sendline('disconnect')
tool.sendline('quit')
pexpect.spawn('echo -e "disconnect 00:1A:22:##:##:##\nquit" | bluetoothctl')


miteinander kombinieren! beim ersten script geht es um den slider in fhem der nur die normale dec zahl ausgibt aber ich für das script von raspi_bastler und bastix87 einen doppelten wert benötige!
Hoffe es sind hier einige Programmier Profis!

Danke an raspi_bastler und bastix87 für die Hilfe!


dominik

Hallo,
erstmal großes Danke an die tolle Arbeit und die Informationen für dieses Heizkörperthermostat. Ich habe mir vorgestern einen gekauft und bin begeistert wie gut das Teil funktioniert.

Ich habe die Informationen zum Setzen der Temperatur mal aus diesem Thread zusammen getragen und in ein "Bastel-Modul" eingebaut. Bitte beachtet, dass ich das echt nur schnell zusammen geschrieben habe und sicher noch viele Fehler enthalten sind.

Das Modul erfordert ein installiertes gatttool.

Aktuell kann nur die Temperatur damit gesetzt werden und nach erfolgreichem Ausführen wird die Temperatur im Reading aktualisiert. Wäre super, wenn sich andere auch an der Modulentwicklung beteiligen könnten, da ich aktuell leider nicht viel Zeit habe um das vernünftig auszubauen.

@CoolTux, wenn du dein IODev für gatttool fertig hast, würde ich das natürlich gerne integrieren :)

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik