HomeBrewWired - Diskussion zum Tutorial

Begonnen von Thorsten Pferdekaemper, 01 Dezember 2016, 22:03:19

Vorheriges Thema - Nächstes Thema

grogo

Hallo,

dann versuche ich es später mal mit einem einfachen Device (1 Augang / 1 Eingang).

Aber noch mal zum Verständnis.

Wann dies mein Telegramm auf dem RS485 Bus ist:
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:26:0B:86

R:                           von einem anderen Device empfangen
FD:FF:FF:FF:FF:F8:   Startbedingung
42:DA:80:82:           Deviceadresse
06:   ?
4B:   Direction (Kanal 10 + 2) (4B = #K = key event)
13:   Kanal ( gedrückt wurde Kanal 4, wenn man von 0 anfängt, passt dann auch mit 3 / die führende 1 "keine Ahnung")
00:   00 press.short / 01 press.long   
26:0B:86 Zeitstempel?

Oder in welchem Bit wird die Information verschlüsselt? Diese Variable ändert sich doch nicht, also muß der Fehler doch in der Adruino Programmierung liegen, oder?

Oder liegt es daran, dass meine Kanalnummer nicht mehr einstellig (16 Ausgänge / 16 Eingänge) sind?

Hier mal das XML File.


<?xml version="1.0"?>
<device eep_size="1024" version="01">
<supported_types>
<type priority="2" id="HBW-TER-MOD1616" name="HBWired_Gerät_16_Relais_16_Taster">
<parameter const_value="0xAC" size="1" index="0"/>
<parameter const_value="0" size="1" index="1"/>
</type>
</supported_types>

<paramset id="HBW-TER-MOD1616_dev_master" type="MASTER">
<parameter id="LOGGING_TIME">
<logical type="float" unit="s" default="5.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>
<enforce id="CENTRAL_ADDRESS" value="1"/>
</paramset>

<frames>
<frame id="LEVEL_SET" type="#x" channel_field="10" direction="to_device">
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
</frame>
<frame id="LEVEL_GET" type="#S" channel_field="10" direction="to_device"/>
<frame id="INFO_LEVEL" type="#i" channel_field="10" direction="from_device" event="true">
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
</frame>
<frame id="KEY_EVENT_SHORT" type="#K" channel_field="10" direction="from_device" event="true">
<parameter const_value="0" size="0.1" index="12.0" type="integer"/>
<parameter size="0.6" index="12.2" type="integer" param="COUNTER"/>
</frame>
<frame id="KEY_EVENT_LONG" type="#K" channel_field="10" direction="from_device" event="true">
<parameter const_value="1" size="0.1" index="12.0" type="integer"/>
<parameter size="0.6" index="12.2" type="integer" param="COUNTER"/>
</frame>
</frames>

<channels>
<channel index="0" type="MAINTENANCE" count="1" class="maintenance" ui_flags="internal">
</channel>
   

<!-- NEU: 16 Switches -->
<channel index="1" type="SWITCH" count="16" physical_index_offset="-1">
      <paramset id="hmw_switch_ch_master" type="MASTER" address_step="2" address_start="0x06">
<parameter id="LOGGING">
<logical type="option">
<option id="OFF"/>
<option id="ON" default="true"/>
</logical>
<physical size="0.1" type="integer" interface="eeprom">
<address index="+0"/>
</physical>
</parameter>
</paramset>
<paramset id="hmw_switch_ch_values" type="VALUES">
<parameter id="STATE" operations="read,write,event" control="SWITCH.STATE">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="LEVEL">
<set request="LEVEL_SET"/>
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
</physical>
<conversion type="boolean_integer" true="200" false="0" threshold="1"/>
</parameter>
</paramset>
</channel>

   
<!-- NEU: 16 Keys statt 1, Kanal 5-6, Adresse groesser, address_step korrigiert -->

<channel index="5" type="KEY" count="16" physical_index_offset="-1">
<paramset id="hmw_input_ch_master" type="MASTER" address_step="2" address_start="0x26">
<parameter id="LONG_PRESS_TIME">
<logical type="float" unit="s" default="1.0" max="5.0" min="0.4"/>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+1"/>
</physical>
<conversion type="float_integer_scale" factor="10"/>
<conversion type="integer_integer_map">
<value_map to_device="false" from_device="true" parameter_value="10" device_value="0xff"/>
</conversion>
</parameter>
</paramset>

<paramset id="hmw_input_ch_values" type="VALUES">
<parameter id="PRESS_SHORT" operations="event,write" loopback="true" control="BUTTON.SHORT">
<logical type="action"/>
<physical type="integer" interface="command" value_id="COUNTER">
<event frame="KEY_EVENT_SHORT"/>
</physical>
<conversion type="action_key_counter" counter_size="6" sim_counter="SIM_COUNTER"/>
</parameter>
<parameter id="PRESS_LONG" operations="event,write" loopback="true" control="BUTTON.LONG">
<logical type="action"/>
<physical type="integer" interface="command" value_id="COUNTER">
<event frame="KEY_EVENT_LONG"/>
</physical>
<conversion type="action_key_counter" counter_size="6" sim_counter="SIM_COUNTER"/>
</parameter>
</paramset>
</channel>

</channels>

</device>


Oder soll ich lieber einen eigenen Thread aufmachen?   

Thorsten Pferdekaemper

Hi,
ich glaube, dass da einiges falsch ist. Mach mal bitte einen neuen Thread auf. Außerdem solltest Du mal mit einem Device mit genau einem Eingang anfangen und sonst nichts.
Gruß,
   Thorsten
FUIP

Torrianer

Hallo,

nachdem meine alten HS485 Module von ELV langsam den Geist aufgaben, bin ich begeistert in diesen Thread eingestiegen.

Nun hänge ich aber beim peering.

Ausgehend vom Tutorial und den Modulen im Git habe ich ein Modul mit 6 Ein- und Ausgängen gebaut.
Das funktioniert prima. Taster Drücke kommen in FHEM an und von dort kann ich Ausgänge schalten.
Jetzt wollte ich einen Taster mit einem Ausgang peeren. Also einfach mit dem Taster den Ausgang schalten.
Und da hänge ich.

Hier mein Programm
//*******************************************************************
//
// HBW-LC-Sw-8
//
// Homematic Wired Hombrew Hardware
// Arduino NANO als Homematic-Device
// - Active HIGH oder LOW kann konfiguriert werden
//
// http://loetmeister.de/Elektronik/homematic/index.htm#modules
//
//*******************************************************************
// Changes
// v1.01
// - Switch code in "HBWSwitch.h" channel library übertragen. neu: initConfigPins()
// v1.02
// - channel invert angepasst um nach einem Device reset (EEPROM 'gelöscht') keine Invertierung zu haben
// - fix: initConfigPins() in afterReadConfig() geändert.
// v1.03
// - erweitertes peering hinzugefügt (HBWLinkSwitchAdvanced.h, HBWSwitchAdvanced.h) - Benötigt passende XML!


#define HMW_DEVICETYPE 0xE3
#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x001

#define NUM_S_CHANNELS 6
#define NUM_I_CHANNELS 6   // input channel - pushbutton, key
#define NUM_LINKS 30
#define LINKADDRESSSTART_SW   0x001F  //step 20
#define LINKADDRESSSTART_IN   0x0277  //step 6


//#define NO_DEBUG_OUTPUT   // disable debug output on serial/USB

#include "HBWSoftwareSerial.h"
#include "FreeRam.h"   
#define LED LED_BUILTIN        // Signal-LED

// HB Wired protocol and module

#include <HBWired.h>
#include <HBWLinkSwitchAdvanced.h>
#include <HBWSwitchAdvanced.h>
#include <HBWLinkKey.h>
#include <HBWKey.h>

#define RS485_RXD 4
#define RS485_TXD 2
#define RS485_TXEN 3  // Transmit-Enable

// HBWSoftwareSerial can only do 19200 baud
HBWSoftwareSerial rs485(RS485_RXD, RS485_TXD); // RX, TX


// Pins
#define BUTTON 11  // Button fuer Factory-Reset etc.  eig 8
#define LED LED_BUILTIN      // Signal-LED
#define SWITCH1_PIN A0  // Ausgangpins fuer die Relais
#define SWITCH2_PIN A1
#define SWITCH3_PIN A2
#define SWITCH4_PIN A3
#define SWITCH5_PIN A4
#define SWITCH6_PIN A5
#define INPUT1_PIN 5
#define INPUT2_PIN 6
#define INPUT3_PIN 8
#define INPUT4_PIN 9
#define INPUT5_PIN 10
#define INPUT6_PIN 7


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_switch switchcfg[NUM_S_CHANNELS]; // 0x07-0x12 ?  step 2
  hbw_config_key keycfg[NUM_I_CHANNELS]; // 0x13 - 0x1E (address step 2)
} hbwconfig;


