Modul für HB-UNI-Sen-CAP-MOIST

Begonnen von joffi, 14 Juli 2019, 23:43:38

Vorheriges Thema - Nächstes Thema

joffi

Hallo,
habe einen DIY Sensor für 7x Bodenfeuchtemessung zusammengebaut.
https://technikkram.net/2019/05/anleitung-diy-feuchtigkeitssensor-fuer-gartenbewaesserung-bausatz-homematic
Der Sensor meldet sich bei FHEM als HM_F31103 und Modell "unknown". Für HOMEMATIC hat Jerome Pech ein Addon geschrieben um es dort einzubinden.
Gibt es ein Modul, das man anpassen kann (dachte da an HMConfig_SenTHPL.pm).
Hat einer Erfahrung mit so etwas und kann mir einen Hinweis geben, wo ich mich einlesen kann, wie das ganze funktioniert?
Liebe Grüße

papa

Bin bin gerade dabei, einige Geräte in dem AskSin++ Addon zu integrieren. Habe mal den aktuellen Stand eingecheckt. Der HB-UNI-Sen-CAP-MOIST-T ist da mit drin. Aber nur mit einen Channel. FHEM unterstützt die variable Anzahl der Kanaäle leider nicht. Bitte das ReadMe beachten und entspreched in FHEM installieren.

https://github.com/pa-pa/AskSinPP/tree/master/examples/custom/contrib/FHEM
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

joffi

Hi,
nett dass du dich so schnell meldest.
Mein Sensor hat das Model "F311". Nachdem ich es in der HMConfig_AskSin...pm angepasst habe wird der Sensor auch definiert. Allerdings bekomme ich keine Werte.
Hier die Ausgabe des seriellen Monitors vom Arduino:
AskSin++ V4.1.0 (Jul 14 2019 18:40:57)
Address Space: 32 - 319
CC init1
CC Version: 14
- ready
iVcc: 3372
eVcc: 3753
Config Freq: 0x21661A
ID: F31103  Serial: JPCAPM0003
*LOW BAT Limit: 22
*Wake-On-Radio: 0
*Sendeintervall: 30
Config changed List1
*HIGHValue (#1): 830
*LOWValue  (#1): 420
Config changed List1
*HIGHValue (#2): 830
*LOWValue  (#2): 420
Config changed List1
*HIGHValue (#3): 830
*LOWValue  (#3): 420
Config changed List1
*HIGHValue (#4): 830
*LOWValue  (#4): 420
Config changed List1
*HIGHValue (#5): 830
*LOWValue  (#5): 420
Config changed List1
*HIGHValue (#6): 830
*LOWValue  (#6): 420
Config changed List1
*HIGHValue (#7): 830
*LOWValue  (#7): 420
+Sensor    (#7) V: 830
+Humidity  (#7) %: 0
+Battery   (#7) V: 38
<- 0E 01 84 70 F31103 000000 00 00 00 07 26  - 3311
+Sensor    (#6) V: 833
+Humidity  (#6) %: 0
+Battery   (#6) V: 38
<- 0E 02 84 70 F31103 000000 00 00 00 06 26  - 3954
+Sensor    (#5) V: 840
+Humidity  (#5) %: 0
+Battery   (#5) V: 38
<- 0E 03 84 70 F31103 000000 00 00 00 05 26  - 4595
+Sensor    (#4) V: 787
+Humidity  (#4) %: 11
+Battery   (#4) V: 38
<- 0E 04 84 70 F31103 000000 00 00 0B 04 26  - 5238
+Sensor    (#3) V: 799
+Humidity  (#3) %: 8
+Battery   (#3) V: 38
<- 0E 05 84 70 F31103 000000 00 00 08 03 26  - 5879
+Sensor    (#2) V: 802
+Humidity  (#2) %: 7
+Battery   (#2) V: 38
<- 0E 06 84 70 F31103 000000 00 00 07 02 26  - 6522
+Sensor    (#1) V: 806
+Humidity  (#1) %: 6
+Battery   (#1) V: 38
<- 0E 07 84 70 F31103 000000 00 00 06 01 26  - 7163

Für die 7 Chanels wird also immer gesendet hier für Channel 1
<- 0E 07 84 70 F31103 000000 00 00 06 01 26  - 7163
Kannst Du mir sagen, was diese Werte bedeuten? Das einzige was mir klar ist, ist F31103 (ID des Senders)
Liebe Grüße

papa

Sicherlich weil das Addon einen CAP-MOST-T implementiert. Der hat im Kanal 1 einen Temperatursensor und dadurch auch ein unterschiedliches Nachrichtenformat. Du kannst nicht einfach das Model ändern und glaucb dass dann alles wie von Hexenhand funktioniert.
Außerdem scheint für jeden Kanal eine extra Nachricht gesendet zu werden. Das ist bei dem aktuellen Sketch auch nicht mehr der Fall.
Welche Version des Sketches verwendest Du denn ?
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

joffi

Hallo,
habe heute den aktuellen Sketch von Jerome auf die 7 Analog-Kanäle angepasst und hochgeladen. Jetzt sendet er nur noch eine Zeile mit 8 Kanälen (1. ist für die Batterie. Dann habe ich dein Modul hergenommen, und F312   mit Temperatursensor auf F311 kopiert und angepasst (obwohl ich nicht so genau wusste was ich tat:)).###########################
## Eingefügt FP 16.07.2019
###########################
$HMConfig::culHmModel{"F311"} = {name=>"HB-UNI-Sen-CAP-MOIST",st=>'custom',cyc=>'',rxt=>'',lst=>'',chn=>"Batery:1:1,Feuchte:2:8"};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST00"}{fwUpdate} = "<filename>";
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST01"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST02"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST03"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST04"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST05"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST06"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST07"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST08"} = {};
$HMConfig::culHmRegModel{"HB-UNI-Sen-CAP-MOIST"}   = { lowBatteryLimit=>1, transmitInterval=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST01"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST02"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST03"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST04"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST05"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST06"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST07"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST08"} = { highValue=>1, lowValue=>1 };

$customMsg{"HB-UNI-Sen-CAP-MOIST"} = sub {
  my ($msg,$target) = @_;
  my @evtEt=();
  my $cnum = $msg->payloadByte(1) & 0x3f; # get channel from byte 1 of payload
  #Log 1,"cnum ".$cnum;#FP
  #Log 1,"msg ".$msg;
  my $device = main::CUL_HM_id2Hash($msg->from);
  #Log 1,"cnum ".$device;#FP
  push @evtEt,[$device,1,"battery:".(($msg->payloadByte(0) & 0x80)==0x80 ? "low" : "ok")];
  my $channel = $main::modules{CUL_HM}{defptr}{$msg->channelId($cnum)};
  #Log 1,"channel ".$channel; #FP
  if( defined($channel) ) {
    #my $temp = $msg->payloadWord(2);
    my $bat = $msg->payloadByte(4);
    push @evtEt,[$channel,1,"batVoltage:".$bat/10 ." V"];
    #push @evtEt,[$channel,1,"temperature:".$temp/10];
    push @evtEt,[$channel,1,"state:".$bat/10];
  }
  for( my $offset=3; $offset < length($msg->payload)/2; $offset += 2 ) {
    $cnum = $msg->payloadByte($offset) & 0x3f; # get channel for next value
#Log 1,"cnum1 ".$cnum; #FP
    $channel = $main::modules{CUL_HM}{defptr}{$msg->channelId($cnum)};
#Log 1,"channel ".$channel; #FP
    if( defined($channel) ) {
      my $moist = $msg->payloadByte($offset+1);
      push @evtEt,[$channel,1,"humidity:".$moist." %"];
      push @evtEt,[$channel,1,"state:".$moist];
    }
    else {
      Log 1,"No channel for ".$msg->channelId($cnum);
    }
  }
  return @evtEt;
};

Nun bekomme ich die 8 Analog-Werte nach FHEM.
Das einzige was mich noch glücklicher machen würde ist, wenn ich mit regset highValue 795 die Sensoren auch noch kalibrieren könnte.
Kannst Du mir da auch weiterhelfen?
Aber erstmal vielen vielen  Dank für deinen Tip mit dem aktuellen Sketch!!

papa

Bist Du Dir sicher, dass da die richtigen Werte ankommen ? Ich habe gerade keine Zeit - auf jeden Fall muss der Battery-Kanal erst mla weg:

$HMConfig::culHmModel{"F311"} = {name=>"HB-UNI-Sen-CAP-MOIST",st=>'custom',cyc=>'',rxt=>'',lst=>'',chn=>"Feuchte:1:7"};

Und dann müssen die Daten noch richtig zu den Kanälen zugeordnet werden. Bin mir aber nicht sicher, ob das so passt.

$customMsg{"HB-UNI-Sen-CAP-MOIST"} = sub {
  my ($msg,$target) = @_;
  my @evtEt=();
  my $cnum = $msg->payloadByte(1) & 0x3f; # get channel from byte 1 of payload
  #Log 1,"cnum ".$cnum;#FP
  #Log 1,"msg ".$msg;
  my $device = main::CUL_HM_id2Hash($msg->from);
  #Log 1,"cnum ".$device;#FP
  push @evtEt,[$device,1,"battery:".(($msg->payloadByte(0) & 0x80)==0x80 ? "low" : "ok")];
  my $channel = $main::modules{CUL_HM}{defptr}{$msg->channelId($cnum)};
  #Log 1,"channel ".$channel; #FP
  for( my $offset=0; $offset < length($msg->payload)/2; $offset += 2 ) {
    $cnum = $msg->payloadByte($offset) & 0x3f; # get channel for next value
#Log 1,"cnum1 ".$cnum; #FP
    $channel = $main::modules{CUL_HM}{defptr}{$msg->channelId($cnum)};
#Log 1,"channel ".$channel; #FP
    if( defined($channel) ) {
      my $moist = $msg->payloadByte($offset+1);
      push @evtEt,[$channel,1,"humidity:".$moist." %"];
      push @evtEt,[$channel,1,"state:".$moist];
    }
    else {
      Log 1,"No channel for ".$msg->channelId($cnum);
    }
  }
  return @evtEt;
};
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

joffi

Ja ich bin mir sicher, dass die Werte richtig sind.
Mein Sender sendet 8 Kanäle, wobei der 1. Kanal der Batterie Wert ist.
<- 1A 01 86 53 F31100 000000 00 41 22 42 06 43 04 44 02 45 03 46 03 47 01 48 01  - 1568
Wenn ich deinen Vorschlag übernehme, wird der Batteriewert in Feuchte_01 geschrieben.
Ich habe dein Modul jetzt wie folgt abgeändert:
###########################
## Eingefügt FP 16.07.2019
###########################
$HMConfig::culHmModel{"F311"} = {name=>"HB-UNI-Sen-CAP-MOIST",st=>'custom',cyc=>'',rxt=>'c:l',lst=>'1',chn=>"Batterie:1:1,Feuchte:2:8"};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST00"}{fwUpdate} = "<filename>";
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST01"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST02"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST03"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST04"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST05"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST06"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST07"} = {};
$HMConfig::culHmChanSets{"HB-UNI-Sen-CAP-MOIST08"} = {};
$HMConfig::culHmRegModel{"HB-UNI-Sen-CAP-MOIST"}   = { lowBatteryLimit=>1, transmitInterval=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST01"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST02"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST03"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST04"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST05"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST06"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST07"} = { highValue=>1, lowValue=>1 };
$HMConfig::culHmRegChan {"HB-UNI-Sen-CAP-MOIST08"} = { highValue=>1, lowValue=>1 };

$customMsg{"HB-UNI-Sen-CAP-MOIST"} = sub {
  my ($msg,$target) = @_;
  my @evtEt=();
  my $cnum = $msg->payloadByte(1) & 0x3f; # get channel from byte 1 of payload
  #Log 1,"cnum ".$cnum;#FP
  #Log 1,"msg ".$msg;
  my $device = main::CUL_HM_id2Hash($msg->from);
  #Log 1,"cnum ".$device;#FP
  push @evtEt,[$device,1,"battery:".(($msg->payloadByte(0) & 0x80)==0x80 ? "low" : "ok")];
  my $channel = $main::modules{CUL_HM}{defptr}{$msg->channelId($cnum)};
  #Log 1,"channel ".$channel; #FP
  if( defined($channel) ) {
    #my $temp = $msg->payloadWord(2);
    my $bat = $msg->payloadByte(2);
    push @evtEt,[$channel,1,"batVoltage:".$bat/10 ." V"];
    #push @evtEt,[$channel,1,"temperature:".$temp/10];
    push @evtEt,[$channel,1,"state:".$bat/10];
  }
  for( my $offset=3; $offset < length($msg->payload)/2; $offset += 2 ) {
    $cnum = $msg->payloadByte($offset) & 0x3f; # get channel for next value
#Log 1,"cnum1 ".$cnum; #FP
    $channel = $main::modules{CUL_HM}{defptr}{$msg->channelId($cnum)};
#Log 1,"channel ".$channel; #FP
    if( defined($channel) ) {
      my $moist = $msg->payloadByte($offset+1);
      push @evtEt,[$channel,1,"humidity:".$moist." %"];
      push @evtEt,[$channel,1,"state:".$moist];
    }
    else {
      Log 1,"No channel for ".$msg->channelId($cnum);
    }
  }
  return @evtEt;
};

Damit klappt alles. Auch kann ich die Regs setzten. Allerdings werden die Werte erst übernommen, nachdem ich einmal den Konfig-Button am Sender gedrückt habe.

papa

Na super. Dann kann ich das ja mal mit aufnehmen.
Es kann sein, dass der Sensor nur alle X Nachrichten eine Ack fordert. Dann würden auch die Register übertragen werden.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

joffi


thgorjup

Hallo,
hier passiert zwar nichts mher, aber vielleicht kann mir doch jemand meine Frage beantworten.

Ich bekomme 4 Channels angezeigt:


channel_01 HM_F31100_Data
channel_02 HM_F31100_Moisture_01
channel_03 HM_F31100_Moisture_02
channel_04 HM_F31100_Moisture_03


channel_01:  Zeigt mir immer eine Spannung an, welche ich nicht zuordnen kann. Irgendwie sinnlos, da diese auch ständig zwischen 2-11V schwankt.
channel_02:  Zeigt mir z.B. 48% an
channel_03:  Zeigt mir z.B. 91% an. Dieser Wert ändert sich mit der Feuchte des "Capacitive Soil Moisture Sensors"
channel_04:  Ist mit channel_03 identisch.

Ich habe nur einen CAP-SOIL-M Sensor und keinen Temperaturfühler.
Wie kann ich channel_02 und channel_03 interpretieren?

Danke und Gruß
Thomas

FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

papa

Channel 1 sollte die Batteriespannung anzeigen. Channel 3 & 4 können einfach ignoriert werden, wenn nichts dran ist.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

thgorjup

Hallo Papa,

die Batteriespannung kann aber nicht 8,9V oder 10.9 V sein. Ich habe 3,3V dran hängen.

Aktuelle Werte:
channel_01: 10,9V
channel_02: 49%
channel_03: 83%
channel_04: 100% (meine letzte Aussage war wohl falsch. Ist immer 100% und somit zu vernachlässigen)




FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

joffi

Hi,
kanste du mal deine empfangene RAWMSG posten?

thgorjup

@joffi: Kannst du bitte kurz erklären wie ich das auslese?
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

joffi

Hi,
im Sensor sollte das bei Internals stehen (bei mir):
HMLAN1_RAWMSG
   
EF31100,0000,0234AB7A,FF,FFA8,048453F311002CD5F200411B4260435344634562464A473C485F

Du kannst aber auch im seriellen Monitor beim Arduino IDE nachschauen was der Sensor sendet.
Ich hae eiene 7 Kanal Sender, der im ersten Kanal die Batteriespannung sendet. Die Werte stehwn ab 41-1B (Batterie Spannung) dann kommen die 7 Feuchtesensoren: 42 - 60, 43-53, 44-63 usw bis 48-5F
Dann könnte man schauen, ob das Modul von PAPA die Werte richtig interpretiert.