In Perl eine Zahl aus einem Ausdruck filtern, wie?

Begonnen von franky08, 10 September 2013, 20:14:35

Vorheriges Thema - Nächstes Thema

franky08

Hallo, nachdem ich jetzt eine geraume Zeit in einer Perl Dokumentation gelesen habe aber daraus nicht ganz schlau geworden bin, habe ich folgende Frage: Wie kann ich aus: {if (ReadingsVal("Differenz_2_1","state","99")>2)} aus dem State nur die Temperatur herausfiltern. {ReadingsVal("Differenz_2_1","state","99")} gibt z.B. T: 3.1 zurück, dass ist eine Differenztemperatur. Ich brauche aber nur den numerischen Wert von T: also nur die Zahl.

kann mir da jemand weiterhelfen?

Viele Grüße Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

in etwa so:my $diff = ReadingsVal("Differenz_2_1","state","99");
$diff =~ m/T:\s*([\d\.]+)/;
$diff = $1;


ein anderes beispiel ist hier: Link

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Danke andre, habe im Moment noch andere Sachen um die Ohren werde morgen damit arbeiten.
Der Wert aus T: steht dann in $1, oder?

Danke Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Hallo andre!
Komme da irgendwie nicht weiter. Der Wert, der von $1 geliefert wird muss in folgenden Code rein:

define Temp_Reading at {\
my $diff = ReadingsVal("Differenz_2_1","state","99");\
$diff =~ m/T:\s*([\d\.]+)/;\
$diff = $1;}
define HerdTmrOn at *22:50:00 {\
{fhem ("define Herd at +*00:02:00 \
{if (Value("$1")>2) \
{fhem(\"set Herdlicht on\")} \
else {fhem(\"set Herdlicht off\")}\
}\
")\
}}
define HerdTmrOff at *23:15:00 {fhem ("delete Herd")}
define HerdAUS at *23:15:30 set Herdlicht off

at erwartet eine Zeitangabe aber ich weis nicht wie es sonst zu lösen ist.

Vielen Dank, Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

ich bin mir nicht sicher was du genau vor hast.... vielleicht beschreibst du es mal in worten.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Hallo Andre!

Also, ein Differenztemperatursensor (Differenz_2_1) wertet über die 2 Messfühler einmal die Umgebungstemp. und einmal die Temperatur über einem Herd aus. Wenn der Herd eingeschaltet wird und über dem Herd die Temperatur ansteigt soll ein Aktor (Herdlicht) geschaltet werden.
Der Sensor liefert in den Readings leider nur den State und keine "temperature" Hier in dem Code von gestern stehen nur noch die Zeiten vom testen drinne.
 define HerdTmrOn at *22:50:00 um die Zeit startet das Ganze (wie ein drübergebauter Timer)
define Herd at +*00:02:00 es wird alle 2 Minuten das Herdlicht geschaltet oder eben nicht geschaltet
ReadingsVal("Differenz_2_1","state","99") soll die Temperaturdifferenz liefern
Vielleicht könnte man das ganze über ein notify lösen, damit nicht alle 2 min. on oder off geschaltet werden muss (Air-Last)
Gruß Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

ob ein notify besser ist hängt von einem sensort ab und wie oft er sendet bzw. ob er z.b. sendet wenn sich die temperatur ändert oder regelmässig.

es gibt viele möglichkeiten dein problem zu lösen. du kannst z.b. vorher prüfen ob die lampe schon den zustand hat dein sie haben soll und nichts tun. oder on-for-timer verwenden um sicher zu stellen das sie auch aus geht falls das thermometer ein paar werte überspringt.

das schalten ist aber im prinzip immer gleich:my $diff = ReadingsVal("Differenz_2_1","state","99");
$diff =~ m/T:\s*([\d\.]+)/;

if( $1>2 ) {
  fhem( "set Herdlicht on" );
} else {
  fhem( "set Herdlicht off" );
}


das kannst du entwerder in ein notify packen oder alle 2 minuten ausführen. in beiden fällen solltest du z.b. am anfang prüfen ob es hell ist ( isday() ) oder du nicht im zeitintervall bist in dem du schalten möchtest und direkt mit return zurück springen. und ein mal kurz nach ende des intervalls aus schalten.

wenn du es in ein at packst und on-for-timer verwendest musst du dich ums off nicht kümmern.

am besten legst du dein at oder notify mit einem leeren {} an und gibst den code dann direkt im web frontend mit einem klick auf DEF in der detail ansicht ein. dann musst du dich um \ oder doppelte ;; nicht selber kümmern.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Hallo Andre, bin eben mal schnell von Arbeit nach Hause um es zu testen. Eine Timer brauche ich eigentlich nicht der Code soll, egal zu welcher Tages-oder Nachtzeit ausgeführt werden. Habe den Code im web Frontend, in DEF eingegeben. Leider schaltet der Aktor aber nicht. In der fhem.cfg steht jetzt folgendes:

#Herdlicht schalten
#
define HerdlichtOn notify DiffTemp {my $diff = ReadingsVal("Differenz_2_1","state","99");;\
$diff =~ m/T:\s*([\d\.]+)/;;\
\
if( $1>2 ) {\
  fhem( "set Herdlicht on" );;\
} else {\
  fhem( "set Herdlicht off" );;\
}}
#
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

das schaut erst mal nicht schlecht aus.

- schau im event viewer ob du events vom temperatursensor bekommst

- schau im log file ob du etwas siehst

- du kannst ein Log 3, "$1"; vor dem if einbauen und im log schauen ob das extrahieren richtig funktioniert.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

ach ja: wenn du wirklich immer schalten möchtest unabhängig von der tageszeit bietet sich auch das threshold modul an.

das führt genau ein mal einen schaltvorgang duch wenn ein grenzwert über bzw unterschritten wird.ohne immer wieder zu schalten wenn sich am zustand nichts ändert.

damit du ein reading bekomms das threshold auch auswerten kann brauchst du ein passendes reding im device. das ist aber kein problem. das kannst du dir mit einem userReading selber hinzufügen.

ich würde fast vorschlagen das du damit anfängst. das userReading kannst du später auch in einem notify verwenden. entweder direkt als differenz temperatur oder sogar auf 0 und 1 umgerechnet und mit event-on-change reading auch so beschränken das es keine überfüssigen schaltvorgänge gibt.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

du kannst es z.b. links unten unter logfile lesen.

gruss
  andre

ps: das leerzeichen zwischen Log und 3 ist wichtig.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Das Leerzeichen ist OK. Im Logfile tauch nichts auf Mhh. Im Eventmonitor stehen alle 4 Channels vom Sensor:
2013-09-11 12:55:12 CUL_HM Differenz_1_2 T: -3.2
2013-09-11 12:55:12 CUL_HM Differenz_2_1 T: 3.2
2013-09-11 12:55:12 CUL_HM Temperatur_1 T: 23.0
2013-09-11 12:55:12 CUL_HM Temperatur_2 T: 26.2

Im Logfile steht nichts, was den Sensor oder den Aktor betrifft:
2013.09.11 12:42:14 0: Server shutdown
2013.09.11 12:42:21 1: Including /var/InternerSpeicher/tools/fhem/fhem.cfg
2013.09.11 12:42:22 3: telnetPort: port 7072 opened
2013.09.11 12:42:23 3: WEB: port 8083 opened
2013.09.11 12:42:23 3: WEBphone: port 8084 opened
2013.09.11 12:42:23 3: WEBtablet: port 8085 opened
2013.09.11 12:42:23 2: HMLAN_Parse: HMLAN1 new condition disconnected
2013.09.11 12:42:23 3: Opening HMLAN1 device 192.168.2.222:1000
2013.09.11 12:42:23 3: HMLAN1 device opened
2013.09.11 12:42:23 2: HMLAN_Parse: HMLAN1 new condition init
2013.09.11 12:42:28 1: Including ./log/fhem.save
2013.09.11 12:42:28 1: usb create starting
2013.09.11 12:42:28 1: usb create end
2013.09.11 12:42:28 2: SecurityCheck:  WEB,WEBphone,WEBtablet has no basicAuth attribute. telnetPort has no password/globalpassword attribute.  Restart fhem for a new check if the problem is fixed, or set the global attribute motd to none to supress this message.
2013.09.11 12:42:28 0: Server started with 63 defined entities (version $Id: fhem.pl 3872 2013-09-07 11:58:33Z rudolfkoenig $, os linux, user fhem, pid 22010)
2013.09.11 12:42:33 3: Device Diff_Temp_Sensor added to ActionDetector with 000:10 time
2013.09.11 12:42:33 3: Device IR_Sensor added to ActionDetector with 000:10 time
2013.09.11 12:42:33 3: Device Schalter_Tuer added to ActionDetector with 028:00 time
2013.09.11 12:42:33 3: Device THSensor added to ActionDetector with 000:10 time
2013.09.11 12:46:21 2: HMLAN_Parse: HMLAN1 new condition ok
2013.09.11 12:47:05 1: 192.168.2.222:1000 disconnected, waiting to reappear
2013.09.11 12:47:05 1: 192.168.2.222:1000 reappeared (HMLAN1)
2013.09.11 12:47:05 2: HMLAN_Parse: HMLAN1 new condition init
2013.09.11 12:50:54 2: HMLAN_Parse: HMLAN1 new condition ok

Auszug aus der fhem.cfg:
#Herdlicht schalten
#
define HerdlichtOn notify DiffTemp {my $diff = ReadingsVal("Differenz_2_1","state","99");;\
$diff =~ m/T:\s*([\d\.]+)/;;\
Log 3, "$1";;\
if( $1>1 ) {\
  fhem( "set Herdlicht on" );;\
} else {\
  fhem( "set Herdlicht off" );;\
}}
#define HerdTmrOff at *10:30:00 {fhem ("delete Herd")}
#define HerdAUS at *12:00:30 set Herdlicht off
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

dein notify ist falsch. die syntax ist define <name> notify <device>[:event]. dein device ist Differenz_2_1 und dein reading ist T.

du brauchst den genzen kram mit der regex überhaupt nicht. in %EVENT steht direkt dein temperatur wert.

also:define HerdlichtOn notify Differenz_2_1 {
if( %EVENT >1 ) {\
fhem( "set Herdlicht on" );;\
} else {\
fhem( "set Herdlicht off" );;\
}}

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968