Hallo zusammen.
Ich habe mir heute ein Doif erstellt, mit zwei Bedingungen und einer Subroutine die dann durchgeführt werden soll. Der Trigger löst aus aber es kommt nichts ins Log.
Deswegen habe ich ein kleines Problem, ich finde keinen Fehler, das mag an meinen mangelhaften Perlkenntnissen liegen.
Könnte mal bitte ein Fachmann drüber schauen und mir sagen, wo der Fehler ist. Danke.
defmod doif_Pollen_Sauerland DOIF ([Sauerland] eq "on" and [12:15]) (set Telegrambot msg @Vxxx {pollen_sauerland()})
attr doif_Pollen_Sauerland do always
attr doif_Pollen_Sauerland group Vxxx
attr doif_Pollen_Sauerland room Telegram
Hi,
dann solltest Du diesen Inhalt posten:
{pollen_sauerland()}
Gruß Otto
Poste bitte ein list von doif_Pollen_Sauerland, ein list von Sauerland und natürlich pollen_sauerland().
Hier der List:
Internals:
CFGFN
DEF ([Sauerland] eq "on" and [12:15]) (set Jxxx msg @Vxxx {pollen_sauerland()})
FUUID 605f09b8-f33f-18e0-2f1e-f1b81acb60d78594
MODEL FHEM
NAME doif_Pollen_Sauerland
NOTIFYDEV Sauerland,global
NR 1142
NTFY_ORDER 50-doif_Pollen_Sauerland
STATE cmd_1
TYPE DOIF
VERSION 24095 2021-03-26 21:58:04
READINGS:
2021-03-27 12:15:00 cmd 1
2021-03-27 12:15:00 cmd_event timer_1
2021-03-27 12:15:00 cmd_nr 1
2021-03-27 12:14:36 mode enabled
2021-03-27 12:15:00 state cmd_1
2021-03-27 12:15:00 timer_01_c01 28.03.2021 12:15:00
Regex:
accu:
cond:
Sauerland:
0:
&STATE ^Sauerland$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'Sauerland','STATE') eq "on" and ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 set Jxxx msg @Vxxx {pollen_sauerland()}
1:
helper:
DEVFILTER ^global$|^Sauerland$
NOTIFYDEV global|Sauerland
event timer_1
globalinit 1
last_timer 1
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
timer_1
triggerEvents:
timer_1
triggerEventsState:
timer_1
internals:
all Sauerland:STATE
interval:
intervalfunc:
localtime:
0 1616926500
realtime:
0 12:15:00
time:
0 12:15:00
timeCond:
0 0
timer:
0 0
timers:
0 0
triggertime:
1616926500:
localtime 1616926500
hash:
uiState:
uiTable:
Attributes:
do always
group Vxxx
room Telegram
Hier die Subroutine:
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 Jxxx msg @Vxxx $msg") if ($msg);
}
Hi,
entweder rufst Du die sub auf und machst dort einen Return mit der Nachricht ODER du machst die Nachricht in der sub.
Jetzt machst Du eine Mischung!
So wie Deine Sub ist im DOIF einfach
({pollen_sauerland()})
Gruß Otto
Ich habe den Device mittlerweile umgebaut:
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 Jxxx msg @Vxxx $msg") if ($msg);
}
Funktioniert aber auch nicht. Datum springt auf den nächsten Tag aber im Log steht nichts.
funktioniert der Aufruf in der Kommanozeile?
{pollen_sauerland()}
Der Aufruf von:
({pollen_sauerland()})
funktioniert nicht.
Umgebaut auf:
defmod doif_Pollen_Sauerland DOIF ([15:36]) ({pollen_sauerland()})
funktioniert nicht.
Die Grundlage für meinen Aufbau:
defmod doif_Pollen DOIF ([18:00]) ({pollen()})
funktioniert seit zwei Jahren tadellos.
Könnte es dadran liegen, dass ich zwei Subroutinen habe, die fast gleich sind. Habe nur den Namen der Subroutine angepasst.
Die Klammern sind Unsinn - die gehören nur zu DOIF!
Aber wenn das in der Kommandozeile nicht funktioniert ist Deine Sub falsch.
{pollen_sauerland()}
Lasse ich die Klammern weg, kriege ich unbekanntes Kommando zu lesen.
Wie bereits gesagt, funktioniert die Sub seit zwei Jahren bei meinem ersten Pollenversand.
Dann gibt es die Sub nicht ::) wo hast Du die hingeschrieben?
In die 99myUtils.pm, die auch mit der üblichen Zeile
1;
endet.
Die Sub steht vor der Endzeile.
Zeig bitte noch Pollen_Sauerland und Sauerland.
nb an die stumm Mitlesenden: Wenn ihr ein Problem habt, bitte postet gleich im ersten Beitrag alle Devices mit list, die als Trigger dienen oder mit [] (set magic) oder anderweitig abgefragt werden.
Pollen_Sauerland
defmod Pollen_Sauerland allergy PLZ
attr Pollen_Sauerland userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07Name reading07Regex reading08Name reading08Regex reading09Name reading09Regex reading10Name reading10Regex reading11Name reading11Regex reading12Name reading12Regex reading13Name reading13Regex reading14Name reading14Regex reading15Name reading15Regex reading16Name reading16Regex reading17Name reading17Regex reading18Name reading18Regex reading19Name reading19Regex reading20Name reading20Regex reading21Name reading21Regex reading22Name reading22Regex reading23Name reading23Regex reading24Name reading24Regex reading25Name reading25Regex reading26Name reading26Regex reading27Name reading27Regex reading28Name reading28Regex reading29Name reading29Regex reading30Name reading30Regex reading31Name reading31Regex reading32Name reading32Regex timeout
attr Pollen_Sauerland event-on-change-reading Erle,Hasel,Loewenzahn,Graeser,Linde,Beifuss,Gaensefuss,Mais,Brennessel,Hafer,Roggen,Weizen,Spitzwegerich,Raps,Hopfen,Holunder,Ulme,Pappel,Weide,Birke,Eiche,Esche,Platane,Flieder,Ambrosia,Buche,Rotbuche,Ahorn,Nessel,Kiefer,Tanne,Fichte
attr Pollen_Sauerland group Pollenvorhersage
attr Pollen_Sauerland levelsFormat rc_dot@white,rc_dot@yellow,rc_dot@orange,rc_dot@red
attr Pollen_Sauerland reading01Name Erle
attr Pollen_Sauerland reading01Regex (?s)Erle.*?poll([0-3])
attr Pollen_Sauerland reading02Name Hasel
attr Pollen_Sauerland reading02Regex (?s)Hasel.*?poll([0-3])
attr Pollen_Sauerland reading03Name Loewenzahn
attr Pollen_Sauerland reading03Regex (?s)L.wenzahn.*?poll([0-3])
attr Pollen_Sauerland reading04Name Graeser
attr Pollen_Sauerland reading04Regex (?s)Gr.ser.*?poll([0-3])
attr Pollen_Sauerland reading05Name Linde
attr Pollen_Sauerland reading05Regex (?s)Linde.*?poll([0-3])
attr Pollen_Sauerland reading06Name Beifuss
attr Pollen_Sauerland reading06Regex (?s)Beifu..*?poll([0-3])
attr Pollen_Sauerland reading07Name Gaensefuss
attr Pollen_Sauerland reading07Regex (?s)G.nsefu..*?poll([0-3])
attr Pollen_Sauerland reading08Name Mais
attr Pollen_Sauerland reading08Regex (?s)Mais.*?poll([0-3])
attr Pollen_Sauerland reading09Name Brennessel
attr Pollen_Sauerland reading09Regex (?s)Brennessel.*?poll([0-3])
attr Pollen_Sauerland reading10Name Hafer
attr Pollen_Sauerland reading10Regex (?s)Hafer.*?poll([0-3])
attr Pollen_Sauerland reading11Name Roggen
attr Pollen_Sauerland reading11Regex (?s)Roggen.*?poll([0-3])
attr Pollen_Sauerland reading12Name Weizen
attr Pollen_Sauerland reading12Regex (?s)Weizen.*?poll([0-3])
attr Pollen_Sauerland reading13Name Spitzwegerich
attr Pollen_Sauerland reading13Regex (?s)Spitzwegerich.*?poll([0-3])
attr Pollen_Sauerland reading14Name Raps
attr Pollen_Sauerland reading14Regex (?s)Raps.*?poll([0-3])
attr Pollen_Sauerland reading15Name Hopfen
attr Pollen_Sauerland reading15Regex (?s)Hopfen.*?poll([0-3])
attr Pollen_Sauerland reading16Name Holunder
attr Pollen_Sauerland reading16Regex (?s)Holunder.*?poll([0-3])
attr Pollen_Sauerland reading17Name Ulme
attr Pollen_Sauerland reading17Regex (?s)Ulme.*?poll([0-3])
attr Pollen_Sauerland reading18Name Pappel
attr Pollen_Sauerland reading18Regex (?s)Pappel.*?poll([0-3])
attr Pollen_Sauerland reading19Name Weide
attr Pollen_Sauerland reading19Regex (?s)Weide.*?poll([0-3])
attr Pollen_Sauerland reading20Name Birke
attr Pollen_Sauerland reading20Regex (?s)Birke.*?poll([0-3])
attr Pollen_Sauerland reading21Name Eiche
attr Pollen_Sauerland reading21Regex (?s)Eiche.*?poll([0-3])
attr Pollen_Sauerland reading22Name Esche
attr Pollen_Sauerland reading22Regex (?s)Esche.*?poll([0-3])
attr Pollen_Sauerland reading23Name Platane
attr Pollen_Sauerland reading23Regex (?s)Platane.*?poll([0-3])
attr Pollen_Sauerland reading24Name Flieder
attr Pollen_Sauerland reading24Regex (?s)Flieder.*?poll([0-3])
attr Pollen_Sauerland reading25Name Ambrosia
attr Pollen_Sauerland reading25Regex (?s)Ambrosia.*?poll([0-3])
attr Pollen_Sauerland reading26Name Buche
attr Pollen_Sauerland reading26Regex (?s)Buche.*?poll([0-3])
attr Pollen_Sauerland reading27Name Rotbuche
attr Pollen_Sauerland reading27Regex (?s)Rotbuche.*?poll([0-3])
attr Pollen_Sauerland reading28Name Ahorn
attr Pollen_Sauerland reading28Regex (?s)Ahorn.*?poll([0-3])
attr Pollen_Sauerland reading29Name Nessel
attr Pollen_Sauerland reading29Regex (?s)Nessel.*?poll([0-3])
attr Pollen_Sauerland reading30Name Kiefer
attr Pollen_Sauerland reading30Regex (?s)Kiefer.*?poll([0-3])
attr Pollen_Sauerland reading31Name Tanne
attr Pollen_Sauerland reading31Regex (?s)Tanne.*?poll([0-3])
attr Pollen_Sauerland reading32Name Fichte
attr Pollen_Sauerland reading32Regex (?s)Fichte.*?poll([0-3])
attr Pollen_Sauerland room Wetter
attr Pollen_Sauerland stateFormat fc1_maximum
attr Pollen_Sauerland timeout 10
attr Pollen_Sauerland updateEmpty 1
attr Pollen_Sauerland updateIgnored 1
attr Pollen_Sauerland webCmd update
Sauerland:
defmod Sauerland dummy
attr Sauerland group Vxxx
attr Sauerland room Automatiken
attr Sauerland setList on off
Zitat von: ErzGabriel am 27 März 2021, 15:52:30
In die 99myUtils.pm, die auch mit der üblichen Zeile
1;
endet.
Die Sub steht vor der Endzeile.
Ich hab jetzt Angst es geht bis Ostern :o
Wenn Du den Befehl zum Aufruf der Sub {pollen_sauerland()} in die Kommandozeile wirfst und Du bekommst zurück das es ein unbekannter Befehl ist - dann
Gibt es die Sub nicht in Deiner 99_myUtils.pm -oder
Du hast die 99_myUtils.pm anders als über den eingebauten Editor editiert und kein reload ausgeführt.
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.
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?
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
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.