// create channel object for the switches
HBWChannel* channels[NUM_S_CHANNELS + NUM_I_CHANNELS];  // total number of channels for the device
                                                   
class HBSwDevice : public HBWDevice {
    public:
    HBSwDevice(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 HBSwDevice::afterReadConfig() {
  if(hbwconfig.logging_time == 0xFF) hbwconfig.logging_time = 20;
};


HBSwDevice* device = NULL;



void setup()
{
#ifndef NO_DEBUG_OUTPUT
  Serial.begin(19200);
#endif
  rs485.begin();    // RS485 via SoftwareSerial

  // create channels
  uint8_t pins[NUM_S_CHANNELS] = {SWITCH1_PIN, SWITCH2_PIN, SWITCH3_PIN, SWITCH4_PIN, SWITCH5_PIN, SWITCH6_PIN};
 
  // assing switches (relay) pins to channels
  for(uint8_t i = 0; i < NUM_S_CHANNELS; i++){
     channels[i] = new HBWSwitchAdvanced(pins[i], &(hbwconfig.switchcfg[i]));
  };

   uint8_t inp[NUM_I_CHANNELS] = {INPUT1_PIN, INPUT2_PIN, INPUT3_PIN, INPUT4_PIN, INPUT5_PIN, INPUT6_PIN};

    for(uint8_t i = 0; i < NUM_I_CHANNELS; i++){
     channels[i + NUM_S_CHANNELS] = new HBWKey(inp[i], &(hbwconfig.keycfg[i]));
  };

  device = new HBSwDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &rs485,RS485_TXEN,sizeof(hbwconfig),&hbwconfig,
                         NUM_S_CHANNELS + NUM_I_CHANNELS,(HBWChannel**)channels,
                         &Serial,
                         new HBWLinkKey(NUM_LINKS, LINKADDRESSSTART_IN), new HBWLinkSwitchAdvanced(NUM_LINKS,LINKADDRESSSTART_SW));
   // LinkKey  1B KeyChannel 4B addr Rec 1 B Channel Rec                   

  device->setConfigPins(BUTTON, LED);  // 8 and 13 is the default
 
 
#ifndef NO_DEBUG_OUTPUT
  hbwdebug(F("B: 2A "));
  hbwdebug(freeRam());
  hbwdebug(F("\n"));
#endif
}


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


und die xml Datei
<?xml version="1.0"?>
<device eep_size="1024" version="01">
<supported_types>
<type priority="2" id="HBW-6E6A" name="Das Geraet zum HBWired-Tutorial">
<parameter const_value="0xAD" size="1" index="0"/>
<parameter const_value="0" size="1" index="1"/>
</type>
</supported_types>

<paramset id="HBW-TUTORIAL_dev_master" type="MASTER">
<parameter id="LOGGING_TIME">
<logical type="float" unit="s" default="5.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>
<enforce id="CENTRAL_ADDRESS" value="1"/>
<parameter id="DIRECT_LINK_DEACTIVATE" hidden="false">
<logical type="boolean" default="false"/>
<physical size="0.1" type="integer" interface="eeprom">
<address index="0x0006"/>
</physical>
</parameter>

</paramset>

<frames>
<frame id="LEVEL_SET" type="#x" channel_field="10" direction="to_device">
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
</frame>
<frame id="LEVEL_GET" type="#S" channel_field="10" direction="to_device"/>
<frame id="INFO_LEVEL" type="#i" channel_field="10" direction="from_device" event="true">
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
</frame>
<frame id="KEY_EVENT_SHORT" type="#K" channel_field="10" direction="from_device" event="true">
<parameter const_value="0" size="0.1" index="12.0" type="integer"/>
<parameter size="0.6" index="12.2" type="integer" param="COUNTER"/>
</frame>
<frame id="KEY_EVENT_LONG" type="#K" channel_field="10" direction="from_device" event="true">
<parameter const_value="1" size="0.1" index="12.0" type="integer"/>
<parameter size="0.6" index="12.2" type="integer" param="COUNTER"/>
</frame>
</frames>

<channels>
<channel index="0" type="MAINTENANCE" count="1" class="maintenance" ui_flags="internal">
</channel>
    <!-- NEU: 4 Switches statt 1 -->
<channel index="1" type="SWITCH" count="6" physical_index_offset="-1">
      <paramset id="hmw_switch_ch_master" type="MASTER" address_step="2" address_start="0x07">
<parameter id="LOGGING">
<logical type="option">
<option id="OFF"/>
<option id="ON" default="true"/>
</logical>
<physical size="0.1" type="integer" interface="eeprom">
<address index="+0"/>
</physical>
</parameter>
<parameter id="OUTPUT_LOCKED">
<logical type="boolean" default="false"/>
<physical size="0.1" type="integer" interface="eeprom">
<address index="+0.1"/>
</physical>
<conversion type="boolean_integer" invert="true"/>
</parameter>
<parameter id="INVERTED">
<logical type="boolean" default="true"/>
<physical size="0.1" type="integer" interface="eeprom">
<address index="+0.2"/>
</physical>
<conversion type="boolean_integer" invert="true"/>
</parameter>
</paramset>
<paramset type="LINK" id="hmw_switch_ch_link" peer_param="SENSOR" channel_param="CHANNEL" count="30" address_step="20" address_start="0x1F">
<parameter id="UI_HINT">
<logical type="string" default="" use_default_on_failure="true"/>
<physical type="string" interface="store" id="UI_HINT" save_on_change="true"/>
</parameter>
<parameter id="SENSOR" operations="none" hidden="true">
<logical type="address"/>
<physical type="array">
<physical type="integer" size="4.0" interface="eeprom">
<address index="+0"/>
</physical>
<physical type="integer" size="1.0" interface="eeprom">
<address index="+4"/>
</physical>
</physical>
</parameter>
<parameter id="CHANNEL" operations="none" hidden="true">
<logical type="integer" min="0" max="255" default="255"/>
<physical type="integer" size="1.0" interface="eeprom">
<address index="+5"/>
</physical>
</parameter>
<parameter id="SHORT_ON_TIME_MODE">
<logical type="option">
<option id="MINIMAL"/>
<option id="ABSOLUTE" default="true"/>
</logical>
<physical type="integer" size="0.1" interface="eeprom">
<address index="+6.7"/>
</physical>
</parameter>
<parameter id="SHORT_OFF_TIME_MODE">
<logical type="option">
<option id="MINIMAL"/>
<option id="ABSOLUTE" default="true"/>
</logical>
<physical type="integer" size="0.1" interface="eeprom">
<address index="+6.6"/>
</physical>
</parameter>
<parameter id="SHORT_ACTION_TYPE">
<logical type="option">
<option id="INACTIVE"/>
<option id="JUMP_TO_TARGET" default="true"/>
<option id="TOGGLE_TO_COUNTER"/>
<option id="TOGGLE_INVERS_TO_COUNTER"/>
<option id="TOGGLE"/>
</logical>
<physical type="integer" size="0.4" interface="eeprom">
<address index="+6.0"/>
</physical>
</parameter>
<parameter id="SHORT_ONDELAY_TIME">
<logical type="float" min="0.0" max="63000.0" default="0.0" unit="s"/>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+7"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="SHORT_ON_TIME">
<logical type="float" min="0.0" max="63000.0" default="378000" unit="s">
<special_value id="NOT_USED" value="378000"/>
</logical>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+8"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="SHORT_OFFDELAY_TIME">
<logical type="float" min="0.0" max="63000.0" default="0.0" unit="s"/>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+9"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="SHORT_OFF_TIME">
<logical type="float" min="0.0" max="63000.0" default="378000" unit="s">
<special_value id="NOT_USED" value="378000"/>
</logical>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+10"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="SHORT_JT_ONDELAY">
<logical type="option">
<option id="ONDELAY"/>
<option id="ON" default="true"/>
<option id="OFFDELAY"/>
<option id="OFF"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+11.0"/>
</physical>
</parameter>
<parameter id="SHORT_JT_ON">
<logical type="option">
<option id="ONDELAY"/>
<option id="ON"/>
<option id="OFFDELAY" default="true"/>
<option id="OFF"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+11.3"/>
</physical>
</parameter>
<parameter id="SHORT_JT_OFFDELAY">
<logical type="option">
<option id="ONDELAY"/>
<option id="ON"/>
<option id="OFFDELAY"/>
<option id="OFF" default="true"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+11.6"/>
</physical>
</parameter>
<parameter id="SHORT_JT_OFF">
<logical type="option">
<option id="ONDELAY" default="true"/>
<option id="ON"/>
<option id="OFFDELAY"/>
<option id="OFF"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+11.9"/>
</physical>
</parameter>

<parameter id="LONG_ON_TIME_MODE">
<logical type="option">
<option id="MINIMAL"/>
<option id="ABSOLUTE" default="true"/>
</logical>
<physical type="integer" size="0.1" interface="eeprom">
<address index="+13.7"/>
</physical>
</parameter>
<parameter id="LONG_OFF_TIME_MODE">
<logical type="option">
<option id="MINIMAL"/>
<option id="ABSOLUTE" default="true"/>
</logical>
<physical type="integer" size="0.1" interface="eeprom">
<address index="+13.6"/>
</physical>
</parameter>
<parameter id="LONG_MULTIEXECUTE">
<logical type="boolean" default="false"/>
<physical type="integer" size="0.1" interface="eeprom">
<address index="+13.5"/>
</physical>
</parameter>
<parameter id="LONG_ACTION_TYPE">
<logical type="option">
<option id="INACTIVE"/>
<option id="JUMP_TO_TARGET" default="true"/>
<option id="TOGGLE_TO_COUNTER"/>
<option id="TOGGLE_INVERS_TO_COUNTER"/>
<option id="TOGGLE"/>
</logical>
<physical type="integer" size="0.4" interface="eeprom">
<address index="+13.0"/>
</physical>
</parameter>
<parameter id="LONG_ONDELAY_TIME">
<logical type="float" min="0.0" max="63000.0" default="0.0" unit="s"/>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+14"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="LONG_ON_TIME">
<logical type="float" min="0.0" max="63000.0" default="378000" unit="s">
<special_value id="NOT_USED" value="378000"/>
</logical>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+15"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="LONG_OFFDELAY_TIME">
<logical type="float" min="0.0" max="63000.0" default="0.0" unit="s"/>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+16"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="LONG_OFF_TIME">
<logical type="float" min="0.0" max="63000.0" default="378000" unit="s">
<special_value id="NOT_USED" value="378000"/>
</logical>
<physical type="integer" size="1.0" interface="eeprom" endian="little">
<address index="+17"/>
</physical>
<conversion type="float_configtime" factors="1,60,1000,6000" value_size="0.8"/>
<conversion type="integer_integer_map">
<value_map device_value="0xc0" parameter_value="0xff" mask="0xc0"/>
</conversion>
</parameter>
<parameter id="LONG_JT_ONDELAY">
<logical type="option">
<option id="ONDELAY"/>
<option id="ON" default="true"/>
<option id="OFFDELAY"/>
<option id="OFF"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+18.0"/>
</physical>
</parameter>
<parameter id="LONG_JT_ON">
<logical type="option">
<option id="ONDELAY"/>
<option id="ON"/>
<option id="OFFDELAY" default="true"/>
<option id="OFF"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+18.3"/>
</physical>
</parameter>
<parameter id="LONG_JT_OFFDELAY">
<logical type="option">
<option id="ONDELAY"/>
<option id="ON"/>
<option id="OFFDELAY"/>
<option id="OFF" default="true"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+18.6"/>
</physical>
</parameter>
<parameter id="LONG_JT_OFF">
<logical type="option">
<option id="ONDELAY" default="true"/>
<option id="ON"/>
<option id="OFFDELAY"/>
<option id="OFF"/>
<option id="NO_JUMP_IGNORE_COMMAND"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom" endian="little" read_size="2">
<address index="+18.9"/>
</physical>
</parameter>
</paramset>
<paramset id="hmw_switch_ch_values" type="VALUES">
<parameter id="STATE" operations="read,write,event" control="SWITCH.STATE">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="LEVEL">
<set request="LEVEL_SET"/>
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
</physical>
<conversion type="boolean_integer" true="200" false="0" threshold="1"/>
</parameter>
</paramset>
</channel>

