Hallo,
Ich habe in meinem Device "Kalender" ein Reading "Ort" mit dem Wert "Hinter den Bergen 1, Buxtehude". Da mir dieser Wert zu lang ist, möchte ich, daß sobald der Kalender ausgelesen wird, der Wert "Hinter den Bergen 1, Buxtehude" in "Home" geändert wird und "Home" im Reading "Ort" steht.
Ist das möglich? Bestimmt irgendein NOTIFY, aber wie?
Gruß, Sascha
Mehr Input, bitte. Von welchem Typ ist Dein Device "Kalender", und wer liest es aus? Notify ist schon richtig, und mit "setreading Kalender Ort Home" im Ausführungsteil des Notify könnte es klappen, aber was das Notify triggern könnte, musst Du uns schon ein bisschen verraten.
Ich würde es eher mit einem UserReading versuchen. Das Originalreading also nicht anfassen (falls es kein Dummy sein sollte, ist das ohnehin nciht ratsam) sondern per UserReading in ein weiteres Reading umsetzen. Alles zu userReadings steht in der commandref.
Zitat von: marvin78 am 29 April 2015, 09:39:36
Das Originalreading also nicht anfassen (falls es kein Dummy sein sollte, ist das ohnehin nciht ratsam)
wie ich inzwischen leidvoll feststellen musste, stimmt natürlich.
Zitat
sondern per UserReading in ein weiteres Reading umsetzen.
Userreading kann man meines Wissens dazu nutzen, um vom Device ausgehend Informationen zu sammeln und in eine eigene lesbare Form zu bringen, aber ein Eingriff von außen dürfte letztlich genaus scheitern. Außer man definiert im Userrreading eine Bedingung, die man von außen beeinflussen kann.
Der TE wollte außerdem ein bestimmtes Reading verändern und nicht ein neues definieren. An der Lösung bin ich genauso interessiert, weil mich derzeit ähnliche Fragestellungen beschäftigen ...
Wie kommst du darauf, dass zwingend ein Eingriff von außen notwendig ist? Das Reading "Ort" wird in einem Device offenbar in gewissen Abständen aktualisiert. Ein userReading kann also triggern, wenn das passiert und abhängig vom Inhalt ein weiteres Reading setzen. Ob er nun das ursprüngliche Reading, oder ein neues Reading nutzt, um etwas darzustellen oder etwas weiteres zu triggern, ist dabei egal. Man muss es nur umstellen.
Nochmal: Das original Reading ändern, ist meistens keine gute Idee. Dafür gibt es ja userReadings.
Ob meine Vermutung stimmt, hängt davon ab, was der Threadersteller da überhaupt genau macht, um was für Devices es sich handelt usw. Solange man keine genaueren Infos bekommt, hilft nur raten. Es kann auch sein, dass er schon ein notify hat, um das Reading "Ort" zu setzen. Ein weiteres notify wäre dann sinnlos. Man könnte das bestehende erweitern.
Ein Reading setz man übrigens über
setreading DEVICE READING VALUE
hier noch die gewünschten Infos:
ich habe ein CALVIEW-Device "AlleKalender" bestehend aus zwei Kallendern mit unter anderem folgenden Readings: t_001_location, t_002_location, usw.
define AlleKalender CALVIEW Familienkalender,Abfuhrkalender 2 3600
-da mir mein Abfuhrkalender den ich als Datei abrufe einen riesig langen Wert aus Straße und Ort in das Reading "..._location" schreibt möchte ich diesen Wert dann auf "Home" ändern.
-da ich dieses Reading in Smartvisu auslese brauche, muß auch dieses Reading geändert werden. Es stehen ja auch andere Orte in dem Reading die nicht aus dem Abfallkalender sonder aus dem Familienkalender kommen und dann nicht "Meine Straße / Ort" im Reading "..._location" haben.
Gruß, Sascha
Nun. Dann mache doch ein notify auf das spezielle Reading und setze es neu. Aber nochmal: Ich würde immer ein neues Reading dafür verwenden (und das dann auch in SmartVisu einsetzen). Dass man ein Reading nur in einem Fall ändert, heißt ja nicht, dass man nicht auch den Originalwert in das neue Reading schreiben kann
Sowas hier würde gehen
attr AlleKalender userReadings location:t_001_location {"Home"?ReadingsVal($name,"t_001_location",0) eq "Hinter den Bergen 1, Buxtehude":ReadingsVal($name,"t_001_location",0)}
Dafür muss aber t_001_location auch ein Event erzeugen.
anscheinend erzeugt t_001_location kein Event. Der Readingswert wird nicht geändert.
wenn ich ein neues Reading für ..._location erstelle, dann müssen alle Werte in das neue Reading kopiert werden, es sei denn der Wert ist "Hinter den Bergen 1, Buxtehude" dann muß der Wert auf "Home" geändert werden.
Dafür müßte ich dann NOTIFY nehmen aber wie weiter? oder gibt es doch noch einen anderen Weg?
Gruß, Sascha
Was du möchtest, geht mit dem von mir geposteten Userreading.
Mache mal ein List von deinem CalView Device und poste das Ergebnis hier.
Zu notify: Das sind FHEM Grundlagen. Ich empfehle das Einsteiger-PDF, das WIKI und die Commandref zu notify.
hier das Ergebnis von list:
vor einer Minute t_020_summary Restmüll wird abgeholt.
Attributes:
maxreadings 20
room Kalender
userReadings location:t_001_location {"Home"?ReadingsVal($name,"t_001_location",0) eq "Eichenhainallee\, Bergisch Gladbach":ReadingsVal($name,"t_001_location",0)} AlleKalender
NR 544
STATE t: 20 td: 0 tm: 0
TYPE CALVIEW
Readings:
2015-04-29 11:58:08 c-term 20
2015-04-29 11:58:08 c-today 0
2015-04-29 11:58:08 c-tomorrow 0
2015-04-29 11:58:08 location
2015-04-29 11:58:08 state t: 20 td: 0 tm: 0
2015-04-29 11:58:08 t_001_bdate 04.05.2015
2015-04-29 11:58:08 t_001_btime 07:00:00
2015-04-29 11:58:08 t_001_edate 04.05.2015
2015-04-29 11:58:08 t_001_etime 07:10:00
2015-04-29 11:58:08 t_001_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_001_source Abfuhrkalender
2015-04-29 11:58:08 t_001_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_002_bdate 11.05.2015
2015-04-29 11:58:08 t_002_btime 07:00:00
2015-04-29 11:58:08 t_002_edate 11.05.2015
2015-04-29 11:58:08 t_002_etime 07:10:00
2015-04-29 11:58:08 t_002_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_002_source Abfuhrkalender
2015-04-29 11:58:08 t_002_summary Restmüll wird abgeholt.
2015-04-29 11:58:08 t_003_bdate 11.05.2015
2015-04-29 11:58:08 t_003_btime 07:00:00
2015-04-29 11:58:08 t_003_edate 11.05.2015
2015-04-29 11:58:08 t_003_etime 07:10:00
2015-04-29 11:58:08 t_003_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_003_source Abfuhrkalender
2015-04-29 11:58:08 t_003_summary Altpapier wird abgeholt.
2015-04-29 11:58:08 t_004_bdate 18.05.2015
2015-04-29 11:58:08 t_004_btime 07:00:00
2015-04-29 11:58:08 t_004_edate 18.05.2015
2015-04-29 11:58:08 t_004_etime 07:10:00
2015-04-29 11:58:08 t_004_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_004_source Abfuhrkalender
2015-04-29 11:58:08 t_004_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_005_bdate 18.05.2015
2015-04-29 11:58:08 t_005_btime 07:00:00
2015-04-29 11:58:08 t_005_edate 18.05.2015
2015-04-29 11:58:08 t_005_etime 07:10:00
2015-04-29 11:58:08 t_005_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_005_source Abfuhrkalender
2015-04-29 11:58:08 t_005_summary Gelber Sack / Tonne wird abgeholt.
2015-04-29 11:58:08 t_006_bdate 26.05.2015
2015-04-29 11:58:08 t_006_btime 07:00:00
2015-04-29 11:58:08 t_006_edate 26.05.2015
2015-04-29 11:58:08 t_006_etime 07:10:00
2015-04-29 11:58:08 t_006_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_006_source Abfuhrkalender
2015-04-29 11:58:08 t_006_summary Restmüll wird abgeholt.
2015-04-29 11:58:08 t_007_bdate 01.06.2015
2015-04-29 11:58:08 t_007_btime 07:00:00
2015-04-29 11:58:08 t_007_edate 01.06.2015
2015-04-29 11:58:08 t_007_etime 07:10:00
2015-04-29 11:58:08 t_007_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_007_source Abfuhrkalender
2015-04-29 11:58:08 t_007_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_008_bdate 08.06.2015
2015-04-29 11:58:08 t_008_btime 07:00:00
2015-04-29 11:58:08 t_008_edate 08.06.2015
2015-04-29 11:58:08 t_008_etime 07:10:00
2015-04-29 11:58:08 t_008_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_008_source Abfuhrkalender
2015-04-29 11:58:08 t_008_summary Altpapier wird abgeholt.
2015-04-29 11:58:08 t_009_bdate 08.06.2015
2015-04-29 11:58:08 t_009_btime 07:00:00
2015-04-29 11:58:08 t_009_edate 08.06.2015
2015-04-29 11:58:08 t_009_etime 07:10:00
2015-04-29 11:58:08 t_009_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_009_source Abfuhrkalender
2015-04-29 11:58:08 t_009_summary Restmüll wird abgeholt.
2015-04-29 11:58:08 t_010_bdate 15.06.2015
2015-04-29 11:58:08 t_010_btime 07:00:00
2015-04-29 11:58:08 t_010_edate 15.06.2015
2015-04-29 11:58:08 t_010_etime 07:10:00
2015-04-29 11:58:08 t_010_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_010_source Abfuhrkalender
2015-04-29 11:58:08 t_010_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_011_bdate 15.06.2015
2015-04-29 11:58:08 t_011_btime 07:00:00
2015-04-29 11:58:08 t_011_edate 15.06.2015
2015-04-29 11:58:08 t_011_etime 07:10:00
2015-04-29 11:58:08 t_011_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_011_source Abfuhrkalender
2015-04-29 11:58:08 t_011_summary Gelber Sack / Tonne wird abgeholt.
2015-04-29 11:58:08 t_012_bdate 22.06.2015
2015-04-29 11:58:08 t_012_btime 07:00:00
2015-04-29 11:58:08 t_012_edate 22.06.2015
2015-04-29 11:58:08 t_012_etime 07:10:00
2015-04-29 11:58:08 t_012_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_012_source Abfuhrkalender
2015-04-29 11:58:08 t_012_summary Restmüll wird abgeholt.
2015-04-29 11:58:08 t_013_bdate 29.06.2015
2015-04-29 11:58:08 t_013_btime 07:00:00
2015-04-29 11:58:08 t_013_edate 29.06.2015
2015-04-29 11:58:08 t_013_etime 07:10:00
2015-04-29 11:58:08 t_013_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_013_source Abfuhrkalender
2015-04-29 11:58:08 t_013_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_014_bdate 06.07.2015
2015-04-29 11:58:08 t_014_btime 07:00:00
2015-04-29 11:58:08 t_014_edate 06.07.2015
2015-04-29 11:58:08 t_014_etime 07:10:00
2015-04-29 11:58:08 t_014_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_014_source Abfuhrkalender
2015-04-29 11:58:08 t_014_summary Restmüll wird abgeholt.
2015-04-29 11:58:08 t_015_bdate 06.07.2015
2015-04-29 11:58:08 t_015_btime 07:00:00
2015-04-29 11:58:08 t_015_edate 06.07.2015
2015-04-29 11:58:08 t_015_etime 07:10:00
2015-04-29 11:58:08 t_015_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_015_source Abfuhrkalender
2015-04-29 11:58:08 t_015_summary Altpapier wird abgeholt.
2015-04-29 11:58:08 t_016_bdate 13.07.2015
2015-04-29 11:58:08 t_016_btime 07:00:00
2015-04-29 11:58:08 t_016_edate 13.07.2015
2015-04-29 11:58:08 t_016_etime 07:10:00
2015-04-29 11:58:08 t_016_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_016_source Abfuhrkalender
2015-04-29 11:58:08 t_016_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_017_bdate 13.07.2015
2015-04-29 11:58:08 t_017_btime 07:00:00
2015-04-29 11:58:08 t_017_edate 13.07.2015
2015-04-29 11:58:08 t_017_etime 07:10:00
2015-04-29 11:58:08 t_017_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_017_source Abfuhrkalender
2015-04-29 11:58:08 t_017_summary Gelber Sack / Tonne wird abgeholt.
2015-04-29 11:58:08 t_018_bdate 20.07.2015
2015-04-29 11:58:08 t_018_btime 07:00:00
2015-04-29 11:58:08 t_018_edate 20.07.2015
2015-04-29 11:58:08 t_018_etime 07:10:00
2015-04-29 11:58:08 t_018_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_018_source Abfuhrkalender
2015-04-29 11:58:08 t_018_summary Restmüll wird abgeholt.
2015-04-29 11:58:08 t_019_bdate 27.07.2015
2015-04-29 11:58:08 t_019_btime 07:00:00
2015-04-29 11:58:08 t_019_edate 27.07.2015
2015-04-29 11:58:08 t_019_etime 07:10:00
2015-04-29 11:58:08 t_019_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_019_source Abfuhrkalender
2015-04-29 11:58:08 t_019_summary Biomüll wird abgeholt.
2015-04-29 11:58:08 t_020_bdate 03.08.2015
2015-04-29 11:58:08 t_020_btime 07:00:00
2015-04-29 11:58:08 t_020_edate 03.08.2015
2015-04-29 11:58:08 t_020_etime 07:10:00
2015-04-29 11:58:08 t_020_location Eichenhainallee\, Bergisch Gladbach
2015-04-29 11:58:08 t_020_source Abfuhrkalender
2015-04-29 11:58:08 t_020_summary Restmüll wird abgeholt.
Attributes:
maxreadings 20
room Kalender
userReadings location:t_001_location {"Home"?ReadingsVal($name,"t_001_location",0) eq "Eichenhainallee\, Bergisch Gladbach":ReadingsVal($name,"t_001_location",0)}
Vom Grundsatz habe ich ich NOTIFY verstanden und auch schon zu genüge verbaut. Tue mich aber bei komplexeren Dingen schwer, insbesondere mit Klammern, etc.
Gruß, Sascha
Das userReading sollte funktionieren, wenn t_001_location ein Event erzeugt. Falls nicht, probiere es so:
attr AlleKalender userReadings location {"Home"?ReadingsVal($name,"t_001_location",0) eq "Hinter den Bergen 1, Buxtehude":ReadingsVal($name,"t_001_location",0)}
Bezüglich notify: Falls t_001_location kein Event erzeugt (was ich nicht glaube), dann kann man auf Änderung auch kein notify reagieren lassen.
Ein notify auf Änderung könnte so aussehen:
define NOTIFYNAME notify AlleKalender {setLocation($NAME,"t_001_location")}
Dann eine sub in eine myUtils:
sub setLocation($$) {
my ($dev,$reading) = @_;
my $readingVal=ReadingsVal($dev,$reading,0);
fhem("setreading $dev $reading Home") if ($readingVal eq "Hinter den Bergen 1, Buxtehude"); ##setzt das Reading nur neu, falls der Vergleich stimmt
}
auch diese beiden Lösungen haben leider keinen Erfolg gebracht. Gibt es sonst noch einen Weg? Ansonsten müßte ich mal bei dem CALVIEW-Autor nachfragen ob ein Event erzeugt wird.
Gruß, Sascha
Es erzeugt Events. Sorry, ich habe einen Knick im Hirn. Mein userReading war falsch. Ich habe das Thema mal komplett bei mir nachgestellt und folgendes, korrigiertes userReading funktioniert einwandfrei
attr AlleKalender userReadings location:t_001_location {ReadingsVal($name,"t_001_location",0) eq "Ort"? "Home":ReadingsVal($name,"t_001_location",0)}
langsam ist es echt zum verzweifel. Auch das will bei mir nicht laufen. Könnte es an dem Backslash bzw. dem Komma liegen? So sieht mein Code dann in der Fhem.cfg aus:
attr AlleKalender userReadings location:t_001_location {ReadingsVal($name,"t_001_location",0) eq "Eichenhainallee\, Bergisch Gladbach"? "Home":ReadingsVal($name,"t_001_location",0)}
Gruß, Sascha
Probiere mal folgendes:
attr AlleKalender userReadings location:t_001_location {ReadingsVal($name,"t_001_location",0)=~/^Eichenhainallee/?"Home":ReadingsVal($name,"t_001_location",0)}
Und dann mache ein update deiner CalView.
Du hattest auch noch ein Leerzeichen zu viel.
Danke für deine Mühe. Mit der letzten Version klappt es jetzt. Ich habe nur eine kleine Änderung vorgenommen damit kein neues Reading erstellt wird, sondern das bestehende Reading im Wert geändert wird (der rote Teil. Da stand vorher nur "location"):
attr AlleKalender userReadings [color=red]t_001_location[/color]:t_001_location {ReadingsVal($name,"t_001_location",0)=~/^Eichenhainallee/?"Home":ReadingsVal($name,"t_001_location",0)}
Muß ich jetzt für alle zwanzig (t_001_location, ..., t_020_location) dieses Attribut setzen oder geht das auch einfacher?
Gruß, Sascha
Wenn du das nicht machen möchtest, dann kannst du auf ein notify (statt userReading) gehen und wie das geht, habe ich oben schon gepostet. Ich würde es dann nur wie folgt abändern:
define NOTIFYNAME notify AlleKalender.*t_[0-9]{3}_location {setLocation($NAME,$EVTPART0)}
Und die sub dann auch auf Prüfung eines Regex umstellen
sub setLocation($$) {
my ($dev,$reading) = @_;
my $val=ReadingsVal($dev,$reading,0);
fhem("setreading $dev $reading Home") if ($val =~ /^Eichenhainallee/ );
}
ich kann für ein Device nur einmal das Attribut userReadings nutzen, wenn ich es mehrmals in meine CFG schreibe wird nur das letzte angewendet.
Demnach bleibt mir nur die Möglichkeit mit dem NOTIFY. Leider funktioniert dein letzter Code nicht.
Gruß, Sascha
Das Attribut userReading gibt es auch nur einmal. Hast du wenigstens einmal die commandref zu den Dingen gelesen, die du verwendest? Das setzt ich schon voraus! Mehrere userReadings werden getrennt durch Komma (,) eingetragen.
Und wenn mein Code nicht funktioniert, kann das sein. Ich kann aber nicht helfen, wenn ich nicht weiß, was nicht funktioniert. Hilfreich wäre eine Fehlermeldung, Log etc.
Wie sieht das Event von AlleKalender wirklich aus (Event Monitor). Ein wenig helfen musst du schon...
nachdem das Ganze lange Zeit gelaufen ist (Danke an marvin78), wurde das Reading nach irgendeinem Update nicht mehr geändert.
So habe ich das UserReading aktuell:
attr AlleKalender userReadings t_001_location:t_001_location.* {ReadingsVal($name,"t_001_location",0)=~/^Dornfelder/?"Home":ReadingsVal($name,"t_001_location",0)}
Wie schon anfangs geschrieben, das Reading sieht im Original so aus: "Dornfelder Straße, Dornfeld"
und statt der Straße, Ort soll nur "Home" im Reading stehen. Deshalb per Regex, sobald im Reading "Straße" steht auf "Home" ändern.
Irgendwie zum verzweifeln.
Gruß, Sascha
[/code]
Wofür steht denn das ^ in der Regex?
Zitat von: igami am 30 Juni 2017, 09:20:49
Wofür steht denn das ^ in der Regex?
String beginnt mit
Zitat von: CoolTux am 30 Juni 2017, 09:28:11
String beginnt mit
Das war doch eine Frage für Cybers ;)
Sei String beginnt doch mit Dornfelder
Hatte mich da schon gewundert wieso Du fragst. Aber man kann ja nie alles wissen, von daher. ;D
Sorry. Die "Beispielstraße" war dumm gewählt, habe es jetzt in meinem Code im Beitrag geändert. Was das ^ bedeutet ist mir schon klar.
Hat keiner einen Rat für mich?