Autor Thema: wie funktioniert die interne Funktion "ReplaceEventMap"?  (Gelesen 2642 mal)

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3682
Hi,
Meine Bewässerrungssteuerung ist per 8fach Switch realisiert. Nun möchte ich aber für jeden der 8 Ports ein egenes Device definieren. Also habe ich Dummy´s angelegt.
define Bewaesserung_port1 dummy
attr Bewaesserung_port1 webCmd Anschalten:Ausschalten
attr Bewaesserung_port1 eventMap /on-for-timer 30:Anschalten/off:Ausschalten/

Jetzt habe ich ein Notify definiert welches triggergestützt das eigentliche Device schaltet:
define Macro NOTIFY Bewaesserung.* {
my $device="%NAME";
Log 1, "Log Bewässerungsnotify: %NAME : %EVENT";
}

Dummerweise wird aber als Event nicht "on-for-timer 30" sondern "Einschalten" übergeben. Also muss ich manuell die EventMap Funktion aufrufen. Wen ich das mache bekomme ich aber einen Fehler. Ideen warum?? Aus dem Code in fhem.pl werd ich nicht ganz schlau...

ReplaceEventMap("Bewaesserung_port1", "Einschalten", 0);
Can't use string ("Einschalten") as an ARRAY ref while "strict refs" in use at fhem.pl line 2760.
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, TrashCal, MediaList
Meine Projekte auf https://github.com/tobiasfaust

Offline broadway

  • Full Member
  • ***
  • Beiträge: 218
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #1 am: 06 Mai 2013, 19:16:46 »
Du schreibst oben "Anschalten" und unten "Einschalten".
Könnte das das Problem sein?
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3682
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #2 am: 07 Mai 2013, 07:53:50 »
sorry, ist ein copy&paste Fehler. Aber die Fehlermeldung bleibt trotzdem identisch.
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, TrashCal, MediaList
Meine Projekte auf https://github.com/tobiasfaust

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3682
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #3 am: 16 Mai 2013, 07:02:27 »
eigentlich kann nur Rudi etwas dazu sagen, kann ihm aber keine PM senden...
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, TrashCal, MediaList
Meine Projekte auf https://github.com/tobiasfaust

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20771
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #4 am: 16 Mai 2013, 13:39:29 »
Die ReplaceEventMap Parameter sind je nach Richtung unterschiedlich:

- Hin: ReplaceEventMap($devName, $wert, 1) liefert z.Bsp. "An" zurueck falls $wert="on" ist. Wird verwendet, falls um aus dem Event den trigger fuer die notify zu bauen ( *grins* :)
- Zurueck: ReplaceEventMap($devName, $arrayp, 0) ersetzt in dem von $arrayp referenzierten Array ab den zweiten Index "An" durch on, und liefert diesen neuen Array (nicht pointer!) zurueck. Wird verwendet, um aus "set Lampe An" die Modulvertraegliche "set Lampe on" zu machen.

Ist nicht schoen, war aber nicht fuer Modulautoren oder Enduser gedacht. Begruendung: wenn man etwas umbenannt hat, dann sollte man auch nur mit diesem neuen Wert zu tun haben.

Aufruf fuer Dich:
my @a = (undef, "Einschalten");
@a = ReplaceEventMap("Bewaesserung_port1", \@a, 0);
$status = @a[1];

P.S.: Anfaengerfragen laese ich selten, die Frage ist eher was fuer die Developer oder Automatisiergs Gruppe, und weniger fuer Anfaenger, die werden damit nur verwirrt.

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3682
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #5 am: 16 Mai 2013, 14:25:32 »
Hallo Rudi,
das Umbenennen ist ja nur damit es im WebIf "schöner" aussieht für den "Klick"

Dein Statement funktioniert, nur beinhaltet die Variable $status bei einem "on-for-timer 30" nur "on-for-timer". Hast du da noch eine kurze Idee?
Bewaesserung.* {
my $device="%NAME";
my @@a = (undef, "%EVENT");
@@a = ReplaceEventMap("%NAME", \@@a, 0);
my $status = @@a[1];

Log 1, "Log Bewässerungsnotify: %NAME : %EVENT : $status";
}
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, TrashCal, MediaList
Meine Projekte auf https://github.com/tobiasfaust

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20771
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #6 am: 16 Mai 2013, 18:48:23 »
shift @a;
$status = join(" ", @a);

Btw. wenn man $NAME/$EVENT statt %NAME/%EVENT verwendet, dann kann man die doofen @@/%% weglassen.

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3682
Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
« Antwort #7 am: 17 Mai 2013, 08:12:58 »
Danke!!! Das wars.

nebenbei wusste ich garnicht das %NAME und %EVENT deprecated sind ;)
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, TrashCal, MediaList
Meine Projekte auf https://github.com/tobiasfaust

 

decade-submarginal