Global symbol "$DEVICE" requires explicit package name at...

Begonnen von Maxl, 30 Dezember 2016, 20:32:27

Vorheriges Thema - Nächstes Thema

Maxl

Hallo,

habe ein kleines Problem mit Perl, bekomme folgende Fehlermeldung wenn ich meine m99_myUtils abspeichern will
und weiß nicht so recht was ich an der letzten Zeile "if ( $settemp>23 ) { fhem("set $device desired-temp 21"); " falsch mache.

sub CheckThermo()
{
  my $brauche_waerme=0;
  my $ventile_im_leerlauf=0;
  my $ventil=0;
  my $ventile_zu=0;
  my $ventile_auf=0;
  my $boosttime=0;
  my $settemp=0;

  my $heizung_status=ReadingsVal("HK1_Ein","state","off ok");
  my $heizung_boost=ReadingsVal("HK1_Ein_Boost","state","off ok");
  my @devices = devspec2array('Thermostat_\w*_Clima');

  foreach my $device (@devices)
  {
    $ventil=ReadingsVal($device, "ValvePosition", "999");
    $settemp=ReadingsVal($device, "desired-temp", "999");
    $boosttime=ReadingsVal($device, "boostTime", "999");
    $boosttime=~s/\D//g;
    ###$boosttime=(substr($boosttime, 0, (length($boosttime)-4)));
    Log(3,"Ventil ".$device.": ".int($boosttime));
   
    if ($ventil > 50) { $brauche_waerme=1 }
    if ($ventil < 40) { $ventile_im_leerlauf++ }
    if ($ventil == 0) { $ventile_zu++ }
    if ($boosttime > 0) { $ventile_auf=1 }
  }
  ### für einige Minuten heizen
  if ($ventile_auf > 0)
  {
    if ($heizung_boost ne "on ok") { fhem ("set HK1_Ein_Boost on");}
  }else{
    if ($heizung_boost eq "on ok") { fhem ("set HK1_Ein_Boost off");}
  }
  ### Wärmeanforderung Pumpe HK1 ein, wenn Thermostate offen
  if ($brauche_waerme != 0) 
  {
    Log(3,"Wärme benoetigt, Status vorher: ".$heizung_status);
    if ($heizung_status ne "on ok")
    {
      fhem ("set HK1_Ein on");
    }
  } else {
    if ($ventile_im_leerlauf == @devices) 
    {
      if ($heizung_status eq "on ok")
      {
         Log(3,"Keine Wärme benoetigt, Status vorher: ".$heizung_status." ".$ventile_zu." von ".@devices." Ventile zu");
         fhem ("set HK1_Ein off"); 
       } else {
         Log(3,"Heizbedarf: ".$ventile_im_leerlauf." of ".@devices." actuators are idle.")
      }
    }
  }
  if ( $settemp>23 ) { fhem("set $device desired-temp 21"); }
}
FHEM auf Raspberry mit HM, HMC und AVR Netios.

CoolTux

Die Deklaration einer Variablen innerhalb einer Schleife verbleibt auch nur in dieser gültig.

my $device;

ausserhalb der Schleife sollte Abschaffung bringen. Und natürlich das my raus nehmen nach foreach
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

DS_Starter

Versuchs mal so:


