Problem bei der Auswertung von User-Readings in 99_myUtils.pm

Begonnen von dt2510, 07 März 2018, 12:54:54

Vorheriges Thema - Nächstes Thema

dt2510

Hallo zusammen,

ich habe meinen Aktoren userreadings hinzugefügt, die eine Automatisierung des Schaltzustandes ermöglichen sollen. Bisher habe ich dafür Dummys verwendet, wollte es aber lieber beim Aktor selbst speichern.

Mein System kennt folgende Zustände:

- AwayDay
- AwayNight
- BedDay
- BedNight
- HomeDay
- HomeNight
- HolidayDay
- HolidayNight

Diese resultieren aus dem Inhalt folgender Dummies:
#FHEM Anlagenmodus

define FHEMMode dummy
attr FHEMMode group Anlagenstatus
attr FHEMMode room _ Variablen
attr FHEMMode setList Day Night

#HomeStatus

define HomeStatus dummy
attr HomeStatus group Anlagenstatus
attr HomeStatus room _ Variablen
attr HomeStatus setList Home Bed Away Holiday


Beim Device habe ich die User-Readings folgendermaßen hinzugefügt und vorbelegt:
define PowerNode_ID8 ZWave xxxxxxxx 8
attr PowerNode_ID8 userattr HomeDay HomeNight HomeAuto BedDay BedNight BedAuto AwayDay AwayNight AwayAuto HolidayDay HolidayNight HolidayAuto
attr PowerNode_ID8 AwayAuto on
attr PowerNode_ID8 AwayDay on
attr PowerNode_ID8 AwayNight off
attr PowerNode_ID8 BedAuto on
attr PowerNode_ID8 BedDay off
attr PowerNode_ID8 BedNight off
attr PowerNode_ID8 HolidayAuto on
attr PowerNode_ID8 HolidayDay off
attr PowerNode_ID8 HolidayNight off
attr PowerNode_ID8 HomeAuto on
attr PowerNode_ID8 HomeDay off
attr PowerNode_ID8 HomeNight off
attr PowerNode_ID8 IODev AeonGen5
attr PowerNode_ID8 alias Beleuchtung CD-Regal
attr PowerNode_ID8 classes SWITCH_BINARY METER MANUFACTURER_SPECIFIC VERSION BASIC ALARM CONFIGURATION SWITCH_ALL ASSOCIATION INDICATOR PROTECTION CRC_16_ENCAP
attr PowerNode_ID8 group Beleuchtung
attr PowerNode_ID8 icon light_cabinet
attr PowerNode_ID8 room Arbeitszimmer,_ZWave


In der 99_myUtils.pm werden mein Variablen folgendermaßen bestückt:
  my ($myDevice) = @_;
  my $myHomeStatus = Value("HomeStatus");
  my $myFHEMMode = Value("FHEMMode");
  my $myCurrentState = $myHomeStatus.$myFHEMMode;
  my $myDefault = ReadingsVal($myDevice,$myCurrentState,"off");
  my $myDay = ReadingsVal($myDevice,$myHomeStatus."Day","off");
  my $myNight = ReadingsVal($myDevice,$myHomeStatus."Night","off");
  my $myAuto = ReadingsVal($myDevice,$myHomeStatus."Auto","off");


Als Ergebnis sollten also folgende Werte eingestellt sein (HomeStaus = "Away", FHEMMode = "Day"):

$myCurrentState "AwayDay"
$myDefault "on" (aus User-Reading "AwayDay")
$myDay "on" (aus User-Reading "AwayDay")
$myNight "off" (aus User-Reading "AwayNight")
$myAuto "on" (aus User-Reading "AwayAuto")

$myCurrentState hat den korrekten Wert "AwayDay", allerdings haben alle anderen Variablen den Inhalt "off" ! Wo liegt mein Fehler ?

KernSani

Du hast Attribute - die liest man mit AttrVal aus


Kurz, weil mobil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

dt2510


nils_

Zitat von: dt2510 am 07 März 2018, 12:54:54
ich habe meinen Aktoren userreadings hinzugefügt, ...

Zitat von: KernSani am 07 März 2018, 12:58:48
Du hast Attribute - die liest man mit AttrVal aus

vielleicht solltest du nochmal ein bisschen was zu userReadings lesen.  :o
nicht das du was anderes wolltest und da am ende irgendwas bei raus kommt.
viele Wege in FHEM es gibt!

dt2510

nö, das passt schon - habe natürlich userattr gemeint

dt2510

jetzt hab' ich noch 'ne blöde Frage ... mit AttrVal lese ich die Attribute aus - kann ich die auch setzen und wenn ja, welchen Status haben sie nach einem Neustart (werden in der fhem.cfg vorbelegt) ?

CoolTux

attr DEVICENAME ATTRIBUT VALUE

und wenn Du kein save danach machst hast Du immer das rote Fragezeichen und nach Neustart ist alles weg
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dt2510

das wäre der Befehl in der Oberfläche ... mir ging es ja um das Setzen des Attributes aus der 99_myUtils.pm heraus, also den Perl-Befehl und die Frage ob DANN das Attribut gesichert wird

CoolTux

Entweder fhem("attr DEVICENAME ATTRIBUT VALUE");

Oder wenn Du ein ganz harter Hund sein willst

CommandAttr(undef,'DEVICENAME ATTRIBUT VALUE');
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

hier mal mit Beispiel

CommandAttr(undef,'HomeMatic configTempFile Winter.cfg,UrlaubIn.cfg,UrlaubOut.cfg,WinterFROST.cfg') if( $tempList eq 'Winter' );
CommandAttr(undef,'HomeMatic configTempFile UrlaubIn.cfg,Winter.cfg,UrlaubOut.cfg,WinterFROST.cfg') if( $tempList eq 'Urlaub' );
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

Verständnisfrage:

Wäre es nicht besser, hier mit readings zu arbeiten statt mit attr?

Kann man genauso setzen und auslesen, gibt aber nicht diese unschönen Fragezeichen, und wird im statefile gespeichert, oder? Man muß es nur einheitlich machen, und ich bin mir nicht sicher, ob dann Einstellmöglichkeiten über Readingsgroup usw. genauso bestehen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

dt2510

#11
readings wären mir auch recht, vielleicht schildere ich mal meinen Fall.

Ich werte meinen Bewegungsmelder an der Haustür mit zwei Events aus

define ZWaveID16_MotionStart notify ZWaveID16:alarm:.HomeSecurity:.Motion.*  {MotionStart()}
define ZWaveID16_MotionEnd notify ZWaveID16:alarm:.HomeSecurity:.Event.*  {MotionEnd()}


In MotionStart passiert folgendes:
- der Dummy ZWaveID16_Motion wird auf "on" gesetzt und triggert ein Popup-Widget in TABLETUI (Kamerabild)
- der Schaltzustand der Lampe im Eingangsbereich wird im Dummy ZWaveID16_SaveState gesichert
- die Lampe im Eingangsbereich wird (sofern es dunkel ist) angeschaltet

In MotionEnd passiert folgendes:
- der Dummy ZWaveID16_Motion wird auf "off" gesetzt und schliesst das Popup-Widget in TABLETUI
- die Lampe im Eingangsbereich wird ausgeschaltet, wenn der Dummy ZWaveID16_SaveState "off" enthält, ansonsten war die Lampe bereits angeschaltet

Um das ganze allgemeiner zu gestalten und für mehrere Bewegungsmelder zu nutzen, würde ich statt der Dummies die Werte gerne beim Device speichern und den Aufruf im Event in der Form
MotionStart(Bewegungsmelder,Lampe,Wert) bzw. MotionEnd(Bewegungsmelder,Lampe,Wert) machen.

Da Inhalte der Dummies sind allerdings eh temporär, wobei es hier egal wäre ob dieser gesichert wird oder nicht.

Beta-User

Was ist denn nun die Frage?

Wenn du Info vorübergehend in einem Readings festhalten willst, geht das doch recht einfach mit setreading().
Nicht so präsent ist mir im Moment, ob ein Reading vorher angelegt sein muß, bevor es befüllt werden kann. Gemacht habe ich das jedenfalls schon, dass ich mit userattr ein Attribut angelegt habe und das dann mit Readings gefüllt, die dann auch wieder von dort zu lesen waren (das hast du wie im Eingangspost dargestellt faktisch auch gemacht, nur dass der Reading-Inhalt eben "undef" war und deswegen der default-Wert zurückkam ("off")).

MaW.: Nimm statt des im Ausgangspost verwendeten "set attr ..."-Befehls setreading(), und schon könnte "alles gut" sein...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

CoolTux

Zitat von: Beta-User am 08 März 2018, 14:18:38
Was ist denn nun die Frage?

Wenn du Info vorübergehend in einem Readings festhalten willst, geht das doch recht einfach mit setreading().

Bitte ohne () setreading ist keine Funktion sondern ein FHEM Befehl.  :)
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

Sorry wg. der Klammer ::) .

War wohl gedanklich auf der perl Ebene aber da heißen die entsprechenden Befehle dann wieder etwas anders...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files