Anbindung an openHCAN

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

Vorheriges Thema - Nächstes Thema

GU!DO

Hallo Marko,

Klasse, vielen Dank!

Ich habe das Programmieren leider nie wirklich gelernt. Zumindest was prozedurale geschweige denn objektorientierte Programmierung angeht.
Lediglich Assembler / Maschinensparche für Microcontroller hab ich während der Meisterschule beigebracht bekommen.

Alle anderen Sprachen habe ich mir selbst beigebracht. Leider keine soweit, dass ich sie flüssig schreiben könnte. Dafür fehlte leider immer die Zeit.
Ich habe immer mal wieder das ein oder andere Projekt realisiert. Inkl. einer Warenwirtschaft für den Betrieb meiner Eltern.

An die Aufteilung der Funktionen habe ich mich, so wie du sie beschreibst, noch nie gehalten. Ich habe immer eine Funkttion erstellt, wenn ich einen Programmteil mehrfach verwenden mußte. Kann das aber gern ändern. Bin ja für jeden Tip dankbar.

Bei mir brennt grad die Luft. Zudem muß ich gleich noch zu einem Kunden raus.

Werde das ganze auf jeden Fall nachher noch testen, und melde mich.

Vielen vielen Dank erstmal

Guido

GU!DO

Hallo Marko,

nochmals vielen Dank für Deine Arbeit!

Sorry für die späte Rückmeldung. Ich hatte gestern und heute wiedererwarten viel um die Ohren, und bin nur sporadisch dazu gekommen weiter zu machen.
Ich habe noch einige Dinge anpassen müssen, aber nun läuft es.

Ist wirklich toll: Schalter betätigen - Neues Device ist angelegt!

Zwei Dinge, die ich geändert u.a. habe - schau bitte mal, ob das  in Deinem Sinne ist:
- Ich lösche den Inhalt des PARTIAL Eintrages auch wenn ParseMessage 0 zurück  gibt. (Sonst lief der HASH voll).
- Ich kürze den HEX String direkt bei der Zuweisung im Read auf die entscheidenen 8 Stellen. (Dann werden die IDs übersichtlicher.)

Zur Zeit werden die Devices noch mehrfach angelegt.
Das liegt daran, dass ein Device auf mehrere verschiedene Nachrichten reagiert. (2. Hex der 4) Somit haben wir für ein Device verschiedene IDs.
Ich muß die IDs filtern, und in Gruppen zusammenfassen, damit entschieden werden kann, was zusammen gehört.

Ich könnte dazu die 2. Stelle durch einen gemeinsamen Wert ersetzten. z.B. Alle Powerport Nachrichten haben dezimale Nummern zwischen 10 und 19:
"POWER_GROUP_ON" id="10"    Bei Powerport Gruppe 70 = 05 0a 46
"POWER_GROUP_OFF" id="11"  Bei Powerport Gruppe 70 = 05 0b 46
Wenn ich nun in der ID die 2. Hex Zahl für Powerport durch 10 ersetzte, hätte der Powerport mit der Gruppe 70 immer 05 0a 46

Die frage ist nur, wie transportiere ich dann den Befehl z.B.POWER_GROUP_ON/OFF. Der ist ja dann nicht mehr in der ID enthalten.

Das beste wird sein, wenn ich ihn direkt in ein Reading schreibe - oder?

Wo soll ich die Auswertung starten? Als Funktion die aus _Parse aufgerufen wird?!?

Vielen Dank nochmals

Guido

CoolTux

Hallo Guido,

Freut mich das Du erste sichtbare Erfolge von Deinen Bemühungen siehst. Das ist immer ja auch wichtig sonst wird es schnell frustrierend.
Ich Antworte Dir morgen ausführlich. Jetzt gönne ich mir ein Eis und schaue noch kurz StarTrek.



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

Na dann, guten Appetit.
Wie kann man denn *kurz* Startrack schauen?!?

GU!DO

OK. War gestern wohl doch schon zu spät für mich.
Als ich die Frage nach *kurzen* Startrack Filmen gestellt habe, war ich gedanklich bei StarWars und da gibts IMHO nicht viel unter 2 Std. länge...

CoolTux

Guten Morgen,

Ich hatte die neuste Serie geschaut. Folge 5 und 6.
Deine Fragen schaue ich mir nachher in Ruhe 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 in der Zwischenzeit nochmals über meine Fragen gegrübelt, und werde er erstmal so angehen:

