Moin :-)
Um meinen Rolladen der von 0 bis 200 steuerbar ist zumindest (Amazon limitierung wie es scheint) bis 100% (das ist bei mir Rolladen runter aber alle Schlitze offen) mittels Sprache steuern zu können habe ich nun auf pct im reading umgegebaut.
Damit ich aber weiter 0 bis 200 und nicht pct 0 pct 10 in FHEM stehen habe habe ich mir eine eventMap erstellt:
{ usr=>{ 'auf'=>'pct 0', '0'=>'pct 0', '10'=>'pct 10', '20'=>'pct 20', '30'=>'pct 30', '40'=>'pct 40', '50'=>'pct 50', '60'=>'pct 60', '70'=>'pct 70', '80'=>'pct 80', '90'=>'pct 90', '100'=>'pct 100', '110'=>'pct 110', '120'=>'pct 120', '130'=>'pct 130', '140'=>'pct 140', '150'=>'pct 150', '160'=>'pct 160', '170'=>'pct 170', '180'=>'pct 180', '190'=>'pct 190', 'zu'=>'pct 200' } }
Nun es gehen auch einige Teile :-D aber z. B. 190 ist 90 ?!? und 150 ergibt 50
Hä :-D :o
Hab ich da nun grob was falsch gemacht oder bin ich in einen Bug gestolpert?
Würde mal darauf tippen, dass da regex "schuld" ist. Bei der Suche nach "20" matcht eben nicht nur "20", sondern auch "A20", "120", "520", und es liegt nahe, dass das in "order of appearance" geprüft wird. Also: Reihenfolge ändern, oder die Regex eindeutiger machen, vielleicht klappt es dann ;) .
Ach das ist ein Regex :-D
Das hatte ich kurz im Commandref überlesen :-D Danke
Na ja, nicht ganz, das ist eher ein verschachtelter (Teil-) Hash, aus dem dann Angaben für regex-Prüfungen entnommen werden (die keys aus dem inneren Hash). Ist zwar auch nur eine Beschreibung "der Spur nach", aber eigentlich ist interessanter, ob das umdrehen hilft (erst die speziellere Angabe, dann die weniger spezielle usw.)?
Also ich hab es jetzt so bauen wollen aber $1 oder \1 gehen nicht ;-D
Auf und zu hab ich dabei erstmal komplett raus gelassen.
{ usr=>{'[\d{2-3}]'=>'pct $1' } }
Wahrscheinlich eben weil es nicht ganz Regex ist ;-D
Wäre halt auch deutlich effizienter die Art es so zu schreiben. Fehlt halt noch das einsetzen des match ;-D
*EDIT* Haha ok das will so wohl gar nicht laut log:
2019.10.25 19:20:17 1: PERL WARNING: Unrecognized escape \d passed through at (eval 9455) line 1.
2019.10.25 19:20:19 1: PERL WARNING: Use of uninitialized value $1 in concatenation (.) or string at (eval 9458) line 1.
- es ist ein hash, und da die Elemente nicht sortiert werden, ist die Reihenfolge unbestimmt.
- fuer diese (unsortierte) Liste wird bei jedem Element erst geprueft, ob es genau zutrifft (dann wird der Wert genommen), und danach, ob es als regexp matcht (dann wird der Wert als Perl-Expression evaluiert).
- $1 kann man nur dann verwenden, wenn im Regexp es per () gefuellt wurde.
Beispiel:eventMap { usr => { '^(\d+) C$'=>'".($1*1.8+32)." F' } }
setzt den Status von dummy nach "set dummy 32 C" auf "89.6 F".
Die zwei komisch erscheinenden " sind kein Fehler: der Wert wird in " eingepackt evaluiert, damit man auch einfach STRING schreiben kann.
Wieder was gelernt bzw. was für meine "könnte man mal brauchen"-Liste :) .
Insgesamt ist das mit den eventMap-Elementen bisher eher selten hier diskutiert gewesen (meine Vermutung: >95% der user haben die gesplittete ("usr => ...")-Version noch nie gesehen), von daher ist diese erklärte "extended version" hier sehr aufschlußreich, Danke!
Nabend,
vielen Dank erstmal für die Ausführung :-)
So wirklich Licht bringt mir das aktuell noch nicht.
- Wie sieht der Hash aus und was ist es für ein Hash? (gibt ja durchaus einige Variatonen)
- Ich finde keine wirkliche Übersicht welche Regex Perl akzeptiert (ja im Wiki gibt es was.... das ist aber gegen z. B. Regex101.com nicht wirklich der Knaller ;-D (nur das das eben Perl außen vor lässt).
- ^ Anfang des pattern match?
- $ Ende des pattern match?
Aber ich versuch nun einfach mal, dass aus deinem Beispiel um zumogeln zu einem was mir passt.
Selbst wenn ich dabei erfolgreich wäre, hätte ich es aber dennoch nicht ganz verstanden - daher die Fragen :-D
Die Struktur des Hashs ist in CommandRef beschrieben: https://fhem.de/commandref_DE.html#eventMap
Das ist ein ganz normales Perl Hash http://www.mathe2.uni-bayreuth.de/perl/GK/hashes.htm
Perl akzeptiert grundsätzlich die gleiche Regex wie PHP: PCRE = Perl compatible regular expression. Siehe Regex101
Wenn Du dort eine Regex eingibst, erklärt die Webseite rechts Schritt für Schritt wie die Regex interpretiert wird.
Z.B
^ asserts position at start of a line
$ asserts position at the end of a line
^part = matcht was mit "part" anfängt
part$ = matcht was mit "part" endet
part = matcht was "part" enthält, egal die Position und die Länge
^part$ = matcht nur Strings, die genau gleich "part" sind.
Eine Einführung in Regex findest Du hier: https://perldoc.perl.org/perlre.html
Danke für die Erklärungen - hat geholfen :-D
Ich habe mir tatsächlich einfach die Zeit gelassen, bis ich Zeit hatte zu lesen und zu verstehen. (Macht man echt zu selten!) ;D
Eigentlich war es nicht soweit von dem weg wie ich es bauen wollte :-D es gab nur kleine verschiedenheiten im Regex dann - oder ich bin noch nicht durch mit verstehen.
Aber es funktioniert! 8) (mit der Warnmeldungen zweie)
Meine Eventmap:
{ usr=>{ 'auf'=>'pct 0', 'zu'=>'pct 200', '^(\d{2,3})$' => 'pct $1' } }
Aus "70" im device als Webcmd wird nun
2019-11-18 21:57:56 MQTT_DEVICE Rolladen_AZ pct: 70
:)
Ich bekomme allerdings zwei Warnungen:
2019.11.18 21:57:37 1: PERL WARNING: Unrecognized escape \d passed through at (eval 439818) line 1.
2019.11.18 21:57:37 1: ERROR evaluating {ReadingsVal("Rolladen_AZ","^(\d{2,3})$","")}: Final $ should be \$ or $name at (eval 439818) line 1, within string
syntax error at (eval 439818) line 1, near ","^(\d{2,3})$""
Laut Regex101 mit setting PCRE ist \d "any digit". Warum wird es hier angekreidet? :o
Ein \$ am Ende sorgt an egal welcher Position der "$" für nicht mehr vorhandene funktionalität
*Edit - habe gerade noch einen Gedanken - zündet die Eventmap NUR für das Device oder hab ich mir ggf nun was gebaut wo auf 2 bis 3 stellige Zahlen aller Art reagiert wird :D
Zitatzündet die Eventmap NUR für das Device oder hab ich mir ggf nun was gebaut wo auf 2 bis 3 stellige Zahlen aller Art reagiert wird
Ein (eventMap) Attribut gilt nur fuer das betroffene Device.
Ich konnte die gezeigten Fehlermeldungen mit
define d dummyattr d setList pct auf zu 112 13 14
attr d eventMap { usr=>{ 'auf'=>'pct 0', 'zu'=>'pct 200', '^(\d{2,3})$' => 'pct $1' } }
nicht nachstellen. Falls Du das Problem mit was vergleichbar Einfaches zeigen kannst, dann waere ich dankbar.
Sonst: bitte "attr global stacktrace" setzen, dann haette ich grob eine Ahnung, wo das Problem herkommt.
;D
Witzig - unerklärlich für mich warum - aber ich habe nicht getan außer das Tab und Browser vorhin zu schließen - und nun bekomme ich auch keine Meldung mehr im Log.
D.h. es läuft sauber :-)
Seltsam bleibt das aber. Kann es nicht mehr nachstellen.
Somit bedanke ich mich und muss sagen - schön erklärt mit Beispiel, etwas Lektüre und Tools. :-)
Top - ich freu mich.