Subroutine in DOIF mit mehreren Bedingungen

Begonnen von ErzGabriel, 27 März 2021, 13:31:50

Vorheriges Thema - Nächstes Thema

ErzGabriel

Fehlermeldung kommt nur, wenn ich die geschweiften Klammern weglasse.

Meine 99myUtils:
#########################################
##########                     ##########
########## Datei Grundstruktur ##########
##########                     ##########
#########################################

package main;

use strict;
use warnings;
use POSIX;


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

########## Datei Grundstruktur Ende ##########


############################################################
########## Netzwerk Gerät über Fritzbox abfragen ###########
############################################################


sub checkAllFritzMACpresent($) {
  # Benötigt: nur die zu suchende MAC ($MAC),
  # Es werden alle Instanzen vom Type FRITZBOX abgefragt
  #
  # Rückgabe: 1 = Gerät gefunden
  #           0 = Gerät nicht gefunden
  my ($MAC) = @_;
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
  my $Status = 0;
  $MAC =~ tr/:/_/;
  $MAC = "mac_".uc($MAC);
  my @FBS = devspec2array("TYPE=FRITZBOX");
    foreach( @FBS ) {
        my $StatusFritz = ReadingsVal($_, $MAC, "weg");
        if ($StatusFritz eq "weg") {
            # Dieser Zweig testet ob das Reading vorhanden ist
            } elsif ($StatusFritz eq "inactive") {
            # Dieser Zweig testet ob im Reading inactive steht
            } elsif ($StatusFritz =~ /(.*)s, 0/) {
            # Dieser Zweig testet auf "<geraetename> (WLAN, 0 / 0 Mbit/s, 0)"
        } else { $Status = 1}
    }
  return $Status
}

########## Ende Fritzbox Netzwerk Abfrage ##########


################################
########## Pollenflug ##########
################################

sub pollen() {
my @Vxxx;
my $msg;
my @plants = ("Birke", "Erle", "Graeser", "Hasel", "Roggen");
foreach my $plant (@plants) {
my $pol = ReadingsVal("Pollen","fc2_$plant", "");
if ($pol !~ /white/) {
$msg .= "🌳 "  if ($plant =~ /Birke|Erle/);
$msg .= "🌿 "  if ($plant =~ /Graeser/);
$msg .= "🌾 "  if ($plant =~ /Roggen/);
$msg .= "🌰 "  if ($plant =~ /Hasel/);
$msg .= "$plant: leichte Belastung 🟡\n" if ($pol =~ /yellow/);
$msg .= "$plant: mittlere Belastung 🟠\n" if ($pol =~ /orange/);
$msg .= "$plant: starke Belastung 🔴\n" if ($pol =~ /red/);
}
}
fhem("set Jarvis msg @Vxxx $msg") if ($msg);
}


sub pollen_sauerland() {
my @Vxxx;
my $msg;
my @plants = ("Birke", "Erle", "Graeser", "Hasel", "Roggen");
foreach my $plant (@plants) {
my $pol = ReadingsVal("Pollen_Sauerland","fc2_$plant", "");
if ($pol !~ /white/) {
$msg .= "🌳 "  if ($plant =~ /Birke|Erle/);
$msg .= "🌿 "  if ($plant =~ /Graeser/);
$msg .= "🌾 "  if ($plant =~ /Roggen/);
$msg .= "🌰 "  if ($plant =~ /Hasel/);
$msg .= "$plant: leichte Belastung 🟡\n" if ($pol =~ /yellow/);
$msg .= "$plant: mittlere Belastung 🟠\n" if ($pol =~ /orange/);
$msg .= "$plant: starke Belastung 🔴\n" if ($pol =~ /red/);
}
}
fhem("set Jarvis msg @Vxxx $msg") if ($msg);
}

########## Ende Pollenflug ##########


#################################################
########## Proplanta LogProxy-Funktion ##########
#################################################

sub logProxy_proplanta2Plot($$$$;$$) {
my ($device, $fcValue, $from, $to, $fcHour, $expMode) = @_;
    my $regex;
    my @rl;
   
return undef if(!$device);
   
    if($fcValue =~ s/_$//) {
        $regex = "^fc[\\d]+_".$fcValue."[\\d]{2}\$";
    }
    else {
        $regex = "^fc[\\d]+_".$fcValue."\$";
    }
   
    $fcHour = 12 if(!defined $fcHour);
    $expMode = "point" if(!defined $expMode);

if( defined($defs{$device}) ) {
if( $defs{$device}{TYPE} eq "PROPLANTA" ) {
            @rl = sort{
                my ($an) = ($a =~ m/fc(\d+)_.*/);
                my ($bn) = ($b =~ m/fc(\d+)_.*/);
                $an <=> $bn or $a cmp $b;
                }( grep /${regex}/,keys %{$defs{$device}{READINGS}} );
return undef if( !@rl );
} else {
Log3 undef, 2, "logProxy_proplanta2Plot: $device is not a PROPLANTA device";
return undef;
}
}

my $fromsec = SVG_time_to_sec($from);
my $tosec   = SVG_time_to_sec($to);
my $sec = $fromsec;
my ($h,$fcDay,$mday,$mon,$year);
my $timestamp;
   
my $reading;
my $value;
my $prev_value;
my $min = 999999;
my $max = -999999;
my $ret = "";

# while not end of plot range reached
while(($sec < $tosec) && @rl) {
#remember previous value for start of plot range
$prev_value = $value;

$reading = shift @rl;
        ($fcDay) = $reading =~ m/^fc(\d+).*/;
    $h = ($reading =~ m/.*(\d\d)$/)?$1:$fcHour;
$value = ReadingsVal($device,$reading,undef);
       
($mday,$mon,$year) = split('\.',ReadingsVal($device,"fc".$fcDay."_date",undef));
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, $h, 0, 0);
$sec = SVG_time_to_sec($timestamp);
       
# skip all values before start of plot range
next if( SVG_time_to_sec($timestamp) < $fromsec );

# add first value at start of plot range
if( !$ret && $prev_value ) {
  $min = $prev_value if( (looks_like_number($prev_value) && ($prev_value < $min)) || ($prev_value lt $min) );
  $max = $prev_value if( (looks_like_number($prev_value) && ($prev_value > $max)) || ($prev_value gt $max) );
  $ret .= "$from $prev_value\n";
}

# done if after end of plot range
last if($sec > $tosec);

$min = $value if( (looks_like_number($value) && ($value < $min )) || ($value lt $min) );
$max = $value if( (looks_like_number($value) && ($value > $max )) || ($value gt $max) );

# add actual controll point
$ret .= "$timestamp $value\n";

# Log 1, "$timestamp $value -0- $reading";
}
    if(($sec < $tosec) && !@rl && ($expMode eq "day")) {
    $timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, 23, 59, 59);
    if(SVG_time_to_sec($timestamp) < $tosec) {
        $ret .= "$timestamp $value\n";
        }
        else {
$ret .= "$to $value\n";
        }
    }
    elsif(($sec > $tosec) && ($expMode eq "day")) {
        $value = $prev_value + ($value - $prev_value)*(86400 + ($tosec - $sec))/86400;
        $ret .= "$to $value\n";
    }
return ($ret,$min,$max,$prev_value);
}

########## Ende Proplanta ##########


#########################################################
########## Kalenderfunktion für Abfallkalender ##########
#########################################################

sub datumHeuteMorgen($)
{
my $compareDate = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; $mon += 1;
my $heute = sprintf('%02d.%02d.%04d', $mday, $mon, $year);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time+86400);
$year += 1900; $mon += 1;
my $morgen = sprintf('%02d.%02d.%04d', $mday, $mon, $year);
return "heute" if $compareDate eq $heute;
return "morgen" if $compareDate eq $morgen;
return $compareDate;
}

########## Ende Kalenderfunktion ##########

1;


Da ist zu sehen, das die Sub drin ist.

Otto123

Zitat von: ErzGabriel am 27 März 2021, 16:23:07
Fehlermeldung kommt nur, wenn ich die geschweiften Klammern weglasse.
Willst Du mich veräppeln?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

Otto123

Ich habe Deine Routine in meine 99_myUtils.pm übernommen.
Ich habe deine Pollen_Sauerland übernommen.
Ich habe Deine Nachricht in einen Logeintrag umgewandelt:
Log 1, "set Jarvis msg @Vxxx $msg";
Ergebnis wenn ich in der FHEM Kommandozeile diesen Befehl einwerfe:
{pollen_sauerland()}
2021.03.27 18:04:48 1: set Jarvis msg  🌳 Erle: leichte Belastung 🟡
Funktioniert, mehr kann ich nicht tun.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

ErzGabriel

Okay, danke.
Leite ich es ins Log um, kommt auch nichts bei rum. Ich weiß es nicht, muss ich mir ne andere Lösung einfallen lassen.