Autor Thema: [GELÖST] Daikin Klimaanlage  (Gelesen 5704 mal)

Offline rubinho

  • Jr. Member
  • **
  • Beiträge: 74
Antw:[GELÖST] Daikin Klimaanlage
« Antwort #15 am: 28 Mai 2019, 08:33:23 »
Servus Leute,

nachdem ich meine Daikin am Wochenende zum ersten Mal für dieses Jahr wieder in Betrieb nahm, funktionierte die Steuerung auch nicht mehr!

Im vorigen Jahr lief noch alles Problemlos.

Um herauszufinden was das Problem ist, musste ich einen Tcpdump machen.

Folgendes habe ich dabei gerausgefunden...

Wenn man unter Fhem die Klimaanlage einschalten will, geht das ja über den Power Befehl.
Dieser ist in den Attributen folgendermaßen definiert...

set01Data pow=$val&mode={{mode}}&stemp={{stemp}}&shum=0&f_rate={{f_rate}}&f_dir={{f_dir}}
Mittels Tcpdump konnte ich nun herausfinden, dass die Variablen {{mode}}, {{stemp}}, {{f_rate}} und {{f_dir}} nicht ausgewertet werden und genau wie sie hier stehen übermittelt werden.
Damit kann die Rest-Api von Daikin aber nichts anfangen und verwirft den Befehl.

Ich vermute irgendein Update in den Letzten Monaten hat die Syntax bei HTTPmod geändert.

Als Workaround kann man feste Werte eintragen, dann geht die Anlage wenigstens an, wenn auch immer mit der gleichen Einstellung.

Um das Problem dauerhaft zu lösen, müsste ein HTTPMod Spezi mal draufschauen und die Syntax anpassen.

Gruß
Rubinho
Fhem 5.9@Zotac Zbox Ci327 | HMCCU | Z-Wave@ZMEEUZB1 | HUE Bridge Gen2 | knxd over IP

Offline roelb

  • Newbie
  • Beiträge: 1
Antw:[GELÖST] Daikin Klimaanlage
« Antwort #16 am: 28 Mai 2019, 18:31:22 »
There are two issues, not just the one you are mentioning.

Issue 1: the use of double curly braces ({{varname}})  breaks because unescaped usage of a left curly brace in a perl regex has been deprecated since 5.22 and support has been discontinued as of 5.26. This is easily fixed by either escaping the left braces or by using a different marker:

attr <name> replacement01Regex #([^#]+)#
attr <name> set01Data pow=$val&mode=#mode#&stemp=#stemp#&shum=0&f_rate=#f_rate#&f_dir=#f_dir#


or

attr <name> replacement01Regex \{\{([^}]+)}}
attr <name> set01Data pow=$val&mode={{mode}}&stemp={{stemp}}&shum=0&f_rate={{f_rate}}&f_dir={{f_dir}}



See: https://metacpan.org/pod/release/RJBS/perl-5.22.0/pod/perldelta.pod#A-literal-%22{%22-should-now-be-escaped-in-a-pattern

Issue 2:

HTTPMOD does a POST request, sending the parameters as application/x-www-form-urlencoded. My Daikin does not accept that, it will only respond correctly to a HTTP GET request. A transcript:

POST /aircon/set_control_info?HTTP/1.0
Host: 10.0.1.105
User-Agent: fhem
Accept-Encoding: gzip,deflate
Content-Length: 47
Content-Type: application/x-www-form-urlencoded

pow=0&mode=3&stemp=18.0&shum=0&f_rate=B&f_dir=3

-- response

HTTP/1.0 200 OK
Content-Length: 12
Content-Type: text/plain

ret=PARAM NG


Looking in the code, this is caused by logic in the FHEM/HttpUtils.pm library. On lines 536 and 537:

my $method = $hash->{method};
 $method = ($data ? "POST" : "GET") if( !$method );


But even changing this default won't matter, as everything passed in $data will only get sent in a POST request, never in a get (see lines 559-563). The optimal solution would be to modify HttpUtils.pm to automatically add the data supplied in $data as URL encoded GET parameters if the request type is GET, and modify HTTPMOD, adding a parameter to specify wether POST or GET should be used.

But there is a simpler solution. Looking through the code for HTTPMOD, we can use a seperate URL for each setXX action, instead of using the generic setURL attribute in combination with setXXData attributes. Instead, we simply specify setXXURL for each action and forget the setXXData. So, instead of using:


attr <name> set01Data pow=$val&mode=#mode#&stemp=#stemp#&shum=0&f_rate=#f_rate#&f_dir=#f_dir#
attr <name> setURL http://<IP>/aircon/set_control_info?


We need to use:



deleteattr <name> setURL
deleteattr <name> set01Data
attr <name> set01URL http://<IP>/aircon/set_control_info?pow=$val&mode=#mode#&stemp=#stemp#&shum=0&f_rate=#f_rate#&f_dir=#f_dir#


Finally, looking through the (pretty messy) code, I did find a bug in HttpUtils, which will always send the Content-Length and Content-Type: application/x-www-form-urlencoded headers, even if there is no data. A check is done if $data is defined, but not if it actually contains data (an empty string is also a defined variable in Perl)

line 559 of HttpUtils.pm is:


if(defined($data)) {


changing this to:


if(defined($data) && length($data)) {


will solve this issue and yield correct behaviour when $data is defined, but empty.
« Letzte Änderung: 28 Mai 2019, 18:32:58 von roelb »
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Taslow

  • New Member
  • *
  • Beiträge: 4
Antw:[GELÖST] Daikin Klimaanlage
« Antwort #17 am: 09 Juni 2019, 08:26:07 »
Wenn ich das richtig nachvollzogen habe, wurden die Anregungen von roelb sowohl in der Beispielkonfiguration als auch in der HttpUtils.pm aufgenommen.

Irgendwie klappt es aber bei mir dennoch nicht. Werte der Klima werden erhoben und angezeigt, einschalten lässt sie sich aber nach wie vor nicht  :-\

Offline hugomckinley

  • Jr. Member
  • **
  • Beiträge: 95
Antw:[GELÖST] Daikin Klimaanlage
« Antwort #18 am: 11 Juli 2019, 23:18:53 »
Ich habe bereits herausgefunden, dass es anscheinend daran liegt, dass die B-Typen (BRP069B41) anders angesteuert werden müssen als die A-Typen(BRP069A41)
siehe: https://github.com/Apollon77/daikin-controller/issues/7

Lösung habe ich noch keine.

Gruß Hugo

Nachtrag: Lösung fast fertig. Folgt in den nächsten Tagen als Script welches die AC automatisch anlegt.
« Letzte Änderung: 13 Juli 2019, 01:13:10 von hugomckinley »
----------------------------------------------------
OW-SERVER-ENET-2
div. 1-wire Sensoren
HMLAN + HM-Komponenten
Gefällt mir Gefällt mir x 1 Liste anzeigen

 

decade-submarginal