Liebe Forenuser,
die guten Vorsätze fürs neue Jahr gepackt, will ich ein paar meiner DOIFs aufräumen bzw. etwas schlauer machen.
Gröstes Hindernis ist, dass ich zwar Python ganz passabel bin, aber ein wahre Perl Niete :-[
Mein Ziel ist ein cleveres DOIF, was mit den Status eines Dummies auf den Aktor setzt. Das ganze dann polymorph, soll heißen via Regex auf verschiedene Dummies triggern und ein set auf den zugehörigen Aktor ausgeben.
Den Trigger und Regex habe ich mit viel Versuch und Irrtum hingebracht, nun treibt mich das DOIF in Kombination mit meinem Halbwissen in den Wahnsinn.
Ich will ein UserReading mit set_Reading schreiben, welches ich aus dem triggerenden DEVICE gewinne. Mit ganz viel Mühe komme ich mit "vermuitlich" allen Werten an und nun klatscht mir der Error mit &main ins Gesicht. 98_DOIF ist natürlich geladen und der Befehl "drinnen". Ich habe leiderabsolut keine Ahnung ob das
a) Clever oder idiotisch ist, was ich da tue
b) Wo ich noch graben könnte - Im List als Comment findet ein Teil meines Versuch und Irrtums ins DOIF Perl oder fhem ;)
c) wie die Lösung aussieht
Die Rollladen sind nur ein Punkt des Smarthomes. Ich habe realtiv viele Dummies von der Fensterüberwachung, Beleuchtung etc. die dann Hersteller übergreifend agieren.
Ich bin für jeden Tipp dankbar und die Frau des Hauses noch mehr :D
Grüße und einen guten Start ins neue Jahr
Jorche
Internals:
DEF (["^d_Rollladen_\D*(1.OG \d*|\d*)",-1])
{my $RollAktor = "$DEVICE";
$RollAktor =~ s/^d_//;
set_Reading("RollAktor",$RollAktor,0);
}
DOELSE ()
##Variable nur in gleicher klammer gültig!
DOIFDEV ^global$|^d_Rollladen_\D*(1.OG \d*|\d*)
FUUID 65909b93-f33f-4f96-ac26-d4d7ba4ff435a736
MODEL FHEM
NAME di_RollladenSync
NR 1042
NTFY_ORDER 50-di_RollladenSync
STATE cmd_1
TYPE DOIF
VERSION 24330 2021-04-24 21:09:16
READINGS:
2024-01-03 18:09:54 Device d_Rollladen_Wohnzimmer
2024-01-03 01:54:26 RollAktor $RollAktor
2024-01-03 18:09:54 cmd 1
2024-01-03 18:09:54 cmd_event d_Rollladen_Wohnzimmer
2024-01-03 18:09:54 cmd_nr 1
2024-01-03 18:09:54 error {my $RollAktor = "d_Rollladen_Wohnzimmer"; $RollAktor =~ s/^d_//; set_Reading("RollAktor",$RollAktor,0); }: Undefined subroutine &main::set_Reading called at (eval 51220) line 1.
2024-01-03 11:32:17 mode enabled
2024-01-03 18:09:54 state cmd_1
Regex:
accu:
collect:
cond:
:
0:
"^d_Rollladen_\D*(1.OG \d*|\d*)" ^d_Rollladen_\D*(1.OG \d*|\d*)
attr:
cmdState:
wait:
waitdel:
condition:
0 ::EventDoIf('^d_Rollladen_\D*(1.OG \d*|\d*)',$hash,'',0,'[^\:]*: (.*)','','-1')
do:
0:
0 {my $RollAktor = "$DEVICE"; $RollAktor =~ s/^d_//; set_Reading("RollAktor",$RollAktor,0); }
1:
0
helper:
DEVFILTER ^global$|^d_Rollladen_\D*(1.OG \d*|\d*)
NOTIFYDEV global|d_Rollladen_\D*(1.OG \d*|\d*).*
event 0
globalinit 1
last_timer 0
sleeptimer -1
timerdev d_Rollladen_Wohnzimmer
timerevent 0
triggerDev d_Rollladen_Wohnzimmer
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: d_Rollladen_Wohnzimmer
error: {my $RollAktor = "d_Rollladen_Wohnzimmer"; $RollAktor =~ s/^d_//; set_Reading("RollAktor",$RollAktor,0); }: Undefined subroutine &main::set_Reading called at (eval 51220) line 1.
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: d_Rollladen_Wohnzimmer
error: {my $RollAktor = "d_Rollladen_Wohnzimmer"; $RollAktor =~ s/^d_//; set_Reading("RollAktor",$RollAktor,0); }: Undefined subroutine &main::set_Reading called at (eval 51220) line 1.
state: cmd_1
timerevents:
0
timereventsState:
state: 0
triggerEvents:
0
triggerEventsState:
state: 0
internals:
readings:
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
comment userReadings
RollAktor {my $RollAktor = "init"}
##(["^d_Rollladen_":$DEVICE:&STATE,-1])
##ok
##(["^d_Rollladen_",-1])
##,
##return $RollAktor;
##halkob##set_Reading("RollAktor",$RollAktor,0);
##fhem(setReading di_RollladenSync RollAktor BAUM);
##fhem"setreading di_RollladenSync RollAktor $RollAktor";
##set_Reading("RollAktor",$RollAktor,0);
##^d_Rollladen_\D*(1.OG \d*|\d*)
##({my $RollAktor = "$DEVICE"})
##(setreading di_RollladenSync RollAktor {["$SELF","$DEVICE",0]})
##
##
##(setreading di_RollladenSync RollAktor {["$DEVICE"]})
##(setreading di_RollladenSync RollAktor ["&SELF":"&STATE",0])
##(setreading di_RollladenSync RollAktor ["$SELF:$DEVICE",0])
##ok
##(setreading di_RollladenSync RollAktor "$SELF:$DEVICE")
##ok##
##(setreading di_RollladenSync RollAktor $DEVICE,
##setreading di_RollladenSync RollAktor $RollAktor,
##setReading di_RollladenSync RollAktor $RollAktor,
##
##(["^d_Rollladen_":$DEVICE:&STATE,-1])
##set $RollAktor 2)
##set sensor 2)
##
do always
room Rollläden - alle
Meine erste Vermutung: falsche Klammersetzung.
Mit den geschweiften Klammern bewegst Du Dich wahrscheinlich in "richtigem" perl und nicht mehr auf der DOIF-Ebene selbst. Und auf der reinen perl Ebene gibt es die Funktion set_Reading() nicht, weil diese nur im Package DOIF:: existiert.
Vielleicht kannst Du Deinen Thread in das Unterforum zu DOIF verschieben (Button unten links), damit Dir dort jemand weiterhilft, der DOIF besser kennt. Mir kommt DOIF nicht ins Haus 8)
Du hast dein DOIF-Device im FHEM-Modus definiert, dort gibt es die Funktion set_Reading nicht. set_Reading ist eine Funktion aus dem DOIF-Package, die kannst du nur im DOIF-Perl-Modus verwenden.
z.B.
DOIF {["^d_Rollladen_\D*(1.OG \d*|\d*)",-1];
my $RollAktor = $device;
$RollAktor =~ s/^d_//;
set_Reading("RollAktor",$RollAktor,0);
}
Hallo Damian und betateilchen,
mit den Klammern habe ich gespielt wie der Teufel. Die große Klammer ist mir nicht in den Sinn gekommen. Danke für den Top Hinweis/Lösung. Tut nun.
Jetzt habe ich gleich neue Hausaufgabe mit DOIF im Perl Modus :D Nach 7 Jahren FHEM lernt man immer noch dazu. Sonst wäre es ja langweilig ;)
Grüße
Jorche