Wohnraumlüftung mit freeair-connect mittels HTTPMOD / EDIT: jetzt auch Modul

Begonnen von amenomade, 17 Mai 2020, 20:22:59

Vorheriges Thema - Nächstes Thema

amenomade

(Die HTTPMOD Version enthält nicht alle Readings, hat keine set Funktionen und wird nicht mehr aktualisiert. Nimm lieber das Modul (weiter unten in diesem Post))

In myUtils ganz oben nach package main;:
use MIME::Base64;
use Crypt::CBC;
use Crypt::Rijndael;
use URI::Escape;

Wenn nötig (er meckert ggf sofort beim Speichern), die Packete installieren
Crypt::CBC => sudo apt install libcrypt-cbc-perl
Crypt::Rijndael => sudo apt install libcrypt-rijndael-perl

Dann vor dem "1;" am Ende:
sub
toSigned
{
   my ($num, $potenz) = @_;
   my $maxUn=2**$potenz;
   if($num >= ($maxUn / 2)){$num = $num - $maxUn}
   return $num;
}


sub
extractReading
{

   my ($device, $rawReading) = @_;
   my $raw = ReadingsVal("$device", "$rawReading",'0'x48);
   
   $raw = uri_unescape($raw);
   $raw = decode_base64($raw);

   my $iv = pack "H*", "000102030405060708090a0b0c0d0e0f";
   my $key = 'KKKKKKKK';
   $key .= '0'x(16 - length $key);
   my $cipher = Crypt::CBC->new(
      -key => $key,
      -literal_key => 1,
      -iv => $iv,
      -keysize => 16,
      -cipher => 'Rijndael',
      -header => 'none');

   my $plaintext  = $cipher->decrypt($raw);
   my @result = unpack("C*", $plaintext);
#   Log3 "myUtils", 1, "stringToBytes = @result";
   fhem("setreading $device HumOutdoor ".$result[0]);
   fhem("setreading $device HumExtract ".$result[1]);

   my $TempExhaust = toSigned(
      eval("0b"
         .substr(sprintf ('%08b', $result[31]), 4, 4)
         .sprintf ('%07b', $result[4])),
         11) /8;
   fhem("setreading $device TempExhaust ".$TempExhaust);

   my $TempSupply = toSigned(
      eval("0b"
         .substr(sprintf ('%08b', $result[29]), 4, 4)
         .sprintf ('%07b', $result[2])),
         11) /8;
   fhem("setreading $device TempSupply ".$TempSupply);

   my $TempOutdoor = toSigned(
      eval("0b"
         .substr(sprintf ('%08b', $result[32]), 4, 4)
         .sprintf ('%07b', $result[3])),
         11) /8;
   fhem("setreading $device TempOutdoor ".$TempOutdoor);

   my $TempExtract = toSigned(
      eval("0b"
         .substr(sprintf ('%08b', $result[30]), 4, 4)
         .sprintf ('%07b', $result[5])),
         11) /8;
   fhem("setreading $device TempExtract ".$TempExtract);

   my $TempVirtSupExit = toSigned(
      eval("0b"
         .substr(sprintf ('%08b', $result[33]), 4, 4)
         .sprintf ('%07b', $result[6])),
         11) /8;
   fhem("setreading $device TempVirtSupExit ".$TempVirtSupExit);

   my $CO2 =
      eval("0b"
         .substr(sprintf ('%08b', $result[36]), 2, 1)
         .sprintf ('%07b', $result[13])) *16;
   fhem("setreading $device CO2 ".$CO2);

   my $Pressure =
      eval("0b"
         .substr(sprintf ('%08b', $result[39]), 3, 5)
         .substr(sprintf ('%07b', $result[34]), 4, 4)) +700;
   fhem("setreading $device Pressure ".$Pressure);

   my $ComfortLevel =
      eval("0b".substr(sprintf ('%08b', $result[29]), 1, 3)) +1;
   fhem("setreading $device ComfortLevel ".$ComfortLevel);

   my $State =
      eval("0b".substr(sprintf ('%08b', $result[30]), 1, 3));
   fhem("setreading $device State ".$State);

   my %StateText = (
      "0" => "Comfort",
      "1" => "Comfort",
      "2" => "Sleep",
      "3" => "Turbo",
      "4" => "Turbo Cool",
      "5" => "Service",
      "6" => "Test",
      "7" => "Manufacturer",
   );
   fhem("setreading $device StateText ".$StateText{$State});
   

   my $HumRedMode =
      eval("0b".substr(sprintf ('%08b', $result[37]), 2, 1));
   fhem("setreading $device HumRedMode ".$HumRedMode);

   my $FanLim2ndRoom =
      eval("0b".substr(sprintf ('%08b', $result[35]), 1, 1));
   fhem("setreading $device FanLim2ndRoom ".$FanLim2ndRoom);

   my $b2ndRoomOnly20 =
      eval("0b".substr(sprintf ('%08b', $result[35]), 2, 1));
   fhem("setreading $device b2ndRoomOnly20 ".$b2ndRoomOnly20);

   my $SumCooling =
      eval("0b".substr(sprintf ('%08b', $result[37]), 1, 1));
   fhem("setreading $device SumCooling ".$SumCooling );

   my $ErrorState =
      eval("0b".substr(sprintf ('%08b', $result[24]), 3, 5));
   fhem("setreading $device ErrorState ".$ErrorState );

   my $FanSpeed =
      eval("0b".substr(sprintf ('%08b', $result[38]), 4, 4));
   fhem("setreading $device FanSpeed ".$FanSpeed );

   my $FanSupplyRPM =
      eval("0b"
         .substr(sprintf ('%08b', $result[37]), 3, 5)
         .sprintf ('%07b', $result[9]));
   fhem("setreading $device FanSupplyRPM ".$FanSupplyRPM );

   my $FanExtractRPM =
      eval("0b"
         .substr(sprintf ('%08b', $result[36]), 3, 5)
         .sprintf ('%07b', $result[7]));
   fhem("setreading $device FanExtractRPM ".$FanExtractRPM );

   my $AirFlowAve =
      eval("0b".substr(sprintf ('%08b', $result[35]), 3, 5));
   my $AirFlow;
   if ($FanSpeed > 2) {
      $AirFlow = $FanSpeed*10;
   } else {
      $AirFlow = $AirFlowAve;
   }
   fhem("setreading $device AirFlowAve ".$AirFlowAve );
   fhem("setreading $device AirFlow ".$AirFlow );

   my $FilterSupplyFul =
      eval("0b".substr(sprintf ('%08b', $result[34]), 2, 1));
   fhem("setreading $device FilterSupplyFul ".$FilterSupplyFul );

   my $FilterExtractFul =
      eval("0b".substr(sprintf ('%08b', $result[34]), 1, 1));
   fhem("setreading $device FilterExtractFul ".$FilterExtractFul );

   my $VentPosExtract =
      eval("0b".substr(sprintf ('%08b', $result[26]), 3, 5));
   fhem("setreading $device VentPosExtract ".$VentPosExtract );

   my $VentPosBath =
      eval("0b".substr(sprintf ('%08b', $result[27]), 3, 5));
   fhem("setreading $device VentPosBath ".$VentPosBath );

   my $VentPosSupply =
      eval("0b".substr(sprintf ('%08b', $result[25]), 3, 5));
   fhem("setreading $device VentPosSupply ".$VentPosSupply );

   my $VentPosBypass =
      eval("0b".substr(sprintf ('%08b', $result[28]), 3, 5));
   fhem("setreading $device VentPosBypass ".$VentPosBypass );

   my $ControlAuto =
      eval("0b".substr(sprintf ('%08b', $result[31]), 1, 3));
   fhem("setreading $device ControlAuto ".$ControlAuto );
   
   my %ControlAutoText = (
      "0" => "Minimum Ventilation",
      "1" => "Humidity Reduction(rel)",
      "2" => "Humidity Reduction(abs)",
      "3" => "Active Cooling",
      "4" => "CO2 Reduction",
      "5" => "Water Insertion",
      "6" => "Outdoor Temp < -22",
      "7" => "Humidity Input",
   );
   fhem("setreading $device ControlAutoText ".$ControlAutoText{$ControlAuto} );

   my $CtrlSetSupVent =
      eval("0b".substr(sprintf ('%08b', $result[25]), 1, 2));
   fhem("setreading $device CtrlSetSupVent ".$CtrlSetSupVent );

   my $CtrlSetExtVent =
      eval("0b".substr(sprintf ('%08b', $result[26]), 1, 2));
   fhem("setreading $device CtrlSetExtVent ".$CtrlSetExtVent );

   my $CtrlSet2ndVent =
      eval("0b".substr(sprintf ('%08b', $result[27]), 1, 2));
   fhem("setreading $device CtrlSet2ndVent ".$CtrlSet2ndVent );

   my $CtrlSetBypVent =
      eval("0b".substr(sprintf ('%08b', $result[27]), 1, 2));
   fhem("setreading $device CtrlSetBypVent ".$CtrlSetBypVent );

   my $ErrorCode =
      eval("0b"
         .substr(sprintf ('%08b', $result[40]), 1, 1)
         .sprintf ('%07b', $result[12]));
   fhem("setreading $device ErrorCode ".$ErrorCode );

   my $FilterHours =
      eval("0b"
         .substr(sprintf ('%08b', $result[40]), 2, 2)
         .sprintf ('%07b', $result[17])
         .sprintf ('%07b', $result[16]));
   fhem("setreading $device FilterHours ".$FilterHours);

   my $OperatingHours =
      eval("0b"
         .substr(sprintf ('%08b', $result[40]), 4, 4)
         .sprintf ('%07b', $result[15])
         .sprintf ('%07b', $result[14]));
   fhem("setreading $device OperatingHours ".$OperatingHours);

   my @ahPlusG10m3 = (49, 52, 56, 60, 64, 69, 73, 78, 84, 89, 95, 102, 108, 115, 123, 131, 139, 148, 157, 167, 177, 188, 199, 212, 224, 238, 252, 267, 283, 299, 317, 335, 354, 375, 396, 419, 442, 467, 494, 521, 550, 581, 613, 647, 683, 721, 760, 802, 846, 893, 942);
   my @ahMinusG10m3 = (49, 45, 42, 39, 37, 34, 32, 29, 27, 25, 23, 21, 20, 18, 17, 15, 14, 13, 12, 11, 10);
   my $AbsHumOutdoor;
   my $HumOutdoor = $result[0];
   if ($TempOutdoor > 0) {
      if ($TempOutdoor > 50) {
         $AbsHumOutdoor = 1000 / 10 * $HumOutdoor / 100;
      }
      else {
         $AbsHumOutdoor = $ahPlusG10m3[$TempOutdoor] / 10 * $HumOutdoor / 100;
      }
   } else {
      if (abs($TempOutdoor) > 20) {
         $AbsHumOutdoor = 5 / 10 * $HumOutdoor / 100;
      } else {
         $AbsHumOutdoor = $ahMinusG10m3[abs($TempOutdoor)] / 10 * $HumOutdoor / 100;
        }
   }
   $AbsHumOutdoor = sprintf ("%.1f", $AbsHumOutdoor);
   fhem("setreading $device AbsHumOutdoor ".$AbsHumOutdoor);

   my $AbsHumExtract;
   my $HumExtract = $result[1];
   if ($TempExtract > 0) {
      if ($TempExtract > 50) {
         $AbsHumExtract = 1000 / 10 * $HumExtract / 100;
      }
      else {
         $AbsHumExtract = $ahPlusG10m3[$TempExtract] / 10 * $HumExtract / 100;
      }
   } else {
      if (abs($TempExtract) > 20) {
         $AbsHumExtract = 5 / 10 * $HumExtract / 100;
      } else {
         $AbsHumExtract = $ahMinusG10m3[abs($TempExtract)] / 10 * $HumExtract / 100;
      }
   }
   $AbsHumExtract = sprintf ("%.1f", $AbsHumExtract);
   fhem("setreading $device AbsHumExtract ".$AbsHumExtract);

   my $Deicing =
      eval("0b".substr(sprintf ('%08b', $result[23]), 1, 1));
   fhem("setreading $device Deicing ".$Deicing );
   
   my $FSC =
      eval("0b"
         .substr(sprintf ('%08b', $result[38]), 3, 1)
         .sprintf ('%07b', $result[18]));
   fhem("setreading $device FSC ".$FSC );

   my $FEC =
      eval("0b"
         .substr(sprintf ('%08b', $result[38]), 2, 1)
         .sprintf ('%07b', $result[19]));
   fhem("setreading $device FEC ".$FEC );

   my $CSU =
      eval("0b"
         .substr(sprintf ('%08b', $result[38]), 1, 1)
         .sprintf ('%07b', $result[20]));
   fhem("setreading $device CSU ".$CSU );

   my $CFA =
      eval("0b"
         .substr(sprintf ('%08b', $result[34]), 3, 1)
         .sprintf ('%07b', $result[21]));
   fhem("setreading $device CFA ".$CFA );
   
   my $RSSI = toSigned(
      eval("0b".sprintf ('%08b', $result[47])), 8);
   fhem("setreading $device RSSI ".$RSSI );
   
   my $HeatRecovery;
   if ($AirFlow == 0 or abs($TempExtract - $TempOutdoor) < 2) {
      $HeatRecovery = 100;
   } else {
      $HeatRecovery = sprintf ("%.1f",
         100 * (1 - ($TempExtract - $TempSupply ) /($TempExtract - $TempOutdoor))+0.5);   
   }
   fhem("setreading $device HeatRecovery ".$HeatRecovery );

   my $EnergySaving;
   if (abs($TempExtract - $TempOutdoor) < 2) {
      $EnergySaving = 0;
   } else {
      $EnergySaving = sprintf ("%.1f",
         $AirFlow * ($TempSupply - $TempOutdoor) / 3 + 0.5 );   
   }
   fhem("setreading $device EnergySaving ".$EnergySaving );

   fhem("setreading $device S1 ".$result[41] );
   fhem("setreading $device S2 ".$result[42] );
   fhem("setreading $device S3 ".$result[43] );
   fhem("setreading $device S4 ".$result[44] );
   fhem("setreading $device S5 ".$result[45] );
   fhem("setreading $device S6 ".$result[46] );
   
   my $TrafficLightHumidity;
   if ($HumExtract < 10 or $HumExtract > 85) {
      $TrafficLightHumidity = 4;
   } elsif ($HumExtract < 20 or $HumExtract > 70) {
      $TrafficLightHumidity = 3;
   } elsif ($HumExtract < 20 or $HumExtract > 70) {
      $TrafficLightHumidity = 2;
   } else {
      $TrafficLightHumidity = 1;
   }
   fhem("setreading $device TrafficLightHumidity ".$TrafficLightHumidity );

   my $TrafficLightCO2;
   if ($CO2 < 1000) {
      $TrafficLightCO2 = 1;
   } elsif ($CO2 < 1700) {
      $TrafficLightCO2 = 2;
   } elsif ($CO2 < 2500) {
      $TrafficLightCO2 = 3;
   } else {
      $TrafficLightCO2 = 4;
   }
   fhem("setreading $device TrafficLightCO2 ".$TrafficLightCO2 );


   return @result;
}


In dem Code musst Du KKKKKKKK durch deine Key ersetzen.

Dann das HTTPMOD:
defmod freeair100 HTTPMOD https://www.freeair-connect.de/getDataHexAjax.php 0
attr freeair100 userattr reading01Name reading01Regex requestData01
attr freeair100 reading01Name rawData
attr freeair100 reading01Regex (.{50,70})timestamp
attr freeair100 requestData01 serObject=serialnumber%3DSSSSS
attr freeair100 stateFormat StateText ComfortLevel / ControlAutoText


Hier SSSSS durch deine Seriennummer ersetzen (das %3D davorne muss bleiben).

Und ein notify dazu:
defmod nt_freeair100 notify freeair100:rawData.* { extractReading("freeair100","rawData") }


Mit "set freeair100 reread" kriegst Du nw die Readings

Ggf. kannst Du danach in der DEF des HTTPMODS das Interval ändern (zu Testzwecken, mache ich immer 0, und mache manuell die rereads)


EDIT 2020-05-20 :           jetzt auch als Modul. Siehe Anhang. Doku weiter im Thread oder "help freeairconnect" in Fhem.
                                      Ich werde den HTTPMOD nicht mehr aktualisieren.
EDIT 2020-05-21-00:00 : Korrektur Bug mit der Key bei Rename
                                      New get storedKey Funktion
