Mit Online Wetter z.B. Rolladen steuern?

Begonnen von ole30419, 08 Februar 2013, 20:02:33

Vorheriges Thema - Nächstes Thema

MisterEltako

Hi

Bitte ergänzen:
if (Value("Beschattung_auto") eq "aktiv"){\
my $Temp= ReadingsVal("YahooWetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");;\
my $maxWind = 50;;\
my $Wind = ReadingsVal("YahooWetter","wind","noInfo");;\
Log 1, "$Temp, $Sonne, $maxWind, $Wind";;\

und Logeinträge prüfen und posten..

MfG,MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dietmar63

Kleiner Tipp!

Soviel Perlcode sollte man besser in die 99_Utils auslagern. Dann wird alles übersichtlicher und viel einfacher.

Diese Schrägstriche und ;; sind doof.
Ausserdem lässt sich die ProgrammStruktur besser überblicken... Und noch vieles mehr.

Grüße aus Burgdorf
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

ole30419

Hallo,

ich bin begeistert......

so, hier der aktuelle Log:
Zitat2013.03.05 10:32:39 1: -1, sonnig, 50, 6
und hier das aktuelle Wetter:
ZitatT: 4 H: 61 W: 6

Er verarbeitet nicht die aktuelle Temperatur sondern die Tagestiefsttemperatur?

also habe ich das: my $Temp= ReadingsVal("YahooWetter","fc1_low_c","999");;\
auf das geädert :
my $Temp= ReadingsVal("YahooWetter","temp_c","999");;\
und nun sieht das Log so aus:
Zitat2013.03.05 10:58:49 1: 4, sonnig, 50, 6

Nun wird die aktuelle Temperatur verarbeitet. Bin sehr gespannt wenn es auf 5°C um springt;-))

DANKE !!!  DANKE !!!  DANKE !!!  DANKE !!!  DANKE !!!  DANKE !!!  DANKE !!!  DANKE !!!  DANKE !!!  

@ Dietmar63  kann leider kein Perl und bin deswegen auf jede Hilfe angewiesen.....und das klapp hier SEHR GUT
MfG Ole

MisterEltako

Hi!

Was Dietmar meinte ist eine Auslagerung des langen Codes in die z.B. 99_myUtils.pm.
Dann braucht man keine doppelten Zeichen in FHEM (z.B. ;;) nur einmal (;) usw.

z.B. ginge das so:
in FHEM.cfg:
define Beschattung_auto dummy
attr Beschattung_auto fp_Terrasse 280,280,2,Beschattung Automatisch
attr Beschattung_auto room Terasse
attr Beschattung_auto setList state:aktiv,passiv
attr Beschattung_auto webCmd state
attr Test_Sonne room Terasse

define Test_Sonne notify YahooWetter{Wetterregelung("WZ_Roll2_Ost")}


in 99_myUtils.pm:
sub
Wetterregelung($){
my $Aktorname = @_;
if (Value("Beschattung_auto") eq "aktiv"){
my $Temp= ReadingsVal("YahooWetter","fc1_temp_c","999");
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");
my $maxWind = 50;
my $Wind = ReadingsVal("YahooWetter","wind","noInfo");
if ($Wind > $maxWind){\
fhem("set $Aktorname 100");
Log 1,"Rollladen wird geöffnet es ist zu viel Wind.";
}\
if (($Wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=90) && ($hour >= 10)){
fhem("set $Aktorname 90");
Log 1, "Beschattungsposition wird angefahren...";
}elsif (($Temp<=2) && (Value("$Aktorname")==90)){
fhem ("set $Aktorname 100");
Log 1,"Rollladen wird geöffnet zu kalt...";
} elsif (($Temp==999) || ($Sonne eq "kein Wert")) {
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne, $Wind";
}
}
}


Das hat nicht nur o.g. Vorteil, sondern damit könntest du mit dem selben Code auch andere Rollläden schalten in dem du der Funktion einen anderen Aktornamen übergibst.

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

ole30419

Ja ok,
 dann werde ich aber die Sonne und den Wind trennen. Und eine eigene 99_testUtils.pm anlegen.