Das logische Device mit Nachrichten zu nerven, die es nicht weiterverarbeiten muß, ist IMHO Unsinn. (Erklärung warum überflüssige Nachrichten siehe meinen Fragen-Fred)

Daher werde ich schon in: HCAN_hcand_ParseMessage folgendes machen:

Ausgangspunkt: "POWER_GROUP_ON" id="10"    Bei Powerport Gruppe 70 Entspricht das:

05 0a 46 (00) letzter Wert bei Powerport-Telegramm ungenutzt


Übergeben werde ich mittels Dispatch:

Powerport70-ON

Das sagt dann alles aus.


Im 20_hcan.pm _Parse wird es  dann aufgelöst zu:
Zitat
hcan_id = Powerport70 => Das ist dann für einen User bei Device-Neuanlage nicht mehr so cryptisch
Reading state = ON

Folgende Fragen habe ich trotzdem noch:
Wenn ich es richtig sehe, legt  FHEM bei return UNDEFINED im _Parse selbstständig ein neues Device an.
Zu diesem Zeitpunkt kenne ich schon die Attribute subType ,Gruppe und außerdem das Reading status.
Wie kann ich diese bei einem neu angelegten Device setzen?


Wenn ich z.B. im Büro alle Raffstores schließen möchte, sende ich eine entsprechende Nachricht die Gruppe 60.
Wenn ich dann eins der 4 Raffstores z.B. wieder öffnen möchte, sende ich je nach dem welches ich öffnen möchte eine Nachricht an die 61,62,63 oder 64.
Das funktioniert, da man bei allen HCAN-Devices bis zu 5 Gruppen eintragen kann.
Wie können wir das am besten abbilden?

Eine Möglichkeit wäre, im HCAN_hcand_ParseMessage eine "Sammelgruppe wie z.B. 60" in die Devicegruppen hier also 61,62,63,64 zu zerlegen, und dementsprechend X Nachrichten zu senden.
evtluelle Probleme:
1. Die Sammelgruppen im HCAN müssen nicht so strukturiert sein wie bei mir.
2. Des weiteren habe ich eine Sammelgruppe für jede Himmelsrichtung. Also Raffstore schließen an Gruppe 98 würde alles auf der Südseite herunterfahren.
    Außerdem noch ein für das Geschoss. Also z.B. Alle EG Raffstore schließen.
    Und Last but not Least noch eine Gruppe für die Wand im Raum. Also z.B. Esszimmer Straßenseite schließen.
3. D.h. es können aus einer Busnachricht, bei Teilung in Einzelnachrichten schnell mal 20 Einzenachrichten (z.B. alle Raffstores im EG) an den Dispatcher übergeben werden.

Die beste Möglichkeit wäre IMHO, dass der User eine externe Datei anlegt, die seine Gruppenzurodnungen wiederspiegelt. Die könnte dann im 10_HCAN.pm eingelesen werden.
Bleibt dann aber noch die Frage, wie FHEM mit einer Welle von z.B. 20 Nachrichten fertig wird.?!?
Bzw. was passiert, wenn während der Abarbeitung weitere Nachrichten vom Bus kommen?!?

Alternativ könnte man natürlich auch jedem einzelnen Device seine spezifische ID geben und die Gruppen in FHEM bilden. Das hätte dann jedoch den gravierenden Nachteil, dass HCAN nicht mehr autark betrieben werden kann. Wenn also der FHEM Server stirbt, hätte ich ein Problem.

CoolTux

Du kannst doch subType und Gruppe im Define mitgeben  :)
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

Aber wie bekomme ich die Werte dorthin?

FHEM das Device anlegt, habe ich ja noch keinen hash, in dem ich sie ablegen kann?!?

Oder hab ich grad 'n Brett vorm Kopf???

CoolTux


my $hcanid = substr($message,19,22));
my $subType = ???
my $Gruppe = ???

if( defined($hcanid) ) {

        if( my $hash                = $modules{HCAN}{defptr}{$hcanid} ) { 
            my $name                = $hash->{NAME};
                       
            HCAN_WriteReadings($hash,$message);
            Log3 $name, 3, "HCAN ($name) - find logical device: $hash->{NAME}";
                       
            return $hash->{NAME};
           
        } else {
           
            Log3 $name, 3, "HCAN ($name) - autocreate new device HCANDevice$hcanid with HCAN_ID $hcanid and IODev IODev=$name";
            return "UNDEFINED HCANDevice$hcanid HCAN $hcanid $subTyte $Gruppe IODev=$name";
        }
    }


