Beschattungssteuerung - Problem

Begonnen von caldir65, 23 Juli 2013, 13:54:42

Vorheriges Thema - Nächstes Thema

caldir65

Hallo,

ich habe einmal die Beschattungssteuerung von SkodaSascha / MisterEltako (s. Link übernommen und etwas für meine Bedürfnisse angepaßt.

sub
Beschattungssteuerung($$) {
# Parameter: $hour, $month
my $hour = shift;
my $month = shift;
my $Temp = ReadingsVal("Wetter","temp_c","999");
my $Sonne = ReadingsVal("Wetter","condition","kein Wert");
my $Terassentuer = ReadingsVal ("wz_Tuerkontakt_Terasse", "state", "open")
Log 3, "Readingswerte: $hour, $month, $Temp, $Sonne";

if (($Temp==999) || ($Sonne eq "kein Wert")) {
Log 3, "Yahoo-Wetter nicht erreichbar oder kein Wert geliefert";
return;}

if (($month >= 5) && ($month <= 9)){
   Log 3, "Beschattungssteuerung aktiv";
   if (($hour >= 10)&& ($hour <= 20)){
        if (($Temp >= 21)&&(Value("wz_RolladenStrasse") >= 10)){
             if (($Sonne eq "sonnig")||($Sonne eq "teilweise wolkig")||($Sonne eq "bewölkt")){
                 Log 3, "Beschattungsposition wird angefahren...";
                 Log 3, "Rolladen öffnet 80 min vor Sunset";
                 fhem("set wz_RolladenStrasse 10");
                 fhem("set wz_RolladenGarten 10");
                 fhem("set kz2_RolloJoschua off-for-timer 19");
                 # wenn Terassentür offen, dann nur 1/2 runter, um nicht auszusperren
                 if (($Terassentuer eq "tilted")||($Terassentuer eq "closed")){
                     fhem("set wz_RolladenTerasse 10");
                 }elsif(($Terassentuer eq "open")){
                     LOG 3, "Terassentuer offen, Beschattung auf Zugang"
                     fhem("set wz_RolladenTerasse 10");
                 };
            }elsif(Value("wz_RolladenStrasse") <= 10){
                #wenn nicht mehr ,,sonnig" oder ,,teilweise wolkig oder "bewolkt" dann:
                Log 3, " Beschattungsposition wird aufgehoben...";
                fhem("set wz_RolladenAlle 100");
                fhem("set kz2_RolloJoschua Auf");                
            };
            #Beschattung egal ob sonnig oder nicht bei >20° oder 21:00 Uhr
            # aufgehoben
            if (defined($defs{Schoenwetter})){fhem('delete Schoenwetter')};
            fhem("define Schoenwetter at +{sunset_abs(-4800)} set wz_RolladenAlle 100");
            fhem("define Schoenwetter at +{sunset_abs(-4800)} set kz2_RolloJoschua Auf");
   
        }
    }
}

}


Wenn ich diesen Code jetzt in die 99_MyUtils einfüge und diese sichere (der alte Code wird beibehalten ;-)), dann bekomme ich diese Fehlermeldung:

syntax error at ./FHEM/99_MyUtils.pm line 25, near "my " Global symbol "$Temp" requires explicit package name at ./FHEM/99_MyUtils.pm line 25. syntax error at ./FHEM/99_MyUtils.pm line 28, near ") Log " Global symbol "$Temp" requires explicit package name at ./FHEM/99_MyUtils.pm line 30. Global symbol "$Temp" requires explicit package name at ./FHEM/99_MyUtils.pm line 37. syntax error at ./FHEM/99_MyUtils.pm line 48, near "LOG 3"

Wo liegt da jetzt wohl der Fehler?

Vielen Dank.

Gruß
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 128GB SSD, Lubuntu 24.04.01LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

betateilchen

1.) am Ende von "my $Terrassentuer" fehlt ein Strichpunkt.

2.) Du solltest Dich entscheiden, ob Du im Fehlerfall "999" oder 999 an $Temp zuweisen möchtest. Beim ReadingsVal nimmst Du einen String, weiter unten prüfst Du aber numerisch. (nicht wirklich falsch, aber unschön)

3.)

                if (($Terassentuer eq "tilted")||($Terassentuer eq "closed")){
                     fhem("set wz_RolladenTerasse 10");
                 }elsif(($Terassentuer eq "open")){
                     LOG 3, "Terassentuer offen, Beschattung auf Zugang"
                     fhem("set wz_RolladenTerasse 10");


Damit wird der wz_RolladenTerasse meiner Meinung nach IMMER auf 10 gesetzt, unabhängig vom Türkontakt. Der einzige Unterschied: bei "open" wird das nochmal extra ins Log geschrieben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

caldir65

Hallo,

Zitat von: betateilchen schrieb am Di, 23 Juli 2013 14:111.) am Ende von "my $Terrassentuer" fehlt ein Strichpunkt.
Uups, da sieht man manchmal den Wald vor lauter Bäumen nicht mehr ;-) Beseitigt, jetzt kommt auch kein Fehler mehr...

