Lampe an/aus wenn alle Fenster auf/zu

Begonnen von Hausmeisteramateur, 05 März 2013, 00:22:12

Vorheriges Thema - Nächstes Thema

Hausmeisteramateur

Ich hexe jetzt seit 4 Wochen mit FHEM rum, bin total begeistert. Doch eine für Euch simple Aufgabenstellung will mir nicht gelingen.
Vorgabe: Eine Lampe (FS20) soll AN sein, wenn auch nur eins von 8 mit FHT80TF-2 überwachten Fenstern geöffnet ist (Open).
ALLE Fenster ZU = Lampe aus.
An sich total simpel, die im Forum zu lesenden Artikel lösen weitaus komplexere Sachen. (Mail bei offenem Fenster etc.)
Habe bereits versucht die eMail-Lösungen umzustricken, allerdings erfolglos.
Hat jemand einen Anstoss um meinen "Hirnknoten" zu lösen ?
(Als alter Clipper Programmierer ist mir Perl allerdings ein Graus...)

Billy

Vielleicht hilft dir das?


http://www.fischer-net.de/hausautomation/fhem/56-fhem-status-mehrerer-geraete-aggregieren.html
Zitat:
Vielleicht steht der Eine oder die Andere vor dem Problem, mehrere Geräte in FHEM in einem Status zusammen fassen zu wollen. Dieser Artikel beschreibt einen möglichen Weg.

Gruss Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

ArminK

Hi aus Heidelberg,
ich lasse mir den Status von 3 Dachfenstern mittels einer LED (angeschlossen an FS20 SM4 4-Kanal-Schaltmodul, untergebracht im Siedle Türtelefon) anzeigen. Fenster zu = LED aus, mindestens ein Fenster auf = LED an. Gelöst habe ich das ganze folgendermaßen: Es gibt 3 Dachfenster an denen je ein Fensterkontakt FHTTK angebracht sind, sz_dachfenster_ost, sz_dachfenster_west_1 und sz_dachfenster_west_2. Definition beispielhaft an einem Fenster (Dieser Code ist ein mal PRO Fenster vorhanden):
define sz_dachfenster_ost CUL_FHTTK 1dc0d6
attr sz_dachfenster_ost alias Dachfenster Ost
attr sz_dachfenster_ost eventMap Open:offen Closed:zu
attr sz_dachfenster_ost group Fenster
attr sz_dachfenster_ost icon icoFenster.png
attr sz_dachfenster_ost room Schlafzimmer

#dazu die Logdefinition...
define FileLog_sz_dachfenster_ost FileLog /var/log/fhem/sz_dachfenster_ost-%Y.log sz_dachfenster_ost
attr FileLog_sz_dachfenster_ost group Schlafzimmer
attr FileLog_sz_dachfenster_ost logtype fht80tf:Window,text
attr FileLog_sz_dachfenster_ost room Logs
#samt weblinks...
define weblink_sz_dachfenster_ost weblink fileplot FileLog_sz_dachfenster_ost:sz_df_o:CURRENT
attr weblink_sz_dachfenster_ost alias Dachfenster Ost
attr weblink_sz_dachfenster_ost group Schlafzimmer
attr weblink_sz_dachfenster_ost label "Schlafzimmer Dachfenster Ost Min $data{min1}, Max $data{max1}, Last data{currval1}"
attr weblink_sz_dachfenster_ost room Plots
attr weblink_sz_dachfenster_ost title "Dachfenster Ost"


Für jedes Fenster habe ich mir einen Statusdummy definiert (dieser code ist ein mal PRO Fenster vorhanden):
define sz_dachfenster_ost_stat dummy
attr sz_dachfenster_ost_stat alias Status Dachfenster Ost
attr sz_dachfenster_ost_stat loglevel 6
attr sz_dachfenster_ost_stat room Z_Variablen


