Readingsgroup: valueIcon Reading mit Hash "#" (☇)

Begonnen von Phill, 25 Dezember 2014, 14:02:18

Vorheriges Thema - Nächstes Thema

Phill

Hallo,
ich habe folgendes Problem festgestellt was ich nicht in den Griff bekomme.

Und zwar habe ich OWSWITCH-Eingänge die im unbetätigten Zustand dieses HTML Zeichen angefügt bekommen.

Jetzt will ich die valueIcon Eigenschaft darauf setzen.
valueIcon {'Tuer.auf☇'=>'fts_door_open', 'Tuer.zu'=>'fts_door'}
Jetzt kommen gleich zwei Probleme auf.
1. Beim neustart von FHEM wird nur bis zur Raute aus der fhem.cfg gelesen der Teil danach wird abgeschnitten.
2. readingsGroup kommt auch nicht wirklich damit zurecht.
    Rufe ich die Seite mit der Readingsgroup neu auf oder aktualisiere ich sie, bekomme ich das valueicon nicht angezeigt. Wird der Status aber über einen "LongPoll" geändert funktioniert das Icon.

Wie bekomme ich das gelöst?
Kann ich das irgendwie escapen?
RegExp hatte ich probiert gehen da aber anscheinend nicht oder?
OWSWITCH so einstellen das es das Zeichen nicht anhängen soll wäre wohl das sinnvollste, aber ich weiß nicht wie!

Gruß
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

justme1968

du kannst in def und attributen kein # verwenden weil es beim einlesen als kommentar gewertet wird und alles danach abgeschnitten wird.

das problem kannst du umgehen und dem du den code in 99_myUtils auslagerst und im attribut nur eine sub aufrufst.

wenn du nur um die
beiden zustände geht kannst du aber auch im ersten key nur Tuer ohne das mit punkt angehängte reading verwenden. das gilt dann immer wenn das genauer spezifizierte zu icon nicht greift.

ansonsten am besten eventMap im Original device verwenden um das Zeichen Weg zu bekommen. hier kannst du regex verwenden.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Phill

Hallo und Danke erst mal. Das eventMapping hat ein wenig geholfen.
eventMap auf.*:auf
Jetzt ist aber immer noch das sehr unschöne Problem, dass das richtige valueIcon nur bei einem Longpoll angezeigt wird. Rufe ich die Seite auf oder aktualisiere ich sie im Browser wird das ursprüngliche Reading angezeigt. (auf☇)

Zitat von: justme1968 am 25 Dezember 2014, 14:17:35
das problem kannst du umgehen und dem du den code in 99_myUtils auslagerst und im attribut nur eine sub aufrufst.
Versteh ich ehrlich gesagt nicht. Meinst du ich soll das Event in 99_myUtils abfangen und das icon per perl setzen?

Zitat von: justme1968 am 25 Dezember 2014, 14:17:35wenn du nur um die beiden zustände geht kannst du aber auch im ersten key nur Tuer ohne das mit punkt angehängte reading verwenden. das gilt dann immer wenn das genauer spezifizierte zu icon nicht greift.
Das hat funktioniert, dabei wird immer das korrekte Icon angezeigt. Werde ich mal schauen ob mir das irgendwann Probleme macht wenn es ein Standart Icon gibt. Kann ich jetzt noch nicht abschätzen.

Gruß

Gruß
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

justme1968

eventMap wirkt auf STATE und nicht auf state. d.h. es hat nur im original device auswirkung nicht auf die readingsGroup. d.h. du musst für das original device devStateIcon so konfigurieren das hier alles stimmt und in der readingGroup dann {state => '%devStateIcon'} verwenden. d.h. die readingGroup verwendet das devStateIcon des original device.

das auslagern würde so aussehen:attr <rg> valueIcon {Tür => '{meinIcon($VALUE)}' } und in 99_myUtils dann:sub meinIcon($) {
  my($value) = @_;
  return fts_door_open if( $VALUE eq 'auf☇' );
  return fts_door if( $VALUE eq 'zu' );
  return undef;
}


in 99_myUtils wird das # nicht als kommentar interpretiert. du solltest aber erst mal ein Log 3, $value; einbauen und schauen was als wert tatsächlich ankommt und ob nicht noch irgendwo etwas um kodiert wird.

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

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

Deathevn

Um den readingsGroup-Thread nicht aufzublähen führe ich mal meine Frage hier weiter, da es thematisch passt.

