FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: raimundl am 17 Dezember 2016, 09:36:02

Titel: HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 17 Dezember 2016, 09:36:02
Hallo Guten Morgen,

obige Sirene liefert unter Sirene_Arm "state: 0 oder 25 oder 100". Ich hätte z.B. statt "100" gerne "scharf" statt "0" "unscharf" .....
Nach intensiven suchen will ich es nun mit "DOIF" und "setreading" lösen, vermute aber das auch eine Lösung mit setzen eines Attributes möglich ist.
Bitte daher um Hinweis.

Danke und LG
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: MadMax-FHEM am 17 Dezember 2016, 10:43:41
Servus,

vielleicht das hier:

https://wiki.fhem.de/wiki/EventMap (https://wiki.fhem.de/wiki/EventMap)

Gruß, Joachim
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 17 Dezember 2016, 14:38:28
Zitat von: MadMax-FHEM am 17 Dezember 2016, 10:43:41
vielleicht das hier:

https://wiki.fhem.de/wiki/EventMap (https://wiki.fhem.de/wiki/EventMap)

Danke Joachim,
ein Schritt weiter: damit konnte ich den "STATE" verändern, noch nicht jedoch die "readings" wie "state"......

Danke und LG
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: ritchie am 18 Dezember 2016, 20:01:34
Hallo,

versuche es mal hiermit. Ich habe mir die Teile vor kurzem besorgt und beginnt jetzt mit dem Einbau in die Software.

FHEM.CFG

define AlarmSignal01_Arm CUL_HM XXXXXXXXX
attr AlarmSignal01_Arm model HM-Sec-Sir-WM
attr AlarmSignal01_Arm peerIDs 00000000,
attr AlarmSignal01_Arm room Alarmanlage
attr AlarmSignal01_Arm group Alarm Signal
attr AlarmSignal01_Arm alias Alarm Signal Status:
attr AlarmSignal01_Arm stateFormat { sprintf("%s", getArmedState("AlarmSignal01_Arm","state"));; }

99_myUtills.pm

#
# get the state of the Alarm horn back
#
sub getArmedState($$)
{
my  $Component = shift;
my  $StatusTag = shift;
my  $AlarmState = "unbekannt";
my  $AlarmStateRaw = 0;

    $AlarmStateRaw = ReadingsVal($Component,$StatusTag,"unbekannt"); # check the mode of the horn

    switch($AlarmStateRaw)
           {
           case     0         { $AlarmState = 'unscharf' ;                }
           case     25        { $AlarmState = 'Alarm scharf (Extern)';       }
           case     100       { $AlarmState = 'Alarm scharf (all)';       }
           case     127.5     { $AlarmState = 'Alarm blocked';            }           
           }

    return  $AlarmState;
}


Gruss R.
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 18 Dezember 2016, 21:01:21
Danke ritchie!

Werde etwas Zeit brauchen um mich bei deinem Beispiel durchzuarbeiten und dann berichten.

Danke und LG

PS.: beim ersten raschen Versuch erhielt ich folgende Fehlermeldung (noch try and error Phase):

Error evaluating Sirene_Arm stateFormat: Undefined subroutine &main::getArmedState called at (eval 103) line 1
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: ritchie am 19 Dezember 2016, 09:07:55
Hi,

da fehlt wohl die Zeile.

use  Switch;

im Header.

Gruss R.
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 19 Dezember 2016, 09:45:10
Danke ritchie!

Habe nun das Perlmodul Switch installiert, die Zeile "use Switch" eingefügt und es funktioniert!
Danke, wieder ein Stückchen dazugelernt.

-Aber, leider wird dadurch wieder nur der  "Internals STATE" verändert und nicht jedoch das "reading state".

LG
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: frank am 19 Dezember 2016, 10:07:27
warum willst du unbedingt etwas in das state reading schreiben? warum baust du dir nicht ein eigenes, zb mit userreadings? state wird doch ständig mit protokollmeldungen, wie zb missing_ack, überschrieben. dein wunsch ist eigentlich sinnlos und überflüssig.

