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??

amenomade

Ein lesbares "list" vom Device und die Log mit verbose 5 würden mir helfen.

EDIT: insb. die Logzeilen mit:
freeairconnect ($name): Params Parse = $param, $err, $data
und
freeairconnect ($name): stringToBytes =
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

ZitatDeshalb 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.

Z.B. mit einem DOIF:
([freeair100:"TempOutdoor"] and [?06:00-19:59] and [?freeair100:TempOutdoor] > [?freeair100:maxTemp,0.0])
(setreading freeair100 maxTemp [freeair100:TempOutdoor])
DOELSEIF ([20:00] and [?freeair100:maxTemp] > 27 and [?deviceX:TempIndoor] > 24)
(setreading freeair100 turboAtNight 1, setreading freeair100 maxTemp 0)
DOELSEIF (([01:00] or [04:05]) and [?freeair100:turboAtNight,0] eq "1")
(set freeair100 OperationMode Turbocool)
DOELSEIF ([05:00])
(setreading freeair100 turboAtNight 0)

attr do always



EDIT: Workaround für nicht existierenden Readings
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

Danke   :)

Werde es am WE mal testen und dir das "list" sowie die "Log" zukommen lassen.

Grüße,

amenomade

Version zur Fehlersuche

Zusätzliche Logausgaben bei errorState not 0 (achtung: Passwort wird mitgeloggt)

EDIT: Zwischenversion vom Modul entfernt. Die gültige Version ist 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

amenomade

Mit Wahrscheinlichkeitsprüfung vor der Aktualisierung von den Readings.

EDIT: Zwischenversion vom Modul entfernt. Die gültige Version ist 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

JoeALLb

Wollte mal einen Dank für das Modul da lassen.... bin vor monaten daran schon gescheitert :D
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

JoeALLb

Mir ist gerade aufgefallen, dass das Modul mir eine Außentemperatur von -6.5 zeigt, Die Webseite jedoch 8.5, was korrekt ist.
Hast Du dazu eine Idee? Im lastDataTimestamp wird die korrekte Urzeit angezeigt, also handelt es sich nicht um alte Werte!

sG
Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

amenomade

Wow. Kalt bei dir ;)
Ich brauche mehr Information, wie "list" vom Device und Log Ausgaben
Erste Frage: hast Du die letzte Version vom Modul (vom 01.09.2020) im Betrieb?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

JoeALLb

Ja, hab die aktuellste Version, aber keinen Zugriff (aus der Ferne) auf das Log, da fhem in einem Docker Container liegt.
Im eventmonitor landet jedenfalls nichts...

Aber die Werte passen aktuell auch wieder (+3.8°).
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

eldi0s

Hi,

habe mal wieder Probleme mit dem Modul :'(

Bei mir laufen 3 Geräte und das Modul liefert bei mir immer nach ca. 2 Tagen keine Daten mehr und der Pi bekommt eine
sehr hohe CPU Last. Im Log finden sich dann pro Sekunde ca. 10 Einträge mit:

URL error (39466): connect to https://www.freeair-connect.de:443 timed out

Das hier ist mir im Log auch aufgefallen:
www.freeair-connect.de: Die Verbindung wurde vom Kommunikationspartner zurückgesetzt (104)

Ich hatte schon das Interval im Verdacht und es deshalb schon bei allen 3 Geräten unterschiedlich eingestellt. Aber keine Besserung.
Der Pi hat dabei ständig eine konstante Internetverbindung und ein Ping auf z.Bsp. google.de läuft einwandfrei.

In der Datei split_aa ist der Anfang der Misere ersichtlich. Split_zcvj zeigt dann das Ende wo der Pi komplett zu spinnen beginnt.

Irgend eine Idee?

Grüße,

JoeALLb

servus, ja. Das Problem kann ich auf einem nicht PI bestätigen, habe es seither auf eine eigene Fhem Instanz verschoben und boote diese täglich neu. Aber toll, dass es dieses Modul gibt, herzlichen Dank!!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

amenomade

Bitte aktuelle "list" von den Devices.
Ist bei dir "attr global dnsServer" gesetzt?

Hilft ein grösserer Interval für die Abfragen?
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

Mit nem gestaffelten Intervall von 200/240/280 zwischen den 3 Geräten funktioniert es bei mir seit ca. ner Woche.
Bekomme aber 1 mal am Tag trotzdem auf 2 von den 3 Geräten zur selben Zeit die o.g. Fehlermeldung. Die Geräte variieren dabei.
Vermute es kommt immer wenn die Abfrage 2er Geräte in den selben Zeitraum fällt. Das System stört sich wohl aber momentan nicht daran.

Grüße

amenomade

Ich vermute, die Webseite blockiert ab und zu. Vielleicht wollen die nicht permanent zu oft gepollt werden. Aber ein Mechanismus einzubauen, dass eine gleichzeitige Abfrage von mehrenen Devices verhindert, wäre schwierig zu implementieren. Hätte erstmal keine Ahnung wie.
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

Hmm, jetzt ist reproduzierbar nach ca. 1 Woche Schluss. Das ist echt komisch.
Im Log immer nur die gleichen Meldungen wie zuvor angehängt.

Wenn dann das "Spamming" los geht wird sogar meine IP von den bluMartin Servern
komplett geblockt. Verständlich, da FHEM dann pro Sekunde 2-3mal pollt.

Hat das evtl. was mit deiner Plausibilitätsprüfung die du neulich eingeführt hast zu tun?

Grüße,


amenomade

Nein, die Plausibilitätsprüfung verwirft unplausible Werte, aber fordert keine neue Abfrage der Webseite. Diese erfolgt wieder nach Interval.
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

Versuche mal mit der hier angehängten Version. Vielleicht meckert der Server weniger mit einem keepalive der TCP Verbindung. Das kann aber andere Auswirkungen haben, mal sehen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

JoeALLb

