Neues Modul für ComfoAir, Paul Santos und Lüftungen mit kompatibler Steuerung

Begonnen von StefanStrobel, 08 Mai 2014, 20:22:06

Vorheriges Thema - Nächstes Thema

Zwiebel

Hallo,

bei mir läuft das Modul ganz gut, kann Stufen einstellen und bekomm sonnst auch alle Werte.
Doch für das Reading "Betriebsstunden_Hoch" seh ich ein komisches verhalten. Plötzlich unplausieble hohe Werte.

grep " Betriebsstunden_Hoch" LueftungAll-2021.log # logfile von ComfoAir

2021-03-25_12:08:29 ZL Betriebsstunden_Hoch: 5636097
2021-03-25_12:09:29 ZL Betriebsstunden_Hoch: 269
2021-03-25_13:25:31 ZL Betriebsstunden_Hoch: 256
2021-03-25_13:26:31 ZL Betriebsstunden_Hoch: 269
2021-03-25_16:12:35 ZL Betriebsstunden_Hoch: 1
2021-03-25_16:13:35 ZL Betriebsstunden_Hoch: 269
2021-03-25_20:57:40 ZL Betriebsstunden_Hoch: 6225921
2021-03-25_20:58:40 ZL Betriebsstunden_Hoch: 269
2021-03-26_02:58:53 ZL Betriebsstunden_Hoch: 269
2021-03-26_04:57:00 ZL Betriebsstunden_Hoch: 6750209
2021-03-26_04:58:00 ZL Betriebsstunden_Hoch: 269
2021-03-26_07:01:05 ZL Betriebsstunden_Hoch: 256
2021-03-26_07:02:05 ZL Betriebsstunden_Hoch: 269
2021-03-26_13:02:10 ZL Betriebsstunden_Hoch: 269
2021-03-26_19:02:21 ZL Betriebsstunden_Hoch: 269
2021-03-26_19:30:23 ZL Betriebsstunden_Hoch: 256
2021-03-26_19:31:23 ZL Betriebsstunden_Hoch: 269
2021-03-27_01:31:45 ZL Betriebsstunden_Hoch: 269
2021-03-27_04:48:57 ZL Betriebsstunden_Hoch: 8388609
2021-03-27_04:49:57 ZL Betriebsstunden_Hoch: 269
2021-03-27_09:18:08 ZL Betriebsstunden_Hoch: 256
2021-03-27_09:19:08 ZL Betriebsstunden_Hoch: 269


grep " ZL" fhem.log  | grep "03.27 04:48" # fhem.log
2021.03.27 04:48:57 4: ZL: send adds frame to queue with cmd 00dd (get Betriebsstunden) / frame 07f000dd008a070f
2021.03.27 04:48:57 4: ZL: handle queue sends get Betriebsstunden code: 00dd frame: 07f000dd008a070f and wait for 00de, V 1.52 - 15.5.2020
2021.03.27 04:48:57 4: ZL: send adds frame to queue with cmd 00cd (get Ventilation-Levels) / frame 07f000cd007a070f
2021.03.27 04:48:57 4: ZL: send adds frame to queue with cmd 00e1 (get Status-Vorheizung) / frame 07f000e1008e070f
2021.03.27 04:48:57 4: ZL: send adds frame to queue with cmd 000b (get Ventilation-Status) / frame 07f0000b00b8070f
2021.03.27 04:48:57 4: ZL: send adds frame to queue with cmd 00df (get Status-Bypass) / frame 07f000df008c070f
2021.03.27 04:48:57 4: ZL: send adds frame to queue with cmd 00d1 (get Temperaturen) / frame 07f000d1007e070f
2021.03.27 04:48:57 4: ZL: read: wrong length: 21 (calculated) != 20 (header) cmd=00de, data=004e0f003e8900018e05590000002e31128000010d, chk=175
2021.03.27 04:48:57 4: ZL: read got Betriebsstunden (reply code 00de) with data 004e0f003e8900018e05590000002e31128000010d
2021.03.27 04:48:57 4: ZL: sending Ack
2021.03.27 04:48:57 4: ZL: handle queue sends get Ventilation-Levels code: 00cd frame: 07f000cd007a070f and wait for 00ce, V 1.52 - 15.5.2020
2021.03.27 04:48:57 4: ZL: read got Ventilation-Levels (reply code 00ce) with data 0f233b0f23322323020146460000
2021.03.27 04:48:57 4: ZL: sending Ack
2021.03.27 04:48:57 4: ZL: handle queue sends get Status-Vorheizung code: 00e1 frame: 07f000e1008e070f and wait for 00e2, V 1.52 - 15.5.2020
2021.03.27 04:48:57 4: ZL: read got Ack
2021.03.27 04:48:57 4: ZL: read got Status-Vorheizung (reply code 00e2) with data 020000000003
2021.03.27 04:48:57 4: ZL: sending Ack
2021.03.27 04:48:57 4: ZL: handle queue sends get Ventilation-Status code: 000b frame: 07f0000b00b8070f and wait for 000c, V 1.52 - 15.5.2020
2021.03.27 04:48:57 4: ZL: read got Ack
2021.03.27 04:48:57 4: ZL: read got Ventilation-Status (reply code 000c) with data 232306620630
2021.03.27 04:48:57 4: ZL: sending Ack
2021.03.27 04:48:57 4: ZL: handle queue sends get Status-Bypass code: 00df frame: 07f000df008c070f and wait for 00e0, V 1.52 - 15.5.2020
2021.03.27 04:48:57 4: ZL: read got Ack
2021.03.27 04:48:57 4: ZL: read got Status-Bypass (reply code 00e0) with data 00000500050001
2021.03.27 04:48:57 4: ZL: sending Ack
2021.03.27 04:48:57 4: ZL: handle queue sends get Temperaturen code: 00d1 frame: 07f000d1007e070f and wait for 00d2, V 1.52 - 15.5.2020
2021.03.27 04:48:57 4: ZL: read got Ack
2021.03.27 04:48:57 4: ZL: read got Temperaturen (reply code 00d2) with data 4c3a4d523c0f000000
2021.03.27 04:48:57 4: ZL: sending Ack