EDIT 2020-05-21-12:00 : Korrektur Bugs
                                      Set OperationMode reread nach 120 Sek
EDIT 2020-05-21-19:00 : fixed runden Problem in Kalkulation von AbsHum
EDIT 2020-05-21-20:00 : 2 letzte Ampeln TrafficLightFilterSupply und TrafficLightFilterExtract hinzugefügt
EDIT 2020-05-23-12:00 : Revamping Parse Funktion (nach Logik von der Webseite für einfachere Maintenance)
                                      Reduzierung der Komplexität der Funktion (39 > 27)
                                      Some Readings added
                                      Implementierung des http -Aufrufs von ErrorText im Fall ErrorState nicht leer
                                      Anpassung Log Levels
EDIT 2020-05-23-20:40 : Korrektur Bugs
                                      Rename einiger Funktionen (Modulspezifisch)
                                      Änderung der Set Funktion: ComfortLevel und OperationMode springen nicht mehr sofort zurück auf alten Wert
                                           sondern werden erst beim nächsten Reread (nach 90s) wieder aus der WebSeite gelesen
EDIT 2020-09-01-00:28 :  Korrektur Bug bei KEYPASSWORD
                                      Wahrscheinlichkeitsprüfung vor Aktualisierung der Readings
EDIT 2021-01-10-01:30 : Korrektur Bugs (zu viele Requests und "Error Post ComfortLevel") + Log verbose 5 reduzieren
EDIT 2021-06-27-21:09  : Probability check entfernt
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#1
1. Post geändert:
- stringToBytes nicht mehr nötig (eleganter, Dank Sidey)
- toSigned optimiert
- Readings HeatRecovery, EnergySaving, ControlAuto, ControlAutoText, StateText hinzugefügt
- extractReading nimmt 2 Parameter: Freeair Device, und rawData Reading => Code und notify geändert
- stateFormat im HTTPMOD
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

