Daikin Split Klimaanlage mit WiFi

Hi zusammen,

nachdem ich schon soviel hilfreiches aus dem Forum entnommen hab hier auch mal was zurück.
Mir ist bewusst dass das immer noch rumgefrickelt ist und am liebsten hätte ich das in ein Modul gegossen - dafür fehlt mir aber im Moment sowohl Wissen als auch Zeit. Vielleicht hilft es aber ja jemand anders genau das zu tun.

Zur Integration von Daikin Geräten gibt es schon einen sehr hiflfreichen Thread. Mir war das nur etwas zu manuell für mehrere Geräte und es hat zumindest für meine Daikin Geräte nicht alles korrekt funktioniert. Dazu wollte ich auch die Fehlercodes vernünftig aufgeschlüsselt haben und auch mehr Werte auslesen.

Hier mal meine angepasste Version:

Das ganze besteht aus zwei Scripten die dann einfach per Ereignis aufgerufen werden und sich die richtigen Variablen über die Variablennamen heraussuchen. Wenn jemand das übernehmen möchte: Beide Scripte (Daikin Get Data und Daiking Set Data) irgendwo hinpacken. Dann die Variablen und ein getData Script genauso wie im Screenshot anlegen und ein 5 min Ereignis dazupacken. Im Script wird nur das Daikin Get Data Script inkludiert (bei mir ID 14485):

<?php

include(IPS_GetScriptFile(14485));

Am Ende nur noch die Variable IP updaten auf die IP die das jeweilige Daikin Klimagerät hat. Für weitere Geräte einfach den kompletten Block duplizieren und wieder die IP anpassen.

Die Profile hab ich von oben genannten Thread übernommen.
Alle Variablen die Werte ändern sollen kriegen als Eigene Aktion das Daikin Set Data Script, hier als Beispiel für die Soll Feuchte:

Daikin Get Data

<?php

$aQueryTypes = array("common/basic_info",
                     "aircon/get_control_info",
                     "aircon/get_sensor_info",
                     //"aircon/get_week_power",
                     //"aircon/get_year_power"
                    );

if($_IPS['SENDER'] !== 'TimerEvent') return false;

// Fehlercodes Daikin
$aErrorCodeTranslation = array("0" => "Kein Fehler",
                               "10000" => "Konkurriende Modi (Kalt/Warm) angefordert",
                               "U0" => "Zu wenig Kältemittel",
                               "U2" => "Überspannung erkannt",
                               "U4" => "Fehler bei Signalübertragung Innen<->Außen",
                               "UA" => "Fehler bei Kombination Innen und Außengerät",
                               "A1" => "Fehler bei Platine der Inneneinheit",
                               "A5" => "Schutz gegen Einfrieren oder Hochdruck-Kontrolle",
                               "AH" => "Fehler bei Streamer-Einheit",
                               "C4" => "Fehler bei Wärmetauscher-Thermistor der Inneneinheit",
                               "C7" => "Fehler bei Öffnen oder Schließen der Frontblende",
                               "C9" => "Fehler bei Raumtemperatur-Thermistor",
                               "CC" => "Fehler bei Feuchtigkeitssensor",
                               "EA" => "Fehler bei 4-Wege-Ventil",
                               "E1" => "Fehler bei Platine der Außeneinheit",
                               "E5" => "Aktivierung des Überlastschutzes (Überlastung des Verdichters)",
                               "E6" => "Verdichter-Blockierung",
                               "E7" => "Blockierung des Gleichstrom-Ventilators",
                               "E8" => "Eingangsstrom-Überstrom",
                               "F3" => "Temperatursteuerung bei Abflussrohr",
                               "F6" => "Hochdruck-Kontrolle (bei Kühlen)",
                               "H0" => "Fehler bei Sensor des Verdichtersystems",
                               "H6" => "Fehler bei Positionssensor",
                               "H8" => "Fehler bei Sensor DC-Spannung / Stromstärke",
                               "H9" => "Fehler bei Außenlufttemperatur-Thermistor",
                               "J3" => "Fehler bei Thermistor des Abflussrohrs",
                               "J6" => "Fehler bei Wärmetauscher-Thermistor der Außeneinheit",
                               "L3" => "Fehler durch Überhitzung einer elektrischen Komponente",
                               "L4" => "Anstieg bei Radiatorlamellen-Temperatur",
                               "L5" => "Momentaner Überstrom bei Inverter (Gleichstrom)",
                               "P4" => "Fehler bei Radiatiorlamellen-Thermistor",
                               "F8" => "Fehler bei interner Temperatur des Verdichters",
                              );

// Fraegt die Klimaanlage ab
function queryAircon($sIP, $aTypes) {
    $context = stream_context_create(array(
        'http' => array(
            'timeout' => 2
            )
        )
    );


    foreach($aTypes as $sCurrent) {
        try {
            $result = @file_get_contents("http://$sIP/$sCurrent", 0, $context);

            if($result === false || substr($result, 4, 2) !== "OK") {
                IPS_LogMessage(IPS_GetName($_IPS['SELF'])." (".$_IPS['SELF'].")", "Fehler bei Abfrage von Klimaanlage $sIP:
$result");
                return false;
            }
        } catch (Exception $e) {
            IPS_LogMessage(IPS_GetName($_IPS['SELF'])." (".$_IPS['SELF'].")", "Fehler bei Abfrage von Klimaanlage $sIP:
".$e->getMessage());
            return false;
        }

        $sCurrent = substr($sCurrent, strpos($sCurrent, "/")+1);
        $aResult[$sCurrent] = sortReturnIntoArray($result);
    }

return $aResult;
}

// Packt die Daten der Klimaanlage sauber in ein Array
function sortReturnIntoArray($aData) {
    $aTmp1 = explode(",", $aData);

    foreach($aTmp1 as $aCurrent) {
        $aTmp2 = explode("=", $aCurrent);
        $aResult[$aTmp2[0]] = $aTmp2[1];
    }

return $aResult;
}

// Liefert Variablen ID zu einem Variablennamen, liefert direkt Wert wenn $bReturnValue = true
function tryFindVariableIDAndValue($sName, $bReturnValue = false) {
        $iId = @IPS_GetObjectIDByName($sName, IPS_GetParent($_IPS['TARGET']));

        if($iId === false) {
            IPS_LogMessage(IPS_GetName($_IPS['SELF'])." (".$_IPS['SELF'].")", "Keine Variable ".$sName." gefunden");
            return false;
        } elseif($bReturnValue) return GetValue($iId);
        else return $iId;
}

// Daten auslesen triggern
$sIP = tryFindVariableIDAndValue("IP", 1);
$aData = queryAircon($sIP, $aQueryTypes);
if($aData === false) return false;


// Daten zuweisen

// Firmware Version
$iIdFirmwareVer = tryFindVariableIDAndValue("Firmware Version");
SetValueString($iIdFirmwareVer, $aData["basic_info"]['ver']);

// MAC
$iIdMAC = tryFindVariableIDAndValue("MAC");
SetValue($iIdMAC, intval($aData["basic_info"]['mac']));

// Fehlercode
$iIdErrorCode = tryFindVariableIDAndValue("Fehlercode");
if(!array_key_exists($aData["basic_info"]['err'], $aErrorCodeTranslation)) SetValueString($iIdErrorCode, $aData["basic_info"]['err']);
else SetValueString($iIdErrorCode, $aErrorCodeTranslation[$aData["basic_info"]['err']]);

// Status: Geraet an oder aus
$iIdPower = tryFindVariableIDAndValue("Status");
SetValue($iIdPower, intval($aData["get_control_info"]['pow']));

// Modus: Auto, Entfeuchten, Umluft, Kühlen, Heizen
$iIdMode = tryFindVariableIDAndValue("Modus");
SetValue($iIdMode, intval($aData["get_control_info"]['mode']));

// Soll Temperatur
$iIdSTemp = tryFindVariableIDAndValue("Soll Temperatur");
if($aData["get_control_info"]['stemp'] != "--") SetValue($iIdSTemp, floatval($aData["get_control_info"]['stemp']));

// Ist Temperatur
$iIdHTemp = tryFindVariableIDAndValue("Ist Temperatur");
SetValue($iIdHTemp, floatval($aData["get_sensor_info"]['htemp']));

// Soll Feuchte
$iIdSHum = tryFindVariableIDAndValue("Soll Feuchte");
SetValue($iIdSHum, intval($aData["get_control_info"]['shum']));

// Ist Feuchte
$iIdHHum = tryFindVariableIDAndValue("Ist Feuchte");
SetValue($iIdHHum, floatval($aData["get_sensor_info"]['hhum']));

// Außen Temperatur
$iIdOTemp = tryFindVariableIDAndValue("Außen Temperatur");
SetValue($iIdOTemp, floatval($aData["get_sensor_info"]['otemp']));

// Kompressor Auslastung
$iIdCmpFreq = tryFindVariableIDAndValue("Kompressor Auslastung");
SetValue($iIdCmpFreq, floatval($aData["get_sensor_info"]['cmpfreq']));

// Lüfterstufe
$aTranslatefRate = array("A" => 1, "B" => 2, "3" => 3, "4" => 4, "5" => 5, "6" => 6, "7" => 7);
$iIdfRate = tryFindVariableIDAndValue("Lüfterstufe");
SetValue($iIdfRate, $aTranslatefRate[$aData["get_control_info"]['f_rate']]);

// Lüfterrichtung
$iIdfDir = tryFindVariableIDAndValue("Lüfterrichtung");
SetValue($iIdfDir, intval($aData["get_control_info"]['f_dir']));

// Streamer Status An oder Aus
$iIdStreamer = tryFindVariableIDAndValue("Streamer");
if($aData["get_control_info"]['adv'] == "13") SetValue($iIdStreamer, 1);
else SetValue($iIdStreamer, 0);

Daikin Set Data

<?php

if(empty($_IPS['VARIABLE'])) return false;

// Sucht Variablen ID nach Namen und gibt den richtigen aktuellen Wert zurück
function tryFindVariableIDAndValue($sName) {
    if($_IPS['SENDER'] == 'Variable' || $_IPS['SENDER'] == 'WebFront') {
        $iId = @IPS_GetObjectIDByName($sName, IPS_GetParent($_IPS['VARIABLE']));

        if($iId === false) {
            IPS_LogMessage(IPS_GetName($_IPS['SELF'])." (".$_IPS['SELF'].")", "Keine Variable ".$sName." gefunden");
            return false;
        } else {
            if($_IPS['VARIABLE'] === $iId) return $_IPS['VALUE'];
            else return GetValue($iId);
        }
    }
}

// Die richtigen aktuellen Werte zuweisen
$sIP = tryFindVariableIDAndValue("IP");
$bPower = tryFindVariableIDAndValue("Status");
$iMode = tryFindVariableIDAndValue("Modus");
$iFanspeed = tryFindVariableIDAndValue("Lüfterstufe");
$sFandir = tryFindVariableIDAndValue("Lüfterrichtung");
$fTtemp = tryFindVariableIDAndValue("Soll Temperatur");
$fThum = tryFindVariableIDAndValue("Soll Feuchte");

if($bPower) $bPower = '1';
else $bPower = '0';

$aTranslatefRate = array(1 => "A", 2 => "B", 3 => "3", 4 => "4", 5 => "5", 6 => "6", 7 => "7");
$iFanspeed = $aTranslatefRate[$iFanspeed];

$data = array('pow'     => strval($bPower),
              'mode'    => strval($iMode), 
              'stemp'   => strval(str_replace(",", ".", $fTtemp)),
              'shum'    => strval($fThum),
              'b_stemp' => strval(str_replace(",", ".", $fTtemp)),
              'b_shum'  => strval($fThum),
              'f_rate'  => strval($iFanspeed),
              'f_dir'   => strval($sFandir)
             ); 

$options = array( 
    'http' => array( 
        'header'  => "Content-type: application/x-www-form-urlencoded
", 
        'method'  => 'GET',
        'timeout' => 2,
        'content' => http_build_query($data) 
    ) 
); 
$content = http_build_query($data);
$context = stream_context_create($options); 
$result  = file_get_contents("http://$sIP/aircon/set_control_info?$content", false, $context); 
$data = explode(",", $result);

if($data[0] !== "ret=OK") {
    IPS_LogMessage(IPS_GetName($_IPS['SELF'])." (".$_IPS['SELF'].")", "Error with aircon $sIP: $result
Data sent $content");
} else {
    // IPS_LogMessage(IPS_GetName($_IPS['SELF'])." (".$_IPS['SELF'].")", "Successfully sent to aircon $sIP: $content");

    // Wert in Symcon updaten wenn Daten korrekt gesendet wurden
    SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
}

Hallo moedido,

vielen Dank. Klappt prima!
Viele Grüße…

1 „Gefällt mir“

Hi zusammen,

ich hab irgendwo gelesen, dass die neue Firmware der Daikin Geräte nicht mehr mit den alten APIs ist und nur noch via Cloud anzusprechen ist. Kann mir dazu jemand was sagen? Ich bin nämlich grade in der Findungsphase und wenn Daikin auch nur noch Cloud macht, dann kann ich auch Mitsubishi nehmen, da scheint wenigstens die App deutlich besser zu sein.

1 „Gefällt mir“

Hallo mws,
ich habe seit heute eine Daikin RXP25M mit der aktuellen Firmware 1.2.54 und mit der funktioniert es auf jeden Fall noch.
Danke für das Script! :smiley:

@moedido Danke für das Script! In Get Data ist imho der Abschnitt für die MAC-Adresse falsch. Die MAC ist ja kein int, dementsprechend habe ich die Zeile bei mir angepasst (einfach nur das intval entfernt) :smiley:

// MAC
$iIdMAC = tryFindVariableIDAndValue(„MAC“);
SetValue($iIdMAC, $aData[„basic_info“][‚mac‘]);

Na dann schauen wir mal, ob wir da ein Modul für auf die Beine gestellt bekommen.

So die beiden Geräte sind gesetzt und über die App kann ich sie auch steuern. Sie sind in der Fritzbox angemeldet aber auslesen via Symcon oder http im Browser geht nicht. Ich bekomme immer die Meldung:

Warning: file_get_contents(http://192.168.2.157/common/basic_info): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

Ich hab ein CTXM15R und ein FTXM25R verbaut Firmware 1_12_30.

Die Webseite selbst ist da, wenn ich nur die IP im Browser angebe kommt eine Seite die mit folgendem Text beginnt:

This software is included following open source software.

Hat jemand eine Idee?

bei meiner Emura funktioniert der Aufruf. Der Aufruf nur mit der IP bringt da auch nur den Text, wie bei dir, jedoch noch ein paar Zeilen mehr.
Hast du mal die anderen Aufrufe wie:

"/common/get_notify"
"/common/get_remote_method"
"/aircon/get_model_info"
"/aircon/get_control_info"
"/aircon/get_sensor_info"

probiert?
Kannst du die Klimaanlagen über die Daikin-App steuern?
Wenn ich eine unbekannte Seite aufrufen will, bekommen ich:

ret=PARAM NG,msg=404 Not Found

Gruß
Rainer

Moin,

ja ich kann sie über die neue App steuern und der Aufruf egal welcher Seite über den Browser bringt immer eine 404:

Page Not Found
/aircon/get_sensor_info

Ich befürchte langsam, dass ich schon den neuen Controller verbaut habe, der nicht mehr lokal abgefragt werden kann. Das wäre echt blöd weil das einer der Gründe war mich für Daikin zu entscheiden, die ja nicht wirklich günstig sind.

Ich habe auch gelesen, dass es da wohl externe Geräte gibt die man in einen Port (S21) sofern vorhanden stecken kann, die das wohl dann können, angeblich kann man die sogar parallal betreiben aber da muss ich mich noch mehr einlesen und schauen, dass ich das richtige bekomme.

Hi,

es gibt noch Module die modbus können. Waren aber echt teuer.

7ja hab ich gefunden aber 300 Euro pro Innen Gerät und wieder Kabel ziehen ist schon e Hausnummer. Ich glaube dazu bin ich nicht bereit.
Ich versuche mal raus zu bekommen, ob ein anderer WLAN Controller funktioniert oder und das kotzt mich eigentlich an weil ich bei sowas die Cloud hasse, ob man an eine API für die Cloud kommt.
Vielleicht hat da ja jemand was im Petto.

Du könntest mal mit wireshark versuchen einen request gesendet von der App aufzuzeichnen. ggf hilft das weiter…

edit
vielleicht hilft das… GitHub - Apollon77/daikin-controller: Control Daikin Air Conditioner devices using nodejs
da stehen deine beide Geräte gelistet

welche Daikin-App verwendest du? Online Controller oder Residential Controller?
Bei letzterem steht in der Beschreibung, zur Bedienung ist eine Internetverbindung nötig. Das würde dann wohl auf Cloud hindeuten.
Hast du einen Daikin-ID anlegen müssen?

Den Github Link werde ich mir mal ansehen.

Ich hab den neuen Online Controller und ich musste ein Konto anlegen. Entscheidend ist aber, dass die Unnengerät bei jeder Seite die hier beschrieben wurde den 404 Fehler ausgibt.

Bei mir funktioniert das Script auf einmal nicht mehr. Ich erhalte nur noch die Fehlermeldung „Keine Variable IP gefunden“.
Das Script GetData liegt in der gleichen Kategorie wie die Variablen, inkl. der Variable „IP“.
Hat jemand eine Idee? Reboot ist schon erledigt :slight_smile: