Eurotronic comet blue Modul Entwicklung

Begonnen von gent, 28 November 2016, 21:45:59

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: MaD86 am 02 November 2018, 19:31:25
liegt im selben Verzeichnis wie "fhem-5.8.deb". Hat mit der ersten Version auch von da aus funktioniert.
Ziehe per FileZilla rüber, hat auch nach Überschreiben gefragt.
Wenn ich sie über FileZilla zum bearbeiten herunterlade steht auch 0.1.99 drin.

fhem-5.8.deb ist doch ein Debian Packet, das kann doch überall liegen.
Das Modul muss unter /opt/fhem/FHEM liegen, da wo die anderen pm Dateien auch liegen.
Vielleicht mal den ganzen Computer neu starten.
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

MaD86

Sehr schön, endgültig zum Trottel gemacht...

Version passt dann jetzt auch, aber Anzeigen bleiben bei 0. Get temperatures ergibt

2018.11.02 20:25:00 4: CometBlueBTLE (Heizung) - Run CreateParamGatttool with mod: read
2018.11.02 20:25:00 5: CometBlueBTLE (Heizung) - Noch in Queue nach pop: 0
2018.11.02 20:25:00 4: CometBlueBTLE (Heizung) - CreateParamGatttool erstes if
2018.11.02 20:25:00 4: CometBlueBTLE (Heizung) - Read CometBlueBTLE_ExecGatttool_Run Heizung|9A:3A:33:86:F0:09|read|0x18
2018.11.02 20:25:00 4: CometBlueBTLE (Heizung) - ExecGatttool_Run: call gatttool with command gatttool -i hci0 -b 9A:3A:33:86:F0:09 --char-write-req -a 0x48 -n 00000000 2>&1 /dev/null and loop 0
2018.11.02 20:25:02 5: CometBlueBTLE (Heizung) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully

2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ExecGatttool_Run: gatttool result Characteristic value was written successfully

2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ExecGatttool_Done: gatttool return string: Heizung|9A:3A:33:86:F0:09|ok|write|0x48|HASH(0x3049548)
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - Run CreateParamGatttool with mod: read
2018.11.02 20:25:02 5: CometBlueBTLE (Heizung) - Noch in Queue nach pop: 0
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - CreateParamGatttool zweites if
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - Read CometBlueBTLE_ExecGatttool_Run Heizung|9A:3A:33:86:F0:09|read|0x18
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ExecGatttool_Run: call gatttool with command gatttool -i hci0 -b 9A:3A:33:86:F0:09 --char-read -a 0x18 2>&1 /dev/null and loop 0
2018.11.02 20:25:02 5: CometBlueBTLE (Heizung) - ExecGatttool_Run: gatttool loop result Characteristic value/descriptor,30 2e 30 2e 31 30

2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ExecGatttool_Run: gatttool result Characteristic value/descriptor,30 2e 30 2e 31 30

2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ExecGatttool_Done: gatttool return string: Heizung|9A:3A:33:86:F0:09|ok|read|0x18|HASH(0x3049548)
2018.11.02 20:25:02 3: CometBlueBTLE (Heizung) - ExecGatttool_Done: JSON error while request: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "HASH(0x3049548)") at ./FHEM/74_CometBlueBTLE.pm line 633.

2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ProcessingNotification
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ProcessingNotification: handle 0x18 - Noch in Queue: 0
2018.11.02 20:25:02 5: CometBlueBTLE (Heizung) - ProcessingNotification: handle 0x18
2018.11.02 20:25:02 3: CometBlueBTLE (Heizung) - handle 0x18
2018.11.02 20:25:02 5: CometBlueBTLE (Heizung) - WriteReadings: Reading firmware, value  altes value
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - WriteReadings: Readings were written

CoolTux

Sehr seltsam. Kannst Du bitte die Pin mit der App am Thermostat mal auf 0 setzen
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

MaD86

Die PIN steht auf 0. Er schafft es ja auch, die desired-temp zu setzen.

CoolTux

OK ich schaue mir das die Tage noch mal Ruhe an.
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

mokeo

Hallo zusammen,

zuerst mal vielen Dank an CoolTux für die Arbeit an diesem Modul.
Ich habe das selbe Problem wie MaD86 gehabt.
Zitat von: MaD86 am 02 November 2018, 20:27:30
2018.11.02 20:25:02 4: CometBlueBTLE (Heizung) - ExecGatttool_Done: gatttool return string: Heizung|9A:3A:33:86:F0:09|ok|read|0x18|HASH(0x3049548)
2018.11.02 20:25:02 3: CometBlueBTLE (Heizung) - ExecGatttool_Done: JSON error while request: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "HASH(0x3049548)") at ./FHEM/74_CometBlueBTLE.pm line 633.