eldi0s

Boom da ist das Ding ;-)

Mega Sache und läuft perfekt.

Fettes DANKE

Ich werde dir von meinem Gerät im UG die Logindaten
zukommen lassen. Da ist eh noch Baustelle und du
kannst testen bis zum Umfallen. Auch nach Mitternacht ;-)

Grüße,

amenomade

#3
1. Post geändert:
- Korrektur in AbsHumExtract und AbsHumOutdoor (da hat die hälfte der Funktion gefehlt, für negative Temperaturen...).
- 2 erste TrafficLights hinzugefügt
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#4
Hab weiter gespielt, und jetzt alles in einem Modul gepackt. Ich wollte schon lange mein erstes Modul entwickeln, und jetzt war die Gelegenheit da, auf einem konkreten aber nicht zu komplizierten Beispiel zu üben.
Siehe Anhang im ersten Post.

Zitatfreeairconnect

    This module reads and controls bluMartin freeair-connect airflow systems
    It requires the Perl modules Crypt::CBC and Crypt::Rijndael to be installed. On debian, sudo apt install libcrypt-cbc-perl and libcrypt-rijndael-perl

    Define
        define <name> freeairconnect <Serialnumber>
        Example: define freeair100 freeairconnect 123456
         
       

  • Serialnumber
        Only the serialnumber used to access the website freeair-connect.de (without the label/name after it)


    Get
       

  • data
        Manually trigger data update

       

  • storedKey
        Get stored cipher key from passwords file

    Set
       

  • key
        Key/password used to decrypt the data as in the webinterface. This is the first thing to do after the definition of the device
        It will be offuscated and stored in the password file of Fhem

       

  • interval
        Set the refresh interval in seconds for the data (default 60). Minimum 60 not to overload the freeair-connect servers.

       

  • OperationMode
        Set the operation mode of the device (Comfort, Sleep, Turbo...)

       

  • ComfortLevel
        Set the comfort level of the device (0 to 5)


    Readings
       

  • lastRawData
        Last raw main chunk data before decoding the readings

       

  • lastDataTimeStamp
        Last value of actualisation timestamp of the data on freeair-connect site. This is not the last read done by Fhem.

       

  • Other Readings
        As on the website, main page and details.


    Attributes
       

  • disable
        If set to 1, the polling of the website is disabled

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

