Autor Thema: Statusmeldung von DS2406 auf's Display - Problem  (Gelesen 4389 mal)

Offline UweH

  • Hero Member
  • *****
  • Beiträge: 1742
Statusmeldung von DS2406 auf's Display - Problem
« am: 01 Februar 2013, 19:18:40 »
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

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8510
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #1 am: 05 Februar 2013, 10:02:54 »
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

Offline UweH

  • Hero Member
  • *****
  • Beiträge: 1742
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #2 am: 05 Februar 2013, 18:27:33 »
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...?

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8510
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #3 am: 05 Februar 2013, 21:21:02 »
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

Offline UweH

  • Hero Member
  • *****
  • Beiträge: 1742
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #4 am: 05 Februar 2013, 23:10:00 »
Jo...damit funktioniert's :)

Danke


Offline UweH

  • Hero Member
  • *****
  • Beiträge: 1742
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #5 am: 06 Februar 2013, 18:41:11 »
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

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8510
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #6 am: 07 Februar 2013, 09:01:47 »
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

Offline UweH

  • Hero Member
  • *****
  • Beiträge: 1742
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #7 am: 07 Februar 2013, 11:52:53 »
Aha... *grübel*
Ich komm schon noch dahinter, wovon Du redest.

Offline UweH

  • Hero Member
  • *****
  • Beiträge: 1742
Aw: Statusmeldung von DS2406 auf's Display - Problem
« Antwort #8 am: 07 Februar 2013, 13:44:08 »
Zitat von: Prof. Dr. Peter Henning schrieb am Do, 07 Februar 2013 09:01
darin die feste Anzahl von Leerzeichen durch ein ".*" ersetzen.


Das war's :)

Danke