Beispiel #1
0
    def execute(self, module, input):
        msg = u"Nicht aktiv"

        if getItemState(
                "pOther_Manual_State_Auto_Attic_Light").intValue() != 1:
            soilMoistSensor1 = getItemState(
                "pIndoor_Plant_Sensor_Device_State1").intValue(
                ) if getItemState(
                    "pIndoor_Plant_Sensor_Device_Enabled1") == ON else 1000
            soilMoistSensor2 = getItemState(
                "pIndoor_Plant_Sensor_Device_State2").intValue(
                ) if getItemState(
                    "pIndoor_Plant_Sensor_Device_Enabled2") == ON else 1000
            soilMoistSensor3 = getItemState(
                "pIndoor_Plant_Sensor_Device_State3").intValue(
                ) if getItemState(
                    "pIndoor_Plant_Sensor_Device_Enabled3") == ON else 1000
            soilMoistSensor4 = getItemState(
                "pIndoor_Plant_Sensor_Device_State4").intValue(
                ) if getItemState(
                    "pIndoor_Plant_Sensor_Device_Enabled4") == ON else 1000

            if soilMoistSensor1 < 380 or soilMoistSensor2 < 380 or soilMoistSensor3 < 380 or soilMoistSensor4 < 380:
                msg = u"Jetzt Giessen"
            elif soilMoistSensor1 < 400 or soilMoistSensor2 < 400 or soilMoistSensor3 < 400 or soilMoistSensor4 < 400:
                msg = u"Giessen"
            else:
                msg = u"Feucht genug"

        postUpdateIfChanged("pIndoor_Plant_Sensor_Watering_Info", msg)
    def delayUpdate(self):
        efficiency = 0

        if getItemState("pGF_Utilityroom_Ventilation_Bypass") == OFF:
            if isinstance(getItemState("pGF_Utilityroom_Ventilation_Outdoor_Incoming_Temperature"), UnDefType) \
              or isinstance(getItemState("pGF_Utilityroom_Ventilation_Indoor_Outgoing_Temperature"), UnDefType) \
              or isinstance(getItemState("pGF_Utilityroom_Ventilation_Indoor_Incoming_Temperature"), UnDefType):
                return

            tempOutIn = getItemState(
                "pGF_Utilityroom_Ventilation_Outdoor_Incoming_Temperature"
            ).doubleValue()
            tempInOut = getItemState(
                "pGF_Utilityroom_Ventilation_Indoor_Outgoing_Temperature"
            ).doubleValue()
            tempInIn = getItemState(
                "pGF_Utilityroom_Ventilation_Indoor_Incoming_Temperature"
            ).doubleValue()

            if tempInOut != tempOutIn:
                efficiency = (tempInIn - tempOutIn) / (tempInOut -
                                                       tempOutIn) * 100
                efficiency = round(efficiency)
            else:
                efficiency = 100
        else:
            efficiency = 0

        postUpdateIfChanged("pGF_Utilityroom_Ventilation_Bypass_Efficiency",
                            efficiency)

        self.updateTimer = None
Beispiel #3
0
    def updateInfoMessage(self,
                          infoItem,
                          temperatureItem,
                          humidityItem,
                          co2Item=None,
                          temperatureTargetItem=None):
        #self.log.info(u">>>delay: {}".format(infoItem))

        msg = u""
        if temperatureTargetItem is not None:
            msg = u"{}({}) ".format(
                msg,
                getItemState(temperatureTargetItem).format("%.1f"))

        #self.log.info(temperatureItem)
        msg = u"{}{} °C, ".format(msg,
                                  getItemState(temperatureItem).format("%.1f"))
        #self.log.info(humidityItem)
        msg = u"{}{} %".format(msg, getItemState(humidityItem).format("%.1f"))

        if co2Item is not None:
            msg = u"{}, {} ppm".format(msg, getItemState(co2Item).format("%d"))

        postUpdateIfChanged(infoItem, msg)

        self.updateTimer[infoItem] = None
