Neues Modul: Tado Heizungssystem

Begonnen von strategy, 28 Januar 2019, 21:40:08

Vorheriges Thema - Nächstes Thema

uxtuner

Viele Grüße
  Uwe

Intel NUC (VDR & FHEM), QNAP TS-453, OneWire (Temp. Sensor, 8-fach Schalter, Hub, Controller), Ebus (Wolf CGW-2, ISM7i), Fibaro (Flood Sensor, Wall Plug, 4 in 1 Sensor), Qubino (Flush 1D), Shelly (Plug S, H&T, 2.5, 1 PM), Tado (Thermostat V3+)

Karflyer

ZitatNein, das war bei mir nicht so. Bei der zweiten Bridge stehen die Attribute generateDevices und generateWeather auf "no". Die Zonen sind nur einmal vorhanden, und werden von der neuen Bridge auch nicht gepollt. Hast du in Tado den zweiten Benutzer über die Funktion "Lade Personen Personen zu deinem Zuhause ein" angelegt? Ich denke nur so kann es funktionieren.

Ich hatte die Zonen in FHEM umbenannt (Namen der devices). Das macht im sonstigen Betrieb kein Problem führtes aber wohl bei dem erstellen einer weiteren tado-Bridge dazu, dass die Devices (Zonen) mit ihrem Originalnamen wieder angelegt wurden.

haemmi

Zitat von: Karflyer am 09 November 2019, 20:50:24
Ich hatte die Zonen in FHEM umbenannt (Namen der devices). Das macht im sonstigen Betrieb kein Problem führtes aber wohl bei dem erstellen einer weiteren tado-Bridge dazu, dass die Devices (Zonen) mit ihrem Originalnamen wieder angelegt wurden.

Ja, dann ist es klar. Ich hatte die Zonen nicht umbenannt. Gut zu wissen!!

uxtuner

Hi

ist das schonmal aufgefallen?

2019.11.16 13:38:55 1: Tado_GetZones (TadoBridge2): create new device 'Tado_Keller' for zone '2'
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: PERL WARNING: Use of uninitialized value $name in concatenation (.) or string at fhem.pl line 4772.
2019.11.16 13:38:55 1: readingsUpdate(,date_created,2019-11-02T16:30:00.945Z) missed to call readingsBeginUpdate first.
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBulkUpdate            called by fhem.pl (4918)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4525.
2019.11.16 13:38:55 1: PERL WARNING: Use of uninitialized value $dev in hash element at fhem.pl line 3626.
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (461)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: readingsUpdate(,supports_dazzle,true) missed to call readingsBeginUpdate first.
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBulkUpdate            called by fhem.pl (4918)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (461)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: Tado_GetZones (TadoBridge2): create new device 'Tado_Galerie' for zone '3'
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: readingsUpdate(,date_created,2019-11-02T16:37:35.912Z) missed to call readingsBeginUpdate first.
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBulkUpdate            called by fhem.pl (4918)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (461)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: readingsUpdate(,supports_dazzle,true) missed to call readingsBeginUpdate first.
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBulkUpdate            called by fhem.pl (4918)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (461)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: Tado_GetZones (TadoBridge2): create new device 'Tado_Eingang' for zone '4'
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: readingsUpdate(,date_created,2019-11-02T16:54:31.331Z) missed to call readingsBeginUpdate first.
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBulkUpdate            called by fhem.pl (4918)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (461)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: readingsUpdate(,supports_dazzle,true) missed to call readingsBeginUpdate first.
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBulkUpdate            called by fhem.pl (4918)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (461)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)

Viele Grüße
  Uwe

Intel NUC (VDR & FHEM), QNAP TS-453, OneWire (Temp. Sensor, 8-fach Schalter, Hub, Controller), Ebus (Wolf CGW-2, ISM7i), Fibaro (Flood Sensor, Wall Plug, 4 in 1 Sensor), Qubino (Flush 1D), Shelly (Plug S, H&T, 2.5, 1 PM), Tado (Thermostat V3+)

