[Gelöst] Raumzugehörigkeit in notify manipulieren?

Begonnen von Manul, 30 April 2017, 14:49:15

Vorheriges Thema - Nächstes Thema

Manul

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.

DeeSPe

MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Manul


Manul

#3
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";
  }
}