sub CheckThermo()
{
  my $brauche_waerme=0;
  my $ventile_im_leerlauf=0;
  my $ventil=0;
  my $ventile_zu=0;
  my $ventile_auf=0;
  my $boosttime=0;
  my $settemp=0;
  my $device;

  my $heizung_status=ReadingsVal("HK1_Ein","state","off ok");
  my $heizung_boost=ReadingsVal("HK1_Ein_Boost","state","off ok");
  my @devices = devspec2array('Thermostat_\w*_Clima');

  foreach $device (@devices)
  {
    $ventil=ReadingsVal($device, "ValvePosition", "999");
    $settemp=ReadingsVal($device, "desired-temp", "999");
    $boosttime=ReadingsVal($device, "boostTime", "999");
    $boosttime=~s/\D//g;
    ###$boosttime=(substr($boosttime, 0, (length($boosttime)-4)));
    Log(3,"Ventil ".$device.": ".int($boosttime));
   
    if ($ventil > 50) { $brauche_waerme=1 }
    if ($ventil < 40) { $ventile_im_leerlauf++ }
    if ($ventil == 0) { $ventile_zu++ }
    if ($boosttime > 0) { $ventile_auf=1 }
  }
  ### für einige Minuten heizen
  if ($ventile_auf > 0)
  {
    if ($heizung_boost ne "on ok") { fhem ("set HK1_Ein_Boost on");}
  }else{
    if ($heizung_boost eq "on ok") { fhem ("set HK1_Ein_Boost off");}
  }
  ### Wärmeanforderung Pumpe HK1 ein, wenn Thermostate offen
  if ($brauche_waerme != 0)
  {
    Log(3,"Wärme benoetigt, Status vorher: ".$heizung_status);
    if ($heizung_status ne "on ok")
    {
      fhem ("set HK1_Ein on");
    }
  } else {
    if ($ventile_im_leerlauf == @devices)
    {
      if ($heizung_status eq "on ok")
      {
         Log(3,"Keine Wärme benoetigt, Status vorher: ".$heizung_status." ".$ventile_zu." von ".@devices." Ventile zu");
         fhem ("set HK1_Ein off");
       } else {
         Log(3,"Heizbedarf: ".$ventile_im_leerlauf." of ".@devices." actuators are idle.")
      }
    }
  }
  if ( $settemp>23 ) { fhem("set $device desired-temp 21"); }
}


Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

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

Maxl

#5
Hallo,

danke für die schnelle Hilfe, das "my" hat funktioniert, bin kein so großer PERL Guru ;-)
aber mit dem Befehl

  if ( $settemp>23 ) { fhem("set $device desired-temp 21.0"); }


kommt schon wider ein Fehler im Logfile, es wir das desired-temp nicht erkannt

Wärme benoetigt, Status vorher: on ok
2016.12.30 22:22:09.729 5: Cmd: >set  desired-temp 21.0<
2016.12.30 22:22:09.742 3: set  desired-temp 21.0 : Please define desired-temp first
2016.12.30 22:22:09.743 3: mycall: Please define desired-temp first
2016.12.30 22:22:09.743 5: redefine at command mycall as +*00:01:30 { CheckThermo() }
2016.12.30 22:22:09.745 5: Triggering mycall (1 changes)
2016.12.30 22:22:09.746 5: Starting notify loop for mycall, first event Next: 22:23:39


eigentich will ich nur die Maximaltemp. begrenzen wenn jemand auf 30°C dreht.
FHEM auf Raspberry mit HM, HMC und AVR Netios.

martinp876

set $device regSet tempMax  23

kein if, nix. Das Device passt selbst auf.
Eleganter (auch hier) mit einem Template. Bei interesse kann ich eines bauen.

Maxl

Hallo,

ZitatEleganter (auch hier) mit einem Template. Bei interesse kann ich eines bauen.

Ich finde kein hier  :(

FHEM auf Raspberry mit HM, HMC und AVR Netios.

martinp876

ZitatIch finde kein hier
das ist kein Link.
Was ich sagen will: Wenn du templates nutzen willst UND die einstellung in diesem Fall über das Device generieren willst kann ich dir ein Template zu Verfügung stellen.
Beispiel (use-case)
Ich habe ein template welches ich auf alle meine RTs anwende. Mein Ziel: Alle RTs arbeiten mit den gleichen Einstellungen. Alle gleich? nein. Ich will alle gleich, allerdings will ich die Boottime und die Valvemax einstellung indivituell steuern. Aber der Rest soll gleich sein.
Bei der Erstellung eines Templates muss man wissen was man will:
- welchen devicetyp will ich steuern? => RTs
- Welche Register will ich vereinheitlichen? => i.A. alle. man kann auch beliebige weglassen.
- welche Register (Funktionen) will ich individuell einstellen? => bei dir evtl maxtemp. Bei mir z.B. boost time

dann kann ich eines erstellen und hier posten.
Die allgemeine Anwendung kannst du in Wiki nachlesen.

Maxl

Hallo Martin,

danke gern, vielleicht könntest du mir dein RT template zu Verfügung stellen,
umtippen auf meine Bedürfnisse denke werde ich schon schaffen. Bei mir hapert
es nur immer an einen aussagekräftigen Beispiel.

Gruß
Mario
FHEM auf Raspberry mit HM, HMC und AVR Netios.

martinp876

https://wiki.fhem.de/wiki/HomeMatic_HmInfo_Templates_erstellen#Heizung_RT_Templates

Hilft das?
Schon den template Editor getestet?
Define HT HMtemplate

Der soll beim erstellen oder editieren helfen