Hi,
ich brauche für Steuerungsaufgaben eine (mehrere) globale Variable(n) im FHEM. Dazu habe ich mir ein dummy-Device angelegt:
define TempMemBad dummy
attr TempMemBad room FHT
set TempMemBad 0.0
Das wird nach dem Neustart vom FHEM auch in der Übersicht als dummy-Device angzeigt und mit set kann der Wert erfolgreich geändert werden.
Innerhalb der eigentlichen Heizungsregelung kann ich die Variable auch erfolgreich mit
my $cmd1="set TempMem".$_." 20.0";;\
fhem $cmd1;;\
neu setzen, wobei das "$_" der aktuelle Raum aus einer foreach(@fhts)-Schleife ist. Auch diese Werteänderung wird im FHEM sofort angezeigt.
Jetzt kommt das Problem: wenn ich versuche mit
my $oldSollTemp=ReadingsVal("dummy", "TempMem".$_." ", "0.0");;\
abrufe, kommt jedes mal Null raus, obwohl der Wert mit set auf 20 gesetzt wurde und auch angezeigt wird.
Was ist an der letzten Zeile falsch?
Besten Gruss,
Stefan
ReadingsVal("dummy", "TempMem".$_." ", "0.0");;\
Dein Device heisst nicht dummy sondern laut
define TempMemBad dummy
heisst er
TempMemBad
Also
ReadingsVal("TempMemBad", "TempMem".$_." ", "0.0");;\
...zu langsam...
Falsch dürfte sein, dass der Name des per ReadingsVal abgefragten Devices nicht dummy ist.
Aber da waren noch ein paar sonstige Anmerkungen:
- Code tags sind für die Leser hilfreicher als Einrückungen;
- Was daran "globale Variablen" sein sollen, erschließt sich mir nicht;
- Warum speicherst du den Wert nicht einfach als zusätzliches Reading am eigentlichen (FHT-) "Zieldevice" (setreading in commandref suchen) und "verschwendest" dafür einen dummy?
Hallo Stefan,
wozu noch ein Leerzeichen? "TempMem".$_." "
Readingnamen haben keine Leerzeichen. Im Set Befehl ist das Leerzeichen der Trenner "set TempMem".$_." 20.0"
Und Du setzt ja den state eines Dummy mit dem Namen "TempMem".$_! Du willst also nicht das reading aus "dummy" sondern den state aus Deinem Dummy.
ReadingsVal("TempMem".$_,"state","0.0")
Gruß Otto
Hi,
hier mal der (mehr oder minder) komplette Regler:
define n_heizung notify n_heizung {\
my $i=0;;\
my $anzahl_raeume=0;;\
foreach(@fhts) {\
my $temp=ReadingsVal($_, "temperature", "15");;\
my $soll_temp=ReadingsVal($_, "desired-temp", "15");;\
if ($window eq "open") {\
if ($soll_temp > 18) {\
my $cmd1="set TempMem".$_." ".$soll_temp;;\
fhem $cmd1;;\
Log(3,"### Setze Raumtemp auf 8.0, weil Tuer offen" . $fhts[$i]);;\
my $cmd2="set ".$_." desired-temp 8.0";;\
fhem $cmd2;;\
}\
}\
my $oldSollTemp=ReadingsVal("TempMem".$_." ", "TempMem".$_." ", "0.0");;\
Log(3,"*** SollTempMem von : TempMem".$_." --> " . $oldSollTemp);;\
if ($window eq "closed") {\
if ($oldSollTemp > 0.0) {\
my $cmd1="set TempMem".$_." 0.0";;\
fhem $cmd1;;\
if ($jetzt ge "06:00" && $jetzt le "21:00") {\
Log(3,"### Setze Raumtemp Tag, weil Tuer wieder zu und Tag" . $fhts[$i]);;\
my $cmd2="set ".$_." desired-temp ".$day." mode auto";;\
fhem $cmd2;;\
}\
else {\
Log(3,"### Setze Raumtemp Nacht, weil Tuer wieder zu Nacht" . $fhts[$i]);;\
my $cmd2="set ".$_." desired-temp ".$night." mode auto";;\
fhem $cmd2;;\
}\
}\
}\
}\
Die Idee mit der Erweiterung der Räume um die jeweils entsprechende Variable ist super - ich werde mich da gleich mal einlesen ...
Gruss,
Stefan
Zitat von: Beta-User am 20 November 2020, 12:28:37
- Was daran "globale Variablen" sein sollen, erschließt sich mir nicht;
Das habe ich mich auch die ganze Zeit schon gefragt.
Und wenn man Werte nur zur Laufzeit von FHEM braucht, kann man die auch einfach in den zentralen hash %data schreiben und braucht dafür überhaupt keine readings. Diese Werte stehen dann im gesamten FHEM zur Verfügung.
Zitat von: Stefan01 am 20 November 2020, 12:34:34
hier mal der (mehr oder minder) komplette Regler:
und wieder keine code tags verwendet...
Wie schon gesagt wurde: das Leerzeichen dürfte falsch sein.
Ich wiederhole ::)
ReadingsVal("TempMem".$_,"state","0.0")
Und hier nachlesen https://forum.fhem.de/index.php/topic,71806.0.html
Und besser wäre ReadingsNum("TempMem".$_,"state",0)
Hi,
sorry - die "Code Tag" hab ich beim Eingabefeld nicht auf die Schnelle gefunden und der Code-Auszug war noch der alte Zustand
Das mit dem Leerzeichen teste ich gerade ... werde gleich berichten.
Wie geht das mit dem "hash %data"?
Gruss,
Stefan
Zitat von: Stefan01 am 20 November 2020, 12:41:12
Wie geht das mit dem "hash %data"?
Das hat primär nix mit FHEM zu tun, das sind perl Grundlagen. Stichwort = hash
FHEM sorgt nur dafür, dass es einen solchen hash mit dem Namen %data gibt, der für eigene Zwecke verwendet werden kann.
Zitat von: Otto123 am 20 November 2020, 12:29:24
wozu noch ...
...wenn wir schon beim Weglassen sind... Ohne explizite concat sollte das hier auch funktionieren:
ReadingsVal("TempMem$_","state","0.0")
(Klappt aber so nur deswegen, weil nach der Variable nichts mehr kommt, sonst muss man ggf. tricksen mit ${variablenname} oder qq(mach was sinnvolles aus meinen bausteinchen)).
Weiter erschließt sich mir der trigger für das notify nicht.
Grundsätzlich sollte man mAn. solche Code-Bausteinchen nach myUtils auslagern, ist mittelfristig übersichtlicher, siehe https://wiki.fhem.de/wiki/99_myUtils_anlegen (https://wiki.fhem.de/wiki/99_myUtils_anlegen). Da ist auch ein link zum Gebrauch von %data zu finden.
Hi,
super Danke - da schau ich gleich mal nach...
Stefan
Hi,
nur eine kurze Rückmeldung: die Zeile
my $cmd1="set TempMem".$_." 0.0";;\
funktioniert auf jeden Fall schon mal. Den Rest probiere ich gleich noch aus ...
Gruss und vielen Dank für die BLITZSCHNELLE Hilfe,
Stefan
Hi,
falsche Zeile, die richtige natürlich auch:
my $oldSollTemp=ReadingsVal("TempMem".$_, "state", "0.0");;\
Gruss,
Stefan