Hauptmenü

Globale Variable

Begonnen von Stefan01, 20 November 2020, 12:21:30

Vorheriges Thema - Nächstes Thema

Stefan01

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


CoolTux

ReadingsVal("dummy", "TempMem".$_." ", "0.0");;\
Dein Device heisst nicht dummy sondern laut
define TempMemBad dummy
heisst er
TempMemBad

Also
ReadingsVal("TempMemBad", "TempMem".$_." ", "0.0");;\
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

...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?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

#3
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Stefan01

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

#7
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)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Stefan01

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


betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

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. Da ist auch ein link zum Gebrauch von %data zu finden.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Stefan01

Hi,

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


   Stefan

Stefan01

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

Stefan01

Hi,

falsche Zeile, die richtige natürlich auch:

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

Gruss,

    Stefan