VALVES und die Fritz DECT 301 Thermostate, Ventilstellung reinhacken

Begonnen von Eumeltier, 25 Januar 2026, 21:12:05

Vorheriges Thema - Nächstes Thema

Eumeltier

Moin,

ich meditiere darüber, mir ein FHEM aufzusetzen. Als erstes ginge es mir da um die Heizungsregelung und dort würde ich gerne das Modul VALVES einsetzen.

Meine Thermostate sind alle Fritz DECT 301 Thermostate. Nun geben die leider über die von AVM definierte Schnittstelle keine Ventilstellung raus  >:(

ABER: Man kann die Ventilstellung aus den Debug-Daten der Fritzbox extrahieren. Ich mache das mit einem Skript seit geraumer Zeit und dies funktioniert einwandfrei.

Wie - und welches Modul - müßte man jetzt modifizieren, um die Ventilstellungen der Thermostate reinzufummeln, damit das mit VALVES dann auch funktioniert?

Gruß,
Martin

JoWiemann

Hallo Martin,

wenn Du Dein Script zur Verfügung stellst, dann kann ich das in das FritzBox Modul einbauen.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Beta-User

Alternativ: die Readings mit dem Script (erst mal) an die Thermostate schreiben.

Falls Anpassungen an VALVES (contrib-Fassung) erforderlich wären bitte melden und ein "list" von einem der Thermostate einstellen.
Server: HP-elitedesk@Debian 13, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Eumeltier

Zitat von: JoWiemann am 26 Januar 2026, 06:34:41wenn Du Dein Script zur Verfügung stellst, dann kann ich das in das FritzBox Modul einbauen.

Das wäre natürlich am Ende das Beste. Wie identifizierst Du die Fritz SmartHome Geräte? Über die AIN? Oder über den Namen?

Zum Lesen der Debug-Daten von der Box nutze ich allerdings die Fritz!Box-Tools von Michael Engelke, die müsste man also mit installieren oder die Funktionalität aus den Tools extrahieren. Da man leider immer die ganzen Debug-Daten lesen muß und die Datei ziemlich groß ist und die Daten anscheinend von der Fritzbox nicht besonders schnell zur Verfügung gestellt werden, dauert der Einlesevorgang schon einige Zeit. Für die optimale Reaktionszeit müßte man das dann alle 15min machen (oder mit DECT302 dann alle 5min glaube ich?)
Die Telegramme von den Thermostaten stehen in den Debug-Daten für die letzten 3 Stunden drin, wenn ich mich recht entsinne.
Ich lese derzeit die Daten alle Stunde aus, damit verpasse ich nichts. Für eine Regelung wie VALVES wäre das natürlich etwas träge.

Danach ist das nur noch ein bißchen Text parsen und wissen, welche Bytes was bedeuten.

Man bekommt die Soll-Temperatur, die am Thermostaten gemessene Temperatur und den Offset (fest eingestellt über die Fritz-GUI oder nachgeführt über einen externen Sensor, wenn vorhanden). Gemessene Temperatur minus Offset ist dann die zu regelnde Raumtemperatur.
Weiterhin kann man "MIN", "MAX", "BOOST" und "Fenster offen" als Status auslesen.

Da ich nur DECT 301 habe, passt das auch nur für die, aber sicherlich sieht das Procedere für Comet DECT, DECT 300 und DECT 302 ähnlich aus.

JoWiemann

Hallo,

die SupportData kann ich schon mal in das Modul laden. In den SupportData wird die ule_id verwendet. Die verwende ich auch zum Bilden der shdevice.. Readings.

Idee ist jetzt folgende:
- aktivieren über eine neues Attribut enableSupportData
- eigener nonBlocking Timer für die Support Daten.
- weitere Readings shdevice<id>_valvePosition, shdevice<id>_valveMotions, shdevice<id>_valveSteps
- neues get <name> supportData

Falls Ihr weitere Ideen habt, dann posten.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Eumeltier

Ok, also, bevor ich meinen Code versuche zu erklären, ist es vermutlich so einfacher:

In den Support-Daten ab "DECTULE AHA" findet man die Smart-Home-Geräte

Ein Block für ein Device sieht so aus:
ule_id: 25, activ, functionbitmask: 0x140, emc: 0xb74, pollbit: 0, pollhold: 0, payloadtype: avm, dlctype: avm, dsaa2: 0, name: Arbeitszimmer
hwversion: 0x606, hwslaveversion: 0x0, fw: 0x517(), fwhash: 0x0000000000C467(25-6-23 7:30), ifaceversion: 266, pvcreset: 1, pvcinitstate: 1, update lasttime: 0 state: 0,
valve_position: 63, valve_motions: 237, valve_steps: 56764
Paging req_resptime 0 bit 127 paging_desc ff ff ff ff, pagecnt 0,timer pagingcheck: 0, update: 0, update_trigger_cnt: 0, nonpagingtxabort: 0, nonpagingstubfree: 0, nonpagingidletimeout: 0
time(last) validmsg: 1769421659, paging: 0, locateind: 1769099470, lockedind 0, statechange: 1769099470, pvcinit 0, pvcreset 0, attrreportwatch: 0, nocfmcnt: 0, pollinterval 900, polltimeout 3000
TX Lastitems:
time: 1769410744, msgid:     34,          HKRSCHALTPUNKTE: len: 24, nextm: 0, 18 00 91 00 20 58 ff ff ff ff ff ff 28 58 ff ff ff ff ff ff 28 58 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769410744, msgid:     33,          HKRSCHALTPUNKTE: len: 33, nextm: 1, 21 00 91 01 02 20 58 ff ff ff ff ff ff 20 58 ff ff ff ff ff ff 20 58 ff ff ff ff ff ff 20 58 ff ff ff ff ff ff 00 00 00
time: 1769410744, msgid:     32,               HKRHOLIDAY: len: 18, nextm: 0, 12 00 93 00 80 01 01 80 09 1a 01 1a fd 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769410744, msgid:     31,               HKRHOLIDAY: len: 27, nextm: 1, 1b 00 93 01 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00 00
time: 1769410744, msgid:     30,               HKRHOLIDAY: len: 28, nextm: 2, 1c 00 93 02 02 00 01 06 80 17 1f 08 80 fd 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00
time: 1769379199, msgid:     29,                 DATETIME: len:  6, nextm: 0, 06 00 03 00 02 0d 17 19 01 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769292839, msgid:     27,                 DATETIME: len:  6, nextm: 0, 06 00 03 00 02 0e 17 18 01 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769206479, msgid:     25,                 DATETIME: len:  6, nextm: 0, 06 00 03 00 02 0f 17 17 01 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769120241, msgid:     23,                 DATETIME: len:  6, nextm: 0, 06 00 03 00 02 11 17 16 01 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769099612, msgid:     21,               HKRHOLIDAY: len: 18, nextm: 0, 12 00 93 00 80 01 01 80 80 01 01 80 fd 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769099612, msgid:     20,               HKRHOLIDAY: len: 27, nextm: 1, 1b 00 93 01 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00 00
time: 1769099612, msgid:     19,               HKRHOLIDAY: len: 28, nextm: 2, 1c 00 93 02 02 00 01 06 80 17 1f 08 80 fd 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00
time: 1769099611, msgid:     18,          HKRSCHALTPUNKTE: len: 24, nextm: 0, 18 00 91 00 43 58 ff ff ff ff ff ff 28 58 ff ff ff ff ff ff 28 58 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769099611, msgid:     17,          HKRSCHALTPUNKTE: len: 33, nextm: 1, 21 00 91 01 02 43 58 ff ff ff ff ff ff 43 58 ff ff ff ff ff ff 43 58 ff ff ff ff ff ff 43 58 ff ff ff ff ff ff 00 00 00
time: 1769099611, msgid:     16,             TIMERCONTROL: len: 11, nextm: 0, 0b 00 96 00 02 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769099611, msgid:     15,               HKRHOLIDAY: len: 18, nextm: 0, 12 00 93 00 80 01 01 80 80 01 01 80 fd 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769099611, msgid:     14,               HKRHOLIDAY: len: 27, nextm: 1, 1b 00 93 01 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00 00
time: 1769099473, msgid:     12,               HKRHOLIDAY: len: 28, nextm: 2, 1c 00 93 02 02 00 01 06 80 17 1f 08 80 fd 80 01 01 80 80 01 01 80 ff 80 01 01 80 80 01 01 80 ff 00 00 00 00 00 00 00 00
time: 1769099472, msgid:     11,          HKRSCHALTPUNKTE: len: 24, nextm: 0, 18 00 91 00 43 58 ff ff ff ff ff ff 28 58 ff ff ff ff ff ff 28 58 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769099472, msgid:     10,          HKRSCHALTPUNKTE: len: 33, nextm: 1, 21 00 91 01 02 43 58 ff ff ff ff ff ff 43 58 ff ff ff ff ff ff 43 58 ff ff ff ff ff ff 43 58 ff ff ff ff ff ff 00 00 00
RX Lastitems:
time: 1769421659, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 6f dd bc ed 3f 0c 00 92 00 00 2f 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769420819, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 01 00 64 23 dd b5 ec 44 0c 00 92 00 00 2f 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769419859, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 0d dd a7 ea 4f 0c 00 92 00 00 2f 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769419020, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 17 dd 9e e8 55 0c 00 92 00 00 2f 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769418061, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 74 dd 8c e6 63 0c 00 92 00 00 2f 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769417222, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 97 dd 7c e4 6f 0c 00 92 00 00 2e 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769416261, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 01 00 64 0b dd 69 e0 7b 0c 00 92 00 00 2d 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769415421, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 01 00 64 0b dd 3a dd 9f 0c 00 92 00 00 2c 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769414463, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 6e dd 1c da b5 0c 00 92 00 00 2a 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769413622, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 0b dc fe d7 c4 0c 00 92 00 00 29 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769412662, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 01 00 64 0f dc e2 d3 cf 0c 00 92 00 00 28 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769411823, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 02 00 64 0b dc bf ce ea 0c 00 92 00 00 26 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769410865, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 03 00 64 00 db 8d ca 1d 0c 00 92 00 00 24 2a 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769410745, msgid: ------,                DATACHECK: len:  5, nextm: 0, 05 00 08 00 00 91 39 d2 d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769410744, msgid: ------,                DATACHECK: len:  5, nextm: 0, 05 00 08 00 00 93 49 e9 6d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
time: 1769410743, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 0d db 8d ca 1d 0c 00 92 00 00 24 20 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769409785, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 98 db 81 c8 25 0c 00 92 00 00 24 20 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769408944, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 00 00 64 0b db 79 c6 2a 0c 00 92 00 00 23 20 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769407985, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 01 00 64 0b db 55 c3 44 0c 00 92 00 00 22 20 20 2a 03 08 0a 00 00 00 00 00 00 00 00
time: 1769407145, msgid: ------,                SLEEPTIME: len:  2, nextm: 0, 02 00 04 00 00 0f 0a 00 90 00 00 00 01 00 64 0b db 46 c2 39 0c 00 92 00 00 22 20 20 2a 03 08 0a 00 00 00 00 00 00 00 00
stat_index: 17
i rx_ok rx_fail rx_dup rx_empt tx_ok tx_fail locate abort qfull generic steps motions
0 4 0 3 0 0 0 0 0 0 4380 21 4
1 4 0 4 0 0 0 0 0 0 2090 26 4
2 4 0 4 0 0 0 0 0 0 2540 36 6
3 4 0 4 0 0 0 0 0 0 5410 30 5
4 4 0 1 0 0 0 0 0 0 2120 84 2
5 6 0 1 1 1 0 0 1 0 2500 0 0
6 5 0 4 1 0 0 0 0 0 5100 0 0
7 4 0 4 0 0 0 0 0 0 2420 0 0
8 4 0 3 0 0 0 0 0 0 3100 0 0
9 4 0 4 0 0 0 0 0 0 880 28 3
10 4 0 4 0 0 0 0 0 0 450 26 3
11 4 0 3 0 0 0 0 0 0 1110 50 5
12 4 0 3 0 0 0 0 0 0 760 63 6
13 4 0 4 0 0 0 0 0 0 1850 49 4
14 7 0 8 12 5 0 0 0 0 4870 362 11
15 4 0 2 0 0 0 0 0 0 1470 123 15
16 4 0 3 0 0 0 0 0 0 3010 100 11
17 3 0 2 0 0 0 0 0 0 1590 30 5
18 4 0 3 0 0 0 0 0 0 1570 0 0
19 4 0 2 0 0 0 0 0 0 1940 101 12
20 4 0 0 0 0 0 0 0 0 1330 56 7
21 4 0 3 0 0 0 0 0 0 1820 38 3
22 4 0 3 0 0 0 0 0 0 3350 13 2
23 4 0 4 0 0 0 0 0 0 3440 20 3
ReceiveQueue:
recfirstitem: 0, size: 0
SendQueue sendfirstitem: 0, stubqueueitem: NULL, currentstubqueueitem: 0 stubsendqueuesize: 0

Die ule_id steht schonmal ganz vorne.

Ich filtere nach hwversion: 0x607 und hwversion: 0x606 - das sind die DECT 301. Für die DECT 300 und 302 müßte man dann mal gucken.
Uns interessieren die RX Lastitems und zwar die SLEEPTIME. Die Zeile beginnt mit time: und einem Timestamp.
Der Payload findet sich nach dem "nextm: 0," - 40 Bytes

Indices (0-Basiert):
14 - Batterie in Prozent (0 bis 100)
19 - Ventilöffnung (0 bis 255)
29 - Temperaturoffset (mit Vorzeichen) * 2 - also 2 = 1 Grad, 127 = -1 Grad
25 - Am Thermostaten gemessene Temperatur * 2
Die Ist-Temperatur ist dann ([25] - [29]) / 2
26 - Solltemperatur in Grad * 2 außer wenn fd, fe oder ff
26 - fd = OFF / fe = MAX / ff und die [11] = 10 => Fenster auf (und damit aus) / ff und [11] != 10 => BOOST (und damit max)
27 = Absenktemperatur in Grad * 2
28 = Normaltemperatur in Grad * 2
Sonderfälle fd / fe / ff gelten auch für 27 und 28

Das ganze geht übrigens zurück auf ein Posting im ip-phone-forum:
https://www.ip-phone-forum.de/threads/fritz-dect-301-sehr-lange-aufheizphase-da-regler-das-ventil-nicht-voll-%C3%B6ffnet.312159/post-2460070
Die ursprüngliche Forschung ist nicht auf meinem Mist gewachsen. Ich hab nur ausprobiert daß man das automatisieren kann und noch ein paar Kleinigkeiten herausgefunden.

In dem Post findet man auch noch weitere Bedeutungen zu Ventilschritten, die hab ich persönlich nicht ausgewertet.