HBW-LC-BL-4 Device wird in CCU2 als HMW-Generic angezeigt

Begonnen von grogo, 01 November 2018, 15:57:45

Vorheriges Thema - Nächstes Thema

grogo

Hallo,

ich habe mir nach einer Anleitung ein HBW-LC-BL-4 Device für 4 Rollo-Aktoren mit einem Adruino erstellt.

Die Daten auf dem Bus sehen auch gut aus:
R: FD:FF:FF:FF:FF:F8:42:DA:80:8A:12:41:00:AD:01:00:14:48:42:57:31:36:31:36:30:31:30:87:A6 (4-Rollo Modul)
R: FD:FF:FF:FF:FF:F8:42:DA:80:84:12:41:00:AC:00:01:00:48:42:57:31:36:31:36:30:30:34:1D:BE (weiteres Selbstbau Adruino Modul)

Dann habe ich die XML aus dem Projekt in die CCU2 hochgeladen, die Rechte der *.xml Datei auf 755 gesetzt und die CCU2 über das Webinterface und auch durch Spannungswegnahme neu gestartet.

Leider wird mir das Geräte immer, nachdem ich Homewired Geräte im Webinterface suche, im Posteingang nur als HMW-Generic angezeigt. Die Seriennummer des Gerätes ist aber korrekt.

Ich sehe auf dem Bus auch nicht, dass die Zentrale das Gerät in irgendeiner Weise anspricht? Er müsste doch alle Daten aus dem oben genannten Datensatz herausbekommen, oder?

Kann mir jmd helfen? Hab schon die beiden XML-Files verglichen.  Der supported_types und paramset Teile sind nahezu identisch. Es kommt wohl noch ein Parameter DIRECT_LINK_DEACTIVATE beim neuen Device hinzu.

Muss man irgendwo den Cache leeren, weil ich es schon öfter probiert habe? Oder ist was mit dem XML file nicht in Ordung (Ursprünglich für FHEM)? Gibt es da Unterschiede beim XML file (FHEM vs CCU2)?

Hat jmd eine Idee oder Lösungsvorschlag?

Besten Dank

grogo

Hier die ersten Zeilen der XML Datei. Der Gerätetyp ist auch auf AD gestellt

<?xml version="1.0"?>
<device eep_size="1024" version="14">
<supported_types>
<type priority="2" id="HBW-TER-ROLLO8" name="RS485 blind actuator 8-channel">
<parameter const_value="0xAD" size="1" index="0"/><!--HMW_DEVICETYPE-->
<parameter const_value="0" size="1" index="1"/>
  </type>
</supported_types>
 

<paramset id="HBW-TER-ROLLO8_dev_master" type="MASTER">
  <parameter id="LOGGING_TIME">
  <logical type="float" unit="s" default="2.0" max="25.5" min="0.1"/>
  <physical size="1.0" type="integer" interface="eeprom">
<address index="0x0001"/>
  </physical>
  <conversion type="float_integer_scale" offset="0.0" factor="10"/>
  </parameter>
  <parameter id="CENTRAL_ADDRESS" hidden="true">
  <logical type="integer"/>
  <physical size="4" type="integer" interface="eeprom">
  <address index="0x0002"/>
  </physical>
  </parameter>
  <parameter id="DIRECT_LINK_DEACTIVATE" hidden="true">
  <logical type="boolean" default="false"/>
  <physical interface="eeprom" size="0.1" type="integer">
  <address index="0x0006"/>
  </physical>
  </parameter>
  <enforce id="CENTRAL_ADDRESS" value="1"/>
  <enforce id="DIRECT_LINK_DEACTIVATE" value="true"/>
</paramset>

Thorsten Pferdekaemper

Hi,
mir fallen zwei Dinge auf:
1. Die kommerziellen Geräte haben alle den Modul-Typ im XML im Dezimalsystem und nicht in Hex.
2. In der Announce-Message im AD-Modul ist nach dem Modultyp eine "01" statt einer "00". Warum?
Gruß,
   Thorsten
FUIP

grogo

Hi,

1. Gibt es ein Liste mit noch freien Modul-Typen? Dann würde ich mal ein Dezimalzahl versuchen. habe das Hex-System mit 0x aus dem Beispiel übernommen. Und bei 0xAC funktionierte es auch schon.

2. In der 0x06 Stelle nach dem Gerätetyp wird das Direct-link_deactivate Bit übergeben. Warum dort eine 1 gesetzt ist kann ich dir leider nicht sagen, da ich den Quellcode kopiert habe.


  struct hbw_config {
  uint8_t logging_time;     // 0x01
  uint32_t central_address;  // 0x02 - 0x05
  uint8_t direct_link_deactivate:1;   // 0x06:0
  uint8_t              :7;   // 0x06:1-7
  hbw_config_blind blindscfg[NUMBER_OF_BLINDS]; // 0x07-0x... ? (step 7)
} hbwconfig;