eldi0s

Wirklich super  ;D

Sorry für die Verspätung :-(
Gehe heute Abend in den Keller und ändere den Key.

Lass Ihn dir dann noch zukommen ;-)

amenomade

Kannst Du auch bitte ein paar Fragen beantworten, bevor ich alles kaputt mache ;) ?

- in der "Details" (EN) bzw "Geräte-Infos" (DE) Seite der Weboberfläsche sind Kästchen bei Enteisungsmodus, Programm und  Reduktion (mini). Sind das einstellbare Sachen (kann man das ankreuzen und hat das eine Wirkung) oder sind das nur nicht änderbare Stati? Wenn einstellbar, kann ich zum Test damit auch spielen oder wäre es gefählich oder irgendwie störend?

- anscheinend, und trotzt Seitentitel "Minuten-Werte", werden die Daten auf der Seite nur stündlich aktualisiert. Stimmt das? Und wenn man ein Parameter ändert, werden die Daten schneller upgedated?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

eldi0s

Klar, habe vorhin mit dem Support von BluMartin
telefoniert.

Zu 1: Das sind soweit ich erfahren habe alles nur Stati und
nicht änderbar.

Zu 2: Aus Datenschutzgründen und um Rückschlüsse auf
Anwesenheit zu erschweren wird nur stündlich aktualisiert.
Durch das aufrufen einer Comfortstufe wird sofort aktualisiert.
Auch wenn man die gleiche nochmal anwählt. Das Gerät gibt
dabei allerdings einen Piep von sich um das zu signalisieren.
Kann aber somit als ,,trigger" verwendet werden.

