Mit Online Wetter z.B. Rolladen steuern?

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

Vorheriges Thema - Nächstes Thema

ole30419

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
MfG Ole

Guido

Hallo Ole,

schau dir mal das Twilight Modul an, damit kann man so was machen

Gruß

Guido

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

broadway

Das sieht sehr interessant aus. Aber was verbirgt sich denn hinter

my $weatherDevice = "MunichWeather";

, zur Vervollständigung der Lösung?
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

MisterEltako

@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.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

MisterEltako

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.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

UliM

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-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

MisterEltako

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.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

UliM

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).

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

MisterEltako

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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

ole30419

...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?
MfG Ole

MisterEltako

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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

ole30419

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 ,-))
MfG Ole