Thorsten Pferdekaemper

Zitat von: grogo am 01 November 2018, 18:38:48
1. Gibt es ein Liste mit noch freien Modul-Typen?
Nein, gibt es nicht. Das ist auch meiner Meinung nach gerade nicht Dein Problem.

Zitat
Dann würde ich mal ein Dezimalzahl versuchen. habe das Hex-System mit 0x aus dem Beispiel übernommen. Und bei 0xAC funktionierte es auch schon.
Ok, wenn es mit 0xAC geht, dann sollte es mit 0xAD auch gehen.

Zitat
2. In der 0x06 Stelle nach dem Gerätetyp wird das Direct-link_deactivate Bit übergeben.
Das hat jetzt so richtig gar nichts mit meiner Frage zu tun. Ich meinte die "01" nach der "AD" in der Announce-Message, die Du am Anfang gepostet hast. Das hat nichts mit der Konfiguration im EEPROM zu tun.
Das ganze ist etwas seltsam, da die HBW-Libraries da eigentlich eine "00" hart-codiert senden. Kannst Du mal Deinen kompletten Sketch hier dranhängen?

Gruß,
   Thorsten

FUIP

grogo

Den Ursprung des Quellcodes habe ich von hier: https://github.com/ThorstenPferdekaemper/HBWired/blob/master/HBW-LC-BL-8/HBW-LC-Bl-8.ino

Hier mein Sketch:

//*******************************************************************
//
// HBW-LC-Bl-8
//
// Homematic Wired Hombrew Hardware
// Arduino NANO als Homematic-Device
// 8 Kanal Rollosteuerung
// - Direktes Peering möglich. (open: 100%, close: 0%, toggle/stop, set level)
//
// http://loetmeister.de/Elektronik/homematic/index.htm#modules
// Quell-Code: https://github.com/loetmeister/HBWired/tree/master/HBW-LC-BL-8
//
//*******************************************************************
// Changes
// v0.1
// - initial port to new library
// - logging mechanism changed, only send info message once blind has reached final postition
// - time measurement changed to duration, to avoid millis() rollover issue
// - added additional pause, when changing direction
// - added basic direct peering
// - changed to USART instead of "HBWSoftwareSerial" to free up IO ports, sacrificed debugging (use HBW-LC-Bl-4 as test device)
// v0.2
// - added level option in peering to set target value
// v0.3
// - habe die Software auf MEGA32 und mein Module geändert
// - Relais umgelegt auf Relais Port A: D36, D37, D34, D35, D32, D33, D30, D31, Relais Port B: D28, D26, D27, D29, D24, D22, D23, D25
// - Schnittstelle RS485 auf Serial3 gelegt 
//
// Zukunftvisionen:
// - auch Taster für das Modul freischalten, damit sie nicht verloren gehen
// - CentralAdress schreiben, damit es mehrere Module geben kann (mit Steckercode / Tauschbarkeit)
//
//*******************************************************************
/

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0014

#define NUMBER_OF_BLINDS 8
#define NUM_LINKS 64
#define LINKADDRESSSTART 0x26

#define HMW_DEVICETYPE 0xAD //BL8 device (make sure to import hbw_lc_bl-8.xml into FHEM)


// HB Wired protocol and module
#include "HBWired.h"
#include "HBWBlind.h"
#include "HBWLinkBlindSimple.h"
#include "EEPROM.h"

// Pins
#define RS485_TXEN 3  // Transmit-Enable

#define BUTTON 4  // Button fuer Factory-Reset etc.
#define LED 7     // gelbe Signal-LED

#define BLIND1_ACT 36    // "Ein-/Aus-Relais"
#define BLIND1_DIR 37    // "Richungs-Relais"
#define BLIND2_ACT 34
#define BLIND2_DIR 35
#define BLIND3_ACT 32
#define BLIND3_DIR 33
#define BLIND4_ACT 30
#define BLIND4_DIR 31

#define BLIND5_ACT 28
#define BLIND5_DIR 26
#define BLIND6_ACT 27
#define BLIND6_DIR 29
#define BLIND7_ACT 24
#define BLIND7_DIR 22
#define BLIND8_ACT 23
#define BLIND8_DIR 25

/*>>> more config in HBWBlind.h <<<*/


struct hbw_config {
  uint8_t logging_time;     // 0x01
  uint32_t central_address;  // 0x02 - 0x05
  uint8_t direct_link_deactivate:1;   // 0x06:0
  uint8_t              :7;   // 0x06:1-7
  hbw_config_blind blindscfg[NUMBER_OF_BLINDS]; // 0x07-0x... ? (step 7)
} hbwconfig;


HBWChanBl* blinds[NUMBER_OF_BLINDS];


