Hallo,
ich versuche bei Asksin++ Geräten mir diverse Register in den Readings anzuzeigen. Dazu habe ich z.b. bei "invertDisplayEP42" "d" auf "1" gesetzt:
$HMConfig::culHmRegDefine{"invertDisplayEP42"} = {a=>6.0, s=>0.1, l=>0, min=>0, max=>1, c=>'', p=>'n', f=>'', u=>'', d=>1, t=>"invert Display"};
Im Code steht dazu: " # d: if '1' the register will appear in Readings"
"get <name> regVal invertDisplayEP42" funktioniert und liefert mir richtige Werte, nur ich bekomme kein passendes Reading dazu. Habe ich etwas übersehen?
Meine komplette Konfiguration steht hier:
https://forum.fhem.de/index.php/topic,112912.msg1099121.html#msg1099121
Hm - im Prinzip sieht das alles gut aus. Aber ich kenne mich da auch nicht wirklich tiefgreifend aus. Habe die meisten Sachen aus der HMConfig.pm abgeschrieben.
Ja da habe ich es auch her. Aber Vielleicht kann Martin mir ja helfen?
ich habe es simuliert - es funktioniert bei mir. Somit unklar, was bei dir anders ist.
Ich brauche ein full list:
get <entity> list full
=> das Kommando steht nach update zu Verfügung
Hier das list Full:
Internals:
.triggerUsed 1
DEF F3430001
FUUID 5f0f3110-f33f-bffa-d2c6-efe1f93651e5123c
NAME HM_F34300_Dis_01
NOTIFYDEV global
NR 719
NTFY_ORDER 50-HM_F34300_Dis_01
STATE textEP42
TYPE CUL_HM
chanNo 01
device HM_F34300
.attraggr:
.attrminint:
CL:
Authenticated 1
AuthenticatedBy allowed_WEBphone
AuthenticatedUser nico
BUF
FD 49
FW_ID 947
LASTACCESS 1609162205
NAME WEBphone_192.168.0.100_60428
NR 927
PEER 192.168.0.100
PORT 60428
SNAME WEBphone
SSL
STATE Connected
TEMPORARY 1
TYPE FHEMWEB
canAsyncOutput 1
.attraggr:
.attrminint:
READINGS:
2020-12-28 14:26:17 state Connected
OLDREADINGS:
READINGS:
2020-12-28 14:26:17 .R-alignmentEP42 set_undef lit:3
2020-12-28 14:29:08 .R-showLineEP42 set_0
2020-12-28 14:21:48 .R-sign off
2020-12-28 14:21:48 RegL_01. 04:10 08:00 09:00 36:31 37:32 38:33 39:34 3A:35 3B:36 3C:37 3D:38 3E:39 3F:30 40:61 41:62 42:63 43:64 44:65 45:66 46:78 47:78 48:20 49:20 4A:20 4B:20 4C:20 4D:20 4E:20 4F:20 50:20 51:20 52:20 53:20 54:20 55:20 90:01 91:01
2020-12-28 14:29:38 cfgState updating
2020-12-28 14:29:08 text1 set_1234567890ab
2020-12-28 14:29:08 text2 set_xx
helper:
cfgChkResult No regs found for:-ret--ret-HM_F34300_Dis_01 type:display42 - -ret-list:peer register :value-ret- 1: alignmentEP42 :set_undef lit:3-ret- 1: showLineEP42 :set_0-ret- 1: sign :off-ret-text1:1234567890ab-ret-text2:xx -ret- -ret- -ret-
getCfgListNo
peerFriend
peerOpt -:display42
regLst 1
cfgChk:
idRc02 RegL_01.
cmds:
TmplKey :no:1609161300.4188
TmplTs 1609161300.4188
cmdKey 1:0:0::HM_F34300:F343:01:
cmdLst:
clear [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
getConfig noArg
getRegRaw (List0|List1|List2|List3|List4|List5|List6) [-peerChn-]
peerBulk -peer1,peer2,...- [({set}|unset)]
peerChan -btnNumber- -actChn- ... single [set|unset] [actor|remote|both]
regBulk -list-.-peerChn- -addr1:data1- -addr2:data2-...
regSet [(prep|{exec})] -regName- -value- [-peerChn-]
sign [(on|{off})]
textEP42 -txt1- -txt2-...
tplDel -tplDel-
tplSet_0 -tplChan-
lst:
condition slider,0,1,255
peer
peerOpt
tplChan
tplDel
tplPeer
rtrvLst:
cmdList [({short}|long)]
deviceInfo [({short}|long)]
list [({normal}|full)]
param -param-
reg -addr- -list- [-peerChn-]
regList noArg
regTable noArg
regVal -addr- -list- [-peerChn-]
saveConfig [-filename-]
tplInfo noArg
expert:
def 0
det 0
raw 1
tpl 0
regCollect:
role:
chn 1
shadowReg:
RegL_01. 00:00 04:10 08:00 09:00 36:31 37:32 38:33 39:34 3A:35 3B:36 3C:37 3D:38 3E:39 3F:30 40:61 41:62 42:63 43:64 44:65 45:66 46:78 47:78 48:20 49:20 4A:20 4B:20 4C:20 4D:20 4E:20 4F:20 50:20 51:20 52:20 53:20 54:20 55:20 90:00 91:03
tmpl:
nb:
cnt 3
Attributes:
model HB-DIS-EP-42BW
peerIDs ,
Hier erscheinen die Readings, allerdings mit Punkt davor. Im Webinterface kann ich sie nicht sehen.
die anzeige wird immer mit attr expert gesteuert.
wenn nur im hauptdevice existent, dann gilt die einstellung dort auch für channel.
also zb mal erweitern mit allReg.
Das war es, danke. Hab ich total übersehen.
Unabhängig davon habe ich noch ein Problem mit den text1 und text2 Readings. Die werden aus der CUL_HM_4DisText erzeugt. Allerdings werden nur 12 Zeichen beachtet. Ich benötige aber 16 Zeichen. Ich hab versucht die CUL_HM_4DisText in der HMConfig_HBdis zu überschreiben:
sub CUL_HM_4DisText42($) {
Log 1,"----------CUL_HM_4DisText42----------";
my ($hash)=@_;
my $md = CUL_HM_getAliasModel($hash);
if($md eq 'HB-DIS-EP-42BW'){
my $name = $hash->{NAME};
my $regPre = ($hash->{helper}{expert}{raw}?"":".");
my $reg1 = ReadingsVal($name,$regPre."RegL_01." ,"");
my $pref = "";
if ($hash->{helper}{shadowReg}{"RegL_01."}){
$pref = "set_";
$reg1 = $hash->{helper}{shadowReg}{"RegL_01."};
}
my %txt;
foreach my $sAddr (54,70){
my $txtHex = $reg1; #one row
my $sStr = sprintf("%02X:",$sAddr);
$txtHex =~ s/.* $sStr//; #remove reg prior to string
$sStr = sprintf("%02X:",$sAddr+15);
$txtHex =~ s/$sStr(..).*/,$1/; #remove reg after string
$txtHex =~ s/ ..:/,/g; #remove addr
$txtHex =~ s/ //g; #remove space
$txtHex =~ s/,00.*//; #remove trailing string
$txt{$sAddr} = "";
my @ch = split(",",$txtHex,16);
foreach (@ch){$txt{$sAddr}.=chr(hex($_)) if (length($_)==2)};
}
CUL_HM_UpdtReadBulk($hash,1,"text1:".$pref.$txt{54},
"text2:".$pref.$txt{70});
return "text1:".$txt{54}."\n"."text2:".$txt{70}."\n";
}else{
return $CUL_HM_4DisTextOrig->(@_);
}
}
sub HMConfig_HBdis_Initialize{
$CUL_HM_4DisTextOrig = \&main::CUL_HM_4DisText;
*main::CUL_HM_4DisText = \&CUL_HM_4DisText42;
}
Das funktioniert leider nur beim Reload, beim Neustart leider nicht. Hat evtl Jemand noch eine Idee?
nun, mal so ins Blaue hinein geraten: Es liegt an der Reihenfolge der Definitionen.
Du überschreibst die Fuktion
CUL_HM_4DisText
und scheinbar wird das ""orginal" nach deiner re-definition eingestellt.
baue einen Test in deine Sub ein
sub CUL_HM_4DisText42($) {
Log 1,"----------CUL_HM_4DisText42----------";
my ($hash)=@_;
return "I am new" if ($hash eq "test");
....
dann führe nach FHEM init dies aus
{if( CUL_HM_4DisText42("test") ne "I am new"){HMConfig_HBdis_Initialize()}}
Diesen Code
-kannst du erst einmal manuell testen, wenn die Subs "falsch" sind.
- baust du ein, wenn es erfolgreich ist in das "user.cfg".
So: User.cfg - ein File was meiner Ansicht nach jeder haben sollte:
erstelle ein Notify welches nach dem Init aufgerufen wird und das c_User.cfg ausführt
define userCfg notify global:INITIALIZED include c_User.cfg
So ein File ist m.E. nützlich und unabdingbar.
In das file schreibst du die If Abfrage