Ich setze im CellValue die Text-Farben mittels Hash-Wert. Jetzt habe ich mir also eine Funktion in meine myUtils geschrieben:
sub
lcarscolor($)
{
   my $color = @_;

   return #FF9900 if( $color eq 'orange' );
   return #CC99CC if( $color eq 'flieder' );
   return #9999CC if( $color eq 'blaugrau' );
   return #CC6666 if( $color eq 'rotbraun' );
   return #FFCC99 if( $color eq 'beige' );
   return #9999FF if( $color eq 'leuchtblau' );
   return #FF9966 if( $color eq 'apricot' );
   return #CC6699 if( $color eq 'pink' );
   return #F7C64A if( $color eq 'hellorange' );
   return undef;
}


Ich hatte die Hashwerte auch schon alle innerhalb "" geschrieben, das ging auch nicht.

Den Aufruf hatte ich bisher so:
{ "r:1"=>'style="font-size:28px;color:#FF9900;text-align:center"' }

Jetzt habe ich folgende Varianten ausprobiert:

  • { ...color:lcarscolor("orange");... }
  • { ...color:".{lcarscolor("orange")}.";... }
  • { ...color:".'{lcarscolor("orange")}'.";... }

Mein Verständnis ist, dass mir meine Funktion einen String zurück gibt (anfangs daher auch den return-Wert in "") und ich den String hinter style="" entsprechend verknüpfen muss (mit .). Wo liegt hier mein Denkfehler?

Viele Grüße
Martin

justme1968

wenn du sowieso chon farb namen hast warum verwendest du nicht diese direkt als color?{ "r:1"=>'style="font-size:28px;color: orange;text-align:center"' }

der umweg über die hex werte ist nur nötig wenn es keinen passenden farb namen gibt. die erlaubten namen findest du z.b. hier: http://www.w3schools.com/html/html_colornames.asp.

ansonsten: wenn die farben die du möchtest in der liste nicht dabei sind:

schau mal bitte ins log ob da etwas zu sehen ist. der ... teil wäre in deinem fall wichtig. bitte poste mal die komplette attribut definition. so etwa sollte es gehen:{ "r:1"=>'{"style=\"font-size:28px;color:".lcarscolor("orange").";text-align:center\""}' }die zusätzlichen {..} brauchst du im hash fall um zu kennzeichnen das es perl code ist der ausgeführt werden soll.

wegen der der anführungszeichen auf drei unterschiedlichen ebenen kommst du ums maskieren auf mindestens einer ebene nicht mehr rum. d.h. es ist eigentlich einfacher den kompletten string oder noch besser den kompletten hash aus der sub zurück zu geben.

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

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

Deathevn

Okay das ist ja noch komplizierter als gedacht...
Wollte das eigentlich versuchen geschickt zu lösen, um die Farben der LCARS-Oberfläche jederzeit abrufbar zu machen.

Wenn ich das so umsetze, wie du geschrieben hast, dann erhalte ich folgenden Fehler im Log:

PERL WARNING: Use of uninitialized value in concatenation (.) or string at (eval 7141) line 1.

Wenn ich stackoverflow richtig verstehe wird bei der Interpretation des cellStyle Values eval verwendet und damit der Kontext geändert. Also komme ich so hier gar nicht weiter, oder?
Ich schau dann mal, ob ich nahezu passende Farben mit Namen finde, z.B. DarkOrange.

Danke für deine Hilfe!

justme1968

#7
die farben sind strings. du musst in deiner sub die werte also in anführungszeichen stecken. du hast sonst lautere leere returns weil alles hinter dem # auch da ein kommentar ist.

sub
lcarscolor($)
{
   my ($color) = @_;

   return '#FF9900' if( $color eq 'orange' );
   return '#CC99CC' if( $color eq 'flieder' );
   return '#9999CC' if( $color eq 'blaugrau' );
   return '#CC6666' if( $color eq 'rotbraun' );
   return '#FFCC99' if( $color eq 'beige' );
   return '#9999FF' if( $color eq 'leuchtblau' );
   return '#FF9966' if( $color eq 'apricot' );
   return '#CC6699' if( $color eq 'pink' );
   return '#F7C64A' if( $color eq 'hellorange' );
   return '#000000';
}


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

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

Deathevn

Okay, ich hatte irgendwie vermutet, dass " und ' beide Strings ausdrücken - Python handhabt das so.
Hab das mal abgeändert, allerdings wenn ich über die Befehlszeile:

{lcarscolor('orange')} eingebe, erhalte ich lediglich #000000.

Wieso matched er das nicht?

Viele Grüße
Martin

justme1968

' und " schliessen beides strings ein. es gibt noch einen unterschied in der variablen interpolation.  aber in deiner version oben waren gar keine anführungszeichen.

das ganze hat noch nicht funktioniert weil noch die klammern bei der zuweisung der variablen aus dem des parameter array gefehlt haben.

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

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

Deathevn

Das war es! :D

Die Klammer vergessen... Danke!
Jetzt funktioniert der Farbaufruf.