HomeBrewWired - Diskussion zum Tutorial

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

Vorheriges Thema - Nächstes Thema

Jochen222

Hallo,

kennt jemand eine Möglichkeit einen USB-RS485 Adapter direkt an der CCU2 (nutze kein FHEM) zu betreiben am besten mit Tutorial?
Um mal ein bisschen mit "HM-Wired" zu spielen möchte ich nicht gleich den Ethernet Adapter kaufen.

Grüße,
Jochen

Thorsten Pferdekaemper

Hi,
ich frage mich, was das mit dem Tutorial zu tun hat...

Meines Wissens nach geht das mit dem USB-Adapter direkt an der CCU nicht. Der Ethernet-Adapter hat sein eigenes Protokoll, das die CCU benutzt. Ich hatte es schon einmal geschafft, einen USB-Adapter an einen RasPi anzuschließen, auf dem der HM485-Daemon von FHEM läuft. Im Prinzip spielt der RasPi dann Ethernet-Adapter und kann an die CCU angeschlossen werden.
Das kannst Du im Prinzip versuchen, wenn Du einen RasPi übrig hast.

Weiteren Support dafür will ich eigentlich nicht liefern, da es mit FHEM sowieso wunderbar funktioniert und das hier das FHEM-Forum ist. Wenn Du partout nicht FHEM einsetzen willst, dann must Du eher bei ELV/eq3 nachfragen.

Gruß,
   Thorsten


   
FUIP

aperoap

#62
Zitat von: Thorsten Pferdekaemper am 12 September 2017, 09:48:16
Vielleicht erbarmt sich ja jemand, wenn Du mal einen eigenen Thread dazu aufmachst.
Diese Frage gehört eigentlich in den Anfängerbereich. Ein Stichwort ist "notify". Du solltest Dir aber auf jeden Fall mal das Anfänger-PDF durchlesen.
Gruß,
   Thorsten

Hi,

mit "notify" habe ich als erstes versucht z.B.: define test notify HBW_Sen_Key_12_HBW6063361_01 set HBW_LC_Sw8_HBW7296257_01 toggle. bekomme leider mein Relays bei einem Klin ein und sofort wieder ausgeschaltet. Bekomme nicht hin, dass der Relays an bliebt und bei dem nächsten Kontakt wieder aus geht. Werde aber weiter schauen. Dachte geht mit peering viel einfacher :)

Event Monitor zeigt folgendes:
2017-09-12 17:44:49 HM485 HBW_Sen_Key_12_HBW6063361_01 press_short: 46
2017-09-12 17:44:49 HM485 HBW_Sen_Key_12_HBW6063361_01 press_short_46
2017-09-12 17:44:49 HM485 HBW_LC_Sw8_HBW7296257_01 set_toggle
2017-09-12 17:44:49 HM485 HBW_LC_Sw8_HBW7296257_01 set_toggle
2017-09-12 17:44:49 HM485 Dosen001 ACK
2017-09-12 17:44:49 HM485 HBW_LC_Sw8_HBW7296257_01 on
2017-09-12 17:44:49 HM485 Dosen001 ACK
2017-09-12 17:44:50 HM485 HBW_LC_Sw8_HBW7296257_01 off

der HBW_Sen gibt zwei werte zurück, damit komme ich nicht klar :)

Gruß
Arthur

Thorsten Pferdekaemper

Das müsste gehen:

define test notify HBW_Sen_Key_12_HBW6063361_01:press_short:.* set HBW_LC_Sw8_HBW7296257_01 toggle

Gruß,
   Thorsten
FUIP

aperoap

Zitat von: Thorsten Pferdekaemper am 12 September 2017, 21:27:32
Das müsste gehen:

define test notify HBW_Sen_Key_12_HBW6063361_01:press_short:.* set HBW_LC_Sw8_HBW7296257_01 toggle

Gruß,
   Thorsten

Top, vielen Dank
Gruß
Arthur

habl

Hallo Thorsten,

wollte mich nur einmal für dieses Tutorial bedanken!

Ich habe jetzt ein neues HBW_1W_T10 Gerät. Ich musste nur ein paar include-Anweisungen vom Sketch ändern, damit es mit dem Tutorial hier funktioniert aber jetzt bin ich begeistert!

also nochmal vielen, vielen Dank für deine Energie, die Du in HMW steckst!

frohe Festtage!
  habl

Thorsten Pferdekaemper

Zitat von: habl am 22 Dezember 2017, 10:11:42
wollte mich nur einmal für dieses Tutorial bedanken!
Danke für die nette Rückmeldung.

Zitat
Ich habe jetzt ein neues HBW_1W_T10 Gerät. Ich musste nur ein paar include-Anweisungen vom Sketch ändern, damit es mit dem Tutorial hier funktioniert aber jetzt bin ich begeistert!
Klingt gut. Könntest Du das Coding hier (oder vielleicht in einem neuen Thread zum HBW-1W-T10) zur Verfügung stellen? Ich wollte vor einer Weile das Ding schonmal auf die neuen Libraries umstellen, aber wenn Du das jetzt gemacht hast, dann kann ich mir das sparen. Ich würde mir Dein Coding dann mal kurz anschauen und es ins Git hochladen.

Gruß,
   Thorsten
FUIP

aperoap

Zitat von: habl am 22 Dezember 2017, 10:11:42
Hallo Thorsten,

wollte mich nur einmal für dieses Tutorial bedanken!

Ich habe jetzt ein neues HBW_1W_T10 Gerät. Ich musste nur ein paar include-Anweisungen vom Sketch ändern, damit es mit dem Tutorial hier funktioniert aber jetzt bin ich begeistert!

also nochmal vielen, vielen Dank für deine Energie, die Du in HMW steckst!

frohe Festtage!
  habl

ich wäre auch daran interessiert :)

Gruß
Arthur

Thorsten Pferdekaemper

Zitat von: aperoap am 27 Dezember 2017, 13:03:17
ich wäre auch daran interessiert :)
Schau mal hier:
https://forum.fhem.de/index.php?topic=81474
Ich habe mich allerdings noch nicht damit befasst.
Gruß,
   Thorsten
FUIP

Matthi140

Hallo Allerseits,

ich habe den Disskussions Thread nun auch gefunden  ;) ich habe das Tutorial nun auch komplett durch und in den Dateien noch ein wenig rum gespielt, die Kanäle mal erweitert, eine andere Reihenfolge gemacht usw. so wurden mir die Dateistrukturen des Sketches und der xml-Datei nach und nach als nicht Programmierprofi auch so halb wegs verständlich. Allerdings nutze kein FHEM sondern eine Homematic CCU. Das Tutorial kann man auch mit einer CCU 1:1 genau so durchspielen und es funktioniert genau so wie es soll  ;D. Man muss sich halt nur zugriff auf die Ordnerstruktur der CCU verschaffen um die XML-Datei dort ab zu legen, wie das geht findet man im Homematic Forum.
Ich habe mir dazu jetzt ein Testsystem aufgebaut mit einem RaspberryPi, wo eine CCU2 drauf läuft und dem LAN-RS485 Gateway, da mir das ganze in meinem Produktivsystem mit meiner alten CCU1 zu heiß ist, obwohl die ersten Schritte damit auch funktioniert haben. Das einzigste was bei der CCU Version nicht so Funktioniert, ist die Änderung der Geräteadresse. Dazu gibt es aber eine Anleitung von Thorsten in einem anderen Thread: https://forum.fhem.de/index.php/topic,64700.msg603285.html#msg603285

Ich habe mir jetzt sozusagen ein HBW-IO-6-Sw6-DIM3 (kann man das so nennen?) gebaut, also 6 Taster, 6Schaltausgänge und 3 Dimmausgänge.
Wie schon im Tutorial steht, funktionieren Direktverknüpfungen leider (noch) nicht. Daher die Frage, wann geht das Tutorial weiter mit den Direktverknüpfungen?

