FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Tobias am 11 Juli 2016, 08:07:22

Titel: [Workarround] userreadings und $EVENT funktioniert nicht?
Beitrag von: Tobias am 11 Juli 2016, 08:07:22
Hi,
ich habe ein userreading:set SWAP_0C userReadings Dummy:0D.0-Gruppe_.* {SWAP_WindowStateSensor("$NAME", "$EVENT")}
dieses soll auf folgende Events reagieren:2016-07-11 08:03:52 SWAP SWAP_0C 0D.0-Gruppe_1: 02
2016-07-11 08:03:52 SWAP SWAP_0C 0D.1-Gruppe_2: 01
2016-07-11 08:03:52 SWAP SWAP_0C 0D.2-Gruppe_3: 00
2016-07-11 08:03:52 SWAP SWAP_0C 0D.3-Gruppe_4: 00
2016-07-11 08:03:52 SWAP SWAP_0C 0D.4-Gruppe_5: 00
2016-07-11 08:03:52 SWAP SWAP_0C 0D.5-Gruppe_6: 00
2016-07-11 08:03:52 SWAP SWAP_0C 0D.6-Gruppe_7: 00


Problem ist nun, das ich es nicht hinbekomme, das Event meiner Funktion zu übergeben, weder $EVTPART0, noch $EVTPART1 noch $EVENT selbst.
Ich bekomme folgende Fehlermeldung:2016-07-11 08:03:52 SWAP SWAP_0C Dummy: Error evaluating SWAP_0C userReading Dummy: Global symbol "$EVENT" requires explicit package name at (eval 508414) line 1.

Kann mal bitte jemand das Brett vor meinem Kopf entfernen?
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: rudolfkoenig am 11 Juli 2016, 08:50:20
Ich dachte userreadings setzt man mit setreading.
Und {} wird in einem set nicht ausgewertet, es sei denn, man verwenden {(...)} (siehe auch http://fhem.de/commandref.html#set)
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: Tobias am 11 Juli 2016, 08:54:57
Hi Rudi,
userReadings gehört IMHO ja in die readingFNattributes.
Auch wenn ich den Prozeduraufruf in Klammer setze kommt derselbe Fehler :(
$NAME oder $name wird erkannt, aber $EVENT nicht :(
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: dev0 am 11 Juli 2016, 09:10:30
Zitat von: Tobias am 11 Juli 2016, 08:07:22
Problem ist nun, das ich es nicht hinbekomme, das Event meiner Funktion zu übergeben, weder $EVTPART0, noch $EVTPART1 noch $EVENT selbst.
Es ist auch nirgends dokumentiert, dass ein userReading mit $EVENT... funktioniert. Dein gesuchtes Event ist beispielsweise ein Reading. Hier wird "onState" auf 0 oder 1 gesetzt, wenn actuator...

attr ST_RTR userReadings onState:actuator:.* {(ReadingsVal($name,"actuator","0")>0?1:0)}
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: Tobias am 11 Juli 2016, 09:30:17
@Rudi: Wäre es denn ein Problem auch $EVENT und $EVTPARTx für userReadings verfügbar zu machen?
Bei meiner Anforderung müsste ich jetzt 7 mal dasselbe Userreading schreiben. Stattdessen wollte ich es nur einmal machen, die aufgerufene Prozedur ermittelt selbst aber zu welchem Reading der Call gehört

Die Prozedur soll folgende sein:

sub
SWAP_WindowStateSensor($$$) {
  my ($device, $reading, $value) = @_;
  my $state;

  $state = "closed" if ($value == "00");
  $state = "tilted" if ($value == "01");
  $state = "open" if ($value == "02");
 
  readingsSingleUpdate($defs{$device}, $reading . "_state", $state, 1);

  return undef;
}


EDIT:
ich habe es jetzt so gelöst:Gruppe1:0D.0-Gruppe_1.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.0-Gruppe_1", ""))},
Gruppe2:0D.1-Gruppe_2.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.1-Gruppe_2", ""))},
Gruppe3:0D.2-Gruppe_3.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.2-Gruppe_3", ""))},
Gruppe4:0D.3-Gruppe_4.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.3-Gruppe_4", ""))},
Gruppe5:0D.4-Gruppe_5.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.4-Gruppe_5", ""))},
Gruppe6:0D.5-Gruppe_6.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.5-Gruppe_6", ""))},
Gruppe7:0D.6-Gruppe_7.* {SWAP_WindowStateSensor(ReadingsVal($name, "0D.6-Gruppe_7", ""))}
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: dev0 am 11 Juli 2016, 10:11:26
Ich bin nicht Rudi ;) und vielleicht völlig auf dem Holzweg, weil ich nicht verstehe was machen möchtest, aber wäre ein notify der passende Weg? Da hast Du $EVENT und kannst mit readingsSingleUpdate...
Und wenn ich auf dem Holzweg bin, dann ignoriere mich einfach ;)
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: Tobias am 11 Juli 2016, 10:31:49
ok, ein notify wäre auch möglich....

Mit Rudi meinte ich RudolfKönig mit der Frage of das $Event auch in ein Userreading einfließen könnte ;)
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: rudolfkoenig am 11 Juli 2016, 11:30:02
Zitat@Rudi: Wäre es denn ein Problem auch $EVENT und $EVTPARTx für userReadings verfügbar zu machen?
Ja. Devices generieren potentiell mehrere Events auf einmal, userReading wird in so einem Fall aber nur einmal ausgewertet. Ich wuesste nicht, auf welchem Event aus dem Buendel $EVENT gesetzt werden soll.

ZitatBei meiner Anforderung müsste ich jetzt 7 mal dasselbe Userreading schreiben.
Ich wuerde das Reading in der Perl-Funktion setzen, und sie per notify aufrufen.
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: Tobias am 11 Juli 2016, 11:59:20
Danke, so mache ich es... passt auch mit dem Vorschlag von dev0
Titel: Antw:userreadings und $EVENT funktioniert nicht?
Beitrag von: Tobias am 11 Juli 2016, 13:22:07
Gelöst:

##############################################
# Übersetzt den Status der
# SWAP Fensterkontakte in Klarnamen
#
##############################################

sub
SWAP_WindowStateSensor($$$) {
  my ($device, $reading, $value) = @_;
  my $state = "??";
  my $group = 0;

  $group = $reading; 
  $group =~ s/.*-Gruppe_(\d)*.*/$1/;

  $state = "closed" if ($value eq "00");
  $state = "tilted" if ($value eq "01");
  $state = "open" if ($value eq "02");

  readingsSingleUpdate($defs{$device}, "Gruppe".$group, $state, 1);

  return undef;
}

define NTFY_SWAP_Fensterstatus notify SWAP_.*:0D.*-Gruppe.* {SWAP_WindowStateSensor($NAME, $EVTPART0, $EVTPART1)}