mit setreading kannst du allerdings jedes reading manipulieren/erzeugen.
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 19 Dezember 2016, 10:42:21
Hallo frank!

Du hast recht, ich wollte das Pferd von hinten aufzäumen. Tatsache ist, dass ich für "Quickfhem" ein Reading brauche, das mir den Zustand der Alarmanlage anzeigt. Quickfhem verarbeitet derzeit meines Wissens nur Readings (das sehr einfach und gut) und so war ich dadurch auf "state" fixiert, natürlich auch noch durch entsprechenden Wissensmangel.
Ich brauche daher nur ein "neues Reading" z.B. "zustand" und dieses mit den entsprechenden Werten zu füllen. Die Werte aber müßten irgendwo umgewandelt werden z.B. von 0 auf unscharf, von 100 auf scharf ....

Ich übe mich gerade in "userreadings, Readingsval ..." komme aber noch nicht so richtig weiter.

LG
Titel: (gelöst) HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 19 Dezember 2016, 17:57:53
Danke an alle Beteiligten:

Habe nunmehr ein

userReadings Test { sprintf("%s", getArmedState("Sirene_Arm","state"));; }

und 99_myUtils von @ritchie

angelegt und damit mein Ziel ein Reading mit den Zuständen der Alarmanlage in Textform erreicht.

LG

PS.: nur zum lernen - würde obiges auch ohne 99_myUtils, sondern direkt im {perl code} zu lösen sein?
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: frank am 20 Dezember 2016, 13:13:07
ZitatPS.: nur zum lernen - würde obiges auch ohne 99_myUtils, sondern direkt im {perl code} zu lösen sein?
grundsätzlich schon. du führst ja auch bereits perlcode aus. ob hier use switch funktioniert, kann ich aber nicht sagen. die variante über sub ist bestimmt flexibler.

tip: wenn du noch einen trigger für dein userreading angibst (im prinzip wie die regex beim notify), kannst du das ausführen des userreadings noch reduzieren. siehe commandref.
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 20 Dezember 2016, 21:10:00
Zitat von: frank am 20 Dezember 2016, 13:13:07
tip: wenn du noch einen trigger für dein userreading angibst (im prinzip wie die regex beim notify), kannst du das ausführen des userreadings noch reduzieren. siehe commandref.

Hallo Frank, bitte noch eine Hilfe für den trigger. Habe viel versucht, es gelingt mir aber nicht einen funktionierenden trigger zu setzen. Wie müsste das Attribut mit trigger aussehen?


derzeit: userReadings Zustand  { sprintf("%s", getArmedState("Sirene_Arm","state"));; }

Commandref: <reading>[:<trigger>] [<modifier>] { <perl code> }

Nachstehend div. Daten der Sirene vom Eventmonitor (für ev. trigger):

2016-12-20 21:00:57 CUL_HM Sirene CMDs_pending
2016-12-20 21:00:57 CUL_HM Sirene_Arm set_alarmLevel disarmed
2016-12-20 21:00:57 CUL_HM Sirene_Arm Zustand: unbekannt
2016-12-20 21:00:57 CUL_HM Sirene battery: ok
2016-12-20 21:00:57 CUL_HM Sirene sabotageError: off
2016-12-20 21:00:57 CUL_HM Sirene CMDs_done
2016-12-20 21:00:57 CUL_HM Sirene_Arm deviceMsg: off (to VCCU)
2016-12-20 21:00:57 CUL_HM Sirene_Arm level: off
2016-12-20 21:00:57 CUL_HM Sirene_Arm pct: off
2016-12-20 21:00:57 CUL_HM Sirene_Arm off
2016-12-20 21:00:57 CUL_HM Sirene_Arm timedOn: off
2016-12-20 21:00:57 CUL_HM Sirene_Arm Zustand: unscharf
2016-12-20 21:01:12 CUL_HM Sirene CMDs_pending
2016-12-20 21:01:12 CUL_HM Sirene_Arm set_alarmLevel armAll
2016-12-20 21:01:12 CUL_HM Sirene_Arm Zustand: unbekannt
2016-12-20 21:01:12 CUL_HM Sirene battery: ok
2016-12-20 21:01:12 CUL_HM Sirene sabotageError: off
2016-12-20 21:01:12 CUL_HM Sirene CMDs_done
2016-12-20 21:01:12 CUL_HM Sirene_Arm deviceMsg: on (to VCCU)
2016-12-20 21:01:12 CUL_HM Sirene_Arm level: on
2016-12-20 21:01:12 CUL_HM Sirene_Arm pct: on
2016-12-20 21:01:12 CUL_HM Sirene_Arm on
2016-12-20 21:01:12 CUL_HM Sirene_Arm timedOn: off
2016-12-20 21:01:12 CUL_HM Sirene_Arm Zustand: Alarm scharf (all)


Danke und LG
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: frank am 20 Dezember 2016, 23:04:02
hast du noch eventmap laufen? ich kann die werte aus der sub nirgends sehen. also schätze ich mal, dass die werte zb im reading level kommen. dann könnte es zb so funktionieren:

userReadings Zustand:level.*  { sprintf("%s", getArmedState("Sirene_Arm","level"));; }
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 21 Dezember 2016, 12:18:36
Danke frank,

muss noch etwas herumprobieren.

LG
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 21 Dezember 2016, 12:59:26
Hallo frank!

Es wird nun ein neues "Reading Zustand" erzeugt und abhängig vom Wert "state 0|25|50|100" mit "unscharf|Alarm scharf|..." gefüllt
Beide "userReadings" funktionieren (mit sub in 99_my..) so:

userReadings Zustand  { sprintf("%s", getArmedState("Sirene_Arm","state"));; }
userReadings Zustand:level.*  { sprintf("%s", getArmedState("Sirene_Arm","state"));; }

Wo liegt nun der Unterschied, bzw. was bewirkt der trigger  ":level.*"

Zur Info die 99_myU... von @ritchie, die ich genauso verwende:
#
# get the state of the Alarm horn back
#
sub getArmedState($$)
{
my  $Component = shift;
my  $StatusTag = shift;
my  $AlarmState = "unbekannt";
my  $AlarmStateRaw = 0;

    $AlarmStateRaw = ReadingsVal($Component,$StatusTag,"unbekannt"); # check the mode of the horn

    switch($AlarmStateRaw)
           {
           case     0         { $AlarmState = 'unscharf' ;                }
           case     25        { $AlarmState = 'Alarm scharf (Extern)';       }
           case     100       { $AlarmState = 'Alarm scharf (all)';       }
           case     127.5     { $AlarmState = 'Alarm blocked';            }           
           }

    return  $AlarmState;
}


Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: frank am 21 Dezember 2016, 14:34:02
ZitatuserReadings
A comma-separated list of definitions of user-defined readings. Each definition has the form:

    <reading>[:<trigger>] [<modifier>] { <perl code> }

After a single or bulk readings update, the user-defined readings are set by evaluating the perl code { <perl code> } for all definitions and setting the value of the respective user-defined reading <reading> to the result. If <trigger> is given, then all processing for this specific user reading is only done if one of the just updated "reading: value" combinations matches <trigger>, which is treated as a regexp.
Examples:

    attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
    attr myMultiMeter userReadings energy1:counters.A.* { ReadingsVal("myMultiMeter","counters.A",0)/1250.0;; }, energy2:counters.B.* { ReadingsVal("myMultiMeter","counters.B",0)/1250.0;; }

userreadings werden durch events des devices getriggert/berechnet. mit dem trigger kannst du auf spezielle events filtern. das userreading muss ja zb nicht bei jedem missing_ack berechnet werden. mit dem trigger "level.*" wird dein userreading Zustand also bei jedem event des readings level neu berechnet.
Titel: Antw:HM-Sec-Sir-WM - Sirene - Reading ändern
Beitrag von: raimundl am 21 Dezember 2016, 20:00:05
Hallo Frank,

damit ist das Kapitel "userreadings" für mich vorerst geschlossen.
Werde nun noch lernenderweise es mit DOIF versuchen.

Danke für die Hilfestellung und

LG