Zugang kommt später, bin noch on tour ;-)

amenomade

Also... grundsätzlich funktionieren jetzt die Set Kommandos (siehe letzte Version vom Modul im ersten Post)
Anmerkungen:
- das Setzen von OperationMode Sleep führt dazu, dass ComfortLevel auf 8 springt. Das gleiche passiert, wenn man über die Webseite steuert. Und damit ist die Webseite überfordert (man kann nicht mehr auf dem "Press" Button drucken). Ich habe es so gelöst, dass eine neue Änderung von ComfortLevel (nach Comfort) oder OperationMode das Gerät wieder auf ComfortLevel 3 setzt
- TurboCool funktionniert aber nach 2 Mn springt das Gerät wieder auf Comfort 3. Da es auch in der Weboberfläsche passiert, kann ich wenig tun.

Die Änderungen von OperationMode werden erst nach 1-2 Minuten in der Weboberfläsche sichbar. Deswegen zwinge ich ein reread nach 120 Sek.

Du kannst gerne selbst testen. Wenn Du Ideen hast, wie man es verbessern kann, bin ich bereit, es zu implementieren.

Es gibt noch Problemen mit den Meldungen in der Log mit verbose 5, aber daran arbeite ich noch.




Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

eldi0s

Im UG hab ichs noch nicht getestet aber gestern Abend mal den im Wohnzimmer
auf Turbo Cool vom WebIf aus gestellt, und der sauste ne gute Stunde durch auf
Vollgas mit Aussenluft (quasi wie es in der Anleitung steht)

amenomade

Zitat von: eldi0s am 23 Mai 2020, 20:25:27
vom WebIf
Welche? Die Webseite oder Fhem? ;)

Hab ein paar Sachen angepasst. Siehe neue Version im ersten Post.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

eldi0s

Die Website vom Gerät. Ja ich muss das Modul erst isntallieren. Bei mir läuft noch die alpha  :o

eldi0s

Also Gerät im UG läuft über das WebIf im Turbo Cool auch die 3 Stunden auf Vollgas durch.

Hatte im vorherige Post was von 1 Std geschrieben, das stimmt aber nicht, es sind 3 Stunden.

Über das Modul habe ich es noch nicht getestet. Folgt noch.

eldi0s

Gestern fand ich mal wieder etwas Zeit um an der Lüftung zu spielen ;-)

Das Problem mit dem Turbo Cool und dem zurückspringen auf die vorher gewählte Comfortstufe wird automatisch
ausgeführt, wenn die Aussentemperatur sich der Innenraumtemperatur annähert oder diese gar übersteigt.

Konnte das gestern morgen gut beobachten.

Ist die Aussentemperatur beim aktivieren der Funktion sogar schon gleich oder höher, springt das Gerät nach den
von dir erwähnten 2 Minuten sofort zurück. Das ist also kein Fehler sondern so gewollt.

Die Geräte erkennen selbständig einen Sommertag und aktivieren bei Nacht die Bypassklappe um mit der kühlen
Nachtluft das Gebäude etwas abzukühlen. Die Lüftmenge wird hierbei aber nicht erhöht und das Gerät bleibt meist
auf Minimallüftung 20-30m³/h. Das ist am nächsten Morgen kaum spürbar.

