HBW-IO-Modul Onewire zufügen

Begonnen von a_quadrat, 03 Mai 2020, 23:14:48

Vorheriges Thema - Nächstes Thema

a_quadrat

Hallo Zusammen,

ich habe ein IO-Modul mit 6 Eingängen, 4 Ausgängen und einen Rollladen Channel. Ich würde gern noch ein onewire Kanal zufügen.
Die Kanäle werden alle angelegt, aber die Temperatur wird nicht angezeigt. Hat jemand eine Idee, wo der Fehler liegen kann?

Anbei der Sketch und die XML


//*******************************************************************
//
// HBW-IO-6-4-Sen-BL-1-OW
//
// Homematic Wired Hombrew Hardware, 6 Input, 4 Output, 1 Blind, 1 Onewire
// Arduino NANO als Homematic-Device
//
// - Direktes Peering für Blind und Switch möglich. (HBWLinkBlindSimple)
// - Direktes Peering für Taster. (HBWLinkKey)
//
//
//
//*******************************************************************
// Changes
// v0.01
// - initial version

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0001
#define HMW_DEVICETYPE 0x97 //device ID

#define NUMBER_OF_INPUT_CHAN 6  // input channel - pushbutton, key, other digital in
#define NUMBER_OF_SEN_INPUT_CHAN 6  // equal number of sensor channels, using same ports/IOs as INPUT_CHAN
#define NUMBER_OF_OUT_CHAN 4  // digital output channels
#define NUMBER_OF_BL_CHAN 1  // digital output channels
#define NUMBER_OF_TEMP_CHAN 1 // input channels - 1-wire temperature sensors
#define ADDRESS_START_CONF_TEMP_CHAN 0x7 // first EEPROM address for temperature sensors configuration
#define LINKADDRESSSTART_TEMP 0xE6 

//#define NUM_LINKS_OUT 20    // address step 7
//#define LINKADDRESSSTART_OUT 0x038   // ends @0x37F
#define NUM_LINKS_INPUT 20    // address step 6
#define LINKADDRESSSTART_INPUT 0x380   // ends @0x3F7
#define NUM_LINKS_BL 20    // address step 9
#define LINKADDRESSSTART_BL 0x038


//#define USE_HARDWARE_SERIAL   // use hardware serial (USART) for final device - this disables debug output
/* Undefine "HBW_DEBUG" in 'HBWired.h' to remove code not needed. "HBW_DEBUG" also works as master switch,
* as hbwdebug() or hbwdebughex() used in channels will point to empty functions. */


// HB Wired protocol and module
#include <HBWired.h>
#include <HBWLinkKey.h>
#include <HBWKey.h>
//#include <HBWLinkSwitchSimple.h>
#include <HBWSwitch.h>
#include <HBWSenSC.h>
#include <HBWLinkBlindSimple.h>
#include <HBWBlind.h>
#include <HBWOneWireTempSensors.h>
#include <HBWLinkInfoEventSensor.h>

// Pins

  #define RS485_RXD 5
  #define RS485_TXD 2
  #define RS485_TXEN 3  // Transmit-Enable
  #define BUTTON 8  // Button fuer Factory-Reset
  #define ADC_BUS_VOLTAGE A7  // analog input to measure bus voltage

  #define OU01 A0 
  #define OU02 A1
  #define OU03 A2
  #define OU04 A3
  #define BLIND1_ACT A4  // "Ein-/Aus-Relais"
  #define BLIND1_DIR A5  // "Richungs-Relais"

  #define IO1 6
  #define IO2 7
  #define IO3 9
  #define IO4 10
  #define IO5 11
  #define IO6 12

  #define ONEWIRE_PIN 04 // Onewire Bus

  #include "FreeRam.h"
  #include <HBWSoftwareSerial.h>
  HBWSoftwareSerial rs485(RS485_RXD, RS485_TXD); // RX, TX


#define LED LED_BUILTIN        // Signal-LED