Zitat2.) Du solltest Dich entscheiden, ob Du im Fehlerfall "999" oder 999 an $Temp zuweisen möchtest. Beim ReadingsVal nimmst Du einen String, weiter unten prüfst Du aber numerisch. (nicht wirklich falsch, aber unschön)
Du hast Recht - ich habe da mal eine numerische von gemacht ... Das kommt davon, wenn man sich gerade erst am Anfang steht mit der Auseinandersetzung mit der Programmierung ;-)

Zitat3.)

[code]                 if (($Terassentuer eq "tilted")||($Terassentuer eq "closed")){
                     fhem("set wz_RolladenTerasse 10");
                 }elsif(($Terassentuer eq "open")){
                     LOG 3, "Terassentuer offen, Beschattung auf Zugang";
                     fhem("set wz_RolladenTerasse 10");

Damit wird der wz_RolladenTerasse meiner Meinung nach IMMER auf 10 gesetzt, unabhängig vom Türkontakt. Der einzige Unterschied: bei "open" wird das nochmal extra ins Log geschrieben.

Damit hast Du natürlich recht - richtig wäre 66 bei offen - damit ich auch wieder ins Haus komme trotz Beschattungssteuerung ;-) Abgesehen davon - fehlt da nicht auch noch ein ";" hinter dem Log-Eintrag?

Gruß
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 128GB SSD, Lubuntu 24.04.01LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

betateilchen

Zitat von: caldir65 schrieb am Mi, 24 Juli 2013 08:44Abgesehen davon - fehlt da nicht auch noch ein ";" hinter dem Log-Eintrag?

ja, aber ich dachte, da kommst Du dann bei der nächsten Fehlermeldung irgendwann selbst drauf ;) - hat ja auch funktioniert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

caldir65

Hm, den hat er mir aber nicht gezeigt - der ist mir bei der Korrektur der Terrassentür aufgefallen ;-)

Danke
Alte Techniker-Regel: "kaum macht man es richtig, funktioniert es auch"
------
Dell Wyse5070 ThinClient 16GBRam, 128GB SSD, Lubuntu 24.04.01LTS, fhem (aktuell), debmatic, Homematic-Devs, ConBee II und deConz, viele Shellys, Rademacher, NextCloud-Anbindung, FullyKioskBrowser+FUIP uvm.

betateilchen

den hätte er Dir gezeigt, wenn das Programm zum ersten Mal an die Stelle kommt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wtue

#6
@ caldir65

Hallo ,
wie hast du den Aufruf der Steuerung gelöst? Ich würde gern immer dann wenn bei Yahoo Wetterdaten geholt wurden auch die Beschattung triggern um zu prüfen of was zu tun ist. Also in der fhem.cfg muss ein at oder notify den Job erledigen. Aber wie?

Gruß

ok, ich habs jetzt so gelöst:
define Beschattung notify HomeWeather:condition.* {DoBeschattung($hour, $month)}
scheint zu funktionieren. HomeWeather ist die Wetterinfo für meinen Ort und {DoBeschattung($hour, $month)} ist im wesendlichen der Code oben in diesem Post.
Raspi B+ mit HM-CFG-USB umgestellt von FB7390 mit CUL
8 HM-CC-RT-DN / 3 HM-LC-Bl1-FM / 10 HM-LC-Bl1PBU-FM / 1 HM-LC-Sw1PBU-FM / HM-LC-DIM1T-FM
3 FBDECT Schaltsteckdosen als Energiemonitore

strauch

Ich hab das bei mir mit einem Threshold gelöst. Wobei ich auch erst den Rollladen runterfahre wenn in der Wohnung eine gewisse Temperatur erreicht wird und mein FS20SD sagt es ist Sonne, mir ist da Yahoo zu ungenau. An so Tagen wie heute will ich erst das die Rollladen runterfahren wenn 21,5° in der Bude sind:

define threshold_wz_Rolladen THRESHOLD wz_Heizung:measured-temp:0:21.5 AND bk_Sonne:state:on dummy_Rolladen|{if (ReadingsVal("wz_Tuergriff","state",0) eq "open") {fhem("set @ links")} else {fhem("set @ beide")} }|set @ auf|1
attr threshold_wz_Rolladen state_format _m _dv


Der Threshold wird ja immer dann aufgerufen, wenn sich ein Wert ändert, entweder die Temperatur oder die Sonne. Schön wäre noch wenn ich den Türgriff auch noch als Sensor einbinden kann. Muss ich mal nachschauen ob das geht.

Mal schauen hab das erst mal programmiert und beobachte mit einem Plot, bevor ich das ganze auf die Rollladen loslasse. In den Sommermonaten werde ich den Wert von 21.5 runtersetzten. Mal schauen auf wie viel.
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Damian

Zitat von: strauch am 13 März 2014, 11:26:06
Schön wäre noch wenn ich den Türgriff auch noch als Sensor einbinden kann. Muss ich mal nachschauen ob das geht.

Aber sicher doch!

Und nicht nur das. Du könntest auch noch zusätzlich die Außentemperatur als Bedingung hinzufügen - structure ist dein Freund :)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

strauch

Zitat von: Damian am 13 März 2014, 19:31:39
Aber sicher doch!

Und nicht nur das. Du könntest auch noch zusätzlich die Außentemperatur als Bedingung hinzufügen - structure ist dein Freund :)

Das hab ich mir gedacht, da muss ich mich mal hinsetzten und logisch denken :-).
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.