vielen Dank Gruß,
Zwiebel.

StefanStrobel

Hallo Zwiebel,

da ist ein kaputtes Frame empfangen worden, in dem am Anfang der Daten ein zusätzliches 00 drin steht. Da die Checksumme nur eine echte Summe ist, merkt die das nicht.
Bei der Längenprüfung hatte ich irgendwann mal den Abbruch wegen falscher Länge auskommentiert. Warum auch immer.
Wenn Du in der Funktion InterpretFrame das Kommentarzeichen vor dem return entfernst, dann werden solche Frames wieder abgewiesen.


    # Länge prüfen
    if (unpack ('C', $len) != length($data)) {
        Log3 $name, 4, "$name: read: wrong length: " . length($data) .
            " (calculated) != " . unpack ('C', $len) . " (header)" .
            " cmd=$hexcmd, data=$hexdata, chk=$chk";
        #return;
    }


Ich teste noch ein paar Sachen und posten dann eine neue Version.

Gruss
   Stefan

Zwiebel

Hallo Stefan,

sehr schön! Vielen dank für die schnelle Hilfe!

Gruss
Zwiebel

StefanStrobel

Hallo,

anbei eine neue Version zum Testen.
Es gibt keine neuen Features, aber intern hat sich das Modul stark verändert.
Ich bin gerade dabei, meine Module zu überarbeiten und in eigene Namespaces zu packen.
Feedback ob noch alles funktioniert wäre hilfreich :-)

Gruss / Thanx
   Stefan

Zwiebel

Hallo Stefan,

hab das Modul vor gut einer Stunde ausgetauscht. Schaut gut aus! Die Readings kommen rein, und schauen plausibel aus.

viele Grüße
Zwiebel.

Zwiebel

Hallo Stefan,

ich habe am 7. März FHEM upgedatet. Jetzt habe ich festgestellt das der ComfoAir nicht mehr automatisch gepollt wird.
Die set oder get funktionen gehen problemlos.

viele Grüße,
Zwiebel.

CoolTux

Hallo Stefan,

Es gibt Probleme mit dem Modul und dem Aufruf GetUpdate in InternalTimer. Es wird versucht die Funktion im main Kontext auf zu rufen. Hier ein Patch


--- FHEM/98_ComfoAir.pm 2021-04-06 14:29:30.743085029 +0200
+++ ../98_ComfoAir.pm   2021-04-12 14:33:33.876526752 +0200
@@ -392,7 +392,7 @@ sub DefineFn {
     }
     else {
         $hash->{INTERVAL} = $interval;
-        InternalTimer(gettimeofday()+1, "GetUpdate", $hash, 0);
+        InternalTimer(gettimeofday()+1, "ComfoAir::GetUpdate", $hash, 0);
     }
     Log3 $name, 3, "$name: Defined with device $dev" . ($interval ? ", interval $interval" : '');
     return;
