Wandthermostate trd-Fehler

Ich nutze seit vielen Jahren HomeMatic Wandthermostate, weil sie eigentlich recht unauffällig ihren Dienst verrichten. Zuletzt haben sich allerdings in zwei Räumen die Thermostate mit der Fehlermeldung „trd“ im Display verabschiedet. Dies bedeutet laut Anleitung, dass das Transceivermodul einen Defekt hat.

Das tückische ist, dass dieser Fehler innerhalb der HomeMatic-Datenstruktur nicht ohne weiteres auffällt. Das Thermostat ist weiterhin ansprechbar und wird nicht als UNREACH oder sonstwie fehlherhaft angezeigt. Es regelt auch weiterhin „irgendwie“ die Heizkörper, geht allerdings nicht mehr auf Änderungen der Solltemperatur oder des Modus seitens Symcon ein. Die Funkbefehle schlagen aber auch nicht fehl.

Ich habe durch Tests mit zwei betroffenen Thermostaten herausgefunden, dass man konkret prüfen muss, ob nach dem Senden bspw einer Solltemperatur diese auch tatsächlich vom Thermostat übernommen wird. Hierzu läuft bei mir nun nächtens ein Skript, welches für jede THERMALCONTROL_TRANSMIT-Instanz einmal folgende Funktion aufruft:

function perform_trd_check($inst_id) {
    global $report;
    $cat_id = IPS_GetParent($inst_id);
    $thermos_name = IPS_GetName($cat_id);
    $value_id = @IPS_GetObjectIDByIdent("SET_TEMPERATURE", $inst_id);
    if($value_id === false) {
        $report .= "Instance not found: " . $inst_id . "\n";
        return true;
    }
    $value = GetValue($value_id);
    $value_changed = $value - 0.5;

    $success = false;
    $completed = false;
    $report .= "trd-Test für " . $thermos_name . "\n";
    $cfg = json_decode(IPS_GetConfiguration($inst_id), true);
    if($cfg["EmulateStatus"]) {
        $report .= "Status emulation is active for this thermostat, turning it off...";
        IPS_SetProperty($inst_id, "EmulateStatus", false);
        IPS_ApplyChanges($inst_id);
        $report .= "success!\n";
    }
    $report .= "Step 1/2: Value change...";
    if(@HM_WriteValueFloat($inst_id, "SET_TEMPERATURE", $value_changed)) {
        IPS_Sleep(500);
        $report .= "sent successfully, checking for change...";
        if(GetValue($value_id) == $value_changed) {
            $success = true;
            $report .= "success!\n";
            $report .= "Step 2/2: Change back to original...";
            if(@HM_WriteValueFloat($inst_id, "SET_TEMPERATURE", $value)) {
                IPS_Sleep(500);
                $report .= "sent successfully, checking for change...";
                if(GetValue($value_id) == $value) {
                    $report .= "success!\n";
                    $report .= "Test completed successfully. Thermostat is behaving correctly.\n";
                    $completed = true;
                } else {
                    $report .= "failed - value did not change back\n";
                    $report .= "Test not completed.\n";
                }
            } else {
                $report .= "failed - communication error\n";
                $report .= "Test not completed.\n";
            }
        } else {
            $report .= "failed - value did not change\n";
            $report .= "Test completed with negative result. Thermostat is not behaving correctly.\n";
            $completed = true;
        }
    } else {
        $report .= "failed - communication error\n";
        $report .= "Test not completed.\n";
    }

    $maint_inst_id = IPS_GetInstanceIDByName("MAINTENANCE", $cat_id);
    $trd_err_id = @IPS_GetObjectIDByIdent("TRD_ERROR", $maint_inst_id);
    if($trd_err_id === false) {
        $trd_err_id = IPS_CreateVariable(0);
        IPS_SetParent($trd_err_id, $maint_inst_id);
        IPS_SetName($trd_err_id, "TRD_ERROR");
        IPS_SetIdent($trd_err_id, "TRD_ERROR");
        IPS_RunScript(11714);
    }
    $trd_err = GetValue($trd_err_id);

    $result = false;
    if($completed && !$success && !$trd_err) {
        SetValue($trd_err_id, true);
        $result = true;
    } else if($success && $trd_err) {
        SetValue($trd_err_id, false);
        $result = true;
    }
    return $result;
}

Die Funktion geht davon aus, dass die Instanzen eines Thermostat originalgetreu mit THERMALCONTROL_TRANSMIT sowie MAINTENANCE benannt in einer Kategorie jeweils pro Gerät liegen. Sie gibt true zurück, falls sich der Status des geprüften Thermostats geändert hat und legt unterhalb der MAINTENANCE-Instanz eine Boolean-Variable namens TRD_ERROR an. Diese ist true, falls für den Thermostat der Fehler festgestellt wurde.

Vielleicht setzt ja noch jemand diese Thermostate ein, sie sind jedenfalls eigentlich sehr zuverlässig, aber falls so ein Fehler noch einmal bei mir vorkommt, möchte ich es in Zukunft gerne sofort erfahren, bevor mir das Ding den ganzen Urlaub lang durch heizt ohne dass ich es bemerke :wink: