Wenn ich folgende Routine aus meiner 99 Utils ausführe:
sub Rollladen_Lautstaerke_TV ()
{
if (Value("Denon_AVR") eq "on")
{
my $lautstaerke_akt = ReadingsVal('Denon_AVR','volume','40');
chop ($lautstaerke_akt);
chop ($lautstaerke_akt);
my $lautstaerke_neu = $lautstaerke_akt + 5;
fhem("set Denon_AVR volume ".$lautstaerke_neu.";");
fhem("define Denon_AVR.Rollladen at +00:00:40 set Denon_AVR volume ".$lautstaerke_akt.";");
}
}
bekomme ich folgenden Fehler:
Denon_AVR.Rollladen: unknown attribute HMLAN1. Type 'attr Denon_AVR.Rollladen ?' for a detailed list.
Hier ein List des Denon:
Internals:
CFGFN
Clients :DENON_AVR_ZONE:
DEF 192.168.2.24
DeviceName 192.168.2.24:23
FD 35
NAME Denon_AVR
NEXT_OPEN 1476636371.62174
NR 448
NTFY_ORDER 50-Denon.AVR
PARTIAL
STATE opened
TIMEOUT 3
TYPE DENON_AVR
Readings:
2016-10-16 18:45:17 allZoneStereo off
2016-10-16 18:45:17 autoStandby off
2016-10-16 18:45:17 bass 0 dB
2016-10-16 18:45:17 cinemaEQ off
2016-10-16 18:45:17 currentAlbum -
2016-10-16 18:45:17 currentArtist -
2016-10-16 18:45:17 currentBitrate -
2016-10-16 18:45:17 currentMedia -
2016-10-16 18:45:17 currentPlaytime -
2016-10-16 18:45:17 currentStation -
2016-10-16 18:45:17 currentTitle -
2016-10-16 18:45:17 digitalInput auto
2016-10-16 18:45:17 display bright
2016-10-16 18:45:17 dynamicCompression off
2016-10-16 18:45:17 dynamicEQ on
2016-10-16 18:45:17 dynamicVolume off
2016-10-16 18:45:17 eco off
2016-10-16 18:45:16 input Cbl/Sat
2016-10-16 18:45:17 levelCenter 0 dB
2016-10-16 18:45:17 levelFrontLeft 0 dB
2016-10-16 18:45:17 levelFrontRight 0 dB
2016-10-16 18:45:17 levelSourroundBackLeft 0 dB
2016-10-16 18:45:17 levelSourroundBackRight 0 dB
2016-10-16 18:45:17 levelSourroundLeft 0 dB
2016-10-16 18:45:17 levelSourroundRight 0 dB
2016-10-16 18:45:17 levelSubwoofer 0 dB
2016-10-16 18:45:17 loudness on
2016-10-16 18:45:17 lowFrequencyEffects 0 dB
2016-10-16 18:45:17 multEQ reference
2016-10-16 18:45:16 mute off
2016-10-16 18:45:17 playStatus stopped
2016-10-16 18:45:16 power on
2016-10-16 18:45:16 presence present
2016-10-16 18:45:17 setup off
2016-10-16 18:45:16 sleep off
2016-10-16 18:45:17 sound Dolby PL2X C
2016-10-16 18:45:16 state on
2016-10-16 18:45:17 stateAV on
2016-10-16 11:06:08 surroundMode Auto
2016-10-16 18:45:17 toneControl off
2016-10-16 18:45:17 treble 0 dB
2016-10-16 18:45:17 tunerBand FM
2016-10-16 18:45:17 tunerFrequency 87.5 kHz
2016-10-16 18:45:17 tunerMode auto
2016-10-16 18:45:17 tunerPreset 1
2016-10-16 18:45:17 videoSelect off
2016-10-16 19:43:27 volume 48.5 %
2016-10-16 19:43:27 volumeMax 98 %
2016-10-16 19:43:27 volumeStraight -31.5 dB
2016-10-16 18:45:16 zone2 off
2016-10-16 18:45:16 zoneMain on
Helper:
INPUT SAT/CBL
PARTIAL
USEDINPUT Aux1,Aux2,Blu-Ray,Bluetooth,CD,Cbl/Sat,DVD,Favorites,Favorites_play,Flickr,Game,Mediaplayer,OnlineMusic,Phono,Server,TV,Tuner,Usb/iPod,Usb_play,iPod_play,iRadio,iRadio_play
isPlaying 0
nextConnectionCheck 1476639987.71346
Attributes:
DbLogExclude .*
cmdIcon muteT:rc_MUTE
devStateIcon on:rc_GREEN:off off:rc_STOP:on absent:rc_RED muted:rc_MUTE@green:muteT playing:rc_PLAY@green:pause paused:rc_PAUSE@green:play
group Medien
room S_Wohnraum
stateFormat stateAV
webCmd volume:muteT:input:surroundMode
Das Modul habe ich aus folgendem Beitrag:
https://forum.fhem.de/index.php/topic,58452.0.html
Kann mir jemand sagen, wieso der Fehler kommt? Danach kann ich die Routine auch nicht mehr ausführen, bis ich sie neu geladen habe.
Die Fehlermeldung passt nicht zur gezeigten sub. Reload der myUtils vergessen? 2 Subs mit identischen Namen?
Weil es nicht hat passt und ich den Fehler nicht finde, habe ich es ja hier gepostet :)
Keine doppelte Sub vorhanden und reload findet doch auch statt, wenn ich auf speichern klicke, oder?
Mich wundert es auch, aber kommt der Fehler immer dann, wenn ich die Sub ausführe und danach kann ich sie kein zweites Mal ausführen.
Es scheint an dieser Zeile zu liegen:
fhem("define Denon_AVR.Rollladen at +00:00:40 set Denon_AVR volume ".$lautstaerke_akt.";");
Kommentiere ich diese aus, tritt das Problem nicht auf.
die meldung wird nur dann ausgegeben wenn die CommandAttr verwendet wird. du kannst mal versuchen da an den anfang einen aufruf von stacktrace() einzubauen und im log zu schauen woher der aufruf genau kommt.
gruss
andre
ps: vielleicht helfen dir die folgenden dinge auch weiter:
- die die addition wird schief gehen wenn es das reading volume nicht gibt. vom default 40 zwei mal etwas abgeschnitten bleibt nichts übrig
- statt ReadingsVal und die beiden chop wäre readingsNum besser
- das letze ; in den beiden fhem kommandos ist überflüssig
- statt string concatenation kannst du auch direkt variablen in einem "..." string verwenden.
die routine könnte also z.b. so aussehen:sub Rollladen_Lautstaerke_TV ()
{
if (Value("Denon_AVR") eq "on")
{
my $lautstaerke = ReadingsNum('Denon_AVR','volume','40');
fhem("set Denon_AVR volume ".$lautstaerke+5);
fhem("define Denon_AVR.Rollladen at +00:00:40 set Denon_AVR volume $lautstaerke");
}
}
oder mit sleep statt at:sub Rollladen_Lautstaerke_TV ()
{
if (Value("Denon_AVR") eq "on")
{
my $lautstaerke = ReadingsNum('Denon_AVR','volume','40');
fhem("set Denon_AVR volume ".($lautstaerke+5).";sleep 40;set Denon_AVR volume $lautstaerke" );
}
}
@Andre
Zitatstring verenden
das hat meine Laune deutlich aufgeheitert ;)
VG
Frank
:P
Dann lies mal den Thread: https://forum.fhem.de/index.php/topic,59017.0.html
da sind so manche nützliche Strings am "verenden" oder werden nicht wahrgenommen usw. .... ::)
ZitatEinzige Möglichkeit das zu unterbinden: Privates FHEM Forum mit vorherigem Einstellungstest ! Vielleicht sollte man mal eine demokratische Abstimmung vornehmen ?
VG
Frank
Zitat von: justme1968 am 16 Oktober 2016, 22:08:25
die meldung wird nur dann ausgegeben wenn die CommandAttr verwendet wird. du kannst mal versuchen da an den anfang einen aufruf von stacktrace() einzubauen und im log zu schauen woher der aufruf genau kommt.
Muss ich mal schauen, was du damit meinst. Habe ich noch nicht ganz verstanden
Zitat
die routine könnte also z.b. so aussehen:
[code]sub Rollladen_Lautstaerke_TV ()
{
if (Value("Denon_AVR") eq "on")
{
my $lautstaerke = ReadingsNum('Denon_AVR','volume','40');
fhem("set Denon_AVR volume ".$lautstaerke+5);
fhem("define Denon_AVR.Rollladen at +00:00:40 set Denon_AVR volume $lautstaerke");
}
}
Hatte nicht ganz geklappt, da der "$lautstaerke+5" nicht verarbeiten konnte, aber nicht schlimm, konnte ich umgehen. Der Attr Fehler kommt jedoch weiterhin.
Zitat
oder mit sleep statt at:
sub Rollladen_Lautstaerke_TV ()
{
if (Value("Denon_AVR") eq "on")
{
my $lautstaerke = ReadingsNum('Denon_AVR','volume','40');
fhem("set Denon_AVR volume ".($lautstaerke+5).";sleep 40;set Denon_AVR volume $lautstaerke" );
}
}
Die zweite Möglichkeit klappt und wirft den Fehler nicht aus. Ich frage mich, wie er auf das CommandAttr kommt? Liegt es vielleicht an einem Fehler im Modul??
Hier die Antwort, wenn ich es so aufrufe:
sub Rollladen_Lautstaerke_TV ()
{
if (Value("Denon_AVR") eq "on")
{
my $lautstaerke_akt = ReadingsNum('Denon_AVR','volume','40');
my $lautstaerke_neu = $lautstaerke_akt+1;
fhem("set Denon_AVR volume ".$lautstaerke_neu);
stacktrace();
fhem("define Denon_AVR.Zurueck at +00:00:10 set Denon_AVR volume ".$lautstaerke_akt);
stacktrace();
}
}
2016.10.16 22:32:32 3: stacktrace:
2016.10.16 22:32:32 3: main::Rollladen_Lautstaerke_TV called by (eval 53413) (1)
2016.10.16 22:32:32 3: (eval) called by fhem.pl (1006)
2016.10.16 22:32:32 3: main::AnalyzePerlCommand called by fhem.pl (1025)
2016.10.16 22:32:32 3: main::AnalyzeCommand called by fhem.pl (954)
2016.10.16 22:32:32 3: main::AnalyzeCommandChain called by ./FHEM/01_FHEMWEB.pm (2258)
2016.10.16 22:32:32 3: main::FW_fC called by ./FHEM/01_FHEMWEB.pm (764)
2016.10.16 22:32:32 3: main::FW_answerCall called by ./FHEM/01_FHEMWEB.pm (455)
2016.10.16 22:32:32 3: main::FW_Read called by fhem.pl (3221)
2016.10.16 22:32:32 3: main::CallFn called by fhem.pl (671)
2016.10.16 22:32:33 3: Denon_AVR.Zurueck: unknown attribute HMLAN1. Type 'attr Denon_AVR.Zurueck ?' for a detailed list.
2016.10.16 22:32:33 3: stacktrace:
2016.10.16 22:32:33 3: main::Rollladen_Lautstaerke_TV called by (eval 53413) (1)
2016.10.16 22:32:33 3: (eval) called by fhem.pl (1006)
2016.10.16 22:32:33 3: main::AnalyzePerlCommand called by fhem.pl (1025)
2016.10.16 22:32:33 3: main::AnalyzeCommand called by fhem.pl (954)
2016.10.16 22:32:33 3: main::AnalyzeCommandChain called by ./FHEM/01_FHEMWEB.pm (2258)
2016.10.16 22:32:33 3: main::FW_fC called by ./FHEM/01_FHEMWEB.pm (764)
2016.10.16 22:32:33 3: main::FW_answerCall called by ./FHEM/01_FHEMWEB.pm (455)
2016.10.16 22:32:33 3: main::FW_Read called by fhem.pl (3221)
2016.10.16 22:32:33 3: main::CallFn called by fhem.pl (671)
Allerdings sagt mir das Ganze leider nichts.
Edit:
Wenn ich stacktrace in global auf 1 setze, dann sehe ich nicht mehr. Warum habe ich jetzt auch verstanden, da es ja kein PEARL WARNING ist. Leider bin ich mit meinem geringen Latein am Ende um zu erkennen, wer den Attr Command startet.
nein. nicht in deinen code. sondern direkt in CommandAttr in fhem.pl. z.b. zeile 2482
Ah ok, dann baue ich es mal in die Zeile ein und schaue was passiert. Danke
Habe es jetzt Mal in der Zeile eingefügt, FHEM neugestartet, das Log bereinigt :D und die Sub ausgeführt. Das Ergebnis sieht nun wie folgt aus:
2016.10.16 22:50:40 3: main::CommandAttr called by fhem.pl (1084)
2016.10.16 22:50:40 3: main::AnalyzeCommand called by fhem.pl (954)
2016.10.16 22:50:40 3: main::AnalyzeCommandChain called by ./FHEM/91_notify.pm (102)
2016.10.16 22:50:40 3: main::notify_Exec called by fhem.pl (3222)
2016.10.16 22:50:40 3: main::CallFn called by fhem.pl (3144)
2016.10.16 22:50:40 3: main::DoTrigger called by fhem.pl (1800)
2016.10.16 22:50:40 3: main::CommandDefine called by fhem.pl (1084)
2016.10.16 22:50:40 3: main::AnalyzeCommand called by fhem.pl (954)
2016.10.16 22:50:40 3: main::AnalyzeCommandChain called by fhem.pl (3234)
2016.10.16 22:50:40 3: main::fhem called by ./FHEM/99_myUtils.pm (500)
2016.10.16 22:50:40 3: main::Rollladen_Lautstaerke_TV called by (eval 680) (1)
2016.10.16 22:50:40 3: (eval) called by fhem.pl (1006)
2016.10.16 22:50:40 3: main::AnalyzePerlCommand called by fhem.pl (1025)
2016.10.16 22:50:40 3: main::AnalyzeCommand called by fhem.pl (954)
2016.10.16 22:50:40 3: main::AnalyzeCommandChain called by ./FHEM/01_FHEMWEB.pm (2258)
2016.10.16 22:50:40 3: main::FW_fC called by ./FHEM/01_FHEMWEB.pm (764)
2016.10.16 22:50:40 3: main::FW_answerCall called by ./FHEM/01_FHEMWEB.pm (455)
2016.10.16 22:50:40 3: main::FW_Read called by fhem.pl (3222)
2016.10.16 22:50:40 3: main::CallFn called by fhem.pl (671)
Hilft das weiter?
beim aufruf von Rollladen_Lautstaerke_TV wird durch den fhem aufruf in zeile 500 deiner 99_myUtils.pm das define aufgerufen und dieses triggert ein notify das dann seinerseits CommandAttr aufruft.
mit global verbose 5 solltest du sehen können welches notify das ist.
gruss
andre
Ich bin begeistert, was du alles siehst.
Das einzige notify, welches auf ein define hört und mir bekannt ist, wäre dieses hier:
notify DbLog.Exclude.Automatisch global:DEFINED.* attr $EVTPART1 DbLogExclude .*
Aber dieses hat ja eigentlich nix mit HMLAN1 zu tun, welches er setzen will. Außer das $EVTPART1 zieht sich irgendwo das HMLAN1 her.
Im Log habe ich mit Verbose 5 folgendes zum Ausführen der Sub gefunden, hoffe das ist der richtige Auszug. Wird natürlich mit verbose 5 sehr schnell unübersichtlich:
2016.10.16 23:02:37 5: Cmd: >{Rollladen_Lautstaerke_TV ()}<
2016.10.16 23:02:37 5: Cmd: >set Denon_AVR volume 50<
2016.10.16 23:02:37 5: DENON_AVR Denon_AVR: called SetVolume.
2016.10.16 23:02:37 4: DENON_AVR Denon_AVR: SimpleWrite MV500 <volume>.
2016.10.16 23:02:37 5: SW: 4d563530300d
2016.10.16 23:02:37 5: Cmd: >define Denon_AVR.Zurueck at +00:00:10 set Denon_AVR volume 49<
2016.10.16 23:02:37 5: Triggering Denon_AVR.Zurueck (1 changes)
2016.10.16 23:02:37 5: Starting notify loop for Denon_AVR.Zurueck, first event Next: 23:02:47
2016.10.16 23:02:37 5: Notify from Device: Denon_AVR.Zurueck recieved
2016.10.16 23:02:37 5: Triggering global (1 changes)
2016.10.16 23:02:37 5: Starting notify loop for global, first event DEFINED Denon_AVR.Zurueck
2016.10.16 23:02:37 5: Triggering DbLog.Exclude.Automatisch
2016.10.16 23:02:37 4: DbLog.Exclude.Automatisch exec attr $EVTPART1 DbLogExclude .*
2016.10.16 23:02:37 5: Cmd: >attr $EVTPART1 DbLogExclude .*<
2016.10.16 23:02:37 5: Triggering global (2 changes)
2016.10.16 23:02:38 5: Notify from Device: global recieved
2016.10.16 23:02:38 5: DENON_AVR Denon_AVR: read.
2016.10.16 23:02:38 4: DENON_AVR Denon_AVR: parsing <MV50> to <volume/volumeStraight 50/-30>.
2016.10.16 23:02:38 4: DENON_AVR Denon_AVR: parsing <MVMAX 98> to <volumeMax 98>.
2016.10.16 23:02:38 5: Triggering Denon_AVR (3 changes)
2016.10.16 23:02:38 5: Starting notify loop for Denon_AVR, first event volumeStraight: -30 dB
2016.10.16 23:02:38 5: Triggering Denon_AVR (3 changes)
2016.10.16 23:02:38 5: Notify from Device: Denon_AVR recieved
2016.10.16 23:02:38 5: Triggering Denon_AVR (3 changes)
2016.10.16 23:02:38 4: WEB_192.168.2.10_51232 GET /fhem?fw_id=409; BUFLEN:0
2016.10.16 23:02:38 4: name: /fhem?fw_id=409 / RL:1380 / text/html; charset=UTF-8 / Content-Encoding: gzip
deaktivere das noitify und schau ob die meldung weg ist.
wenn nicht suchen wir weiter.
ich schätze du meinst deaktivieren, oder?
steht doch da :)
Zitat von: justme1968 am 16 Oktober 2016, 23:20:00
steht doch da :)
;)
Ähm, ich habe jetzt überhaupt keine Ahnung, wieso es geht bzw. der Fehler nicht mehr kommt. Ich wollte gerade das notify deaktivieren, hatte aber vorher die Sub nochmal gestartet um zu testen, ob der Fehler nach dem restart von FHEM (stacktrace raus genommen) wieder kommt. Er kam nicht. Jetzt habe ich sie ganze 5 mal gestartet und jedes mal funktionierte sie ohne Fehler. Also ich hab kein Plan warum. Solange er nicht wieder kommt, soll es mir recht sein, wobei ich schon gerne gewusst hätte, wo der Fehler lag.
Ich danke dir erst Mal für deine Mühe und Geduld. Sollte er wieder erscheinen, werde ich erst das notify deaktivieren. Sollte er dann immer noch kommen, melde ich mich wieder.
Ah, ich weiß wieso der Fehler nicht kommt. Ich hatte die alte Version mit sleep eingebaut und trozt speichern und reload der myutils mit der version ohne sleep, hat er sie nicht geändert. Kein Wunder, dass der Fehler nicht kommt.
Edit:
Es bleibt dabei. Auch mit der "fehlerhaften" Sub wird der Fehler nicht mehr ausgeworfen. Wie gesagt, ich habe keine Ahnung wieso, aber es ist so. Sollte sich etwas ändern, dann melde ich mich. Danke :)