diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 9122790..0abc851 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,7 @@ - - + diff --git a/octoprint_mystromswitch/__init__.py b/octoprint_mystromswitch/__init__.py index 086f55e..cd45b0e 100644 --- a/octoprint_mystromswitch/__init__.py +++ b/octoprint_mystromswitch/__init__.py @@ -152,243 +152,243 @@ class MyStromSwitchPlugin(octoprint.plugin.SettingsPlugin, return -def _status_timer_task(self): - if self.ip is not None: - try: + def _status_timer_task(self): + if self.ip is not None: + try: + try: + request = requests.get( + 'http://{}/report'.format(self.ip), timeout=1) + if request.status_code == 200: + timestamp = time.time() + data = request.json() + if not self.lastTimeStamp == 0: + intervall = timestamp - self.lastTimeStamp + # Energy in Wh + self.energy = self.energy + (intervall * data["power"] / 3600) + self._logger.debug( + "Energy: " + str(self.energy) + " interval: " + str(intervall) + " power: " + str( + data["power"])) + self.lastTimeStamp = timestamp + data["energy"] = self.energy + data["onOffButtonEnabled"] = self.onOffButtonEnabled + data["showShutdownOctopiOption"] = self.showShutdownOctopiOption + data["showPowerOffPrintFinishOption"] = self.showPowerOffPrintFinishOption + data["automaticShutdownEnabled"] = self.shutdownAfterPrintFinished + data["automaticPowerOffEnabled"] = self.powerOffAfterPrintFinished + self._plugin_manager.send_plugin_message(self._identifier, data) + return + except (requests.exceptions.ConnectionError, ValueError) as e: + self._logger.exception(e) + except Exception as exp: + self._logger.exception(exp) + else: + self._logger.info("Ip is None") + data = {"relay": True, "energy": 0, "onOffButtonEnabled": False, "showShutdownOctopiOption": False, + "showPowerOffPrintFinishOption": False, "automaticShutdownEnabled": self.shutdownAfterPrintFinished, + "v": self.powerOffAfterPrintFinished} + self._plugin_manager.send_plugin_message(self._identifier, data) + + + def _setRelaisState(self, newState): + nbRetry = 0 + value = '0' + if newState: + value = '1' + while nbRetry < 3: try: request = requests.get( - 'http://{}/report'.format(self.ip), timeout=1) - if request.status_code == 200: - timestamp = time.time() - data = request.json() - if not self.lastTimeStamp == 0: - intervall = timestamp - self.lastTimeStamp - # Energy in Wh - self.energy = self.energy + (intervall * data["power"] / 3600) - self._logger.debug( - "Energy: " + str(self.energy) + " interval: " + str(intervall) + " power: " + str( - data["power"])) - self.lastTimeStamp = timestamp - data["energy"] = self.energy - data["onOffButtonEnabled"] = self.onOffButtonEnabled - data["showShutdownOctopiOption"] = self.showShutdownOctopiOption - data["showPowerOffPrintFinishOption"] = self.showPowerOffPrintFinishOption - data["automaticShutdownEnabled"] = self.shutdownAfterPrintFinished - data["automaticPowerOffEnabled"] = self.powerOffAfterPrintFinished - self._plugin_manager.send_plugin_message(self._identifier, data) - return - except (requests.exceptions.ConnectionError, ValueError) as e: - self._logger.exception(e) - except Exception as exp: - self._logger.exception(exp) - else: - self._logger.info("Ip is None") - data = {"relay": True, "energy": 0, "onOffButtonEnabled": False, "showShutdownOctopiOption": False, - "showPowerOffPrintFinishOption": False, "automaticShutdownEnabled": self.shutdownAfterPrintFinished, - "v": self.powerOffAfterPrintFinished} - self._plugin_manager.send_plugin_message(self._identifier, data) - - -def _setRelaisState(self, newState): - nbRetry = 0 - value = '0' - if newState: - value = '1' - while nbRetry < 3: - try: - request = requests.get( - 'http://{}/relay'.format(self.ip), params={'state': value}, timeout=1) - if request.status_code == 200: - return - else: - self._logger.info( - "Could not set new Relais State, Http Status Code: {}".format(request.status_code)) - except requests.exceptions.ConnectionError: - self._logger.info("Error during set Relais state") - nbRetry = nbRetry + 1 - - -# Sets the switch to a specific inverse newState, -# waits for a specified amount of time (max 3h), -# then sets the the switch to the newState. -def _powerCycleRelais(self, newState, time): - nbRetry = 0 - value = 'on' - if newState: - value = 'off' - while nbRetry < 3: - try: - try: - self._logger.info("try to send Powercycle Request") - self._logger.info('http://{}/timer'.format(self.ip)) - request = requests.post( - 'http://{}/timer'.format(self.ip), params={'mode': value, 'time': time}, timeout=1) + 'http://{}/relay'.format(self.ip), params={'state': value}, timeout=1) if request.status_code == 200: return else: self._logger.info( - "Could not powerCycle Relais, Http Status Code: {}".format(request.status_code)) - except requests.exceptions.ConnectionError as e: - self._logger.exception(e) - self._logger.info("Error during powerCycle Relais: " + str(e.message)) - except Exception as exp: - self._logger.exception(exp) - nbRetry = nbRetry + 1 + "Could not set new Relais State, Http Status Code: {}".format(request.status_code)) + except requests.exceptions.ConnectionError: + self._logger.info("Error during set Relais state") + nbRetry = nbRetry + 1 -def _toggleRelay(self): - nbRetry = 0 - while nbRetry < 3: - try: - request = requests.get( - 'http://{}/toggle'.format(self.ip), timeout=1) - if request.status_code == 200: - return - else: - self._logger.info("Could not toggle Relay State, Http Status Code: {}".format(request.status_code)) - except requests.exceptions.ConnectionError: - self._logger.info("Error during toggle Relais state") - nbRetry = nbRetry + 1 + # Sets the switch to a specific inverse newState, + # waits for a specified amount of time (max 3h), + # then sets the the switch to the newState. + def _powerCycleRelais(self, newState, time): + nbRetry = 0 + value = 'on' + if newState: + value = 'off' + while nbRetry < 3: + try: + try: + self._logger.info("try to send Powercycle Request") + self._logger.info('http://{}/timer'.format(self.ip)) + request = requests.post( + 'http://{}/timer'.format(self.ip), params={'mode': value, 'time': time}, timeout=1) + if request.status_code == 200: + return + else: + self._logger.info( + "Could not powerCycle Relais, Http Status Code: {}".format(request.status_code)) + except requests.exceptions.ConnectionError as e: + self._logger.exception(e) + self._logger.info("Error during powerCycle Relais: " + str(e.message)) + except Exception as exp: + self._logger.exception(exp) + nbRetry = nbRetry + 1 -def on_api_command(self, command, data): - if command == "enableRelais": - self._logger.info("enableRelais") - self._setRelaisState(True) - elif command == "disableRelais": - self._logger.info("disableRelais") - self._setRelaisState(False) - elif command == "toggleRelais": - self._logger.info("toggleRelais") - self._toggleRelay() - elif command == "enableShutdownAfterFinish": - self._logger.info("enableShutdownAfterFinish") - self.shutdownAfterPrintFinished = True - elif command == "disableShutdownAfterFinish": - self._logger.info("disableShutdownAfterFinish") - self.shutdownAfterPrintFinished = False - elif command == "enablePowerOffAfterFinish": - self._logger.info("enablePowerOffAfterFinish") - self.powerOffAfterPrintFinished = True - elif command == "disablePowerOffAfterFinish": - self._logger.info("disablePowerOffAfterFinish") - self.powerOffAfterPrintFinished = False + def _toggleRelay(self): + nbRetry = 0 + while nbRetry < 3: + try: + request = requests.get( + 'http://{}/toggle'.format(self.ip), timeout=1) + if request.status_code == 200: + return + else: + self._logger.info("Could not toggle Relay State, Http Status Code: {}".format(request.status_code)) + except requests.exceptions.ConnectionError: + self._logger.info("Error during toggle Relais state") + nbRetry = nbRetry + 1 -def get_api_commands(self): - return dict( - enableRelais=[], - disableRelais=[], - toggleRelais=[], - disableShutdownAfterFinish=[], - enableShutdownAfterFinish=[], - disablePowerOffAfterFinish=[], - enablePowerOffAfterFinish=[] - ) - - -def on_after_startup(self): - if self.powerOnOnStart: - self._logger.info("Turn on Relais on Start") - self._setRelaisState(True) - - -def on_shutdown(self): - self._logger.info("on_shutdown_event") - if self.powerOffOnShutdown: - if self.powerOffDelay <= 0: - self._logger.info("Turn off Relais on Shutdown") + def on_api_command(self, command, data): + if command == "enableRelais": + self._logger.info("enableRelais") + self._setRelaisState(True) + elif command == "disableRelais": + self._logger.info("disableRelais") self._setRelaisState(False) - else: - self._logger.info("Turn off Relais on Shutdown Delayed") - self._powerCycleRelais(False, self.powerOffDelay) + elif command == "toggleRelais": + self._logger.info("toggleRelais") + self._toggleRelay() + elif command == "enableShutdownAfterFinish": + self._logger.info("enableShutdownAfterFinish") + self.shutdownAfterPrintFinished = True + elif command == "disableShutdownAfterFinish": + self._logger.info("disableShutdownAfterFinish") + self.shutdownAfterPrintFinished = False + elif command == "enablePowerOffAfterFinish": + self._logger.info("enablePowerOffAfterFinish") + self.powerOffAfterPrintFinished = True + elif command == "disablePowerOffAfterFinish": + self._logger.info("disablePowerOffAfterFinish") + self.powerOffAfterPrintFinished = False -def on_settings_migrate(self, target, current): - if target > current: - if current <= 1: - self.onOffButtonEnabled = False - if current <= 2: - self.powerOnOnStart = False, - self.powerOffOnShutdown = False, - self.powerOffDelay = 0 - if current <= 3: - self.showShutdownOctopiOption = False - self.showPowerOffPrintFinishOption = False - self.shutdownDelay = 60 - - -def get_settings_version(self): - return 4 - - -def get_settings_defaults(self): - return dict( - ip=None, - intervall=1, - onOffButtonEnabled=False, - powerOnOnStart=False, - powerOffOnShutdown=False, - powerOffDelay=0, - showShutdownOctopiOption=False, - showPowerOffPrintFinishOption=False, - shutdownDelay=60 - ) - - -def get_settings_restricted_paths(self): - return dict(admin=[ - ['ip'] - ]) - - -def on_settings_save(self, data): - self._logger.info("on_settings_save") - octoprint.plugin.SettingsPlugin.on_settings_save(self, data) - self.initialize() - - -def on_event(self, event, payload): - if not self.shutdownAfterPrintFinished and not self.powerOffAfterPrintFinished: - return - - if not self._settings.global_get(["server", "commands", "systemShutdownCommand"]): - self._logger.warning("systemShutdownCommand is not defined. Aborting shutdown...") - return - - if event not in [Events.PRINT_DONE, Events.PRINT_FAILED]: - return - - if event == Events.PRINT_FAILED and not self._printer.is_closed_or_error(): - # Cancelled job - return - - if event in [Events.PRINT_DONE, Events.PRINT_FAILED]: - webcam_config = self._settings.global_get(["webcam", "timelapse"], merged=True) - timelapse_type = webcam_config["type"] - if (timelapse_type is not None and timelapse_type != "off"): - self._wait_for_timelapse_start() - else: - self._shutdown_timer_start() - return - - -def get_update_information(self): - return dict( - mystromswitch=dict( - displayName="OctoPrint-MyStromSwitch", - displayVersion=self._plugin_version, - - # version check: github repository - type="github_release", - user="da4id", - repo="OctoPrint-MyStromSwitch", - current=self._plugin_version, - - # update method: pip w/ dependency links - pip="https://github.com/da4id/OctoPrint-MyStromSwitch/archive/{target_version}.zip" + def get_api_commands(self): + return dict( + enableRelais=[], + disableRelais=[], + toggleRelais=[], + disableShutdownAfterFinish=[], + enableShutdownAfterFinish=[], + disablePowerOffAfterFinish=[], + enablePowerOffAfterFinish=[] + ) + + + def on_after_startup(self): + if self.powerOnOnStart: + self._logger.info("Turn on Relais on Start") + self._setRelaisState(True) + + + def on_shutdown(self): + self._logger.info("on_shutdown_event") + if self.powerOffOnShutdown: + if self.powerOffDelay <= 0: + self._logger.info("Turn off Relais on Shutdown") + self._setRelaisState(False) + else: + self._logger.info("Turn off Relais on Shutdown Delayed") + self._powerCycleRelais(False, self.powerOffDelay) + + + def on_settings_migrate(self, target, current): + if target > current: + if current <= 1: + self.onOffButtonEnabled = False + if current <= 2: + self.powerOnOnStart = False, + self.powerOffOnShutdown = False, + self.powerOffDelay = 0 + if current <= 3: + self.showShutdownOctopiOption = False + self.showPowerOffPrintFinishOption = False + self.shutdownDelay = 60 + + + def get_settings_version(self): + return 4 + + + def get_settings_defaults(self): + return dict( + ip=None, + intervall=1, + onOffButtonEnabled=False, + powerOnOnStart=False, + powerOffOnShutdown=False, + powerOffDelay=0, + showShutdownOctopiOption=False, + showPowerOffPrintFinishOption=False, + shutdownDelay=60 + ) + + + def get_settings_restricted_paths(self): + return dict(admin=[ + ['ip'] + ]) + + + def on_settings_save(self, data): + self._logger.info("on_settings_save") + octoprint.plugin.SettingsPlugin.on_settings_save(self, data) + self.initialize() + + + def on_event(self, event, payload): + if not self.shutdownAfterPrintFinished and not self.powerOffAfterPrintFinished: + return + + if not self._settings.global_get(["server", "commands", "systemShutdownCommand"]): + self._logger.warning("systemShutdownCommand is not defined. Aborting shutdown...") + return + + if event not in [Events.PRINT_DONE, Events.PRINT_FAILED]: + return + + if event == Events.PRINT_FAILED and not self._printer.is_closed_or_error(): + # Cancelled job + return + + if event in [Events.PRINT_DONE, Events.PRINT_FAILED]: + webcam_config = self._settings.global_get(["webcam", "timelapse"], merged=True) + timelapse_type = webcam_config["type"] + if (timelapse_type is not None and timelapse_type != "off"): + self._wait_for_timelapse_start() + else: + self._shutdown_timer_start() + return + + + def get_update_information(self): + return dict( + mystromswitch=dict( + displayName="OctoPrint-MyStromSwitch", + displayVersion=self._plugin_version, + + # version check: github repository + type="github_release", + user="da4id", + repo="OctoPrint-MyStromSwitch", + current=self._plugin_version, + + # update method: pip w/ dependency links + pip="https://github.com/da4id/OctoPrint-MyStromSwitch/archive/{target_version}.zip" + ) ) - ) __plugin_name__ = "MyStrom Switch"