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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

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.