Dieser wird durch folgendes Notify aktualisiert (dieser Code ist ein mal PRO Fenster vorhanden):
define act_sz_dachfenster_ost notify sz_dachfenster_ost {\
 if ("%" eq "Window: zu") {\
   fhem("set sz_dachfenster_ost_stat off")\
   }\
   else {\
   fhem("set sz_dachfenster_ost_stat on")\
 }\
}

Dieser Status ist also "off" wenn das entsprechende Fenster geschlossen ist und "on" wenn es geöffnet ist.
Um nun mehrere Statis zusammenzufassen habe ich mir einen "Summenstatus-Dummy" gemeinsam für alle drei Dachfenster angelegt (dieser Code ist nur EINMAL vorhanden):
define xx_dachfenster dummy
attr xx_dachfenster alias Summenstatus für Dachfenster
attr xx_dachfenster loglevel 6
attr xx_dachfenster room Z_Variablen


Für jedes Fenster, bzw. dessen Status gibt es jetzt noch ein Notify, das den Summenstatus entsprechend einstellt (dieser Code ist ein mal PRO Fenster vorhanden):
define act_sz_dachfenster_ost_stat notify sz_dachfenster_ost_stat {\
 if ("%" eq "on") {\
    if ($value{xx_dachfenster} eq "off") {\
               fhem("set xx_dachfenster on")\
        }\
   }\
   else {\
    if ($value{sz_dachfenster_ost_stat} eq "off" &&\
        $value{sz_dachfenster_west_1_stat} eq "off" &&\
        $value{sz_dachfenster_west_2_stat} eq "off") {\
            if ($value{xx_dachfenster} eq "on") {\
               fhem("set xx_dachfenster off")\
             }\
        }\
   }\
}

Jetzt sind wir soweit, dass der Dummy xx_dachfenster den Wert "off" hat wenn ALLE Fenster geschlossen sind und den Wert "on" wenn mindestens ein Fenster geöffnet ist. Was wir jetzt noch brauchen ist das eigentliche Anzeigedevice, welches so definiert ist (dieser Code ist EIN MAL vorhanden):
#Statusanzeige Wohnzimmer 3 (Siedle Türtelefon)
define sa_wz_3 FS20 ab1f 0b
attr sa_wz_3 alias Status Dachfenster
attr sa_wz_3 group Statusanzeige Türtelefon
attr sa_wz_3 room Statusmeldungen

Um die an LED jetzt abhängig vom Summenstatus zu schalten ist noch folgendes Notify nötig (dieser Code ist nur EIN MAL vorhanden):
define act_xx_dachfenster notify xx_dachfenster {\
 if ("%" eq "on") {\
    if ($value{sa_wz_3} eq "off") {\
               fhem("set sa_wz_3 on")\
        }\
   }\
   else {\
    if ($value{sa_wz_3} eq "on") {\
               fhem("set sa_wz_3 off")\
        }\
 }\
}

Diese Lösung ist wahrscheinlich viiieeeel zu kompliziert, aber sie funktioniert! Anmerken möchte ich, dass die Statusanzeige etwas träge ist, da die Meldungen von den Fensterkontakten systembedingt zyklisch übertragen werden (Intervall=?) und nicht getriggert durch das Öffnen des Fensters.

Hoffe das hilft, sollte es noch Fragen geben bitte melden!
Raspberry Pi 3B mit fhem 5.8;1xCUL USB, 2xCUNO, 1xCUL Raspi über Fhem2Fhem, 2xHMLAN; diverse Homematic und FS20-Komponenten; 7 x Sonos-Player; diverse Eigenbauten mittels FS20 WUE, ESPEasy, MQTT, MySensors

justme1968

ich habe an meinen fenstern den homematik fenstergriff aktor. der liefert drei zusände: open, tilted oder closed. das grupieren mehrerer fenster geht wunderbar mit einer structure:define FensterEsszimmer structure Fenster TerrasseLinks TerrasseRechts
attr FensterEsszimmer clientstate_behavior relative
attr FensterEsszimmer clientstate_priority open tilted closed
attr FensterEsszimmer group Fenster
attr FensterEsszimmer room Esszimmer