@@ -801,7 +801,7 @@ sub ReadyFn {
sub GetUpdate {
     my ($hash) = @_;
     my $name = $hash->{NAME};
-    InternalTimer(gettimeofday()+$hash->{INTERVAL}, "GetUpdate", $hash, 0)
+    InternalTimer(gettimeofday()+$hash->{INTERVAL}, "ComfoAir::GetUpdate", $hash, 0)
         if ($hash->{INTERVAL});
     
     foreach my $msgHashRef (values %parseInfo) {


Du kannst aber auch
GP_Export( qw(
        Initialize
        GetUpdate
    ));


Und dann

--- FHEM/98_ComfoAir.pm 2021-04-06 14:29:30.743085029 +0200
+++ ../98_ComfoAir.pm   2021-04-12 14:33:33.876526752 +0200
@@ -392,7 +392,7 @@ sub DefineFn {
     }
     else {
         $hash->{INTERVAL} = $interval;
-        InternalTimer(gettimeofday()+1, "GetUpdate", $hash, 0);
+        InternalTimer(gettimeofday()+1, "ComfoAir_GetUpdate", $hash, 0);
     }
     Log3 $name, 3, "$name: Defined with device $dev" . ($interval ? ", interval $interval" : '');
     return;
@@ -801,7 +801,7 @@ sub ReadyFn {
sub GetUpdate {
     my ($hash) = @_;
     my $name = $hash->{NAME};
-    InternalTimer(gettimeofday()+$hash->{INTERVAL}, "GetUpdate", $hash, 0)
+    InternalTimer(gettimeofday()+$hash->{INTERVAL}, "ComfoAir_GetUpdate", $hash, 0)
         if ($hash->{INTERVAL});
     
     foreach my $msgHashRef (values %parseInfo) {


machen



Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Man kann auch über eine Referenz arbeiten


--- FHEM/98_ComfoAir.pm 2021-04-06 14:29:30.743085029 +0200
+++ ../98_ComfoAir.pm   2021-04-12 14:33:33.876526752 +0200
@@ -392,7 +392,7 @@ sub DefineFn {
     }
     else {
         $hash->{INTERVAL} = $interval;
-        InternalTimer(gettimeofday()+1, "GetUpdate", $hash, 0);
+        InternalTimer(gettimeofday()+1, \&GetUpdate, $hash, 0);
     }
     Log3 $name, 3, "$name: Defined with device $dev" . ($interval ? ", interval $interval" : '');
     return;
@@ -801,7 +801,7 @@ sub ReadyFn {
sub GetUpdate {
     my ($hash) = @_;
     my $name = $hash->{NAME};
-    InternalTimer(gettimeofday()+$hash->{INTERVAL}, "GetUpdate", $hash, 0)
+    InternalTimer(gettimeofday()+$hash->{INTERVAL}, \&GetUpdate, $hash, 0)
         if ($hash->{INTERVAL});
     
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

StefanStrobel

Hallo Marko und Zwiebel,

vielen Dank für die Meldung und Analyse.
Da ich schon angefangen habe, das Modul zu überarbeiten, werde ich die Timer-Steuerung auch gleich auf die HTTPMOD::Utils umstellen.
Dann hat sich das Problem erledigt und es werden die gleichen Funktionen wie schon bei Modbus und HTTPMOD verwendet.
Kann aber noch ein par Tage dauern.

Gruss
   Stefan

StefanStrobel

Hallo fhempi,

wie hast Du das ganze denn angeschlossen? läuft parallel noch eine Steuerung oder hat Fhem exklusiven Zugriff auf das Kabel?
000c ist z.B. die Antwort Ventilation-Status, 00d2 sind die Temperaturen (siehe %parseInfo am Anfang des Quellcode).

Gruss
   Stefan

StefanStrobel

Falls jemand schon mal testen möchte ...

Gruss
   Stefan

Edit 26.4.: Anhang gelöscht

Zwiebel

Hallo Stefan,

danke für das umbauen! Hab das Modul vom Forum ausgetauscht. Jetzt werden wieder Werte geliefert.
Aber die Attribute lassen sich nicht setzen.

attr ZL event-min-interval .*:3600
attr ZL event-on-change-reading .*


viele Grüße,
Zwiebel.

StefanStrobel

Zitat von: Zwiebel am 13 April 2021, 20:24:41
Aber die Attribute lassen sich nicht setzen.

attr ZL event-min-interval .*:3600
attr ZL event-on-change-reading .*


vielen Dank, da war noch ein Tippfehler in der Attributsliste. Mit dem Einbau der HTTPMOD::Utils für den Update-Timer kam auch alignTime als neues Attribut mit.
jetzt sollte es gehen.

Gruss
   Stefan

StefanStrobel

Zitat von: fhempi am 13 April 2021, 19:44:10
Warum erwartet Dein Modul:

000c und es kommt tatsächlich 000b
00d2 und es kommt tatsächlich 00d1
00e0 und es kommt tatsächlich 00df

das ist in Ordnung.
Wenn Du in die Parse-Info reinschaust siehst Du:

   "00d2"  =>  { unpack   => "CCCCCCC",
                  name     => "Temperaturen",
                  request  => "00d1", defaultpoll => 1,
                  check    => '($fields[5] & 15) == 15',
...


Der Protokoll-Befehl zur Abfrage der Temperaturen ist 00d1. Das Antwort-Frame verwendet 00d2.

Auch das ? not found im Debug-Log ist normal. Fhemweb fragt mit set ? die möglichen Optionen ab. Die Antwort ist identisch zu einem unbekannten set.

wie häufig kommen denn die Timeouts bei Dir?

Gruss
   Stefan

StefanStrobel

Hallo,

wenn die Timeouts nicht häufiger kommen, dann wird es wohl an irgendwelchen Störungen liegen.
Oft liegt es daran, dass an der Lüftung noch ein Bedienteil oder eine Steuerung angeschlossen ist. Dann kommt sich Fhem damit in die Quere.

Das mit dem get ? oder auch set ? kann ich nicht beeinflussen. Ich kann nur den Log-Eintrag weglassen. Der Aufruf kommt aber von Fhem bzw. Fhemweb an das Modul.

Gruss
   Stefan