anbei noch den Sketch und die XML-Datei die ich gemacht habe und ein Screenshot meiner CCU


//
// HBW-IO-6-Sw6-DIM3 nachgebaut aus FHEM HBW-Tutorial
//

#define HMW_DEVICETYPE 0xAB

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0100

#include "HBWSoftwareSerial.h"
#include "HBWired.h"
#include "HBWSwitch.h" // für Schaltausgang
#include "HBWKey.h"  // für Tastereingang

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

// Definition of Dimmer channel

class DimmerChannel : public HBWChannel {
  public:
    DimmerChannel(uint8_t _pin, hbw_config_switch* _config);
    virtual uint8_t get(uint8_t* data);   
    virtual void loop(HBWDevice*, uint8_t channel);   
    virtual void set(HBWDevice*, uint8_t length, uint8_t const * const data);
  private:
    uint8_t pin;  // output pin, should be a PWM pin
    uint8_t current; // current value
    hbw_config_switch* config; // logging
    uint32_t lastFeedbackTime;  // when did we send the last feedback?
    uint16_t nextFeedbackDelay; // 0 -> no feedback pending
};


DimmerChannel::DimmerChannel(uint8_t _pin, hbw_config_switch* _config) {
    pin = _pin;
    config = _config;
    nextFeedbackDelay = 0;
    lastFeedbackTime = 0;
    // Pin auf OUTPUT
    // ...und auf LOW (also 0) setzen
    digitalWrite(pin,LOW);
    pinMode(pin,OUTPUT);
    current = 0;
};


void DimmerChannel::set(HBWDevice* device, uint8_t length, uint8_t const * const data) {
  if(length < 1) return;
  current = data[0];
  analogWrite(pin, (uint8_t)((uint16_t)(current) * 255 / 100));
  // Logging
  if(!nextFeedbackDelay && config->logging) {
      lastFeedbackTime = millis();
      nextFeedbackDelay = device->getLoggingTime() * 100;
  }
};


uint8_t DimmerChannel::get(uint8_t* data) {
  data[0] = current;
  return 1;
};


void DimmerChannel::loop(HBWDevice* device, uint8_t channel) {
  // feedback trigger set?
    if(!nextFeedbackDelay) return;
    unsigned long now = millis();
    if(now - lastFeedbackTime < nextFeedbackDelay) return;
    lastFeedbackTime = now;  // at least last time of trying
    // sendInfoMessage returns 0 on success, 1 if bus busy, 2 if failed
  // we know that the level has only 1 byte here
    uint8_t data[1];
    get(data);
    uint8_t errcode = device->sendInfoMessage(channel, 1, data);   
    if(errcode == 1) {  // bus busy
    // try again later, but insert a small delay
      nextFeedbackDelay = 250;
    }else{
      nextFeedbackDelay = 0;
    }
}

// END Dimmer channel

struct hbw_config {
  uint8_t  logging_time;     // 0x0001
  uint32_t central_address;  // 0x0002 - 0x0005
 
  hbw_config_key keycfg[6];        // 0x0006 - 0x0011   für 6x Schaltausgang je 2 Byte
  hbw_config_switch switchcfg[9];  // 0x0012 - 0x001D  für 6x Schaltausgang je 2 Byte
 
  } config;


HBWSoftwareSerial rs485(RS485_RXD, RS485_TXD);
HBWDevice* device = NULL;


HBWChannel* channels[15];   //für 15 Gesamtkanäle channels[15]