define FensterKueche structure Fenster DeckLinks DeckRechts
attr FensterKueche clientstate_behavior relative
attr FensterKueche clientstate_priority open tilted closed
attr FensterKueche group Fenster
attr FensterKueche room Kueche
     
define FensterEG structure Fenster FensterKueche FensterEsszimmer
attr FensterEG clientstate_behavior relative
attr FensterEG clientstate_priority open tilted closed
attr FensterEG group Fenster
die jeweilige structure hat den entsprechenden status open bzw tilted sobald ein einziges fenster den status open oder tilted hat. man könnte natürlich auch alle fenster in nur einer structure zusammenfassen. so ist es aber einfacher zu sehen welches fenster wirklich offen ist.

zum überwachen habe ich folgendes notify:define displayFensterEG notify displayFensterEG {\
  my $color = "red";;\                    
  my $state = Value("FensterEG");;\        
  if( $state eq "closed") {\              
      $color = "green";;\                  
    } elsif( $state eq "tilted") {\
      $color = "orange";;\
    }\      
  if( $color ne Value("CUL_HM_outputUnit_1D4B0B_Led_16") ) {\
    fhem( "set CUL_HM_outputUnit_1D4B0B_Led_16 led $color" );;\
  }\        
}
define notifyFensterEG notify FensterEG trigger displayFensterEG
damit wird eine led auf einer 16led anzeige einheit auf rot, orange oder grün gesetzt. der display code ist deshalb nicht direkt im notify weil ich ihn auch noch von zwei anderen stellen aus aufrufe um z.b. das display nach stromausfall oder neustart wieder auf den richtigen zustand zu bekommen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

fiedel

Hi,

habe die Vorlage von hier

http://www.fhemwiki.de/wiki/FHTTK:_Benachrichtigung_bei_offenem_Fenster

genommen und etwas abgewandelt:


Teil aus FHEM.cfg:


define Fenster_Status dummy
attr Fenster_Status fp_0_Hauptbildschirm 440,38,2,
attr Fenster_Status group Status
attr Fenster_Status room 0_Überblick


# FHTTK: Mail bei offenem Fenster; Fenster_Status setzen:
# um Mails zu erhalten, folgende Zeile über "Log 3..." einfügen:
# fb_mail('xyz@@gmx.de',$subject,$fhttk_status);;\

define Func_Fenster_Stat_N notify .*:Window.*(Open|Closed) { \
  my $window_state=ReadingsVal("@", "Window", "nA");;\
  my $deftype=$defs{@}{TYPE};;\
  return if ( $deftype ne "CUL_FHTTK" );;\
  if ( $defs{@}{PREVSTATE} ne $window_state ) { \
    my $fhttk_status=FHTTK_status;;\
    my $subject="FHEM: Fenster @ ".$window_state;; \
    Log 3, "@: Window ".$window_state;;\
  }\
}
attr Func_Fenster_Stat_N group Programm
attr Func_Fenster_Stat_N room 5_System


Teil aus 99_myUtils.pm:


# FHTTK: Benachrichtigung bei offenem Fenster:

sub FHTTK_status {
  my @fhttks = devspec2array("TYPE=CUL_FHTTK");
  my @wopen = ();
  foreach(@fhttks) {
    my $fhttk_window = ReadingsVal($_, "Window", "nA");
    push (@wopen,$_) if ($fhttk_window eq "Open" );
  }
  if ( "Fenster_Status" ne "Open" ) {
    fhem("set Fenster_Status Open");
  }
  my $num_wopen = @wopen;
  my $resultstring='';
  if ( $num_wopen gt 0 ) {
    $resultstring="folgende Fenster sind noch offen:\n\n";
    foreach(@wopen) {
      $resultstring.="- ".$_."\n";
      Log 4, "FHTTK_status: ". $_. "noch offen";
    }
  } else {
    $resultstring="alle Fenster sind derzeit geschlossen.";
    fhem("set Fenster_Status Closed");
  }
  return $resultstring;
}



Wenn man nun noch per Notify den Dummy "Fenster_Status" abfragt, lässt sich damit bequem die LED, bzw. FS20- Komponente steuern. Man kann das natürlich auch direkt in den Programmteil mit einbauen - also z.B.:

unter "fhem("set Fenster_Status Open");" noch eine Zeile z.B. "fhem("set FS20_LED on");" setzen und unter "fhem("set Fenster_Status Closed");" "fhem("set FS20_LED off");".

Den Dummy verwende ich, um den Fenster-Status im Floorplan anzuzeigen.

Viele Grüße

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Zrrronggg!

Ich bin ja hier der immer eher simpel Gestrickte und verstehe die komplexen Lösungen zum Teil nicht mal.

Ich würde das so versuchen:

1. Alle Fenster Sensoren so bennen, das sie mit "Fenster" im Namen anfangen.

2. Dummy  "licht_dummy" anlegen. Loglevel 6

Da die Dinger FHT80TF alle 2 Minuten senden, müssen wir irgendwo zur Reduzierung der Funklast was einbauen, was das Licht nur schaltet, wenn es vorher einen anderen Status hatte.
Ich würde dazu zunächst einen Dummy ("licht_dummy") schalten und der schaltet dann die richtige Lampe, wenn deren Status vorher der andere war.

3.
Zitatdefine act_on_Fenster_open notify Fenster.*:Open { if (Value("Fenster_1") eq "Open" || Value("Fenster_2") eq "Open" || Value("Fenster_3") eq "Open" ||  (...)  ){ fhem("set licht_dummy on") }}
define act_on_Fenster_closed notify Fenster.*:Closed { if (Value("Fenster_1") eq "Closed" && Value("Fenster_2") eq "Closed" && Value("Fenster_3") eq "Closed" ||  (...)  ){ fhem("set licht_dummy off") }}



4.
Zitatdefine switch_licht notify licht_dummy:on  { if (Value("Licht1") eq "off" ) { fhem("set Licht1 on") }}
define switch_licht notify licht_dummy:off  { if (Value("Licht1") eq "on" ) { fhem("set Licht1 off") }}
fertich.

Man kann sich Schritt 4.  und den Dummy auch sparen, und das über weitere verschachtelte IF Bedingungen im ersten define lösen, ich mache sowas aber nicht gerne, weil die Analyse von auch nur mäßig komplexen IF-Verschachtelungen recht schnell sehr komplex wird und es hier reichlich Threads gibt, wo Leute die Übersicht verloren haben.

Disclaimer: Alles aus dem Kopf hingeschrieben und ungetestet, Prinzipdarstellung.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

justme1968

und ich dachte die lösung mit den structure ist die einfache elegante. kein dummy, keine if, nichts verschachtelt, kein code außer dem notify an sich...
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

MisterEltako

Scheinbar führen viele Wege zum Ziel. Ist doch schön, wenn man sich einen aussuchen kann... ;o)

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Tobias

alles viel zu kompliziert, wie justme1968 schon geschrieben hat, genau DAFÜR ist die structure gedacht
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Zrrronggg!

Zitatalles viel zu kompliziert, wie justme1968 schon geschrieben hat, genau DAFÜR ist die structure gedacht

Wie ihr meint.  Wenn man bedenkt, dass das Dummy hier nur der einfacheren Fehleranalyse dient und daher auch weggelassen werden könnte, kommt meine Lösung mit genau 2 "Zeilen" (aka defines) aus.
Alle hier sonst ausgeschrieben vorgestellten Lösungen haben wesentlich mehr Code. Das ist dann sicher eine Frage was man unter "einfach" versteht.

Aber jeder so wie er will, wenn wir richtig nachdenken, fallen uns sicher noch 4 weitere Lösungen ein.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL