[notify] Ein Versuch per PV-Anlage die Rollos Sonnenschein geführt zu öffnen und zu schliesen.

Begonnen von Guest, 15 Juni 2012, 11:02:24

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hallo,

ich beschäftige mich im Moment sehr intensiv mit den "notify" Funktionen.
Ich editiere alle Funktionen im Web-Browser wie vom Autor vorgeschlagen
unter DEF

Funktion: ich möchte den Aktuellen Stromertrag meiner PV Anlage nutzen um
indirekt die Sonnenmenge zu ermitteln um die Rollos zu schließen und zu
öffnen.
Im Zeitraum von 9 Uhr bis 20 Uhr (das mit der Uhrzeit geht noch nicht)

Ich habe hierzu folgende Funktionen Definiert

1) Solarview
define sv SolarView solarview 15000 wr1 wr2 wr3 wr4
attr sv event-on-change-reading currentPower

2) notify
define nt.sonnepersolar { ... }

In der DEF steht folgendes (Webbrowser)

(sv:currentPower.*)  {
if (ReadingsVal('sv','currentPower',0) < 3000)  {
 fhem('set Flur1 Auf');;
}else {
 if (ReadingsVal('sv','currentPower',0) > 4000)  {
  fhem("set Flur1 Ab");;
  }
 }
}
 
Das funktioniert, bin mit dem Ergebnis noch nicht richtig zufrieden.

1) Anstatt ReadingVal zu nutzen (ich kann mit der trigger Funktion das
öffnen und schließen nicht testen) würde ich gern den Wert

(sv:currentPower.*) in eine Variable schreiben.

Ich habe mir das so überlegt:

(sv:currentPower.*)  {
my $sl = %
if ($sl < 3000 ) {
 fhem('set Flur1 Auf');;
}else {
 if ($sl > 5000 ) {
  fhem('set Flur1 Auf');;
  }
 }
}

Jetzt steht aber in der Variable $sl currentPower: 6000 drinnen, das "CurrentPower: "
Dafür wollte ich split nutzen
my $sl = split(/:/,%);;

das funktioniert so aber nicht.

Ein trigger sv currentPower: 6000

Führt im Log zu:
2012.06.15 10:53:24 5: Triggering nt.sonnepersolar
2012.06.15 10:53:24 5: Cmd: >{ \
my $sl = split(/:/,currentPower: 6000);;\
if ($sl < 3000 ) {\
 fhem('set Flur1 Auf');;\
}else {\
 if ($sl > 5000 ) {\
  fhem('set Flur1 Auf');;\
  } \
 }\
}<
2012.06.15 10:53:24 3: nt.sonnepersolar return value: syntax error at (eval 56) line 1, near "currentPower:"
Global symbol "$sl" requires explicit package name at (eval 56) line 1.

Habe gerade keine Plan.

Gruß
lo4dro

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

1. Es fehlt ;; nach dem my $sl = %, also: my $sl = %;;
2. Split gibt nicht einen Skalar zurück ($), sondern ein array (@), also my
@sl = split(/:/,currentPower: 6000);;\
3. Dann den relevanten Teil des arrays verwenden, vmtl $sl[1], also if
($sl[1] < 3000 ) {
 
Das sind so die ersten Punkte die mir auffallen, hab's aber nicht getestet
- und soio gut sind meine perl-Kenntnisse dann auch wieder nicht....
 
=8-)


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Am Freitag, 15. Juni 2012 11:18:06 UTC+2 schrieb UliM:
>
> 1. Es fehlt ;; nach dem my $sl = %, also: my $sl = %;;
> 2. Split gibt nicht einen Skalar zurück ($), sondern ein array (@), also
> my @sl = split(/:/,currentPower: 6000);;\
> 3. Dann den relevanten Teil des arrays verwenden, vmtl $sl[1], also if
> ($sl[1] < 3000 ) {
>  
> Das sind so die ersten Punkte die mir auffallen, hab's aber nicht getestet
> - und soio gut sind meine perl-Kenntnisse dann auch wieder nicht....
>  
> =8-)
>

So gerade mal schnell getestet
Es wird ja doppel @ benötigt da @ eine interne Funktion hat.

DEF:

(sv:currentPower.*) {
my @@sl = split(/:/,%);;
if ($sl[1] < 3000 ) {
 fhem('set Flur1 Auf');;
}else {
 if ($sl[1] > 5000 ) {
  fhem('set Flur1 Auf');;
  }
 }
}


Debug Meldung:
Triggering nt.sonnenlichtpersolar
2012.06.15 11:31:31 5: Cmd: >{ \
my @sl = split(/:/,currentPower: 6000);;\
if ($sl[2] < 3000 ) {\
 fhem('set Flur1 Auf');;\
}else {\
 if ($sl[2] > 5000 ) {\
  fhem('set Flur1 Auf');;\
  } \
 }\
}<
2012.06.15 11:31:31 3: nt.sonnenlichtpersolar return value: syntax error at
(eval 66) line 1, near "currentPower:"
Global symbol "@sl" requires explicit package name at (eval 66) line 1.
 
Mir ist noch etwas aufgefallen.

(sv:currentPower.*) besagt ja nur, das er auf sv reagieren soll, wenn sich etwas bei currentPower
 geändert hat.
Aber was wird dann wirklich in % geschrieben? nur der Wert "currentPower: xxxxx" oder nur der Wert von currentPower also xxxxx
 oder alles was man mit list sv sehen kann?

 


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Tobias

                                                   

Statt %EVENT umständlich zu splitten, lieber die vordefinierten Variablen
nutzen:

%EVTPART0  => currentpower
%EVTPART1  => 6000
....

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

rudolfkoenig

                                                   

> Aber was wird dann wirklich in % geschrieben? nur der Wert "currentPower:
> xxxxx" oder nur der Wert von currentPower also xxxxx

Weder, noch, sondern
  currentPower: xxxxx
also ohne ". Fuer die " muss man selber sorgen, also:
  my @@sl = split(/:/,"%");

Aber in %EVTPART0, usw. stehen die (Leerzeichen getrennte) Woerter schon zur
Verfuegung, man muss es nicht selber mit split teilen:
  (sv:currentPower.*) {
    if(%EVTPART1 < 3000 || %EVTPART1 > 5000) {
      fhem('set Flur1 Auf');
    }
  }

Im DEF reicht ein einfacher ;

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Vielen Dank nun klappt es auch.

DEF:

(sv:currentPower.*) {
if (%EVTPART1  < 3000 ) {
 fhem('set Flur1 Auf');
}else {
 if (%EVTPART1 > 5000 ) {
  fhem('set Flur1 Ab');
  }
 }
}

Werde ich auch wie alles im Wiki Dokumentieren.


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

So, noch einen kleinen Nachtrag.
Ich habe die Funktion Zeitabhängig gemacht.
Es soll ja vorkommen, das in der Nacht die Rollos zubleiben sollen *g*

Habe in einem anderen Beitrag eine Definition gefunden, die das ganze Zeitabhängig macht.
Was jetzt noch fehlt, ist eine Datums Abhängigkeit.
Ich möchte das ganze nur in den Sommermonaten haben, der Rest vom Jahr brauch ich das nicht.
Jemand ne Idee?

(Wie immer als DEF im Webbrowser)

(sv:currentPower.*) {
my $hm = sprintf("%%02d:%%02d", $hour, $min);
if ( $hm gt "09:30" && $hm  lt "17:00") {
  if (%EVTPART1  < 5000 ) {
   fhem('set Flur1 Auf');
   }else {
   if (%EVTPART1 > 8000 ) {
    fhem('set Flur1 Ab');
    }
   }
  }
}

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ich glaube ich habe die Lösung gefunden

In der Variable $month versteckt sich der Aktuelle Monat (habe ich hier
lange gesucht)
und mit

if( $month ge "6" && $month le "9") {

frage ich auf großer/gleich 6 und kleiner/gleich 9 ab.

So sieht nun das Ergebniss aus.
Verbesserungsvorschläge?

(sv:currentPower.*) {
my $hm = sprintf("%%02d:%%02d", $hour, $min);
if( $month ge "6" && $month le "9") {
 if ( $hm gt "09:30" && $hm  lt "17:00") {
  if (%EVTPART1  < 5000 ) {
   fhem('set Flur1,RBUERO1,RBUERO2 Auf');
   }else {
   if (%EVTPART1 > 8000 ) {
    fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');
    }
   }
  }
 }
}


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Nö, keine Verbesserungsvorschläge.

Ich steuere seit Jah rund Tag meine Bewässerungsanlage durch den solaren
Ertrag.

LG

pah

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ich habe die Konfig noch um einen "Merker" erweitert.
Die Steuerung merkt sich, ob die Rollos schon geöffnet oder geschlossen
wurden.
Dadurch ist weiterhin eine Handsteuerung möglich und es wird in meinem Fall
der EIB-Bus weniger belastet. Bei Funk könnte das noch wichtiger sein,
dadurch werden keine unnötige Funktelegramme gesendet.

Bitte auch hier noch ein paar Meinungen bzw. Verbesserungen.
Es werden noch zwei Dummy benötigt. Die als Merker benutzt werden.

Anbei die DEF:

(sv:currentPower.*) {
my $hm = sprintf("%%02d:%%02d", $hour, $min);
if( $month ge "6" && $month le "9") {
 if ( $hm gt "09:00" && $hm  lt "19:00") {
  if (%EVTPART1  < 4000 ) {
   if (ReadingsVal('du.sonnenlichtpersolarlow','state',0) == 0) {
    fhem('set Flur1 Auf');
    fhem('set RBUERO1 Auf');
    fhem('set RBUERO2 Auf');
    fhem('set KuecheOG Auf');
    fhem('set BadOG Auf');
    fhem('set du.sonnenlichtpersolarlow 1');
    fhem('set du.sonnenlichtpersolarhigh 0');
    }
   }else {
   if (%EVTPART1 > 8000 ) {
    if (ReadingsVal('du.sonnenlichtpersolarhigh','state',0) == 0) {
     fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');
     fhem('set KuecheOG,BadOG Pos3');
     fhem('set du.sonnenlichtpersolarlow 0');
     fhem('set du.sonnenlichtpersolarhigh 1');
     }
    }
   }
  }
 }
}

Name der zwei Dummys:
du.sonnenlichtpersolarhigh
du.sonnenlichtpersolarlow


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com