FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Stefan01 am 20 November 2020, 12:21:30

Titel: Globale Variable
Beitrag von: Stefan01 am 20 November 2020, 12:21:30
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

Titel: Antw:Globale Variable
Beitrag von: CoolTux am 20 November 2020, 12:27:36
ReadingsVal("dummy", "TempMem".$_." ", "0.0");;\
Dein Device heisst nicht dummy sondern laut
define TempMemBad dummy
heisst er
TempMemBad

Also
ReadingsVal("TempMemBad", "TempMem".$_." ", "0.0");;\
Titel: Antw:Globale Variable
Beitrag von: Beta-User am 20 November 2020, 12:28:37
...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?
Titel: Antw:Globale Variable
Beitrag von: Otto123 am 20 November 2020, 12:29:24
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
Titel: Antw:Globale Variable
Beitrag von: Stefan01 am 20 November 2020, 12:34:34
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
Titel: Antw:Globale Variable
Beitrag von: betateilchen am 20 November 2020, 12:35:15
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.
Titel: Antw:Globale Variable
Beitrag von: betateilchen am 20 November 2020, 12:35:38
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.
Titel: Antw:Globale Variable
Beitrag von: Otto123 am 20 November 2020, 12:37:22
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)
Titel: Antw:Globale Variable
Beitrag von: Stefan01 am 20 November 2020, 12:41:12
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

Titel: Antw:Globale Variable
Beitrag von: betateilchen am 20 November 2020, 12:42:47
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.
Titel: Antw:Globale Variable
Beitrag von: Beta-User am 20 November 2020, 12:43:32
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.
Titel: Antw:Globale Variable
Beitrag von: Stefan01 am 20 November 2020, 12:44:48
Hi,

super Danke - da schau ich gleich mal nach...


   Stefan
Titel: Antw:Globale Variable
Beitrag von: Stefan01 am 20 November 2020, 12:58:00
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
Titel: Antw:Globale Variable
Beitrag von: Stefan01 am 20 November 2020, 12:59:16
Hi,

falsche Zeile, die richtige natürlich auch:

my $oldSollTemp=ReadingsVal("TempMem".$_, "state", "0.0");;\

Gruss,

    Stefan