    <!-- NEU: 2 Keys statt 1, Kanal 5-6, Adresse groesser, address_step korrigiert -->
<channel index="7" type="KEY" count="6" physical_index_offset="-1">
<link_roles>
<target name="SWITCH"/>
</link_roles>
<paramset id="hmw_input_ch_master" type="MASTER" address_step="2" address_start="0x13">
<parameter id="INPUT_LOCKED">
                <logical type="boolean" default="false"/>
                <physical size="0.1" type="integer" interface="eeprom">
                    <address index="0.0"/>
                </physical>
                <conversion type="boolean_integer" invert="true"/>
            </parameter>
<parameter id="INVERTED">
                <logical type="boolean" default="false"/>
                <physical size="0.1" type="integer" interface="eeprom">
                    <address index="+0.1"/>
                </physical>
                <conversion type="boolean_integer" invert="false"/>
            </parameter>
<parameter id="PULLUP">
                <logical type="boolean" default="true"/>
                <physical size="0.1" type="integer" interface="eeprom">
                    <address index="+0.2"/>
                </physical>
                <conversion type="boolean_integer" invert="false"/>
            </parameter>
<parameter id="INPUT_TYPE">
<logical type="option">
<option id="DOORSENSOR"/>
<option id="MOTIONSENSOR"/>
<option id="SWITCH"/>
<option id="PUSHBUTTON" default="true"/>
</logical>
<physical size="0.2" type="integer" interface="eeprom">
<address index="+0.3"/>
</physical>
</parameter>
<parameter id="LONG_PRESS_TIME">
<logical type="float" unit="s" default="0.5" max="5.0" min="0.4"/>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+1"/>
</physical>
<conversion type="float_integer_scale" factor="10"/>
<conversion type="integer_integer_map">
<value_map to_device="false" from_device="true" parameter_value="10" device_value="0xff"/>
</conversion>
</parameter>
</paramset>
<paramset id="hmw_input_ch_link" type="LINK" channel_param="CHANNEL" peer_param="ACTUATOR" count="30" address_start="0x276" address_step="6">
<parameter hidden="true" id="CHANNEL" operations="none">
<logical type="integer" default="255" max="255" min="0"/>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+0"/>
</physical>
</parameter>
<parameter hidden="true" id="ACTUATOR" operations="none">
<logical type="address"/>
<physical type="array">
<physical size="4.0" type="integer" interface="eeprom">
<address index="+1"/>
</physical>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+5"/>
</physical>
</physical>
</parameter>
</paramset>

<paramset id="hmw_input_ch_values" type="VALUES">
<parameter id="PRESS_SHORT" operations="event,write" loopback="true" control="BUTTON.SHORT">
<logical type="action"/>
<physical type="integer" interface="command" value_id="COUNTER">
<event frame="KEY_EVENT_SHORT"/>
</physical>
<conversion type="action_key_counter" counter_size="6" sim_counter="SIM_COUNTER"/>
</parameter>
<parameter id="PRESS_LONG" operations="event,write" loopback="true" control="BUTTON.LONG">
<logical type="action"/>
<physical type="integer" interface="command" value_id="COUNTER">
<event frame="KEY_EVENT_LONG"/>
</physical>
<conversion type="action_key_counter" counter_size="6" sim_counter="SIM_COUNTER"/>
</parameter>
</paramset>
</channel>

</channels>

</device>


Ich habe dann einige Debug punkte in den Code gesetzt und hänge in der HBWLinkKey.cpp.
Nach Tastendruck landet er in der Routine "HBWLinkKey::sendKeyEvent"

Dort sucht er zunächst nach dem eigenen Channel.  Und da hänge ich:

Mein Taster hat Channel 8,  im Eeprom wird ausgelesen Channel 2. 
Und damit geht der Link is Leere.  Channel 2 ist die Nummer für den assoziierten Switch.

Ich denke, meine xml ist falsch.  Blicke aber nicht genug durch.

Kann mich jemand in die richtige Richtung stubsen?

Axel

Thorsten Pferdekaemper

Hi,
für den Anfang der Key-Peerings hast Du im Sketch 0x277 stehen, aber im XML 0x276.
Das könnte das Problem erklären.
Gruß,
   Thorsten
FUIP

Torrianer

Hallo Thorsten,

die Richtung war korrekt. Nach einigen Versuchen mit Hexdumps vom EEPROM funzt es jetzt.
Aber es gibt einen Versatz zwischen xml und programm.
Meine Parameter: LINKADDRESSSTART_SWitch   0x0020  korrespondiert mit "address_start="0x001F""
und LINKADDRESSSTART_KEY   0x0278  braucht address_start="0x277"
also immer eins weniger im xml..

Das hat mich einige graue Haare gekostet.....
Aber jetzt klappt es.

Danke für dein tolles Programm

loetmeister

#110
Hallo,

das Problem ist mir bisher nicht begegnet...
Was mir schon mal passiert ist, dass ich versehentlich EEPROM Adressen überlappended konfiguriert hatte. Das funktioniert natürlich nicht so gut..   ;)

ZitatLINKADDRESSSTART_KEY   0x0278  braucht address_start="0x277"
Das sollte eigentlich im Sketch und XML übereinstimmen.
z.B.
#define NUM_LINKS_INPUT 20    // address step 6
#define LINKADDRESSSTART_INPUT 0x380   // ends @0x3F7

Es geht bei 0x380 los. Die nächste freie Adresse ist 0x3F8. (wenn ich nicht komplett daneben liege)



hbw_config_key keycfg[NUM_I_CHANNELS]; // 0x13 - 0x1E (address step 2)
0x1F sollte die nächste freie Adresse sein...
Ich lasse auch etwas Platz zwischen channel Konfig und dem start der links (wenn möglich). So kann man die Anzahl der Kanäle erhöhen, ohne die Startadresse der peerings ändern zu müssen.


Kind regards,
Thomas

Torrianer

So, beim Aufräumen des Projektes habe ich die einfache Lösung des Rätsels gefunden.
Vom Nachvollziehen des Tutorials waren noch diverse xml Dateien im Ordner. Eine davon hatte zwar einen anderen Namen als mein Projekt aber dieselbe Device ID!
Von der zog FHEM seine Infos. Daher die falschen Adressen ! >:(

Jetzt läuft alles wie geschmiert.   Vielen Dank nochmal.
Der Tip mit der Luft zwischen den Speicherbereichen ist gut. Das setze ich gern um.

Axel

Sandomor

Hallo,

Also ich steige gerade in die Welt der Homebrew Wired Technik ein.

Hab mal das minimal Sketch auf meinen Nano V3 geladen, die Max487 Beschaltung auf einem Breakoutboard aufgebaut, und siehe da - die ersten Telegramme sehe ich am Serial Monitor. Dann ist aber Schluss - ich kann keinen neuen Sketch raufladen, ein Loopback Test geht nicht mehr - aus Ende. Neuen Nano v3 aus der Kiste genommen. Exakt gleiches Spiel - insgesamt 3 Nanos gebrickt... 

Irgendwer eine Idee ?

Thorsten Pferdekaemper

Hi,
passiert das auch, wenn Du den Max487 komplett vom Arduino nimmst? Ansonsten gibt es natürlich Probleme, wenn beides, also der Bus und die "Hochladeverbindung" denselben seriellen Port nehmen.
Gruß,
   Thorsten
FUIP

loetmeister

Hi,

Oder ein Problem mit der Arduino IDE? Welche Version nutzt du?
Ich bekomme nix vernünftig kompiliert, ausser ich nutze die alte IDE oder eine ältere Version des Boards. Siehe :
https://forum.fhem.de/index.php/topic,22952.msg876113.html#msg876113

Gruß,
Thomas

Sandomor

Zitat von: Thorsten Pferdekaemper am 10 Februar 2019, 21:42:14
Hi,
passiert das auch, wenn Du den Max487 komplett vom Arduino nimmst? Ansonsten gibt es natürlich Probleme, wenn beides, also der Bus und die "Hochladeverbindung" denselben seriellen Port nehmen.
Gruß,
   Thorsten

Auch wenn ich den Nano alleine per USB an meinen Rechner (Windows 7, IDE 1.8.5) stecke - sonst keine Teile dran, kann ich nicht mal einen "leeren" Sketch (also nur setup() und loop() ohne Inhalt - oder ein simples LED Blink) hochladen. kein RX/TX Ledblinken, nur die PowerLEd leuchtet (wenn ich Reset drücke blinkt die Led kurz auf), sonst alles dunkel. Habe das nun bereits bei 3 Nanos versucht. Heute kommen 2 neue, dann mal versuchen, wenn ich nur den Sketch (minimal Sketch) hochlade ohne externen Beschaltungen - vll hat die externe Beschaltung ja den Nano zerstört - wer weis...


Sandomor

Zitat von: loetmeister am 10 Februar 2019, 21:46:17
Hi,

Oder ein Problem mit der Arduino IDE? Welche Version nutzt du?
Ich bekomme nix vernünftig kompiliert, ausser ich nutze die alte IDE oder eine ältere Version des Boards. Siehe :
https://forum.fhem.de/index.php/topic,22952.msg876113.html#msg876113

Gruß,
Thomas

Naja - ich verwende die 1.8.5 mit BoardManager 1.6.20 - das erste Mal geht es auch, dann nicht mehr....


Thorsten Pferdekaemper

Zitat von: Sandomor am 11 Februar 2019, 09:00:05vll hat die externe Beschaltung ja den Nano zerstört - wer weis...
Kannst Du mal ein Bild von der ganzen Sache machen? Vielleicht fällt da was auf.
Es ist meiner Meinung nach ziemlich unwahrscheinlich, dass das ein prinzipieller Fehler ist. Es haben schon einige das ganze durchgespielt und es ging dabei nichts kaputt.
Gruß,
   Thorsten
FUIP

Sandomor

Hallo Thorsten,

habe die externe Beschaltung schon wieder abgebaut - heute kommen 5 neue Nano - dann neuer Anlauf - zumindest einen opfere ich sicher noch ;)

ausserdem werde ich versuchen, mal einen neuen Bootloader auf die defekten zu spielen - dafür brauch ich halt auch einen funktionierenden Nano...

ich werde berichten - danke mal soweit für Deine Hilfe...

lg
Andi

Fhemmichl

Ich habe ein Problem mit der Adresse, vielleicht hat jemand eine Lösung.

Und zwar wurde mein neues Gerät in Fhem erkannt und ich wollte die Adresse ändern.
Anstatt 406142000010 habe ich die raw Message 406100000010 an den Arduino gesendet.
Nach einem Neustart wurde es dann nicht mehr gefunden.

Auch wenn ich den sketch neu draufspiele wird es nicht mehr erkannt.
Was muss ich denn tun damit ich die Adresse wieder auf die Ursprungsadresse bekomme?

Gruß
Michael