Beispiel #4
0
    def execute(self, module, input):
        moverStatus = getItemState("pOutdoor_Mower_Status").toString()

        if itemLastUpdateOlderThen("pOutdoor_Mower_WlanSignal",
                                   ZonedDateTime.now().minusMinutes(60)):
            if moverStatus != "98":
                postUpdate("pOutdoor_Mower_Status", 98)
                postUpdate(
                    "pOutdoor_Mower_StatusFormatted",
                    Transformation.transform("MAP", "robonect_status.map",
                                             "98"))
        else:
            seconds = getItemState("pOutdoor_Mower_Duration").intValue()
            hours = seconds / (60 * 60)
            seconds = seconds % (60 * 60)
            minutes = seconds / 60
            #seconds = seconds % 60

            msg = u"{} seit ".format(
                Transformation.transform("MAP", "robonect_status.map",
                                         moverStatus))
            if hours < 10: msg = u"{}0".format(msg)
            msg = u"{}{}:".format(msg, hours)
            if minutes < 10: msg = u"{}0".format(msg)
            msg = u"{}{}:".format(msg, minutes)

            postUpdateIfChanged("pOutdoor_Mower_StatusFormatted", msg)
    def delayUpdate(self):
        active = []

        if isinstance(getItemState("pGF_Utilityroom_Ventilation_Filter_Error"), UnDefType) \
            or isinstance(getItemState("pGF_Utilityroom_Ventilation_Error_Message"), UnDefType):
            return

        if getItemState("pGF_Utilityroom_Ventilation_Filter_Error") == ON:
            active.append(u"Filter")

        if getItemState("pGF_Utilityroom_Ventilation_Error_Message").toString(
        ) != "No Errors":
            active.append(u"Error: {}".format(
                getItemState(
                    "pGF_Utilityroom_Ventilation_Error_Message").toString()))

        if getItemState("pGF_Utilityroom_Ventilation_Thing_State").toString(
        ) != "Alles ok":
            active.append(u"Error: {}".format(
                getItemState(
                    "pGF_Utilityroom_Ventilation_Thing_State").toString()))

        if len(active) == 0:
            active.append(u"Alles ok")

        msg = ", ".join(active)

        postUpdateIfChanged("pGF_Utilityroom_Ventilation_State_Message", msg)

        self.updateTimer = None
Beispiel #6
0
    def execute(self, module, input):
        global ruleTimeouts
        now = ZonedDateTime.now()
        last = ruleTimeouts.get("Motiondetector_Outdoor_Main_Switch",
                                now.minusHours(1))

        if ChronoUnit.SECONDS.between(last, now) > 1:
            itemState = input["event"].getItemState()

            self.log.info(
                "MotiondetectorOutdoorSwitchRule => last: {}, now: {}, state: {}"
                .format(last, now, itemState))

            if itemState == ON:
                ruleTimeouts["Light_Outdoor"] = now

                sendCommandIfChanged(
                    "pOutdoor_Streedside_Garage_Light_Powered", OFF)
                sendCommandIfChanged(
                    "pOutdoor_Streedside_Frontdoor_Light_Powered", OFF)
                sendCommandIfChanged("pOutdoor_Carport_Light_Powered", OFF)
                sendCommandIfChanged("pOutdoor_Terrace_Light_Brightness", 0)
                sendCommandIfChanged("pOutdoor_Garden_Garage_Light_Powered",
                                     OFF)

            #ruleTimeouts["Motiondetector_Outdoor_Individual_Switches"] = now
            postUpdateIfChanged("pOutdoor_Streedside_Garage_Automatic_Switch",
                                itemState)
            postUpdateIfChanged(
                "pOutdoor_Streedside_Frontdoor_Automatic_Switch", itemState)
            postUpdateIfChanged("pOutdoor_Carport_Automatic_Switch", itemState)
            postUpdateIfChanged("pOutdoor_Terrace_Automatic_Switch", itemState)
            postUpdateIfChanged("pOutdoor_Garden_Garage_Automatic_Switch",
                                itemState)
    def execute(self, module, input):
        #self.log.info(u"{}".format(input))

        now = ZonedDateTime.now().toInstant().toEpochMilli()

        if self.lastUpdate != -1:
            currentValue = input['event'].getItemState().longValue()
            prevValue = input['event'].getOldItemState().longValue()

            # binding is uint (32)
            # => max value can be 4294967295
            # => is also reseted on dsl reconnection
            if currentValue > prevValue:
                diffValue = (currentValue - prevValue) * 8
                diffTime = (now - self.lastUpdate) / 1000.0
                speed = round(diffValue / diffTime)
                postUpdateIfChanged("FritzboxWanDownstreamCurrRate", speed)
            else:
                self.log.info(
                    u"wan traffic overflow - prev: {}, current: {}".format(
                        prevValue, currentValue))

            #self.log.info(u"Downstream {} MBit".format(speed))

        self.lastUpdate = now