class HBBlDevice : public HBWDevice {
    public:
    HBBlDevice(uint8_t _devicetype, uint8_t _hardware_version, uint16_t _firmware_version,
               Stream* _rs485, uint8_t _txen,
               uint8_t _configSize, void* _config,
               uint8_t _numChannels, HBWChannel** _channels,
               Stream* _debugstream, HBWLinkSender* linksender = NULL, HBWLinkReceiver* linkreceiver = NULL) :
    HBWDevice(_devicetype, _hardware_version, _firmware_version,
              _rs485, _txen, _configSize, _config, _numChannels, ((HBWChannel**)(_channels)),
              _debugstream, linksender, linkreceiver) {
    };
    virtual void afterReadConfig();
};

// device specific defaults
void HBBlDevice::afterReadConfig() {
  if(hbwconfig.logging_time == 0xFF) hbwconfig.logging_time = 20;
};


HBBlDevice* device = NULL;



void setup()
{
  Serial.begin(19200, SERIAL_8E1); // DEBUG Schnittstelle
  Serial3.begin(19200, SERIAL_8E1); // RS485 Schnittstelle
  Serial.println("Rollo Steuerung Version v0.3");
  // assing relay pins

  EEPROM.write(E2END - 3, 0x42);
  EEPROM.write(E2END - 2, 0xDA);
  EEPROM.write(E2END - 1, 0x80);
  EEPROM.write(E2END, 0x8A);

  byte blindDir[8] = {BLIND1_DIR, BLIND2_DIR, BLIND3_DIR, BLIND4_DIR, BLIND5_DIR, BLIND6_DIR, BLIND7_DIR, BLIND8_DIR};
  byte blindAct[8] = {BLIND1_ACT, BLIND2_ACT, BLIND3_ACT, BLIND4_ACT, BLIND5_ACT, BLIND6_ACT, BLIND7_ACT, BLIND8_ACT};
  // create channels
  for(uint8_t i = 0; i < NUMBER_OF_BLINDS; i++){
    blinds[i] = new HBWChanBl(blindDir[i], blindAct[i], &(hbwconfig.blindscfg[i]));
   };

  device = new HBBlDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &Serial3, RS485_TXEN,sizeof(hbwconfig),&hbwconfig,
                         NUMBER_OF_BLINDS,(HBWChannel**)blinds,
                         NULL,
                         NULL, new HBWLinkBlindSimple(NUM_LINKS,LINKADDRESSSTART));
   
  device->setConfigPins(BUTTON, LED);
 
}


void loop()
{
  device->loop();
};


Ich habe den Sketch etwas angepasst, da meine Hardware auf einem Adruino Mega basiert und ich somit zwei Hardware Serials habe. Der Debug läuft auf SERIAL und die RS485 auf SERIAL3. Auch die Port hab ich etwas umgelegt und die Seriennummer eingebaut, damit ich mehrer Module betreiben kann. Aber das sollte nicht das Problem sein.

Thorsten Pferdekaemper

Hi,
ich glaube, dass das Problem folgendes ist: Du hast im XML als Hardware-Version die "00" angegeben, aber im Sketch die "01".
Im XML ist (glaube ich) die Hardware-Version der zweite <parameter>-Eintrag im <supported_types>-Abschnitt.
Gruß,
   Thorsten
FUIP

loetmeister

Hi,

Ich habe grad keine Lösung parat, aber wenn du nur die pin Belegung und Serielle Schnittstellen angepasst hast, kannst du doch erst mal mit der bestehenden xml und device type (0x92) testen...?

Was bedeutet,
"Seriennummer eingebaut, damit ich mehrer Module betreiben kann"?
jedem device kannst du per RAW Befehl eine eindeutige Adresse geben.. Schau mal im home brew tutorial von Thorsten.

PS: müsste der thread nicht heißen, BL-8 wird als generic angezeigt?   ;)

Gruß,
Thomas

grogo

Hallo Thomas, hallo Thorsten,

ich hab mich jetzt nochmal an das Projekt HBW-LC-BL-4 gesetzt und alles neu aufgebaut. Hab mit einen Adruino Uno genommen und den original Sketch aufgespielt, ohne Veränderungen und auch die original XML Datei auf die CCU2 gespielt. Leider hat dies nichts gebracht.

Dann habe ich mich an den Hinweis von Thorsten gesetzt und die Hardware Version im Sketch auf 0x00 geändert und schon hat die CCU2 das Modul richtig erkannt. Dann bin ich hingegangen und habe meine Version auf dem Adruino Mega mit 8 Rollos geändert und genau das war der Fehler. Komisch ist nur, dass dies bei meinem anderen Modul auch so ist. Das verstehe ich nicht, dort klappt es.

Jetzt geht es auf jeden Fall. Wenn ich beim weiter rumprobieren noch was einfällt schreibe ich es hier rein.

Besten Dank für Eure Hilfe  und Hinweise


loetmeister

Hi,

Prima das es klappt. Scheint das FHEM sich nicht daran stört. Mit der Firmware Version klappt es aber..
D.h. du hast im XML nur den fett hervorgehoben Wert auf 1 geändert?

<parameter const_value="0xAD" size="1" index="0"/><!--HMW_DEVICETYPE-->
<parameter const_value="0" size="1" index="1"/>



Gruß,
Thomas

Thorsten Pferdekaemper

Zitat von: loetmeister am 02 November 2018, 23:18:49Scheint das FHEM sich nicht daran stört. Mit der Firmware Version klappt es aber..
Ich habe gerade mal nachgesehen. Das hier ist in /opt/fhem/FHEM/lib/HM485/Device.pm:

sub getDeviceKeyAndModel($$) {
my ($rawDevType, $rawFwVersion) = @_;

# search for matching device descriptions
    my $bestPriority = -1;  # priority of the generic device is 0
my @retVal;
foreach my $deviceKey (keys %deviceDefinitions) {
    # ignore the "central" device
next if($deviceKey eq "HMW_CENTRAL");
        foreach my $modelKey (keys %{$deviceDefinitions{$deviceKey}{supported_types}}) {
my $model = $deviceDefinitions{$deviceKey}{supported_types}{$modelKey};
# this should have parameter
next unless(defined($model->{parameter}));
# there might be some bad HBW-XMLs out there... make sure they have higher prio
# then the generic device
my $priority = defined($model->{priority}) ? $model->{priority} : 1;
# if we already have something, which is as good, go on
next if($priority <= $bestPriority);
# check device type, but only if present
if(defined($model->{parameter}{"0"}) and defined($model->{parameter}{"0"}{const_value})) {
    next unless($model->{parameter}{"0"}{const_value} == $rawDevType);
};
# check fw version, if present
if(defined($model->{parameter}{"2"}) and defined($model->{parameter}{"2"}{const_value})) {
    my $op = defined($model->{parameter}{"2"}{cond_op}) ? $model->{parameter}{2}{cond_op} : "EQ";
if($op eq "EQ") {
    next unless($model->{parameter}{"2"}{const_value} == $rawFwVersion);
                }elsif($op eq "NE") {
    next unless($model->{parameter}{"2"}{const_value} != $rawFwVersion);
                }elsif($op eq "GT") {
    next unless($model->{parameter}{"2"}{const_value} < $rawFwVersion);
                }elsif($op eq "GE") {
    next unless($model->{parameter}{"2"}{const_value} <= $rawFwVersion);
                }elsif($op eq "LT") {
    next unless($model->{parameter}{"2"}{const_value} > $rawFwVersion);
                }elsif($op eq "LE") {
    next unless($model->{parameter}{"2"}{const_value} >= $rawFwVersion);
                }else{
    # weird
next;
};
};
# if we came that far, we have found a match
@retVal = ($deviceKey,$modelKey);
$bestPriority = $priority;
};
};
return @retVal;
}

D.h. parameter "0" (Device Type) und parameter "2" (Firmware Version) wird beachtet, aber nicht parameter "1" (Hardware Version bzw. zweites Byte des Device Type). Da das aber bei allen bisher bekannten Geräten auf 0 gesetzt war, war das auch egal.
Wenn gewünscht oder benötigt, dann könnte ich das mal in FHEM einbauen, aber ich glaube, dass das nicht so wichtig ist.
Gruß,
   Thorsten
FUIP

grogo

hallo Thomas,

nein, habe das XML File gleich gelassen und im Sketch #define HARDWARE_VERSION 0x00 geändert.

Die Änderung hat geholfen.

Gruß,

Stephan

Thorsten Pferdekaemper

Hi,
ich habe das mit dem "parameter 1" jetzt mal als Git Issue erfasst. Ich kümmere mich momentan nicht wirklich sehr darum, aber wenn ich das nächste Mal Lust auf HM485 bekomme, dann baue ich's ggf. ein.
Siehe
https://github.com/kc-GitHub/FHEM-HM485/issues/62
Gruß,
   Thorsten
FUIP

loetmeister

Hi,

Danke euch. Dann werde ich die Tage mal die Sketche und XML anpassen / abgleichen und einen pull request stellen wenns erledigt ist.  8)

Gruß,
Thomas

loetmeister

Hallo,

habe die Änderungen in GitHub hochgeladen. https://github.com/loetmeister/HBWired
Meist habe ich die XML geändert, dann muss man nichts neu Kompilieren. Zumal Version "0" so nach sehr frühem Entwicklungsstadium klingt ;)

PS: Pull request ist auch gestellt...

Gruß,
Thomas