Ich kann jedenfalls bestätigen, dass man das Modul in einen Status bekommen kann, indem es sehr viele (sekündlich?) Anfragen an den Server verschickt.
Hatte dies auch schon mal, meine Wbapp-Firewall hat die Anfragen jedoch abgefangen.
Seitdem ich täglich neu starte, konnte ich das nicht mehr beobachten.
Scheinbar kann hier das Interval übergangen werden.

sG Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

amenomade

Wäre es möglich eine Log mit verbose >= 4 in dem Fall zu haben?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

JoeALLb

Von mir leider nicht. Ich bin aktuell wegen dem lockdown im Ausland "gefangen", da verzichte ich nicht auf diesen reboot, da manchmal fhem dann gar nicht mehr reagiert hat.
sorryJoe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

eldi0s

Das mit dem Log auf verbose >=4 hatte ich probiert, aber sobald die Fehlermeldungen sich häufen explodiert die Größe des Logs förmlich in GB, das bekomme ich dann
nicht mehr vom Raspy runter, da er ja nur im Wlan hängt. Da bei mir generell viel Buskommunikation läuft wird das Log auf hohem verbose auch ohne Fehler ziemlich
schnell mehrere hundert MB groß. Und momentan läuft es ja ca. ne Woche lang, bis die Fehler sich häufen und er abschmiert. Da wäre das Log schon mehrere GB groß.

Gibts ne Möglichkeit das log immer nur für 24 Stunden "am Leben" zu halten? Also automatisch zu überschreiben?


amenomade

Du brauchst nicht verbose 5 auf global zu setzen. Es reicht, wenn es nur auf einem freeairconnect Device gesetzt ist.

Zitat von: eldi0s am 26 November 2020, 15:11:00
Gibts ne Möglichkeit das log immer nur für 24 Stunden "am Leben" zu halten? Also automatisch zu überschreiben?
Ja, siehe Attribute "logfile" und entspr. Wildcards (%d), und Attribut "nrarchive" auf global.
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

Hi,

hatte eben kurz ein paar Minuten um nach dem Logging zu schauen. Habe etwas gegoogelt und im FHEM Wiki gelesen.
Ob ich das jetzt richtig gemacht habe kann ich nicht sagen, aber er loggt jetzt auf jeden Fall für jedes Gerät und hat auch
eine Datei mit Monat/Tag für jedes Gerät angelegt. Das mit dem Archivieren hab ich jetzt mal gelassen. Kann ja alle paar
Tage die Logs ohne Fehler von Hand löschen.

Angelegt habe ich die Logs so:

define logKueche filelog ./log/freeair100Kueche-%m-%d.log freeair100Kueche
attr logKueche verbose 5

define logWohnen filelog ./log/freeair100Wohnen-%m-%d.log freeair100Wohnen
attr logWohnen verbose 5

define logUG filelog ./log/freeair100UG-%m-%d.log freeair100UG
attr logUG verbose 5


Gefüllt werden die Dateien momentan mit:

2020-12-07_20:42:36 freeair100Kueche lastDataTimestamp: 2020-12-07 19:50:42
2020-12-07_20:42:36 freeair100Kueche lastRawData: Uh3znKQvCf9Fnvo3N3EVSCcaTmm5v24VmJxiszzCC11rKRwIXvik3D8qq8Xuov4S
2020-12-07_20:42:36 freeair100Kueche S1: 0
2020-12-07_20:42:36 freeair100Kueche S2: 10
2020-12-07_20:42:36 freeair100Kueche S3: 0
2020-12-07_20:42:36 freeair100Kueche S4: 0
2020-12-07_20:42:36 freeair100Kueche S5: 1
2020-12-07_20:42:36 freeair100Kueche S6: 33
2020-12-07_20:42:36 freeair100Kueche HumRedMode: 0
2020-12-07_20:42:36 freeair100Kueche FanLim2ndRoom: 0
2020-12-07_20:42:36 freeair100Kueche b2ndRoomOnly20: 0
2020-12-07_20:42:36 freeair100Kueche SumCooling: 0
2020-12-07_20:42:36 freeair100Kueche ErrorFileNr: 0
2020-12-07_20:42:36 freeair100Kueche ErrorLineNr: 0
2020-12-07_20:42:36 freeair100Kueche FilterSupplyFul: 0
2020-12-07_20:42:36 freeair100Kueche FilterExtractFul: 0
2020-12-07_20:42:36 freeair100Kueche VentPosExtract: 25
2020-12-07_20:42:36 freeair100Kueche VentPosBath: 31
2020-12-07_20:42:36 freeair100Kueche VentPosSupply: 31
2020-12-07_20:42:36 freeair100Kueche VentPosBypass: 25
2020-12-07_20:42:36 freeair100Kueche CtrlSetSupVent: 3
2020-12-07_20:42:36 freeair100Kueche CtrlSetExtVent: 3
2020-12-07_20:42:36 freeair100Kueche CtrlSet2ndVent: 3
2020-12-07_20:42:36 freeair100Kueche CtrlSetBypVent: 2
2020-12-07_20:42:36 freeair100Kueche ErrorCode: 0
2020-12-07_20:42:36 freeair100Kueche FilterHours: 6890
2020-12-07_20:42:36 freeair100Kueche OperatingHours: 7610
2020-12-07_20:42:36 freeair100Kueche Deicing: 0
2020-12-07_20:42:36 freeair100Kueche FSC: 25
2020-12-07_20:42:36 freeair100Kueche FEC: 25
2020-12-07_20:42:36 freeair100Kueche CSU: 18
2020-12-07_20:42:36 freeair100Kueche CFA: 2
2020-12-07_20:42:36 freeair100Kueche DIPSwitch: 87
2020-12-07_20:42:36 freeair100Kueche HumOutdoor: 82
2020-12-07_20:42:36 freeair100Kueche HumExtract: 42
2020-12-07_20:42:36 freeair100Kueche TempOutdoor: 1.625
2020-12-07_20:42:36 freeair100Kueche TempExtract: 20.875
2020-12-07_20:42:36 freeair100Kueche TempSupply: 19.625
2020-12-07_20:42:36 freeair100Kueche TempExhaust: 5.875
2020-12-07_20:42:36 freeair100Kueche TempVirtSupExit: 19.625
2020-12-07_20:42:36 freeair100Kueche AbsHumOutdoor: 4.6
2020-12-07_20:42:36 freeair100Kueche AbsHumExtract: 7.9
2020-12-07_20:42:36 freeair100Kueche CO2: 576
2020-12-07_20:42:36 freeair100Kueche Pressure: 941
2020-12-07_20:42:36 freeair100Kueche ComfortLevel: 3
2020-12-07_20:42:36 freeair100Kueche OperationModeNum: 0
2020-12-07_20:42:36 freeair100Kueche OperationMode: Comfort
2020-12-07_20:42:36 freeair100Kueche FanSpeed: 3
2020-12-07_20:42:36 freeair100Kueche FanSupplyRPM: 967
2020-12-07_20:42:36 freeair100Kueche FanExtractRPM: 1411
2020-12-07_20:42:36 freeair100Kueche TrafficLightFilterSupply: 1
2020-12-07_20:42:36 freeair100Kueche TrafficLightFilterExtract: 3
2020-12-07_20:42:36 freeair100Kueche AirFlowAve: 20
2020-12-07_20:42:36 freeair100Kueche AirFlow: 30
2020-12-07_20:42:36 freeair100Kueche ControlAuto: 0
2020-12-07_20:42:36 freeair100Kueche ControlAutoText: Minimum Ventilation
2020-12-07_20:42:36 freeair100Kueche RSSI: -66
2020-12-07_20:42:36 freeair100Kueche HeatRecovery: 94.0
2020-12-07_20:42:36 freeair100Kueche EnergySaving: 180.5
2020-12-07_20:42:36 freeair100Kueche TrafficLightHumidity: 1
2020-12-07_20:42:36 freeair100Kueche TrafficLightCO2: 1
2020-12-07_20:42:36 freeair100Kueche ErrorState: 0
2020-12-07_20:42:36 freeair100Kueche ErrorText:


