Hallo Zusammen,
ich habe ein Board mit der Software "HB-UNI-Sen-DUST.ino" erstellt und im Debug Mode erscheinen auch die korrekten Werte:
ZitatPM25: 34
PM10: 113
Ich habe für die Einbindung die Datei "HMConfig_AskSinPPCustom.pm" und "HMMsg.pm" in FHEM eingebunden.
Ich habe in der Datei ""HMConfig_AskSinPPCustom.pm" folgende Definition eingefügt:
$HMConfig::culHmModel{"F314"} = {name => "HB-UNI-Sen-DUST",st => "custom", cyc => '',rxt => '', lst => '', chn => "01" };
$customMsg{"HB-UNI-Sen-DUST"} = sub {
my ($msg, $hash) = @_;
main::Log 1,"HB-UNI-Sen-DUST Executed";
my $pm25_avg = $msg->payloadWord(0) / 10;
my $pm10_avg = $msg->payloadWord(2) / 10;
my $pm25_max = $msg->payloadWord(4) / 10;
my $pm10_max = $msg->payloadWord(6) / 10;
my $pm25_min = $msg->payloadWord(8) / 10;
my $pm10_min = $msg->payloadWord(10) / 10;
my @evtEt=();
my $device = main::CUL_HM_id2Hash($msg->from);
push @evtEt,[$device,1,"pm10_min:".$pm10_min];
push @evtEt,[$device,1,"pm10_avg:".$pm10_avg];
push @evtEt,[$device,1,"pm10_max:".$pm10_max];
push @evtEt,[$device,1,"pm25_min:".$pm25_min];
push @evtEt,[$device,1,"pm25_avg:".$pm25_avg];
push @evtEt,[$device,1,"pm25_max:".$pm25_max];
return @evtEt;
};
Wenn die das Teil mit Pairing in FHEM einbinde, bekomme ich das Teil auch in FHEM zu sehen.
Wenn ich dann aber getConfig() mache, bekomme ich nicht die entsprechen Register für die Messwerte zu sehen.
Screenshot_20260502_200206.png
Ebenso sehe ich im Logfile keinen Eintrag "HB-UNI-Sen-DUST Executed" der mir sagen würde, das meine Erweiterung überhaupt
durchlaufen wird.
Kennt sich jemand mit der Erweiterung der "HMConfig_AskSinPPCustom.pm" aus und kann mir sagen, wo mein Fehler ist.
Viele Grüße
R.
Hi,
erste Fehler behoben. Ich bekomme jetzt auch die korrekten Eigenschaften. Muss das aber noch genau prüfen.
Zugriffsberechtigung waren unter anderem falsch.
Viele Grüße
R.
Hi.
Gut das Du Dir erst mal selber helfen konntest. Das ist aber alles schon ganz schön lange her. Aber wenn es noch probleme gibt, werde ich versuchen zu helfen.
Hi,
habe dann in der Nacht so viel geändert, das es morgens plötzlich nicht mehr lief.
So muss ich das ganze jetzt nochmals von vorne machen.
Kein Problem. Das Problem liegt wohl zwischen meinen Ohren ;-)
Viele Grüße
R.
Hallo papa,
ich muss nochmals auf hoffentlich Dein gutes Gedächnis zurückgreifen. Ich versuche nochmals einen Anlauf.
Ich habe jetzt auch Chat GPT dazu einiges gefragt, bin mir aber nicht sicher, ob das alles stimmt, was von da kommt.
Hier mein Code:
$HMConfig::culHmModel{"F314"} = {name => "HB-UNI-Sen-DUST",st => "custom", cyc => '',rxt => '', lst => '', chn => "01" };
# Nicht "$customMsg{"HB-UNI-Sen-DUST"}
$customMsg{"F314"} = sub {
my ($msg, $hash) = @_;
main::Log 1,"HB-UNI-Sen-DUST Executed";
return () unless $msg->isValues; # Remark from chatgpt
my $pm25_avg = $msg->payloadWord(0) / 10;
my $pm10_avg = $msg->payloadWord(2) / 10;
my $pm25_max = $msg->payloadWord(4) / 10;
my $pm10_max = $msg->payloadWord(6) / 10;
my $pm25_min = $msg->payloadWord(8) / 10;
my $pm10_min = $msg->payloadWord(10) / 10;
my @evtEt=();
my $device = main::CUL_HM_id2Hash($msg->from);
push @evtEt,[$device,1,"pm10_min:".$pm10_min];
push @evtEt,[$device,1,"pm10_avg:".$pm10_avg];
push @evtEt,[$device,1,"pm10_max:".$pm10_max];
push @evtEt,[$device,1,"pm25_min:".$pm25_min];
push @evtEt,[$device,1,"pm25_avg:".$pm25_avg];
push @evtEt,[$device,1,"pm25_max:".$pm25_max];
return @evtEt;
};
Hierzu hätte ich folgende Fragen.
- Muss in $CustomMsg die DeviceID also "F314" stehen oder der der Devicename "HB-UNI-Sen-DUST".
Chatgpt meint, das der Aufruf über die ID erfolgt. Wenn ich mir jedoch andere Definitionen
in der Datei ansehen, scheint das nicht zu stimmen, da hier der Devicename steht.
- Die Zeile "return () unless $msg->isValues;" hat mir Chatgpt empfohlen. Wäre die O.k.
- Muss ich die Datei "10_CUL_HM.pm" entsprechend erweitern ?
Das Modul wird geladen, aber ich erhalte nie die Meldung ""HB-UNI-Sen-DUST Executed".
- Gibt es eine Erklärung, was genau in der Definition von
$HMConfig::culHmModel{"F314"} = {name => "HB-UNI-Sen-DUST",st => "custom", cyc => '',rxt => '', lst => '', chn => "01" };
Stehen muss, damit ich prüfen kann, ob meine Definition stimmt.
In meinem Device steht derzeit
// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
{0xF3, 0x14, 0x01}, // Device ID
"JPDUST0001", // Device Serial
{0xF3, 0x14}, // Device Model
0x10, // Firmware Version
0x53, // Device Type 0x53 oder as::DeviceType::THSensor
{0x01, 0x01} // Info Bytes
};
Viele Grüße
R.
Hallo Zusammen,
nach einigen Tests und Änderungen der Datei "HMConfig_AskSinPPCustom.pm" habe ich jetzt zumindestens einen stabile Anzeige der Eigenschaften in FHEM. Leider immer noch nicht die gewünschten Eigenschaften von PM25 und PM10.
Hier wird als Model jetzt korrekt der "HB-UNI-Sen-DUST" auch nach dem getConfig angezeigt.
Fhem_Nach_dem_Pairing_V2.png
Hier jetzt der aktuelle Ausschnitt der "HMConfig_AskSinPPCustom.pm" für mein Device:
$HMConfig::culHmModel{"F314"} = {name => "HB-UNI-Sen-DUST",st => "custom", cyc=>'00:10',rxt => '', lst => '', chn=>"value:1:1" };
$HMConfig::culHmRegChan{"F31401"} = $HMConfig::culHmRegType{custom_dimmer};
$HMConfig::culHmChanSets{"F31401"} = "";
$HMConfig::culHmRegDefine{"F31401"} = {};
# Nicht "$customMsg{"HB-UNI-Sen-DUST"}
$customMsg{"F314"} = sub {
my ($msg, $hash) = @_;
main::Log 1,"HB-UNI-Sen-DUST Executed";
my $pm25_avg = $msg->payloadWord(0) / 10;
my $pm10_avg = $msg->payloadWord(1) / 10;
my $pm25_max = $msg->payloadWord(2) / 10;
my $pm10_max = $msg->payloadWord(3) / 10;
my $pm25_min = $msg->payloadWord(4) / 10;
my $pm10_min = $msg->payloadWord(5) / 10;
my @evtEt=();
my $device = main::CUL_HM_id2Hash($msg->from);
push @evtEt,[$device,1,"pm10_min:".$pm10_min];
push @evtEt,[$device,1,"pm10_avg:".$pm10_avg];
push @evtEt,[$device,1,"pm10_max:".$pm10_max];
push @evtEt,[$device,1,"pm25_min:".$pm25_min];
push @evtEt,[$device,1,"pm25_avg:".$pm25_avg];
push @evtEt,[$device,1,"pm25_max:".$pm25_max];
return @evtEt;
};
# -------
sub HMConfig_AskSinPPCustom_Initialize ($) {
main::Log 1,"Rerun Literal reverse mapping";
foreach my $rN (keys %HMConfig::culHmRegDefine){ #create literal inverse for fast search
if ($HMConfig::culHmRegDefine{$rN}{lit}){# literal assigned => create inverse
foreach my $lit (keys %{$HMConfig::culHmRegDefine{$rN}{lit}}){
$HMConfig::culHmRegDefine{$rN}{litInv}{$HMConfig::culHmRegDefine{$rN}{lit}{$lit}}=$lit;
}
}
}
};
$main::modules{HMConfig_AskSinPPCustom}{Initialize} = \&HMConfig_AskSinPPCustom_Initialize;
Einige Codeänderungen habe ich mit Hilfe von Chatgpt vorgenommen, damit die perl-Fehler des
Moduls im Logfile nicht mehr auftauchen.
Generell wird jedoch die Init-Routine des perl-Moduls und die CustomMsg nicht durchlaufen.
Chatgpt ist der festen Auffassung das hier der Eintrag "$customMsg{"F314"}" zu verwenden ist,
jedoch verwenden alle anderen Homebrew Einträge den jeweiligen Modulname "$customMsg{"HB-UNI-Sen-DUST"}"
Das muss ich noch weiter austesten.
Seltsam ist auch, das laut Aussage von Chatgpt das Pairing nicht korrekt abgeschlossen sein soll,
da in der Eigenschaft "cfgState" noch "Updating" steht. Ich habe noch Fensterkontakte, welche ich mit SinAsk
umgebaut habe, welche korrekt laufen und auch im "cfgState" noch "Updating" stehen haben.
Hier chn=>"value:1:1" muss wohl Anfangs und EndChannel stehen, Wobei ich den "Channelname" hier mal mit Value belegt habe, wie ich Ihn bei anderen Einträgen auch gesehen habe.
Ich bekomme aber im FHEM nach dem Pairing immer noch diese Fehlermeldungen
2026.05.10 09:44:20 1: PERL WARNING: Use of uninitialized value in string comparison (cmp) at /opt/fhem/FHEM/10_CUL_HM.pm line 4596.
2026.05.10 09:44:20 1: PERL WARNING: Use of uninitialized value in string ne at /opt/fhem/FHEM/10_CUL_HM.pm line 4604.
2026.05.10 09:44:20 1: PERL WARNING: Use of uninitialized value $h in string ne at /opt/fhem/FHEM/10_CUL_HM.pm line 4604.
Viele Grüße
R.
Ich nehme mal an, dass deine Eigenentwicklung im wesentlichen auf dem HB-GEN-SENS basiert - also nur einen Channel hat und dort die Werte entsprechend sendet. Somit muss auch das Device für FHEM auf den HB-GEN-SENS aufsetzen. Probiere mal folgendes:
$HMConfig::culHmModel{"F314"} = {name => "HB-UNI-Sen-DUST",st=>'custom',cyc=>'',rxt=>'c',lst=>'1',chn=>"Values:1:1"};
$HMConfig::culHmChanSets{"HB-UNI-Sen-DUST00"}{fwUpdate} = "<filename>";
$HMConfig::culHmChanSets{"HB-UNI-Sen-DUST01"} = $HMConfig::culHmSubTypeSets{"Values"};
$HMConfig::culHmRegChan {"HB-UNI-Sen-DUST01"} = $HMConfig::culHmRegType{values};
$customMsg{"HB-UNI-Sen-DUST"} = sub {
my ($msg, $hash) = @_;
my @evtEt=();
main::Log 1,"HB-UNI-Sen-DUST Executed";
if( $msg->isValues ) {
my $pm25_avg = $msg->payloadWord(0) / 10;
my $pm10_avg = $msg->payloadWord(2) / 10;
my $pm25_max = $msg->payloadWord(4) / 10;
my $pm10_max = $msg->payloadWord(6) / 10;
my $pm25_min = $msg->payloadWord(8) / 10;
my $pm10_min = $msg->payloadWord(10) / 10;
my $device = main::CUL_HM_id2Hash($msg->from);
push @evtEt,[$device,1,"pm10_min:".$pm10_min];
push @evtEt,[$device,1,"pm10_avg:".$pm10_avg];
push @evtEt,[$device,1,"pm10_max:".$pm10_max];
push @evtEt,[$device,1,"pm25_min:".$pm25_min];
push @evtEt,[$device,1,"pm25_avg:".$pm25_avg];
push @evtEt,[$device,1,"pm25_max:".$pm25_max];
}
return @evtEt;
};
Du könntest aber auch gleich den HB-GEN-SENS nutzen und nur das "valuesformat" entsprechend setzen:
2:pm25_avg:10 2:pm10_avg:10 2:pm25_max:10 2:pm10_max:10 2:pm25_min:10 2:pm10_min:10
https://github.com/pa-pa/AskSinPP/blob/master/examples/custom/HB-GEN-SENS/HB-GEN-SENS.ino
Details gibt es hier: https://forum.fhem.de/index.php?topic=57486.825
Hi,
da ich keinen Eintrag im FHEM log habe, welcher ""HB-UNI-Sen-DUST Executed" heisst,
vermute ich, das etwas anderes nicht arbeitet.
Ich habe den Code von hier übernommen: https://github.com/jp112sdl/HB-UNI-Sen-DUST
Ebenso den Aufbau. Daher weiss ich nicht, ob der HB-GEN-SENS als Basis verwendet wurde.
Ich schaue mir jetzt mal den Code an und lade Ihn testweise (ohne Sensoren), da sollte dann doch wenigstens
FHEM den Typ richtig einbindet.
Viele Grüße
R.
Bist Du Dir denn sicher, dass auch was gesendet wird ? Du müsstest laut dem Sketch folgende Ausgaben in der seriellen Konsole haben:
pm25avg: XXX, pm10avg: YYY
pm25max: ZZZ, pm10max: AAAA
pm25min: BBB, pm10min: CCC
Er sendet auch nicht gleich - sondern macht erst ein paar Messungen.
Hi,
gerade nochmals ausprobiert.
Hier der Log aus dem Device:
16:33:28.140 -> PM25: 23
16:33:28.140 -> PM10: 61
16:33:38.176 -> MEASURE... #17
16:33:38.176 -> PM25: 23
16:33:38.209 -> PM10: 61
16:33:48.240 -> MEASURE... #18
16:33:48.240 -> PM25: 23
16:33:48.240 -> PM10: 62
16:33:48.240 -> pm25avg: 25, pm10avg: 25
16:33:48.240 -> pm25max: 28, pm10max: 28
16:33:48.273 -> pm25min: 23, pm10min: 23
16:33:48.273 -> <- 17 02 86 53 F31401 000000 01 00 00 19 00 36 00 1C 00 41 00 17 00 2A - 183891
16:33:58.337 -> MEASURE... #1
16:33:58.337 -> FAIL - retry #1
16:33:59.430 -> FAIL - retry #2
16:34:00.655 -> FAIL - retry #3
16:34:01.913 -> FAIL - giving up
16:34:11.946 -> MEASURE... #2
Dieser Eintrag ist in der Zeit, wo ich diesen Text geschrieben habe, noch mehrfach aufgetreten. Ohne Eintrag im Log und Eigenschaften.
Hier der FHEM Log:
2026.05.13 16:32:36 1: RMDIR: /opt/fhem/restoreDir/save/2026-05-09
2026.05.13 16:33:20 1: PERL WARNING: Use of uninitialized value in string comparison (cmp) at /opt/fhem/FHEM/10_CUL_HM.pm line 4596.
2026.05.13 16:33:20 1: PERL WARNING: Use of uninitialized value in string ne at /opt/fhem/FHEM/10_CUL_HM.pm line 4604.
2026.05.13 16:33:20 1: PERL WARNING: Use of uninitialized value $h in string ne at /opt/fhem/FHEM/10_CUL_HM.pm line 4604.
Danach leider kein weiterer Eintrag.
Und hier die aktuellen Eigenschaften in FHEM für das Device:
Fhem_Nach_dem_PairingV3.png
Leider weder ein Eintrag aus dem Log der msgCustom Routine, noch die erwarteten Eigenschaften.
Ich vermute das es an der Einbindung der Datei liegt. Diese wird aber korrekt geladen, was ich durch einen Diagnose-
eintrag geprüft habe. Nur wird irgendwie diese Routine einfach nicht durchlaufen:
Diese Routine sollte einen Logeintrag erzeugen:
$customMsg{"HB-UNI-Sen-DUST"} = sub {
my ($msg, $hash) = @_;
my @evtEt=();
main::Log 1,"HB-UNI-Sen-DUST Executed";
if( $msg->isValues ) {
my $pm25_avg = $msg->payloadWord(0) / 10;
my $pm10_avg = $msg->payloadWord(2) / 10;
my $pm25_max = $msg->payloadWord(4) / 10;
my $pm10_max = $msg->payloadWord(6) / 10;
my $pm25_min = $msg->payloadWord(8) / 10;
my $pm10_min = $msg->payloadWord(10) / 10;
my $device = main::CUL_HM_id2Hash($msg->from);
push @evtEt,[$device,1,"pm10_min:".$pm10_min];
push @evtEt,[$device,1,"pm10_avg:".$pm10_avg];
push @evtEt,[$device,1,"pm10_max:".$pm10_max];
push @evtEt,[$device,1,"pm25_min:".$pm25_min];
push @evtEt,[$device,1,"pm25_avg:".$pm25_avg];
push @evtEt,[$device,1,"pm25_max:".$pm25_max];
}
return @evtEt;
};
Auch wird diese Routine nicht durchlaufen, da sie auch einen Log erzeugen würde:
sub HMConfig_AskSinPPCustom_Initialize ($) {
main::Log 1,"Rerun Literal reverse mapping";
foreach my $rN (keys %HMConfig::culHmRegDefine){ #create literal inverse for fast search
if ($HMConfig::culHmRegDefine{$rN}{lit}){# literal assigned => create inverse
foreach my $lit (keys %{$HMConfig::culHmRegDefine{$rN}{lit}}){
$HMConfig::culHmRegDefine{$rN}{litInv}{$HMConfig::culHmRegDefine{$rN}{lit}{$lit}}=$lit;
}
}
}
};
Ich habe auf anraten von Google, diesen Eintrag eingefügt in die Datei:
$main::modules{HMConfig_AskSinPPCustom}{Initialize} = \&HMConfig_AskSinPPCustom_Initialize;
Hat aber auch nicht geholfen.
Alle Beschreibungen sagen, das ich diese Datei und die HMMSgs.pm in das FHEM Verzeichnis einfügen soll.
package HMMsg;
use strict;
use warnings;
#main::Log 1, "HMMSG: ICH WERDE GELADEN";
sub new {
my $class = shift;
my $self = { _type => hex(shift),
_flags => hex(shift),
_from => shift,
_to => shift,
_payload => shift };
bless $self, $class;
return $self;
}
# print the message
sub print {
my ($self) = @_;
print $self->{_type}." ".$self->{_flags}." ".$self->{_from}." ".$self->{_to}." ".$self->{_payload}."\n";
}
# payload
# payload OFFSET
# payload OFFSET,LENGTH
sub payload {
my ($self,$offset,$length) = @_;
return substr($self->{_payload},$offset,$length) if defined($length);
return substr($self->{_payload},$offset) if defined($offset);
return $self->{_payload};
}
# payloadByte OFFSET
sub payloadByte {
my ($self,$offset) = @_;
return hex($self->payload($offset*2,2));
}
# payloadWord OFFSET
sub payloadWord {
my ($self,$offset) = @_;
return hex($self->payload($offset*2,4));
}
# payload3Byte OFFSET
sub payload3Byte {
my ($self,$offset) = @_;
return hex($self->payload($offset*2,6));
}
# payloadLong OFFSET
sub payloadLong {
my ($self,$offset) = @_;
return hex($self->payload($offset*2,8));
}
sub from {
my ($self) = @_;
return $self->{_from};
}
sub to {
my ($self) = @_;
return $self->{_to};
}
sub flags {
my ($self) = @_;
return $self->{_flags};
}
sub type {
my ($self) = @_;
return $self->{_type};
}
sub isStatus {
my ($self) = @_;
my $byte0 = $self->payloadByte(0);
return ($self->type == 0x2 && $byte0 == 0x1) || ($self->type == 0x10 && $byte0 == 0x6);
}
sub isSensor {
my ($self) = @_;
return $self->type == 0x41;
}
sub isRemote {
my ($self) = @_;
return $self->type == 0x40;
}
sub isValues {
my ($self) = @_;
return $self->type == 0x53;
}
sub isWeather {
my ($self) = @_;
return $self->type == 0x70;
}
sub isRemoteLong {
my ($self) = @_;
return $self->payloadByte(0) & 0x40;
}
sub isRemoteLowBat {
my ($self) = @_;
return $self->payloadByte(0) & 0x80;
}
sub channel {
my ($self) = @_;
my $chn;
if( $self->isStatus ) {
$chn = $self->payloadByte(1)
}
else {
$chn = $self->payloadByte(0);
}
return ($chn & 0x3f);
}
sub channelId {
my ($self,$cnum) = @_;
if( ! defined($cnum) ) {
$cnum = $self->channel;
}
return $self->from . sprintf("%02X",$cnum);
}
sub processSwitchStatus {
my ($self,$target) = @_;
my @evtEt=();
my $channel = $main::modules{CUL_HM}{defptr}{$self->channelId};
if( defined($channel) ) {
my $value = $self->payloadByte(2)/2;
my $flags = $self->payloadByte(3);
my $valuestr = "$value %";
$valuestr = "on" if $value==100;
$valuestr = "off" if $value==0;
push @evtEt,[$channel,1,"level:$value %"];
push @evtEt,[$channel,1,"pct:$value"]; # duplicate to level - necessary for "slider"
push @evtEt,[$channel,1,"deviceMsg:$valuestr$target"];
push @evtEt,[$channel,1,"state:".$valuestr];
push @evtEt,[$channel,1,"timedOn:".(($flags & 0x40)?"running":"off")];
}
# else {
# main::Log 1,"No object for ".$self->channelId;
# }
return @evtEt;
}
sub processBlindStatus {
my ($self,$target,$channel) = @_;
my @evtEt=();
# no channel given - calc channel
if( ! defined($channel) ) {
$channel = $main::modules{CUL_HM}{defptr}{$self->channelId};
}
if( defined($channel) ) {
my $value = $self->payloadByte(2)/2;
# invert value if requested
if (main::AttrVal($channel->{NAME},"param","") =~ m/levelInverse/) {
$value = 100-$value;
}
my $flags = $self->payloadByte(3);
my $valuestr = "$value %";
$valuestr = "on" if $value==100;
$valuestr = "off" if $value==0;
my $dir = ($flags >> 4) & 3;
my %dirName = ( 0=>"stop" ,1=>"up" ,2=>"down" ,3=>"err" );
push @evtEt,[$channel,1,"level:$value"];
push @evtEt,[$channel,1,"motor:$dirName{$dir}:$valuestr"];
push @evtEt,[$channel,1,"pct:$value"]; # duplicate to level - necessary for "slider"
push @evtEt,[$channel,1,"deviceMsg:$valuestr$target"];
push @evtEt,[$channel,1,"state:".$valuestr];
push @evtEt,[$channel,1,"timedOn:".(($flags & 0x40)?"running":"off")];
}
# else {
# main::Log 1,"No object for ".$self->channelId;
# }
return @evtEt;
}
sub processMotion {
my ($self,$target) = @_;
my @evtEt=();
my $channel = $main::modules{CUL_HM}{defptr}{$self->channelId};
if( defined($channel) ) {
if( $self->isStatus ) {
my $bright = $self->payloadByte(2);
push @evtEt,[$channel,1,"brightness:$bright"];
}
if( $self->isSensor ) {
my $cnt = $self->payloadByte(1);
my $bright = $self->payloadByte(2);
my $next = $self->payloadByte(3);
if( $next ) {
my $stamp = ::gettimeofday(); # take reception time;
$next = (15 << ($next >> 4) - 4); # strange mapping of literals
main::RemoveInternalTimer($channel->{NAME}.":motionCheck");
main::InternalTimer($stamp+$next+2,"CUL_HM_motionCheck", $channel->{NAME}.":motionCheck", 0);
$channel->{helper}{moStart} = $stamp if (!defined $channel->{helper}{moStart});
}
else {
$next = "none";
}
push @evtEt,[$channel,1,"state:motion"];
push @evtEt,[$channel,1,"motion:on$target"];
push @evtEt,[$channel,1,"motionCount:$cnt"."_next:$next"."s"];
push @evtEt,[$channel,1,"brightness:$bright"];
}
}
# else {
# main::Log 1,"No object for ".$self->channelId;
# }
return @evtEt;
}
sub processRemote {
my ($self,$target) = @_;
my @evtEt=();
my $device = main::CUL_HM_id2Hash($self->from);
my $channel = $main::modules{CUL_HM}{defptr}{$self->channelId};
my $bno = $self->payloadByte(1);
if( defined($channel) ) {
my $state = "Short";
my $trigType = "Short";
my $btnName = $channel->{NAME};
if( $self->isRemoteLong ) {
if(!$device->{BNO} || $device->{BNO} ne $bno) { #bno = event counter
$device->{BNO} = $bno;
$device->{BNOCNT} = 0; # message counter reest
}
$device->{BNOCNT} += 1;
$state = "Long" .(($self->flags & 0x24)==0x20 ? "Release" : "")." ".$device->{BNOCNT};
$trigType = "Long";
}
$device->{helper}{addVal} = $self->payloadByte(0); #store to handle changesFread
push @evtEt,[$channel,1,"state:".$state.$target];
push @evtEt,[$channel,1,"trigger:".$trigType."_".$bno];
push @evtEt,[$device,1,"state:$btnName $state$target"];
}
# else {
# main::Log 1,"No object for ".$self->channelId;
# }
return @evtEt;
}
sub processThreeState {
my ($self,$target,%mapping) = @_;
my @evtEt=();
my $channel = $main::modules{CUL_HM}{defptr}{$self->channelId};
if( ! defined($channel) ) {
# fallback to device
$channel = main::CUL_HM_id2Hash($self->from);
}
if( ! %mapping ) {
%mapping = (0=>'closed',100=>'tilted',200=>'open');
}
my $val = $self->payloadByte(2);
if( defined($channel) ) {
my $vs = $val/2;
$vs = $mapping{$val} if defined $mapping{$val};
push @evtEt,[$channel,1,"state:".$vs];
push @evtEt,[$channel,1,"contact:$vs$target"];
}
# else {
# main::Log 1,"No object for ".$self->channelId;
# }
return @evtEt;
}
sub parseValueFormat {
my @v;
foreach my $value ( split / /,$_[0] ) {
#print $value."\n";
my @parts = split /:/,$value;
my $valuedata = {};
my $numb = $parts[0];
$numb =~ s/([1,2,4,8])s?/$1/g;
$valuedata->{'numbytes'} = $numb;
$valuedata->{'signed'} = $parts[0] =~ m/([1,2,4,8])s/;
$valuedata->{'reading'} = "value".scalar @v + 1;
$valuedata->{'factor'} = 1;
if( defined $parts[1] ) { $valuedata->{'reading'} = $parts[1]; }
if( defined $parts[2] ) { $valuedata->{'factor'} = $parts[2]; }
push @v, $valuedata;
}
return @v;
}
sub processValues {
my ($self,$target) = @_;
my @evtEt=();
my $channel = $main::modules{CUL_HM}{defptr}{$self->channelId};
my $numval = $self->payloadByte(1); # get number of values from message
my $values = $self->payload(4); # values starting at byte 4
my $vfmt = main::AttrVal($channel->{NAME},"valuesformat","");
# Log 1,$vfmt;
if( $vfmt eq "" ) {
main::Log3 $channel->{NAME}, 1, "Missing attribute valuesformat at $channel->{NAME}";
for( my $i=0; $i<$numval; ++$i ) {
$vfmt = $vfmt."1 ";
}
}
my @valuesfmt = parseValueFormat($vfmt);
my $fmtnumval = scalar(@valuesfmt);
if( $numval != $fmtnumval ) {
main::Log3 $channel->{NAME}, 1, "Attribute valuesformat mismatch at $channel->{NAME} - expected $numval items but got $fmtnumval items";
}
my $packstr = "";
my $state = "";
foreach my $data (@valuesfmt) {
#Log 1, $data->{'numbytes'}." ".$data->{'signed'}." ".$data->{'reading'}." ".$data->{'factor'}."\n";
$packstr = $packstr."A".($data->{'numbytes'}*2);
}
#print $packstr."\n";
my @unpacked = map{hex($_)} unpack($packstr,$values);
#print "$unpacked[0] $unpacked[1] $unpacked[2] $unpacked[3]\n";
my $num = 0;
foreach my $data (@valuesfmt) {
my $val = $unpacked[$num++];
if( $data->{'signed'} ) {
my $max = 0x01 << (8*$data->{'numbytes'});
my $mask = $max >> 1;
$val = ($val & $mask) ? ($val - $max) : $val;
}
$val /= $data->{'factor'};
# print $data->{'reading'}." : ".$val."\n";
push @evtEt,[$channel,1,$data->{'reading'}.":".$val];
$state = $state.$val." ";
}
push @evtEt,[$channel,1,"state:".$state];
return @evtEt;
}
sub ::HMMsg_Initialize {}
1;
Im Header von der Datei "HMConfig_AskSinPPCustom" habe ich folgende Änderungen gemacht, damit diese Datei fehlerfrei geladen wird.
package main;
use lib '/opt/fhem/FHEM';
package HMConfig_AskSinPPCustom;
use strict;
use warnings;
use HMMsg;
Viele Grüße
R.
Die HMConfig_AskSinPPCustom.pm und HMMsg.pm sollten sich erst mal ohne Änderungen nutzen lassen.
Versuche doch noch mal von vorn anzufahgen und die originalen aus dem Github nach FHEM zu kopieren. Wenn dann die Funktionen aufgerufen werden, machen wir bei dem neu einzurichtenen Device weiter.
Ich lese in diesem Thread dauernd "mit Hilfe von Google" oder "mit ChatGPT".
Achtung: Rein von einer KI generierter Code muss künftig als solcher gekennzeichnet werden. Wenn es sich nur um Mini-Änderungen handelt, ist das zwar unnötig. Aber man sollte nicht so doof sein und das dazuschreiben.
LG
pah
Hi papa,
so, habe die Änderungen anpassen von oben nochmals in der Org-Datei Eingetragen.
Nach einem Restart dann nochmals neu angelernt und keine Änderung gesehen.
Da ich "ACK" Probleme mit einer anderen Komponente habe, habe ich mein System danach komplett heruntergefahren und
es komplett Spannungsfrei geschaltet.
Nach diesem Neustart habe ich dann die folgende Meldung im Fhem-Log gesehen:
2026.05.18 19:18:17 1: PERL WARNING: Use of uninitialized value in string comparison (cmp) at /opt/fhem/FHEM/10_CUL_HM.pm line 4596.
2026.05.18 19:18:17 1: PERL WARNING: Use of uninitialized value in string ne at /opt/fhem/FHEM/10_CUL_HM.pm line 4604.
2026.05.18 19:18:17 1: PERL WARNING: Use of uninitialized value $h in string ne at /opt/fhem/FHEM/10_CUL_HM.pm line 4604.
2026.05.18 19:20:14 1: HMConfig_AskSinPPCustom received unknown message: 86,53,F31401,000000,010000130032001600540012001F
2026.05.19 19:34:33 0: Server shutdown
Ich habe derzeit noch nicht versucht, die Komponente nochmals neu anzulernen. Das kommt als nächstes dran.
Also nur ein kleiner Zwischenbericht.
Viele Grüße
R.
Hi,
ich bekomme den Sensor plötzlich nicht mehr gepairt. Und das obwohl ich beiden Seiten nichts geändert habe :-(
Viele Grüße
R.
Probiere mal nen kompletten Reset des Sensors - mindestns 6 Sekunden den Config-Taster drücken. Das hilft manchmal, wenn sich was "verklemmt" hat.
Hi,
das hat jetzt geklappt. Leider sind die Value-Werte werden immer noch nicht dargestellt.
Edit: Und kein Eintrag im Logfile.
Viele Grüße
R.
Da fällt mir so langsam auch nichts mehr ein
Hi,
Gibt es irgendwo eine Beschreibung, wie der Aufruf und die Einbindung eines Homebrew auf Softwareebene arbeitet. Wo ist der Einstieg an dem ich angefangen kann.
Viele Grüße
R.
Leider nein. Ich hab mir das damals auch nur alles zusammen geraten. Ich habe auch kein aktuelles FHEM am laufen. Sonst könnte ich vielleicht mehr helfen. Meine Installation ist schon mindestens 3 Jahre alt und funktioniert nur als Homematic Bridge nach Home Assistant. Und da funktioniert alles super.
Hi,
da ich keine Probleme mit dem Ersatz von Fensterkontakten (ehemals MAX, jetzt Arduno) habe, vermute ich wohl eher,
das die Implementierung des Moduls "HB-UNI-Sen-DUST" nicht 100% korrekt ist.
Ich überlege jetzt, ob es erfolgversprechender ist, an dem Modul zu arbeiten auf Basis des Modul "HB-GEN-SENS" oder
das ganze mit einem ESP32 und via WLAN und MQTT einzubinden.
Bei dem ESP32 und MQTT weiss ich, das es gehen wird. Nur habe ich derzeit auch Ärger mit einem "HM-DIS-TD-T" Modul
was mir immer "ACK-missing" gibt, ob das Problem nicht ganz wo anderes ist und ich an der falschen Stelle
suche.
Viele Grüße
R.
Hallo Papa,
ich habe das ganze jetzt nochmals neu gepairt und bei dem Auftreten eines ACK-Missing nochmals den Konfig-Button gedrückt. Hierdurch wurden wohl ausstehende Kommandos
nochmals abgearbeitet. Das hat auch bei meinem Status-Display funktioniert. Danke nochmals an "Gernott" für diesen Tipp.
Erst hiernach war das Modul scheinbar korrekt gepairt.
Als dann der Datensatz:
19:30:09.919 -> pm25avg: 22, pm10avg: 22
19:30:09.919 -> pm25max: 25, pm10max: 25
19:30:09.919 -> pm25min: 20, pm10min: 20
19:30:09.967 -> <- 17 01 86 53 F31401 000000 01 00 00 16 00 2F 00 19 00 36 00 14 00 29 - 184059
kam, wurde im FHEM Log jetzt der folgende Eintrag erzeugt:
2026.05.31 19:27:03 1: HMConfig_AskSinPPCustom received unknown message: 86,53,F31401,000000,01000014002F001800540011001F
2026.05.31 19:30:09 1: HMConfig_AskSinPPCustom received unknown message: 86,53,F31401,000000,01000016002F0019003600140029
Und bei jedem weiteren Protokoll des Moduls auch. Es erscheint jedoch nicht der Eintrag
"HB-UNI-Sen-DUST Executed"
im Logfile.
Was muss ich den jetzt hier entsprechend anpassen ?
$HMConfig::culHmModel{"F314"} = {name => "HB-UNI-Sen-DUST",st=>'custom',cyc=>'',rxt=>'c',lst=>'1',chn=>"Values:1:1"};
$HMConfig::culHmChanSets{"HB-UNI-Sen-DUST00"}{fwUpdate} = "<filename>";
$HMConfig::culHmChanSets{"HB-UNI-Sen-DUST01"} = $HMConfig::culHmSubTypeSets{"Values"};
$HMConfig::culHmRegChan {"HB-UNI-Sen-DUST01"} = $HMConfig::culHmRegType{values};
$customMsg{"HB-UNI-Sen-DUST"} = sub {
my ($msg, $hash) = @_;
my @evtEt=();
main::Log 1,"HB-UNI-Sen-DUST Executed";
if( $msg->isValues ) {
my $pm25_avg = $msg->payloadWord(0) / 10;
my $pm10_avg = $msg->payloadWord(2) / 10;
my $pm25_max = $msg->payloadWord(4) / 10;
my $pm10_max = $msg->payloadWord(6) / 10;
my $pm25_min = $msg->payloadWord(8) / 10;
my $pm10_min = $msg->payloadWord(10) / 10;
my $device = main::CUL_HM_id2Hash($msg->from);
push @evtEt,[$device,1,"pm10_min:".$pm10_min];
push @evtEt,[$device,1,"pm10_avg:".$pm10_avg];
push @evtEt,[$device,1,"pm10_max:".$pm10_max];
push @evtEt,[$device,1,"pm25_min:".$pm25_min];
push @evtEt,[$device,1,"pm25_avg:".$pm25_avg];
push @evtEt,[$device,1,"pm25_max:".$pm25_max];
}
return @evtEt;
};
Das sollte doch das ganze jetzt stark eingrenzen.
Hier ist im Quellcode diese Bedingung nicht erfüllt und im Else Zweig steht der Eintrag im Logfile Zeile 897
my($mFlg,$mTp,$src,$dst,$p,$target) = @_;
..
..
if (($mTp eq "02" && $p =~ m/^01/) || ($mTp eq "10" && $p =~ m/^06/) ) {
Viele Grüße
R.
Er hätte eigentlich schon den "if" in Zeile 856 nehmen müssen. Entweder ist das Gerät nicht korrekt gepairt und es fehlt das Model Attribute. Oder die Anmeldung des neuen Gerätes passt noch nicht.
Mach mal die beiden Kommentare in Zeile 854 (https://github.com/pa-pa/AskSinPP/blob/21bab8b92f7982c29beca08ff3c0ad6ef1e72a5c/examples/custom/contrib/FHEM/HMConfig_AskSinPPCustom.pm#L854) & 858 (https://github.com/pa-pa/AskSinPP/blob/21bab8b92f7982c29beca08ff3c0ad6ef1e72a5c/examples/custom/contrib/FHEM/HMConfig_AskSinPPCustom.pm#L858) wieder rein.
Hi,
ich habe auch noch die Zeile 850 aktiviert.
2026.06.02 17:12:12 1: General entering with 86,53,F31401,000000,01000019003B001C00930017001F, (to broadcast)
2026.06.02 17:12:12 1: HB-UNI-Sen-DUST
2026.06.02 17:12:12 1: HMConfig_AskSinPPCustom received unknown message: 86,53,F31401,000000,01000019003B001C00930017001F
Jetzt kamen die folgenden Einträge.
Daraufhin habe ich die Zeile "customMsg{"F314"} =" nochmals angepasst. Die hatte noch einen alten Stand.
auf
$customMsg{"HB-UNI-Sen-DUST"} = sub {
geändert.
und jetzt sieht der Log so aus:
026.06.02 17:18:36 1: HB-UNI-Sen-DUST
2026.06.02 17:18:36 1: Call custom Message Handler for HB-UNI-Sen-DUST
2026.06.02 17:18:36 1: HB-UNI-Sen-DUST Executed
2026.06.02 17:21:49 1: General entering with 86,53,F31401,000000,01000016003E001B004600150039, (to broadcast)
2026.06.02 17:21:49 1: HB-UNI-Sen-DUST
2026.06.02 17:21:49 1: Call custom Message Handler for HB-UNI-Sen-DUST
2026.06.02 17:21:49 1: HB-UNI-Sen-DUST Executed
2026.06.02 17:25:00 1: General entering with 86,53,F31401,000000,01000019003A001B00470018002E, (to broadcast)
2026.06.02 17:25:00 1: HB-UNI-Sen-DUST
2026.06.02 17:25:00 1: Call custom Message Handler for HB-UNI-Sen-DUST
2026.06.02 17:25:00 1: HB-UNI-Sen-DUST Executed
und die Fhem_Nach_Anpassung.png
Werte PM10_XXX und PM25_XXX werden jetzt auch dargestellt.
Viele Dank für die Hilfe. Ich denke das war es.
Viele Grüße
R.
Kanst Du bitte die funktionierende Version schicken oder hier anhängen. Dann kann ich das im Github nachpflegen.
Hallo papa,
hier die Datei HMConfig_AskSinPPCustom.pm direkt von meiner FHEM Installation. Die Datei "HMmsg.pm" musste nicht angepasst werden.
Nochmals vielen Dank für die Hilfe.
Viele Grüße
R.