smartVISU visu.js uzsu mit Bedingung?

Begonnen von Hans Franz, 21 Februar 2015, 13:43:04

Vorheriges Thema - Nächstes Thema

Muk.s

Zitat...
Ich bin noch dafür, auf die Eingabe der {} zu verzichten, weil es die Condition auch nicht will. Dann besser beide perl strings ohne {} und die Funktion fügt das hinzu, wenn nötig.
...

Eigentlich braucht man die {} ja nur wenn die condition einen fhem Befehl enthält.
Könnte man so lösen:

if (substr(trim($perlString),0,4) eq "fhem") {
  $weekdays = $weekdays.'  {'.$perlString.'}';
} else {
  $weekdays = $weekdays.' ('.$perlString.')';
}


Der delayedExecCondition sollte es eigentlich nicht schaden grundsätzlich in {} gekabselt zu werden.

Was meinst Du?

Muk.s

Irgendwo steckt noch ein clitch drin  >:(

chk.uzsu return value: unexpected end of string while parsing JSON string, at character offset 1338 (before "(end of string)") at ./FHEM/99_fronthemUtils.pm line 37

bgewehr

Ich schaue mir den Code an und probier mal, ob ich den Fehler finde.

Ich hätte es gern so, dass der Benutzer in beiden Fällen die Eingaben identisch vornehmen kann, auch für den Perl-String. Deswegen möchte ich die {} durch die Funktion bei der delayedcondition hinzufügen lassen, wenn erforderlich und nicht durch den Benutzer.

Bei der Condition braucht man ja keine {}, weil der WDT Code schon ein eval() ausführt.



FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Muk.s

Habe noch ein wenig am code geschraubt.

Als perl string bei der condition und der delayedExecCond ist nun folgende Eingabe möglich:
   
ReadingsVal("device2check","state","") eq "off"

oder dies hier
fhem("set DEVICE_X $EVENT") if( Value("device2check") eq "on" )  (damit kann ich einen dummy als wdt device nutzen und ein anderes device - oder auch mehrere - schalten ohne den Umweg über ein notify zu gehen)

wers mag, kann den perlString aber auch zwischen { }, ( ), oder auch {( )} packen.
Wird im code abgefangen.   


Mit den einzelnen WDT's pro Zeile kann ich mich wohl doch anfreunden  :) . Damit ich aber auch im FHEMWEB Frontend einen Überblick der einzelnen WDT Defs habe, wird im Raum UZSU für jedes device noch eine readingsgroup erstellt.

Ich habe den code auch noch dahingehend angepasst, das die condition in einer seperaten Variablen mitgeführt wird.

Hier mal meine letzte Version:

###############################################################################
#
# Umsetzen der UZSU-Settings für ein device
# for use with UZSU widget V4.4
#
###############################################################################
sub UZSU_execute($@)
{
my ($device, $uzsu) = @_;
my $weekdays = "";
my $condition = "";
my $delayedExec ="";
my $perlString = "";

$uzsu = decode_json($uzsu);

fhem('delete wdt_uzsu_'.$device.'.*');

for(my $i=0; $i < @{$uzsu->{list}}; $i++) {
     $weekdays = $uzsu->{list}[$i]->{rrule};
     $weekdays = substr($weekdays,18,50);
$delayedExec = "";
$condition = "";

     # if the structure contains the holidays list, use it!
     if ($uzsu->{list}[$i]->{holiday}->{weekend}) {
if ($weekdays ne '') {
$weekdays = $weekdays . ',';
}
      $weekdays = $weekdays . '$we';
     }
     if ($uzsu->{list}[$i]->{holiday}->{work}) {
if ($weekdays ne '') {
$weekdays = $weekdays . ',';
}
      $weekdays = $weekdays . '!$we';
     }
     
     if ($uzsu->{list}[$i]->{event} eq 'time'){
         $weekdays = $weekdays.'|'.$uzsu->{list}[$i]->{time}.'|'.$uzsu->{list}[$i]->{value};
     } else {
         # Bugfix below: because sunset_abs from 99_sunrise_el does not work if max-time = ""
         if ($uzsu->{list}[$i]->{timeMin} ne '' and $uzsu->{list}[$i]->{timeMax} ne '') {
             $weekdays = $weekdays.'|{'.$uzsu->{list}[$i]->{event}.'_abs("REAL",'.$uzsu->{list}[$i]->{timeOffset} * 60 .',"'.$uzsu->{list}[$i]->{timeMin}.'","'.$uzsu->{list}[$i]->{timeMax}.'")}|'.$uzsu->{list}[$i]->{value};
         } else {
             $weekdays = $weekdays.'|{'.$uzsu->{list}[$i]->{event}.'_abs("REAL",'.$uzsu->{list}[$i]->{timeOffset} * 60 .',,)}|'.$uzsu->{list}[$i]->{value};
         }
     }
     
     # if the structure contains a condition, use it!
if ($uzsu->{list}[$i]->{condition}->{active}) {
    if ($uzsu->{list}[$i]->{condition}->{type} eq 'Perl') {
Log 4,  'uzsu Perl-Condition\n';
$perlString = trim($uzsu->{list}[$i]->{condition}->{devicePerl});
Log 4, 'uzsu ' .  $perlString;
#$perlString =~ s/\\"/"/ig;
#Log 4, 'uzsu ' .  $perlString;
                # remove leading '{' and trailing '}'
                if (substr($perlString,0,1) eq "{" && substr($perlString,length($perlString)-1,1) eq "}") {
                   $perlString = trim(substr($perlString,1,length($perlString)-2));
                }
                # remove leading '(' and trailing ')'
                if (substr($perlString,0,1) eq "(" && substr($perlString,length($perlString)-1,1) eq ")") {
                   $perlString = trim(substr($perlString,1,length($perlString)-2));
                }
                if (substr($perlString,0,4) eq "fhem") {
                   $condition = ' {'.$perlString.'}';
                } else {
         $condition = ' ('.$perlString.')';
                }
Log 4, 'uzsu '.$weekdays.' '.$condition;
      } else {
Log 4, 'uzsu non-Perl-Condition\n';
      $condition = ' (ReadingsVal("'.$uzsu->{list}[$i]->{condition}->{devicePerl}.'","state","") '.$uzsu->{list}[$i]->{condition}->{type}.' "'.$uzsu->{list}[$i]->{condition}->{value}.'")';
      }
     }

    # if the structure contains a delayedExec, use it!
if ($uzsu->{list}[$i]->{delayedExec}->{active}) {
    if ($uzsu->{list}[$i]->{delayedExec}->{type} eq 'Perl') {
Log 4,  'uzsu Perl-Condition\n';
$perlString = trim($uzsu->{list}[$i]->{delayedExec}->{devicePerl});
Log 4, 'uzsu ' .  $perlString;
#$perlString =~ s/\\"/"/ig;
#Log 4, 'uzsu ' .  $perlString;
                # remove leading '{' and trailing '}'
                if (substr($perlString,0,1) eq "{" && substr($perlString,length($perlString)-1,1) eq "}") {
                   $perlString = trim(substr($perlString,1,length($perlString)-2));
                }
                # remove leading '(' and trailing ')'
                if (substr($perlString,0,1) eq "(" && substr($perlString,length($perlString)-1,1) eq ")") {
                   $perlString = trim(substr($perlString,1,length($perlString)-2));
                }
      $delayedExec = '{ ('.$perlString.') }';
#Log 4, 'uzsu ' , $delayedExec;
      } else {
Log 4, 'uzsu non-Perl-Condition\n';
      $delayedExec = '{ (ReadingsVal("'.$uzsu->{list}[$i]->{delayedExec}->{devicePerl}.'","state","") '.$uzsu->{list}[$i]->{delayedExec}->{type}.' "'.$uzsu->{list}[$i]->{delayedExec}->{value}.'") }';
      }
     }


     if ($uzsu->{list}[$i]->{active}){
         fhem('defmod wdt_uzsu_'.$device.'_'.$i.' WeekdayTimer '.$device.' en '.trim($weekdays.$condition));
         fhem('attr wdt_uzsu_'.$device.'_'.$i.' room UZSU');
         fhem('attr wdt_uzsu_'.$device.'_'.$i.' group '.$device);
         fhem('setreading wdt_uzsu_'.$device.'_'.$i.' weekdays '.trim($weekdays) );
         fhem('defmod rg_uzsu_'.$device.' readingsgroup wdt_uzsu_'.$device.'.*');
         fhem('attr rg_uzsu_'.$device.' room UZSU');
if ($delayedExec) {
  fhem('attr wdt_uzsu_'.$device.'_'.$i.' delayedExecutionCond '.$delayedExec);
}
     }
     #fhem('save');   # use only if you want to save WDT settings immediately.
}
}

package fronthem;
use strict;
use warnings;

   

thorschtn

Das sieht ja Klasse aus, das brauch ich auch.

Musste ich gleich ausprobieren und habe mir die v2.5 des UZSU Widgets https://github.com/mworion/uzsu_widget und die letzte Version von Bernds fronthemUtils.pm https://github.com/bgewehr/fronthem-1/tree/patch-3/FHEM eingebaut und ein paar neue UZSU definiert.

Im Weekdaytimer tauchen aber noch keine $we oder $!we auf, der kennt immer noch nur So-Sa - fehlt mir noch was?

Viele Grüße

thorschtn
NUC - FHEM & HA
MapleCUN, Homematic, 433MHz, AB440, 1-Wire Bewässerung & Pool, Jarolift (Signalduino), Signal Messenger, Denon AVR, LG WebOS, AmazonEcho, Jura S90 (ESP8266), Sonoff, Xiaomi Mii Sauger, Worx SO500i

bgewehr

Nimm den Code hier aus dem Thread, der passt zur 4.5! Mein fork ist noch von vorher, passe ich die Tage erst an...
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

thorschtn

#51
Danke für die schnelle Antwort. hab aber bereits  den Code von Muk.s eingebaut und keid $we im WDT!?


Dafür aber lauter Fehlermeldungen im Log:
2016.03.26 23:13:06 2: Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 510) line 1.
NUC - FHEM & HA
MapleCUN, Homematic, 433MHz, AB440, 1-Wire Bewässerung & Pool, Jarolift (Signalduino), Signal Messenger, Denon AVR, LG WebOS, AmazonEcho, Jura S90 (ESP8266), Sonoff, Xiaomi Mii Sauger, Worx SO500i