#define NUMBER_OF_CHAN NUMBER_OF_OUT_CHAN + NUMBER_OF_INPUT_CHAN + NUMBER_OF_SEN_INPUT_CHAN + NUMBER_OF_BL_CHAN + NUMBER_OF_TEMP_CHAN


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[NUMBER_OF_OUT_CHAN]; // 0x07 - 0x0E (address step 2)
  hbw_config_senSC senCfg[NUMBER_OF_SEN_INPUT_CHAN]; // 0x0F - 0x14 (address step 1)
  hbw_config_key keyCfg[NUMBER_OF_INPUT_CHAN]; // 0x15 - 0x20 (address step 2) 
  hbw_config_blind blindCfg[NUMBER_OF_BL_CHAN]; // 0x21-0x27 (address step 7)
  hbw_config_onewire_temp TempOWCfg[NUMBER_OF_TEMP_CHAN]; // 0x28 - 0x.. (address step 14)
} hbwconfig;


HBWChannel* channels[NUMBER_OF_CHAN];  // total number of channels for the device

hbw_config_onewire_temp* tempConfig[NUMBER_OF_TEMP_CHAN]; // global pointer for OneWire channels config

class HBIODevice : public HBWDevice {
    public:
    HBIODevice(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,
               OneWire* oneWire = NULL, hbw_config_onewire_temp** _tempSensorconfig = NULL) :
    HBWDevice(_devicetype, _hardware_version, _firmware_version,
              _rs485, _txen, _configSize, _config, _numChannels, ((HBWChannel**)(_channels)),
              _debugstream, linksender, linkreceiver) {
               
                d_ow = oneWire;
                tempSensorconfig = _tempSensorconfig;
    };
    virtual void afterReadConfig();

    private:
      OneWire* d_ow;
      hbw_config_onewire_temp** tempSensorconfig;
};

// device specific defaults
void HBIODevice::afterReadConfig() {
  if(hbwconfig.logging_time == 0xFF) hbwconfig.logging_time = 50;
 
  HBWOneWireTemp::sensorSearch(d_ow, tempSensorconfig, (uint8_t) NUMBER_OF_TEMP_CHAN, (uint8_t) ADDRESS_START_CONF_TEMP_CHAN);
};

HBIODevice* device = NULL;