Dieser Fehler tritt bei mir immer nach einem Neustart auf.
Ein reload 74_CometBlueBTLE.pm bringt dann meist Abhilfe.
Da das aber keine sinnvolle Lösung sein kann, habe ich mich daraufhin ein wenig mit dem Quellcode befasst, auch wegen einiger anderer Probleme.
Folgende Dinge sind mir dabei aufgefallen:
Der beschriebene Effekt, dass im gatttoll return string ein HASH(0x<Zahl>) auftaucht und darauf folgend der json Fehler, liegt im Aufruf der sub CometBlueBTLE_encodeJSON begründet.
Dise scheint beim ersten Aufruf des Moduls eine Hash-Referenz statt einem Hash-Wert zurückzuliefern.
Warum das durch einen reload des Moduls (teilweise) behoben wird ist mir nicht klar...
Als quick and dirty workaround habe ich die sub mal umgangen und der Fehler ist behoben:
Zeile 567, Diff:
-        $json_notification = CometBlueBTLE_encodeJSON($gtResult[1]);
+        # $json_notification = CometBlueBTLE_encodeJSON($gtResult[1]);
+        chomp($gtResult[1]);
+        $json_notification = qq[{"gtResult":"$gtResult[1]"}];

Das müsste man natürlich in Zeile 590 in ähnlicher Form wiederholen.

Dann hätte ich noch ei paar weitere Korrekturen anzubieten:
In der Berechnung der Pin ist ein Fehler enthalten:
Zeile 974, Diff:
-    return '00000000' if( $pin =~ /^0/ );
+    # return '00000000' if( $pin =~ /^0/ );
-    $hex = sprintf('0x%2x',$hex);
+    $hex = sprintf('%08x',$hex);

Das Auslesen der Temperaturlisten enthält einen Fehler, der auch von Ludwich in einem anderen Thread beschrieben wurde https://forum.fhem.de/index.php/topic,85036.msg804075.html#msg804075
Zeile 844+, aus diesem Block:
        ### Berechnung Stunden
        if( hex("0x".$tempList[$i])*10/6 < 100 ) {
            $hour = '0'.substr(hex("0x".$tempList[$i])*10/6,0,1);
        } elsif( hex("0x".$tempList[$i])*10/6 > 99 ) {
            $hour = substr(hex("0x".$tempList[$i])*10/6,0,2);
        }

        ### Berechnung Minuten
        if( hex("0x".$tempList[$i])*10/6 == 0 or (hex("0x".$tempList[$i])*10/6) =~ /^[1-9]0$/ ) {
            $min = '00';
        } elsif( int(hex("0x".$tempList[$i])*10/6) == hex("0x".$tempList[$i])*10/6 and hex("0x".$tempList[$i])*10/6 > 0 and hex("0x".$tempList[$i])*10/6 < 100 ) {
            $min = int(substr(hex("0x".$tempList[$i])*10/6,1)/10*60+0.5);
        } elsif( int(hex("0x".$tempList[$i])*10/6) == hex("0x".$tempList[$i])*10/6 ) {
            $min = int(substr(hex("0x".$tempList[$i])*10/6,2)/10*60+0.5).'0';
        } elsif( int(hex("0x".$tempList[$i])*10/6) != hex("0x".$tempList[$i])*10/6 and hex("0x".$tempList[$i])*10/6 > 99 ) {
            $min = int(substr(hex("0x".$tempList[$i])*10/6,2)/10*60+0.5);
        } elsif( int(hex("0x".$tempList[$i])*10/6) != hex("0x".$tempList[$i])*10/6 and hex("0x".$tempList[$i])*10/6 < 100 ) {
            $min = int(substr(hex("0x".$tempList[$i])*10/6,1)/10*60+0.5);
        }

wird
        ### Berechnung Stunden, Minuten
        ### es kommt vor dass leere Felder mit FF gefuellt sind, als 00 interpretieren
        if ( hex("0x".$tempList[$i]) == 255 ) {
            $hour = '00';
            $min = '00';
        } else {
            $hour = sprintf ("%02s", int(hex("0x".$tempList[$i])/6));
            $min = sprintf ("%02s", hex("0x".$tempList[$i])%6*10);
        }

Mit diesen Änderungen habe ich bei mir zunächst die auslesenden Funktionen am laufen.

CoolTux

Hallo Mokeo,

Vielen Dank für Deine Patches. Ich schaue es mir die Tage sehr gerne an.
Das mit der json sub verstehe ich so nicht ganz aber eventuell kann ich das näher einkreisen. Gibt ja nun Dank Dir einen Ansatz.


Grüße
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

Ich hab eine neue Version ins Git geladen.
Habe einiges geändert. Unter anderem den Code von mokeo eingepflegt.
Vielen lieben Dank dafür

