HomeBrewWired - Diskussion zum Tutorial

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

Vorheriges Thema - Nächstes Thema

grogo

Perfekt, herzlichen Dank :)

Funktioniert super :) Wäre ich nie darauf bekommen

holle75

#91
Thorsten! .... Da ja mein kompletter Mini-Biohof mittlerweile auf HomematicWired/fhem basiert, sprich, mit auf deiner Arbeit, muß ich mich natürlich (erneut) bei dir bedanken und wollte das als Intro nutzen, um dich ganz direkt zu belästigen ... Ich Schlitzohr ;) ....  falls du Zeit, Lust und Muse hast.

Neue Idee: Hühnerstall automatisieren. Zumindest erstmal die Klappe. Wasser, Futter dann später

Habe jetzt (erneut) dein arduino-Tutorial angelesen und war ein wenig erschlagen von diesem buchverdächtigem Erguss. Toll.
Da ich aber von der Natur gerade arbeitstechnisch erschlagen werde, muß ich zeitlich sorgsam haushalten.

Kurzer Umriss: Ein Schrittmotor (eher DC-Getriebemotor) wird über eine Steuerung per Winde eine Klappe hoch und runterbewegen. Türzustand offen/zu stelle ich mir über Reedkontake vor.

https://www.amazon.de/gp/product/B07559FCRN/ref=ox_sc_act_title_4?smid=A2F7JN9V2AWTSH&psc=1
https://www.amazon.de/gp/product/B01KBTNHS6/ref=ox_sc_act_title_6?smid=A2SNG6HWOGXVFR&psc=1
https://www.amazon.de/gp/product/B000ZGI1Y6/ref=ox_sc_act_title_3?smid=A3JWKAKR8XB7XF&psc=1

Die Automation in fhem sollte kein Problem sein, aber die Ansteuerung der Winde und die Weitergabe der Info auf/zu an fhem.

Da scheint ein Homebrew Arduino auf den ersten Blick ideal??!!

So, viele Worte .... die eigentliche Frage: könntest du mir einen Tip für die richtige Richtung geben? Also welcher Homebrew-Arduino, mit welchem Sketch eine gute Basis abgeben würde?

tausend Dank
H.

ps: und ein Thermometer mit Steuerung für einen Ventilator auch mit auf dem Arduino wär dann natürlich noch eine zukünftige Idee ;)




loetmeister

Zitat von: holle75 am 13 Juni 2018, 13:18:20
Kurzer Umriss: Ein Schrittmotor (eher DC-Getriebemotor) wird über eine Steuerung per Winde eine Klappe hoch und runterbewegen.
Hi,
Klingt für mich nach einem einfachen Rollo Aktor...  ;D

PS: Wäre das nicht besser ein eigener Thread im Homematic Forum oder der Bastelecke?  ::)

Gruß,
Thomas

holle75

#93
Hallo Thomas, du wirst lachen, jetzt die letzten Stunden dank eines Foren-Kollegen auch auf die Idee eines Rolladens gekommen :)

Trotzdem, wenn man die Sache weiterdenkt (Beleuchtung, Temperatur, Belüftung, Kosten) wäre ein "Kleincomputer" der über HomematicWired kommuniziert dann schon die elegante Lösung.

Und genau da liegt mein aktuelles Problem. Was Thorsten da geschrieben hat ist soooo viel, dass ich noch nicht ganz verstehe, was eigentlich geht und was nicht.... und vielleicht wäre es dann was für die Bastelecke.

Thorsten Pferdekaemper

Zitat von: holle75 am 13 Juni 2018, 13:18:20Da ich aber von der Natur gerade arbeitstechnisch erschlagen werde, muß ich zeitlich sorgsam haushalten.
...und deshalb fragst Du andere, Dir das hier abzunehmen? Sorry, aber das hast Du mindestens sehr ungeschickt formuliert. Wenn Du dafür keine Zeit hast, dann lass es lieber.

Zitat
Kurzer Umriss: Ein Schrittmotor (eher DC-Getriebemotor)
Ja watt denn nu?

Zitat
wird über eine Steuerung per Winde eine Klappe hoch und runterbewegen. Türzustand offen/zu stelle ich mir über Reedkontake vor.
Wichtig ist dabei, dass die Endabschaltung jeweils unabhängig von allem anderen passieren muss.
Ansonsten ist das im Prinzip tatsächlich ein Rolloaktor. Ich denke, dafür gibt es schon HBW-Lösungen.