void setup()
{
  Serial.begin(19200);
  rs485.begin();


   //NEU für Tastereingang
  channels[0] = new HBWKey(A0,&(config.keycfg[0]));
  channels[1] = new HBWKey(A1,&(config.keycfg[1]));
  channels[2] = new HBWKey(A2,&(config.keycfg[2]));
  channels[3] = new HBWKey(A3,&(config.keycfg[3]));
  channels[4] = new HBWKey(A4,&(config.keycfg[4]));
  channels[5] = new HBWKey(A5,&(config.keycfg[5]));


  //NEU für Schaltausgang
  channels[6] = new HBWSwitch(8,&(config.switchcfg[0]));
  channels[7] = new HBWSwitch(9,&(config.switchcfg[1]));
  channels[8] = new HBWSwitch(10,&(config.switchcfg[2]));
  channels[9] = new HBWSwitch(11,&(config.switchcfg[3]));
  channels[10] = new HBWSwitch(12,&(config.switchcfg[4]));
  channels[11] = new HBWSwitch(13,&(config.switchcfg[5]));


   // NEU für Dimmer
  channels[12] = new DimmerChannel(5, &(config.switchcfg[6]));
  channels[13] = new DimmerChannel(6, &(config.switchcfg[7]));
  channels[14] = new DimmerChannel(7, &(config.switchcfg[8]));
 

  device = new HBWDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &rs485,RS485_TXEN,sizeof(config),&config, 15,channels,     // für 15 gesamtkanäle
                         &Serial,
                         NULL, NULL);
  hbwdebug(F("B: 2A\n"));
}


void loop()
{
  // call the HBW loop
  device->loop();
};


 

<!-------------- HBW-IO-6-Sw6-DIM3 nachgebaut aus FHEM HBW-Tutorial--------------------->

<?xml version="1.0"?>
<device eep_size="1024" version="01">
<supported_types>
<type priority="2" id="HBW-TUTORIAL" name="Das Geraet zum HBWired-Tutorial">
<parameter const_value="0xAB" 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"/>
</paramset>



<frames>
<!------------ Neu: frames für Key Events ------------------>
<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>

<!------------- NEU: frames für Schaltausgang und Dimmer -------------->

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


</frames>

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




<!------------------ Neu: Beschreibung Key-Channel Tastereingang 0x06 bis 0x11 ---------------------->

<channel index="1" type="KEY" count="6" physical_index_offset="-1">
<paramset id="hmw_input_ch_master" type="MASTER" address_step="2" address_start="0x06">
<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>



<!------------------- NEU: Beschreibung des Kanals Schaltausgang 0x12 bis 0x2D--------------------->

       
<channel index="7" type="SWITCH" count="6" physical_index_offset="-1">
      <paramset id="hmw_switch_ch_master" type="MASTER" address_step="2" address_start="0x12">
<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: Beschreibung Kanäle Dimmerausgang 0x2E bis 0x23---------------------->

<channel index="13" type="DIMMER" count="3" physical_index_offset="-1">
      <paramset id="hmw_dim_ch_master" type="MASTER" address_step="2" address_start="0x2E">
<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_dim_ch_values" type="VALUES">
<parameter id="LEVEL" operations="read,write,event" control="DIMMER.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>
</paramset>
</channel>




</channels>

</device>




Matthi140

Guten Morgen, nochmal ich

mir ist aufgefallen bei den Dimmern stimmt etwas nicht, undzwar wird 2 mal gedimmt von 0 bis 100%. also 0-50% in der CCU deckt die volle Bandbreite ab und dann nochmal von 51% - 100% das selbe. Also die helligkeit von 1% ist die selbe wie die von 51%, nämlich ganz dunkel. 25%=75%, 30=80% 50% = 100% usw...

wo liegt hier der fehler? ich steig da nicht durch.   :-\


MfG Matthi



Thorsten Pferdekaemper

Hi,
ich habe momentan keine Planung, das Tutorial weiterzuführen. Du kannst Dir aber mal das hier anschauen, da sind Direktverknüpfungen implementiert:
https://github.com/ThorstenPferdekaemper/HBWired/tree/master/HBW-Sen-Key-12
In den Libs sind die Verzeichnisse, die mit HBWLink anfangen für Direktverknüpfungen. Die Dinger müssen von HBWLinkSender bzw. HBWLinkReceiver abgeleitet sein.

Dein anderes Problem lässt sich vermutlich so lösen:
Anstatt

analogWrite(pin, (uint8_t)((uint16_t)(current) * 255 / 100));

...muss es so heißen:

analogWrite(pin, (uint8_t)((uint16_t)(current) * 255 / 200));

Gruß,
    Thorsten

FUIP

Matthi140

Hallo,

vielen Dank, Problem 2 hat sich damit erledigt  ;D Dimmer gehen jetzt anständig von 0 bis 100%, allerdings musste ich Pin 7 mit pin 9 tauschen, da Pin7 am UNO kein PWM kann.

Die Sache mit den Direktverknüpfungen ist dann wohl vermutlich nochmal ne Nachtschicht, falls ich das überhaupt verstehe  :-\ aber heut nicht mehr, nächstes Wochenende vielleicht.

MfG Matthi


Matthi140

Hallo, ich bin gerade dabei zu versuchen das zu verstehen, HBW-Sen-Key-12  ist leider auss meiner Sicht komplett anders aufgebaut als das HBW Tutorial  :(

bei dem Tutorial ist alles für mich gut nachvollziehbar einzeln aufgeführt und bei dem Sen-Key-12 als Array (was ich bis jetzt nicht wirklich verstanden habe)

Unterschiede gibts ja schon bei den Librarys, beim Sen-Key-12 habe ich FreeRam.h, Clickbutton.h, und HBWLinkKey.h.
Beim Tutorial gibts statt dessen HBWSwitch.h, HBWKey.h wobei ich verstanden habe das HBWSwitch für die Schaltausgänge, bzw. Dimmer ist und HBWKey.h für die Tastereingänge. Ich nehme an HBWLinkKey.h ist für die Directverknüpfung.

Demnach habe ich jetzt das Problem mit: HBWKey.h  vs.  Clickbutton.h
  --> Worin besteht da der unterschied?
und was macht Freeram.h?

eines habe ich auch festgestellt, im Tutorial heißt es "channels" und "conficg.keycfg"
channels[0] = new HBWKey(A0,&(config.keycfg[0]));

beim Sen-Key-12 heißt es "keys" und "hbwconfig.keys"
keys[i] = new HBSenKey(pins[i], &(hbwconfig.keys[i]));

Scheint mir, das es am Ende wohl das selbe ist, aber ich verstehe das nicht wirklich. Kannst du mir das mal erläutern?


MfG Matthi





Thorsten Pferdekaemper

Zitat von: Matthi140 am 21 Februar 2018, 21:23:13
bei dem Tutorial ist alles für mich gut nachvollziehbar einzeln aufgeführt und bei dem Sen-Key-12 als Array (was ich bis jetzt nicht wirklich verstanden habe)
Verstehst Du Arrays in C++ nicht oder nur das, was da beim Sen-Key-12 läuft nicht?

Zitat
Demnach habe ich jetzt das Problem mit: HBWKey.h  vs.  Clickbutton.h
  --> Worin besteht da der unterschied?
Clickbutton.h ist eine Library, die es einfacher macht, Einfach- und Mehrfachklicks etc. zu erkennen. Das hat mit HBW erstmal nichts zu tun. Die Entsprechung von HBWKey.h ist die Klasse HBSenKey, die direkt im HBW-Sen-Key-12.ino deklariert und definiert ist.

Zitat
und was macht Freeram.h?
Das ist nur eine kleine Funktion, die den freien Speicher berechnet. Das ist auf so kleinen Maschinchen wie einem Arduino ganz nützlich.

Zitat
eines habe ich auch festgestellt, im Tutorial heißt es "channels" und "conficg.keycfg"
channels[0] = new HBWKey(A0,&(config.keycfg[0]));

beim Sen-Key-12 heißt es "keys" und "hbwconfig.keys"
keys[i] = new HBSenKey(pins[i], &(hbwconfig.keys[i]));

Scheint mir, das es am Ende wohl das selbe ist, aber ich verstehe das nicht wirklich. Kannst du mir das mal erläutern?
Da sind halt die Namen der Variablen anders. Das ist aber egal. Ansonsten wollte ich mir nur sparen, 12mal im Wesentlichen denselben Kram hinzuschreiben.
Gruß,
   Thorsten
FUIP