Hallo liebe Fhem gemeinde,
habe nichts in den Fourm gefunden. Ist es möglich das man das ,,online Wetter" so in Fhem einbinden kann das die Rolladen oder auch die Markise, bei 30°C und Sonne, einwenig Schatten Spenden?
Wie man die Rolladen/Markise mit at steuert weist ich aber kann man sie auch mit dem Wetterbericht hoch/herunter fahren lassen und man spart sich die teuern Wetterstation?
Grüsse aus Peine
Hallo Ole,
schau dir mal das Twilight Modul an, damit kann man so was machen
Gruß
Guido
Hi,
ich habe mir eine Beschattungssteuerung gebaut. Sieht folgendermassen aus:
######## doBeschattungssteuerung ###############
# Start nach wakeup und sz_RolloHoch
# wenn Beschattung aktiviert
# und Tageshöchsttemperatur > 22 und Unbewölkt
# oder Tageshöchsttemperatur > 27
# dann schliesse das Rollo teilweise, bis zur angegebenen Zeit
#
# Prüft die Beschattungs-Notwendigkeit
# Aufruf: doBeschattung("<device>","HH:MM")
# um HH:MM wird der device wieder auf 'Up' gesetzt
sub
doBeschattung($$) {
my ($device, $endtime) = @_;
my $weatherDevice = "MunichWeather";
my $readingMaxTemp = "fc1_high_c";
my $cloudCoverage = "fc1_icon";
my $triggerTemp = 22;
my $mandatoryTemp = 27;
Log 3, "doBeschattung: Prüfe Beschattungsbedarf für $device...";
Log 3, "doBeschattung: TempHi ist ".ReadingsVal($weatherDevice,$readingMaxTemp, 0)." (Schwellwerte: $triggerTemp bei sunny, sonst $mandatoryTemp )" ;
Log 3, "doBeschattung: Clouds ist ".ReadingsVal($weatherDevice,$cloudCoverage, 0);
if ( Value("Beschattung") eq "on" &&
(((ReadingsVal($weatherDevice,$readingMaxTemp, 0) > $triggerTemp)
&& (ReadingsVal($weatherDevice,$cloudCoverage , 0) =~ m/sunny/) )
|| (ReadingsVal($weatherDevice,$readingMaxTemp, 0) > $mandatoryTemp) )) {
my $startBeschattung = "at_".$device."_Beschattung_start"; #name for notify
my $endBeschattung = "at_".$device."_Beschattung_end"; #name for notify
if (Value($device) eq "Up") {
Log 3, "doBeschattung: Beschattung aktiviert für $device.";
fhem "set $device on-for-timer 16"; #Rollo für 16s herunterfahren
fhem "define $endBeschattung at $endtime set $device Up" if(!defined($defs{$endBeschattung}));
} else {
Log 3, "doBeschattung: erst Rollo hochfahren...";
fhem "set sz_Rollo off";
fhem "define $startBeschattung at +00:03 set $device on-for-timer 16" if(!defined($defs{$startBeschattung}));
fhem "define $endBeschattung at $endtime set $device Up" if(!defined($defs{$endBeschattung}));
Log 3, "doBeschattung: Beschattung aktiviert für $device.";
}
} else {
Log 3, "doBeschattung: Nicht nötig.";
}
}
Aufgerufen wird's morgen mit einem at:
define at_szBeschattungStart at *09:00 {doBeschattung('sz_Rollo' , '14:30')}
Vielleicht kann Dir das als Grundlage dienen.
Gruß + viel Erfolg,
Uli
Das sieht sehr interessant aus. Aber was verbirgt sich denn hinter
my $weatherDevice = "MunichWeather";
, zur Vervollständigung der Lösung?
Hi,
dahinter verbirgt sich der Wetterbericht:
define MunichWeather Weather 676757 3600 de
attr MunichWeather localicons 1
Dort findest Du auch die readings, die ausgewertet werden: fc1_high_c und fc1_icon
Ausserdem taucht im code noch ein dummy auf:
define Beschattung dummy
attr Beschattung webCmd on:off
Damit wird das ganze aktiviert/deaktiviert.
Und um's komplett zu machen, hab ich auch nen "Windschutz" gebaut, damit die Beschattung beendet wird, falls es zu windig ist:
###### doWindSchutz ########################
# Rollo hoch bei Wind
# Aufruf mit doWindSchutz("<device>")
sub
doWindSchutz($) {
my $device = shift;
my $weatherDevice = "MunichWeather";
my $maxWind = 50;
my $wind = ReadingsVal($weatherDevice, "wind_condition", "noInfo");
$wind =~ s,.* ([0-9]+) .*,$1,; #read the number
# Log 3, "doWindSchutz: Wind ist $wind";
if ($wind > $maxWind && Value($device) eq "on-for-timer 16" && Value("HomeStatus") ne 2) {
Log 3, "doWindSchutz: Wind ist $wind, Rollo wird hochgefahren";
fhem("set $device Up");
}
}
##Aufruf dazu
define n_WindSchutz notify MunichWeather:wind_condition.* {doWindSchutz("sz_Rollo")}
Enjoy, Uli
@UliM
Danke das du das so ausführlich gepostet hast.
Könntest du mir noch erklären, was diese 2 Zeilen nach dem "if" genau machen?
fhem "define $startBeschattung at +00:03 set $device on-for-timer 16" if(!defined($defs{$startBeschattung
fhem "define $endBeschattung at $endtime set $device Up" if(!defined($defs{$endBeschattung}));
und dies bitte auch:
=~ m/sunny/) )
Das habe ich bisher nicht begriffen, um eigene Sachen damit zu erstellen.
Vielen Dank!
MfG, MisterEltako.
Zitat von: MisterEltako schrieb am Sa, 09 Februar 2013 17:55fhem "define $startBeschattung at +00:03 set $device on-for-timer 16" if(!defined($defs{$startBeschattung
fhem "define $endBeschattung at $endtime set $device Up" if(!defined($defs{$endBeschattung}));
Zeile1: definiere einen timer, der in 3 Minuten (nachdem das vorherige Hochfahren des Rollos abgeschlossen ist) das Rollo für 16s nach unten fährt, also in den Beschattungsmodus
Zeile2: definiere einen timer, der das Rollo zur angegebenen Zeit wieder hochfährt (zB für Räume Richtung Osten, die eh nur bis mittags besonnt werden)
Zitat von: MisterEltako schrieb am Sa, 09 Februar 2013 17:55und dies bitte auch:
=~ m/sunny/) )
Prüft, ob der icon-Name des Wetterberichts den text "sunny" enthält, trifft zu bei "sunny" und "mostly sunny". Denn nur wenn "sonnig" vorhergesagt ist, soll auch beschattet werden :)
Hoffe das hilft ein wenig...
Gruß, Uli
Hi!
Danke für die schnelle Antwort. Ich meine aber im speziellen was dies bedeutet:
if(!defined($defs{$startBeschattung}));
if(!defined($defs{$endBeschattung}));
MfG, MisterEltako.
Zitat von: MisterEltako schrieb am Sa, 09 Februar 2013 18:24if(!defined($defs{$startBeschattung}));
if(!defined($defs{$endBeschattung}));
Die timer sollen nur dann angelegt werden, wenn sie nicht schon existieren.
=8-)
Ok!
da muss ich mich wohl doch noch etwas weiter mit Perl beschäftigen, das hätte ich so nicht schreiben können.
Hast du da einen Tip, wo man sowas im Netzt findet?
Noch eine Frage zum Weather-Device:
Laut Yahoo.Seite kann man dort wie beim Twilight-Modul Sonnenaufgang und Untergang ablesen.
In den Readings taucht das aber nicht auf. Kann man dies mit einfließen lassen???
Ich möchte nicht Twilight und Weathermodul, sondern nur eins nutzen (Twilight ist bei mir derzeit eingebaut).
MfG, MisterEltako.
Hi,
wo man sowas findet - kann Dir leider keinen Tipp geben, hab ich mir aus irgendwelchen posts hier im Forum abgeschaut.
defined() sollte ne reguläre perl-Funktion sein.
$defs ist halt ne fhem-Datenstruktur, da wird's nirgends Doku geben.
Statt twilight kannst Du ja sunrise nehmen (http://fhem.de/commandref.html#SUNRISE_EL (//fhem.de/commandref.html#SUNRISE_EL)).
=8-)
Hi!
Danke nochmals jetzt habe ich es verstanden - denke ich zumindestens :o).
sunrise-Funktion finde ich nicht so gut, daswegen habe ich ja auf twilight gewechselt. Aber deine Variante gefällt mir subjektiv am besten. Schade das man das so nicht abgreifen kann.
MfG, MisterEltako
...oh, kaum ist man mal kurz nicht im Netz......
....das ist für mich als Anfänger doch gleich einwenig viel, das Yahoo Wetter habe ich jetzt schon mal, ich hatte vorher das Wetteronline.
jetzt muss ich erstmal einfach anfangen:
define <Makise_Sonnen> at * < ,, Sonne und Temperatur über 22°C aber nicht vor 10:00 Uhr" > Set Makise on
Aber was muss da in die Anführungszeichen ein?
Hi!
define Test notify Local_Wetter {\
my $Temp= ReadingsVal("Local_Wetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("Local_Wetter","fc1_condition","kein Wert");;\
if (($Temp >= 30) && ($Sonne eq "sonnig") && (Value("Rollladen")!=15)){\
fhem("set Rollladen 15");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<30) && (Value("Rollladen")==15)){\
fhem ("set Rollladen 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
else {\
Log 1, "Rollladen unverändert";;\
}\
}
Die Log`s dienen nur zum Testen, ob es klappt. Zumindestens das letzte Log solltest du danach entfernen, sonst erfolgen ständig Logeinträge!!! Das Weather-Modul ist hier zuvor als Local_Wetter definiert worden
define Local_Wetter Weather deinCode 3600 de
Die Zeitbedingung kannst du selbst noch einfügen.
MfG, MisterEltako
Hi,
ich möcht hier mal schreiben ob ich das so richtig verstanden habe. Dazu habe ich hinter den Befehl immer mal eine Beschreibung gehängt.
define Test notify Local_Wetter {\ #Hiermit wird die Abfrage aus dem ,,Local_Wetter"mit dem Namen ,,Test" erstellt
my $Temp= ReadingsVal("Local_Wetter","fc1_low_c","999");;\ #Hier wird die Temperatur beim Yahoo Wetter abgefragt, aber was heist die 999?
my $Sonne= ReadingsVal("Local_Wetter","fc1_condition","kein Wert");;\ #Hier wird abgefragt ob die Sonne scheint.
if (($Temp >= 30) && ($Sonne eq "sonnig") && (Value("Rollladen")!=15)){\ #In der 1. Klammer wird Abfrage ob Temp.>30 in der 2. Klammer ob die Sonnescheint und in der 3. Klammer ,,Welche Bedingung muss hier erfüllt werden?" Alle Klammern sind mit UND verknüpft und müssen erfüllt sein.
fhem("set Rollladen 15");;\ #Mit dem Befehl wird der Rollladen 15% geschlossen.
Log 1, "Beschattungsposition wird angefahren...";;\ # Eintrag in die Log Datei, muss die vorher angelegt werden oder schreibt er die ins Mastelog?
}elsif (($Temp<30) && (Value("Rollladen")==15)){\ #Abfrage in 1. Klammer ob Temp. <30°C, in der 2. Klammer ob das Rollladen auf 15% geschlossen ist. Alle Klammern sind mit UND verknüpft und müssen erfüllt sein.
fhem ("set Rollladen 100");;\ #Mit dem Befehl wird der Rollladen 100% geöffnet.
Log 1,"Rollladen wird geöffnet...";;\ # Eintrag in die Log Datei
}\
else {\
Log 1, "Rollladen unverändert";;\ # Eintrag in die Log Datei
}\
}
Ich hoffe das ich mich so richtig ausgedrückt habe. Bitte Korrigierte mich wenn das Falsch ist ich möchte es ja auch verstehen und nicht einfach übernehmen.
Danke schon mal ,-))
Hi!
define Local_Wetter Weather deinCode 3600 de
define Test notify Local_Wetter {\
my $Temp= ReadingsVal("Local_Wetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("Local_Wetter","fc1_condition","kein Wert");;\
if (($Temp >= 22) && ($Sonne eq "sonnig") && (Value("Rollladen")!=15) && ($hour >= 10)){\
fhem("set Rollladen 15");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<22) && (Value("Rollladen")==15)){\
fhem ("set Rollladen 100");;\
Log 1,"Rollladen wird geöffnet...";;\
} elsif ($Temp=999) || ($Sonne eq "kein Wert") {\
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert";;\
}\
else {\
Log 1, "Rollladen unverändert";;\
}\
}
1.if: Ist wahr wenn >22° & sonnig & Rollladen noch nicht in Schattenposition & nach 10 Uhr...Rollladen auf 15% zu
2.if: Ist wahr wenn <22° & Rollladen bereits in Beschattungspos. gewesen ... Rollladen auf = 100%
3.if: Ist wahr wenn keine Wetterdaten von Yahoo-Wetter möglich
4.else wenn nix zu tun ist... <--- dieses undbedingt nach Testung wieder rausnehmen, da sonst Log zugemüllt wird!
Ich empfehle Rollladen nicht mit off zu schließen sondern die %-Angaben zu nutzen, da sonst die Beschattungsposition von unten kommend anders ist als wenn der Rollladen von oben kommt. Also lieber 100%(ist auf), 15% (ist zum Bsp. Beschattung oder von dir gewünschter Wert) 1% (ist gleich zu) - dann stimmen die Positionen in etwa.
MfG, MisterEltako.
....sofern man einen HM-Rolladenaktormhat.
Ich hab nen FS20-RSU, da gibt's keine %-Positionen. Man nur ganz hoch oder ganz runterfahren (on/off) oder mit on-for-timer in eine best. Position fahren. Drum sieht der urspr. Code somaus wie er aussieht :)
Hallo,
ok, habe das mal mit meine Aktoren umgeschrieben und mal versucht das von UliM, mit dem Wind, mit ein zubauen, habe ich mal in fett geschrieben. Zum Testen habe ich erst mal ein Rolladen statt der Markise genommen. Habe HM- Aktoren da geht das mit den 0% auf und 100% zu.
Kann das so gehen?
define Test_Sonne notify YahooWetter {\
my $Temp= ReadingsVal("YahooWetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");;\
my $maxWind = 50;;\
my $wind = ReadingsVal("YahooWetter","wind_condition","noInfo");;\
if ($wind > $maxWind){\
fhem("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
if (($wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne eq "sonnig") && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<2) && (Value("WZ_Roll2_Ost")==90)){\
fhem ("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
} elsif ($Temp=999) || ($Sonne eq "kein Wert") {\
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert";;\
}\
}
PS: kann man die ganzen Klammer mit irgendwas prüfen?
MfG, ole3019
Hi!
Eine "}"-Klammer ist in obigem Beispielcode von dir zuviel. Und was willst du mit:
if (($wind < ($maxWind)-5) bezwecken.
Das müsste dann schon so lauten:
if (($wind < ($maxWind-5))...)}\
oder gleich:
if (($wind < 45)...)}\
Sonst müsste das meiner Meinung nach funktionieren.
define Test_Sonne notify YahooWetter {\
my $Temp= ReadingsVal("YahooWetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");;\
my $maxWind = 50;;\
my $wind = ReadingsVal("YahooWetter","wind_condition","noInfo");;\
if ($wind > $maxWind){\
fhem("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
if (($wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne eq "sonnig") && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<2) && (Value("WZ_Roll2_Ost")==90)){\
fhem ("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
} elsif ($Temp=999) || ($Sonne eq "kein Wert") {\
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert";;\
}\
}
Klammer testen kann man, wie o.g. mit Notpad++ bei in den Optionen eingestelltem Perl als Sprache gut testen.
MfG, MisterEltako.
ZitatUnd was willst du mit:
if (($wind < ($maxWind)-5) bezwecken.
Das die Markise ab der maximalen Windstärke minus 5 nicht ausfährt.
Hallo,
ich brauch noch mal Eure Hilfe. Mein Log wird nun vollgeschrieben mit dem ,,Yahoo-Wetter nicht erreichbar oder kein Wert geliefert" aber das Wette wird korrekt angezeigt.
Hier noch mal der ganze Code:
define Test_Sonne notify YahooWetter {\
my $Temp= ReadingsVal("YahooWetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");;\
my $maxWind = 50;;\
my $wind = ReadingsVal("YahooWetter","wind_condition","noInfo");;\
if ($wind > $maxWind){\
fhem("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
if (($wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne eq "sonnig") && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<2) && (Value("WZ_Roll2_Ost")==90)){\
fhem ("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
} elsif (($Temp=999) || ($Sonne eq "kein Wert")) {\
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert";;\
}\
}
Was ich noch geändert hatte wahren die Klammern um:
} elsif (($Temp=999) || ($Sonne eq "kein Wert")) {\
Da ich da auch immer Fehler im Log hatte.
Hi!
Nur ein kleiner Flüchtigkeitsfehler...mit großer Wirkung:
statt ($Temp=999)
besser:
$Temp == 999)
sonst weist man ja $Temp die 999 zu statt zu vergleichen....
Außerdem bei der Windabfrage statt:
my $wind = ReadingsVal("YahooWetter","wind_condition","noInfo");;\
bitte:
my $wind = ReadingsVal("YahooWetter","wind","noInfo");;\
nutzen. Sonst hast du in der Variablen statt z.B. 11 bei deiner Abfrage: Wind: NNW 11 km/h!!! Und das minus 5 ist dann schwierig ;o)
Ergänze doch noch den Log um die Variablen, dann weist du gleich wo der Fehler liegen könnte:
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne, $Wind";;\
MfG, MisterEltako.
Hallo,
super das mit dem doppelten Gleichheitszeichen wahr wohl auch der Fehler für die Fehlermeldung: ,,Yahoo-Wetter nicht erreichbar oder kein Wert geliefert" .
Ob der Rollladen nun auch so seine Dienste erledigt wie ich mir das vorstelle werde ich in den nächsten Tagen sehen. Und werde dann auch noch mal berichten.
Danke noch mal an alle, das macht richtig Spaß mit Euch hier im Forum.
ich fasse kurz zusammen: (nicht nur für Gutenbergs und Schavans)
Hier ist kopieren ausdrücklich willkommen, Verbesserungsvorschläge übrigens auch!
define Test_Sonne notify YahooWetter {\
my $Temp= ReadingsVal("YahooWetter","fc1_low_c","999");;\
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");;\
my $maxWind = 50;;\
my $wind = ReadingsVal("YahooWetter","wind_condition","noInfo");;\
my $wind = ReadingsVal("YahooWetter","wind","noInfo");;\
if ($wind > $maxWind){\
fhem("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
if (($wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne eq "sonnig") && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<2) && (Value("WZ_Roll2_Ost")==90)){\
fhem ("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
} elsif (($Temp==999) || ($Sonne eq "kein Wert")) {\
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne, $Wind";;\
}\
}
Ja, genauso.....
nur weiss ich nicht ob es auch bei leichter Bewölkung in die Beschattung fährt, da hier ja was mit Sonne stehen muss oder?
my $Sonne= ReadingsVal("YahooWetter","fc1_condition","kein Wert");;\
Hi!
Also entweder lässt du die Abfrage der Sonne weg oder ergänzt das um den Eintrag "leicht bewölkt" oder so ähnlich.
if (($wind < ($maxWind)-5) && ($Temp >= 5) && (($Sonne eq "sonnig") || ($Sonne eq "leicht bewölkt")) && (Value("WZ_Roll2_Ost")!=90) ....
MfG, MisterEltako.
Ja, danke habe ich nun auch noch hinzugefügt, das mit dem "leicht bewölkt".
Nun wollte ich auch noch so eine Aktiv/Passiv Button haben, aber mir dem Ende komme ich nicht klar.
Damit habe ich angefangen:
define Beschatung_auto dummy
attr Beschatung_auto setList state:aktiv,passiv
attr Beschatung_auto webCmd state
attr Beschatung_auto room Terasse
Aber wo kommt das hin? eq "aktiviert"
Das habe ich hier gefunden.Link (http://forum.fhem.de/index.php?topic=10174.0)
Am übersichtlichsten vielleicht so:
define Beschattung_auto dummy
attr Beschattung_auto setList state:aktiv,passiv
attr Beschattung_auto webCmd state
attr Beschattung_auto room Terasse
define Test_Sonne notify YahooWetter {\
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_condition","noInfo");;\
my $wind = ReadingsVal("YahooWetter","wind","noInfo");;\
if ($wind > $maxWind){\
fhem("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
}\
if (($wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<2) && (Value("WZ_Roll2_Ost")==90)){\
fhem ("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet...";;\
} elsif (($Temp==999) || ($Sonne eq "kein Wert")) {\
Log 1, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne, $Wind";;\
}\
}\
}
(=~ m/sonnig/ ---> bedeutet: "sonnig" oder auch "meistens sonnig" wäre im Vergleich beides wahr)
MfG, MisterEltako
Super danke, auch für die Korrektur der Rechtschreibung.
Gruße aus Peine
Hallo,
so nun schein endlich mal die Sonne um die automatische Beschattung zu testen. Aber sie geht nicht ;-(
if (($Wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Sie soll ja (zum Test eingestellt) bei Wind kleine 45 & ab Temperatur grösser 5C° & "Sonne" und est ab 10:00 Uhr beschatten.
alle Bedienungen sind erfüllt aber es passiert nichts.
Nun habe ich die Beschattung mal mit manuell mit "set WZ_Roll2_Ost 90" ausgelöst und wenn Fhem bei mir das Wetter abruft wird der Rolladen wider komplett auf gemacht. Ich verstehe das nicht. Hier noch mal der der ganze Code:
define Beschattung_auto dummy
attr Beschattung_auto fp_Terrasse 280,280,2,Baschattung Automatisch
attr Beschattung_auto room Terasse
attr Beschattung_auto setList state:aktiv,passiv
attr Beschattung_auto webCmd state
define Test_Sonne notify YahooWetter {\
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");;\
if ($Wind > $maxWind){\
fhem("set WZ_Roll2_Ost 100");;\
Log 1,"Rollladen wird geöffnet es ist zu viel Wind.";;\
}\
if (($Wind < ($maxWind)-5) && ($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("WZ_Roll2_Ost")!=90) && ($hour >= 10)){\
fhem("set WZ_Roll2_Ost 90");;\
Log 1, "Beschattungsposition wird angefahren...";;\
}elsif (($Temp<=2) && (Value("WZ_Roll2_Ost")==90)){\
fhem ("set WZ_Roll2_Ost 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";;\
}\
}\
}
attr Test_Sonne room Terasse
Und auch noch eine Auszug aus dem Log:
2013.03.04 13:49:15 2: CUL_HM set WZ_Roll2_Ost 90 rxt:1
2013.03.04 13:50:06 2: CUL_HM set WZ_Roll2_Ost 100 rxt:1
2013.03.04 13:50:06 1: Rollladen wird geöffnet zu kalt...
Und der eventMonitor: 2013-03-04 14:27:07 CUL_HM WZ_Roll2_Ost set_100
2013-03-04 14:27:07 Weather YahooWetter wind: 11
2013-03-04 14:27:07 Weather YahooWetter wind_condition: Wind: SSO 11 km/h
2013-03-04 14:27:07 Weather YahooWetter humidity: 64
2013-03-04 14:27:07 Weather YahooWetter temperature: 6
2013-03-04 14:27:07 CUL_HM WZ_Roll2_Ost deviceMsg: 90 % (to HM_LANInterface)
2013-03-04 14:27:07 CUL_HM WZ_Roll2_Ost motor: up:90 %
2013-03-04 14:27:07 CUL_HM WZ_Roll2_Ost 90 %
2013-03-04 14:27:13 CUL_HM WZ_Roll2_Ost deviceMsg: auf (to HM_LANInterface)
2013-03-04 14:27:13 CUL_HM WZ_Roll2_Ost motor: stop:auf
2013-03-04 14:27:13 CUL_HM WZ_Roll2_Ost auf
Wie gesagt es wir immer wenn das Wette abgerufen wird die Beschattung aufgehoben aber es wird nicht Beschatten.
PS. Der Aktiv/Passiv Button funktionier bestens danke !!!
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.
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
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
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.
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.
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,";
}
}
}
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?
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
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,";
}
}
}
Hi!
Die Ergänzung von Joachim ist richtig. Habe es gerade getestet.
MfG, MisterEltako
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;
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($)
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.
Poste bitte auch noch den revanten Teil aus der fhem.cfg
Gruß Joachim
/fhem.pl line 1595
(siehe Anhang / see attachement)
und so schön sieht jetzt dein Code aus:
(siehe Anhang / see attachement)
Oh jetzt geht es ans eingemachte. Benutze include Anweisungen. In der letzen Zeile von fhem.cfg steht:
include /usr/local/FHEM/share/fhem/FHEM/Terasse.cfg
Und in der Terassen.fg
# hier Sonne
define Beschattung_Sonne dummy
attr Beschattung_Sonne fp_Terrasse 280,280,2,Baschattung bei Sonne
attr Beschattung_Sonne room Terasse
attr Beschattung_Sonne setList state:aktiv,passiv
attr Beschattung_Sonne webCmd state
define Beschattung_Terasse_Sonne notify YahooWetter {Wetterregelung_Sonne("TR_Markise")}
attr Beschattung_Terasse_Sonne room Terasse
# hier Wind
define Beschattung_Wind dummy
attr Beschattung_Wind room Terasse
attr Beschattung_Wind setList state:aktiv,passiv
attr Beschattung_Wind webCmd state
define Windschutz notify YahooWetter {Wetterregelung_Wind("TR_Markise")}
attr Windschutz room Terasse
Oder brauchen wir noch mehr von der fhem.cfg
das sieht gut aus
Ist das im Notepad++ gemacht? Denn gibt es leider nicht für Mac. Werde Win7 starten, gute Idee.
Ausgehend von der Fehlermeldung müsste deine Datei 99_testUtils.pm sein und folgenden Inhalt haben (1; am Schluß nicht vergessen):
package main;
use strict;
use warnings;
use POSIX;
sub
testUtils_Initialize($$)
{
my ($hash) = @_;
}
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,";
}
}
}
1;
MfG, MisterEltako
So habe mal mit Notepad++ die Zeile 1595 in der /fhem.pl angeschaut. Ich kann damit natürlich nicht anfangen.
Habe mal ein Bild angehangen den ein Screenshot im Win7 mit Mac Tastatur war auf der schnellen nicht möglich.
(siehe Anhang / see attachement)
@ MisterEltako das mir dem 1; habe ich in der 99_testUtils.pm drin siehe oben in "Nun mal die ganze 99_testUtils.pm"
Grüße Ole
Hi!
Also in FHEM.pl zu schauen bringt dich nicht weiter. Irgedwas stimmt meiner Meinung nach mit deiner 99_testUtils.pm nicht.
1. lösche deine angelegte 99_testUtils.pm im FHEMWEB
2. öffne 99_Utils.pm
3. lösche den gesamten Inhalt dieser Datei
4. kopiere den von mir o.g. Code stattdessen in diese Datei
5. abspeichern mit "speichern unter" als 99_testUtils.pm
Dann wieder testen ob es jetzt geht....
MfG, MisterEltako.
Jup, Super !!!!!
Das habe ich so gemacht und ich bekomme auch keine Fehler Meldung mehr. Aber leider geht auch die Beschattung nun nicht mehr.
Wie kann man den die Übergabe von den, im FHEM bezeichneten ("TR_Markise") Aktor, zu dem in der ausgelagerten 99_testUtils.pm
("$Aktorname") Testen?
Und gleich noch eine Frage zu dem Windschutz. Ich möchte das der Windschutz auch die Markise einfährt egal in welche lage sich die Makise sich geraden befindet, außer Sie komplett eingefahren, aber das versteht sich ja von selbst.
Das kann nur noch an der Definition der notify liegen.
Baue in die beiden Funktionen am Anfang Logs ein, damit du erkennst wenn sie aufgerufen werden.
Dann musst du die notify untersuchen ob sie richtig formuliert sind.
Durch Eingabe von {funktion(.... ) } in fhem kannst du ohne notify testen
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);
my $device=Value($Aktorname);
Log 1, "Aktor:$Aktorname,Temp:$Temp,Sonne:$Sonne,Stunde:$hour,Devicewert:$device";
}
....zum Testen, sonst ist es echt das "notify". Bitte dann posten.
MfG, MisterEltako.
Hallo,
so haben den Fehler glaube gefunden, natürlich mit Euer Hilfe. Im Log wurde für den Aktornahme immer nur die 1 geschrieben.
ZitatAktor:1,Temp:4,Sonne:Dunst,Stunde:11,Devicewert:
Nun habe ich den Aktorname überall mal in Klammern gesetzt.
my ($Aktorname) = @_;
Und nun wird im Log der Aktornahme richtig gesetzt.
ZitatAktor:(TR_Markise),Temp:4,Sonne:Dunst,Stunde:12,Devicewert:auf
So muss mich noch mal Korrigieren, es muss nicht alles in Klammern sondern nur am Anfang bei der Übergabe.
my ($Aktorname) = @_;
Habe nun mal noch ein wenig mit der "wann muss was erfüllt sein" gespielt, bekomme es aber nicht hin so wie ich es möchte.
Ich möchte das die Makise nur in die Beschattung geht wenn sie zuvor nicht "von Hand" schon betätigt wurde. Also habe ich noch ein Bedingung dazugegeben.
if (($Temp >= 5) && ($Sonne =~ m/Dunst/) && (Value("$Aktorname")!= 1) && (Value("$Aktorname")== 100) && ($hour >= 10)){
Aber nun wird gar nicht mehr automatisch Beschattet. Ich hoffe ich habe mich Richtig ausgedrückt.
Es soll nur automatisch Beschattet werden wenn keine zu vor manuell den Schalter betätigt hat.
So nun habe ich mal die "==100" durch "==auf" ersetzt und es funktioniert so wie ich es mir vorgestellt habe.
if (($Temp >= 5) && ($Sonne =~ m/Dunst/) && (Value("$Aktorname")!= 1) && (Value("$Aktorname")== auf) && ($hour >= 10)){
Nur bekomme ich nun immer eine Fehlermeldung beim absichern der 99_testUtils.pm
Bareword "auf" not allowed while "strict subs" in use at /usr/local/FHEM/share/fhem/FHEM/99_testUtils.pm line 22.
Ich könnte damit leben aber FHEM?
Gruß Ole
Entweder "auf" oder $auf!
Hi!
Ich denke der Vergleich ist bei dir falsch. " == " verwendet man für Zahlen, dagegen " eq " für Strings:
if (($Temp >= 5) && ($Sonne =~ m/Dunst/) && (Value("$Aktorname")!= 1) && (Value("$Aktorname") eq "auf") && ($hour >= 10)){....
MfG, MisterEltako.
Hallo,
so habe noch mal überlegt was die Markise macht wenn es erst die Sonne scheint und dann ein Regenschauer gibt.
Hier würde die Markise nichts machen und Sie wird nass oder?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");
Währ es so nicht besser?if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!= 1) && (Value("$Aktorname") eq "auf") && ($hour >= 10)){
fhem("set $Aktorname 1");
Log 1, "Beschattungsposition wird angefahren.";
} elsif (($Sonne != m/sonnig/) && (Value("$Aktorname")==1) || (sunset(-1200,"20:00","22:00"))){
fhem ("set $Aktorname 100");
was meint Ihr, kann es bei dem Wetter auch schlecht testen.
Gruß Ole
Hallo zusammen
Ich versuche das hier geschriebene zu verstehen
(gar nicht so leicht als Anfänger)
Ich habe mal einen Versuch gemacht, weil mir nicht klar ist wann das notify gestartet wird.
fhem.cfg:
define notify_test notify Weather_Wetter {TestFunktion()}
99_Utils.pm:
sub
TestFunktion()
{
my $Sonne= ReadingsVal("Weather_Wetter","condition","kein Wert");
my $Wind= ReadingsVal ("Weather_Wetter","wind","kein Wert");
Log 1, "TestFunktion wurde aufgerufen Sonne ist: $Sonne, Wind ist: $Wind";
}
Log 1:
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
2013.03.13 09:00:52 1: TestFunktion wurde aufgerufen Sonne ist: showers, Wind ist: 13
Nun habe ich im Log alle Stunde ca 30 Einträge ?
Die Frage ist warum 30 Einträge und nicht nur einer ?
Grüsse Martin
@ole30419
Bau dir doch zum Ausprobieren deine eigene Wettersituation:
[u]Fhem.cfg:[/u]
define Testaktor dummy
define Testung notify Test{Testroutine()}
[u]99_myUtils:[/u]
sub Testroutine() {\
my $Temp = 7;
my $Sonne = "sonnig";
fhem ("set Testaktor 0");
$hour = 11;
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");
}
}
Dann kannst du schön mit den Parameteren spielen.... ;o)
MfG, MisterEltako.
Hallo,
@MisterEltako ja das mache ich mal so, Danke !!!
@martin8573 ich kann es dir nicht sagen, wenn ich ein Log 1, hatte was Permanent abfragt hatte ich durchweg Einträge im Log bist ich die Abfrage gestoppt habe.
Gruß Ole
@martin8573
Es kommen entspechend deiner Definition ständig Einträge, wenn YahooWetter einen Event sendet.
Entweder du grenzt es noch ein auf einen bestimmten Wert oder baust das ganze in eine if-Abfrage, so daß nur Logeintrag erfolgt, wenn Wert geändert wurde.
define notify_test notify Weather_Wetter:(sunset.*|sunrise.*) {TestFunktion()}
MfG, MisterEltako.
Danke Euch für die Antworten.
Ja, das ist schon so, sobald YahooWetter einen Event sendet wird das notify ausgelöst wird.
Und das sind halt mehrere Events.
@MisterEltako
Variante 1 "Das Eingrenzen auf einen bestimmten Wert" mit:
define notify_test notify Weather_Wetter:(sunset.*|sunrise.*) {TestFunktion()}
verstehe ich nicht ganz, genau genommen das (sunset.*|sunrise.*)
Kannst Du mir das erklären ?
Variante 2 "Eingrenzen in einer if-Abfrage, wenn Wert geändert wurde"
Ist das die ($hour >= 10)) wie in diesem Beispiel:
if (($Temp >= 5) && ($Sonne =~ m/sonnig/) && (Value("$Aktorname")!=1) && ($hour >= 10)){...
Nein das kann es auch nicht sein...
Also irgendwo ist bei mir noch der Wurm drin.
Was ich nicht sehe, wo in den ganzen Beispielen hier das Unterdrücken bei den
mehreren Yahoo Events passiert.
Oder hab das nur ich ?
Grüsse Martin
define notify_test notify Weather_Wetter:(sunset.*|sunrise.*) ....
müsste nach meinem Verständnis das notify nur aktivieren, wenn sich der Wert sunset oder sunrise im Yahoo-Wettermodul aktualisiert.
oder:
define Sonnenaufgang_alt dummy
define Sonnenuntergang_alt dummy
define Test notify YahooWetter:(sunset.*|sunrise.*) {\
if (ReadingsValue("YahooWetter, "sunrise","") eq Value("Sonnenaufgang_alt") {......}
if (ReafingsValue("YahooWetter, "sunset","") eq Value("Sonnenuntergang_alt") {.....}
...vergleicht, ob sich die gemeldete Zeit geändert hat un führt dann die entsprechende Funktion aus.
Dies liese sich noch schöner über die Readings machen, aber erst sollte deine Funktion problemlos laufen bevor es an das Feintuning geht :-)
MfG, MisterEltako
Weather_Wetter:(sunset.*|sunrise.*)
ist ein regulärer Ausdruck, der in diesem Fall nur noch solche events druchläßt, die neben dem device Weather_Wetter die Events sunset sunrise durchläßt.
".*" steht für belibige Zeichen
"|" ist ein logisches oder.
Am besten im Web nach Perl und regulären Ausdrücken suchen - das Thema ist nicht ganz einfach.
Hier kann man sie aber einfach ausprobieren: http://regex.powertoy.org/ (//regex.powertoy.org/)
Tach auch,
Dieser Thread ist zwar schon recht alt - er beschreibt aber genau mein Vorhaben.
Daher gestatte ich mir trotz des Alters die Frage, ob das alles grundsätzlich so noch läuft und ob und wie im speziellen das Yahoo-Wetter, das ja in der hier verwendeten Form nicht mehr existiert, ersetzt wird/wurde/werden kann?
Sonnige Grüße,
Andreas
Zitat von: ahstax am 23 Juni 2019, 21:05:09
Dieser Thread ist zwar schon recht alt - er beschreibt aber genau mein Vorhaben.
Daher gestatte ich mir trotz des Alters die Frage, ob das alles grundsätzlich so noch läuft und ob und wie im speziellen das Yahoo-Wetter, das ja in der hier verwendeten Form nicht mehr existiert, ersetzt wird/wurde/werden kann?
Moin,
nimm lieber AutoShuttersControl. Sollte können was du brauchst und ist ein aktuelles Modul mit gutem Support (und guter Doku).