Interessant wird es ja dann, wenn die ersten Fehler kommen.

Passt das so?

Grüße,
eldi

EDIT:
Also die Verbindungsfehler des freeairconnect Moduls werden bei den Devices nicht mitgeloggt?? Ist das gewollt?

2020.12.08 01:27:22 1: freeairconnect (freeair100Wohnen): URL error (1): read from https://www.freeair-connect.de:443 timed out
oder
2020.12.06 04:22:52 1: freeairconnect (freeair100Wohnen): URL error (1): www.freeair-connect.de: Verbindungsaufbau abgelehnt (111)

amenomade

verbose 5 muss auf dem freeairconnect Device und nicht auf dem FileLog-Device gesetzt werden
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

Ups...

Ok, ist gemacht und wird von FHEM bei den Geräten jetzt auch so angezeigt.

Dann warten wir mal ab.

eldi0s

Also trotz verbose 5 auf den freeairdevices wird nur das oben angehängte in dem filelog geloggt. Dafür aber auf verbose 5 im FHEM log und selbiges explodiert mir
jetzt immer. 4-6 GB pro Tag?

amenomade

Nein, verbose 5 braucht nicht auf global sondern nur auf den freeair Devices gesetzt zu werden.

Dann in der Fhem Log schauen. Die Log3 lvl 5 sind in der Fhem Log, nicht in einer Filelog. Ein Filelog Device loggt nur Events.
Das wird aber auch viel in der Log schreiben.
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

Merry Christmas ;-)

Also, ich lasse die Logs jetzt Stundenweise anlegen. Free Air Geräte auf verbose 5. Nach einem Fhem Neustart ist das Log pro Stunde ca. 40MB groß und die 3 Geräte pollen nach Ihren "Interval" Vorgaben. Bereits am 2-3 Tag steigt die Größe des Logs auf 70-80MB. Nach ner Woche bei über 170MB. Das polling nimmt dabei deutlich zu, sprich er fragt die Geräte innerhalb der selben Sekunde teiwleise 3-4 mal ab. Siehe Logauszug. Fehler sehe ich keine im Log. So nach 14 Tage hat das Log pro Stunde 400MB und FHEM schmeisst sich weg. Achja, gibt es einen Grund warum eine so riesige Datenmenge bei Params Parse = HASH verarbeitet werden muss??

Weihnachtliche Grüße,
eldi

amenomade

ZitatDas polling nimmt dabei deutlich zu, sprich er fragt die Geräte innerhalb der selben Sekunde teiwleise 3-4 mal ab.
Das klingt komisch.
Ich schaue nach, wenn ich ein bisschen Zeit finde.

ZitatAchja, gibt es einen Grund warum eine so riesige Datenmenge bei Params Parse = HASH verarbeitet werden muss??
Das ist was die http Request zurückgibt. Nicht alles wird geparst sondern nur das erste Teil. Der Rest ist Historie. Aber mit verbose 5 wird es gelogt, und das ist genau das, was ich mich ansehen muss. Du kannst aber die Zeile kommentieren, ich habe gesehen, dass es nicht daran liegt und die nutzbare Daten habe ich schon in "Handling data ..."

EDIT: Da geht tatsächlich etwas schief. Er macht mehrere GetUpdate nacheinander. Ich melde mich (aber dauert vielleicht ein bisschen in der Weihnachtszeit ;) )

Frohe Weihnachten.
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

Ich habe eine mögliche Fehlerquelle identifiziert: nach einem "Error" wurde evtl die Anzahl von GetUpdates multipliziert. Kannst Du bitte mit der angehängten Version weiter testen? (drinn habe ich auch die Log Ausgabe reduziert - 1M pro Request war tatsächlich ein bisschen viel)

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

Ok top, hab es eben eingepflegt. Dann testen wir mal weiter.

Danke nochmal ;-)

Mathea

Ich bedanke mich vorab für die Arbeit an dem tollen Modul!

Ich teste es seit ein paar Stunden und wollte lediglich eine Fehlermeldung dokumentieren. Nachdem ich die Betriebsart des Gerätes auf "Sleep" gestellt habe, bekam ich folgende Warn- und Fehlermeldung im Log:

