Anbindung an openHCAN

Begonnen von GU!DO, 11 Oktober 2017, 10:30:09

Vorheriges Thema - Nächstes Thema

GU!DO

Ich habe die Umwandlung erstmal im Read auf dem physischen Device gemacht. Dann kann ich mir das auch online direkt im Log ausgeben lassen.

Könnten wir die Funktion nicht auch im phys. Modul belassen, und die "entschlüsselten Daten" an das logische übertragen?
1. Werden die Telegramme im physichen empfangen, dann könnten Sie doch dort auch in eine für das logische Device nutzbare Form umgewandelt werden.
2. Werden die Daten des log. Moduls sowieso im physischen wieder "verschlüsselt" und gesendet.

Ich gehe wie folgt vor:
HEX Werte in Dezimal wandeln.
Der Wert an Stelle 10 wird den jeweiligen logischen Devices Zugeordnet: Powerport, Rolladen...
Der Wert an Stelle 11 kann so genommen werden, der entspricht ja der Gruppenummer.
Der Wert an Stelle 12 ist ein Attribut, kann auch so genommen werden, wird aber nicht für alle Devices benötigt.

GU!DO

Hallo Marko,

ich habe mir das mit dem subType mal angesehen. Kannst Du mir verraten, wie ich eine Liste in ein Attr. bekommen.
Dann könnte man den subType auswählen und könnte damit auch die unter Set angezeigten Befehle anpassen lassen.

CoolTux


