[GELÖST] Wie kann ich einen Wert vor dem Abschicken umrechnen?

Begonnen von Olaf, 14 März 2021, 15:55:47

Vorheriges Thema - Nächstes Thema

Olaf

Ich habe ein KNX Device, welches mit Sekunden arbeitet:
define Lueftung_EG_Boost_Laufzeit KNX 23/0/47:dpt7.005:SetLaufzeit:nosuffix 23/0/46:dpt7.005:LaufzeitS:listenonly:nosuffix

LaufzeitS liefert den aktuellen Wert, über SetLaufzeit wird der Wert geändert (jeweils Angabe in Sekunden).

Ich würde in FHEM lieber mit Minuten arbeiten. Über ein Userreading kann ich mir die eingehenden Werte auch in Minuten umrechnen:
attr Lueftung_EG_Boost_Laufzeit userReadings LaufzeitM {ReadingsNum($name,"LaufzeitS",0) / 60}
attr Lueftung_EG_Boost_Laufzeit stateCmd {(ReadingsNum($name,'LaufzeitS',0) / 60) . ' m'}


Allerdings würde ich auch gerne Werte, die ich eingebe, in Minuten eingeben. Sie müssten dann allerdings vor dem Abschicken in Sekunden umgerechnet werden. Ich vermute, dass dies mit eventMap möglich wäre, aber ich weiß leider nicht wie.

Vielen Dank für Eure Hilfe.

andies

Ich glaube, die Frage versteht keiner. Erstmal bitte die Codes in Tags posten, das sind die Knöppe mit # da oben. Du kannst doch Minuten in Sekunden einfach durch eine Multiplikation mit 60 errechnen, was meinst du denn da mit eventMap?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

erwin

Hi Olaf,
nicht ganz easy, aber lösbar.....
vorerst: SetLaufzeit ist kein "guter" GADNAME! - das gibt einen Konfilt mit der set-option - siehe cmd-ref:
The optional parameteter [gadName] may contain an alias for the GAD. The name must not cotain one of the following strings: on, off, on-for-timer, on-until, off-for-timer, off-until, toggle, raw, rgb, string, value, set, get, listenonly.

dpt7.005 gibt "s" als Einheit in den readings, ist zwar nett, aber mit multiplizieren/dividieren tut man sich schwer  ;D

meine Lösung schaut so aus:

define Lueftung_EG_Boost_Laufzeit KNX 23/0/47:dpt7:LaufzeitSoll:set:nosuffix 23/0/46:dpt7:LaufzeitIst:listenonly:nosuffix
attr Lueftung_EG_Boost_Laufzeit eventMap { usr => {'Laufzeit.(\d+):(\d+)$' => '".sprintf("LaufzeitSoll %d",($1*3600 + $2*60))."' }, fw => {'Laufzeit.(\d+):(\d+)$' => 'Laufzeit'} }
{
  if ($gadName =~ /Laufzeit(Ist|Soll)/x) {
    my $hhmm = sprintf("%d:%d",int($state/3600),int(($state%3600)/60));
    fhem "sleep 0.05; setreading $name Laufzeit $hhmm";
    $hhmm;
  }
  else {
    OldValue($name);
  }
}
attr Lueftung_EG_Boost_Laufzeit webCmd Laufzeit
attr Lueftung_EG_Boost_Laufzeit widgetOverride Laufzeit:time

Als Eingabe hab ich ein widget genommen, dass Stunden:Minuten erlaubt... (ein slider mit 1000 Minuten macht nicht viel Sinn....)
Auf das + Klicken, mit den slidern die Stunden/Minuten einstellen, -anschließend auf das MINUS klicken - fertig!

viel Erfolg
erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Olaf

Hi Erwin,

vielen Dank. Das mit der Umrechnung der Zeit in Sekunden klappt schon wunderbar und die 2 Slider sind in der Tat viel besser als ein Minutenslider.

Und vielen Dank auch für den Hinweis bzgl. des Namens. Das werde ich zukünftig besser beachten.

Womit ich noch nichts anfangen kann, ist dieser Code:
{
  if ($gadName =~ /Laufzeit(Ist|Soll)/x) {
    my $hhmm = sprintf("%d:%d",int($state/3600),int(($state%3600)/60));
    fhem "sleep 0.05; setreading $name Laufzeit $hhmm";
    $hhmm;
  }
  else {
    OldValue($name);
  }
}


Die Zeilen muss ich sicherlich noch mit \ abschließen, aber fehlt da nicht noch etwas am Anfang? eventMap ist ja schon abgeschlossen.

So bekomme ich jedenfalls den Fehler
Unknown command {

erwin

Hi Olaf,
offensichtlich wars gestern sehr spät, copy&paste Fehler!
richtig wär gewesen:
attr Lueftung_EG_Boost_Laufzeit stateCmd
{
  if ($gadName =~ /Laufzeit(Ist|Soll)/x) {
    my $hhmm = sprintf("%d:%d",int($state/3600),int(($state%3600)/60));
    fhem "sleep 0.05; setreading $name Laufzeit $hhmm";
    $hhmm;
  }
  else {
    OldValue($name);
  }
}

statecmd - übersetzt hereinkommende daten im Normalfall nach state. Hier wird auch das reading Laufzeit  mit dem Wert versorgt, damit der Timeslider immer den korrekten (letzten) Wert anzeigt!
Eingabe ist am einfachsten wenn du in das statecmd-Feld klickst, da geht ein großes fenster auf - da mit copy/paste den text hinein. - natürlich ohne die 1.zeile (attr ...).
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Olaf

Hi Erwin,

nochmals vielen Dank. Aus irgendeinem Grund will das bei mir so aber noch nicht. Wenn ich den Code so einbaue:
attr Lueftung_EG_Boost_Laufzeit stateCmd {\
  if ($gadName =~ /Laufzeit(Ist|Soll)/x) {\
    my $hhmm = sprintf("%d:%d",int($state/3600),int(($state%3600)/60));;\
    fhem "sleep 0.05; setreading $name Laufzeit $hhmm";;\
    $hhmm;;\
  }\
  else {\
    OldValue($name);;\
  }\
}


bekomme ich den Fehlerhinweis, ich solle $name zuerst definieren. Wenn ich $name dann durch Lueftung_EG_Boost_Laufzeit ersetze, kann ich das Attribut zwar ohne Fehler speichern, aber das Reading Laufzeit wird nicht korrekt gesetzt. Er scheint immer in die "else" Schleife zu laufen.

Ich habe es jetzt so gemacht:

attr Lueftung_EG_Boost_Laufzeit stateCmd {sprintf("%02s:%02s",int(ReadingsVal($name,'LaufzeitIst',0)/3600),int((ReadingsVal($name,'LaufzeitIst',0)%3600)/60))}
attr Lueftung_EG_Boost_Laufzeit userReadings Laufzeit {sprintf("%02s:%02s",int(ReadingsVal($name,'LaufzeitIst',0)/3600),int((ReadingsVal($name,'LaufzeitIst',0)%3600)/60))}


Damit geht es. Hier funktioniert auch $name.

erwin

Hi,
bin jetzt nicht sicher, wie du das eingegeben hast.....
wenn du in der attr statecmd - edit funktion bist, dann dürfen dort kein doppelten ;; und auch keine \ vorkommen!
siehe mein screenshot:

aber wenns so auch geht, ist's ja ok!
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...