FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Manul am 30 April 2017, 14:49:15

Titel: [Gelöst] Raumzugehörigkeit in notify manipulieren?
Beitrag von: Manul am 30 April 2017, 14:49:15
Wie kann ich in einem notify die Raumzugehörigkeit manipulieren, also devices aus einem Raum herausnehmen oder hineintun? attr setzt, wenn ich das richtig verstanden habe, ja immer den vollen Wert, würde also die alten Zugehörigkeiten komplett überschreiben.
Titel: Antw:Raumzugehörigkeit in notify manipulieren?
Beitrag von: DeeSPe am 30 April 2017, 14:53:38
https://forum.fhem.de/index.php/topic,60018.msg513782.html#msg513782

Gruß
Dan
Titel: Antw:Raumzugehörigkeit in notify manipulieren?
Beitrag von: Manul am 30 April 2017, 15:01:44
Cool, danke!
Titel: Antw:Raumzugehörigkeit in notify manipulieren?
Beitrag von: Manul am 30 April 2017, 15:34:35
Sorry, vergesst meine Frage, habe den copy&paste-Fehler beim ca_roomadd selbst gefunden...  :-[

Okay, Entfernen klappt, Hinzufügen nicht. Sieht zufällig wer auf Anhieb meinen Fehler?

notify:
defmod heizungAnAus notify Heizkessel:.*| { if ($EVENT eq "off") { fhem("set model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 controlMode manual");; fhem("set model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 desired-temp off");; fhem("roomremove .*_wt.*_Climate Übersicht")} elsif ($EVENT eq "on") { fhem("set model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 controlMode auto");; fhem("roomadd .*_wt.*_Climate Übersicht")} }


Auf auto schalten bei "on" funktioniert, zum Raum "Übersicht" hinzufügen nicht. (BTW, darf ich innerhalb eines Perl-Blocks im notify eigentlich Zeilenumbrüche und Einrückungen einbauen? Das würde das ganze etwas lesbarer machen.)

roomadd:
defmod ca_roomadd cmdalias roomadd .* AS {roomsAdd($EVTPART0,$EVTPART1)} define ca_roomremove cmdalias roomremove .* AS {roomsRemove($EVTPART0,$EVTPART1)}

setstate ca_roomadd defined


roomremove:
defmod ca_roomremove cmdalias roomremove .* AS {roomsRemove($EVTPART0,$EVTPART1)}

setstate ca_roomremove defined


myUtils
sub roomsAdd($$)
{
  my ($devspec,$arooms) = @_;
  my $rooms = $arooms =~ /\!$/ ? (split("!",$arooms))[0] : $arooms;
  foreach my $dev (devspec2array("$devspec"))
  {
    my @oldrooms = split(",",AttrVal($dev,"room",""));
    my $nrooms = $rooms;
    if ($arooms !~ /\!$/)
    {
      foreach my $room (split(",",$rooms))
      {
        push @oldrooms,$room if (!grep(/^$room$/,@oldrooms));
      }
      $nrooms = join(",",sort @oldrooms);
    }
    fhem "attr $dev room $nrooms";
  }
}

sub roomsRemove($$)
{
  my ($devspec,$rrooms) = @_;
  foreach my $dev (devspec2array("$devspec"))
  {
    my @newrooms;
    foreach my $room (split(",",AttrVal($dev,"room","")))
    {
      push @newrooms,$room if (!grep(/^$room$/,split(",",$rrooms)));
    }
    my $nrooms = join(",",sort @newrooms);
    scalar @newrooms ? fhem "attr $dev room $nrooms" : fhem "deleteattr $dev room";
  }
}