Beispiel #8
0
    def execute(self, module, input):
        now = ZonedDateTime.now()

        if itemStateOlderThen("Dawn_Time", now) and itemStateNewerThen(
                "Dusk_Time", now):
            # triggers solar value update
            sendCommand("Solar_Total_Yield", REFRESH)

            sendCommand("Solar_AC_Power", REFRESH)

            acPower = getItemState('Solar_AC_Power').intValue()
            dailyConsumption = getItemState("Solar_Daily_Yield").doubleValue()

            msg = "{} W, {:.2f} kWh".format(acPower, dailyConsumption)

            if itemLastUpdateOlderThen(
                    "Solar_Total_Yield",
                    now.minusMinutes(15)) and itemStateOlderThen(
                        "Dawn_Time", now.minusMinutes(60)):
                self.log.error("Solar values not updated")

        else:
            msg = "Inaktiv"

        postUpdateIfChanged("Solar_Message", msg)
    def execute(self, module, input):
        if isinstance(input['event'].getItemState(), UnDefType):
            return

        laufzeit = input['event'].getItemState().doubleValue()

        weeks = int(math.floor(laufzeit / 168.0))
        days = int(math.floor((laufzeit - (weeks * 168.0)) / 24))

        active = []
        if weeks > 0:
            if weeks == 1:
                active.append(u"1 Woche")
            else:
                active.append(u"{} Wochen".format(weeks))

        if days > 0:
            if days == 1:
                active.append(u"1 Tag")
            else:
                active.append(u"{} Tage".format(days))

        msg = u", ".join(active)

        postUpdateIfChanged(
            "pGF_Utilityroom_Ventilation_Filter_Runtime_Message", msg)
    def delayUpdate(self):
        msg = u"{}%, {}%".format(
            getItemState("pGF_Utilityroom_Heating_Power").format("%.0f"),
            getItemState("pGF_Utilityroom_Heating_Circuit_Pump_Speed").format(
                "%.0f"))
        postUpdateIfChanged("pGF_Utilityroom_Heating_Power_Message", msg)

        self.updateTimer = None
Beispiel #11
0
    def execute(self, module, input):
        state = getItemState("pIndoor_Plant_Sensor_Watering_Info").toString()

        if state != "Feucht genug" and state != "Nicht aktiv":
            msg = state
        else:
            msg = u"Alles ok"

        postUpdateIfChanged("pIndoor_Plant_Sensor_Main_Info", msg)
Beispiel #12
0
    def execute(self, module, input):
        now = ZonedDateTime.now()

        currentErtrag = getItemState("Solar_Annual_Yield").doubleValue()
        currentEinspeisung = getItemState(
            "Electric_VZ_Jahreseinspeisung").doubleValue()

        postUpdateIfChanged("Solar_Annual_Consumption",
                            currentErtrag - currentEinspeisung)
    def delayUpdate(self):
        msg = u"{}°C, {}°C".format(
            getItemState("pGF_Utilityroom_Heating_Temperature_Offset").format(
                "%.1f"),
            getItemState("pGF_Utilityroom_Heating_Temperature_Offset_Target").
            format("%.1f"))
        postUpdateIfChanged(
            "pGF_Utilityroom_Heating_Temperature_Offset_Message", msg)

        self.updateTimer = None
Beispiel #14
0
    def updateConsumption(self, solarPower):
        consumption = self.currentDemand + solarPower

        if consumption > 0:
            postUpdateIfChanged(
                "pGF_Utilityroom_Electricity_Current_Consumption", consumption)
        else:
            self.log.info(
                u"Skip consumption update. powerDemand: {}, powerSupply: {}, solarPower: {}"
                .format(self.powerDemand, self.powerSupply, solarPower))
    def delayUpdate(self):
        if isinstance(getItemState("pGF_Utilityroom_Ventilation_Incoming"), UnDefType) \
            or isinstance(getItemState("pGF_Utilityroom_Ventilation_Outgoing"), UnDefType):
            return

        msg = u"→ {}%, ← {}%".format(
            getItemState("pGF_Utilityroom_Ventilation_Incoming").toString(),
            getItemState("pGF_Utilityroom_Ventilation_Outgoing").toString())
        postUpdateIfChanged("pGF_Utilityroom_Ventilation_Fan_Message", msg)

        self.updateTimer = None
Beispiel #16
0
    def execute(self, module, input):
        dailyEnergyDemand = getItemState(
            "pGF_Utilityroom_Electricity_Current_Daily_Demand").doubleValue()
        dailyEnergySupply = getItemState(
            "pGF_Utilityroom_Electricity_Current_Daily_Supply").doubleValue()
        dailySolarSupply = getItemState(
            "pGF_Garage_Solar_Inverter_Daily_Yield").doubleValue()

        postUpdateIfChanged(
            "pGF_Utilityroom_Electricity_Current_Daily_Consumption",
            dailyEnergyDemand - dailyEnergySupply + dailySolarSupply)
    def delayUpdate(self):
        solarCollector = getItemState(
            "pGF_Utilityroom_Heating_Temperature_Solar_Collector")
        solarStorage = getItemState(
            "pGF_Utilityroom_Heating_Temperature_Solar_Storage")
        msg = u"{}°C, {}°C".format(solarCollector.format("%.1f"),
                                   solarStorage.format("%.1f"))
        postUpdateIfChanged(
            "pGF_Utilityroom_Heating_Temperature_Solar_Message", msg)

        self.updateTimer = None
    def delayUpdate(self):
        msg = u"({}°C) {}°C, {}°C".format(
            getItemState("pOutdoor_Weather_Forecast_Temperature_4h").format(
                "%.1f"),
            getItemState("pGF_Utilityroom_Heating_Temperature_Outdoor").format(
                "%.1f"),
            getItemState("pGF_Utilityroom_Heating_Temperature_Outdoor_Subdued"
                         ).format("%.1f"))
        postUpdateIfChanged(
            "pGF_Utilityroom_Heating_Temperature_Outdoor_Message", msg)

        self.updateTimer = None
 def execute(self, module, input):
     refDay = ZonedDateTime.now()
     start = getHistoricItemState(
         "pGF_Utilityroom_Heating_Solar_Hours",
         refDay.toLocalDate().atStartOfDay(refDay.getZone())).intValue()
     aktuell = getItemState(
         "pGF_Utilityroom_Heating_Solar_Hours").intValue()
     if start > 0 and aktuell > 0:
         differenz = aktuell - start
         msg = u"{} h, {} h".format(differenz, aktuell)
         postUpdateIfChanged("pGF_Utilityroom_Heating_Solar_Hours_Message",
                             msg)
