// Steuerung der Rollos/Raffstore in Abhaengigkeit von Winkel (Azimut), // Temperatur, Lichtstaerke und Hoehe (Elevation). // Die Lichtstaerke wird ueber eine extra Rule ermittelt. Ziel ist es, // dass erst nach 20 Minuten Sonnenschein, die Rollos herunter fahren. // Wenn also bei einem Regentag, mal kurz ( kleiner 20 Minuten) die // Sonne da ist, soll nicht sofort alles runter fahren. Dann hatte man // ggf. am fruehen Morgen alles dunkeler im Haus. // Sollwert fuer Winkel Einfall und Ausfall der jeweiligen Hausseite // Einstellbarkeit ueber GUI ueberfluessig var Number SunProAzimutzOstEin = 12 // hard codiert var Number SunProAzimutzOstAus = 135 // hard codiert var Number SunProAzimutzSuedEin = 68 // hard codiert var Number SunProAzimutzSuedAus = 220 // hard codiert var Number SunProAzimutzWestEin = 146 // hard codiert var Number SunProAzimutzWestAus = 298 // hard codiert var Number SunProAzimutzNordEin = 229 // hard codiert var Number SunProAzimutzNordAus = 313 // hard codiert var Number SunProAzimutzErLiEin = 180 // hard codiert var Number SunProAzimutzErLiAus = 330 // hard codiert var Number SunProAzimutzErReEin = 270 // hard codiert var Number SunProAzimutzErReAus = 313 // hard codiert // Wenn die Sonne unter geht - gilt nur fuer den Norden var Number SunProNordElevation = 15 // hard codiert // Soll Wert feur Lichtstaerke ab wann die Rollos runter gehen sollen var Number SunProLichtNord = 1090 var Number SunProLichtSued = 1140 var Number SunProLichtOst = 1100 var Number SunProLichtWest = 1130 var Number SunProLichtErLi = 1075 var Number SunProLichtErRe = 1070 rule "SunPro" when // Time cron "0 */1 * * * ?" // 1 Min zum testen // Time cron "0 */2 * * * ?" // 30 sec zum testen Time cron "20 */5 * * * ?" // alle 5 min then logDebug("sun-protecton","Nord Licht : "+SunProLichtNord+" < "+WetterLichtWAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzNordEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzNordAus+" Activ : "+SunProNordActiv.state.toString+" Status : "+SunProStatusNord.state) logDebug("sun-protecton","Ost Licht : "+SunProLichtOst+ " < "+WetterLichtOAvg.state.format("%.0f")+" Winkel : " +SunProAzimutzOstEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzOstAus+" Avtiv : "+SunProOstActiv.state.toString+" Status : "+SunProStatusOst.state) logDebug("sun-protecton","Sued Licht : "+SunProLichtSued+" < "+WetterLichtSAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzSuedEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzSuedAus+" Activ : "+SunProSuedActiv.state.toString+" Status : "+SunProStatusSued.state) logDebug("sun-protecton","West Licht : "+SunProLichtWest+" < "+WetterLichtWAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzWestEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzWestAus +" Activ : "+SunProWestActiv.state.toString+" Status : "+SunProStatusWest.state) logDebug("sun-protecton","ErRe Licht : "+SunProLichtErRe+" < "+WetterLichtWAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzErReEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErReAus +" Activ : "+SunProErReActiv.state.toString+" Status : "+SunProStatusErRe.state) logDebug("sun-protecton","Temp Aussen Ist : "+TempAussen.state.toString+" > Soll : "+SunProSollTempAussen.state) logDebug("sun-protecton","Temp Aussen A3D : "+TempAussenAvg3D.state.format("%.1f")+" > Soll 3D : "+SunProSoll3DTempAussen.state) logDebug("sun-protecton","Ev : "+astro_Elevation.state.format("%.0f")+" > Soll "+SunProSollElevation) logDebug("sun-protecton","Ev Nord : "+SunProNordElevation) // ---------------------------------------------------------------------------------- // ------ NORD NORD NORD ---------------------------------------------- // ---------------------------------------------------------------------------------- logDebug("sun-protecton","Nord ein : "+SunProStatusNord.state+" Winkel : "+SunProAzimutzNordEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzNordAus) logDebug("sun-protecton","Nord ... ") if( (astro_Azimuth.state > SunProAzimutzNordEin) && (astro_Azimuth.state < SunProAzimutzNordAus) && (astro_Elevation.state > SunProNordElevation) && (WetterLichtWAvg.state > SunProLichtNord) && (TempAussen.state > SunProSollTempAussen.state) && (TempAussenAvg3D.state > SunProSoll3DTempAussen.state) && (SunProNordActiv.state != OFF) ) { logInfo("sun-protecton","Nord ein : "+SunProStatusNord.state+" Winkel : "+SunProAzimutzNordEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzNordAus) if (SunProStatusNord.state != ON ) { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 7, "HIT") postUpdate(SunProStatusNord, "ON") logInfo("sun-protecton","Nord ein Licht : "+SunProLichtNord+" < "+WetterLichtWAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzNordEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzNordAus+" State : "+SunProNordActiv.state.toString+" Status : "+SunProStatusNord.state) logInfo("sun-protecton","Temp Ist : "+TempAussen.state.toString+" > Soll: "+SunProSollTempAussen) } } else { logDebug("sun-protecton","Nord Aus 1") if ( (SunProStatusNord.state == ON ) && (astro_Elevation.state < SunProSollElevation) && (astro_Azimuth.state > SunProAzimutzNordAus) ) // Sonne geht weg { logDebug("sun-protecton","Nord Aus 2") if (SunProBlockRolloAbendsHoch.state != ON) { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 8, "HIT") logDebug("sun-protecton","Nord-rauf---------: "+SunProStatusNord.state+" Winkel : "+SunProAzimutzNordEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzNordAus) } postUpdate(SunProStatusNord, "OFF") } } // ---------------------------------------------------------------------------------- // ------ SUED SUED SUED ---------------------------------------------- // ---------------------------------------------------------------------------------- logDebug("sun-protecton","Sued 1") logDebug("sun-protecton","Winkel Sued A : "+SunProAzimutzSuedEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzSuedAus) if( (astro_Azimuth.state > SunProAzimutzSuedEin) && // Sonne kommt um die Ecke (astro_Azimuth.state < SunProAzimutzSuedAus) && // Sonne geht weg (WetterLichtSAvg.state > SunProLichtSued) && (TempAussen.state > SunProSollTempAussen.state) && (TempAussenAvg3D.state > SunProSoll3DTempAussen.state) && (SunProSuedActiv.state != OFF) ) { logDebug("sun-protecton","Sued-ein----------------------------") if (SunProStatusSued.state != ON ) { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 3, "HIT") postUpdate(SunProStatusSued, "ON") logInfo("sun-protecton","Sued ein Licht : "+SunProLichtSued+" < "+WetterLichtSAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzSuedEin+" > "+astro_Azimuth.state.format("%.0f") +" < "+SunProAzimutzSuedAus+" State : "+SunProSuedActiv.state.toString+" Status : "+SunProStatusSued.state) logInfo("sun-protecton","Temp Ist : "+TempAussen.state.toString+" > Soll: "+SunProSollTempAussen) } } else { if ( (SunProStatusSued.state == ON ) && (astro_Azimuth.state > SunProAzimutzSuedAus) ) // Sonne geht weg { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 4, "HIT") postUpdate(SunProStatusSued, "OFF") logInfo("sun-protecton","Sued aus rauf ------- ; "+SunProStatusSued.state+" Winkel : "+SunProAzimutzSuedEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzSuedAus) } } // ---------------------------------------------------------------------------------- // ------ WEST WEST WEST ---------------------------------------------- // ---------------------------------------------------------------------------------- logDebug("sun-protecton","West 1") if( (astro_Azimuth.state > SunProAzimutzWestEin) && (astro_Azimuth.state < SunProAzimutzWestAus) && (WetterLichtSAvg.state > SunProLichtWest) && (TempAussenAvg3D.state > SunProSoll3DTempAussen.state) && (TempAussen.state > SunProSollTempAussen.state) && (SunProWestActiv.state != OFF) ) { logInfo("sun-protecton"," - West Licht : "+SunProLichtWest+" < Ist : "+WetterLichtWAvg.state.toString) if (SunProStatusWest.state != ON) { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 5, "HIT") postUpdate(SunProStatusWest, "ON") logInfo("sun-protecton","West ein Licht : "+SunProLichtWest+" < "+WetterLichtWAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzWestEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzWestAus +" State : "+SunProWestActiv.state.toString+" Status : "+SunProStatusWest.state) } } else { if ( (SunProStatusWest.state == ON) && (astro_Elevation.state < SunProSollElevation) && (astro_Azimuth.state > SunProAzimutzWestAus) ) // Sonne geht weg { logInfo("sun-protecton","West 2 Aus") // TODO XXXXXXX TODO YYYYYYYYYYY TODO ... Abends Hoch klaeren.... wenns schon dunkel ist faehrt es hoch if (SunProBlockRolloAbendsHoch.state != ON) { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 6, "HIT") logInfo("sun-protecton","West aus rauf ------ : "+SunProStatusWest.state+" Winkel : "+SunProAzimutzWestEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzWestAus) } postUpdate(SunProStatusWest, "OFF") } } // ---------------------------------------------------------------------------------- // ------ ErLi ErLi ErLi ---------------------------------------------- // ---------------------------------------------------------------------------------- logDebug("sun-protecton","ErLi 1") logDebug("sun-protecton","Winkel Azi : "+SunProAzimutzErLiEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErLiAus) logDebug("sun-protecton","Winkel Ele : "+astro_Elevation.state.format("%.0f")+" > "+SunProSollElevation) logDebug("sun-protecton","ErLi Licht : "+SunProLichtErLi+" < "+WetterLichtWAvg.state.format("%.0f")) logDebug("sun-protecton","Activ : "+SunProErLiActiv.state.toString+" Status : "+SunProStatusErLi.state) if( (astro_Azimuth.state > SunProAzimutzErLiEin) && (astro_Azimuth.state < SunProAzimutzErLiAus) && (astro_Elevation.state > SunProSollElevation) && (WetterLichtWAvg.state > SunProLichtErLi) && (TempAussenAvg3D.state > SunProSoll3DTempAussen.state) && (TempAussen.state > SunProSollTempAussen.state) && (SunProErLiActiv.state != OFF) ) { logInfo("sun-protecton"," - ErLi Licht : "+SunProLichtErLi+" < Ist : "+WetterLichtWAvg.state.toString) if (SunProStatusErLi.state != ON ) { logInfo("sun-protecton","ErLi ein Licht : "+SunProLichtErLi+" < "+WetterLichtWAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzErLiEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErLiAus +" State : "+SunProErLiActiv.state.toString+" Status : "+SunProStatusErLi.state) logInfo("sun-protecton","Temp Ist : "+TempAussen.state.toString+" > Soll: "+SunProSollTempAussen) val actions = getActions("lcn","lcn:module:bus:S000M160") actions.hitKey("A", 5, "HIT") postUpdate(SunProStatusErLi, "ON") } } else { if ( (SunProStatusErLi.state==ON ) && (astro_Azimuth.state > SunProAzimutzErLiAus) && (astro_Elevation.state < SunProSollElevation) ) { if (SunProBlockRolloAbendsHoch.state != ON) { val actions = getActions("lcn","lcn:module:bus:S000M160") actions.hitKey("A", 6, "HIT") logInfo("sun-protecton","ErLi aus rauf ------: "+SunProStatusErLi.state+" Winkel : "+SunProAzimutzErLiEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErLiAus) } postUpdate(SunProStatusErLi, "OFF") } } // ---------------------------------------------------------------------------------- // ------ ErRe ErRe ErRe ---------------------------------------------- // ---------------------------------------------------------------------------------- logDebug("sun-protecton","ErRe 1") if ( (astro_Azimuth.state > SunProAzimutzErReEin) && (astro_Azimuth.state < SunProAzimutzErReAus) && (astro_Elevation.state > SunProSollElevation) && (WetterLichtWAvg.state > SunProLichtErRe) && (TempAussenAvg3D.state > SunProSoll3DTempAussen.state) && (TempAussen.state > SunProSollTempAussen.state) && (SunProErReActiv.state != OFF) ) { logInfo("sun-protecton","ErRe ein : "+SunProLichtErRe+" > Ist : "+WetterLichtWAvg.state.format("%.0f")+" Status : "+SunProStatusErRe.state+" Winkel :"+SunProAzimutzErReEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErReAus) if (SunProStatusErRe.state != ON ) { val actions = getActions("lcn","lcn:module:bus:S000M160") actions.hitKey("A", 7, "HIT") postUpdate(SunProStatusErRe, "ON") logInfo("sun-protecton","ErRe ein runter : "+SunProStatusErRe.state+" Winkel :"+SunProAzimutzErReEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErReAus) logInfo("sun-protecton","Temp Ist : "+TempAussen.state.toString+" > Soll: "+SunProSollTempAussen) } } else { if ( (SunProStatusErRe.state==ON ) && (astro_Elevation.state < SunProSollElevation) && (astro_Azimuth.state > SunProAzimutzErReAus) ) // Sonne geht weg { if (SunProBlockRolloAbendsHoch.state != ON) { logInfo("sun-protecton","ErRe aus rauf -----------: "+SunProStatusErRe.state+" Winkel :"+SunProAzimutzErReEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzErReAus) val actions = getActions("lcn","lcn:module:bus:S000M160") actions.hitKey("A", 8, "HIT") } postUpdate(SunProStatusErRe, "OFF") } } // ---------------------------------------------------------------------------------- // ------ OST OST OST ---------------------------------------------- // ---------------------------------------------------------------------------------- logDebug("sun-protecton","Winkel Ost A : "+SunProAzimutzOstEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzOstAus) logDebug("sun-protecton","Winkel E : "+astro_Elevation.state+" > "+SunProSollElevation) logDebug("sun-protecton","Ost Licht : "+SunProLichtOst+" < "+WetterLichtOAvg.state.format("%.0f")) logDebug("sun-protecton","Ost Activ : "+SunProOstActiv.state.toString+" Status : "+SunProStatusOst.state) logDebug("sun-protecton","Ost 1b") if( (astro_Azimuth.state > SunProAzimutzOstEin) && (astro_Azimuth.state < SunProAzimutzOstAus) && (WetterLichtOAvg.state > SunProLichtOst) && (TempAussenAvg3D.state > SunProSoll3DTempAussen.state) && (TempAussen.state > SunProSollTempAussen.state) && (SunProOstActiv.state != OFF) ) { logDebug("sun-protecton","Ost ein : "+SunProStatusOst.state+" Winkel : "+SunProAzimutzOstEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzOstAus) if (SunProStatusOst.state != ON ) { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 1, "HIT") postUpdate(SunProStatusOst, "ON") logInfo("sun-protecton","Ost ein Licht : "+SunProLichtOst+" < "+WetterLichtOAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzOstEin+" > "+astro_Azimuth.state.format("%.0f") +" < "+SunProAzimutzOstAus+" State : "+SunProOstActiv.state.toString+" Status : "+SunProStatusOst.state) logInfo("sun-protecton","Temp Ist : "+TempAussen.state.toString+" > Soll: "+SunProSollTempAussen) // Wenn Ost runter geht, dann sollte auch Sued runter fahren. // Auch wenn Sued Lichtstaerke noch nicht so hoch ist! createTimer(now.plusSeconds(30)) [ val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 3, "HIT") postUpdate(SunProStatusSued, "ON") postUpdate(SunProStatusOst, "ON") logInfo("sun-protecton","Ost ein (+ Sued) Licht : "+SunProLichtOst+" < "+WetterLichtSAvg.state.format("%.0f")+" Winkel : "+SunProAzimutzSuedEin+" > "+astro_Azimuth.state.format("%.0f") +" < "+SunProAzimutzSuedAus+" State : "+SunProSuedActiv.state.toString+" Status : "+SunProStatusSued.state) ] } } else { if ( (SunProStatusOst.state == ON ) && (astro_Azimuth.state > SunProAzimutzOstAus) ) // Sonne geht weg { val actions = getActions("lcn","lcn:module:bus:S000M155") actions.hitKey("C", 2, "HIT") postUpdate(SunProStatusOst, "OFF") logInfo("sun-protecton","Ost aus rauf -------- : "+SunProStatusOst.state+" Winkel "+SunProAzimutzOstEin+" > "+astro_Azimuth.state.format("%.0f")+" < "+SunProAzimutzOstAus) } } logDebug("sun-protecton","Ende") end