Statusmeldung von DS2406 auf's Display - Problem

Begonnen von UweH, 01 Februar 2013, 19:18:40

Vorheriges Thema - Nächstes Thema

UweH

Hallo,

ich habe mit dieser sub:

sub
prg_Display_Status_2()

{
my $tuerstat = ReadingsVal('Sens.oben', "state", "sensed");

  if ($tuerstat =~ m/.*SZ: ON- Bad: ON-.*/) {
  {OWXLCD_SetLine($defs{'Display'},1,"SchlZi Zu  WC Zu")};
  }
  elsif ($tuerstat =~ m/.*SZ: OFF Bad: ON-.*/) {
  {OWXLCD_SetLine($defs{'Display'},1,"SchlZi Auf  WC Zu")};
  }
  elsif ($tuerstat =~ m/.*SZ: ON- Bad: OFF.*/) {
  {OWXLCD_SetLine($defs{'Display'},1,"SchlZi Zu  WC Auf")};
  }
  elsif ($tuerstat =~ m/.*SZ: OFF Bad: OFF.*/) {
  {OWXLCD_SetLine($defs{'Display'},1,"SchlZi Auf  WC Auf")};
  }
   }

einen DS2406 über OWX abgefragt und einen Text auf's Display geschickt. Soweit ok und funktioniert.

Nun habe ich einen zweiten DS2406, den ich über den Raspberry und OWServer/OWDevice angeschlossen habe und ebenso einen Text auf's Display beamen wollte:

sub
prg_Display_1_Status_1()

{
my $tuerstat_2 = ReadingsVal('Sens.WiGa', "state", "sensed");

  if($tuerstat_2 =~ m/.*sensed.A: 0 sensed.B: 0 alarm: 0.*/) {
  {OWXLCD_SetLine($defs{'Display'},0,"Garage Zu  WiG Zu")};
  }
  elsif ($tuerstat_2 =~ m/.*sensed.A: 1 sensed.B: 0 alarm: 1.*/) {
  {OWXLCD_SetLine($defs{'Display'},0,"Garage Auf WiG Zu")};
  }
  elsif ($tuerstat_2 =~ m/.*sensed.A: 0 sensed.B: 1 alarm: 1.*/) {
  {OWXLCD_SetLine($defs{'Display'},0,"Garage Zu WiG Auf")};
  }
  elsif ($tuerstat_2 =~ m/.*sensed.A: 1 sensed.B: 1 alarm: 1.*/) {
  {OWXLCD_SetLine($defs{'Display'},0,"Garage Auf WiG Auf")};
  }
  }
}


Das funktioniert nun nicht... Der Inhalt des state ist 1:1 übernommen, ebenso wie in der ersten Funktion.
Kann mir jemand sagen, was ich falsch mache?

Danke und Gruß
Uwe

Prof. Dr. Peter Henning

Die Ansteuerung des Displays sieht ok aus - die Abfrage der Messwerte wird ja über ein OWDevice gemacht, kann sein, dass da die Regexp noch nicht stimmt. Ich würde erst mal ausprobieren, ob sich das von Hand triggern lässt.

LG

pah

UweH

Hallo pah,

von Hand reagiert da auch nix. Die Statusänderungen der DS2406 werden hübsch aktualisiert, stimmen genau mit den Vergleichen in der sub überein und es passiert nix. Es gibt auch keine Fehlermeldung, wenn die sub durchläuft.


(siehe Anhang / see attachement)


Kurios...?

Prof. Dr. Peter Henning

Ich tippe auf die regexp.

Gib von Hand ein (in eine FHEM-Kommandozeile)

{ (<Dein String> =~ m/.*sensed.A: 0 sensed.B: 0 alarm: 0.*/) }

LG

pah

UweH


UweH

Hallo pah,

ich weiß nicht, was da gestern funktioniert hat, ich kann es aber nicht reproduzieren.
Wie müsste "<Dein String>" aussehen?
Ablauf bisher war: Ich muss den state des Devices auslesen:
my $tuerstat_2 = ReadingsVal('Sens.WiGa', "state", "sensed");

einen Vergleich durchführen:

if($tuerstat_2 =~ m/.*sensed.A: 0 sensed.B: 0 alarm: 0.*/)
und eine Aktion auslösen:

{
  {OWXLCD_SetLine($defs{'Display'},0,"Garage Zu  WiG Zu")};


Mit regexp kann ich im Moment wenig anfangen...böhmische Dörfer. Um das zu verstehen, müsste ich mich wahrscheinlich erst mal noch tiefer einlesen :o
Kannst Du mir ein konkretes Beispiel geben?

Danke

Prof. Dr. Peter Henning

In dem regulären Ausdruck, der zum Vergleich herangezogen wird, ist eine feste Anzahl von Leerzeichen vorgesehen.

Bei der Eingabe "von Hand" hast Du die zufällig richtig erwischt - ich nehme jedoch an, dass die Abfrage etwas leicht anderes liefert.

Generelle Strategie also immer:
1. Die regulären Ausdrücke möglichst flexibel gestalten, z.B. darin die feste Anzahl von Leerzeichen durch ein ".*" ersetzen.
2. Ein matching von Hand durchführen, so wie oben schon angeregt

LG

pah

UweH

Aha... *grübel*
Ich komm schon noch dahinter, wovon Du redest.

UweH

Zitat von: Prof. Dr. Peter Henning schrieb am Do, 07 Februar 2013 09:01darin die feste Anzahl von Leerzeichen durch ein ".*" ersetzen.

Das war's :)

Danke