Werte von verschiedenen Geräten in einem "Room" abfragen und setzen ?

Begonnen von Ralph, 08 Mai 2013, 18:52:00

Vorheriges Thema - Nächstes Thema

Ralph

Hallo allerseits,
ich kruschtle schon eine Weile damit rum.

Ich habe einen Raum "ToDo",
in dem befinden sich verschiedenen Geräte-Arten / -Typen,
es sollen über Funktionen flexibel automatisch oder manuell auch welche hinzugefügt und herausgenommen werden.

Wenn sich ein Gerät im Raum befindet, dann soll es in die Bearbeitung einbezogen sein, sonst nicht.
Es sollen Werte ausgelesen und ggfs. auch gesetzt werden. Das kriege ich hoffentlich alleine hin.

Mit foreach habe ich schon experimentiert, aber
ich scheitere an der Abfrage der im Raum befindlichen Geräte.

Über (Geräte-) TYPEen habe ich ein Beispiel gefunden und nutze das auch.

Dasselbe wünsche ich mir für ROOMs.

Könnte mir bitte jemand aufs Pferd helfen ?


FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

UliM

Zitat von: Ralph schrieb am Mi, 08 Mai 2013 18:52Mit foreach habe ich schon experimentiert, aber
ich scheitere an der Abfrage der im Raum befindlichen Geräte.

if (AttrVal("$device","room",undef) =~ m"gesuchterRaum"i)

Hilft das?

LG, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

rudolfkoenig

Urspruenglich nicht fuer Enduser gedacht, verwenden kann man es trotzdem:

foreach my $dev (devspec2array("room=myRaum")) {
  my $tmp = ReadingsVal($dev, "temperature", 20);
...
}


Was devspec2array kann, wird in http://fhem.de/commandref.html#devspec beschrieben.

Ralph

Schwere Geburt :-)

Danke Uli, mit dem bin ich nicht klargekommen

Danke Rudi, damit bin ich ein Stück weiter, es sieht jetzt so aus:sub holen {
  foreach my $dev (devspec2array("room=ToDo")) {
    my $tmp = ReadingsVal($dev, "state", "nicht auslesbar");
    Log 3, $dev . " " . $tmp;
  }
}

Heraus kommt:
2013.05.09 02:02:40 3: ZZ_Flag off
2013.05.09 02:02:40 3: U_Verbraucher off
2013.05.09 02:02:40 3: S300TH T: 16.5  H: 70.8
2013.05.09 02:02:40 3: Hz_WoZi measured-temp: 19.6
2013.05.09 02:02:40 3: Badfenster nicht auslesbar

2 Hürden habe ich noch:

1.) ich möchte nicht den Wert selbst, sondern dessen dahinterstehendes Auslesedatum.

2.) Das Badfenster ist ein CUL_FHTTK, da gibt es in den Readings keinen "state", sondern nur nur einen "Window" mit Datum.
Ich müsste also wechselseitig je nach Typ auch noch einen anderen Wert (hier:Window) als nur "state" auslesen können.

Ich bitte nochmals um Hilfe ?
Gehe aber jetzt erstmal 2m horizontal und sortiere meine Verwirrung. GN8.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

rudolfkoenig

1: ReadingsTimestamp (ich empfehle http://fhem.de/commandref.html#perl durchzuarbeiten)
2: CUL_FHTTK ist (noch?) nicht auf die "neue", fuer Modulautoren empfohlene readings*Update Funktion umgestellt, und setzt STATE direkt. Damit koennte man alle Werte mit Value() abfragen.

Ralph

Danke schön - auch für den Tritt,
Du hast vollkommen Recht, zumal ich damit schon gearbeitet hatte, dumm von mir.

1. = danke, wirkt

2. = die Methode habe ich verworfen, knoddle gerade an einem Workaround.

Gebe Laut, wenn fertig.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Ralph

So, ich habe dieses eher empirisch ermittelt als programmiert.
---
Sinn und Zweck:
In dem dafür eigens angelegten "room" namens "ToCheck" legt man die Geräte (mit) ab, welche sich in regelmäßigen Abständen automatisch melden (sollten) und dabei ihren Status bekanntgeben.
Dies können z. B. sein: Fensterkontakte CUL_FHTTK, FHT8b, S300TH usw.
Falls die Geräte einem bestimmten (eigenen) room zugeordnet werden und auch dort verbleiben sollen, dann kann man mit
attr Gerätename eventMap DeinRaumName,ToCheck (in genau dieser Schreibweise) einen 2ten Raum, nämlich hier ToCheck zuweisen.

Ist das Gerät (auch) im Raum ToCheck, dann wird es auch von der untigen Subroutine überwacht.

# Subroutine - einzufügen in z. B. FHEM\99_UtilRalph.pm

sub dev2chk {
  Log 3, "\n";
  foreach my $dev (devspec2array("room=ToCheck")) {
    my $tlast = ReadingsTimestamp($dev, "state", "-");
    if ($tlast eq "-") {
      $tlast = ReadingsTimestamp($dev, "Window", "1970-01-01 01:00:01");
    }
    my $slast = time_str2num($tlast);
    Log 3, $dev . " " . $tlast . " " . $slast . " " . time();
    if (time() - $slast > 3600) {
      Log 3, "^ " . $dev . " letzte Meldung am " . $tlast;
      if ( Value("A_AlarmMail") eq "EIN") { FB_mail('müllmail@email.deine',"^ " . $dev . " abgaengig","Letzte Meldung am " . $tlast); }
      if ( Value("A_AlarmGong") eq "EIN") { fhem "set GONGen toggle"; }
    }
  }
}

Wer die Logbuch-Einträge nicht mag, der maskiert sie aus mit einem # davor, am Anfang waren die mir aber sehr hilfreich.
Die Logbuch-Einträge sehen z. B. so aus:
2013.05.10 01:59:06 3: Water2beOpen 2013-05-10 01:56:21 1368143781 1368143946
2013.05.10 01:59:05 3: Mail ^ TestFlag abgaengig sent to ...
2013.05.10 01:59:03 3: ^ TestFlag letzte Meldung am 1970-01-01 01:00:01 # der gesetzte GrundWert :-)
2013.05.10 01:59:03 3: TestFlag 1970-01-01 01:00:01 1 1368143943
2013.05.10 01:59:03 3: S300TH 2013-05-10 01:51:32 1368143492 1368143943
2013.05.10 01:59:03 3: Kuechentuer 2013-05-10 01:54:50 1368143690 1368143943
2013.05.10 01:59:03 3: Kuechenfenster 2013-05-10 01:57:27 1368143847 1368143943
2013.05.10 01:59:03 3: Mail ^ Hz_WoZi abgaengig sent to ...
2013.05.10 01:58:59 3: ^ Hz_WoZi letzte Meldung am 2013-05-08 19:00:22
2013.05.10 01:58:59 3: Hz_WoZi 2013-05-08 19:00:22 1368032422 1368143939
2013.05.10 01:58:59 3: Hz_Kueche 2013-05-10 01:46:56 1368143216 1368143939
2013.05.10 01:58:59 3: Flurfenster 2013-05-10 01:58:33 1368143913 1368143939
2013.05.10 01:58:59 3: Buerofenster 2013-05-10 01:56:56 1368143816 1368143939
2013.05.10 01:58:59 3: Badfenster 2013-05-10 01:51:13 1368143473 1368143939
Man kann unschwer erkennen, dass sich mein FHT8b Hz_WoZi mal wieder echt ausspinnt,
insofern hat sich die Arbeit schon gelohnt.


Dann braucht man noch eine CFG dazu:
# LebendOderTot.cfg - zu starten mit incl LebendOderTot.cfg in der Befehlszeile

# das sind alles nur Beispiele, jeder ist seines Glückes Schmied

# Gong
define GONGen FS20 1705 47
attr GONGen eventMap on:EIN off:AUS
attr GONGen room BinDa

# TasterSchalter fuer dev2chk, den gibts nicht als wirkliches Geraet
define A_CheckAlive FS20 0000 03
attr A_CheckAlive eventMap on:EIN off:AUS
attr A_CheckAlive room BinDa

# Schalter fuer den Gong, den gibts nicht als wirkliches Geraet
define A_AlarmGong FS20 0000 01
attr A_AlarmGong room BinDa

# Schalter fuer Mails, den gibts nicht als wirkliches Geraet
define A_AlarmMail FS20 0000 00
attr A_AlarmMail eventMap on:EIN off:AUS
attr A_AlarmMail room BinDa

# Nur zum Testen, das Flag hat nach dem Einrichten keinen "state"
delete TestFlag
define TestFlag FS20 1009 00
attr TestFlag room ToCheck


# In der Subroutine dev2chk steckt die eigentliche Arbeit

# dies wird alle 6 Stunden automatich wiederholt oder unten mit Schalter gestartet
define aChk at +*06:00:00 {dev2chk}

# manueller Start mit Schalter um 5 Sek. verzögert um aufs EventLog umzuschalten
define nChk notify A_CheckAlive define tChk at +00:00:05 {dev2chk}

Man kann nun 6 Stunden warten, dann kommt es automatisch
oder eben bei begründetem Verdacht händisch mit dem TasterSchalter A_CheckAlive im Raum BinDa starten.

Für Einwände, konstruktive Kritik, Verbesserungen und RFCs bin ich dankbar, ansonsten geht das später so in die Wiki.

Viel Spass beim Ausprobieren
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Icebear

moin

is ja lustig.. Und wir suchten die lösung warum die FHTTKs innerhalb einer Structure nicht wollen ...

Haben nen workaround gebaut damit's funzt :)

grüsse aus wesel
icebear
Raspberry PI mod B (Wheezy), Fhem 5.4, CUL868, CUL433 , RfxTrx, HM-USB-CFG2, Wlan, HomeEasy, IT, FS20, TFA, HomeMatic, Oregon Scientific, HMLand auf Fritzbox
Raspberry PI mod B (RaspBMC)

Markus Hermann

Hallo Ralph,

ich habe Deine Routine in die 99_Utils.pm eingebaut um zu prüfen, welche Fenster und Türen noch geöffnet sind bevor die Alarmanlage scharf geschaltet wird.
Das klappt soweit auch ganz gut. Mein Problem ist aber, dass wenn zum Beispiel das WC-Fenster UND die Werkstatttür geöffnet sind, nur die Meldung der Werkstatttür abgespielt wird.
Das liegt daran, dass HM-OU-CFM-PL zwar den 1. Befehl (WC-Fenster) erhält, aber sofort den 2. Befehl (Werkstatttür) nachschickt.

Hast Du eine Idee wie ich das vermeiden kann?

Gruß
Markus


sub dev2chk {
  Log 3, "\n";
  foreach my $dev (devspec2array("room=ToCheck")) {
    my $tlast = ReadingsTimestamp($dev, "state", "-");
    if ($tlast eq "-") {
      $tlast = ReadingsTimestamp($dev, "Window", "1970-01-01 01:00:01");
    }
    my $slast = time_str2num($tlast);
    Log 3, $dev . " " . $tlast . " " . $slast . " " . time();
    if (time() - $slast > 1) {
      Log 3, "^ " . $dev . " letzte Meldung am " . $tlast;
      if ( Value("sec_Terassentuer_1") eq "open") {fhem ("set mp3_play playTone 019,052,040")}
      if ( Value("sec_Terassentuer_2") eq "open") {fhem ("set mp3_play playTone 019,052,040")}
      if ( Value("sec_Haustuer") eq "open") {fhem ("set mp3_play playTone 019,052,041")}
      if ( Value("sec_Kuechenfenster") eq "open") {fhem ("set mp3_play playTone 019,052,042")}  
      if ( Value("sec_WCFenster") eq "open") {fhem ("set mp3_play playTone 019,052,044")}
      if ( Value("sec_Fotostudio") eq "open") {fhem ("set mp3_play playTone 019,052,043")}
      if ( Value("WZ_Fenster_links") eq "Open") {fhem ("set mp3_play playTone 019,052,050")}
      if ( Value("WZ_Fenster_rechts") eq "Open") {fhem ("set mp3_play playTone 019,052,049")}
      if ( Value("Werkstatt") eq "Switch Detect: off") {fhem ("set mp3_play playTone 019,052,051")}
    }
  }
}
CUL/CUL-RFR/HM-LAN an Cubietruck

FS20/FHT/TFK/UTS/KS300/HM-SEC-SC/HMS100/HM-OU-CFM-PL/HM-RC-SEC3/

FLOORPLAN auf Android-Tablet und VDR

Ralph

DAS Problem habe ich mit einem GongModul auch, trotz mehrfacher Signalisierung gongts nur einmal, wenn der 2te Anreiz während des Laufes der Signals eintrifft.

Mir fällt dazu nur ein, dass Du nach dem bimmeln-senden einen Sleep einbaust oder
Dir mittels Dummy-Flags merkst, was ausgelöst hat und später verzögert nacheinander bimmelst.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

MisterEltako

Gibt es nicht irgendein Reading/Register was anzeigt das das erste MP3-File abgespielt wurde und dann erst das nächste MP3-File abspielt?

Das könnte man doch dann einfac abfragen und kontrollieren und die vorher in einem Array gespeicherten Auslöser nacheinander abspielen.

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