Deshalb möchte ich mir eine Automatische Turbo Cool Aktivierung mit FHEM basteln, die in Abhängigkeit von der
Tageshöchsttemperatur (falls kein KNX oder anderweitiger Außenfühler vorhanden ist kann man hier die
Aussenlufttemperatur vom gerät hernehmen) und der Raumtemperatur (Entweder vom KNX oder Ablufttemperatur des Geräts)
um 01:00 Uhr die Funktion aktiviert (läuft dann automatisch 3 Stunden) bis um 4 Uhr und danach gleich nochmal aktiviert
bis 7:00Uhr.

Die Geräte haben einige Dippschalter am Gehäuse um dem Gerät ein paar Randbedingungen beizubringen.

  • Zweitraum Abluft vorhanden
  • Nur 2-Raumabluft oder im Wechsel mit 1-Raumabluft
  • Luftmenge 2-Raum Abluft 30/60/100 m³/h
  • Raumgröße 20-75 m²
  • Sommer Kühlung Temperatur 19/22/25 °C
Anhand dieser Parameter und der gewählten Comfortstufe im WebIf ermittelt das Gerät unter berücksichtigung
des CO2 Sensors, der Feuchte und der Temperatur die passende Lüftmenge. Selbst bei größten Einstellungen und
der höchsten Comfortstufe geht das Gerät hierbei selten über 40m³/h hinaus. Grund dafür dürfte die Lautstärke sein,
denn ab 60m³/h wird es echt nervig laut. Da die Geräte bei mir im Wohnzimmer und der Küche sitzen stört es Nachts
jedoch nicht.

Die Geräte können bis zu 100 m³/h sofern die Leitungen zur 2-Raumabluft ordentlicher dimensioniert sind, im Turbo Cool
werden diese dann voll ausgenutzt.

Mir schwebt da was vor mit Aussentemperatur über den Tag trenden oder immer nur den Höchstwert erfassen und überschreiben,
dann um 20 Uhr einmalig die Innentemperatur messen. Wenn Außen tagsüber auf über 27 °C war und innen um 20 Uhr größer 24°C
dann aktiviere TurboCool um 1 Uhr Nachts.

Wenn es Ideen gibt wie man das in FHEM umsetzen kann, immer her damit.

Grüße,

eldi0s

Beim rumspielen mit der Logik meiner Sommerkühlung ist mir aufgefallen, dass das Modul im "Humidity Reduction (abs)" Mode die Readings etwas zerhaut.
Oben sagt er auch als Modus "Test3"??

Unter Operation Mode sagt er "Test" und der CO2-Wert sowie die Lüfterdrehzahlen stimmen definitiv nicht. Die Website ziegt die Werte korrekt an.

Anbei der Device Overview:

STATE

Test 3<br>Humidity Reduction(abs)<br>40 m&sup3;/h -12.6 % 300.5 W 80 ppm
TYPE

freeairconnect
Readings
AbsHumExtract

0.7

2020-08-10 23:06:22
AbsHumOutdoor

36.0

2020-08-10 23:06:22
AirFlow

40

2020-08-10 23:06:22
AirFlowAve

16

2020-08-10 23:06:22
CFA

143

2020-08-10 23:06:22
CO2

80

2020-08-10 23:06:22
CSU

136

2020-08-10 23:06:22
ComfortLevel

3

2020-08-10 23:06:22
ControlAuto

2

2020-08-10 23:06:22
ControlAutoText

Humidity Reduction(abs)

2020-08-10 23:06:22
CtrlSet2ndVent

2

2020-08-10 23:06:22
CtrlSetBypVent

2

2020-08-10 23:06:22
CtrlSetExtVent

2

2020-08-10 23:06:22
CtrlSetSupVent

2

2020-08-10 23:06:22
DIPSwitch

241

2020-08-10 23:06:22
Deicing

0

2020-08-10 23:06:22
EnergySaving

300.5

2020-08-10 23:06:22
ErrorCode

39

2020-08-10 23:06:22
ErrorFileNr

28

2020-08-10 23:06:22
ErrorLineNr

50611

2020-08-10 23:06:22
ErrorState

23

2020-08-10 23:06:22
ErrorText


2020-08-10 22:49:14
FEC

196

2020-08-10 23:06:22
FSC

200

2020-08-10 23:06:22
FanExtractRPM