Zitat
ps: und ein Thermometer mit Steuerung für einen Ventilator auch mit auf dem Arduino wär dann natürlich noch eine zukünftige Idee ;)
Zum Thermometer gibt es auch schon was. Ich glaube, ich hatte dazu auch mal eine Channel-Klasse geschrieben. Das XML dazu gibt's ja schon lang.

Zitat von: holle75 am 13 Juni 2018, 21:09:54
Trotzdem, wenn man die Sache weiterdenkt (Beleuchtung, Temperatur, Belüftung, Kosten) wäre ein "Kleincomputer" der über HomematicWired kommuniziert dann schon die elegante Lösung.
Das geht nicht wirklich. HMW ist relativ starr. Man kann zwar einem Kanal beibringen, zwei verschiedene Sachen zu können (z.B. Ein-/Ausgang, Analog/Digital oder so), aber nicht mehr. Außerdem ist die Anzahl der Kanäle fest.
Meine Strategie ist die, dass ich so viel wie möglich als Original-Teile kaufe und nur dass, was gar nicht anders geht, selbst zusammenbaue. Alles andere kann ich mir nicht leisten.

Gruß,
   Thorsten
FUIP

holle75

Zitat von: Thorsten Pferdekaemper am 17 Juni 2018, 20:28:44
...und deshalb fragst Du andere, Dir das hier abzunehmen? Sorry, aber das hast Du mindestens sehr ungeschickt formuliert. Wenn Du dafür keine Zeit hast, dann lass es lieber.

Finde ich nicht sonderlich ungeschickt formuliert. Das war meine Erklärung warum ich gerade nicht 50 Stunden investieren kann (obwohl ich gerne wollte) um mir es selber zu erarbeiten, sondern stattdessen nette Menschen hier im Forum frage die 10 Minuten brauchen um mir zu sagen, ob ich falsch oder richtig liege (mit der Homebrew Idee) ... denke das ist ein Forums-Prinzip?

Zitat von: Thorsten Pferdekaemper am 17 Juni 2018, 20:28:44
Ja watt denn nu?
Ich bin kein Mechatroniker. Kennst du den dedizierten Unterschied zwischen einem Schrittmotor und einem DC-Getriebemotor? Da lass ich sowas lieber mal offen.

Zitat von: Thorsten Pferdekaemper am 17 Juni 2018, 20:28:44
Wichtig ist dabei, dass die Endabschaltung jeweils unabhängig von allem anderen passieren muss.
Ansonsten ist das im Prinzip tatsächlich ein Rolloaktor. Ich denke, dafür gibt es schon HBW-Lösungen.
Zum Thermometer gibt es auch schon was. Ich glaube, ich hatte dazu auch mal eine Channel-Klasse geschrieben. Das XML dazu gibt's ja schon lang.
Das geht nicht wirklich. HMW ist relativ starr. Man kann zwar einem Kanal beibringen, zwei verschiedene Sachen zu können (z.B. Ein-/Ausgang, Analog/Digital oder so), aber nicht mehr. Außerdem ist die Anzahl der Kanäle fest.
Meine Strategie ist die, dass ich so viel wie möglich als Original-Teile kaufe und nur dass, was gar nicht anders geht, selbst zusammenbaue. Alles andere kann ich mir nicht leisten.

Gruß,
   Thorsten

Danke Thorsten für deine Hilfe. Jetzt weiß ich, dass wahrscheinlich ein anderer Weg (Rolladen mit Jalousieaktor und separate Steuerung für Temperatur/Lüftung) richtiger sein wird. Nice, 50 Stunden gespart ;)

lieb Gruß
H.

torsten8791

Hallo zusammen.

Thorsten, klasse Tutorial und eine sehr schöne Library!

Ich möchte mir eine S0->Homematic Device bauen. Dafür setze ich auf HBW-SEN-EP auf. Im derzeitigen Design ist es (soweit ich das sehe) nicht möglich die Zählerwerte über Fhem zu setzen. Da die S0-Pulse aber nur relative Änderungen pro Zeit angeben, müsste nach der Initalisierung des Gerätes der aktuelle Zählerstand vermerkt werden können. Zwischenspeichern nach Stromausfall könnte man z. B. über FRam machen.