Karflyer

Hallo Matthias,

beim Neustart von FHEM (und auch zwischendurch) erhalte ich die folgenden zwei Warnhinweise im Log:
2019.11.20 08:52:49 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_Tado.pm line 1187.
2019.11.20 08:52:49 1: PERL WARNING: Argument "" isn't numeric in sprintf at ./FHEM/98_TadoDevice.pm line 195.

Könntest du dir das bitte noch einmal anschauen.

Gruß
Stefan

strategy

Zitat von: Karflyer am 20 November 2019, 09:06:43
Hallo Matthias,

beim Neustart von FHEM (und auch zwischendurch) erhalte ich die folgenden zwei Warnhinweise im Log:
2019.11.20 08:52:49 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_Tado.pm line 1187.
2019.11.20 08:52:49 1: PERL WARNING: Argument "" isn't numeric in sprintf at ./FHEM/98_TadoDevice.pm line 195.

Könntest du dir das bitte noch einmal anschauen.


Das ist seltsam.

Die Zeile 98_Tado.pm line 1187 enthält in der letzten Version keine String Concatenation, sondern die Prüfung ob mobile Geräte erzeugt werden sollen. Da kann dieser Fehler eigentlich gar nicht auftreten.

98_TadoDevice.pm line 195 hab ich mir auch angeschaut. Scheinbar liefert das betroffene Gerät keine gemessene Temperatur. Werde ich anpassen. In dem Fall wird einfach nur der angeforderte Zustand mit ausgegeben und keine Temperatur.

Die Änderungen stelle ich gleich online

strategy

Zitat von: uxtuner am 16 November 2019, 13:43:02
Hi

ist das schonmal aufgefallen?

2019.11.16 13:38:55 1: Tado_GetZones (TadoBridge2): create new device 'Tado_Keller' for zone '2'
2019.11.16 13:38:55 1: ERROR: empty name in readingsBeginUpdate
2019.11.16 13:38:55 1: stacktrace:
2019.11.16 13:38:55 1:     main::readingsBeginUpdate           called by fhem.pl (4917)
2019.11.16 13:38:55 1:     main::readingsSingleUpdate          called by ./FHEM/98_Tado.pm (460)
2019.11.16 13:38:55 1:     main::Tado_GetZones                 called by fhem.pl (3297)
2019.11.16 13:38:55 1:     main::HandleTimeout                 called by fhem.pl (677)
2019.11.16 13:38:55 1: PERL WARNING: Use of uninitialized value $name in concatenation (.) or string at fhem.pl line 4772.
2019.11.16 13:38:55 1: readingsUpdate(,date_created,2019-11-02T16:30:00.945Z) missed to call readingsBeginUpdate first.



Hallo Uwe,

das sieht so aus, als ob der Hash, also die Datenstruktur in der alle Elemente von FHEM gespeichert werden, nicht initialisiert ist.
Hattest du dieses Problem nur einmal bei der Anlage oder tritt das öfter auf?
Wenn das öfter auftritt, kannst du die Schritte beschreiben um das Problem nachzustellen?

Gruß,
Matthias

Karflyer

Hallo Matthias,

ich habe die neue Version des Moduls eingespielt. Jetzt habe ich die folgenden beiden Fehlermeldungen beim Neustart von FHEM im Log:

2019.11.22 10:18:32 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_Tado.pm line 1192.
2019.11.22 10:18:32 1: PERL WARNING: Redundant argument in sprintf at ./FHEM/98_TadoDevice.pm line 198.


Gruß
Stefan

dl7vea

Sehr gutes Modul! Vielen Dank für diese Arbeit  :)

Ich habe gerade angefangen meine alte tado HTTPMOD Implementierung umzustellen. Dabei ist mir aufgefallen, dass es kein Reading für die Anwesenheit gibt. Ich benutze dieses in Kombination mit anderen Devices zur Anwesenheitserkennung. Kann man dieses noch in das Modul implementieren? Vielleicht im im TadoDevice subtype Zone denn der Status ist wohl zonenbezogen ...