void setup()
{


    //  variables for all OneWire channels
  OneWire* g_ow = new OneWire(ONEWIRE_PIN);
  uint32_t g_owLastReadTime = 0;
  uint8_t g_owCurrentChannel = OW_CHAN_INIT; // always init with OW_CHAN_INIT! used as trigger/reset in channel loop()
 

  // create channels


#if NUMBER_OF_OUT_CHAN == 4
  static const uint8_t Out_Chan[4] = {OU01, OU02, OU03, OU04};  // assing pins
 
  for(uint8_t i = 0; i < NUMBER_OF_OUT_CHAN; i++) {
    channels[i] = new HBWSwitch(Out_Chan[i], &(hbwconfig.switchCfg[i]));
  };
#else
  #error Out channel count and pin missmatch!
#endif

#if NUMBER_OF_SEN_INPUT_CHAN == 6
  static const uint8_t Sen_Chan[6] = {IO1, IO2, IO3, IO4, IO5, IO6};  // assing pins
 
  for(uint8_t i = 0; i < NUMBER_OF_SEN_INPUT_CHAN; i++) {
    channels[i + NUMBER_OF_OUT_CHAN] = new HBWSenSC(Sen_Chan[i], &(hbwconfig.senCfg[i]));
  };
#else
  #error Sen channel count and pin missmatch!
#endif


#if NUMBER_OF_INPUT_CHAN == 6
  static const uint8_t In_Chan[6] = {IO1, IO2, IO3, IO4, IO5, IO6};  // assing pins
   
  for(uint8_t i = 0; i < NUMBER_OF_INPUT_CHAN; i++) {
    channels[i + NUMBER_OF_OUT_CHAN + NUMBER_OF_SEN_INPUT_CHAN] = new HBWKey(In_Chan[i], &(hbwconfig.keyCfg[i]));
  };
#else
  #error Input channel count and pin missmatch!
#endif

#if NUMBER_OF_BL_CHAN == 1
  static const uint8_t blindDir[1] = {BLIND1_DIR};
  static const uint8_t blindAct[1] = {BLIND1_ACT};
   
  for(uint8_t i = 0; i < NUMBER_OF_BL_CHAN; i++) {
    channels[i + NUMBER_OF_OUT_CHAN + NUMBER_OF_SEN_INPUT_CHAN + NUMBER_OF_INPUT_CHAN] = new HBWChanBl(blindDir[i], blindAct[i], &(hbwconfig.blindCfg[i]));
  };
#else
  #error BL channel count and pin missmatch!
#endif

#if NUMBER_OF_TEMP_CHAN == 1
   
  for(uint8_t i = 0; i < NUMBER_OF_TEMP_CHAN; i++) {
    channels[i + NUMBER_OF_OUT_CHAN + NUMBER_OF_SEN_INPUT_CHAN + NUMBER_OF_INPUT_CHAN + NUMBER_OF_BL_CHAN] = new HBWOneWireTemp(g_ow, &(hbwconfig.TempOWCfg[i]), &g_owLastReadTime, &g_owCurrentChannel);
    tempConfig[i + NUMBER_OF_OUT_CHAN + NUMBER_OF_SEN_INPUT_CHAN + NUMBER_OF_INPUT_CHAN + NUMBER_OF_BL_CHAN] = &(hbwconfig.TempOWCfg[i]);
  }
#else
  #error OW channel count and pin missmatch!
#endif

#ifndef NO_DEBUG_OUTPUT
  Serial.begin(19200);  // Serial->USB for debug
#endif
  rs485.begin();

device = new HBIODevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &rs485,RS485_TXEN,sizeof(hbwconfig),&hbwconfig,
                         NUMBER_OF_CHAN,(HBWChannel**)channels,
#ifdef NO_DEBUG_OUTPUT
                         NULL,
  #else
                         &Serial,
  #endif
                         new HBWLinkKey<NUM_LINKS_INPUT,LINKADDRESSSTART_INPUT>(), new HBWLinkBlindSimple<NUM_LINKS_BL,LINKADDRESSSTART_BL>());
                         
                       
                         
                         
device->setConfigPins(BUTTON, LED);  // 8 (button) and 13 (led) is the default
                         
#ifndef NO_DEBUG_OUTPUT
  hbwdebug(F("B: 2A "));
  hbwdebug(freeRam());
  hbwdebug(F("\n"));
#endif
 
 

}


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



<?xml version="1.0"?>
<device eep_size="1024" version="14">
<supported_types>
<type priority="2" id="HBW-IO-6-BL-1-OW" name="RS485 6-channel master out actuator and 6 Digital inputs and blind">
<parameter const_value="0x97" size="1" index="0"/><!--HMW_DEVICETYPE-->
<parameter const_value="1" size="1" index="1"/><!--HARDWARE_VERSION-->
<parameter const_value="0x0001" size="2" cond_op="GE" index="2"/><!--Min. FIRMWARE_VERSION-->
</type>
</supported_types>

<paramset id="HBW-IO-6-BL-1-OW_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>
<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>

<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" direction="from_device" event="true" type="#i" channel_field="10">
<parameter type="integer" signed="true" index="11.0" size="2.0" param="TEMPERATURE"/>
<parameter size="1.0" index="11.0" type="integer" param="LEVEL"/>
<parameter size="0.3" index="12.4" type="integer" param="STATE_FLAGS"/>
</frame>
<frame id="STOP" type="#x" channel_field="10" direction="to_device">
<parameter const_value="201" size="1.0" index="11.0" type="integer"/>
</frame>
<frame id="OLD_LEVEL" direction="to_device" type="#x" channel_field="10">
<parameter type="integer" index="11.0" size="1.0" const_value="201"/>
</frame>
<frame id="STATE_LEVEL" type="#i" channel_field="10" direction="from_device" event="true">
<parameter size="1.0" index="11.0" type="integer" param="STATE"/>
</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>
<frame id="KEY_SIM_SHORT" type="#K" channel_field="10" direction="from_device" receiver_channel_field="11">
<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_SIM_LONG" type="#K" channel_field="10" direction="from_device" receiver_channel_field="11">
<parameter const_value="1" size="0.1" index="12.0" type="integer"/>
<parameter size="0.6" index="12.2" type="integer" param="COUNTER"/>
</frame>
<frame id="SET_LOCK" type="#l" channel_field="11" direction="to_device">
<parameter type="integer" index="12.0" size="1.0" param="INHIBIT"/>
</frame>
<frame id="TOGGLE_INSTALL_TEST" type="#x" channel_field="10" direction="to_device">
<parameter type="integer" index="11.0" size="1.0" param="TOGGLE_FLAG"/>
</frame>
</frames>

<channels>
<channel index="0" type="MAINTENANCE" count="1" class="maintenance" ui_flags="internal">
<paramset id="maint_ch_master" type="MASTER"/>
<paramset id="maint_ch_values" type="VALUES">
<parameter id="UNREACH" ui_flags="service" operations="read,event">
<logical type="boolean"/>
<physical type="integer" interface="internal" value_id="UNREACH"/>
</parameter>
<parameter id="STICKY_UNREACH" ui_flags="service" operations="read,write,event">
<logical type="boolean"/>
<physical type="integer" interface="internal" value_id="STICKY_UNREACH"/>
</parameter>
<parameter id="CONFIG_PENDING" ui_flags="service" operations="read,event">
<logical type="boolean"/>
<physical type="integer" interface="internal" value_id="CONFIG_PENDING"/>
</parameter>
</paramset>
</channel>

<channel index="1" type="SWITCH" count="4" physical_index_offset="-1">
<link_roles>
<target name="SWITCH"/>
</link_roles>
<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="20" address_step="9" address_start="0x038">
<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_ACTION_TYPE">
<logical type="option">
<option id="ON"/>
<option id="OFF"/>
<option id="INACTIVE"/>
<option id="TOGGLE" default="true"/>
</logical>
<physical type="integer" size="0.2" interface="eeprom">
<address index="+6.0"/>
</physical>
</parameter>
<parameter id="LONG_ACTION_TYPE">
<logical type="option">
<option id="ON"/>
<option id="OFF"/>
<option id="INACTIVE"/>
<option id="TOGGLE" default="true"/>
</logical>
<physical type="integer" size="0.2" interface="eeprom">
<address index="+6.2"/>
</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>
<parameter id="WORKING" operations="read,event" ui_flags="internal">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="STATE_FLAGS">
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
<event frame="ACK_STATUS"/>
</physical>
<conversion type="boolean_integer"/>
</parameter>
<parameter id="INHIBIT" operations="read,write,event" control="NONE" loopback="true">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="INHIBIT">
<set request="SET_LOCK"/>
</physical>
</parameter>
<parameter id="INSTALL_TEST" operations="write" ui_flags="internal">
<logical type="action"/>
<physical type="integer" interface="command" value_id="TOGGLE_FLAG" no_init="true">
<set request="TOGGLE_INSTALL_TEST"/>
</physical>
<conversion type="toggle" value="STATE" />
</parameter>
</paramset>

</channel>

<channel index="5" physical_index_offset="-1" count="6" type="SENSOR"> <!-- input sensor contact chan -->
<paramset type="MASTER" id="hmw_sensor_ch_master" address_start="0x0F" address_step="1">
    <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="true"/>
</parameter>
<parameter id="NOTIFY">
<logical type="option">
<option id="ON"/>
<option id="OFF" default="true"/>
</logical>
<physical size="0.1" type="integer" interface="eeprom">
<address index="+0.2"/>
</physical>
</parameter>
</paramset>

<paramset type="VALUES" id="hmw_sensor_ch_values">
<parameter id="SENSOR" operations="read,event" control="DOOR_SENSOR.STATE">
<logical type="boolean"/>
<physical type="integer" interface="command" value_id="STATE">
<event frame="STATE_LEVEL" auth_violate_policy="reject"/>
<get request="LEVEL_GET" response="STATE_LEVEL"/>
</physical>
</parameter>
<parameter id="INSTALL_TEST" operations="event" ui_flags="internal">
<logical type="action"/>
<physical type="integer" interface="command" value_id="TEST_COUNTER">
<event frame="STATE_LEVEL"/>
</physical>
</parameter>
</paramset>
</channel>

<channel index="11" type="KEY" count="6" physical_index_offset="-1"> <!-- input key chan -->
<link_roles>
<source name="SWITCH"/>
</link_roles>
<paramset id="hbw_input_ch_master" type="MASTER" address_start="0x15" address_step="2">
    <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="true"/>
</parameter>
<!-- don't allow to change, cause using same IO pins as input sensor contact channels
<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" default="true"/>
<option id="MOTIONSENSOR"/>
<option id="SWITCH"/>
<option id="PUSHBUTTON"/>
</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="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_link" type="LINK" channel_param="CHANNEL" peer_param="ACTUATOR" count="20" address_start="0x380" 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 type="VALUES" id="hbw_input_ch_values">
<parameter id="PRESS_SHORT" operations="event" 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" 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>

<channel index="17" type="BLIND" count="1" physical_index_offset="-1">
<link_roles>
<target name="SWITCH"/>
</link_roles>
<paramset id="hmw_blind_ch_master" type="MASTER" address_step="7" address_start="0x21">
<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="CHANGE_OVER_DELAY">
<logical type="float" unit="s" default="0.5" max="25.5" min="0.5"/>
<conversion type="float_integer_scale" offset="0.0" factor="10"/>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+1"/>
</physical>
</parameter>
<parameter id="REFERENCE_RUN_COUNTER">
<logical type="integer" default="0" max="100" min="0"/>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+2"/>
</physical>
</parameter>
<parameter id="REFERENCE_RUNNING_TIME_BOTTOM_TOP">
<logical type="float" unit="s" default="50.0" max="6000.0" min="0.1"/>
<conversion type="float_integer_scale" offset="0.0" factor="10"/>
<physical size="2.0" type="integer" interface="eeprom" endian="little">
<address index="+3"/>
</physical>
</parameter>
<parameter id="REFERENCE_RUNNING_TIME_TOP_BOTTOM">
<logical type="float" unit="s" default="50.0" max="6000.0" min="0.1"/>
<conversion type="float_integer_scale" offset="0.0" factor="10"/>
<physical size="2.0" type="integer" interface="eeprom" endian="little">
<address index="+5"/>
</physical>
</parameter>
</paramset>

<paramset type="LINK" id="hmw_blind_ch_link" peer_param="SENSOR" channel_param="CHANNEL" count="20" address_start="0x038" address_step="9">
<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_ACTION_TYPE">
<logical type="option">
<option id="OPEN"/>
<option id="STOP"/>
<option id="CLOSE"/>
<option id="TOGGLE" default="true"/>
<option id="LEVEL_SET"/>
<option id="INACTIVE"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom">
<address index="+6.0"/>
</physical>
</parameter>
<parameter id="SHORT_LEVEL_SET">
<logical type="float" min="0.0" max="1.0" default="0.5" unit="100%"/>
<conversion type="float_integer_scale" factor="200"/>
<physical type="integer" size="1.0" interface="eeprom">
<address index="+7"/>
</physical>
</parameter>
<parameter id="LONG_ACTION_TYPE">
<logical type="option">
<option id="OPEN"/>
<option id="STOP"/>
<option id="CLOSE"/>
<option id="TOGGLE"/>
<option id="LEVEL_SET"/>
<option id="INACTIVE" default="true"/>
</logical>
<physical type="integer" size="0.3" interface="eeprom">
<address index="+6.3"/>
</physical>
</parameter>
<parameter id="LONG_LEVEL_SET">
<logical type="float" min="0.0" max="1.0" default="0.5" unit="100%"/>
<conversion type="float_integer_scale" factor="200"/>
<physical type="integer" size="1.0" interface="eeprom">
<address index="+8"/>
</physical>
</parameter>
</paramset>

<paramset id="hmw_blind_ch_values" type="VALUES">
<parameter id="LEVEL" operations="read,write,event" control="BLIND.LEVEL">
<logical type="float" unit="100%" default="0.0" max="1.0" min="0.0"/>
<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="float_integer_scale" factor="200"/>
</parameter>
<parameter id="WORKING" ui_flags="internal" operations="read,event">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="STATE_FLAGS">
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
<event frame="ACK_STATUS"/>
</physical>
<conversion type="boolean_integer"/>
<conversion type="integer_integer_map">
<value_map parameter_value="1" device_value="0x04" mask="0x04"/>
<value_map parameter_value="0" device_value="0x00"/>
<value_map parameter_value="1" device_value="0x01"/>
<value_map parameter_value="1" device_value="0x02"/>
<value_map parameter_value="0" device_value="0x03"/>
</conversion>
</parameter>
<parameter id="DIRECTION" ui_flags="internal" operations="read,event">
<logical type="option">
<option id="NONE" default="true"/>
<option id="UP"/>
<option id="DOWN"/>
<option id="UNDEFINED"/>
</logical>
<physical type="integer" interface="command" value_id="STATE_FLAGS">
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
<event frame="ACK_STATUS"/>
</physical>
<conversion type="option_integer">
<value_map parameter_value="0" device_value="0x00"/>
<value_map parameter_value="1" device_value="0x01"/>
<value_map parameter_value="2" device_value="0x02"/>
<value_map parameter_value="3" device_value="0x03"/>
</conversion>
</parameter>
<parameter id="STOP" operations="write" control="BLIND.STOP">
<logical type="action"/>
<physical type="integer" interface="command" value_id="DUMMY">
<set request="STOP"/>
</physical>
</parameter>
<parameter id="INHIBIT" operations="read,write,event" loopback="true" control="NONE">
<logical type="boolean" default="false"/>
<physical type="integer" interface="command" value_id="INHIBIT">
<set request="SET_LOCK"/>
</physical>
</parameter>
<parameter id="INSTALL_TEST" ui_flags="internal" operations="write">
<logical type="action"/>
<physical type="integer" interface="command" value_id="TOGGLE_FLAG" no_init="true">
<set request="TOGGLE_INSTALL_TEST"/>
</physical>
<conversion type="blind_test" value="201"/>
</parameter>
</paramset>
</channel>

<channel index="18" count="1" physical_index_offset="-1" type="TEMPSENSOR">
<link_roles>
<source name="TEST"/>
</link_roles>
<paramset type="MASTER" id="hmw_input_ch_master" address_step="14" address_start="0x28">
<parameter id="SEND_DELTA_TEMP">
<logical type="float" unit="℃" default="0.5" min="0.1" max="25.0">
<special_value id="NOT_USED" value="0"/>
</logical>
<physical size="1.0" type="integer" interface="eeprom">
<address index="0.0"/>
</physical>
<conversion type="float_integer_scale" factor="10"/>
<conversion type="integer_integer_map">
<value_map to_device="false" from_device="true" parameter_value="5" device_value="0xff"/>
</conversion>
</parameter>
<parameter id="OFFSET">
<logical type="integer" min="-127" max="127" unit="℃"/>
<physical type="integer" size="1" interface="eeprom">
<address index="+1.0"/>
</physical>
<conversion type="integer_integer_scale" offset="127" factor="100"/>
<conversion type="integer_integer_map">
<value_map to_device="false" from_device="true" parameter_value="127" device_value="0xff"/>
</conversion>
</parameter>
<parameter id="SEND_MIN_INTERVAL">
   <logical type="integer" unit="s" default="10" min="5" max="3600">
<special_value id="NOT_USED" value="0"/>
   </logical>
   <physical size="2.0" type="integer" interface="eeprom" endian="little">
  <address index="+2.0"/>
   </physical>
   <conversion type="integer_integer_map">
<value_map to_device="false" from_device="true" parameter_value="10" device_value="0xffff"/>
   </conversion>
</parameter>
<parameter id="SEND_MAX_INTERVAL">
<logical type="integer" unit="s" default="150" min="5" max="3600">
<special_value id="NOT_USED" value="0"/>
</logical>
<physical size="2.0" type="integer" interface="eeprom" endian="little">
<address index="+4.0"/>
</physical>
<conversion type="integer_integer_map">
<value_map to_device="false" from_device="true" parameter_value="150" device_value="0xffff"/>
</conversion>
</parameter>
<parameter id="ONEWIRE_TYPE">
<logical type="option">
<option id="NOT_USED" default="true"/>
<option id="DS18B20"/>
<option id="DS18S20"/>
<option id="DS1822"/>
<option id="REMOVE_SENSOR"/>
</logical>
<physical size="1.0" type="integer" interface="eeprom">
<address index="+6.0"/>
</physical>
<conversion type="option_integer">
<value_map to_device="true" from_device="true" parameter_value="0" device_value="0xFF"/>
<value_map to_device="true" from_device="true" parameter_value="1" device_value="0x28"/>
<value_map to_device="true" from_device="true" parameter_value="2" device_value="0x10"/>
<value_map to_device="true" from_device="true" parameter_value="3" device_value="0x22"/>
<value_map to_device="true" from_device="false" parameter_value="4" device_value="0xFF"/>
</conversion>
</parameter>
</paramset>
<paramset type="VALUES" id="hmw_analog_input_values">
<parameter id="TEMPERATURE" operations="read,event">
<logical type="float" min="-273.15" max="327.67" unit="℃"/>
<physical type="integer" interface="command" value_id="TEMPERATURE">
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
</physical>
<conversion type="float_integer_scale" factor="100"/>
</parameter>
</paramset>
</channel>
</channels>
</device>


VG Andreas

loetmeister

Hi Andreas,

Was bedeutet "die Temperatur wird nicht angezeigt"? Wird 0 oder die default Temperatur - 217 Grad angezeigt? Letztes würde bedeuten das der Temperatur Kanal angelegt wurde aber was mit dem Sensor nicht stimmt.

Schalte doch mal die debug Ausgabe ein und schaue was im seriellen Monitor zu sehen ist.

Gruß,
Thomas

a_quadrat

Hallo Thomas,

es wird die Error Temp angezeigt: -273,14 und die OW Adresse wird nicht erkannt.


B: 2A 898
conf_OW addr: 10FFFFFFFFFFFFFF
R: FD:00:00:00:01:3C:00:01:97:7A:06:69:0F:00:00:50:40
R: FD:00:01:97:7A:59:00:00:00:01:02:52:E8
R: FD:00:00:00:01:3E:00:01:97:7A:06:69:0F:03:FF:1E:CE
R: FD:00:01:97:7A:79:00:00:00:01:02:B6:2E
T: FD:FF:FF:FF:FF:F8:42:00:00:23:12:41:00:97:01:00:01:48:42:57:37:32:39:36:32:39:31:2C:D2
T: FD:00:00:00:01:98:42:00:00:23:06:69:11:95:4E:B5:AC
R: FD:42:00:00:23:19:00:00:00:01:02:BE:F8
R: ACK
channel: 17 sent temp, c°C: -27314 SUCCESS!


Ich habe zum testen mal den HBW-1W-T10 Sketch aufgespielt. Damit funktioniert es. Der Fehler muss irgendwo in meinem Sketch liegen.

VG Andreas

loetmeister

Hi,,

Sieht ja gar nicht so schlecht aus...  ;)

Die one wire Adresse sieht komisch aus... Vermutlich passt die start Adresse nicht
#define ADDRESS_START_CONF_TEMP_CHAN 0x7 // first EEPROM address for temperature sensors configuration

Bei dir stand 0x28... Leider muss man das ausrechnen und eintragen. Eventuell kann man mal ein makro dafür erstellen..

Gruß,
Thomas

a_quadrat

Hallo Thomas,