sub XiaomiFlowerSens_Initialize($) {

    my ($hash) = @_;

    $hash->{SetFn}      = "XiaomiFlowerSens_Set";
    $hash->{GetFn}      = "XiaomiFlowerSens_Get";
    $hash->{DefFn}      = "XiaomiFlowerSens_Define";
    $hash->{NotifyFn}   = "XiaomiFlowerSens_Notify";
    $hash->{UndefFn}    = "XiaomiFlowerSens_Undef";
    $hash->{AttrFn}     = "XiaomiFlowerSens_Attr";
    $hash->{AttrList}   = "interval ".
                            "disable:1 ".
                            "disabledForIntervals ".
                            "hciDevice:hci0,hci1,hci2 ".
                            "batteryFirmwareAge:8h,16h,24h,32h,40h,48h ".
                            "minFertility ".
                            "maxFertility ".
                            "minTemp ".
                            "maxTemp ".
                            "minMoisture ".
                            "maxMoisture ".
                            "minLux ".
                            "maxLux ".
                            "sshHost ".
                            "blockingCallLoglevel:2,3,4,5 ".
                            $readingFnAttributes;


;D  ;D
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

GU!DO

Danke!

Ich hatte es fast genau so, bin nur nicht drauf gekommen, die einzelnen Einträge durch Punkte zu verbinden. >:(

CoolTux

Hast du zufällig aktuelle Versionen der Module das ich mir das mal anschauen kann?
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

GU!DO

ja, habe ich.

Ich habe ein subType für die Deviceauswahl und ein Gruppen Attribut eingefügt und wollte nachher die Pakete zum Versenden aus den Daten "automatisch" generieren lassen.

2 Dinge gefallen mir noch nicht:
1. Wenn der subType geändert wird, muß ich eine Reload des Browsers machen, um die geänderten SET Befehle zu sehen
2. Ich wollte dem Gruppen Attr. eigentlich den namen subGruppe geben, damit die Beiden zusammen aufgelistet werden. Dann bekomme ich jedoch kein Eingabe, sondern ein Auswahlfeld.

Vielleicht hast Du dazu ja noch eine Idee?!?

GU!DO

Hallo Marko,

ich verzweifele hier schon wieder und hoffe, dass Du noch eine Idee hast:

Dieses Paket haben wir bisher an den hcand gesendet:

$data    =  "\x00\x8e\x10\x03\x03\x00\x00\x00\x05\x0a\x46\xb7\xec\x6a\x70\xb7"


Da diese Pakete ja bis auf die Stellen 9-12 immer gleich sind, habe ich folgendes vor:

Ich setzte die Stellen 9-12 in 20_HCAN.pm folgender maßen zusammen:

1. Ich wandle den dezimalen Gruppenwert in hex:

my $gruppe_hex = unpack('H*', pack('c*',AttrVal($name,'Gruppe',00)));


2. Ich schreibe die restlichen 3 Stellen je nach gewähltem Device und Schaltzustand (ON/OFF).
Also z.B. "050b" vor, und "bf" hinter die in hex gewandelte GruppenID und wandle das Ergebnis um:

$nachricht = join "", map { '\x' . $_ } unpack("(A2)*",("050b".$gruppe_hex."bf"));


3. Das Ergebnis (mit print $nachricht) ausgegeben, sieht wie folgt aus:

\x05\x0b\x46\xbf


4. Dieses übergebe ich mit IOWrite an 10_HCAN_hcand.pm in die Variable $nachricht.

5. Dort will ich es mit den statischen Bestandteilen zusammensetzten:

$data = "\x00\x8e\x10\x03\x03\x00\x00\x00".$nachricht."\xec\x6a\x70\xb7";


Das Ergenis sieht dann jedoch in etwas wie folgt aus:

����\x05\x0b\x46\xbf�jp�

Die statischen Bestandteile vor und hinter dem von mir erzeugten Teil werden anscheinend als Binär interprätiert?!?
Der generierte Teil aber als String?!?

Fällt Dir dazu was ein???

CoolTux

Hallo Guido

Ich würde erst den String in der WriteFn zusammensetzen und das umwandeln in Hex erst kurz vor dem Absenden machen. Ich bilde mir ein das es anders nicht geht.


Bist Du Dir sicher das wirklich bei allen Installationen von HCAN auf der Welt nur die Stelle 9-12 unterschiedlich ist?
Das mit Deinem zusammensetzen muss ich mir anschauen. Bin leider aktuell zeitlich etwas eingespannt. Aber wie gesagt ich würde das umwandeln ganz zum Schluss kurz vor dem Senden erst machen.



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

Habe mir gerade Deine Files angeschaut. Nicht böse sein, hatte gehofft das Du schon weiter bist. Da fehlt ja doch so einiges. Ich will da jetzt nichts versprechen aber eventuell finde ich morgen etwas Zeit über den Tag.
Wenn du jetzt noch aktuellere Versionen hast häng sie bitte Mal an.



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

GU!DO

So, ich habe es jetzt folgendermaßen umgestellt.

1. Ich generiere im log Device eine Zeichenfolge, die den hex Wert für die Stellen 9-12 darstellt und übergebe diese an das physische Device.
   Die Zeichenfolge kommt dann so im phys. Dev. an:
050b46bf

2. Im phys. Dev. Setze ich das Ganze für folgt zusammen:

print $nachricht = "008e100303000000".$nachricht."ec6a70b7";


Ergebnis:

008e100303000000050b46bfec6a70b7


3. ich wandele den String um:

print my $nachricht = join "", map { '\x' . $_ } unpack("(A2)*",($nachricht));


Ergebnis:

\x00\x8e\x10\x03\x03\x00\x00\x00\x05\x0b\x46\xbf\xec\x6a\x70\xb7


Das Entspricht exakt dem, was wir in der alten Übergabe hatten:

$data    = "\x00\x8e\x10\x03\x03\x00\x00\x00\x05\x0b\x46\xb7\xec\x6a\x70\xb7";


Leider habe ich das gleiche Problem, das wir hatten, als wir den String noch nicht mit Doublequotes eingeschlossen hatten.

TCP-Dump meldet statt der erforderlichen 16 Bit in 64 Bit großes Paket.

Hab schon gefühlte 1000 Varianten probiert, leider bisher ohne Erfolg...

Noch `ne Idee?

GU!DO

Nee Nee, ich bin natürlich nicht böse. Bin ja froh über Deine Hilfe.

Das Problem ist, ich hatte vorher noch nie was mit Perl zu tun und FHEM kenne ich auch erst seit meinem ersten Post in diesem Fred.

Außerdem muß ich ja zwischendrurch auch noch arbeiten und Kinder hüten...

CoolTux

Guten Morgen,

Das verstehe ich, war mein Fehler. Da hatte ich endlich mal Zeit und wollte schnell Dispatcher und ID Zuweisung machen und dann fehlte das drum Rum, da war ich etwas hilflos. Sorry.
Lass uns einfach in Ruhe weiter machen eilt ja nicht.
Aber noch mal zu meiner Frage, in der ganzen Welt auf HCAN Systemen ändert sich nur Stelle 9-12? Am Ende soll das ja nicht nur bei Dir laufen  ;D


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

GU!DO

ZitatLass uns einfach in Ruhe weiter machen eilt ja nicht.
Na ja  ;)

ZitatAber noch mal zu meiner Frage, in der ganzen Welt auf HCAN Systemen ändert sich nur Stelle 9-12?

Soweit ich es absehen kann, würde ich sagen ja. In "hcan-protocol.xml" sind alle Nachrichten des Busses augeführt, und die werden wie folgt abgebildet:
Stelle 9 - Nachrichtengruppe
Stelle 10 Nachricht
Stelle 11 Device-Gruppe
Stelle 12 Attrribut u.B. 100% bei Rolladen

Hast Du denn eine Idee bzgl. der Hex Konvertiereung aus meinem vorherigen Post???

CoolTux

Bis jetzt noch nicht. Aber ich kann Dir sagen das ich aktuell an den Modulen sitze. Bin gerade dabei die Übergabe vom physischen zum logischen Modul zu machen und das erstellen unser wie ich sie jetzt nenne hcan_id


Was mir auf fällt. Ich weiß nicht wie viel Du bisher so programmiert hast, aber lass mich versuchen ein paar Worte zu sagen vielleicht hilft es Dir.


Eine Funktion sollte immer nur das machen wo für sie da ist und benannt wurde.
Wenn Du also zum Beispiel eine Funktion Read hast und sie dafür da ist Daten von einem Device ein zu lesen dann ist das höhste der Gefühle was die Funktion noch macht zu prüfen ob die Daten tatsächlich angekommen und valide sind. Mehr nicht. Alles andere macht eine weitere Funktion.
Eine Funktion sollte in der Regel nie mehr wie 50 Zeilen Code haben, dient der besseren Übersicht.
Wenn Du innerhalb einer Funktion funktionale Erweiterungen brauchst (beispiel das raus finden eines Devicetypes anhand eines Teilstrings Deiner Daten) dann lagerst Du das in eine weitere Funktion aus und lässt Dir das Ergebnis beim Aufruf gleich zurückgeben und in eine Variable lesen.

my $devType = HCAN_determineDeviceType($hash,$stringpart);


Du musst versuchen etwas mehr Struktur in Deinen Code zu bekommen. Zu mindest am Ende. Oder wenn jemand Dir helfen soll  ;D

Im Moment kann ich nicht erkennen wo Du hin willst, daher schreibe ich meinen Code einfach nur an passender Stelle und hoffe das Du dann erkennst was er macht und wie Du ihn mit Deinen Teilen korrekt verbindest.

Desweiteren habe ich ein zwei Beispiel als Kommentar eingetragen wie Du Deinen HEX String besser und Systemschonender zerlegen und bearbeiten kannst.



Also wie gesagt ich sitze aktuell dran.




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

Testen konnte ich es leider nicht.
Aber ich empfehle Dir eh erstmal zu verstehen was der Code macht und den Code ein wenig zu analysieren




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