bgewehr

Was steht im global Device unter holiday2we?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

thorschtn

holiday2we Brandenburg

und Brandenburg sagt

NAME Brandenburg
NR 78
STATE Osterferien
TRIGGERTIME 1459033202.41422
TYPE holiday

NUC - FHEM & HA
MapleCUN, Homematic, 433MHz, AB440, 1-Wire Bewässerung & Pool, Jarolift (Signalduino), Signal Messenger, Denon AVR, LG WebOS, AmazonEcho, Jura S90 (ESP8266), Sonoff, Xiaomi Mii Sauger, Worx SO500i

bgewehr

Das ist OK. Was steht im UZSU Reading des zu schaltenden Devices?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Muk.s

Blöde Frage thorschtn, aber du hast das uzsu widget mit design type 2 definiert?

bgewehr

FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

thorschtn

#57
Ja, Typ 2 ist eingestellt:

{{ uzsu.uzsu_icon('Rolladen.Alle', 'Rolladen.Alle.uzsu', 'Roll&auml;den - alle (aktuell:nur unten)', '2', '', '', 'list', ['hoch:on', 'runter:off']) }}

Nachtrag: Der im Screenshot noch nicht aktive letzte Eintrag tauch auch nach Aktivierung nicht im WDT auf.
NUC - FHEM & HA
MapleCUN, Homematic, 433MHz, AB440, 1-Wire Bewässerung & Pool, Jarolift (Signalduino), Signal Messenger, Denon AVR, LG WebOS, AmazonEcho, Jura S90 (ESP8266), Sonoff, Xiaomi Mii Sauger, Worx SO500i

bgewehr

FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

thorschtn

{"active":true,"list":[{"delayedExec":{"devicePerl":"","type":"Perl","value":"","active":false},"holiday":{"weekend":false,"work":true},"condition":{"active":false,"value":"","type":"Perl","devicePerl":""},"timeMax":"","rrule":"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR","timeOffset":"","time":"06:45","timeCron":"06:45","value":"on","active":true,"timeMin":"","event":"time"},{"timeCron":"sunset","value":"off","event":"sunset","active":true,"timeMin":"18:30","delayedExec":{"active":false,"type":"Perl","devicePerl":"","value":""},"condition":{"value":"","type":"Perl","devicePerl":"","active":false},"holiday":{"work":false,"weekend":false},"time":"18:30<sunset+60m<21:00","rrule":"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU","timeOffset":"60","timeMax":"21:00"},{"timeCron":"09:10","value":"on","active":true,"timeMin":"","event":"time","condition":{"value":"","type":"Perl","devicePerl":"","active":false},"holiday":{"weekend":true,"work":false},"delayedExec":{"active":false,"devicePerl":"","type":"Perl","value":""},"timeMax":"","time":"09:10","rrule":"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU","timeOffset":"60"},{"event":"time","active":true,"timeMin":"","value":"on","timeCron":"08:55","time":"08:55","rrule":"","timeOffset":"60","timeMax":"","holiday":{"weekend":false,"work":true},"condition":{"value":"","type":"Perl","devicePerl":"","active":false},"delayedExec":{"active":false,"value":"","type":"Perl","devicePerl":""}}]}
NUC - FHEM & HA
MapleCUN, Homematic, 433MHz, AB440, 1-Wire Bewässerung & Pool, Jarolift (Signalduino), Signal Messenger, Denon AVR, LG WebOS, AmazonEcho, Jura S90 (ESP8266), Sonoff, Xiaomi Mii Sauger, Worx SO500i