In meiner HTTPMOD Implementierung kommt das unter der URL (hier für Zone 1)


attr tado get01URL https://my.tado.com/api/v2/homes/%homeid%/zones/1/state
...
attr tado reading05JSON tadoMode
attr tado reading05Name mode
attr tado reading05OMap HOME:present, AWAY:absent


Es wäre super, wenn das auch funktionieren würde. Dann kann ich mein HTTPMOD ausmachen  8)

Viele Grüße Axel

Karflyer

ZitatSehr gutes Modul! Vielen Dank für diese Arbeit  :)

Ich habe gerade angefangen meine alte tado HTTPMOD Implementierung umzustellen. Dabei ist mir aufgefallen, dass es kein Reading für die Anwesenheit gibt. Ich benutze dieses in Kombination mit anderen Devices zur Anwesenheitserkennung. Kann man dieses noch in das Modul implementieren? Vielleicht im im TadoDevice subtype Zone denn der Status ist wohl zonenbezogen ...

In meiner HTTPMOD Implementierung kommt das unter der URL (hier für Zone 1)

Code: [Auswählen]

attr tado get01URL https://my.tado.com/api/v2/homes/%homeid%/zones/1/state
...
attr tado reading05JSON tadoMode
attr tado reading05Name mode
attr tado reading05OMap HOME:present, AWAY:absent


Es wäre super, wenn das auch funktionieren würde. Dann kann ich mein HTTPMOD ausmachen  8)

Viele Grüße Axel

Diese Information bekommst du, wenn du ein 'mobil_device' anlegst. Im Pollingdevice (z.B. TadoBridge) <get TadoBridge mobil_devices> ausführen.

Gruß
Stefan

dl7vea

Hallo,

dann bekomme ich den Status für das oder die Devices, die mit meinem Account verbunden sind. Hat sich jedoch wie in meinem Fall, ein Mitbewohner mit einem eigenen Account bei Tado angemeldet, dann bräuchte ich wahrscheinlich eine zweite TadoBridge mit dieser Anmeldung und müsste diese Status in fhem miteinander verkoppeln. Der entsprechende Status einer Zone macht das alles schon von tado aus.

Ich habe vorhin mal Hand angelegt und für mich ein entsprechendes Reading in das Modul gebaut... Kann ich wenn gewünscht beisteuern  :)

Liebe Grüße und einen schönen zweiten Advent ringsrum.

Karflyer

ZitatHallo,

dann bekomme ich den Status für das oder die Devices, die mit meinem Account verbunden sind. Hat sich jedoch wie in meinem Fall, ein Mitbewohner mit einem eigenen Account bei Tado angemeldet, dann bräuchte ich wahrscheinlich eine zweite TadoBridge mit dieser Anmeldung und müsste diese Status in fhem miteinander verkoppeln. Der entsprechende Status einer Zone macht das alles schon von tado aus.

Ich habe vorhin mal Hand angelegt und für mich ein entsprechendes Reading in das Modul gebaut... Kann ich wenn gewünscht beisteuern  :)

Liebe Grüße und einen schönen zweiten Advent ringsrum.

Das hört sich interessant an. Ich habe in der Tat zwei TadoDevices anlegen müssen um den Status von zwei Mitbewohnern erkennen zu können. Dein Lösung hört sich sehr viel einfacher an. Wäre schön, wenn du die Lösung posten würdest.
Gruß
Stefan

dl7vea

#162
Zitat von: Karflyer am 08 Dezember 2019, 10:13:55
Das hört sich interessant an. Ich habe in der Tat zwei TadoDevices anlegen müssen um den Status von zwei Mitbewohnern erkennen zu können. Dein Lösung hört sich sehr viel einfacher an. Wäre schön, wenn du die Lösung posten würdest.
Gruß
Stefan

Es ist so, dass einerseits die einzelnen Devices bei tado den Status "away" bekommen. Jede Zone hat darüber hinaus in der API einen "tadoMode", den man auslesen kann. Dieser steht entweder auf HOME oder AWAY. Gesetzt wird AWAY erst wenn alle angemeldeten Geräte aus dem Haus sind. Also das ist das event, bei dem tado dann auch die Heizung in den Away Modus setzt. Und soweit ich das sehe, werden alle Zonen gleichzeitig gesetzt. (Voraussetzung ist natürlich, dass die "Geo-Steuerung" für die Zone aktiviert ist. Sonst wird das wohl nicht passieren.)

Ich habe für mich eine kleine Erweiterung in das Modul gemacht, um diesen Wert aus der API in ein Reading zu bringen. Vielleicht kann ich dem Autor ja diese Änderung zukommen lassen und er baut sie ein.

Gruß Axel

Karflyer

ZitatEs ist so, dass einerseits die einzelnen Devices bei tado den Status "away" bekommen. Jede Zone hat darüber hinaus in der API einen "tadoMode", den man auslesen kann. Dieser steht entweder auf HOME oder AWAY. Gesetzt wird AWAY erst wenn alle angemeldeten Geräte aus dem Haus sind. Also das ist das event, bei dem tado dann auch die Heizung in den Away Modus setzt. Und soweit ich das sehe, werden alle Zonen gleichzeitig gesetzt. (Voraussetzung ist natürlich, dass die "Geo-Steuerung" für die Zone aktiviert ist. Sonst wird das wohl nicht passieren.)

Ich habe für mich eine kleine Erweiterung in das Modul gemacht, um diesen Wert aus der API in ein Reading zu bringen. Vielleicht kann ich dem Autor ja diese Änderung zukommen lassen und er baut sie ein.

Gruß Axel

Für dieses neue Reading, hätte ich auch gleich eine Verwendung. Axel, schick doch bitte den Änderungvorschlag dem Matthias (Modulautor). Ich denke, dass er es in das offizielle Modul integrieren kann.

Gruß
Stefan

Karflyer

#164
@Matthias

Ich habe immer wieder Fehlermeldungen im Log gehabt. Bin selbst auf die Suche gegangen, was diese Fehler wirft. Hier nun die wahrscheinliche Erklärung und Lösung.
Ich bin kein Perl-Experte. Schau es dir bitte selbst noch einmal an bevor du es einbringst.

1.
ZitatPERL WARNING: Use of unintialized value in concatenation (.) or string at ./FHEM/98_Tado.pm line 1192.
Hier wird versucht 'measured-humidity' abzufragen. Es gibt von Tado ein 'Smartes Thermostat' dass mittels Extension-Kit die Therme (Warmwasser) direkt steuern kann. Das wird als separates Device dargestellt. Hier einmal ein Listing eines solchen Devices:
Internals:
   DEF        0 IODev=TadoBridge
   FUUID      5dcfd954-f33f-bb67-68f1-975354345d6f5ec2
   FVERSION   98_TadoDevice.pm:?/2019-12-11
   IODev      TadoBridge
   LASTInputDev TadoBridge
   MSGCNT     40
   NAME       htz_ww
   NR         706
   STATE      desired: off
   TYPE       TadoDevice
   TadoBridge_MSGCNT 40
   TadoBridge_TIME 2019-12-11 15:45:03
   TadoId     0
   TadoType   
   originalName Warmwasser
   OLDREADINGS:
   READINGS:
     2019-12-11 15:28:03   controlMode     automatic
     2019-12-11 15:05:26   date_created    2019-11-15T14:58:47.116Z
     2019-12-11 15:45:03   desired-temp    OFF
     2019-12-11 15:45:03   link            ONLINE
     2019-12-11 07:29:55   nextScheduleChange-power OFF
     2019-12-11 07:29:55   nextScheduleChange-start 2019-12-11T07:00:00Z
     2019-12-11 05:59:54   nextScheduleChange-temperature 55
     2019-12-11 15:45:03   open-window     null
     2019-12-11 15:45:03   overlay-active  0
     2019-12-11 15:45:03   state           desired: off
     2019-12-11 15:05:26   supports_dazzle 0
Attributes:
   DbLogExclude .*
   alias      Warmwasser
   cmdIcon    automatic:sani_heating_automatic
   event-on-change-reading .*
   room       Tado
   sortby     12
   stateFormat {if(ReadingsVal($name, "desired-temp", "") eq "OFF") {"desired: off"}
  else {"desired: ".ReadingsVal($name, "desired-temp", 0). "&deg;C"}}
   subType    zone
   userReadings controlMode:overlay-active.* {(ReadingsNum($name,"overlay-active",0) == 1) ? "manual":"automatic"}
   webCmd     automatic:temperature


Wie zu erkennen ist, gibt es in diesem Device kein 'measured-humidity'. Deshalb habe ich die entsprechenden Codezeilen so umgebaut:
my $measuredHumidity = $d->{sensorDataPoints}->{humidity}->{percentage};
$message.=      defined $measuredHumidity ? $measuredHumidity.";" : ";" ;
my $measuredHumidityTimestamp = $d->{sensorDataPoints}->{humidity}->{timestamp};
$message.=      defined $measuredHumidityTimestamp ? $measuredHumidityTimestamp.";" : ";" ;


2.
ZitatPERL WARNING: Use of unintialized value in concatenation (.) or string at ./FHEM/98_Tado.pm line 987.
Hier wird versucht den Standort für das 'mobil-device' zu ermitteln. Es scheint Situationen zu geben, bei denen Tado die entsprechenden Informationen nicht zurückgeben kann. Die Fehlermeldungen werden mit diesen Codezeilen vermieden:
my $locationStale = $item->{location}->{stale};
$message.=      defined $locationStale ? $locationStale.";" : ";" ;
my $locationAtHome = $item->{location}->{atHome};
$message.=      defined $locationAtHome ? $locationAtHome.";" : ";" ;
my $locationDegrees = $item->{location}->{bearingFromHome}->{degrees};
$message.=      defined $locationDegrees ? $locationDegrees.";" : ";" ;
my $locationRadians = $item->{location}->{bearingFromHome}->{radians};
$message.=      defined $locationRadians ? $locationRadians.";" : ";" ;
my $locationDistance = $item->{location}->{relativeDistanceFromHomeFence};
$message.=      defined $locationDistance ? $locationDistance.";" : ";" ;


3.
ZitatPERL WARNING: Redundant argument in sprintf at ./FHEM/98_TadoDevice.pm line 198.
Das wird wohl verursacht wenn der Status 'desired: off' ist. Der ganze Block sieht jetzt so aus:

if ($values[11] eq 'ONLINE'){
  if ($values[8] ne 'OFF') {
    if ($values[9] ne '') {
       readingsSingleUpdate($hash, 'state', sprintf("T: %.1f &deg;C desired: %.1f &deg;C H: %.1f%%", $values[3], $values[8], $values[9]), 1);
    } else {
       if ($values[3] ne '') {
          readingsSingleUpdate($hash, 'state', sprintf("T: %.1f &deg;C desired: %.1f &deg;C", $values[3], $values[8]), 1);
       } else {
          readingsSingleUpdate($hash, 'state', sprintf("desired: %.1f &deg;C", $values[8]), 1);
       }
     }
   } else {
      if ($values[9] ne '') {
        readingsSingleUpdate($hash, 'state', sprintf("T: %.1f &deg;C desired: off H: %.1f%%", $values[3],  $values[9]), 1);
      } else {
        if ($values[3] ne '') {
           readingsSingleUpdate($hash, 'state', sprintf("T: %.1f &deg;C desired: off", $values[3]), 1);
        } else {
           readingsSingleUpdate($hash, 'state', "desired: off", 1);
        }
      }
    }
  } else {
    readingsSingleUpdate($hash, 'state', "Device is in status '$values[11]'.", 1);
  }


Wäre schön, wenn du die Änderungen bei deinem nächsten Update berücksichtigen würdest.

Gruß
Stefan