Ich würde alle bitten weitere Fragen im entsprechenden Modulthread zu stellen und zu diskutieren.
https://forum.fhem.de/index.php/topic,85036.0.html


Grüße
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

mokeo

Ich weiss, dass es eigentlich in dem anderen Thread weitergehen soll.
Da aber in diesem Thread die Frage aufkam und ich evtl. einen Beitrag dazu leisten kann, mach ich hier weiter.

Zitat von: CoolTux am 19 Januar 2018, 17:35:13
Also kann man am Thermostat auf Auto und auf Manual stellen? Das muß ja auch irgendwo wieder zu finden sein in unseren gatt Daten
Informationen zu dem noch fehlenden Status habe ich in folgendem Github Repository gefunden:
https://github.com/xrucka/cometblue

Dort gibt es in https://github.com/xrucka/cometblue/blob/master/cometblue/device.py die Abfrage der
UUID 47e9ee2a-47e9-11e4-8939-164230d1df67, die bei meinem Cometblue dem handle 0x03d entspricht.
handle: 0x003c, char properties: 0x0a, char value handle: 0x003d, uuid: 47e9ee2a-47e9-11e4-8939-164230d1df67

Die Rückgabewerte des Pythonprogramms sind folgende:
Temperature satisfied
Child-lock
Manual mode
Adapting
Not ready
Motor moving ,Install procedure running
Antifrost active
Low battery alert

Setzen kann an die Werte:
Child-lock
Manual mode
Adapting

Vielleicht kann mit diesen Informationen das Modul noch erweitert werden.

CoolTux

Hast Du das schon mal abgerufen?
Bei mir kommt da
00 00 08
damit kann ich erstmal so leider nichts anfangen. Ist bisschen wenig für all die Werte.
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

mokeo

Das sind immerhin 6 Bytes, da kann man eine Menge Informationen unterbringen  :)
Die genaue Decodierung müsste man sich wohl aus dem Pythonscript rauspuzzlen  :-\


mokeo

Ich hab da noch was aus der Python-Vorlage herausgearbeitet:
Folgende Script kannst du zum Testen und als Ansatz zur Integration in das Modul verwenden:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
my $hci="hci0";
my $mac="5C:31:3E:xx:xx:xx";
my $pin="00000000";
my $handle="0x3d";
my $cmd;
my @gtResult;
my $status;
my %statusBitMask = (
    'childlock' => 0x80,
    'manual_mode' => 0x1,
    'adapting' => 0x400,
    'not_ready' => 0x200,
    'installing' => 0x400 | 0x200 | 0x100,
    'motor_moving' => 0x100,
    'antifrost_activated' => 0x10,
    'temperature_satisfied' => 0x80000,
    'low_battery' => 0x800
);

qx(gatttool -i $hci -b $mac --char-write-req -a 0x47 -n $pin);
$cmd = "gatttool -i $hci -b $mac --char-read -a $handle";
@gtResult = split( ": ", qx($cmd) );
# print "read value: " . $gtResult[1];
$status = join("", reverse split(" ", $gtResult[1]));
print $status . "\n";
my $revstdec = sprintf("%d", hex($status));
# print $revstdec ."\n";
keys %statusBitMask;
while(my($k, $v) = each %statusBitMask) {
my $bit;
if ($revstdec & $v) {
$bit = "true";
} else {
$bit = "false";
}
print $k . " - " . $bit ."\n";
};


Das ist zunächst eine Übersetzung der Lesefunktion.
Die möglichen zu setzenden Werte sind wie schon gesagt Child-lock, Manual mode und Adapting, wobei letzterer bei mir nicht funktioniert hat und eigentlich auch wenig sinnvoll ist.
Die zu schreibenden Werte auf das Handle 0x3d sind:
manual mode on: 010000
child lock on: 800000
adapting: 000400
geht auch kombiniert: manual und child mode: 810000
Rücksetzen der jeweiligen werte geht mit einer 0 an der passenden Stelle.
Senden von 000000 löscht alle Modi.

Ich habe das Ganze wie gesagt aus einem Github entnommen, einige der gelesenen Werte sind mir noch nicht ganz nachvollziehbar bzw. schlecht zu testen.
Testen konnte ich den Manuellen Modus, die Kindersicherung und die Werte not_ready und antifrost_activated.
Nicht ganz klar ist mir der Wert temperature_satisfied, da bekam ich nicht immer klare Ergebnisse.

Vielleicht noch als zusätzliche Information: Ich habe die Cometblue mit Firmware 0.0.4.

Hoffe, du kannst damit was anfangen... ;)

mokeo

Die Uhrzeit der Regler zu setzen fänd ich auch ganz brauchbar:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;