2020.12.27 00:00:06 1: PERL WARNING: Use of uninitialized value $nextupdate in concatenation (.) or string at ./FHEM/60_freeairconnect.pm line 380.
2020.12.27 00:00:06 2: freeairconnect (WZ_freeair100): Error POST setting ComfortLevel ERR:  DATA:
1


Das Setzen des Modus hat allerdings funktioniert.

Gruß,
Martin

amenomade

Zitat von: Mathea am 27 Dezember 2020, 00:41:34
Ich bedanke mich vorab für die Arbeit an dem tollen Modul!

Ich teste es seit ein paar Stunden und wollte lediglich eine Fehlermeldung dokumentieren. Nachdem ich die Betriebsart des Gerätes auf "Sleep" gestellt habe, bekam ich folgende Warn- und Fehlermeldung im Log:

2020.12.27 00:00:06 1: PERL WARNING: Use of uninitialized value $nextupdate in concatenation (.) or string at ./FHEM/60_freeairconnect.pm line 380.
2020.12.27 00:00:06 2: freeairconnect (WZ_freeair100): Error POST setting ComfortLevel ERR:  DATA:
1


Das Setzen des Modus hat allerdings funktioniert.

Gruß,
Martin

Danke für die Rückmeldung. Die Zeile 380 kannst Du ruhig auskommentieren, den gleichen Log3 Befehl gibt es 3 Zeilen später (copy/paste Fehler)

Ich werde es bei Gelegenheit korrigieren, sobald das Thema mit GetUpdates und Errors gelöst ist.

Für die Fehlermeldung: da muss ich was verstehen: kriegst Du diese Fehlermeldung NUR beim Setzen des Comfortlevel auf sleep, oder ist sie auch bei anderen Comfortlevels da?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Mathea

Ich habe das gerade noch mal mit verbose 5 ausprobiert.
Die Fehlermeldung kommt jedes Mal wenn ich den OperationMode setze (habe es mit Sleep, Turbo und Comfort getestet). Hier der entsprechende Auszug aus dem Log mit den vorangehenden Zeilen:

2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command OperationMode
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set OperationMode Comfort
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): GetUpdate
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Getting URL https://www.freeair-connect.de/getDataHexAjax.php
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): GetUpdate: sending postdata
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): GetUpdate: setting new interval 60
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): GetUpdate - setting new timer 1609104527.29573
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): GetUpdate: new interval set
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set OperationMode Comfort - sending postdata
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set OperationMode Comfort - setting new timer
2020.12.27 22:27:47 5: freeairconnect (WZ_freeair100): Set OperationMode Comfort - setting new timer 1609104557.31198
2020.12.27 22:27:47 4: freeairconnect (WZ_freeair100): ERR: DATA:2
2020.12.27 22:27:47 2: freeairconnect (WZ_freeair100): Error POST setting ComfortLevel ERR:  DATA:
1


Das Gerät reagiert ein paar Sekunden versetzt dennoch richtig.

Beim setzen des ComfortLevels kommt kein Error und es wird ein "Posted comfortlevel X successfully" zurückgemeldet.
Hier der entsprechende Log Auszug:

2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set command ComfortLevel
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set ComfortLevel 5
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): GetUpdate
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Getting URL https://www.freeair-connect.de/getDataHexAjax.php
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): GetUpdate: sending postdata
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): GetUpdate: setting new interval 60
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): GetUpdate - setting new timer 1609104280.90107
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): GetUpdate: new interval set
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set ComfortLevel 5 - sending postdata
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set command ?
2020.12.27 22:23:40 1: PERL WARNING: Use of uninitialized value $nextupdate in concatenation (.) or string at ./FHEM/60_freeairconnect.pm line 327.
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set ComfortLevel 5 - setting new timer
2020.12.27 22:23:40 5: freeairconnect (WZ_freeair100): Set ComfortLevel 5 - setting new timer 1609104310.91276
2020.12.27 22:23:41 4: freeairconnect (WZ_freeair100): ERR: DATA:

1
2020.12.27 22:23:41 5: freeairconnect (WZ_freeair100): Posted comfortlevel 5 successfully

amenomade

OK, danke. Sollte behoben sein. Siehe anbei.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Mathea

Vielen Dank! Jetzt bekomme ich keine Warn- oder Fehlermeldungen mehr im Log wenn ich die Geräte steuere.

eldi0s

Gutes und gesundes Neues  ;)

Wollte kurz RM geben.

Modulversion vom 25.12.2020 läuft jetzt seit 26.12.2020 und hat bisher keine Auffälligkeiten. Logsize pro Gerät und Stunde konstant bei 85-95 KB.
Somit sollte die Anzahl der Abfragen pro Stunde jetzt auch konstant sein. Melde mich in ner Woche nochmal. Sollte bis dahin nix passieren ist der
Fehler wohl weg  ;D

Grüße,
eldi

eldi0s

Bis dato immer noch keine Auffälligkeiten. Läuft, läuft und läuft.

Danke

amenomade

Prima, danke. Dann übertrage ich die modifizierte Version ins ersten Post des Threads.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

tyrolean

Hallo,

danke für das Modul - funktioniert, zumindest auf den ersten Blick, super.
Hat jemand von euch mal versucht das Ganze (zumindest die Steuerung) über Homebridge zu realisieren. Gibt es hierfür überhaupt ein entsprechendes Device in den HomeKit Definitionen?

Danke für eure Antwort...

eldi0s

Hi,

Homebridge/Homekit und dazugehörige Schnittstellen kenn ich leider nicht. Aber ich steuere meine Anlagen auch extern über einen KNX Bus mit Visualisierung.
Dazu lasse ich FHEM die Readings mit einem Notify konvertieren und auf den KNX Bus übersetzen oder vice versa. Funktioniert ganz gut.

FHEM <--> KNX <--> Visu

Google sagt mir das Homebridge MQTT-fähig ist, sollte also auf ähnliche Weise funktionieren.

FHEM <--> MQTT Broker <--> Homebridge (oder Visu)

Grüße,
eldi

eldi0s

Mir ist eben nach dem Filterwechsel aufgefallen, dass er 2 der 3 Geräte nicht mehr updated mit folgender Fehlermeldung.

Ignoring probably wrong data

Die Geräte werden zum Wechsel vom Strom getrennt. Danach wird die eventuell vorhandene Warnung zum Filterwechsel quittiert.
Bei einem der Geräte habe ich auch die Mindestluftmenge mit den am Gerät vorhandenen Dippschaltern verändert am anderen nicht.

2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): Getting URL https://www.freeair-connect.de/getDataHexAjax.php
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate: sending postdata
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate: setting new interval 200
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate - setting new timer 1615467658.58368
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate: new interval set
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): Params Parse = HASH(0x344c100), ,
mbJ0ZMOasVWXCPXQkAxQW1V62nx5rGO8ygb/FbmWr4WK3RLnjvQV7gtOHFggPWqttimestamp2021-03-11 13:56:16timestamp2x5x0timestamp0x0x0timestamp0=jU3VqQMwMBnoDJDF5p4a0hFSYv0jEGMLqrMVQ0tMR6BP6agyOnGBwMfcNsZZUPQP&1=RcHcDordQHPBH86zznndVW5gRla7IXyYkLme75gJCumoaV%2BfDLME3A
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Parse: Starting
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Handling data mbJ0ZMOasVWXCPXQkAxQW1V62nx5rGO8ygb/FbmWr4WK3RLnjvQV7gtOHFggPWqt
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): storePassword
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Read freeairconnect password from file
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): decryptPassword
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): stringToBytes = 001011110001111000001010011001010110110000010000000010100010010001100111000011010000000000000000000000000010100000000011010010110000001101001011010111000101101000111110000000010000100100000000000000010111111101111001011111110111100101000001000000010000000000000000000000010000010100010100000010010000100101000100000011110000000000000000000000010000000000000000000000010010000110111000
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): stringToBytes = 47 30 10 101 108 16 10 36 103 13 0 0 0 40 3 75 3 75 92 90 62 1 9 0 1 127 121 127 121 65 1 0 0 1 5 20 9 9 68 15 0 0 1 0 0 1 33 184
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Set command ?
2021.03.11 13:57:39 3: freeairconnect (freeair100UG): Ignoring probably wrong data ™²tdÚ±U—õА P[UzÚ|y¬c¼Êÿ¹–¯...ŠÝçŽôî NX =j­


Wenn ich den Check im Modul auskommentiere geht alles wieder?

# Probabilitycheck
   my $DIP = freeairconnect_extractValueFromBits("DIPSwitch", $bitString);
   my $ErrorState = freeairconnect_extractValueFromBits("ErrorState", $bitString);
#   if ($ErrorState ne "0" and $DIP ne ReadingsVal($name, "DIPSwitch", 0)) {
#     readingsEndUpdate($hash, 1);
#     Log3 $name, 3, "freeairconnect ($name): Ignoring probably wrong data $rawdata";
#     $hash->{UPDATED} = FmtDateTime(time());
#     return;
#   }


Was gleichst du in dem Check ab?

Grüße,

eldi0s

Zitat von: eldi0s am 11 März 2021, 14:40:34
Mir ist eben nach dem Filterwechsel aufgefallen, dass er 2 der 3 Geräte nicht mehr updated mit folgender Fehlermeldung.

Ignoring probably wrong data

Die Geräte werden zum Wechsel vom Strom getrennt. Danach wird die eventuell vorhandene Warnung zum Filterwechsel quittiert.
Bei einem der Geräte habe ich auch die Mindestluftmenge mit den am Gerät vorhandenen Dippschaltern verändert am anderen nicht.

2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): Getting URL https://www.freeair-connect.de/getDataHexAjax.php
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate: sending postdata
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate: setting new interval 200
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate - setting new timer 1615467658.58368
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): GetUpdate: new interval set
2021.03.11 13:57:38 5: freeairconnect (freeair100UG): Params Parse = HASH(0x344c100), ,
mbJ0ZMOasVWXCPXQkAxQW1V62nx5rGO8ygb/FbmWr4WK3RLnjvQV7gtOHFggPWqttimestamp2021-03-11 13:56:16timestamp2x5x0timestamp0x0x0timestamp0=jU3VqQMwMBnoDJDF5p4a0hFSYv0jEGMLqrMVQ0tMR6BP6agyOnGBwMfcNsZZUPQP&1=RcHcDordQHPBH86zznndVW5gRla7IXyYkLme75gJCumoaV%2BfDLME3A
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Parse: Starting
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Handling data mbJ0ZMOasVWXCPXQkAxQW1V62nx5rGO8ygb/FbmWr4WK3RLnjvQV7gtOHFggPWqt
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): storePassword
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Read freeairconnect password from file
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): decryptPassword
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): stringToBytes = 001011110001111000001010011001010110110000010000000010100010010001100111000011010000000000000000000000000010100000000011010010110000001101001011010111000101101000111110000000010000100100000000000000010111111101111001011111110111100101000001000000010000000000000000000000010000010100010100000010010000100101000100000011110000000000000000000000010000000000000000000000010010000110111000
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): stringToBytes = 47 30 10 101 108 16 10 36 103 13 0 0 0 40 3 75 3 75 92 90 62 1 9 0 1 127 121 127 121 65 1 0 0 1 5 20 9 9 68 15 0 0 1 0 0 1 33 184
2021.03.11 13:57:39 5: freeairconnect (freeair100UG): Set command ?
2021.03.11 13:57:39 3: freeairconnect (freeair100UG): Ignoring probably wrong data ™²tdÚ±U—õА P[UzÚ|y¬c¼Êÿ¹–¯...ŠÝçŽôî NX =j­


Wenn ich den Check im Modul auskommentiere geht alles wieder?

# Probabilitycheck
   my $DIP = freeairconnect_extractValueFromBits("DIPSwitch", $bitString);
   my $ErrorState = freeairconnect_extractValueFromBits("ErrorState", $bitString);
#   if ($ErrorState ne "0" and $DIP ne ReadingsVal($name, "DIPSwitch", 0)) {
#     readingsEndUpdate($hash, 1);
#     Log3 $name, 3, "freeairconnect ($name): Ignoring probably wrong data $rawdata";
#     $hash->{UPDATED} = FmtDateTime(time());
#     return;
#   }


Was gleichst du in dem Check ab?

Grüße,

Ok hatte jetzt nochmal Zeit mir das ganze im Detail anzuschauen. Du gleichst ja mit der Plausibilitätsprüfung den Error State und die DIP Switch ab. Da liegt der Hund begraben. Wenn sich dort was ändert verwirft er die Daten. Ich denke aber eh, da wir das Problem mit den falschen Werten behoben haben könntest du diese Prüfung raus nehmen. Sonst hat man jedes mal bei nem Filterwechsel oder ner Änderung an den Dippschaltern ein Problem.

Grüße,
eldi

amenomade

Zitat von: eldi0s am 22 Juni 2021, 14:55:51
Ok hatte jetzt nochmal Zeit mir das ganze im Detail anzuschauen. Du gleichst ja mit der Plausibilitätsprüfung den Error State und die DIP Switch ab. Da liegt der Hund begraben. Wenn sich dort was ändert verwirft er die Daten. Ich denke aber eh, da wir das Problem mit den falschen Werten behoben haben könntest du diese Prüfung raus nehmen. Sonst hat man jedes mal bei nem Filterwechsel oder ner Änderung an den Dippschaltern ein Problem.

Grüße,
eldi
Naja. Den Fehler mit zu viele Pollings haben wir behoben, aber der Fehler mit falschen Werte kam vorher. Bist Du sicher, dass beide Problemen miteinander zu tun haben? Und seitdem Du den Check auskommentiert hast, hast Du nie komische Werte bekommen?
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

Ja, der Fehler mit den falschen Werten hatte was damit zu tun, dass er bei mehreren Geräten mit unterschiedlichen Passwörtern durcheinander kam. Das hast du aber auch schon eine Weile behoben.
Siehe Post 14. Da hatten wir auch zwecks Passwörter und deren Zuordnung ein paar private Nachrichten ausgetauscht. Seit deiner Änderung ist da nichts mehr schief gelaufen.

Wollte gestern die TrafficLights in die Visu integrieren, werde daraus aber nicht ganz schlau.

Hier die Readings vom Modul:
TrafficLightCO2 1
TrafficLightFilterExtract 2
TrafficLightFilterSupply 2
TrafficLightHumidity 1

Im Anhang die Ampeln vom Gerät.

Irgendwas stimmt da nicht. Ist bei allen 3 Geräten zerhauen.

Grüße,



amenomade

OK, ich habe es auskommentiert.

Sorry, aber mit SmarVisu kenne ich mich nicht aus.
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

Danke, SmartVisu kenn ich auch nicht ;-)

Das Modul liest die Ampeln meiner Meinung nach
falsch aus. Es gibt ja

Grün / Gelb / Orange / Rot

Da hätte ich gedacht

1 / 2 / 3 / 4 oder so

Das Modul zeigt aber wie in meinem Screenshot
teilweise für die gleiche Farbe bei den unterschiedlichen
Sensoren andere Werte?

Beispiel vom vorherigen Post:

TrafficLightCO2
1 ist Grün

TrafficLightFilterExtract
2 ist Grün

TrafficLightFilterSupply
2 ist Grün

TrafficLightHumidity
1 ist Gelb

Kannst du das nochmal anschauen oder ne Legende in die Hilfe integrieren?
Wäre super.

Modul läuft sonst 1A

Danke und Grüße

eldi0s


galdreth

Hallo zusammen. Seit 2021 bis vor ein paar Tagen lief das fhem-Modul bei mir ganz vorzüglich und jetzt sind ein paar Output-Zahlen murks.

Ich logge halbstündlich nicht alle Werte, allerdings habe ich 2 separate freeair-Anlagen. Beide haben ca. gleichzeitig einen Sprung in den Außentemperatur-Daten gezeigt ab dem 7.1. von Knapp über 0 auf +13 grad Celsius. Eigentlich müsste es unter 0 sein. Interessanterweise sind auch mindestens die ausgelesenen AirFlow und EnergySaving Werte unsinnig (0m³/h bzw 0.5W).


Über die Freeair-Webseite von Blumartin sind aber vernünftige aktuelle Zahlen beider Geräte vorhanden.

Kann es sein, dass das Datenformat sich bei der Seite geändert hat? Beobachtet jemand ähnliches bei sich?

Meine fhem-Logs sind leer bis auf gelegentliche "URL error (1): read from https://www.freeair-connect.de:443 timed out"

Edit: Spannenderweise springt meine OutdoorTemp von etwa 15 auf einen Wert knapp über 0, sobald die Temperatur tatsächlich wieder über den Gefrierpunkt steigt. Es geht anscheinend bei der Vorzeichenauswertung etwas schief.

 


galdreth

Die Werte auf der Freeair-Seite sehen alle vernünftig aus. Ich habe mal den Code aus der Seite exktrahiert, falls es hilft.
function createPrimBlobObject(parsedBlob,timestamp,version,versionFA100)
{
var blobObject={};
var division23=[6,1];
var dividedByte23=divideByte(division23,parsedBlob[23]);
var division24=[5,2];
var dividedByte24=divideByte(division24,parsedBlob[24]);
var division25=[5,2];
var dividedByte25=divideByte(division25,parsedBlob[25]);
var division26=[5,2];
var dividedByte26=divideByte(division26,parsedBlob[26]);
var division27=[5,2];
var dividedByte27=divideByte(division27,parsedBlob[27]);
var division28=[5,2];
var dividedByte28=divideByte(division28,parsedBlob[28]);
var division29=[4,3];
var dividedByte29=divideByte(division29,parsedBlob[29]);
var division30=[4,3];
var dividedByte30=divideByte(division30,parsedBlob[30]);
var division31=[4,3];
var dividedByte31=divideByte(division31,parsedBlob[31]);
var division32=[4,3];
var dividedByte32=divideByte(division32,parsedBlob[32]);
var division33=[4,3];
var dividedByte33=divideByte(division33,parsedBlob[33]);
var division34=[4,1,1,1];
var dividedByte34=divideByte(division34,parsedBlob[34]);
var division35=[5,1,1];
var dividedByte35=divideByte(division35,parsedBlob[35]);
var division36=[5,1,1];
var dividedByte36=divideByte(division36,parsedBlob[36]);
var division37=[5,1,1];
var dividedByte37=divideByte(division37,parsedBlob[37]);
var division38=[4,1,1,1];
var dividedByte38=divideByte(division38,parsedBlob[38]);
var division39=[5,2];
var dividedByte39=divideByte(division39,parsedBlob[39]);
var division40=[4,2,1];
var dividedByte40=divideByte(division40,parsedBlob[40]);
var uDeicing=dividedByte23[1];
var uErrorFileNr=dividedByte23[0];
var uErrorState=dividedByte24[0];
var uDefrostExhaust=dividedByte24[1];
var uVentPosSupply=dividedByte25[0];
var uCtrlSetSupVent=dividedByte25[1];
var uVentPosExtract=dividedByte26[0];
var uCtrlSetExtVent=dividedByte26[1];
var uVentPosBath=dividedByte27[0];
var uCtrlSet2ndVent=dividedByte27[1];
var uVentPosBypass=dividedByte28[0];
var uCtrlSetBypVent=dividedByte28[1];
var uTempSupplyHigh=dividedByte29[0];
var uComfortLevel=dividedByte29[1];
var uTempExtractHigh=dividedByte30[0];
var uState=dividedByte30[1];
var uTempExhaustHigh=dividedByte31[0];
var uControlAuto=dividedByte31[1];
var uTempOutdoorHigh=dividedByte32[0];
var uDummy1=dividedByte32[1];
var uTempVirtSupExitHigh=dividedByte33[0];
var uDummy2=dividedByte33[1];
var uPressure4LSB=dividedByte34[0];
var uCFAHigh=dividedByte34[1];
var uFilterSupplyFul=dividedByte34[2];
var uFilterExtractFul=dividedByte34[3];
var uAirFlowAve=dividedByte35[0];
var u2ndRoomOnly20=dividedByte35[1];
var uFanLim2ndRoom=dividedByte35[2];
var uFanExtractRPMHigh=dividedByte36[0];
var uCO2High=dividedByte36[1];
var uDIPSwitchHigh=dividedByte36[2];
var uFanSupplyRPMHigh=dividedByte37[0];
var uHumRedMode=dividedByte37[1];
var uSumCooling=dividedByte37[2];
var uFanSpeed=dividedByte38[0];
var uFSCHigh=dividedByte38[1];
var uFECHigh=dividedByte38[2];
var uCSUHigh=dividedByte38[3];
var uPressure5MSB=dividedByte39[0];
var uErrorLineNrSuperHigh=dividedByte39[1];
var uOperatingHoursSuperHigh=dividedByte40[0];
var uFilterHoursSuperHigh=dividedByte40[1];
var uErrorCodeHigh=dividedByte40[2];
var uTempSupplyLow=parsedBlob[2];
var uTempOutdoorLow=parsedBlob[3];
var uTempExhaustLow=parsedBlob[4];
var uTempExtractLow=parsedBlob[5];
var uTempVirtSupExitLow=parsedBlob[6];
var uFanExtractRPMLow=parsedBlob[7];
var uDIPSwitchLow=parsedBlob[8];
var uFanSupplyRPMLow=parsedBlob[9];
var uErrorLineNrHigh=parsedBlob[10];
var uErrorLineNrLow=parsedBlob[11];
var uErrorCodeLow=parsedBlob[12];
var uCO2Low=parsedBlob[13];
var uOperatingHoursLow=parsedBlob[14];
var uOperatingHoursHigh=parsedBlob[15];
var uFilterHoursLow=parsedBlob[16];
var uFilterHoursHigh=parsedBlob[17];
var uFSCLow=parsedBlob[18];
var uFECLow=parsedBlob[19];
var uCSULow=parsedBlob[20];
var uCFALow=parsedBlob[21];
var uRSSILow=parsedBlob[47];
if(timestamp!=null)blobObject["timestamp"]=timestamp;
if(version!=null)blobObject["version"]=version.replace("x",".");
if(versionFA100!=null)blobObject["versionFA100"]=versionFA100.replace("x",".");
blobObject["HumOutdoor"]=parsedBlob[0];
blobObject["HumExtract"]=parsedBlob[1];
var iTempSupply=lowPlusHigh(uTempSupplyLow,uTempSupplyHigh);
blobObject["TempSupply"]=toSigned(iTempSupply,11)/8;
var iTempOutdoor=lowPlusHigh(uTempOutdoorLow,uTempOutdoorHigh);
blobObject["TempOutdoor"]=toSigned(iTempOutdoor,11)/8;
var iTempExhaust=lowPlusHigh(uTempExhaustLow,uTempExhaustHigh);
blobObject["TempExhaust"]=toSigned(iTempExhaust,11)/8;
var iTempExtract=lowPlusHigh(uTempExtractLow,uTempExtractHigh);
blobObject["TempExtract"]=toSigned(iTempExtract,11)/8;
var iTempVirtSupExit=lowPlusHigh(uTempVirtSupExitLow,uTempVirtSupExitHigh);
blobObject["TempVirtSupExit"]=toSigned(iTempVirtSupExit,11)/8;
blobObject["CO2"]=lowPlusHigh(uCO2Low,uCO2High)*16;
blobObject["Pressure"]=getPressure(uPressure5MSB,uPressure4LSB);
blobObject["ComfortLevel"]=getNumberFrBits(uComfortLevel)+1;
blobObject["State"]=getNumberFrBits(uState);
blobObject["HumRedMode"]=getNumberFrBits(uHumRedMode);
blobObject["FanLim2ndRoom"]=getNumberFrBits(uFanLim2ndRoom);
blobObject["b2ndRoomOnly20"]=getNumberFrBits(u2ndRoomOnly20);
blobObject["bSumCooling"]=getNumberFrBits(uSumCooling);
blobObject["ErrorState"]=getNumberFrBits(uErrorState);
blobObject["FanSpeed"]=getNumberFrBits(uFanSpeed);
blobObject["FanSupplyRPM"]=lowPlusHigh(uFanSupplyRPMLow,uFanSupplyRPMHigh);
blobObject["FanExtractRPM"]=lowPlusHigh(uFanExtractRPMLow,uFanExtractRPMHigh);
blobObject["AirFlowAve"]=getNumberFrBits(uAirFlowAve);
blobObject["FilterSupplyFul"]=getNumberFrBits(uFilterSupplyFul);
blobObject["FilterExtractFul"]=getNumberFrBits(uFilterExtractFul);
blobObject["VentPosExtract"]=getNumberFrBits(uVentPosExtract);
blobObject["VentPosBath"]=getNumberFrBits(uVentPosBath);
blobObject["VentPosSupply"]=getNumberFrBits(uVentPosSupply);
blobObject["VentPosBypass"]=getNumberFrBits(uVentPosBypass);
blobObject["ControlAuto"]=getNumberFrBits(uControlAuto);
blobObject["DIPSwitch"]=lowPlusHigh(uDIPSwitchLow,uDIPSwitchHigh);
blobObject["DefrostExhaust"]=getNumberFrBits(uDefrostExhaust);
blobObject["CtrlSetSupVent"]=getNumberFrBits(uCtrlSetSupVent);
blobObject["CtrlSetExtVent"]=getNumberFrBits(uCtrlSetExtVent);
blobObject["CtrlSet2ndVent"]=getNumberFrBits(uCtrlSet2ndVent);
blobObject["CtrlSetBypVent"]=getNumberFrBits(uCtrlSetBypVent);
blobObject["ErrorFileNr"]=getNumberFrBits(uErrorFileNr);
blobObject["ErrorLineNr"]=lowPlusHigh(uErrorLineNrLow,uErrorLineNrHigh);
blobObject["ErrorCode"]=lowPlusHigh(uErrorCodeLow,uErrorCodeHigh);
blobObject["filter_hours"]=lowPlusHigh(uFilterHoursLow,uFilterHoursHigh,uFilterHoursSuperHigh);
blobObject["operating_hours"]=lowPlusHigh(uOperatingHoursLow,uOperatingHoursHigh,uOperatingHoursSuperHigh);
blobObject["board_version"]=parsedBlob[22];
blobObject["bDeicing"]=getNumberFrBits(uDeicing);
blobObject["FSC"]=lowPlusHigh(uFSCLow,uFSCHigh);
blobObject["FEC"]=lowPlusHigh(uFECLow,uFECHigh);
blobObject["CSU"]=lowPlusHigh(uCSULow,uCSUHigh);
blobObject["CFA"]=lowPlusHigh(uCFALow,uCFAHigh);
blobObject["RoomArea"]=parseDIP(blobObject["DIPSwitch"],0);
blobObject["SecondRoomFlow"]=parseDIP(blobObject["DIPSwitch"],1);
var absHumOutdoor=getAbsHum(blobObject["HumOutdoor"],roundVal(blobObject["TempOutdoor"]));
var absHumExtract=getAbsHum(blobObject["HumExtract"],roundVal(blobObject["TempExtract"]));
var airDensity=getAirDensity(blobObject["Pressure"],blobObject["TempExtract"]);
blobObject["absHumExtract"]=absHumExtract;
blobObject["absHumOutdoor"]=absHumOutdoor;
blobObject["airDensity"]=airDensity;
blobObject["RSSI"]=toSigned(uRSSILow,8);
blobObject["S1"]=parsedBlob[41];
blobObject["S2"]=parsedBlob[42];
blobObject["S3"]=parsedBlob[43];
blobObject["S4"]=parsedBlob[44];
blobObject["S5"]=parsedBlob[45];
blobObject["S6"]=parsedBlob[46];
if(blobObject["FanSpeed"]>2){blobObject["AirFlow"]=blobObject["FanSpeed"]*10}else{blobObject["AirFlow"]=blobObject["AirFlowAve"]}return blobObject}

