FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Tobias am 06 Mai 2013, 16:45:50

Titel: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: Tobias am 06 Mai 2013, 16:45:50
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.
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: broadway am 06 Mai 2013, 19:16:46
Du schreibst oben "Anschalten" und unten "Einschalten".
Könnte das das Problem sein?
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: Tobias am 07 Mai 2013, 07:53:50
sorry, ist ein copy&paste Fehler. Aber die Fehlermeldung bleibt trotzdem identisch.
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: Tobias am 16 Mai 2013, 07:02:27
eigentlich kann nur Rudi etwas dazu sagen, kann ihm aber keine PM senden...
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: rudolfkoenig 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.
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: Tobias 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";
}
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: rudolfkoenig 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.
Titel: Aw: wie funktioniert die interne Funktion "ReplaceEventMap"?
Beitrag von: Tobias am 17 Mai 2013, 08:12:58
Danke!!! Das wars.

nebenbei wusste ich garnicht das %NAME und %EVENT deprecated sind ;)