Code für die 99_testUtils.pm:
sub
Wetterregelung_Sonne
Wetterregelung_Sonne($){
my $Aktorname = @_;
if (Value("Beschattung_auto") eq "aktiv"){
my $Temp= ReadingsVal("YahooWetter","temp_c","999");
my $Sonne= ReadingsVal("YahooWetter","condition","kein Wert");

if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=1) && ($hour >= 10)){
fhem("set $Aktorname 1");
Log 1, "Beschattungsposition wird angefahren...";
}elsif (($Temp<=2) && (Value("$Aktorname")==1)){
fhem ("set $Aktorname 100");
Log 1,"Markiese wird geöffnet zu kalt...";
} elsif (($Temp==999) || ($Sonne eq "kein Wert")) {
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne,";
}
}
}


Und gleich bekomme ich eine Fehlermeldung beim abspeichern:
ZitatERROR:
Global symbol "$hour" requires explicit package name at /usr/local/FHEM/share/fhem/FHEM/99_testUtils.pm line 20.

Er kann da wohl nichts mit "$hour" in der 99_testUtils.pm anfangen? Muss man das ihm noch übergeben oder so?

PS.: Ich habe das gleich mal auf meine Markise umgeschrieben, dafür wahr es ja gedacht.
MfG Ole

Dietmar63

musst du so neu besorgen:


  my $now = time();
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);


noch ein Tipp:

Programm durch einrücken strukturieren.
Dann blickst du auch bei kompliziertem Code noch durch und deine Helfer können Dir besser unter die Arme greifen - etwa so:


sub
Wetterregelung_Sonne($){

  my $Aktorname = @_;

  if (Value("Beschattung_auto") eq "aktiv"){

     my $Temp= ReadingsVal("YahooWetter","temp_c","999");
     my $Sonne= ReadingsVal("YahooWetter","condition","kein Wert");

     if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=1) && ($hour >= 10)){
       fhem("set $Aktorname 1");
       Log 1, "Beschattungsposition wird angefahren...";
     } elsif (($Temp<=2) && (Value("$Aktorname")==1)){
       fhem ("set $Aktorname 100");
       Log 1,"Markiese wird geöffnet zu kalt...";
     } elsif (($Temp==999) || ($Sonne eq "kein Wert")) {
       Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne,";
     }
  }
}


Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

ole30419

Werde gleich mal strukturieren.......

Aber das mit dem Zeit bekomme ich nicht hin:
sub
my $now = time();
{
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
}


Oder muss in der fhem.cfg noch was schreiben?
MfG Ole

Joachim

sub
Wetterregelung_Sonne($){

  my $Aktorname = @_;

  if (Value("Beschattung_auto") eq "aktiv"){

     my $Temp= ReadingsVal("YahooWetter","temp_c","999");
     my $Sonne= ReadingsVal("YahooWetter","condition","kein Wert");
 --> my $now = time();
 --> my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
     if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=1) && ($hour >= 10)){
       fhem("set $Aktorname 1");
       Log 1, "Beschattungsposition wird angefahren...";
     } elsif (($Temp<=2) && (Value("$Aktorname")==1)){
       fhem ("set $Aktorname 100");
       Log 1,"Markiese wird geöffnet zu kalt...";
     } elsif (($Temp==999) || ($Sonne eq "kein Wert")) {
       Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne,";
     }
  }
}

versuchs mal so (ungetestet)

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

ole30419

Dann bekomme ich leider immer:
ZitatUndefined subroutine &main::testUtils_Initialize called at /usr/local/FHEM/bin/fhem.pl line 1595.

Ich habe ja Sonne und Wind getrennt hier noch mal der ganze Code:
sub
Wetterregelung_Sonne($){

    my $Aktorname = @_;
    if (Value("Beschattung_Sonne") eq "aktiv"){

        my $Temp= ReadingsVal("YahooWetter","temp_c","999");
        my $Sonne= ReadingsVal("YahooWetter","condition","kein Wert");
        my $now = time();
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);

        if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=1) && ($hour >= 10)){
           fhem("set $Aktorname 1");
           Log 1, "Beschattungsposition wird angefahren.";
        }  elsif (($Temp<=2) && (Value("$Aktorname")==1)){
           fhem ("set $Aktorname 100");
           Log 1,"Markiese wird geöffnet Beschattung nicht mehr nötig.";
        }  elsif (($Temp==999) || ($Sonne eq "kein Wert")) {
           Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne,";
        }
    }
}