neodee

#65
Hallo zusammen,

seit ein paar Wochen scheint das Modul freeair connect keine Daten mehr zu liefern. Ich habe mir das heute mal genauer angesehen

2024.03.24 13:39:27 4: freeairconnect (freeair_OG): ERR: DATA:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>

2024.03.24 13:39:27 2: freeairconnect (freeair_OG): Error POST setting ComfortLevel ERR:  DATA: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>
2024.03.24 13:39:27 5: freeairconnect (freeair_OG): Params Parse = HASH(0x55651c03ed00), , <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="images/BM.png">
    <!--link rel="icon" sizes="192x192" href="images/gg.png"-->
<title id = "tit
2024.03.24 13:39:27 5: freeairconnect (freeair_OG): Parse: Starting
2024.03.24 13:39:27 5: freeairconnect (freeair_OG): Handling data
2024.03.24 13:39:27 2: freeairconnect (freeair_OG): Warning: could not extract first chunk of data from raw data. Aborting update.

Die aufgerufene Seite https://www.freeair-connect.de/buttonUserAjax.php existiert am Server nicht mehr. Man muss wohl seit kurzem beim ändern der Einstellungen ein Passwort eingeben.

Das war vor einiger Zeit definitiv ohne Passwort eingabe möglich.

Hat jemand eine Lösung für das Problem oder wurde das Modul aktualisiert und das ist an mir vorbeigegangen?

Sofern der BluHomeConnect Controller nicht so teuer wäre, hätte ich mir diesen vermutlich bereits gekauft, wobei ich nicht glaube das man die Geräte damit Steuern kann, sondern lediglich die Daten ausgelesen werden können.

Grüße und schönen Sonntag