Beispiel #20
0
    def check(self):
        thing = getThing("homeconnect:api_bridge:default")
        status = thing.getStatus()
        info = thing.getStatusInfo()

        if status is not None and info is not None:
            #self.log.info(u"Home Connect bridge status: '{}',  detail: '{}'".format(status.toString(),info.toString()))
            if status.toString() != "ONLINE":
                postUpdateIfChanged("pOther_State_Message_Homeconnect",
                                    info.toString())
            else:
                postUpdateIfChanged("pOther_State_Message_Homeconnect",
                                    "Alles ok")
    def check(self):
        thing = getThing("comfoair:comfoair:default")
        status = thing.getStatus()
        info = thing.getStatusInfo()

        #self.log.info(u"{}".format(status))

        if status is not None and info is not None:
            if status.toString() != 'ONLINE':
                postUpdateIfChanged("pGF_Utilityroom_Ventilation_Thing_State",
                                    info.toString())
            else:
                postUpdateIfChanged("pGF_Utilityroom_Ventilation_Thing_State",
                                    "Alles ok")
    def execute(self, module, input):
        active = []

        if getItemState("gOutdoor_Watering_Circuits") == ON:
            active.append(u"Bewässerung")

        if getItemState("pOutdoor_Light_Automatic_Main_Switch") != ON:
            active.append(u"Beleuchtung")

        if len(active) == 0:
            active.append(u"Alles ok")

        msg = ", ".join(active)

        postUpdateIfChanged("pOther_State_Message_Garden", msg)
Beispiel #23
0
    def execute(self, module, input):
        now = ZonedDateTime.now()

        currentTotal = getItemState("Solar_Total_Yield").doubleValue()

        startTotal = getHistoricItemState(
            "Solar_Total_Yield",
            now.toLocalDate().atStartOfDay(now.getZone())).doubleValue()
        postUpdateIfChanged("Solar_Daily_Yield", currentTotal - startTotal)

        refDay = now.withYear(now.getYear()).withMonth(1).withDayOfMonth(1)
        startTotal = getHistoricItemState(
            "Solar_Total_Yield",
            refDay.toLocalDate().atStartOfDay(refDay.getZone())).doubleValue()
        postUpdateIfChanged("Solar_Annual_Yield", currentTotal - startTotal)
Beispiel #24
0
 def execute(self, module, input):
     active = []
     if getItemState("pIndoor_Plant_Sensor_Device_Enabled1") == ON:
         active.append("1")
     if getItemState("pIndoor_Plant_Sensor_Device_Enabled2") == ON:
         active.append("2")
     if getItemState("pIndoor_Plant_Sensor_Device_Enabled3") == ON:
         active.append("3")
     if getItemState("pIndoor_Plant_Sensor_Device_Enabled4") == ON:
         active.append("4")
     if getItemState("pIndoor_Plant_Sensor_Device_Enabled5") == ON:
         active.append("5")
     if getItemState("pIndoor_Plant_Sensor_Device_Enabled6") == ON:
         active.append("6")
     postUpdateIfChanged("pIndoor_Plant_Sensor_Activation_Info",
                         u", ".join(active))
    def execute(self, module, input):
        active = []
        group = "Fehler"

        ventilation_state = getItemState(
            "pGF_Utilityroom_Ventilation_State_Message").toString()
        if ventilation_state != "Alles ok":
            if ventilation_state == "Filter":
                active.append(u"Filter")
            else:
                active.append(u"Lüftung")

        if getItemState("pGF_Utilityroom_Heating_State_Message").toString(
        ) != "Alles ok":
            active.append(u"Heizung")

        if getItemState("pGF_Garage_Solar_Inverter_Is_Working") == OFF:
            active.append(u"Solar")

        if getItemState("State_Server").intValue() > 1:
            active.append(u"Server")

        if len(active) == 0:
            active.append(u"Alles ok")
            group = "Info"

        msg = u", ".join(active)

        if postUpdateIfChanged("pOther_State_Message_Main", msg):
            sendNotificationToAllAdmins("Main " + group, msg)
Beispiel #26
0
    def execute(self, module, input):
        #self.log.info(u"{}".format(input))

        global ruleTimeouts
        now = ZonedDateTime.now()
        last = ruleTimeouts.get("Light_Outdoor", now.minusHours(1))

        # No Motion Detector related events
        if ChronoUnit.SECONDS.between(last, now) > 1:
            itemName = input['event'].getItemName()

            self.log.info(
                "LightOutdoorControlRule => Automatic_Switches => OFF, last: {}, now: {}"
                .format(last, now))

            global timerMappings
            timer = timerMappings.get(itemName)
            if timer is not None:
                timer.cancel()

            for i, entry in enumerate(manualMappings):
                if entry[0] == itemName:
                    #ruleTimeouts["Motiondetector_Outdoor_Individual_Switches"] = now

                    # just an update to avoid triggering => MotiondetectorOutdoorIndividualSwitchRule
                    if postUpdateIfChanged(entry[1], OFF):
                        ruleTimeouts[
                            "Motiondetector_Outdoor_Main_Switch"] = now

                        # must be a command to inform physical knx switch
                        sendCommandIfChanged(
                            "pOutdoor_Light_Automatic_Main_Switch", OFF)
                    #self.log.info(u"{} {}".format(itemName,now-last))
                    break
    def delayUpdate(self):
        if isinstance(getItemState("pGF_Utilityroom_Ventilation_Indoor_Incoming_Temperature"), UnDefType) \
            or isinstance(getItemState("pGF_Utilityroom_Ventilation_Indoor_Outgoing_Temperature"), UnDefType):
            return

        msg = u"→ {}°C, ← {}°C".format(
            getItemState(
                "pGF_Utilityroom_Ventilation_Indoor_Incoming_Temperature").
            format("%.1f"),
            getItemState(
                "pGF_Utilityroom_Ventilation_Indoor_Outgoing_Temperature").
            format("%.1f"))
        postUpdateIfChanged(
            "pGF_Utilityroom_Ventilation_Indoor_Temperature_Message", msg)

        self.updateTimer = None
    def execute(self, module, input):
        operation = getItemState("pGF_Utilityroom_Washer_OperationState")
        if operation != NULL and operation != UNDEF:
            mode = Transformation.transform("MAP", "homeconnect_operation.map",
                                            operation.toString())
            msg = u"{}".format(mode)

            runtime = getItemState(
                "pGF_Utilityroom_Washer_RemainingProgramTimeState")
            if runtime != NULL and runtime != UNDEF and runtime.intValue(
            ) > 0 and operation.toString() in ['Paused', 'Delayed', 'Run']:
                runtime = Transformation.transform(
                    "JS", "homeconnect_runtime.js",
                    u"{}".format(runtime.intValue()))
                msg = u"{}, {}".format(msg, runtime)

            postUpdateIfChanged("pGF_Utilityroom_Washer_Message", msg)
    def delayUpdate(self):
        if getItemState(
                "pGF_Utilityroom_Heating_Solar_Pump_State").intValue() == 1:
            msg = "an"
        else:
            msg = "aus"

        msg = msg + ", "

        if getItemState("pGF_Utilityroom_Heating_Solar_Reheating_State"
                        ).intValue() == 1:
            msg = msg + "an"
        else:
            msg = msg + "aus"

        postUpdateIfChanged("pGF_Utilityroom_Heating_Solar_State_Message", msg)

        self.updateTimer = None
    def execute(self, module, input):

        power_state = getItemState("pGF_Kitchen_Coffeemaker_Power_State")
        if power_state == ON:
            mode = getItemState(
                "pGF_Kitchen_Coffeemaker_Operation_State").toString()
            msg = u"{}".format(mode)

            if mode != "Inactive":
                runtime = getItemState(
                    "pGF_Kitchen_Coffeemaker_Program_Progress_State")
                if runtime != NULL and runtime != UNDEF and runtime.intValue(
                ) > 0:
                    msg = u"{}, {} %".format(msg, runtime)
        else:
            msg = u"Aus"

        postUpdateIfChanged("pGF_Kitchen_Coffeemaker_Message", msg)