118

2020-08-10 23:06:22
FanLim2ndRoom

0

2020-08-10 23:06:22
FanSpeed

4

2020-08-10 23:06:22
FanSupplyRPM

2236

2020-08-10 23:06:22
FilterExtractFul

0

2020-08-10 23:06:22
FilterHours

49335

2020-08-10 23:06:22
FilterSupplyFul

1

2020-08-10 23:06:22
HeatRecovery

-12.6

2020-08-10 23:06:22
HumExtract

144

2020-08-10 23:06:22
HumOutdoor

36

2020-08-10 23:06:22
HumRedMode

1

2020-08-10 23:06:22
OperatingHours

72699

2020-08-10 23:06:22
OperationMode

Test

2020-08-10 23:06:22
OperationModeNum

6

2020-08-10 23:06:22
Pressure

1091

2020-08-10 23:06:22
RSSI

-72

2020-08-10 23:06:22
S1

182

2020-08-10 23:06:22
S2

53

2020-08-10 23:06:22
S3

122

2020-08-10 23:06:22
S4

250

2020-08-10 23:06:22
S5

141

2020-08-10 23:06:22
S6

63

2020-08-10 23:06:22
State

0

2020-08-10 21:27:33
SumCooling

0

2020-08-10 23:06:22
TempExhaust

-102.25

2020-08-10 23:06:22
TempExtract

-82.875

2020-08-10 23:06:22
TempOutdoor

88.625

2020-08-10 23:06:22
TempSupply

111.125

2020-08-10 23:06:22
TempVirtSupExit

-61.5

2020-08-10 23:06:22
TrafficLightCO2

1

2020-08-10 23:06:22
TrafficLightFilterExtract

100

2020-08-10 23:06:22
TrafficLightFilterSupply

4

2020-08-10 23:06:22
TrafficLightHumidity

4

2020-08-10 23:06:22
VentPosBath

9

2020-08-10 23:06:22
VentPosBypass

29

2020-08-10 23:06:22
VentPosExtract

14

2020-08-10 23:06:22
VentPosSupply

17

2020-08-10 23:06:22
b2ndRoomOnly20

0

2020-08-10 23:06:22


Website Werte zum Vergleich:

ZEIT Zeit 10.08.2020 22:40
BA Beriebsart cmf
PRG Programm efa
RED Reduktion (mini)
EM Entfeuchtungs-Modus nein
SK Sommer-Kühlung ja
CL Comfort-Level 3
RF [m2] Raumfläche 75
2A [m3/h] Zweitraum-Anschluss 100
VGZ [1/min] Ventilatorgeschw. Zuluft 1153
VGA [1/min] Ventilatorgeschw. Abluft 1445
LST [m3/h] Luftstrom 40
TAB [℃] Temperatur Abluft 28.5
FAB [%] Feuchtigkeit Abluft (rel) 53
TAU [℃] Temperatur Außen 20.9
FAU [%] Feuchtigkeit Zuluft (rel) 66
CO2 [ppm] CO2 704
TZU [℃] Temperatur Zuluft 28.4
TZB [℃] Temperatur Zuluft (ber.) 21.6
TFO [℃] Temperatur Fortluft 27.5
LDR [hPa] Luftdruck 957
LDI [kg/m3] Luftdichte 1.105
WRP [%] Wärmerückgewinnung (rel) 98.9
WRW [W] Wärmerückgewinnung (abs) 100.5
BST [h] Betriebsstunden 4758
FST [h] Filterstunden 4038
SNR Seriennummer 20666-EGKueche
RSSI [dBm] RSSI-Wert -72
FS Fehlerstatus OK
EFN -- 0
ELN -- 0
ECO -- 0
VPE -- 25
VBY -- 31
VBA -- 31
VPS -- 25
TPE -- 3
TBY -- 3
TBA -- 3
TPS -- 3
FSF -- 0
FEF -- 0
DIP -- 87
ZKL -- 27
AKL -- 21
LKA -- 142
LKF -- 1
S1 -- 0
S2 -- 10
S3 -- 0
S4 -- 0
S5 -- 1
S6 -- 33


EDIT:
Hat wohl was damit zu tun wenn ein zweites Gerät ins Spiel kommt. Sobald ich ein zweites Gerät über das Modul anlege zerhaut er die Readings vom ersten??