sub
Wetterregelung_Wind($){

    my $Aktorname = @_;
    if (Value("Beschattung_Wind") eq "aktiv"){

       my $maxWind = 30;
       my $Wind = ReadingsVal("YahooWetter","wind","noInfo");

       if ($Wind > $maxWind){
           fhem("set $Aktorname 100");
           Log 1,"Windschutz: Wind ist $Wind, Markise wird eingefahren.";
        }  elsif (($Wind < ($maxWind)-5) && (Value("$Aktorname")==1)){
           Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Wind,";
        }
    }
}
MfG Ole

MisterEltako

Hi!

Die Ergänzung von Joachim ist richtig. Habe es gerade getestet.

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

ole30419

Ich habe das "my" hinzugefügt und immer noch die selbe Fehlermeldung.

Habe ich noch woanders noch eine "undefined Subroutine"? Nun mal die ganze 99_testUtils.pm
package main;
use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}


###################################################
#
#  Beschattung bei Sonne für Markise oder Rolladen
#

sub
Wetterregelung_Sonne($){

    my $Aktorname = @_;
    if (Value("Beschattung_Sonne") eq "aktiv"){

        my $Temp= ReadingsVal("YahooWetter","temp_c","999");
        my $Sonne= ReadingsVal("YahooWetter","condition","kein Wert");
        my $now = time();
        my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
        if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=1) && (my $hour >= 10)){
           fhem("set $Aktorname 1");
           Log 1, "Beschattungsposition wird angefahren.";
        }  elsif (($Temp<=2) && (Value("$Aktorname")==1)){
           fhem ("set $Aktorname 100");
           Log 1,"Markiese wird geöffnet Beschattung nicht mehr nötig.";
        }  elsif (($Temp==999) || ($Sonne eq "kein Wert")) {
           Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne,";
        }
    }
}

###################################################
#
#   Windschutz für Markise
#

sub
Wetterregelung_Wind($){

    my $Aktorname = @_;
    if (Value("Beschattung_Wind") eq "aktiv"){

       my $maxWind = 30;
       my $Wind = ReadingsVal("YahooWetter","wind","noInfo");

       if ($Wind > $maxWind){
           fhem("set $Aktorname 100");
           Log 1,"Windschutz: Wind ist $Wind, Markise wird eingefahren.";
        }  elsif (($Wind < ($maxWind)-5) && (Value("$Aktorname")==1)){
           Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Wind,";
        }
    }
}

1;
MfG Ole

Dietmar63

ich habe deine routinen bei mir eingebaut.
die utils lässt sich reloaden - syntaktisch ist alles richtig.

In deiner neu angelegeten 99_testUtils.pm fehlt Dir wahrscheinlich die Initialize-Funktion bzw. sie ist vom Namen nicht angepasst worden:


#
#
#
sub testUtils_Initialize($$)
{
  my ($hash) = @_;
}
#


Ein Beispiel findest du am Anfang von 99_Utils:


##############################################
# $Id: 99_Utils.pm 1932 2012-10-06 20:15:33Z ulimaass $
package main;

use strict;
use warnings;
use POSIX;

sub
Utils_Initialize($$)
{
  my ($hash) = @_;
}

sub
time_str2num($)
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

du musst


Undefined subroutine &main::testUtils_Initialize called at /usr/local/FHEM/bin/fhem.pl line 1595.

definieren.

wenn du hier:/fhem.pl line 1595. schaust kannst du erkennen, dass in allen Modulen eine initialize-funktion gesucht wird.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Joachim

Poste bitte auch noch den revanten Teil aus der fhem.cfg

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

Dietmar63

/fhem.pl line 1595


(siehe Anhang / see attachement)


und so schön sieht jetzt dein Code aus:

(siehe Anhang / see attachement)
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm