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']);
}