DOIF wo mache ich den Denkfehler

Begonnen von beSmart, 12 Oktober 2016, 21:45:01

Vorheriges Thema - Nächstes Thema

beSmart

Hallo Forum.

Ich habe mir die LED Statusanzeige mit ESP8266 von "blog.moneybag.de" nachgebaut.
Allerdings verwende ich nicht "notify" sondern "DOIF" für das Schalten der LED.
Dies funktioniert soweit auch. Allerdings wird der Status nicht korrekt angezeigt, wenn mehrere Fenster geöffnet und eins davon wieder geschlossen wird.
"Attr do allways" habe ich gesetzt.
(["^Fk.UG.:open"]) ({myLEDSend("$DEVICE","14,255,0,0")}) DOELSE ({myLEDSend("$DEVICE","14,0,255,0");})

Hat jemand eine Idee wo mein Denkfehler ist......

Dank und Gruß

beSmart

KernSani

Hi,

kannst du ein paar mehr details posten (was ist das gewünschte Verhalten, was ist das aktuelle Verhalten, was heisst "nicht korrekt angezeigt"). Evtl. ein list des DOIF?
Oder muss ich den Blogbeitrag suchen und lesen?

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

beSmart

#2
Guten Morgen.

Nein, den musst du nicht suchen und lesen........ Hier ist der Link ;) (Das brauchst du nicht zu lesen!!!)
https://blog.moneybag.de/fhem-mit-led-statusanzeige-led-stripe-wd2812b-esp-8266/

So, jetzt mehr Informationen ohne einen Roman zu schreiben.

Bei der Statusanzeige handelt es sich um einen ESP8266 mit WS2812b Led´s und FastLED mit MQTT als Software.
Fhem sendet über MQTT die Ein/Aus-Kommandos an den ESP.  Das funktioniert auch alles ohne Probleme.

In Fhem gibt es eine 99_myUtils mit folgendem Inhalt:

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below
sub myLEDSend($$) {
my ($dev,$led) = @_;
my $cmd = "mosquitto_pub -d -t cmnd/FastLedDisplay/rbw -m '$led'";
system( "$cmd;$cmd;$cmd" );
return undef;
}

1;


Und folgendes DOIF:
define LEDTest DOIF (["^Fk.UG.:open"]) ({myLEDSend("$DEVICE","14,255,0,0")}) DOELSE ({myLEDSend("$DEVICE","14,0,255,0");;})
attr LEDTest do always


Funktion:
               Das DOIF schaltet LED Nr.14 auf rot, wenn ein Fensterkontakt den Status "offen" hat und auf "grün", wenn der Status "closed"
               ist.
               Wenn Fensterkontakt 1 "open" und ein zweiter Fensterkontakt auch"open", dann wird "rot" angezeigt. (Das ist korrekt)
               Wird eines der Fenster geschlossen, zeigt die Led "grün". Es müsste aber "rot" sein, da ja ein Fenster noch "offen" ist.
               Wo mache ich den Fehler?


Dank und Gruß

beSmart

               mein Ziel


Edit:

Nach folgender Änderung am DOIF funktioniert es... :) :) :)

alt:define LEDTest DOIF (["^Fk.UG.:open"]) ({myLEDSend("$DEVICE","14,255,0,0")}) DOELSE ({myLEDSend("$DEVICE","14,0,255,0");;})
attr LEDTest do always

neu:([Fk.UG.Esszimmer] eq "open" or [Fk.UG.Flurfenster] eq "open" or [Fk.UG.Kuechenfenster] eq "open" or [Fk.UG.Wohnzimmer] eq "open") ({myLEDSend("$DEVICE","14,255,0,0")}) DOELSE ({myLEDSend("$DEVICE","14,0,255,0");})

Der Fehler muss also hier liegen (["^Fk.UG.:open"])

Aber was ist daran falsch? es wird doch der Status aller Geräte die mit "Fk.UG." anfangen abgefragt, oder nicht?





Ellert

Mit (["^Fk.UG.:open"]) fragst Du Events ab, wenn ein Gerät, das passt open sendet ist die Bedingung wahr, wenn danach ein anderes Gerät, das passt etwas anderes als open sendet, wird die Bedingung unwahr. Es wird also immer nur das Ereignis des aktuell passenden Gerätes ausgewertet.

beSmart

Vielen Dank Ellert,

da habe ich wieder etwas dazugelernt. Das schreib ich gleich in mein Berichtsheft.

Aber wie kann ich Geräte die mit z.B "Fk.OG" beginnen Abfragen? -oder geht das nicht?
In der Commandref habe ich nichts gefunden.

Gruß

Dirk

Ellert

Bei Events, so wie Du es zuerst gemacht hast und bei den Readings, so wie Du es im 2. Fall gelöst hast.