Auf WINDOW_SWITCH_RECEIVER schreiben

#1

Hallo,

ist es irgendwie möglich auf den WINDOW_SWITCH_RECEIVER zu schreiben bzw. einen Fensterkontakt zu simulieren? Ich kann aus der Einbruchmeldeanlage den Status der Fenster auslesen und würde den gerne direkt auf die Thermostate schreiben, kann man irgendwie einen Fensterkontakt simulieren?

Liebe Grüße

Flole

#2

Hey @Flole,

leider nein. Das ginge nur wenn du ein virtuelles Gerät erzeugst, was du dann mit WINDOW_SWITCH_RECEIVER über eine Direktverknüpfung verbindest.

Ich mache es bei mir über setzen der gewollten Werte, wenn das Fenster geöffnet wird. Eben z.B. SET_TEMPERATURE auf 4.5 oder so.

Gruß,
Patrik

#3

@pmayer Und wie erzeugt man ein virtuelles Gerät mit Homegear? :wink:

Die Lösung mit SET_TEMPERATURE zeigt ja leider nicht auf dem Thermostat das kleine offene Fenster an, das wäre schon wichtig hier.

#4

Das hab ich leider noch nie gemacht… du kannst mal hier im Forum suchen, da wurde das glaube schon mehrfach diskutiert.

#5

Ach das geht? Jetzt hab ich auchs gefunden! Und ein VirtualWindowContact ist praktischerweise schon mitgeliefert. Der Rest kann jetzt ja nicht so kompliziert sein…

1 Like
#6

Schreibs auch gerne hier rein, damit es der nächste findet, der was sucht in der Richtung.

#7

Hab ich vor. Erste Erkenntnis: Der VirtualWindowContact ist nicht dafür geeignet :wink:

#8

Was geht denn genau nicht mit dem VirtualWindowContact?
Ich habe zwar noch nie eine Direktverknüpfung gemacht aber Virtuelle Geräte habe ich schon angelegt. Vielleicht kann ich da helfen.

#9

Der lässt sich einfach nicht direkt mit einem Max Thermostat verbinden. Ich habe jetzt den Max Window Contact kopiert, angelegt und versuche eine Verknüpfung anzulegen, allerdings ist das auch schon nicht so einfach wie man denkt. Homematic Manager kriegt das nicht hin, die Verknüpfung wird dann einfach nicht angezeigt, ich versuche das jetzt mal “per Hand”.

EDIT: Bei einem Addlink gibt es einen “Method not implemented for this central.”. Und nun?

#10

Ahso, ich glaube das funktioniert bist jetzt nur mit Homematic. Da mag @sathya mich aber korrigieren…

#11

Nur als Idee:
In den XMLs der Geräte sind manche Variablen als <writeable>false</writeable>
deklariert.

Was passiert wenn du das testweise mal auf true setzt?
Ansonsten weiß ich da auch nicht weiter.

#12

Das habe ich schon getan. Die Meldung kommt aus der Datei https://github.com/Homegear/libhomegear-base/blob/master/src/Systems/ICentral.h und demnach wird das ganze wirklich einfach (noch) nicht implementiert sein, das wurde hier auch früher schonmal so kommuniziert…

#13

Auf dem MAX-Stellantrieb direkt kann der Fensterzustand aktuell leider nicht geschrieben werden. Das Ganze lässt sich also nur über Logik, z. B. in Node-BLUE und über das Setzen von SET_TEMPERATURE realisieren.

#14

Man müsste hier wohl, so wie FHEM das auch macht, einfach einen virtuellen Fensterkontakt einbauen der die Funktelegramme eines echten Fensterkontaktes nachahmt und an die MAX-Thermostate sendet. Vielleicht kann sich das ja mal jemand anschauen, insbesondere wo man das am besten einbaut (ob das einfach mit in die MAX Family kommt oder doch als Virtuelles Device was aber ja wohl keinen Zugriff auf die CC1101 Module hat)

#15

In FHEM sieht das ganze ziemlich einfach aus: Zum setzen wird nur dieser Code benötigt:

 if($setting eq "fakeSC") {
      return "Invalid number of arguments" if(@args != 2);
      return "Invalid fakeSCaddr attribute set (must not be 000000)" if(CUL_MAX_fakeSCaddr($hash) eq "000000");

      my $state = $args[1] ? "12" : "10";
      my $groupid = ReadingsVal($destname,"groupid",0);
      return CUL_MAX_Send($hash, "ShutterContactState",$dest,$state,
                          groupId => sprintf("%02x",$groupid),
                          flags => ( $groupid ? "04" : "06" ),
                          src => CUL_MAX_fakeSCaddr($hash));

    } elsif($setting eq "fakeWT") {
      return "Invalid number of arguments" if(@args != 3);
      return "desiredTemperature is invalid" if(!validTemperature($args[1]));
      return "Invalid fakeWTaddr attribute set (must not be 000000)" if(CUL_MAX_fakeWTaddr($hash) eq "000000");

      #Valid range for measured temperature is 0 - 51.1 degree
      $args[2] = 0 if($args[2] < 0); #Clamp temperature to minimum of 0 degree

      #Encode into binary form
      my $arg2 = int(10*$args[2]);
      #First bit is 9th bit of temperature, rest is desiredTemperature
      my $arg1 = (($arg2&0x100)>>1) | (int(2*MAX_ParseTemperature($args[1]))&0x7F);
      $arg2 &= 0xFF; #only take the lower 8 bits
      my $groupid = ReadingsVal($destname,"groupid",0);

      return CUL_MAX_Send($hash,"WallThermostatControl",$dest,
        sprintf("%02x%02x",$arg1,$arg2), groupId => sprintf("%02x",$groupid),
                flags => ( $groupid ? "04" : "00" ),
                src => CUL_MAX_fakeWTaddr($hash));
    }

sowie der Code zum linken/unlinken:

  } elsif(grep /^\Q$setting\E$/, ("associate", "deassociate")) {
    my $dest = $args[0];
    my $destType;
    if($dest eq "fakeWallThermostat") {
      return "IODev is not CUL_MAX" if($hash->{IODev}->{TYPE} ne "CUL_MAX");
      $dest = AttrVal($hash->{IODev}->{NAME}, "fakeWTaddr", "111111");
      return "Invalid fakeWTaddr attribute set (must not be 000000)" if($dest eq "000000");
      $destType = MAX_TypeToTypeId("WallMountedThermostat");

    } elsif($dest eq "fakeShutterContact") {
      return "IODev is not CUL_MAX" if($hash->{IODev}->{TYPE} ne "CUL_MAX");
      $dest = AttrVal($hash->{IODev}->{NAME}, "fakeSCaddr", "222222");
      return "Invalid fakeSCaddr attribute set (must not be 000000)" if($dest eq "000000");
      $destType = MAX_TypeToTypeId("ShutterContact");

    } else {
      if(exists($defs{$dest})) {
        return "Destination is not a MAX device" if($defs{$dest}{TYPE} ne "MAX");
        $dest = $defs{$dest}{addr};
      } else {
        return "No MAX device with address $dest" if(!exists($modules{MAX}{defptr}{$dest}));
      }
      $destType = MAX_TypeToTypeId($modules{MAX}{defptr}{$dest}{type});
    }

    Log3 $hash, 5, "Using dest $dest, destType $destType";
    if($setting eq "associate") {
      return ($hash->{IODev}{Send})->($hash->{IODev},"AddLinkPartner",$hash->{addr},sprintf("%s%02x", $dest, $destType));
    } else {
      return ($hash->{IODev}{Send})->($hash->{IODev},"RemoveLinkPartner",$hash->{addr},sprintf("%s%02x", $dest, $destType));
    }

Ich finde das sieht doch ziemlich machbar aus, die schwierigste Frage ist wohl nur wo man das am besten einbaut.