Du musst natürlich innerhalb der Parse dann entsprechend die Variablen subType und $Gruppe füllen.
Ausserdem musst Du noch die DefineFn anpassen
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

... war heute mal wieder etwas chaotisch, daher hab ich noch nix geschafft.

Wenn ich innerhalb von _Parse Variablen fülle, sind die doch für die "nächste" Funktion nicht mehr zugänglich?!? Oder soll ich globale Variablen anlegen?
_________________________________________________________________________________________________________________________________________

Sag mir doch bitte noch was Du zu meiner 2. Frage meinst. Ich hoffe nämlich, dass ich morgen bei Zeiten anfange, und zumindest bis annähernd Mittag durchziehen kann:

Wenn ich z.B. im Büro alle Raffstores schließen möchte, sende ich eine entsprechende Nachricht die Gruppe 60.
Wenn ich dann eins der 4 Raffstores z.B. wieder öffnen möchte, sende ich je nach dem welches ich öffnen möchte eine Nachricht an die 61,62,63 oder 64.
Das funktioniert, da man bei allen HCAN-Devices bis zu 5 Gruppen eintragen kann.
Wie können wir das am besten abbilden?

Eine Möglichkeit wäre, im HCAN_hcand_ParseMessage eine "Sammelgruppe wie z.B. 60" in die Devicegruppen hier also 61,62,63,64 zu zerlegen, und dementsprechend X Nachrichten zu senden.
evtluelle Probleme:
1. Die Sammelgruppen im HCAN anderer User können völlig anders strukturiert sein als meine. Es muß also ein für den User konfigurierbares System sein.
2. Des weiteren habe ich eine Sammelgruppe für jede Himmelsrichtung. Also Raffstore schließen an Gruppe 98 würde alles auf der Südseite herunterfahren.
    Außerdem noch ein für das Geschoss. Also z.B. Alle EG Raffstore schließen.
    Und Last but not Least noch eine Gruppe für die Wand im Raum. Also z.B. Esszimmer Straßenseite schließen.
    D.h. es können aus einer Busnachricht, bei Teilung in Einzelnachrichten schnell mal 20 Einzelnachrichten (z.B. alle Raffstores im EG) an den Dispatcher übergeben werden.

Die beste Möglichkeit wäre IMHO, dass der User eine externe Datei anlegt, die seine Gruppenzurodnungen wiederspiegelt. Die könnte dann im 10_HCAN.pm eingelesen werden um aus der Sammelgruppe, die einzelnen Devices anzusprechen.

Bleibt dann aber noch die Frage, wie FHEM mit einer "Welle" von z.B. 20 Nachrichten fertig wird.?!?
Bzw. was passiert, wenn während der Abarbeitung weitere Nachrichten vom Bus kommen?!?

Alternativ könnte man natürlich auch jedem einzelnen Device seine spezifische ID geben und die Gruppen in FHEM bilden. Das hätte dann jedoch den gravierenden Nachteil, dass HCAN nicht mehr autark betrieben werden kann. Wenn also der FHEM Server stirbt, hätte man ein Problem.

CoolTux

Die Variablen sind dann nicht mehr zugänglich, das stimmt. Aber wohl deren Inhalt.

Das was ich mit dem define geschrieben habe ist doch nichts weiter als wenn Du ein define in der Commandline machst.


Was hälst Du davon wenn Du einfach noch ein weiteres logisches Device für Gruppen machst. So kannst Du dann eine Gruppen ID senden
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

Es geht mir weniger ums senden, sondern viel mehr ums Empfangen.

Bleiben wir im Büro. 4 Raffstores. IDs die in den HCAN-Device gespeichert sind: jeweils 61,62,63,64 alle gemeinsam haben, die 60 eingetragen.

Um richtig zu Visualisieren, müsste ich 4 FHEM-Devices erstellen. Jeweils mit der Gruppen-ID 61,62,63,64.

Jetzt muß ich aber sicherstellen, dass die 4 FHEM-Devices genau so wie die HCAN-Devices ebenfalls auf eine gesendete 60 vom HCAN-Bus reagieren, um den Status immer synchron zu haben.

D.h. ich benötige eine Zuordung der zusammenfassenden Gruppen zu den in ihnen enthaltenen Einzeldevice IDs.