use DateTime;

my $hci="hci0";
my $mac="5C:31:3E:xx:xx:xx";
my $pin="00000000";
my $handle="0x1d";
my $cmd;
my @gtResult;
my ($minhex, $hourhex, $dayhex, $monthhex, $yearhex);
my $datestring;

qx(gatttool -i $hci -b $mac --char-write-req -a 0x47 -n $pin);
$cmd = "gatttool -i $hci -b $mac --char-read -a $handle";
@gtResult = split( ": ", qx($cmd) );
print "read value: " . $gtResult[1];

# decode
($minhex, $hourhex, $dayhex, $monthhex, $yearhex) = split(" ", $gtResult[1]);
$datestring=sprintf("%02d.%02d.%04d %02d:%02d", hex($dayhex), hex($monthhex), hex($yearhex)+2000, hex($hourhex), hex($minhex));
print "decoded   : ".$datestring."\n";

# encode
my $dt = DateTime->now(time_zone=>'local');
$minhex    = sprintf("%02x", $dt->minute());
$hourhex   = sprintf("%02x", $dt->hour());
$dayhex    = sprintf("%02x", $dt->day());
$monthhex  = sprintf("%02x", $dt->month());
$yearhex   = sprintf("%02x", $dt->year()-2000);
my $gattstring=join(" ", $minhex, $hourhex, $dayhex, $monthhex, $yearhex);
# testausgabe
print "gattstring: ".$gattstring."\n";
$datestring=sprintf("%02d.%02d.%04d %02d:%02d", hex($dayhex), hex($monthhex), hex($yearhex)+2000, hex($hourhex), hex($minhex));
print "datestring: ".$datestring."\n";

CoolTux

Das wird aber dauern. Bin aktuell ausgelastet.
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

Zitat von: mokeo am 11 November 2018, 05:59:51
Ich hab da noch was aus der Python-Vorlage herausgearbeitet:
Folgende Script kannst du zum Testen und als Ansatz zur Integration in das Modul verwenden:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
my $hci="hci0";
my $mac="5C:31:3E:xx:xx:xx";
my $pin="00000000";
my $handle="0x3d";
my $cmd;
my @gtResult;
my $status;
my %statusBitMask = (
    'childlock' => 0x80,
    'manual_mode' => 0x1,
    'adapting' => 0x400,
    'not_ready' => 0x200,
    'installing' => 0x400 | 0x200 | 0x100,
    'motor_moving' => 0x100,
    'antifrost_activated' => 0x10,
    'temperature_satisfied' => 0x80000,
    'low_battery' => 0x800
);

qx(gatttool -i $hci -b $mac --char-write-req -a 0x47 -n $pin);
$cmd = "gatttool -i $hci -b $mac --char-read -a $handle";
@gtResult = split( ": ", qx($cmd) );
# print "read value: " . $gtResult[1];
$status = join("", reverse split(" ", $gtResult[1]));
print $status . "\n";
my $revstdec = sprintf("%d", hex($status));
# print $revstdec ."\n";
keys %statusBitMask;
while(my($k, $v) = each %statusBitMask) {
my $bit;
if ($revstdec & $v) {
$bit = "true";
} else {
$bit = "false";
}
print $k . " - " . $bit ."\n";
};


Das ist zunächst eine Übersetzung der Lesefunktion.
Die möglichen zu setzenden Werte sind wie schon gesagt Child-lock, Manual mode und Adapting, wobei letzterer bei mir nicht funktioniert hat und eigentlich auch wenig sinnvoll ist.
Die zu schreibenden Werte auf das Handle 0x3d sind:
manual mode on: 010000
child lock on: 800000
adapting: 000400
geht auch kombiniert: manual und child mode: 810000
Rücksetzen der jeweiligen werte geht mit einer 0 an der passenden Stelle.
Senden von 000000 löscht alle Modi.

Ich habe das Ganze wie gesagt aus einem Github entnommen, einige der gelesenen Werte sind mir noch nicht ganz nachvollziehbar bzw. schlecht zu testen.
Testen konnte ich den Manuellen Modus, die Kindersicherung und die Werte not_ready und antifrost_activated.
Nicht ganz klar ist mir der Wert temperature_satisfied, da bekam ich nicht immer klare Ergebnisse.

Vielleicht noch als zusätzliche Information: Ich habe die Cometblue mit Firmware 0.0.4.

Hoffe, du kannst damit was anfangen... ;)

Kannst Du mir bitte ein Beispielstring für $status geben?
$status = join("", reverse split(" ", $gtResult[1]));

wäre das tatsächlich 000008. Kommt mir irgendwie unlogisch vor.
my $revstdec = sprintf("%d", hex($status));
wäre dann ja 8 einfahc nur 8
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