FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: Maxl am 30 Dezember 2016, 20:32:27

Titel: Global symbol "$DEVICE" requires explicit package name at...
Beitrag von: Maxl am 30 Dezember 2016, 20:32:27
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"); }
}
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at
Beitrag von: CoolTux am 30 Dezember 2016, 20:39:34
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
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at
Beitrag von: DS_Starter am 30 Dezember 2016, 20:40:12
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
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at
Beitrag von: DS_Starter am 30 Dezember 2016, 20:41:29
Ups .... schönen Abend noch Cooltux  :)
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at
Beitrag von: CoolTux am 30 Dezember 2016, 20:44:24
Danke Dir Heiko. Wünsche ich Dir auch.


Grüße
Leon
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at
Beitrag von: Maxl am 30 Dezember 2016, 22:03:48
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.
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at...
Beitrag von: martinp876 am 31 Dezember 2016, 08:37:34
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.
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at...
Beitrag von: Maxl am 31 Dezember 2016, 10:08:36
Hallo,

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

Ich finde kein hier  :(

Titel: Antw:Global symbol "$DEVICE" requires explicit package name at...
Beitrag von: martinp876 am 31 Dezember 2016, 10:41:16
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.
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at...
Beitrag von: Maxl am 31 Dezember 2016, 15:13:08
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
Titel: Antw:Global symbol "$DEVICE" requires explicit package name at...
Beitrag von: martinp876 am 31 Dezember 2016, 18:31:39
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