Hauptmenü

99_myXXXXXXX

Begonnen von Michael, 07 September 2013, 19:50:26

Vorheriges Thema - Nächstes Thema

Michael

Moin

Mein erster Versuch, der gleich schief geht.

Ich habe mir eine 99_myBeaufortSkala.pm angelegt,
nur leider wird sie nicht unter Edit File Angezeigt.

Wenn ich 's unter dem Frontend tue bekomme ich diese Meldung.
Undefined subroutine &main::myBeaufortSkalat_Initialize called at fhem.pl line 1777.

Und wenn man ein reload 99_myBeaufortSkala.pm eingibt,kommt das.
syntax error at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 21, near "my "
Global symbol "$WindSt" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 21.
Global symbol "$WindBez" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 26.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 27.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 27.
Global symbol "$WindBez" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 28.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 29.
Global symbol "$bwind" requires explicit package name at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 29.
.
.
.
syntax error at /opt/fhem//FHEM/99_myBeaufortSkala.pm line 84, near "}"
/opt/fhem//FHEM/99_myBeaufortSkala.pm has too many errors.

Was mach ich alles Falsch und könnt Ihr mir dabei Helfen?
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

betateilchen

ZitatWenn ich 's unter dem Frontend tue bekomme ich diese Meldung.

Wenn Du was tust?


##############################################
# $Id: 99_myBeaufortSkala.pm

package main;

use strict;
use warnings;
use POSIX;

sub
myBeaufortSkala_Initialize($$)
{
my ($hash) = @_;
}

*** start your own code below this line



Und Deine vielen Fehlermeldungen kommen daher, dass Du hier (Zeilen 20+21)


  my $WindBez = ""
  my $WindSt=""


permanent das Semikolon am Zeilenende vergessen hast. Weiter hab ich mir Dein Coding jetzt nicht angeschaut.

Schlampig gearbeitet - und perl rächt sich logischerweise und konsequent durch Nichtfunktionieren.


---
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Michael

ZitatUnd Deine vielen Fehlermeldungen kommen daher, dass Du hier (Zeilen 20+21)

  my $WindBez = ""
  my $WindSt=""

Da hast du vollkommen Recht, das war so und die Fehlermeldungen sind weg.



ZitatZitat:
Wenn ich 's unter dem Frontend tue bekomme ich diese Meldung.
Ich hatte diesen Code in der 99_myUtils eingegeben und mit Save as die Datei unter
neuen Namen gespeichert.

Und dann bekam ich die Fehlermeldung:
ZitatUndefined subroutine &main::myBeaufortSkalat_Initialize called at fhem.pl line 1777.

Angezeigt bekomme ich sie aber immer noch nicht unter Edit Files.
Ach so hatte die Dateirechte unter Windows den anderen angeglichen.
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

Michael

Moin

So das mit der eigenen Datei habe ich Aufgegeben.
Und alles in die 99_myUtils.pm geschrieben.

Nur leider bekomme ich einen Falschen Wert zurück.

Bei einem Wind von 0.8 bekomme ich einen Wert von 11 zurück
was eigentlich 0 sein müsste.
##########################################################################################################################
sub BeaufortStaerke()
{
  my $bwind = ReadingsVal("device KS300","wind",0);
  my $WindSt = "";

#################################################################
#Wind stärken Bezeichnung
if($bwind lt 1)
 { $WindSt = "0\n" };
if($bwind ge 1 || $bwind le 5)
 { $WindSt = "1\n" };
if($bwind ge 6 || $bwind le 11)
 { $WindSt = "2\n" };
if($bwind ge 12 || $bwind le 19)
 { $WindSt = "3\n" };
if($bwind ge 20 || $bwind le 28)
 { $WindSt = "4\n" };
if($bwind ge 29 || $bwind le 38)
 { $WindSt = "5\n" };
if($bwind ge 39 || $bwind le 49)
 { $WindSt = "6\n" };
if($bwind ge 50 || $bwind le 61)
 { $WindSt = "7\n" };
if($bwind ge 62 || $bwind le 74)
 { $WindSt = "8\n" };
if($bwind ge 75 || $bwind le 88)
 { $WindSt = "9\n" };
if($bwind ge 89 || $bwind le 102)
 { $WindSt = "10\n" };
if($bwind ge 103 || $bwind le 117)
 { $WindSt = "11\n" };
if($bwind ge 118)
 { $WindSt = "12\n" };

return $WindSt;


Was ist hier schon wieder Falsch?
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

betateilchen

1. Falsche Logik in Deinen Abfragen

|| bedeutet ein logisches ODER, was Du aber in Deinen Abfragen möchtest, ist ein logisches UND.

if($bwind ge 50 || $bwind le 61) { $WindSt = "7\n" };

Du möchtest doch wissen, ob die Windstärke größergleich 50 UND kleinergleich 61 ist. Also muss es heißen:

if($bwind ge 50 && $bwind le 61) { $WindSt = "7\n" };


2. falsche Vergleichsoperatoren

ge und le sind Vergleichsoperatoren für Strings, Du vergleichst aber numerische Zahlenwerte. Es müsste also so heißen:

if($bwind >= 50 && $bwind <= 61) { $WindSt = "7\n" };


3. viel übersichtlicher würde ich das Ganze so lösen


sub BeaufortStaerke()
{
my $bwind = int(ReadingsVal("device KS300","wind",0));

# Windstärken Bezeichnung

return "0\n" if($bwind < 1);
return "1\n" if($bwind ~~ [1..5]);
return "2\n" if($bwind ~~ [6..11]);
return "3\n" if($bwind ~~ [12..19]);
return "4\n" if($bwind ~~ [20..28]);
return "5\n" if($bwind ~~ [29..38]);
return "6\n" if($bwind ~~ [39..49]);
return "7\n" if($bwind ~~ [50..61]);
return "8\n" if($bwind ~~ [62..74]);
return "9\n" if($bwind ~~ [75..88]);
return "10\n" if($bwind ~~ [89..102]);
return "11\n" if($bwind ~~ [103..117]);
return "12\n" if($bwind > 117);
}



---
-----------------------
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: Michael schrieb am Sa, 07 September 2013 20:23Und dann bekam ich die Fehlermeldung:
[Undefined subroutine &main::myBeaufortSkalat_Initialize called at fhem.pl line 1777.

Da hattest Du beim Eingeben des Dateinamens einen Tippfehler gemacht, da ist nämlich ein t zuviel und dadurch stimmt der Dateiname nicht mit dem Namen der Initialize-Funktion überein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Michael

Danke !!!

Mit betateilchen seiner großen Hilfe habe ich das in die 99_myUtils.pm aufgenommen.
#####################################################################################################################
# Eigen Device für den WindIndex
# Quelle : http://www.meteotest.ch/wetterprognosen/prognosen_schweiz/windtabelle
#

sub windIndex()
{
my $wI = int(ReadingsVal("DEVICE KS300","wind",0));
        my $wIndex = "";

# Windstärken Bezeichnung

return $wIndex = "0\n" if($wI < 1);
return $wIndex = "1\n" if($wI ~~ [1..5]);
return $wIndex = "2\n" if($wI ~~ [6..11]);
return $wIndex = "3\n" if($wI ~~ [12..19]);
return $wIndex = "4\n" if($wI ~~ [20..28]);
return $wIndex = "5\n" if($wI ~~ [29..38]);
return $wIndex = "6\n" if($wI ~~ [39..49]);
return $wIndex = "7\n" if($wI ~~ [50..61]);
return $wIndex = "8\n" if($wI ~~ [62..74]);
return $wIndex = "9\n" if($wI ~~ [75..88]);
return $wIndex = "10\n" if($wI ~~ [89..102]);
return $wIndex = "11\n" if($wI ~~ [103..117]);
return $wIndex = "12\n" if($wI > 117);

}

#####################################################################################################################
# Eigen Device für den WindText
# Quelle : http://www.meteotest.ch/wetterprognosen/prognosen_schweiz/windtabelle/
#

sub windText()
{
my $wT = int(ReadingsVal("DEVICE KS300","wind",0));
        my $wText = "";

# Windstärken Bezeichnung

return $wText = "Windstille\n" if($wT < 1);
return $wText = "leiser Zug\n" if($wT ~~ [1..5]);
return $wText = "leichte Brise\n" if($wT ~~ [6..11]);
return $wText = "schwacher Wind\n" if($wT ~~ [12..19]);
return $wText = "mäßiger Wind\n" if($wT ~~ [20..28]);
return $wText = "frischer Wind\n" if($wT ~~ [29..38]);
return $wText = "starker Wind\n" if($wT ~~ [39..49]);
return $wText = "steifer Wind\n" if($wT ~~ [50..61]);
return $wText = "stürmischer Wind\n" if($wT ~~ [62..74]);
return $wText = "Sturm\n" if($wT ~~ [75..88]);
return $wText = "schwerer Sturm\n" if($wT ~~ [89..102]);
return $wText = "orkanartiger Sturm\n" if($wT ~~ [103..117]);
return $wText = "Orkan\n" if($wT > 117);

}


Und das ist in der fhem.cfg bzw in einer include *.cfg
#################################################################
###### WindIndex nach
#
define updateWindIndex at +*00:03:00 {my $wIndex =  $defs{DEVICE KS300};;\
  readingsSingleUpdate($wIndex,"windIndex", windIndex(), 1) if( defined($wIndex) );;}
attr updateWindIndex verbose 0

#################################################################
# WindText nach
#
define updateWindText at +*00:03:00 {my $wText =  $defs{DEVICE KS300};;\
  readingsSingleUpdate($wText,"windText", windText(), 1) if( defined($wText) );;}


Wer es gebrauchen kann bitte sehr.
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

betateilchen

ich verstehe zwar nicht, was Du Dir da für ein kompliziertes Coding zusammengeschräubelt hast, aber meines Erachtens gibt es da erhebliches Optimierungspotenzial...

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Harald

Hallo zusammen,

ich habe auch Fragen zu meiner 99_myUtils.pm. Im Logfile erhalte ich keine Fehlermeldungen aber im Putty-Fenster.
Diese Meldungen kommen, wenn ich mit dem FHEM-internen Editor die Datei aufrufe oder wenn ich reload 99_myUtils.pm eingebe.
Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 12
Subroutine CallMonOn redefined at ./FHEM/99_myUtils.pm line 24
Subroutine FBCall redefined at ./FHEM/99_myUtils.pm line 32
Subroutine FBHangOn redefined at ./FHEM/99_myUtils.pm line 49
Subroutine addLog redefined at ./FHEM/99_myUtils.pm line 63
Subroutine Info_LED redefined at ./FHEM/99_myUtils.pm line 76

Die gemeldeten Zeilen-Nr. bezeichnen jeweils die Zeile mit der "{" hinter dem Aufruf der Subroutine. Meine 99_Utils.pm sieht so aus:##############################################
# $Id: 99_myUtils.pm 1932 2013-06-06 Harald $

package main;
use strict;
use warnings;
use POSIX;

sub myUtils_Initialize($$)
{
  my ($hash) = @_;
}
#
###################################################################
#
# Telefone der FB klingeln beim Betätigen der Türklingel
#
# wird aufgerufen durch:
# define Klingel1_on notify Klingel1:on {FBCall("**701")}
#
sub CallMonOn()
{
qx (echo '#96*5*' | nc 127.0.0.1 1011);
}
#
#  

sub FBCall($)
{
  my ($callnr) = @_;
  $callnr = "ATP3 ATDT ".$callnr."";
  my $ret = "ATD: " . `echo $callnr | nc 127.0.0.1 1011`;
#
# explanation of next line:
# =~ binds $ret to regular expression
# s ... search
# [\r\n]* ... all CR, LF
# ,, ... replace by nothing
# g ... global replace
#
  $ret =~ s,[\r\n]*,,g;             # remove CR from return string
  InternalTimer(gettimeofday()+8, "FBHangOn","0", 0);
}

sub FBHangOn($)
{
  my $ret = "ATH: " . `echo "ATH0" | nc 127.0.0.1 1011`;
  $ret =~ s,[\r\n]*,,g;
}
#
#### Log-Abriss vermeiden
# called by
# define addLog notify addLog {addLog("ez_Aussensensor","state");addLog("ez_FHT","actuator");\
#               addLog("MunichWeather","humidity");addLog("MunichWeather","pressure");\
#               addLog("MunichWeather","temperature");addLog("MunichWeather","wind_chill");}
# define a_midnight1 at *23:59 trigger addLog
# define a_midnight2 at *00:01 trigger addLog

sub addLog($$)
{
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry   << addLog";
  } else {
    fhem "trigger $logdevice $reading: $logentry   << addLog";
  }
}
#
##################################################################
#
sub Info_LED($)
{
  my $current = $_[0];

  if ($current eq "on") {
    $current = "off";
    qx(echo 7,1 >/var/led);
  } else {
    $current = "on";
    qx(echo 7,2 >/var/led);
  }
  fhem("set blink.state $current");
}
#
##################################################################
1;

Es wäre toll, wenn mir jemand sagen könnte, was da falsch ist.

Herzlichen Dank schonmal im Voraus und viele Grüße

Harald
Router:AVM7590 1&1 FW:FRITZ!OS 07.56 Anbindung:1&1 50/10 Mb/s, WLAN-Repeater 300E
ELV MAX!Cube, 7xThermostat, ECO, RasPi 4B mit bullseye auf Festplatte,
CUL V 1.67, JeeLink v3_10.1c, nanoCUL, 1xS300TH, 4xHMS100T, 4xELRO, 1xTFA, 2xMAX_FK
ELV MAX!1.4.5, FHEM 5.7 auf RasPi, Kostal PIKO plus

justme1968

es ist nichts falsch. wenn das file mit reload neu geladen wird werden ja die gleichen funktionen von mal zuvor überschrieben. deshalb die meldung redfined.

das ist so lange ok wie nur diese meldungen kommen und du nicht aus versehen routinen aus anderen modulen überschreibst :)

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Harald

Besten Dank andre für die Erläuterungen. Ich bin auch nicht faul gewesen und habe auch andere Dateien ausprobiert. Da habe ich mir schon so etwas ähnliches gedacht. Vielen Dank jedenfalls für Deine Ausführungen und Bestätigung meiner Vermutung.

Schönes Wochenende und viele Grüße

Harald

Achja, eine Frage habe ich doch noch: Ist es so, dass wenn man z.B. 99_myUtils.pm mittels des internen Editors
aufruft und dann abspeichert, automatisch ein reload gestartet wird? Wenn ja, verstehe ich auch, warum dabei die "redefined"-Meldungen kommen.
Router:AVM7590 1&1 FW:FRITZ!OS 07.56 Anbindung:1&1 50/10 Mb/s, WLAN-Repeater 300E
ELV MAX!Cube, 7xThermostat, ECO, RasPi 4B mit bullseye auf Festplatte,
CUL V 1.67, JeeLink v3_10.1c, nanoCUL, 1xS300TH, 4xHMS100T, 4xELRO, 1xTFA, 2xMAX_FK
ELV MAX!1.4.5, FHEM 5.7 auf RasPi, Kostal PIKO plus