Nun habe ich versucht dies über die XML-Datei zu realisieren. Das war soweit auch ganz einfach.
<parameter id="GESAMT" operations="read,event,write" control="NONE">
<logical type="float" min="0" max="4294967295"/>
<physical type="integer" interface="command" value_id="COUNTER">
<set request="LEVEL_SET"/>
<get request="LEVEL_GET" response="INFO_LEVEL"/>
<event frame="INFO_LEVEL"/>
</physical>
<conversion type="float_integer_scale" factor="1"/>
</parameter>

Nur kann ich in Fhem den Zählerwert nicht setzen, weil kein entsprechendes Control rechts neben dem Wert angezeit wird.

Und soweit ich das bis jetzt gesehen habe, gibt es auch gar kein Control, welche die Eingabe einer ganzen beliebigen Zahl ermöglicht.

Gefunden habe ich in device.pm

'switch.state' => "on:noArg off:noArg toggle:noArg"
  'blind.level' => "slider,0,1,100 on:noArg off:noArg up:noArg down:noArg",
    'blind.stop' => "noArg",
    'dimmer.level' => "slider,0,1,100 on:noArg off:noArg",
    'valve.level' => "slider,0,1,100 on:noArg off:noArg",
    'button.long' => "noArg",
    'button.short' => "noArg",
    'digital_analog_output.frequency' => "slider,0,1,50000",

Und das passt alles nicht so richtig auf die Anforderung.

Vielleicht hat jemand eine Idee, wie das zu realisieren ist.

Viele Grüße und herzlichen Dank für Eure Antwort,
Torsten

Thorsten Pferdekaemper

Hi,
gibt es auch bei den <frames> einen Eintrag mit LEVEL_SET mit param = counter ?
Gruß,
   Thorsten
FUIP

torsten8791

Hi Thorsten.
Ja:

<frames>
<frame id="LEVEL_SET" type="#x" channel_field="10" direction="to_device">
<parameter type="integer" signed="true" index="11.0" size="4.0" param="COUNTER"/>
</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 type="integer" signed="true" index="11.0" size="4.0" param="COUNTER"/>
<parameter type="integer" signed="true" index="15.0" size="4.0" param="UNITVALUE"/>
</frame>
</frames>


Wenn ich als Control z. B. dimmer.level einsetze, dann kommen die Setzbefehle an. Ich kann allerdings dann nur Werte zwischen 0 und 100 setzen.

Viele Grüße,
Torsten

Thorsten Pferdekaemper

Hi,
lass man das control="NONE" ganz weg.
Gruß,
   Thorsten
FUIP

torsten8791

Das funktioniert.

Vielen Dank für den schnellen Support!

Viele Grüße,
Torsten

grogo

Hallo Thorsten,

leider habe ich noch das Problem, dass lange Tasterdrücke nicht erkannt werden, nur kurze.

Habe dann wie im Tutorial erwähnt die HBWSwitch.h neu heruntergeladen und aktualisiert. (Eigentlich stehen doch für die Eingänge alles in der HBWKEY.h oder?)