benötige ich diese Zeile? Die ist doch nur für Direktverknüpfungen, oder?

#define LINKADDRESSSTART_TEMP 0xE6


und was muss ich hier eintragen? 0x28?


#define ADDRESS_START_CONF_TEMP_CHAN 0x7 // first EEPROM address for temperature sensors configuration


VG Andreas

loetmeister

Hallo Andreas,

Ja, LINKADDRESSSTART_TEMP ist nur nötig für direktverknüpfungen.

Wenn 0x28 die start Adresse der Temperatur Konfiguration ist, ja dann für ADDRESS_START_CONF_TEMP_CHAN eintragen. Das wird zum Speichern der Sensor IDs benutzt..

Gruß,
Thomas

a_quadrat

#6
woher weiss ich, welche die Startadresse ist? Ich hatte die 0x7 aus dem HBW-1W-T10 Sketch übernommen.

Die 0x28 ist eigentlich für den Kanal Temp - dachte ich zumindest.

loetmeister

Hi,

Ja, das ist die selbe Adresse aus "struct hbw_config".
Start der Temperatur Kanal Konfiguration.

Ich schaue mal ob man das etwas eleganter lösen kann..

Gruß,
Thomas

a_quadrat

Hi,

hmm, aber bei Modul HBW-1W-T10 ist die "ADDRESS_START_CONF_TEMP_CHAN 0x7" und in der "struct hbw_config" steht 0x07.

Ich habe 0x28 in der "ADDRESS_START_CONF_TEMP_CHAN" probiert, funktioniert auch nicht. Die OW Adresse passt nicht oder wird an der falschen Stelle abgelegt.

VG Andreas

loetmeister

Hi,

passen denn die Start-Adressen in der XML? Das ist ja das selbe.

In HBWOneWireTempSensors.h kannst du noch ein wenig zusätzliches logging einschalten:
#define EXTRA_DEBUG_OUTPUT   // even more debug output


Gruß,
Thomas

a_quadrat

Hi,

ja, die sollten passen, ich habe mal den extra debug eingestellt. Folgendes kommt raus:


B: 2A 898
conf_OW addr: FFFFFFFFFFFFFFFF
T: FD:FF:FF:FF:FF:F8:42:00:00:22:12:41:00:97:01:00:01:48:42:57:37:32:39:36:32:39:30:9A:72
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315
channel: 17 read temp, c°C: -27315


Die conf OW Adresse passt nicht. Könnte ich die richtige mal fest verdraten?

VG Andreas

loetmeister

Hi,

das passt nicht, weil nicht nach neuen Sensoren gesucht wird.  ;D
Das ist mir jetzt erst aufgefallen...

Sieht so aus als ob du vergessen hast g_ow, tempConfig bei der Anlage des devices zu übergeben:
device = new HBIODevice( ... , ...
g_ow, tempConfig);


Bei dir im Code ist nach den Links Schluss...

Gruß,
Thomas

a_quadrat

Hi,

danke, das habe ich vergessen, ist natürlich wichtig. Wir nähern uns auch schon dem Ziel. Die OW Adresse wird erkannt und gespeichert. Aber dann gehts wieder in OW search.
Hast du noch eine Idee?


B: 2A 896
OW sensorSearch
1-Wire device found: 28FF187F501502EC save to EEPROM, @startaddress: 34
OW sensorSearch


VG Andreas

loetmeister

Hallo Andreas,

Läuft sensorSearch in eine Schleife? Oder nur ein zweiter Aufruf direkt hintereinander?
sensorSearch wird über afterReadConfig beim device Start und nach jeder Änderung an der Kanal Konfiguration (egal welcher Kanal) über FHEM aufgerufen... Von alleine sollte das also nicht passieren.

Gruß,
Thomas

a_quadrat

Hallo Thomas,

der Bus ist aktuell nicht angeschlossen, ich wollte erstmal, das die Startprozedur durchläuft. Also ich drücke einmal den Reset Button und dann läuft es einmal bis zu dem gezeigten Punkt - keine Schleife. Dann geht es auch nicht weiter.

VG Andreas