Die frage ist nur, wenn ich Define in einer Schleife z.B. 20x direkt hintereinander aufrufe:
- bekommt FHEM das geregelt und
- was passiert, wenn parallel neue Nachrichten eintreffen. Schreibt FHEM die schon in irgend eine Puffer, oder hat das Betriebssystem einen Buffer für nicht abgeholte Daten im Filehandle?!?

CoolTux

So nun habe ich mal etwas mehr Zeit zum Antworten.

Also die 60 was ja eine Gruppen ID ist und den Zustand und die Befehle für alle Geräte in der Gruppe 60 beinhaltet hat erstmal nichts mit dem define zu tun. Ich würde auf die 60 erst reagieren wenn das entsprechende Gerät was sich in dieser Gruppe 60 befindet auch schon angelegt wurde. Aber das passiert eigentlich automatisch. Ich würde es so machen, hoffe ich habe es korrekt verstanden,  Nehmen wir mal an es kommen Daten für die Gruppe 60 rein mit dem Wert dimUp50 also Raffstore auf 50% hochfahren. (ich benenne das jetzt einfach mal so), dann werden die selben Infos ja hoffentlich nicht noch mal pro Raffstore kommen also noch mal einzeln für 61,62,63,64.
Du weißt das die 60 eine Grippen ID ist und nicht ein einzelnes Device beschreibt, also musst Du vorher herausfinden welches Deiner ganzen Devices die schon angelegt sein müssen in der Gruppe 60 sind. Dazu hast Du ja ein Attribut subType was ja schon die 60 als Wort enthält. So hatte ich Dich mal verstanden gehabt. Was muss also gemacht werden.


sub HCAN_Parse($$) {

    my ($io_hash,$json)  = @_;
   
    my $name                    = $io_hash->{NAME};
   
   
    Log3 $name, 3, "HCAN ($name) - ParseFn was called";
    Log3 $name, 3, "HCAN ($name) - JSON: $json";
    #### Beispieldaten
    # 688d1000040000000501460004930408           68 8d 10 00 04 00 00 00    | 05 |     01 46 00 04 93 04 08
    # 68911003040000000511460104930408           68 91 10 03 04 00 00 00 05  | 11 | 46 |      01 04 93 04 08
    # 688d1000040000000502460004930408           68 8d 10 00 04 00 00 00 05 02 46 00 04 93 04 08

    #Paket in array mit dec Zahlen zerlegen
    #my $string = 'AA55FF0102040810204080';
    #my @dec     = map { hex($_) } ($string =~ /(..)/g);
   
    my $hcanid = substr($message,19,22));
   
   
    hier prüfst du ob es sich um eine nachricht für eine gruppe handelt
    if( was weiß ich vorhanden) {
         dann verarbeite die daten in einer anderen Sub weiter
   }

   
    if( defined($hcanid) ) {

        if( my $hash                = $modules{HCAN}{defptr}{$hcanid} ) { 
            my $name                = $hash->{NAME};
                       
            HCAN_WriteReadings($hash,$message);
            Log3 $name, 3, "HCAN ($name) - find logical device: $hash->{NAME}";
                       
            return $hash->{NAME};
           
        } else {
           
            Log3 $name, 3, "HCAN ($name) - autocreate new device HCANDevice$hcanid with HCAN_ID $hcanid and IODev IODev=$name";
            return "UNDEFINED HCANDevice$hcanid HCAN $hcanid IODev=$name";
        }
    } 
}


In der anderen sub durchläufst du eine schleife wo du den hash aller geräte raussuchst mit subType gruppenid und rufst dann in der Schleife am ende die WriteReadings Funktion auf wo du den passenden Hash übergibst.
Denn um mehr geht es nicht, es nur darum den korrekten Device Hash raus zu finden und die Info über den aktuellen zustand des Geräte in ein Reading zu schreiben.

Verstehst was ich mein?
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

Hallo Marko,

sorry, aber ich bin wohl zu blöd für die Übergabe der Attribute an ein neu anzulegendes Device.

Vielleicht kannst Du es nochmal für Lernschwache erklären.

Ich habe in 20_HCAN.pm im _Parse die späteren Attribute subType und Gruppe angelegt. Außerdem wird der aktuelle Status in der Variablen state gespeichert.

Wenn dann ein neues Device mit autocreate angelegt wird, finde ich keinen der 3 Werte in dem Device...

Ich verzweifele hier bald. Mach jetzt erst mal `ne Pause.

Vielen Dank

Guido