set_Reading im DOIF wird nicht gefunden: Undefined sub &main::set_Reading called

Begonnen von Jorche, 03 Januar 2024, 20:17:39

Vorheriges Thema - Nächstes Thema

Jorche

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

betateilchen

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)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

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);
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Jorche

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