Leider klappt der lange Tasterdruck immer noch nicht :(

Hast du noch eine Idee oder einen Tipp?

Gruß,
Grogo

Thorsten Pferdekaemper

Zitat von: grogo am 14 August 2018, 20:48:34
Habe dann wie im Tutorial erwähnt die HBWSwitch.h neu heruntergeladen und aktualisiert. (Eigentlich stehen doch für die Eingänge alles in der HBWKEY.h oder?)
Das mit dem HBWSwitch.h war ein Problem mit dem Layout des Geräte-EEPROMs im Vergleich zur Repräsentation im RAM. Dadurch wurde in den Nachfolgenden HBWKey-Instanzen was verschoben. Wenn man HBWSwitch nicht benutzt, dann sollte das auch kein Problem sein.

Zitat
Leider klappt der lange Tasterdruck immer noch nicht :(
Hast du noch eine Idee oder einen Tipp?
Naja, ich habe keine Glaskugel. Gib mal ein list von dem Device bzw. dem Kanal und stelle mal Deinen Sketch hier rein, zusammen mit der Gerätebeschreibungsdatei.

Gruß,
   Thorsten
FUIP

grogo

Stimmt.

Hier mal in die RS485 reingehörcht mit unterschiedlichen Druckzeiten:
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:26:0B:86
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:2A:CB:9E
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:2E:8B:96
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:32:5B:AC
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:36:1B:A4
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:3A:DB:BC
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:3E:9B:B4
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:42:2B:42
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:46:6B:4A
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:4A:AB:52
R: FD:FF:FF:FF:FF:F8:42:DA:80:82:06:4B:13:00:4E:EB:5A

und hier mein Sketch:
//*******************************************************************

// Gibt den Typen des HBWired Moduls an
// 0x81 Device HBW-1W-T10 Temperaturmodul 1 wired für 10 Temperatursensoren
// 0xAB Device HBW-TER-MOD42 Modul für 4 Relais und 2 Taster (TEST)
// 0xAC Device HBW-TER-MOD1616
#define HMW_DEVICETYPE 0xAC

// Gibt GeräteAdresse des HBWired Moduls an
// #define HMW_ADDRESS 0x42FFFF01

#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x0100

#include "HBWired.h"
#include "HBWSwitch.h" 
#include "HBWKey.h"
#include "EEPROM.h"

#define RS485_TXEN 3  // Transmit-Enable

bool code1;
bool code2;
bool code3;
bool code4;

struct hbw_config {
  uint8_t  logging_time;     // 0x0001
  uint32_t central_address;  // 0x0002 - 0x0005
  // vier relais (switches) je 2 Byte
  hbw_config_switch switchcfg[15];  // 0x0006 - 0x0026
  // zwei Taster (keys)  je 2 Byte
  hbw_config_key keycfg[15];        // 0x0027 - 0x0046
} config;

// uint32_t ownaddress = HMW_ADDRESS;

HBWDevice* device = NULL;

//NEU (32 Kanaele = 16 SWITCH (RELAIS) 16 KEY (TASTER))
HBWChannel* channels[32];

void setup()
{
  Serial.begin(19200);
  Serial3.begin(19200,SERIAL_8E1);

  // Port Konfig für SLOT Kennung
  pinMode(11, INPUT);
  pinMode(10, INPUT);
  pinMode(9, INPUT);
  pinMode(5, INPUT);
 
  //rs485.begin();

  // Definition mehrerer Kanaele pro Typ
  // Relais Port A
  channels[0] = new HBWSwitch(36,&(config.switchcfg[0]));
  channels[1] = new HBWSwitch(37,&(config.switchcfg[1]));
  channels[2] = new HBWSwitch(34,&(config.switchcfg[2]));
  channels[3] = new HBWSwitch(35,&(config.switchcfg[3]));
  channels[4] = new HBWSwitch(32,&(config.switchcfg[4]));
  channels[5] = new HBWSwitch(33,&(config.switchcfg[5]));
  channels[6] = new HBWSwitch(30,&(config.switchcfg[6]));
  channels[7] = new HBWSwitch(31,&(config.switchcfg[7]));
  // Relais Port B
  channels[8] = new HBWSwitch(28,&(config.switchcfg[8]));
  channels[9] = new HBWSwitch(26,&(config.switchcfg[9]));
  channels[10] = new HBWSwitch(27,&(config.switchcfg[10]));
  channels[11] = new HBWSwitch(29,&(config.switchcfg[11]));
  channels[12] = new HBWSwitch(24,&(config.switchcfg[12]));
  channels[13] = new HBWSwitch(22,&(config.switchcfg[13]));
  channels[14] = new HBWSwitch(23,&(config.switchcfg[14]));
  channels[15] = new HBWSwitch(25,&(config.switchcfg[15]));
  // Taster Port A
  channels[16] = new HBWKey(43,&(config.keycfg[0]));
  channels[17] = new HBWKey(48,&(config.keycfg[1]));
  channels[18] = new HBWKey(51,&(config.keycfg[2]));
  channels[19] = new HBWKey(47,&(config.keycfg[3]));
  channels[20] = new HBWKey(39,&(config.keycfg[4]));
  channels[21] = new HBWKey(49,&(config.keycfg[5]));
  channels[22] = new HBWKey(53,&(config.keycfg[6]));
  channels[23] = new HBWKey(52,&(config.keycfg[7]));
  // Taster Port B
  channels[24] = new HBWKey(46,&(config.keycfg[8]));
  channels[25] = new HBWKey(50,&(config.keycfg[9]));
  channels[26] = new HBWKey(45,&(config.keycfg[10]));
  channels[27] = new HBWKey(42,&(config.keycfg[11]));
  channels[28] = new HBWKey(44,&(config.keycfg[12]));
  channels[29] = new HBWKey(41,&(config.keycfg[13]));
  channels[30] = new HBWKey(38,&(config.keycfg[14]));
  channels[31] = new HBWKey(40,&(config.keycfg[15]));


  //Eigene Adresse in die obersten Bytes vom EEPROM schreiben
  //setOwnAddress(ownaddress);

  EEPROM.write(E2END - 3, 0x42);
  EEPROM.write(E2END - 2, 0xDA);
  EEPROM.write(E2END - 1, 0x80);
  // SLOT1 = 81, SLOT2=82, SLOT3=83, SLOT4=84, SLOT5=85, SLOT6=86, SLOT7=87, SLOT8=88, SLOT9=89
  code1 = !(digitalRead(11));
  code2 = !(digitalRead(10));
  code3 = !(digitalRead(9));
  code4 = !(digitalRead(5));
   
  if(code1==HIGH && code2==LOW && code3==LOW && code4==LOW) {
    EEPROM.write(E2END, 0x81);
    hbwdebug(F("A: Modul Slot 1\n"));
  }
  if(code1==LOW && code2==HIGH && code3==LOW && code4==LOW) {
    EEPROM.write(E2END, 0x82);
    hbwdebug(F("A: Modul Slot 2\n"));
  }
  if(code1==HIGH && code2==HIGH && code3==LOW && code4==LOW) {
    EEPROM.write(E2END, 0x83);
    hbwdebug(F("A: Modul Slot 3\n"));
  }
  if(code1==LOW && code2==LOW && code3==HIGH && code4==LOW) {
    EEPROM.write(E2END, 0x84);
    hbwdebug(F("A: Modul Slot 4\n"));
  }
  if(code1==HIGH && code2==LOW && code3==HIGH && code4==LOW) {
    EEPROM.write(E2END, 0x85);
    hbwdebug(F("A: Modul Slot 5\n"));
  }
  if(code1==LOW && code2==HIGH && code3==HIGH && code4==LOW) {
    EEPROM.write(E2END, 0x86);
    hbwdebug(F("A: Modul Slot 6\n"));
  }
  if(code1==HIGH && code2==HIGH && code3==HIGH && code4==LOW) {
    EEPROM.write(E2END, 0x87);
    hbwdebug(F("A: Modul Slot 7\n"));
  }
  if(code1==LOW && code2==LOW && code3==LOW && code4==HIGH) {
    EEPROM.write(E2END, 0x88);
    hbwdebug(F("A: Modul Slot 8\n"));
  }
  if(code1==HIGH && code2==LOW && code3==LOW && code4==HIGH) {
    EEPROM.write(E2END, 0x89);
    hbwdebug(F("A: Modul Slot 9\n"));
  }
 
  device = new HBWDevice(HMW_DEVICETYPE, HARDWARE_VERSION, FIRMWARE_VERSION,
                         &Serial3,RS485_TXEN,sizeof(config),&config,
                         // NEU (32 Kanaele)
                         32,channels,
                         &Serial,
                         NULL, NULL);
  hbwdebug(F("B: HBW-TER-MOD1616 Version 2A\n"));
}


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

Brauchst du noch die .h und/oder .cpp Sketchs?

Besten Dank

Thorsten Pferdekaemper

Hi,
Du solltest Dir mal code-Tags angewöhnen für's Forum. So ist das etwas grausam.
...außerdem wäre ein eigener Thread für sowas auch besser.
Ich erkenne auf den ersten Blick erstmal nichts böses. Ich vermute aber mal trotzdem, dass die long_press_time in der Key-Config nicht richtig sitzt. Meistens ist da was an der Gerätebeschreibungsdatei faul (dem XML). Deswegen habe ich nach all den Sachen gefragt. Ansonsten solltest Du vielleicht erst einmal ein Gerät mit genau einem Eingang machen und es damit probieren. Wenn das geht, dann nach und nach erweitern.
Gruß,
   Thorsten
FUIP