From 7cf868e886f20e2cb63766829467873dc47654fe Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Thu, 9 Feb 2023 08:03:43 +0100 Subject: [PATCH] Testreport from unittest added + Test extension --- .gitignore | 2 + .gitmodules | 9 + Makefile | 39 + fstools | 1 + reqif | 1 + simulation/devices.py | 42 +- smart_brain_test.py | 65 +- templates/macros.tex | 11 + templates/report_testcase.tex | 36 + templates/run_statistic.tex | 13 + templates/system.tex | 12 + templates/unittest.tex | 49 + templates/unittest_foot.tex | 1 + templates/unittest_head.tex | 89 + templates/unittest_titlepage.tex | 14 + testresults/testrun.json | 6409 ++++++++++++++++++++++++++++++ testresults/testrun.pdf | Bin 0 -> 147478 bytes testresults/testrun.tex | 304 ++ testresults/testrun_full.pdf | Bin 0 -> 125546 bytes testresults/testrun_full.tex | 1328 +++++++ tests/__init__.py | 379 +- tests/all.py | 139 + tests/heating.py | 129 + tests/light.py | 92 + tests/synchronisation.py | 90 + unittest | 1 + 26 files changed, 8845 insertions(+), 410 deletions(-) create mode 100644 Makefile create mode 160000 fstools create mode 160000 reqif create mode 100644 templates/macros.tex create mode 100644 templates/report_testcase.tex create mode 100644 templates/run_statistic.tex create mode 100644 templates/system.tex create mode 100644 templates/unittest.tex create mode 100644 templates/unittest_foot.tex create mode 100644 templates/unittest_head.tex create mode 100644 templates/unittest_titlepage.tex create mode 100644 testresults/testrun.json create mode 100644 testresults/testrun.pdf create mode 100644 testresults/testrun.tex create mode 100644 testresults/testrun_full.pdf create mode 100644 testresults/testrun_full.tex create mode 100644 tests/all.py create mode 100644 tests/heating.py create mode 100644 tests/light.py create mode 100644 tests/synchronisation.py create mode 160000 unittest diff --git a/.gitignore b/.gitignore index ed907ab..5fa85ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +testresults + # ---> VirtualEnv # Virtualenv # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ diff --git a/.gitmodules b/.gitmodules index ddea26d..3d40f83 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,12 @@ [submodule "task"] path = task url = https://git.mount-mockery.de/pylib/task.git +[submodule "fstools"] + path = fstools + url = https://git.mount-mockery.de/pylib/fstools.git +[submodule "reqif"] + path = reqif + url = https://git.mount-mockery.de/pylib/reqif.git +[submodule "unittest"] + path = unittest + url = https://git.mount-mockery.de/pylib/unittest.git diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0f01d6e --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +OUTDIR=testresults +TEXFILE=$(OUTDIR)/testrun.tex +PDFFILE=$(OUTDIR)/testrun.pdf +TEXFILE_FULL=$(OUTDIR)/testrun_full.tex +PDFFILE_FULL=$(OUTDIR)/testrun_full.pdf + +run: test_smoke pdf view pdf_full clean + @echo FINISHED... + +run_full: test_full pdf view pdf_full clean + @echo FINISHED... + +test_smoke: + venv/bin/python smart_brain_test.py test.all.smoke + +test_full: + venv/bin/python smart_brain_test.py test.all.full + +pdf: + @latexmk -pdf -quiet -pdflatex="pdflatex -interaction=nonstopmode" -output-directory=$(OUTDIR) -use-make $(TEXFILE) > /dev/null + +pdf_full: + @latexmk -pdf -quiet -pdflatex="pdflatex -interaction=nonstopmode" -output-directory=$(OUTDIR) -use-make $(TEXFILE_FULL) > /dev/null + +view: + @open $(PDFFILE) + +view_full: + @open $(PDFFILE_FULL) + +clean: + @latexmk -quiet -output-directory=$(OUTDIR) -c $(TEXFILE) > /dev/null + @latexmk -quiet -output-directory=$(OUTDIR) -c $(TEXFILE_FULL) > /dev/null + @find . -name *~ -type f | xargs rm -f + @find . -name __pycache__ -type d | xargs rm -rf + +%: + venv/bin/python smart_brain_test.py $@ + $(MAKE) pdf_full view_full pdf clean \ No newline at end of file diff --git a/fstools b/fstools new file mode 160000 index 0000000..c10e879 --- /dev/null +++ b/fstools @@ -0,0 +1 @@ +Subproject commit c10e8792abb05671dab6de51cdadda3bf8ead50f diff --git a/reqif b/reqif new file mode 160000 index 0000000..c0e8533 --- /dev/null +++ b/reqif @@ -0,0 +1 @@ +Subproject commit c0e8533af5eeb4dccb6cd8742c936eb456ce6466 diff --git a/simulation/devices.py b/simulation/devices.py index 9765cef..b5f04c5 100644 --- a/simulation/devices.py +++ b/simulation/devices.py @@ -15,6 +15,8 @@ COLOR_MOTION_SENSOR = colored.fg("dark_orange_3b") COLOR_HEATING_VALVE = colored.fg("red") COLOR_REMOTE = colored.fg("green") +OUTPUT_ACTIVE = True + class base(mqtt_base): AUTOSEND = True @@ -85,24 +87,27 @@ class base(mqtt_base): print("You need to give a numeric parameter not '%s'" % str(value)) def print_formatted_light(self, color, state, description, led=False): - if led is True: - if state is True: - icon = colored.fg('green') + "\u2b24" + color + if OUTPUT_ACTIVE: + if led is True: + if state is True: + icon = colored.fg('green') + "\u2b24" + color + else: + icon = colored.fg('light_gray') + "\u2b24" + color else: - icon = colored.fg('light_gray') + "\u2b24" + color - else: - icon = u'\u2b24' if state is True else u'\u25ef' - print(color + 10 * ' ' + icon + 9 * ' ' + self.__devicename__(), description + colored.attr("reset")) + icon = u'\u2b24' if state is True else u'\u25ef' + print(color + 10 * ' ' + icon + 9 * ' ' + self.__devicename__(), description + colored.attr("reset")) def print_formatted_videv(self, color, state, description): - icon = u'\u25a0' if state is True else u'\u25a1' - print(color + 10 * ' ' + icon + 9 * ' ' + self.__devicename__(), description + colored.attr("reset")) + if OUTPUT_ACTIVE: + icon = u'\u25a0' if state is True else u'\u25a1' + print(color + 10 * ' ' + icon + 9 * ' ' + self.__devicename__(), description + colored.attr("reset")) def print_formatted_percent(self, color, prefix, perc_value, value_str, description): - if len(prefix) > 1 or len(value_str) > 7: - raise ValueError("Length of prefix (%d) > 1 or length of value_str (%d) > 7" % (len(prefix), len(value_str))) - print(color + prefix + self.__percent_bar__(perc_value), value_str + (8 - len(value_str)) - * ' ' + self.__devicename__(), description + colored.attr("reset")) + if OUTPUT_ACTIVE: + if len(prefix) > 1 or len(value_str) > 7: + raise ValueError("Length of prefix (%d) > 1 or length of value_str (%d) > 7" % (len(prefix), len(value_str))) + print(color + prefix + self.__percent_bar__(perc_value), value_str + (8 - len(value_str)) + * ' ' + self.__devicename__(), description + colored.attr("reset")) class base_videv(base): @@ -365,9 +370,9 @@ class tradfri_light(base): def __ext_to_int__(self, key, data): if key == self.KEY_BRIGHTNESS: - return round((data - 1) / 2.53, 0) + return int(round((data - 1) / 2.53, 0)) elif key == self.KEY_COLOR_TEMP: - return round((data - 250) / 20.4, 0) + return int(round((data - 250) / 20.4, 0)) else: return super().__ext_to_int__(key, data) @@ -547,12 +552,17 @@ class videv_light(base_videv): self.add_callback(self.KEY_COLOR_TEMP, None, self.__send__, True) self.add_callback(self.KEY_TIMER, None, self.__send__, True) + def __ext_to_int__(self, key, data): + if key in [self.KEY_BRIGHTNESS, self.KEY_COLOR_TEMP]: + return int(data) + return super().__ext_to_int__(key, data) + def __rx__(self, client, userdata, message): value = self.__payload_filter__(message.payload) if message.topic.startswith(self.topic): targetkey = message.topic.split('/')[-1] if targetkey in self.keys(): - self.set(targetkey, value, block_callback=(self.__send__, )) + self.set(targetkey, self.__ext_to_int__(targetkey, value), block_callback=(self.__send__, )) elif targetkey != "__info__": print("Unknown key %s in %s::%s" % (targetkey, message.topic, self.__class__.__name__)) diff --git a/smart_brain_test.py b/smart_brain_test.py index ac41633..ff505c5 100644 --- a/smart_brain_test.py +++ b/smart_brain_test.py @@ -1,16 +1,20 @@ import config -import logging import mqtt import readline -import report from simulation.rooms import house -from tests import test_smarthome -import time +import sys +from tests.all import test_smarthome + +# TODO: Extend tests in simulation +# - Switching button functions (gfw_dirk, ffe.sleep) +# - Brightness button functions (gfw.dirk, ffe.sleep) +# - Synch functions of amplifier with spotify, mpd +# - Remote actions after amplifier on +# - Heating functionality (extended: mode switch off by other function, timer) +# - Circulation pump (Extend Timer) +# - Stairways (Extend Motion sensor and Timer) if __name__ == "__main__": - report.stdoutLoggingConfigure( - ((config.APP_NAME, logging.WARNING), ), report.SHORT_FMT) - # mc = mqtt.mqtt_client(host=config.MQTT_SERVER, port=config.MQTT_PORT, username=config.MQTT_USER, password=config.MQTT_PASSWORD, name=config.APP_NAME + '_simulation') # @@ -61,25 +65,30 @@ if __name__ == "__main__": else: state -= 1 - readline.parse_and_bind("tab: complete") - readline.set_completer(completer) - time.sleep(0.3) - print("\nEnter command: ") - - while True: - userfeedback = input('') - command = userfeedback.split(' ')[0] - if userfeedback == 'quit': - break - elif userfeedback == 'help': - print("Help is not yet implemented!") - elif userfeedback.startswith("test"): - ts.command(userfeedback) - elif userfeedback == 'test.smoke': - ts.smoke() - elif command in COMMANDS[2:]: - h.command(userfeedback) - elif userfeedback != "": - print("Unknown command!") + if len(sys.argv) == 1: + readline.parse_and_bind("tab: complete") + readline.set_completer(completer) + print("\nEnter command: ") + while True: + userfeedback = input('') + command = userfeedback.split(' ')[0] + if userfeedback == 'quit': + break + elif userfeedback == 'help': + print("Help is not yet implemented!") + elif userfeedback.startswith("test"): + ts.command(userfeedback) + elif command in COMMANDS[2:]: + h.command(userfeedback) + elif userfeedback != "": + print("Unknown command!") + else: + print() + else: + cmd = sys.argv[1] + if cmd.startswith('test'): + ts.command(cmd) else: - print() + h.command(cmd) + + del (ts) diff --git a/templates/macros.tex b/templates/macros.tex new file mode 100644 index 0000000..daf7a55 --- /dev/null +++ b/templates/macros.tex @@ -0,0 +1,11 @@ +{%- macro latex_filter(text) -%}{{ text.replace('\\', '/').replace('%', '\\%').replace('/xc2/xb0', '$^\circ$').replace('"', '\'').replace('/', '/\\allowbreak ').replace('&', '\\allowbreak \\&').replace('_', '\\_').replace('->', '$\\rightarrow$').replace('<-', '$\\leftarrow$').replace('=>', '$\\Rightarrow$').replace('<=', '$\\leq$').replace('>=', '$\\geq$').replace('<', '$<$').replace('>', '$>$').replace('{', '\{').replace('}', '\}').replace('#', '\\#')}} +{%- endmacro -%} + +{%- macro color_by_level(level) -%}{% if level <= 10 %}black{% else %}{% if level <= 20 %}green{% else %}{% if level <= 30 %}orange{% else %}red{% endif %}{% endif %}{% endif %} +{%- endmacro -%} + +{%- macro bg_by_levelno(level) -%}{% if level <= 10 %}0.8 0.8 0.8{% else %}{% if level <= 20 %}0.8 0.95 0.8{% else %}{% if level <= 30 %}1 0.75 0.45{% else %}0.95 0.8 0.8{% endif %}{% endif %}{% endif %} +{%- endmacro -%} + +{%- macro result(level) -%}{% if level <= 10 %}Info{% else %}{% if level <= 20 %}\textcolor{green}{Success}{% else %}{% if level <= 30 %}\textcolor{orange}{Warning}{% else %}\textcolor{red}{Failed}{% endif %}{% endif %}{% endif %} +{%- endmacro -%} diff --git a/templates/report_testcase.tex b/templates/report_testcase.tex new file mode 100644 index 0000000..4afb6e5 --- /dev/null +++ b/templates/report_testcase.tex @@ -0,0 +1,36 @@ +{%- import 'macros.tex' as macros %} +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf {{ macros.result(testcase.levelno) }}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & {{ macros.latex_filter(testcase.pathname) }} ({{ "%d" % testcase.lineno }})\\ +Start-Time: & {{ macros.latex_filter(testcase.time_start) }}\\ +Finished-Time: & {{ macros.latex_filter(testcase.time_finished) }}\\ +Time-Consumption & {{ '%.3fs' % (testcase.time_consumption) }}\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +{%- for tLogger in testcase.testcaseLogger %} +\bf{\,{{ macros.result(tLogger.levelno) }} } & {{ macros.latex_filter(tLogger.message) }}\\ +{%- endfor %} +\bottomrule +\end{longtabu} + +{% if details== true %} +\paragraph{Testdetails}\mbox{}\\ +{%- for tLogger in testcase.testcaseLogger %} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf {{ macros.result(tLogger.levelno) }} } & {{ macros.latex_filter(tLogger.message) }}\\ + \bottomrule + \end{tabu} + {%- for mLogger in tLogger.moduleLogger %} + \definecolor{shadecolor}{rgb}{ {{macros.bg_by_levelno(mLogger.levelno) }} }\begin{modulelog}[breaklines=true, breakanywhere=true] + {{ mLogger.message }} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + {%- endfor %} + + \vspace*{2.5ex} +{%- endfor %} +{% endif %} diff --git a/templates/run_statistic.tex b/templates/run_statistic.tex new file mode 100644 index 0000000..10928ff --- /dev/null +++ b/templates/run_statistic.tex @@ -0,0 +1,13 @@ +{%- import 'macros.tex' as macros %} +\begin{tabu} to \linewidth {lX} + \toprule + Number of tests & {{ "{\\bf %d}" % testrun.number_of_tests }}\\ + Number of successfull tests & {{ "{\\bf %d}" % testrun.number_of_successfull_tests }}\\ + Number of possibly failed tests & \textcolor{% if testrun.number_of_possibly_failed_tests > 0%}{orange}{% else %}{black}{% endif %}{{ "{\\bf %d}" % testrun.number_of_possibly_failed_tests }}\\ + Number of failed tests & \textcolor{% if testrun.number_of_failed_tests > 0%}{red}{% else %}{black}{% endif %}{{ "{\\bf %d}" % testrun.number_of_failed_tests }}\\ + \midrule + Executionlevel & {{ macros.latex_filter(testrun.testcase_names.get('%d' % testrun.testcase_execution_level, 'unknown')) }}\\ + Time consumption & {{ '%.3fs' % testrun.time_consumption }}\\ + \bottomrule +\end{tabu} + diff --git a/templates/system.tex b/templates/system.tex new file mode 100644 index 0000000..7fb975e --- /dev/null +++ b/templates/system.tex @@ -0,0 +1,12 @@ +{%- import 'macros.tex' as macros %} +\begin{tabu} to \linewidth {lX} +\toprule +{\bf System Information} & \\ +\midrule +{%- for key in system_information %} +{%- if key != "Description" %} +{{macros.latex_filter(key)}} & {{macros.latex_filter(data.system_information[key])}} \\ +{%- endif %} +{%- endfor %} +\bottomrule +\end{tabu} diff --git a/templates/unittest.tex b/templates/unittest.tex new file mode 100644 index 0000000..bf9188c --- /dev/null +++ b/templates/unittest.tex @@ -0,0 +1,49 @@ +{%- import 'macros.tex' as macros %} +{%- include 'unittest_head.tex' %} +{%- include 'unittest_titlepage.tex' %} + +\tableofcontents +\newpage + +\section{Test System Information} +{%- with system_information = data.system_information %} + {%- include 'system.tex' %} +{%- endwith %} + + +\section{Summary} +{%- with testrun = data %} + {%- include 'run_statistic.tex' %} +{%- endwith %} + +{% if data.number_of_failed_tests > 0 or data.number_of_possibly_failed_tests > 0%} + \section{\textcolor{red}{Testcases (Failed)}} + {%- for test_name in data.uid_list_sorted %} + {% with testcase = data.testcases[test_name] %} + {% if testcase.levelno > 20 %} + \subsection{ {{macros.latex_filter(testcase.message)}} } + {% with details = true %} + {% include 'report_testcase.tex' %} + {% endwith %} + {% endif %} + {% endwith %} + {% endfor %} +{% endif %} + + +{% if data.number_of_successfull_tests > 0 %} + \section{\textcolor{green}{Testcases (Success)}} + {%- for test_name in data.uid_list_sorted %} + {% with testcase = data.testcases[test_name] %} + {% if testcase.levelno <= 20 %} + \subsection{ {{macros.latex_filter(testcase.message)}} } + {% with details = details %} + {% include 'report_testcase.tex' %} + {% endwith %} + {% endif %} + {% endwith %} + {% endfor %} +{% endif %} + + +{% include 'unittest_foot.tex' %} diff --git a/templates/unittest_foot.tex b/templates/unittest_foot.tex new file mode 100644 index 0000000..737da30 --- /dev/null +++ b/templates/unittest_foot.tex @@ -0,0 +1 @@ +\end{document} diff --git a/templates/unittest_head.tex b/templates/unittest_head.tex new file mode 100644 index 0000000..c259129 --- /dev/null +++ b/templates/unittest_head.tex @@ -0,0 +1,89 @@ +{%- import 'macros.tex' as macros %} +\documentclass[a4paper]{article} +%\documentclass[a4paper,landscape]{article} + +\renewcommand{\familydefault}{\sfdefault} +\usepackage[table]{xcolor} +\definecolor{orange}{rgb}{1, 0.7, 0} +\definecolor{lightgrey}{rgb}{0.925, 0.925, 0.925} + +\setlength{\topmargin}{-3cm} +\setlength{\oddsidemargin}{-0.5cm} +\setlength{\evensidemargin}{0cm} +\setlength{\textwidth}{17.5cm} +\setlength{\textheight}{24.5cm} +%\setlength{\textwidth}{25cm} +%\setlength{\textheight}{15cm} +\setlength{\headheight}{84pt} + +\usepackage{fancyvrb} +\usepackage{fvextra} +%\usepackage{framed,color} +%\newenvironment{modulelog}{\snugshade\Verbatim}{\endVerbatim\endsnugshade} +\usepackage{adjustbox} +\newenvironment{modulelog}% +{\par\noindent\adjustbox{margin=0ex,bgcolor=shadecolor,margin=0ex}\bgroup\varwidth\linewidth\Verbatim}% +{\endVerbatim\endvarwidth\egroup} +%\usepackage{xcolor} + +\renewcommand{\baselinestretch}{1,2} +\setlength{\parindent}{0pt} +\setlength{\parskip}{9pt plus3pt minus3pt} + +\usepackage{listings} +\usepackage{color} +\definecolor{bg-partially-covered}{rgb}{1,1,0.6} % light-yellow +\definecolor{bg-uncovered}{rgb}{1,0.8,0.8} % light-red +\definecolor{bg-covered}{rgb}{0.95,1,0.95} % very light-green +\definecolor{bg-clean}{rgb}{1,1,1} % white +\definecolor{mygreen}{rgb}{0,0.6,0} +\definecolor{mygray}{rgb}{0.5,0.5,0.5} +\definecolor{mymauve}{rgb}{0.58,0,0.82} +\lstset{ % + backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}; should come as last argument + basicstyle=\footnotesize, % the size of the fonts that are used for the code + breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace + breaklines=true, % sets automatic line breaking + captionpos=b, % sets the caption-position to bottom + commentstyle=\color{mygreen}, % comment style + deletekeywords={...}, % if you want to delete keywords from the given language + escapeinside={\%*}{*)}, % if you want to add LaTeX within your code + extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8 + frame=none, % adds a frame around the code + keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible) + keywordstyle=\color{blue}, % keyword style + language=Octave, % the language of the code + morekeywords={*,...}, % if you want to add more keywords to the set + numbers=left, % where to put the line-numbers; possible values are (none, left, right) + numbersep=5pt, % how far the line-numbers are from the code + numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers + rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here)) + showlines=true, + showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces' + showstringspaces=false, % underline spaces within strings only + showtabs=false, % show tabs within strings adding particular underscores + stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered + stringstyle=\color{mymauve}, % string literal style + tabsize=2, % sets default tabsize to 2 spaces +} +\usepackage{hyperref} +\usepackage{longtable}[=v4.13] +\usepackage{tabu} +\usepackage{multicol} +\usepackage{booktabs} +\usepackage{graphicx} +\usepackage{lastpage} % for the number of the last page in the document +\usepackage{fancyhdr} + +\fancyhf{} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +\lhead{\textcolor{gray}{}} +\chead{\textcolor{gray}{ Unittest for {\tt smart\_brain }}} +\rhead{\textcolor{gray}{}} +\lfoot{\textcolor{gray}{}} +\cfoot{\textcolor{gray}{}} +\rfoot{\textcolor{gray}{\thepage\,/ \pageref{LastPage}}} + +\begin{document} + diff --git a/templates/unittest_titlepage.tex b/templates/unittest_titlepage.tex new file mode 100644 index 0000000..01b579a --- /dev/null +++ b/templates/unittest_titlepage.tex @@ -0,0 +1,14 @@ +{%- import 'macros.tex' as macros %} +\begin{titlepage} +\date{\today} +\title{ + Unittest for {\tt smart\_brain } +} +\date{\today} +\maketitle +\thispagestyle{empty} +\newpage +\end{titlepage} + +\setcounter{page}{1} +\pagestyle{fancy} diff --git a/testresults/testrun.json b/testresults/testrun.json new file mode 100644 index 0000000..ea6ef8e --- /dev/null +++ b/testresults/testrun.json @@ -0,0 +1,6409 @@ +{ + "time_consumption": 4.510141134262085, + "name": "Default Testsession name", + "number_of_successfull_tests": 5, + "number_of_possibly_failed_tests": 0, + "number_of_tests": 5, + "number_of_failed_tests": 0, + "testcase_execution_level": 90, + "testcase_names": { + "0": "Single Test", + "10": "Smoke Test (Minumum subset)", + "50": "Short Test (Subset)", + "90": "Full Test (all defined tests)" + }, + "testcases": { + "Away mode test: zigbee/gfw/dirk/heating_valve": { + "name": "__tLogger__", + "msg": "Away mode test: zigbee/gfw/dirk/heating_valve", + "args": null, + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 84, + "funcName": "test_away_mode", + "created": 1675925582.5665169, + "msecs": 566.5168762207031, + "relativeCreated": 225.42428970336914, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Away mode test: zigbee/gfw/dirk/heating_valve", + "asctime": "2023-02-09 07:53:02,566", + "moduleLogger": [], + "testcaseLogger": [ + { + "name": "__tLogger__", + "msg": "Setting preconditions (Default setpoint)", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 89, + "funcName": "__test_away_mode__", + "created": 1675925582.867079, + "msecs": 867.0790195465088, + "relativeCreated": 525.9864330291748, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Setting preconditions (Default setpoint)", + "asctime": "2023-02-09 07:53:02,867", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925582.5666273, + "msecs": 566.6272640228271, + "relativeCreated": 225.53467750549316, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true", + "asctime": "2023-02-09 07:53:02,566" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.5669632, + "msecs": 566.9631958007812, + "relativeCreated": 225.87060928344727, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true'", + "asctime": "2023-02-09 07:53:02,566" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6099102, + "msecs": 609.910249710083, + "relativeCreated": 268.817663192749, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:02,609" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.610063, + "msecs": 610.0630760192871, + "relativeCreated": 268.9704895019531, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:02,610" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6101818, + "msecs": 610.1818084716797, + "relativeCreated": 269.0892219543457, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:02,610" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925582.6102495, + "msecs": 610.2495193481445, + "relativeCreated": 269.15693283081055, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:02,610" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6103683, + "msecs": 610.3682518005371, + "relativeCreated": 269.2756652832031, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:02,610" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6105063, + "msecs": 610.5062961578369, + "relativeCreated": 269.41370964050293, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:02,610" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6106107, + "msecs": 610.6107234954834, + "relativeCreated": 269.5181369781494, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:02,610" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6538856, + "msecs": 653.8856029510498, + "relativeCreated": 312.7930164337158, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:02,653" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.6619573, + "msecs": 661.9572639465332, + "relativeCreated": 320.8646774291992, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:02,661" + } + ], + "time_consumption": 0.20512175559997559 + }, + { + "name": "__tLogger__", + "msg": "Away mode is correct (Content %s and Type is %s).", + "args": [ + "False", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925582.8671947, + "msecs": 867.194652557373, + "relativeCreated": 526.1020660400391, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Away mode is correct (Content False and Type is ).", + "asctime": "2023-02-09 07:53:02,867", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Away mode", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925582.8671472, + "msecs": 867.1472072601318, + "relativeCreated": 526.0546207427979, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Away mode): False ()", + "asctime": "2023-02-09 07:53:02,867" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Away mode", + "=", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925582.8671727, + "msecs": 867.1727180480957, + "relativeCreated": 526.0801315307617, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Away mode): result = False ()", + "asctime": "2023-02-09 07:53:02,867" + } + ], + "time_consumption": 2.193450927734375e-05 + }, + { + "name": "__tLogger__", + "msg": "Activating away mode", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 96, + "funcName": "__test_away_mode__", + "created": 1675925583.167663, + "msecs": 167.6630973815918, + "relativeCreated": 826.5705108642578, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Activating away mode", + "asctime": "2023-02-09 07:53:03,167", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.away_mode", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/away_mode", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925582.86725, + "msecs": 867.2499656677246, + "relativeCreated": 526.1573791503906, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/away_mode and payload true", + "asctime": "2023-02-09 07:53:02,867" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.away_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/away_mode", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8675106, + "msecs": 867.5105571746826, + "relativeCreated": 526.4179706573486, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'true'", + "asctime": "2023-02-09 07:53:02,867" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 20}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8755705, + "msecs": 875.57053565979, + "relativeCreated": 534.477949142456, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 20}'", + "asctime": "2023-02-09 07:53:02,875" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925582.8756511, + "msecs": 875.6511211395264, + "relativeCreated": 534.5585346221924, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:02,875" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8757725, + "msecs": 875.7724761962891, + "relativeCreated": 534.6798896789551, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:02,875" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8759103, + "msecs": 875.9102821350098, + "relativeCreated": 534.8176956176758, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:02,875" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.away_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/away_mode", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8760147, + "msecs": 876.0147094726562, + "relativeCreated": 534.9221229553223, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'true'", + "asctime": "2023-02-09 07:53:02,876" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8761184, + "msecs": 876.1184215545654, + "relativeCreated": 535.0258350372314, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:02,876" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.8762197, + "msecs": 876.2197494506836, + "relativeCreated": 535.1271629333496, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:02,876" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.9184706, + "msecs": 918.4706211090088, + "relativeCreated": 577.3780345916748, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:02,918" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925582.9621384, + "msecs": 962.1384143829346, + "relativeCreated": 621.0458278656006, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:02,962" + } + ], + "time_consumption": 0.20552468299865723 + }, + { + "name": "__tLogger__", + "msg": "Away mode is correct (Content %s and Type is %s).", + "args": [ + "True", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925583.167804, + "msecs": 167.80400276184082, + "relativeCreated": 826.7114162445068, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Away mode is correct (Content True and Type is ).", + "asctime": "2023-02-09 07:53:03,167", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Away mode", + "True", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925583.167752, + "msecs": 167.75202751159668, + "relativeCreated": 826.6594409942627, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Away mode): True ()", + "asctime": "2023-02-09 07:53:03,167" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Away mode", + "=", + "True", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925583.1677833, + "msecs": 167.78326034545898, + "relativeCreated": 826.690673828125, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Away mode): result = True ()", + "asctime": "2023-02-09 07:53:03,167" + } + ], + "time_consumption": 2.0742416381835938e-05 + }, + { + "name": "__tLogger__", + "msg": "Temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "20", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925583.1678667, + "msecs": 167.86670684814453, + "relativeCreated": 826.7741203308105, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Temperature setpoint is correct (Content 20 and Type is ).", + "asctime": "2023-02-09 07:53:03,167", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Temperature setpoint", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925583.1678333, + "msecs": 167.8333282470703, + "relativeCreated": 826.7407417297363, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Temperature setpoint): 20 ()", + "asctime": "2023-02-09 07:53:03,167" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Temperature setpoint", + "=", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925583.1678507, + "msecs": 167.85073280334473, + "relativeCreated": 826.7581462860107, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Temperature setpoint): result = 20 ()", + "asctime": "2023-02-09 07:53:03,167" + } + ], + "time_consumption": 1.5974044799804688e-05 + }, + { + "name": "__tLogger__", + "msg": "Deactivating away mode", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 102, + "funcName": "__test_away_mode__", + "created": 1675925583.4683464, + "msecs": 468.34635734558105, + "relativeCreated": 1127.253770828247, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Deactivating away mode", + "asctime": "2023-02-09 07:53:03,468", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.away_mode", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/away_mode", + "false" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925583.1679265, + "msecs": 167.92654991149902, + "relativeCreated": 826.833963394165, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/away_mode and payload false", + "asctime": "2023-02-09 07:53:03,167" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.away_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/away_mode", + "b'false'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.168239, + "msecs": 168.23911666870117, + "relativeCreated": 827.1465301513672, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'false'", + "asctime": "2023-02-09 07:53:03,168" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.1735659, + "msecs": 173.56586456298828, + "relativeCreated": 832.4732780456543, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:03,173" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925583.1736534, + "msecs": 173.65336418151855, + "relativeCreated": 832.5607776641846, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:03,173" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.1737728, + "msecs": 173.77281188964844, + "relativeCreated": 832.6802253723145, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:03,173" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.1739187, + "msecs": 173.9187240600586, + "relativeCreated": 832.8261375427246, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:03,173" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.away_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/away_mode", + "b'false'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.1740298, + "msecs": 174.02982711791992, + "relativeCreated": 832.9372406005859, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'false'", + "asctime": "2023-02-09 07:53:03,174" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.1741362, + "msecs": 174.13616180419922, + "relativeCreated": 833.0435752868652, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:03,174" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.1742375, + "msecs": 174.23748970031738, + "relativeCreated": 833.1449031829834, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:03,174" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.2178812, + "msecs": 217.8812026977539, + "relativeCreated": 876.7886161804199, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:03,217" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.257957, + "msecs": 257.95698165893555, + "relativeCreated": 916.8643951416016, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:03,257" + } + ], + "time_consumption": 0.2103893756866455 + }, + { + "name": "__tLogger__", + "msg": "Away mode is correct (Content %s and Type is %s).", + "args": [ + "False", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925583.4684498, + "msecs": 468.44983100891113, + "relativeCreated": 1127.3572444915771, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Away mode is correct (Content False and Type is ).", + "asctime": "2023-02-09 07:53:03,468", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Away mode", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925583.4684064, + "msecs": 468.40643882751465, + "relativeCreated": 1127.3138523101807, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Away mode): False ()", + "asctime": "2023-02-09 07:53:03,468" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Away mode", + "=", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925583.4684303, + "msecs": 468.4302806854248, + "relativeCreated": 1127.3376941680908, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Away mode): result = False ()", + "asctime": "2023-02-09 07:53:03,468" + } + ], + "time_consumption": 1.9550323486328125e-05 + }, + { + "name": "__tLogger__", + "msg": "Temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925583.4685166, + "msecs": 468.51658821105957, + "relativeCreated": 1127.4240016937256, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Temperature setpoint is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:03,468", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Temperature setpoint", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925583.4684794, + "msecs": 468.4793949127197, + "relativeCreated": 1127.3868083953857, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Temperature setpoint): 25 ()", + "asctime": "2023-02-09 07:53:03,468" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Temperature setpoint", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925583.4684963, + "msecs": 468.49632263183594, + "relativeCreated": 1127.403736114502, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Temperature setpoint): result = 25 ()", + "asctime": "2023-02-09 07:53:03,468" + } + ], + "time_consumption": 2.0265579223632812e-05 + } + ], + "time_consumption": 0.9019997119903564, + "time_start": "2023-02-09 07:53:02,566", + "time_finished": "2023-02-09 07:53:03,468" + }, + "Boost mode test: zigbee/gfw/dirk/heating_valve": { + "name": "__tLogger__", + "msg": "Boost mode test: zigbee/gfw/dirk/heating_valve", + "args": null, + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 107, + "funcName": "test_boost_mode", + "created": 1675925583.4686012, + "msecs": 468.6012268066406, + "relativeCreated": 1127.5086402893066, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Boost mode test: zigbee/gfw/dirk/heating_valve", + "asctime": "2023-02-09 07:53:03,468", + "moduleLogger": [], + "testcaseLogger": [ + { + "name": "__tLogger__", + "msg": "Setting preconditions (Default setpoint)", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 112, + "funcName": "__test_boost_mode__", + "created": 1675925583.7690794, + "msecs": 769.0794467926025, + "relativeCreated": 1427.9868602752686, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Setting preconditions (Default setpoint)", + "asctime": "2023-02-09 07:53:03,769", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925583.4686506, + "msecs": 468.65057945251465, + "relativeCreated": 1127.5579929351807, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true", + "asctime": "2023-02-09 07:53:03,468" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.4689183, + "msecs": 468.9183235168457, + "relativeCreated": 1127.8257369995117, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true'", + "asctime": "2023-02-09 07:53:03,468" + } + ], + "time_consumption": 0.30016112327575684 + }, + { + "name": "__tLogger__", + "msg": "Boost timer is correct (Content %s and Type is %s).", + "args": [ + "0", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925583.7692595, + "msecs": 769.2594528198242, + "relativeCreated": 1428.1668663024902, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Boost timer is correct (Content 0 and Type is ).", + "asctime": "2023-02-09 07:53:03,769", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Boost timer", + "0", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925583.7692025, + "msecs": 769.202470779419, + "relativeCreated": 1428.109884262085, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Boost timer): 0 ()", + "asctime": "2023-02-09 07:53:03,769" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Boost timer", + "=", + "0", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925583.7692382, + "msecs": 769.2382335662842, + "relativeCreated": 1428.1456470489502, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Boost timer): result = 0 ()", + "asctime": "2023-02-09 07:53:03,769" + } + ], + "time_consumption": 2.1219253540039062e-05 + }, + { + "name": "__tLogger__", + "msg": "Activating boost mode", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 119, + "funcName": "__test_boost_mode__", + "created": 1675925584.0697818, + "msecs": 69.78178024291992, + "relativeCreated": 1728.689193725586, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Activating boost mode", + "asctime": "2023-02-09 07:53:04,069", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.start_boost", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/start_boost", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925583.7693286, + "msecs": 769.3285942077637, + "relativeCreated": 1428.2360076904297, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/start_boost and payload true", + "asctime": "2023-02-09 07:53:03,769" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.start_boost", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/start_boost", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7696679, + "msecs": 769.6678638458252, + "relativeCreated": 1428.5752773284912, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/start_boost and payload b'true'", + "asctime": "2023-02-09 07:53:03,769" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.boost_timer", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/boost_timer", + "b'900'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7746215, + "msecs": 774.6214866638184, + "relativeCreated": 1433.5289001464844, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/boost_timer and payload b'900'", + "asctime": "2023-02-09 07:53:03,774" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7747583, + "msecs": 774.7583389282227, + "relativeCreated": 1433.6657524108887, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:03,774" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 30}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7748682, + "msecs": 774.8682498931885, + "relativeCreated": 1433.7756633758545, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 30}'", + "asctime": "2023-02-09 07:53:03,774" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 30, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925583.7749352, + "msecs": 774.935245513916, + "relativeCreated": 1433.842658996582, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 30, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:03,774" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'30'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7750514, + "msecs": 775.0513553619385, + "relativeCreated": 1433.9587688446045, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'30'", + "asctime": "2023-02-09 07:53:03,775" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7751899, + "msecs": 775.1898765563965, + "relativeCreated": 1434.0972900390625, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:03,775" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 30, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.7752998, + "msecs": 775.2997875213623, + "relativeCreated": 1434.2072010040283, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 30, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:03,775" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.8184676, + "msecs": 818.4676170349121, + "relativeCreated": 1477.3750305175781, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:03,818" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925583.8619397, + "msecs": 861.9396686553955, + "relativeCreated": 1520.8470821380615, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:03,861" + } + ], + "time_consumption": 0.20784211158752441 + }, + { + "name": "__tLogger__", + "msg": "Boost timer is greater expectation (Content %s and Type is %s).", + "args": [ + "900", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 233, + "funcName": "greater_chk", + "created": 1675925584.069899, + "msecs": 69.89908218383789, + "relativeCreated": 1728.806495666504, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Boost timer is greater expectation (Content 900 and Type is ).", + "asctime": "2023-02-09 07:53:04,069", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Boost timer", + "900", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925584.0698516, + "msecs": 69.85163688659668, + "relativeCreated": 1728.7590503692627, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Boost timer): 900 ()", + "asctime": "2023-02-09 07:53:04,069" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Boost timer", + ">", + "0", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925584.069877, + "msecs": 69.87690925598145, + "relativeCreated": 1728.7843227386475, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Boost timer): result > 0 ()", + "asctime": "2023-02-09 07:53:04,069" + } + ], + "time_consumption": 2.2172927856445312e-05 + }, + { + "name": "__tLogger__", + "msg": "Setting postconditions (Default setpoint)", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 124, + "funcName": "__test_boost_mode__", + "created": 1675925584.370348, + "msecs": 370.3479766845703, + "relativeCreated": 2029.2553901672363, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Setting postconditions (Default setpoint)", + "asctime": "2023-02-09 07:53:04,370", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925584.0699458, + "msecs": 69.9458122253418, + "relativeCreated": 1728.8532257080078, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true", + "asctime": "2023-02-09 07:53:04,069" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.0701907, + "msecs": 70.1906681060791, + "relativeCreated": 1729.0980815887451, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true'", + "asctime": "2023-02-09 07:53:04,070" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.boost_timer", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/boost_timer", + "b'0'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.0754447, + "msecs": 75.44469833374023, + "relativeCreated": 1734.3521118164062, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/boost_timer and payload b'0'", + "asctime": "2023-02-09 07:53:04,075" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.075583, + "msecs": 75.58298110961914, + "relativeCreated": 1734.4903945922852, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,075" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.075693, + "msecs": 75.69289207458496, + "relativeCreated": 1734.600305557251, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:04,075" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925584.0757575, + "msecs": 75.75750350952148, + "relativeCreated": 1734.6649169921875, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:04,075" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.0758739, + "msecs": 75.87385177612305, + "relativeCreated": 1734.781265258789, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:04,075" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.076011, + "msecs": 76.01094245910645, + "relativeCreated": 1734.9183559417725, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,076" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.0761154, + "msecs": 76.11536979675293, + "relativeCreated": 1735.022783279419, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:04,076" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.1191726, + "msecs": 119.17257308959961, + "relativeCreated": 1778.0799865722656, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:04,119" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.1620932, + "msecs": 162.0931625366211, + "relativeCreated": 1821.000576019287, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,162" + } + ], + "time_consumption": 0.20825481414794922 + }, + { + "name": "__tLogger__", + "msg": "Boost timer is correct (Content %s and Type is %s).", + "args": [ + "0", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925584.3704777, + "msecs": 370.47767639160156, + "relativeCreated": 2029.3850898742676, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Boost timer is correct (Content 0 and Type is ).", + "asctime": "2023-02-09 07:53:04,370", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Boost timer", + "0", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925584.370432, + "msecs": 370.43190002441406, + "relativeCreated": 2029.33931350708, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Boost timer): 0 ()", + "asctime": "2023-02-09 07:53:04,370" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Boost timer", + "=", + "0", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925584.3704572, + "msecs": 370.4571723937988, + "relativeCreated": 2029.3645858764648, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Boost timer): result = 0 ()", + "asctime": "2023-02-09 07:53:04,370" + } + ], + "time_consumption": 2.0503997802734375e-05 + } + ], + "time_consumption": 0.9018764495849609, + "time_start": "2023-02-09 07:53:03,468", + "time_finished": "2023-02-09 07:53:04,370" + }, + "Default temperature test for device and virtual device: zigbee/gfw/dirk/heating_valve": { + "name": "__tLogger__", + "msg": "Default temperature test for device and virtual device: zigbee/gfw/dirk/heating_valve", + "args": null, + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 41, + "funcName": "test_default_temperature", + "created": 1675925584.370561, + "msecs": 370.560884475708, + "relativeCreated": 2029.468297958374, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Default temperature test for device and virtual device: zigbee/gfw/dirk/heating_valve", + "asctime": "2023-02-09 07:53:04,370", + "moduleLogger": [], + "testcaseLogger": [ + { + "name": "__tLogger__", + "msg": "Setting preconditions (Valve setpoint to %.1f)", + "args": [ + 20 + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 51, + "funcName": "__test_default_temperature__", + "created": 1675925584.6710901, + "msecs": 671.0901260375977, + "relativeCreated": 2329.9975395202637, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Setting preconditions (Valve setpoint to 20.0)", + "asctime": "2023-02-09 07:53:04,671", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925584.370647, + "msecs": 370.6469535827637, + "relativeCreated": 2029.5543670654297, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:04,370" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.370929, + "msecs": 370.9290027618408, + "relativeCreated": 2029.8364162445068, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:04,370" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 20}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.3802192, + "msecs": 380.2192211151123, + "relativeCreated": 2039.1266345977783, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 20}'", + "asctime": "2023-02-09 07:53:04,380" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.3803585, + "msecs": 380.3584575653076, + "relativeCreated": 2039.2658710479736, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:04,380" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.3804786, + "msecs": 380.4786205291748, + "relativeCreated": 2039.3860340118408, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,380" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.380585, + "msecs": 380.5849552154541, + "relativeCreated": 2039.4923686981201, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:04,380" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.3806925, + "msecs": 380.6924819946289, + "relativeCreated": 2039.599895477295, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,380" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.380794, + "msecs": 380.7940483093262, + "relativeCreated": 2039.7014617919922, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:04,380" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.3808963, + "msecs": 380.89632987976074, + "relativeCreated": 2039.8037433624268, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,380" + } + ], + "time_consumption": 0.2901937961578369 + }, + { + "name": "__tLogger__", + "msg": "Valve temperature setpoint (is not default temperature) is correct (Content %s and Type is %s).", + "args": [ + "True", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925584.671298, + "msecs": 671.2980270385742, + "relativeCreated": 2330.2054405212402, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Valve temperature setpoint (is not default temperature) is correct (Content True and Type is ).", + "asctime": "2023-02-09 07:53:04,671", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Valve temperature setpoint (is not default temperature)", + "True", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925584.6712503, + "msecs": 671.2503433227539, + "relativeCreated": 2330.15775680542, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Valve temperature setpoint (is not default temperature)): True ()", + "asctime": "2023-02-09 07:53:04,671" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Valve temperature setpoint (is not default temperature)", + "=", + "True", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925584.671277, + "msecs": 671.2770462036133, + "relativeCreated": 2330.1844596862793, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Valve temperature setpoint (is not default temperature)): result = True ()", + "asctime": "2023-02-09 07:53:04,671" + } + ], + "time_consumption": 2.09808349609375e-05 + }, + { + "name": "__tLogger__", + "msg": "Triggering set to default temperature (%.1f)", + "args": [ + 25 + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 57, + "funcName": "__test_default_temperature__", + "created": 1675925584.971841, + "msecs": 971.8410968780518, + "relativeCreated": 2630.748510360718, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Triggering set to default temperature (25.0)", + "asctime": "2023-02-09 07:53:04,971", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925584.6713634, + "msecs": 671.363353729248, + "relativeCreated": 2330.270767211914, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true", + "asctime": "2023-02-09 07:53:04,671" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.671677, + "msecs": 671.6771125793457, + "relativeCreated": 2330.5845260620117, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true'", + "asctime": "2023-02-09 07:53:04,671" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.679565, + "msecs": 679.5649528503418, + "relativeCreated": 2338.472366333008, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:04,679" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.679705, + "msecs": 679.7049045562744, + "relativeCreated": 2338.6123180389404, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,679" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.6798174, + "msecs": 679.8174381256104, + "relativeCreated": 2338.7248516082764, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:04,679" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925584.679884, + "msecs": 679.8839569091797, + "relativeCreated": 2338.7913703918457, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:04,679" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.6800041, + "msecs": 680.0041198730469, + "relativeCreated": 2338.911533355713, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:04,680" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.6801374, + "msecs": 680.1373958587646, + "relativeCreated": 2339.0448093414307, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,680" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.6802452, + "msecs": 680.2451610565186, + "relativeCreated": 2339.1525745391846, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:04,680" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.721885, + "msecs": 721.8849658966064, + "relativeCreated": 2380.7923793792725, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:04,721" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.7220044, + "msecs": 722.0044136047363, + "relativeCreated": 2380.9118270874023, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:04,722" + } + ], + "time_consumption": 0.24983668327331543 + }, + { + "name": "__tLogger__", + "msg": "Valve temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925584.972043, + "msecs": 972.0430374145508, + "relativeCreated": 2630.950450897217, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Valve temperature setpoint is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:04,972", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Valve temperature setpoint", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925584.9719915, + "msecs": 971.9915390014648, + "relativeCreated": 2630.898952484131, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Valve temperature setpoint): 25 ()", + "asctime": "2023-02-09 07:53:04,971" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Valve temperature setpoint", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925584.9720218, + "msecs": 972.0218181610107, + "relativeCreated": 2630.9292316436768, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Valve temperature setpoint): result = 25 ()", + "asctime": "2023-02-09 07:53:04,972" + } + ], + "time_consumption": 2.1219253540039062e-05 + } + ], + "time_consumption": 0.6014821529388428, + "time_start": "2023-02-09 07:53:04,370", + "time_finished": "2023-02-09 07:53:04,972" + }, + "Summer mode test: zigbee/gfw/dirk/heating_valve": { + "name": "__tLogger__", + "msg": "Summer mode test: zigbee/gfw/dirk/heating_valve", + "args": null, + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 61, + "funcName": "test_summer_mode", + "created": 1675925584.9721286, + "msecs": 972.1286296844482, + "relativeCreated": 2631.0360431671143, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Summer mode test: zigbee/gfw/dirk/heating_valve", + "asctime": "2023-02-09 07:53:04,972", + "moduleLogger": [], + "testcaseLogger": [ + { + "name": "__tLogger__", + "msg": "Setting preconditions (Default setpoint)", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 66, + "funcName": "__test_summer_mode__", + "created": 1675925585.2726793, + "msecs": 272.67932891845703, + "relativeCreated": 2931.586742401123, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Setting preconditions (Default setpoint)", + "asctime": "2023-02-09 07:53:05,272", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925584.9722052, + "msecs": 972.2051620483398, + "relativeCreated": 2631.112575531006, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true", + "asctime": "2023-02-09 07:53:04,972" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.set_default_temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/set_default_temperature", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925584.9725227, + "msecs": 972.5227355957031, + "relativeCreated": 2631.430149078369, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true'", + "asctime": "2023-02-09 07:53:04,972" + } + ], + "time_consumption": 0.3001565933227539 + }, + { + "name": "__tLogger__", + "msg": "Summer mode is correct (Content %s and Type is %s).", + "args": [ + "False", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925585.27286, + "msecs": 272.860050201416, + "relativeCreated": 2931.767463684082, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Summer mode is correct (Content False and Type is ).", + "asctime": "2023-02-09 07:53:05,272", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Summer mode", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925585.2728128, + "msecs": 272.8128433227539, + "relativeCreated": 2931.72025680542, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Summer mode): False ()", + "asctime": "2023-02-09 07:53:05,272" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Summer mode", + "=", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925585.272839, + "msecs": 272.8390693664551, + "relativeCreated": 2931.746482849121, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Summer mode): result = False ()", + "asctime": "2023-02-09 07:53:05,272" + } + ], + "time_consumption": 2.09808349609375e-05 + }, + { + "name": "__tLogger__", + "msg": "Activating summer mode", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 73, + "funcName": "__test_summer_mode__", + "created": 1675925585.573399, + "msecs": 573.3990669250488, + "relativeCreated": 3232.306480407715, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Activating summer mode", + "asctime": "2023-02-09 07:53:05,573", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.summer_mode", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/summer_mode", + "true" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925585.2729404, + "msecs": 272.94039726257324, + "relativeCreated": 2931.8478107452393, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/summer_mode and payload true", + "asctime": "2023-02-09 07:53:05,272" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.summer_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/summer_mode", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.273286, + "msecs": 273.2861042022705, + "relativeCreated": 2932.1935176849365, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'true'", + "asctime": "2023-02-09 07:53:05,273" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 5}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.2825596, + "msecs": 282.5596332550049, + "relativeCreated": 2941.467046737671, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 5}'", + "asctime": "2023-02-09 07:53:05,282" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 5, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925585.2826548, + "msecs": 282.6547622680664, + "relativeCreated": 2941.5621757507324, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 5, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:05,282" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'5'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.282786, + "msecs": 282.78589248657227, + "relativeCreated": 2941.6933059692383, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'5'", + "asctime": "2023-02-09 07:53:05,282" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.282926, + "msecs": 282.926082611084, + "relativeCreated": 2941.83349609375, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,282" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.summer_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/summer_mode", + "b'true'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.2830346, + "msecs": 283.0345630645752, + "relativeCreated": 2941.941976547241, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'true'", + "asctime": "2023-02-09 07:53:05,283" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.2831364, + "msecs": 283.13636779785156, + "relativeCreated": 2942.0437812805176, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,283" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 5, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.2832384, + "msecs": 283.23841094970703, + "relativeCreated": 2942.145824432373, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 5, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:05,283" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.3267515, + "msecs": 326.7514705657959, + "relativeCreated": 2985.658884048462, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:05,326" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.370112, + "msecs": 370.11194229125977, + "relativeCreated": 3029.019355773926, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,370" + } + ], + "time_consumption": 0.20328712463378906 + }, + { + "name": "__tLogger__", + "msg": "Summer mode is correct (Content %s and Type is %s).", + "args": [ + "True", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925585.5735488, + "msecs": 573.5487937927246, + "relativeCreated": 3232.4562072753906, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Summer mode is correct (Content True and Type is ).", + "asctime": "2023-02-09 07:53:05,573", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Summer mode", + "True", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925585.5735009, + "msecs": 573.5008716583252, + "relativeCreated": 3232.408285140991, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Summer mode): True ()", + "asctime": "2023-02-09 07:53:05,573" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Summer mode", + "=", + "True", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925585.5735278, + "msecs": 573.5278129577637, + "relativeCreated": 3232.4352264404297, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Summer mode): result = True ()", + "asctime": "2023-02-09 07:53:05,573" + } + ], + "time_consumption": 2.09808349609375e-05 + }, + { + "name": "__tLogger__", + "msg": "Temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "5", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925585.5736187, + "msecs": 573.6186504364014, + "relativeCreated": 3232.5260639190674, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Temperature setpoint is correct (Content 5 and Type is ).", + "asctime": "2023-02-09 07:53:05,573", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Temperature setpoint", + "5", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925585.5735857, + "msecs": 573.5857486724854, + "relativeCreated": 3232.4931621551514, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Temperature setpoint): 5 ()", + "asctime": "2023-02-09 07:53:05,573" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Temperature setpoint", + "=", + "5", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925585.5736032, + "msecs": 573.6031532287598, + "relativeCreated": 3232.510566711426, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Temperature setpoint): result = 5 ()", + "asctime": "2023-02-09 07:53:05,573" + } + ], + "time_consumption": 1.5497207641601562e-05 + }, + { + "name": "__tLogger__", + "msg": "Deactivating summer mode", + "args": [], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 79, + "funcName": "__test_summer_mode__", + "created": 1675925585.8738317, + "msecs": 873.8317489624023, + "relativeCreated": 3532.7391624450684, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Deactivating summer mode", + "asctime": "2023-02-09 07:53:05,873", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.summer_mode", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/summer_mode", + "false" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925585.5736837, + "msecs": 573.6837387084961, + "relativeCreated": 3232.591152191162, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/summer_mode and payload false", + "asctime": "2023-02-09 07:53:05,573" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.summer_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/summer_mode", + "b'false'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.5740187, + "msecs": 574.0187168121338, + "relativeCreated": 3232.9261302948, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'false'", + "asctime": "2023-02-09 07:53:05,574" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.578195, + "msecs": 578.1950950622559, + "relativeCreated": 3237.102508544922, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925585.5784128, + "msecs": 578.4127712249756, + "relativeCreated": 3237.3201847076416, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.5785358, + "msecs": 578.535795211792, + "relativeCreated": 3237.443208694458, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.5786755, + "msecs": 578.6755084991455, + "relativeCreated": 3237.5829219818115, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.summer_mode", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/summer_mode", + "b'false'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.5787823, + "msecs": 578.782320022583, + "relativeCreated": 3237.689733505249, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'false'", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.578885, + "msecs": 578.8850784301758, + "relativeCreated": 3237.792491912842, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.5789874, + "msecs": 578.9873600006104, + "relativeCreated": 3237.8947734832764, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:05,578" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.6233873, + "msecs": 623.387336730957, + "relativeCreated": 3282.294750213623, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:05,623" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.6661093, + "msecs": 666.1093235015869, + "relativeCreated": 3325.016736984253, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,666" + } + ], + "time_consumption": 0.20772242546081543 + }, + { + "name": "__tLogger__", + "msg": "Summer mode is correct (Content %s and Type is %s).", + "args": [ + "False", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925585.8739414, + "msecs": 873.9414215087891, + "relativeCreated": 3532.848834991455, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Summer mode is correct (Content False and Type is ).", + "asctime": "2023-02-09 07:53:05,873", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Summer mode", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925585.873897, + "msecs": 873.8970756530762, + "relativeCreated": 3532.804489135742, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Summer mode): False ()", + "asctime": "2023-02-09 07:53:05,873" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Summer mode", + "=", + "False", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925585.8739216, + "msecs": 873.9216327667236, + "relativeCreated": 3532.8290462493896, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Summer mode): result = False ()", + "asctime": "2023-02-09 07:53:05,873" + } + ], + "time_consumption": 1.9788742065429688e-05 + }, + { + "name": "__tLogger__", + "msg": "Temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925585.874005, + "msecs": 874.0050792694092, + "relativeCreated": 3532.912492752075, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Temperature setpoint is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:05,874", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Temperature setpoint", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925585.8739712, + "msecs": 873.9712238311768, + "relativeCreated": 3532.878637313843, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Temperature setpoint): 25 ()", + "asctime": "2023-02-09 07:53:05,873" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Temperature setpoint", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925585.8739889, + "msecs": 873.9888668060303, + "relativeCreated": 3532.8962802886963, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Temperature setpoint): result = 25 ()", + "asctime": "2023-02-09 07:53:05,873" + } + ], + "time_consumption": 1.621246337890625e-05 + } + ], + "time_consumption": 0.9018764495849609, + "time_start": "2023-02-09 07:53:04,972", + "time_finished": "2023-02-09 07:53:05,874" + }, + "User temperature setpoint test for device and virtual device: zigbee/gfw/dirk/heating_valve": { + "name": "__tLogger__", + "msg": "User temperature setpoint test for device and virtual device: zigbee/gfw/dirk/heating_valve", + "args": null, + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 17, + "funcName": "test_user_temperature_setpoint", + "created": 1675925585.8740854, + "msecs": 874.0854263305664, + "relativeCreated": 3532.9928398132324, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "User temperature setpoint test for device and virtual device: zigbee/gfw/dirk/heating_valve", + "asctime": "2023-02-09 07:53:05,874", + "moduleLogger": [], + "testcaseLogger": [ + { + "name": "__tLogger__", + "msg": "Changing valve temperature setpoint to '%.1f'", + "args": [ + 20 + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 28, + "funcName": "__test_user_temperature_setpoint__", + "created": 1675925586.1745794, + "msecs": 174.57938194274902, + "relativeCreated": 3833.486795425415, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Changing valve temperature setpoint to '20.0'", + "asctime": "2023-02-09 07:53:06,174", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925585.8741488, + "msecs": 874.1488456726074, + "relativeCreated": 3533.0562591552734, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:05,874" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8744133, + "msecs": 874.413251876831, + "relativeCreated": 3533.320665359497, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:05,874" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 20}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8834255, + "msecs": 883.4254741668701, + "relativeCreated": 3542.332887649536, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 20}'", + "asctime": "2023-02-09 07:53:05,883" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8835523, + "msecs": 883.5523128509521, + "relativeCreated": 3542.459726333618, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:05,883" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8836708, + "msecs": 883.6708068847656, + "relativeCreated": 3542.5782203674316, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,883" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8837757, + "msecs": 883.7757110595703, + "relativeCreated": 3542.6831245422363, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:05,883" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.883883, + "msecs": 883.882999420166, + "relativeCreated": 3542.790412902832, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,883" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8839839, + "msecs": 883.983850479126, + "relativeCreated": 3542.891263961792, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:05,883" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925585.8840861, + "msecs": 884.0861320495605, + "relativeCreated": 3542.9935455322266, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:05,884" + } + ], + "time_consumption": 0.2904932498931885 + }, + { + "name": "__tLogger__", + "msg": "Virtual device valve temperature is correct (Content %s and Type is %s).", + "args": [ + "20", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925586.1747766, + "msecs": 174.77655410766602, + "relativeCreated": 3833.683967590332, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Virtual device valve temperature is correct (Content 20 and Type is ).", + "asctime": "2023-02-09 07:53:06,174", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Virtual device valve temperature", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925586.1747246, + "msecs": 174.72457885742188, + "relativeCreated": 3833.631992340088, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Virtual device valve temperature): 20 ()", + "asctime": "2023-02-09 07:53:06,174" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Virtual device valve temperature", + "=", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925586.1747553, + "msecs": 174.75533485412598, + "relativeCreated": 3833.662748336792, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Virtual device valve temperature): result = 20 ()", + "asctime": "2023-02-09 07:53:06,174" + } + ], + "time_consumption": 2.1219253540039062e-05 + }, + { + "name": "__tLogger__", + "msg": "Virtual device user temperature is correct (Content %s and Type is %s).", + "args": [ + "20", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925586.1748476, + "msecs": 174.84760284423828, + "relativeCreated": 3833.7550163269043, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Virtual device user temperature is correct (Content 20 and Type is ).", + "asctime": "2023-02-09 07:53:06,174", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Virtual device user temperature", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925586.174813, + "msecs": 174.81303215026855, + "relativeCreated": 3833.7204456329346, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Virtual device user temperature): 20 ()", + "asctime": "2023-02-09 07:53:06,174" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Virtual device user temperature", + "=", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925586.1748304, + "msecs": 174.83043670654297, + "relativeCreated": 3833.737850189209, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Virtual device user temperature): result = 20 ()", + "asctime": "2023-02-09 07:53:06,174" + } + ], + "time_consumption": 1.71661376953125e-05 + }, + { + "name": "__tLogger__", + "msg": "Changing videv user temperature setpoint to '%.1f'", + "args": [ + 25 + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 36, + "funcName": "__test_user_temperature_setpoint__", + "created": 1675925586.4753644, + "msecs": 475.36444664001465, + "relativeCreated": 4134.271860122681, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Changing videv user temperature setpoint to '25.0'", + "asctime": "2023-02-09 07:53:06,475", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "25" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925586.1749182, + "msecs": 174.91817474365234, + "relativeCreated": 3833.8255882263184, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload 25", + "asctime": "2023-02-09 07:53:06,174" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1754096, + "msecs": 175.40955543518066, + "relativeCreated": 3834.3169689178467, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:06,175" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1846411, + "msecs": 184.64112281799316, + "relativeCreated": 3843.548536300659, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:06,184" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925586.184733, + "msecs": 184.73291397094727, + "relativeCreated": 3843.6403274536133, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:06,184" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1848571, + "msecs": 184.85713005065918, + "relativeCreated": 3843.764543533325, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:06,184" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1849973, + "msecs": 184.9973201751709, + "relativeCreated": 3843.904733657837, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,184" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1851041, + "msecs": 185.1041316986084, + "relativeCreated": 3844.0115451812744, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:06,185" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1852076, + "msecs": 185.20760536193848, + "relativeCreated": 3844.1150188446045, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,185" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.1853094, + "msecs": 185.30941009521484, + "relativeCreated": 3844.216823577881, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:06,185" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.2271936, + "msecs": 227.19359397888184, + "relativeCreated": 3886.101007461548, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:06,227" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.2699656, + "msecs": 269.96564865112305, + "relativeCreated": 3928.873062133789, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,269" + } + ], + "time_consumption": 0.2053987979888916 + }, + { + "name": "__tLogger__", + "msg": "Valve device temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925586.4754734, + "msecs": 475.47340393066406, + "relativeCreated": 4134.38081741333, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Valve device temperature setpoint is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:06,475", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Valve device temperature setpoint", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925586.4754303, + "msecs": 475.4302501678467, + "relativeCreated": 4134.337663650513, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Valve device temperature setpoint): 25 ()", + "asctime": "2023-02-09 07:53:06,475" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Valve device temperature setpoint", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925586.475454, + "msecs": 475.45409202575684, + "relativeCreated": 4134.361505508423, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Valve device temperature setpoint): result = 25 ()", + "asctime": "2023-02-09 07:53:06,475" + } + ], + "time_consumption": 1.9311904907226562e-05 + }, + { + "name": "__tLogger__", + "msg": "Virtual device valve temperature is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925586.4755344, + "msecs": 475.53443908691406, + "relativeCreated": 4134.44185256958, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Virtual device valve temperature is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:06,475", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Virtual device valve temperature", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925586.475502, + "msecs": 475.50201416015625, + "relativeCreated": 4134.409427642822, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Virtual device valve temperature): 25 ()", + "asctime": "2023-02-09 07:53:06,475" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Virtual device valve temperature", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925586.475519, + "msecs": 475.51894187927246, + "relativeCreated": 4134.4263553619385, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Virtual device valve temperature): result = 25 ()", + "asctime": "2023-02-09 07:53:06,475" + } + ], + "time_consumption": 1.5497207641601562e-05 + }, + { + "name": "__tLogger__", + "msg": "Changing valve temperature setpoint to '%.1f'", + "args": [ + 20 + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 28, + "funcName": "__test_user_temperature_setpoint__", + "created": 1675925586.7760122, + "msecs": 776.0121822357178, + "relativeCreated": 4434.919595718384, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Changing valve temperature setpoint to '20.0'", + "asctime": "2023-02-09 07:53:06,776", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925586.4755847, + "msecs": 475.5847454071045, + "relativeCreated": 4134.4921588897705, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:06,475" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.4758413, + "msecs": 475.8412837982178, + "relativeCreated": 4134.748697280884, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 20, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:06,475" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 20}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.483676, + "msecs": 483.6759567260742, + "relativeCreated": 4142.58337020874, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 20}'", + "asctime": "2023-02-09 07:53:06,483" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.483802, + "msecs": 483.80208015441895, + "relativeCreated": 4142.709493637085, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:06,483" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.4839196, + "msecs": 483.919620513916, + "relativeCreated": 4142.827033996582, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,483" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'20'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.4840267, + "msecs": 484.0266704559326, + "relativeCreated": 4142.934083938599, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'20'", + "asctime": "2023-02-09 07:53:06,484" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.4841342, + "msecs": 484.1341972351074, + "relativeCreated": 4143.041610717773, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,484" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.484238, + "msecs": 484.2379093170166, + "relativeCreated": 4143.145322799683, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:06,484" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.4843457, + "msecs": 484.3456745147705, + "relativeCreated": 4143.2530879974365, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,484" + } + ], + "time_consumption": 0.29166650772094727 + }, + { + "name": "__tLogger__", + "msg": "Virtual device valve temperature is correct (Content %s and Type is %s).", + "args": [ + "20", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925586.7761981, + "msecs": 776.198148727417, + "relativeCreated": 4435.105562210083, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Virtual device valve temperature is correct (Content 20 and Type is ).", + "asctime": "2023-02-09 07:53:06,776", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Virtual device valve temperature", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925586.776147, + "msecs": 776.1468887329102, + "relativeCreated": 4435.054302215576, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Virtual device valve temperature): 20 ()", + "asctime": "2023-02-09 07:53:06,776" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Virtual device valve temperature", + "=", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925586.7761765, + "msecs": 776.1764526367188, + "relativeCreated": 4435.083866119385, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Virtual device valve temperature): result = 20 ()", + "asctime": "2023-02-09 07:53:06,776" + } + ], + "time_consumption": 2.1696090698242188e-05 + }, + { + "name": "__tLogger__", + "msg": "Virtual device user temperature is correct (Content %s and Type is %s).", + "args": [ + "20", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925586.7762651, + "msecs": 776.2651443481445, + "relativeCreated": 4435.172557830811, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Virtual device user temperature is correct (Content 20 and Type is ).", + "asctime": "2023-02-09 07:53:06,776", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Virtual device user temperature", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925586.7762268, + "msecs": 776.2267589569092, + "relativeCreated": 4435.134172439575, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Virtual device user temperature): 20 ()", + "asctime": "2023-02-09 07:53:06,776" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Virtual device user temperature", + "=", + "20", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925586.776244, + "msecs": 776.2439250946045, + "relativeCreated": 4435.1513385772705, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Virtual device user temperature): result = 20 ()", + "asctime": "2023-02-09 07:53:06,776" + } + ], + "time_consumption": 2.1219253540039062e-05 + }, + { + "name": "__tLogger__", + "msg": "Changing videv user temperature setpoint to '%.1f'", + "args": [ + 25 + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/tests/heating.py", + "filename": "heating.py", + "module": "heating", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 36, + "funcName": "__test_user_temperature_setpoint__", + "created": 1675925587.0767856, + "msecs": 76.78556442260742, + "relativeCreated": 4735.692977905273, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Changing videv user temperature setpoint to '25.0'", + "asctime": "2023-02-09 07:53:07,076", + "moduleLogger": [ + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "25" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925586.7763343, + "msecs": 776.334285736084, + "relativeCreated": 4435.24169921875, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload 25", + "asctime": "2023-02-09 07:53:06,776" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.7766817, + "msecs": 776.681661605835, + "relativeCreated": 4435.589075088501, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:06,776" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve.set", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve/set", + "b'{\"current_heating_setpoint\": 25}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.7856944, + "msecs": 785.6943607330322, + "relativeCreated": 4444.601774215698, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{\"current_heating_setpoint\": 25}'", + "asctime": "2023-02-09 07:53:06,785" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Sending message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 75, + "funcName": "send", + "created": 1675925586.7857926, + "msecs": 785.7925891876221, + "relativeCreated": 4444.700002670288, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Sending message with topic zigbee/gfw/dirk/heating_valve and payload {\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}", + "asctime": "2023-02-09 07:53:06,785" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.valve_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/valve_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.7859247, + "msecs": 785.9246730804443, + "relativeCreated": 4444.83208656311, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:06,785" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.7860649, + "msecs": 786.064863204956, + "relativeCreated": 4444.972276687622, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,786" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.user_temperature_setpoint", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/user_temperature_setpoint", + "b'25'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.786171, + "msecs": 786.1709594726562, + "relativeCreated": 4445.078372955322, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25'", + "asctime": "2023-02-09 07:53:06,786" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.7862737, + "msecs": 786.273717880249, + "relativeCreated": 4445.181131362915, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,786" + }, + { + "name": "smart_brain.mqtt.zigbee.gfw.dirk.heating_valve", + "msg": "Received message with topic %s and payload %s", + "args": [ + "zigbee/gfw/dirk/heating_valve", + "b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.7863743, + "msecs": 786.3743305206299, + "relativeCreated": 4445.281744003296, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{\"current_heating_setpoint\": 25, \"local_temperature\": 20.7, \"__type__\": \"brennenstuhl_heating_valve\"}'", + "asctime": "2023-02-09 07:53:06,786" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.temperature", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/temperature", + "b'20.7'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.8299415, + "msecs": 829.9415111541748, + "relativeCreated": 4488.848924636841, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7'", + "asctime": "2023-02-09 07:53:06,829" + }, + { + "name": "smart_brain.mqtt.videv.gfw.dirk.heating_valve.__info__", + "msg": "Received message with topic %s and payload %s", + "args": [ + "videv/gfw/dirk/heating_valve/__info__", + "b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/mqtt/__init__.py", + "filename": "__init__.py", + "module": "__init__", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 91, + "funcName": "__receive__", + "created": 1675925586.8700416, + "msecs": 870.0416088104248, + "relativeCreated": 4528.949022293091, + "thread": 139722745357888, + "threadName": "Thread-1 (_thread_main)", + "processName": "MainProcess", + "process": 67261, + "message": "Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{\"__type__\": \"videv_heating\", \"user_temperature_setpoint\": {\"control\": true, \"display\": true}, \"away_mode\": {\"control\": true, \"display\": true}, \"summer_mode\": {\"control\": true, \"display\": true}, \"start_boost\": {\"control\": true}, \"set_default_temperature\": {\"control\": true}, \"valve_temperature_setpoint\": {\"display\": true}, \"boost_timer\": {\"display\": true}, \"temperature\": {\"display\": true}}'", + "asctime": "2023-02-09 07:53:06,870" + } + ], + "time_consumption": 0.20674395561218262 + }, + { + "name": "__tLogger__", + "msg": "Valve device temperature setpoint is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925587.076923, + "msecs": 76.92289352416992, + "relativeCreated": 4735.830307006836, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Valve device temperature setpoint is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:07,076", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Valve device temperature setpoint", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925587.0768769, + "msecs": 76.87687873840332, + "relativeCreated": 4735.784292221069, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Valve device temperature setpoint): 25 ()", + "asctime": "2023-02-09 07:53:07,076" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Valve device temperature setpoint", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925587.0769029, + "msecs": 76.90286636352539, + "relativeCreated": 4735.810279846191, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Valve device temperature setpoint): result = 25 ()", + "asctime": "2023-02-09 07:53:07,076" + } + ], + "time_consumption": 2.002716064453125e-05 + }, + { + "name": "__tLogger__", + "msg": "Virtual device valve temperature is correct (Content %s and Type is %s).", + "args": [ + "25", + "" + ], + "levelname": "INFO", + "levelno": 20, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 187, + "funcName": "equivalency_chk", + "created": 1675925587.0769918, + "msecs": 76.99179649353027, + "relativeCreated": 4735.899209976196, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Virtual device valve temperature is correct (Content 25 and Type is ).", + "asctime": "2023-02-09 07:53:07,076", + "moduleLogger": [ + { + "name": "__unittest__", + "msg": "Result (%s): %s (%s)", + "args": [ + "Virtual device valve temperature", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 22, + "funcName": "__report_result__", + "created": 1675925587.0769582, + "msecs": 76.95817947387695, + "relativeCreated": 4735.865592956543, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Result (Virtual device valve temperature): 25 ()", + "asctime": "2023-02-09 07:53:07,076" + }, + { + "name": "__unittest__", + "msg": "Expectation (%s): result %s %s (%s)", + "args": [ + "Virtual device valve temperature", + "=", + "25", + "" + ], + "levelname": "DEBUG", + "levelno": 10, + "pathname": "/home/dirk/my_repositories/smarthome/smart_brain_test/unittest/test.py", + "filename": "test.py", + "module": "test", + "exc_info": null, + "exc_text": null, + "stack_info": null, + "lineno": 26, + "funcName": "__report_expectation__", + "created": 1675925587.0769763, + "msecs": 76.97629928588867, + "relativeCreated": 4735.883712768555, + "thread": 139722769600512, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 67261, + "message": "Expectation (Virtual device valve temperature): result = 25 ()", + "asctime": "2023-02-09 07:53:07,076" + } + ], + "time_consumption": 1.5497207641601562e-05 + } + ], + "time_consumption": 1.2029063701629639, + "time_start": "2023-02-09 07:53:05,874", + "time_finished": "2023-02-09 07:53:07,076" + } + }, + "uid_list_sorted": [ + "Away mode test: zigbee/gfw/dirk/heating_valve", + "Boost mode test: zigbee/gfw/dirk/heating_valve", + "Default temperature test for device and virtual device: zigbee/gfw/dirk/heating_valve", + "Summer mode test: zigbee/gfw/dirk/heating_valve", + "User temperature setpoint test for device and virtual device: zigbee/gfw/dirk/heating_valve" + ], + "system_information": { + "Architecture": "64bit", + "Machine": "x86_64", + "Hostname": "ahorn", + "Distribution": "Linux Mint 21.1 (vera)", + "System": "Linux", + "Kernel": "5.15.0-58-generic (#64-Ubuntu SMP Thu Jan 5 11:43:13 UTC 2023)", + "Username": "dirk", + "Path": "/home/dirk/my_repositories/smarthome/smart_brain_test/all.py" + } +} \ No newline at end of file diff --git a/testresults/testrun.pdf b/testresults/testrun.pdf new file mode 100644 index 0000000000000000000000000000000000000000..72735e3d16da76c383849e565381c713692e9cfc GIT binary patch literal 147478 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%0DG;y;(kC)%r9OAvo}S=rSvAG@P~~g zw}XA~8u!@ymHN2prMG&^kHi86i=&GlC6q>)%*Ye-nA+S*7Mo8l_OSK87of$Z${T?se-^`ne=l5F+l^Skn5E&(CQf!Rj0lgTr>&^X6*E3e#l*m1>Y zZ}}{P^cF)7sfEnb^-c+R7`Kf-uv0fOTvLsf9|iO_Vm0xH6;jd|U*={N_Y9O_5y|T* z&LcKRH`j?;C;wVSSjkHx*6K~}qv=P8%aH?W-2-U6+EA{l6J(74w$C4sKnQ6K3J!WO zCQONF(*xnd7R2!kgr0J;^~iHvqMckkcfEU*M zrNQ`f9$wDVqu8o!{AA*BFZ7+Ce2Ug#F{(!U_!)Q&RB_b&_!g?)tjS65+~ip2D8l^b zb_-VX+;Q0#-PWS8#G2h$dp(8eG(b=HquQ2lnutjqy+T~jzGgpaZBt|&N9;u%vrlI< zC%(K&7CD}}=_2B}{0*u6YYDbS=_m0)?-~;{I#@FnYj2(HuNXv+oP53@*~_lo0`%Hv z5lUE-He~7ho_08^VN*1=2!T-Y%e`>9f;EAhf@S>fx7~e+DU9~qlaNS-IhR)66|U;f zviD!hq&-N&%uO!JB0_Iu7~Z@0E7CTB9>*lqC&f__Q)IL#;I343##tu z>2<1R`dvRshz=tN;{f=;h^)0{;g68UEF9_Ck&RQjotRRaPrmF%@MgB?+K1 zNE9rkEF~tU1_Fvpf`Q@^%4$-gKuHyO*8ePmT1N*0b3ySCfP}cz|J6sql%wlmszw>_ zB79d8m#ysjT)7ha8n;~Wfv{Y$LUSMefm@rnin9dWU?zK0`>n3-lte~ zB)aD>qXBR>I5M{Ki!0m!WFbR5R$QP~!bE~(V8=41Oof2&l7VOx(LQwVW%;xx#7Ct->SZiwPmU|b{m z;)!*em>1jng`Ga4FaKElQ%pR|3Hlm2s|iL#A5jmLHw}@(dU%h?7Y>x%eysabCL)D* z%0kPEy=g&d`VYM7y=hfN>)ds+2cs`iNkqAp)i(H2HLW8efmURy~}X1bubn^7(L zL6;B4OKHlhiBF2(cLB&Qov#ubn{&3x;ob%5M(#qfKpp*Y=&t1hjY9%rMW5ED|@B5f<2dHIiBL(JHtY%V3MQJj-26*%0yFhNC*gLjt%U z$pV&V;29F#wdA=Xk< zNRiR%scl3=hQMBs-pS}qCquZ>iX{3q`jkwi^>%MmbiR?=slgF<_q4;(reyJ>ZN$@ISz}2jWg|wb0DBtQ@p~YzQ+!-U6O1=K@O>gW(8ofpz~g`Ri{!7xJ64tZ{MY2O|LtDm%nT=>>ex1!hTmMI## z42+j8*TpX&m-aV6*h}{8a(pIN@kz`HZ&v*Mc@p)9XtClFm4wVeUXP%QKSo0KLy3D-wDbUw>1FMbb`8$n zlF9O2U3ltCLb6DXc<`eXTKcIA2&z)`ywC101z&}Ai1CSuf*Iz(a20h*PUBSQh0co; z;5wvlI5CGzgd>j@0CIc3ci!EuzM{X>KU_6Ipn{s_W!l~HjO=tf`jL#n%vAA(`+ht9 z?|UL7nDP96!__7w=;8FHo&M~8F0Y;b)B+iMYO$n~6hET{im-Th<(ib;LSCo!Jh8?g zhGzPkRMFY4I$;-;tL%0lA*^-WX$(od2rJ1ci%{gI4pEpa*1MYiLjz&} literal 0 HcmV?d00001 diff --git a/testresults/testrun.tex b/testresults/testrun.tex new file mode 100644 index 0000000..9001533 --- /dev/null +++ b/testresults/testrun.tex @@ -0,0 +1,304 @@ + +\documentclass[a4paper]{article} +%\documentclass[a4paper,landscape]{article} + +\renewcommand{\familydefault}{\sfdefault} +\usepackage[table]{xcolor} +\definecolor{orange}{rgb}{1, 0.7, 0} +\definecolor{lightgrey}{rgb}{0.925, 0.925, 0.925} + +\setlength{\topmargin}{-3cm} +\setlength{\oddsidemargin}{-0.5cm} +\setlength{\evensidemargin}{0cm} +\setlength{\textwidth}{17.5cm} +\setlength{\textheight}{24.5cm} +%\setlength{\textwidth}{25cm} +%\setlength{\textheight}{15cm} +\setlength{\headheight}{84pt} + +\usepackage{fancyvrb} +\usepackage{fvextra} +%\usepackage{framed,color} +%\newenvironment{modulelog}{\snugshade\Verbatim}{\endVerbatim\endsnugshade} +\usepackage{adjustbox} +\newenvironment{modulelog}% +{\par\noindent\adjustbox{margin=0ex,bgcolor=shadecolor,margin=0ex}\bgroup\varwidth\linewidth\Verbatim}% +{\endVerbatim\endvarwidth\egroup} +%\usepackage{xcolor} + +\renewcommand{\baselinestretch}{1,2} +\setlength{\parindent}{0pt} +\setlength{\parskip}{9pt plus3pt minus3pt} + +\usepackage{listings} +\usepackage{color} +\definecolor{bg-partially-covered}{rgb}{1,1,0.6} % light-yellow +\definecolor{bg-uncovered}{rgb}{1,0.8,0.8} % light-red +\definecolor{bg-covered}{rgb}{0.95,1,0.95} % very light-green +\definecolor{bg-clean}{rgb}{1,1,1} % white +\definecolor{mygreen}{rgb}{0,0.6,0} +\definecolor{mygray}{rgb}{0.5,0.5,0.5} +\definecolor{mymauve}{rgb}{0.58,0,0.82} +\lstset{ % + backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}; should come as last argument + basicstyle=\footnotesize, % the size of the fonts that are used for the code + breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace + breaklines=true, % sets automatic line breaking + captionpos=b, % sets the caption-position to bottom + commentstyle=\color{mygreen}, % comment style + deletekeywords={...}, % if you want to delete keywords from the given language + escapeinside={\%*}{*)}, % if you want to add LaTeX within your code + extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8 + frame=none, % adds a frame around the code + keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible) + keywordstyle=\color{blue}, % keyword style + language=Octave, % the language of the code + morekeywords={*,...}, % if you want to add more keywords to the set + numbers=left, % where to put the line-numbers; possible values are (none, left, right) + numbersep=5pt, % how far the line-numbers are from the code + numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers + rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here)) + showlines=true, + showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces' + showstringspaces=false, % underline spaces within strings only + showtabs=false, % show tabs within strings adding particular underscores + stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered + stringstyle=\color{mymauve}, % string literal style + tabsize=2, % sets default tabsize to 2 spaces +} +\usepackage{hyperref} +\usepackage{longtable}[=v4.13] +\usepackage{tabu} +\usepackage{multicol} +\usepackage{booktabs} +\usepackage{graphicx} +\usepackage{lastpage} % for the number of the last page in the document +\usepackage{fancyhdr} + +\fancyhf{} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +\lhead{\textcolor{gray}{}} +\chead{\textcolor{gray}{ Unittest for {\tt smart\_brain }}} +\rhead{\textcolor{gray}{}} +\lfoot{\textcolor{gray}{}} +\cfoot{\textcolor{gray}{}} +\rfoot{\textcolor{gray}{\thepage\,/ \pageref{LastPage}}} + +\begin{document} + +\begin{titlepage} +\date{\today} +\title{ + Unittest for {\tt smart\_brain } +} +\date{\today} +\maketitle +\thispagestyle{empty} +\newpage +\end{titlepage} + +\setcounter{page}{1} +\pagestyle{fancy} + +\tableofcontents +\newpage + +\section{Test System Information} +\begin{tabu} to \linewidth {lX} +\toprule +{\bf System Information} & \\ +\midrule +Architecture & 64bit \\ +Machine & x86\_64 \\ +Hostname & ahorn \\ +Distribution & Linux Mint 21.1 (vera) \\ +System & Linux \\ +Kernel & 5.15.0-58-generic (\#64-Ubuntu SMP Thu Jan 5 11:43:13 UTC 2023) \\ +Username & dirk \\ +Path & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak all.py \\ +\bottomrule +\end{tabu} + + +\section{Summary} +\begin{tabu} to \linewidth {lX} + \toprule + Number of tests & {\bf 5}\\ + Number of successfull tests & {\bf 5}\\ + Number of possibly failed tests & \textcolor{black}{\bf 0}\\ + Number of failed tests & \textcolor{black}{\bf 0}\\ + \midrule + Executionlevel & unknown\\ + Time consumption & 4.510s\\ + \bottomrule +\end{tabu} + + + + + + + \section{\textcolor{green}{Testcases (Success)}} + + + \subsection{ Away mode test: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (84)\\ +Start-Time: & 2023-02-09 07:53:02,566\\ +Finished-Time: & 2023-02-09 07:53:03,468\\ +Time-Consumption & 0.902s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Away mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,Info } & Activating away mode\\ +\bf{\,\textcolor{green}{Success} } & Away mode is correct (Content True and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Deactivating away mode\\ +\bf{\,\textcolor{green}{Success} } & Away mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + + + + + + + + \subsection{ Boost mode test: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (107)\\ +Start-Time: & 2023-02-09 07:53:03,468\\ +Finished-Time: & 2023-02-09 07:53:04,370\\ +Time-Consumption & 0.902s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Boost timer is correct (Content 0 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Activating boost mode\\ +\bf{\,\textcolor{green}{Success} } & Boost timer is greater expectation (Content 900 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Setting postconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Boost timer is correct (Content 0 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + + + + + + + + \subsection{ Default temperature test for device and virtual device: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (41)\\ +Start-Time: & 2023-02-09 07:53:04,370\\ +Finished-Time: & 2023-02-09 07:53:04,972\\ +Time-Consumption & 0.601s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Valve setpoint to 20.0)\\ +\bf{\,\textcolor{green}{Success} } & Valve temperature setpoint (is not default temperature) is correct (Content True and Type is $<$class 'bool'$>$).\\ +\bf{\,Info } & Triggering set to default temperature (25.0)\\ +\bf{\,\textcolor{green}{Success} } & Valve temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + + + + + + + + \subsection{ Summer mode test: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (61)\\ +Start-Time: & 2023-02-09 07:53:04,972\\ +Finished-Time: & 2023-02-09 07:53:05,874\\ +Time-Consumption & 0.902s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Summer mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,Info } & Activating summer mode\\ +\bf{\,\textcolor{green}{Success} } & Summer mode is correct (Content True and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 5 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Deactivating summer mode\\ +\bf{\,\textcolor{green}{Success} } & Summer mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + + + + + + + + \subsection{ User temperature setpoint test for device and virtual device: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (17)\\ +Start-Time: & 2023-02-09 07:53:05,874\\ +Finished-Time: & 2023-02-09 07:53:07,076\\ +Time-Consumption & 1.203s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Changing valve temperature setpoint to '20.0'\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device user temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Changing videv user temperature setpoint to '25.0'\\ +\bf{\,\textcolor{green}{Success} } & Valve device temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Changing valve temperature setpoint to '20.0'\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device user temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Changing videv user temperature setpoint to '25.0'\\ +\bf{\,\textcolor{green}{Success} } & Valve device temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + + + + + + + + +\end{document} \ No newline at end of file diff --git a/testresults/testrun_full.pdf b/testresults/testrun_full.pdf new file mode 100644 index 0000000000000000000000000000000000000000..302def0c6801ac2d2e5758a0a07a6022a643b28c GIT binary patch literal 125546 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 literal 0 HcmV?d00001 diff --git a/testresults/testrun_full.tex b/testresults/testrun_full.tex new file mode 100644 index 0000000..b03872d --- /dev/null +++ b/testresults/testrun_full.tex @@ -0,0 +1,1328 @@ + +\documentclass[a4paper]{article} +%\documentclass[a4paper,landscape]{article} + +\renewcommand{\familydefault}{\sfdefault} +\usepackage[table]{xcolor} +\definecolor{orange}{rgb}{1, 0.7, 0} +\definecolor{lightgrey}{rgb}{0.925, 0.925, 0.925} + +\setlength{\topmargin}{-3cm} +\setlength{\oddsidemargin}{-0.5cm} +\setlength{\evensidemargin}{0cm} +\setlength{\textwidth}{17.5cm} +\setlength{\textheight}{24.5cm} +%\setlength{\textwidth}{25cm} +%\setlength{\textheight}{15cm} +\setlength{\headheight}{84pt} + +\usepackage{fancyvrb} +\usepackage{fvextra} +%\usepackage{framed,color} +%\newenvironment{modulelog}{\snugshade\Verbatim}{\endVerbatim\endsnugshade} +\usepackage{adjustbox} +\newenvironment{modulelog}% +{\par\noindent\adjustbox{margin=0ex,bgcolor=shadecolor,margin=0ex}\bgroup\varwidth\linewidth\Verbatim}% +{\endVerbatim\endvarwidth\egroup} +%\usepackage{xcolor} + +\renewcommand{\baselinestretch}{1,2} +\setlength{\parindent}{0pt} +\setlength{\parskip}{9pt plus3pt minus3pt} + +\usepackage{listings} +\usepackage{color} +\definecolor{bg-partially-covered}{rgb}{1,1,0.6} % light-yellow +\definecolor{bg-uncovered}{rgb}{1,0.8,0.8} % light-red +\definecolor{bg-covered}{rgb}{0.95,1,0.95} % very light-green +\definecolor{bg-clean}{rgb}{1,1,1} % white +\definecolor{mygreen}{rgb}{0,0.6,0} +\definecolor{mygray}{rgb}{0.5,0.5,0.5} +\definecolor{mymauve}{rgb}{0.58,0,0.82} +\lstset{ % + backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}; should come as last argument + basicstyle=\footnotesize, % the size of the fonts that are used for the code + breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace + breaklines=true, % sets automatic line breaking + captionpos=b, % sets the caption-position to bottom + commentstyle=\color{mygreen}, % comment style + deletekeywords={...}, % if you want to delete keywords from the given language + escapeinside={\%*}{*)}, % if you want to add LaTeX within your code + extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8 + frame=none, % adds a frame around the code + keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible) + keywordstyle=\color{blue}, % keyword style + language=Octave, % the language of the code + morekeywords={*,...}, % if you want to add more keywords to the set + numbers=left, % where to put the line-numbers; possible values are (none, left, right) + numbersep=5pt, % how far the line-numbers are from the code + numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers + rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here)) + showlines=true, + showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces' + showstringspaces=false, % underline spaces within strings only + showtabs=false, % show tabs within strings adding particular underscores + stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered + stringstyle=\color{mymauve}, % string literal style + tabsize=2, % sets default tabsize to 2 spaces +} +\usepackage{hyperref} +\usepackage{longtable}[=v4.13] +\usepackage{tabu} +\usepackage{multicol} +\usepackage{booktabs} +\usepackage{graphicx} +\usepackage{lastpage} % for the number of the last page in the document +\usepackage{fancyhdr} + +\fancyhf{} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +\lhead{\textcolor{gray}{}} +\chead{\textcolor{gray}{ Unittest for {\tt smart\_brain }}} +\rhead{\textcolor{gray}{}} +\lfoot{\textcolor{gray}{}} +\cfoot{\textcolor{gray}{}} +\rfoot{\textcolor{gray}{\thepage\,/ \pageref{LastPage}}} + +\begin{document} + +\begin{titlepage} +\date{\today} +\title{ + Unittest for {\tt smart\_brain } +} +\date{\today} +\maketitle +\thispagestyle{empty} +\newpage +\end{titlepage} + +\setcounter{page}{1} +\pagestyle{fancy} + +\tableofcontents +\newpage + +\section{Test System Information} +\begin{tabu} to \linewidth {lX} +\toprule +{\bf System Information} & \\ +\midrule +Architecture & 64bit \\ +Machine & x86\_64 \\ +Hostname & ahorn \\ +Distribution & Linux Mint 21.1 (vera) \\ +System & Linux \\ +Kernel & 5.15.0-58-generic (\#64-Ubuntu SMP Thu Jan 5 11:43:13 UTC 2023) \\ +Username & dirk \\ +Path & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak all.py \\ +\bottomrule +\end{tabu} + + +\section{Summary} +\begin{tabu} to \linewidth {lX} + \toprule + Number of tests & {\bf 5}\\ + Number of successfull tests & {\bf 5}\\ + Number of possibly failed tests & \textcolor{black}{\bf 0}\\ + Number of failed tests & \textcolor{black}{\bf 0}\\ + \midrule + Executionlevel & unknown\\ + Time consumption & 4.510s\\ + \bottomrule +\end{tabu} + + + + + + + \section{\textcolor{green}{Testcases (Success)}} + + + \subsection{ Away mode test: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (84)\\ +Start-Time: & 2023-02-09 07:53:02,566\\ +Finished-Time: & 2023-02-09 07:53:03,468\\ +Time-Consumption & 0.902s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Away mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,Info } & Activating away mode\\ +\bf{\,\textcolor{green}{Success} } & Away mode is correct (Content True and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Deactivating away mode\\ +\bf{\,\textcolor{green}{Success} } & Away mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + +\paragraph{Testdetails}\mbox{}\\ + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Setting preconditions (Default setpoint)\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Away mode is correct (Content False and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Away mode): False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Away mode): result = False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Activating away mode\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/away_mode and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 20}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Away mode is correct (Content True and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Away mode): True () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Away mode): result = True () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Temperature setpoint is correct (Content 20 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Temperature setpoint): 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Temperature setpoint): result = 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Deactivating away mode\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/away_mode and payload false + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'false' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/away_mode and payload b'false' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Away mode is correct (Content False and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Away mode): False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Away mode): result = False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Temperature setpoint): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Temperature setpoint): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + + + + + + + + \subsection{ Boost mode test: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (107)\\ +Start-Time: & 2023-02-09 07:53:03,468\\ +Finished-Time: & 2023-02-09 07:53:04,370\\ +Time-Consumption & 0.902s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Boost timer is correct (Content 0 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Activating boost mode\\ +\bf{\,\textcolor{green}{Success} } & Boost timer is greater expectation (Content 900 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Setting postconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Boost timer is correct (Content 0 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + +\paragraph{Testdetails}\mbox{}\\ + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Setting preconditions (Default setpoint)\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Boost timer is correct (Content 0 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Boost timer): 0 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Boost timer): result = 0 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Activating boost mode\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/start_boost and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/start_boost and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/boost_timer and payload b'900' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 30}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 30, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'30' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 30, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Boost timer is greater expectation (Content 900 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Boost timer): 900 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Boost timer): result > 0 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Setting postconditions (Default setpoint)\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/boost_timer and payload b'0' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Boost timer is correct (Content 0 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Boost timer): 0 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Boost timer): result = 0 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + + + + + + + + \subsection{ Default temperature test for device and virtual device: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (41)\\ +Start-Time: & 2023-02-09 07:53:04,370\\ +Finished-Time: & 2023-02-09 07:53:04,972\\ +Time-Consumption & 0.601s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Valve setpoint to 20.0)\\ +\bf{\,\textcolor{green}{Success} } & Valve temperature setpoint (is not default temperature) is correct (Content True and Type is $<$class 'bool'$>$).\\ +\bf{\,Info } & Triggering set to default temperature (25.0)\\ +\bf{\,\textcolor{green}{Success} } & Valve temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + +\paragraph{Testdetails}\mbox{}\\ + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Setting preconditions (Valve setpoint to 20.0)\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 20}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Valve temperature setpoint (is not default temperature) is correct (Content True and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Valve temperature setpoint (is not default temperature)): True () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Valve temperature setpoint (is not default temperature)): result = True () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Triggering set to default temperature (25.0)\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Valve temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Valve temperature setpoint): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Valve temperature setpoint): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + + + + + + + + \subsection{ Summer mode test: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (61)\\ +Start-Time: & 2023-02-09 07:53:04,972\\ +Finished-Time: & 2023-02-09 07:53:05,874\\ +Time-Consumption & 0.902s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Setting preconditions (Default setpoint)\\ +\bf{\,\textcolor{green}{Success} } & Summer mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,Info } & Activating summer mode\\ +\bf{\,\textcolor{green}{Success} } & Summer mode is correct (Content True and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 5 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Deactivating summer mode\\ +\bf{\,\textcolor{green}{Success} } & Summer mode is correct (Content False and Type is $<$class 'bool'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + +\paragraph{Testdetails}\mbox{}\\ + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Setting preconditions (Default setpoint)\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/set_default_temperature and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Summer mode is correct (Content False and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Summer mode): False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Summer mode): result = False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Activating summer mode\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/summer_mode and payload true + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 5}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 5, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'5' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'true' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 5, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Summer mode is correct (Content True and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Summer mode): True () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Summer mode): result = True () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Temperature setpoint is correct (Content 5 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Temperature setpoint): 5 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Temperature setpoint): result = 5 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Deactivating summer mode\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/summer_mode and payload false + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'false' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/summer_mode and payload b'false' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Summer mode is correct (Content False and Type is $<$class 'bool'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Summer mode): False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Summer mode): result = False () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Temperature setpoint): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Temperature setpoint): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + + + + + + + + \subsection{ User temperature setpoint test for device and virtual device: zigbee/\allowbreak gfw/\allowbreak dirk/\allowbreak heating\_valve } + + +\paragraph{Testsummary}\mbox{}\\ +This test was passed with the state: {\bf \textcolor{green}{Success}}. +\begin{longtabu} to \linewidth {lX} +\toprule +Caller: & /\allowbreak home/\allowbreak dirk/\allowbreak my\_repositories/\allowbreak smarthome/\allowbreak smart\_brain\_test/\allowbreak tests/\allowbreak heating.py (17)\\ +Start-Time: & 2023-02-09 07:53:05,874\\ +Finished-Time: & 2023-02-09 07:53:07,076\\ +Time-Consumption & 1.203s\\ +\midrule +\multicolumn{2}{l}{\bf{Testresults:}}\\ +\midrule +\bf{\,Info } & Changing valve temperature setpoint to '20.0'\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device user temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Changing videv user temperature setpoint to '25.0'\\ +\bf{\,\textcolor{green}{Success} } & Valve device temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Changing valve temperature setpoint to '20.0'\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device user temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ +\bf{\,Info } & Changing videv user temperature setpoint to '25.0'\\ +\bf{\,\textcolor{green}{Success} } & Valve device temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bf{\,\textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 25 and Type is $<$class 'int'$>$).\\ +\bottomrule +\end{longtabu} + + +\paragraph{Testdetails}\mbox{}\\ + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Changing valve temperature setpoint to '20.0'\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 20}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Virtual device valve temperature): 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Virtual device valve temperature): result = 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Virtual device user temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Virtual device user temperature): 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Virtual device user temperature): result = 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Changing videv user temperature setpoint to '25.0'\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload 25 + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Valve device temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Valve device temperature setpoint): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Valve device temperature setpoint): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Virtual device valve temperature): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Virtual device valve temperature): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Changing valve temperature setpoint to '20.0'\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 20, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 20}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'20' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Virtual device valve temperature): 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Virtual device valve temperature): result = 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Virtual device user temperature is correct (Content 20 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Virtual device user temperature): 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Virtual device user temperature): result = 20 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf Info } & Changing videv user temperature setpoint to '25.0'\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload 25 + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve/set and payload b'{"current_heating_setpoint": 25}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Sending message with topic zigbee/gfw/dirk/heating_valve and payload {"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"} + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/valve_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/user_temperature_setpoint and payload b'25' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic zigbee/gfw/dirk/heating_valve and payload b'{"current_heating_setpoint": 25, "local_temperature": 20.7, "__type__": "brennenstuhl_heating_valve"}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/temperature and payload b'20.7' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Received message with topic videv/gfw/dirk/heating_valve/__info__ and payload b'{"__type__": "videv_heating", "user_temperature_setpoint": {"control": true, "display": true}, "away_mode": {"control": true, "display": true}, "summer_mode": {"control": true, "display": true}, "start_boost": {"control": true}, "set_default_temperature": {"control": true}, "valve_temperature_setpoint": {"display": true}, "boost_timer": {"display": true}, "temperature": {"display": true}}' + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Valve device temperature setpoint is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Valve device temperature setpoint): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Valve device temperature setpoint): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + \begin{tabu} to \linewidth {lX} + \toprule + {\bf \textcolor{green}{Success} } & Virtual device valve temperature is correct (Content 25 and Type is $<$class 'int'$>$).\\ + \bottomrule + \end{tabu} + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Result (Virtual device valve temperature): 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + \definecolor{shadecolor}{rgb}{ 0.8 0.8 0.8 }\begin{modulelog}[breaklines=true, breakanywhere=true] + Expectation (Virtual device valve temperature): result = 25 () + \end{modulelog} + \vspace*{-0.225cm}\pagebreak[1] + + \vspace*{2.5ex} + + + + + + + + +\end{document} \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py index fcc36e9..7d21899 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,137 +1,26 @@ -import colored -import config -import inspect -import simulation.devices as devices -import time - +import report +import simulation.devices +from unittest.test import equivalency_chk DT_TOGGLE = 0.3 -TEST_FULL = 'full' -TEST_SMOKE = 'smoke' -# -COLOR_SUCCESS = colored.fg("light_green") -COLOR_FAIL = colored.fg("light_red") - - -class test_smarthome(object): - def __init__(self, rooms): - # add testcases for switching devices - for name in rooms.getmembers(): - obj = rooms.getobjbyname(name) - if obj.__class__.__name__ == "videv_light": - common_name = '.'.join(name.split('.')[:-1]) + '.' + name.split('.')[-1][6:] - try: - li_device = rooms.getobjbyname(common_name + '_zigbee') if obj.enable_brightness or obj.enable_color_temp else None - except AttributeError: - li_device = rooms.getobjbyname(common_name + '_zigbee_1') if obj.enable_brightness or obj.enable_color_temp else None - try: - sw_device = rooms.getobjbyname(common_name) if obj.enable_state else None - except AttributeError: - # must be a device without switching device - sw_device = li_device - setattr(self, common_name.replace('.', '_'), testcase_light(obj, sw_device, li_device)) - # add testcases for heating devices - for name in rooms.getmembers(): - obj = rooms.getobjbyname(name) - if obj.__class__.__name__ == "videv_heating": - common_name = '.'.join(name.split('.')[:-1]) + '.' + name.split('.')[-1][6:] - heat_device = rooms.getobjbyname(common_name + '_valve') - setattr(self, common_name.replace('.', '_'), testcase_heating(obj, heat_device)) - # synchronisation - self.gfw_dirk_cd_player_amplifier_sync = testcase_synchronisation( - rooms.gfw.dirk.cd_player, None, None, - rooms.gfw.dirk.amplifier) - self.gfw_floor_main_light_sync = testcase_synchronisation( - rooms.gfw.floor.main_light, rooms.gfw.floor.videv_main_light, rooms.gfw.floor.videv_main_light, - rooms.gfw.floor.main_light_zigbee_1, rooms.gfw.floor.main_light_zigbee_2 - ) - self.ffe_diningroom_main_light_floor_lamp_sync = testcase_synchronisation( - rooms.ffe.diningroom.main_light, None, None, - rooms.ffe.diningroom.floor_lamp) - self.ffe_livingroom_main_light_floor_lamp_sync = testcase_synchronisation( - rooms.ffe.livingroom.main_light, rooms.ffe.livingroom.videv_floor_lamp, rooms.ffe.livingroom.videv_floor_lamp, - *[getattr(rooms.ffe.livingroom, "floor_lamp_zigbee_%d" % i) for i in range(1, 7)] - ) - # add test collection - self.all = test_collection(self) - - def getmembers(self, prefix=''): - rv = [] - for name, obj in inspect.getmembers(self): - if prefix: - full_name = prefix + '.' + name - else: - full_name = name - if not name.startswith('_'): - try: - if obj.__class__.__bases__[0].__name__ == "testcase" or obj.__class__.__name__ == "test_collection": - rv.append(full_name) - else: - rv.extend(obj.getmembers(full_name)) - except AttributeError: - pass - return rv - - def getobjbyname(self, name): - if name.startswith("test."): - name = name[5:] - obj = self - for subname in name.split('.'): - obj = getattr(obj, subname) - return obj - - def command(self, full_command): - try: - parameter = " " + full_command.split(' ')[1] - except IndexError: - parameter = "" - command = full_command.split(' ')[0].split('.')[-1] + parameter - device_name = '.'.join(full_command.split(' ')[0].split('.')[:-1]) - self.getobjbyname(device_name).command(command) - - -class test_result_base(object): - def __init__(self): - self.__init_test_counters__() - - def __init_test_counters__(self): - self.test_counter = 0 - self.success_tests = 0 - self.failed_tests = 0 - - def statistic(self): - return (self.test_counter, self.success_tests, self.failed_tests) - - def print_statistic(self): - color = COLOR_SUCCESS if self.test_counter == self.success_tests else COLOR_FAIL - print(color + "*** SUCCESS: (%4d/%4d) FAIL: (%4d/%4d) ***\n" % (self.success_tests, - self.test_counter, self.failed_tests, self.test_counter) + colored.attr("reset")) - - -class test_collection(test_result_base): +class test_collection(object): def __init__(self, test_instance): super().__init__() self.test_instance = test_instance def capabilities(self): - return [TEST_FULL, TEST_SMOKE] + return ['full', 'smoke'] def command(self, command): - self.__init_test_counters__() for member in self.test_instance.getmembers(): obj = self.test_instance.getobjbyname(member) if id(obj) != id(self): - obj.test_all(command) - num, suc, fail = obj.statistic() - self.test_counter += num - self.success_tests += suc - self.failed_tests += fail - self.print_statistic() + obj.test_all(report.TCEL_FULL if command == 'full' else report.TCEL_SMOKE) -class testcase(test_result_base): +class testcase(object): def __init__(self): super().__init__() self.__test_list__ = [] @@ -142,255 +31,13 @@ class testcase(test_result_base): self.__test_list__.sort() return self.__test_list__ - def test_all(self, test=TEST_FULL): - test_counter = 0 - success_tests = 0 - failed_tests = 0 + def test_all(self, tcel=report.TCEL_FULL): for tc_name in self.capabilities(): if tc_name != "test_all": - self.command(tc_name, test) - test_counter += self.test_counter - success_tests += self.success_tests - failed_tests += self.failed_tests - self.test_counter = test_counter - self.success_tests = success_tests - self.failed_tests = failed_tests + self.command(tc_name, tcel) - def command(self, command, test=TEST_FULL): - self.__init_test_counters__() + def command(self, command, tcel=report.TCEL_FULL): + simulation.devices.OUTPUT_ACTIVE = False tc = getattr(self, command) - self.__init_test_counters__() - tc(test) - self.print_statistic() - - def heading(self, desciption): - print(desciption) - - def sub_heading(self, desciption): - print(2 * " " + desciption) - - def result(self, desciption, success): - self.test_counter += 1 - if success: - self.success_tests += 1 - else: - self.failed_tests += 1 - print(4 * " " + ("SUCCESS - " if success else "FAIL - ") + desciption) - - -class testcase_light(testcase): - def __init__(self, videv, sw_device, li_device): - self.videv = videv - self.sw_device = sw_device - self.li_device = li_device - self.__test_list__ = [] - if self.videv.enable_state: - self.__test_list__.append('test_power_on_off') - if self.videv.enable_brightness: - self.__test_list__.append('test_brightness') - if self.videv.enable_color_temp: - self.__test_list__.append('test_color_temp') - - def test_power_on_off(self, test=TEST_FULL): - self.heading("Power On/ Off test (%s)" % self.videv.topic) - # - sw_state = self.sw_device.get(self.sw_device.KEY_OUTPUT_0) - # - for i in range(0, 2): - self.sub_heading("State change of switching device") - # - self.sw_device.set(self.sw_device.KEY_OUTPUT_0, not self.sw_device.get(self.sw_device.KEY_OUTPUT_0)) - time.sleep(DT_TOGGLE) - self.result("Virtual device state after Switch on by switching device", sw_state != self.videv.get(self.videv.KEY_OUTPUT_0)) - self.result("Switching device state after Switch on by switching device", - sw_state != self.sw_device.get(self.sw_device.KEY_OUTPUT_0)) - - self.sub_heading("State change of virtual device") - # - self.videv.set(self.videv.KEY_OUTPUT_0, not self.videv.get(self.videv.KEY_OUTPUT_0)) - time.sleep(DT_TOGGLE) - self.result("Virtual device state after Switch off by virtual device", sw_state == self.videv.get(self.videv.KEY_OUTPUT_0)) - self.result("Switching device state after Switch on by switching device", - sw_state == self.sw_device.get(self.sw_device.KEY_OUTPUT_0)) - - def test_brightness(self, test=TEST_FULL): - self.heading("Brightness test (%s)" % self.videv.topic) - # - br_state = self.li_device.get(self.li_device.KEY_BRIGHTNESS) - delta = -15 if br_state > 50 else 15 - - self.sw_device.set(self.sw_device.KEY_OUTPUT_0, True) - time.sleep(DT_TOGGLE) - - for i in range(0, 2): - self.sub_heading("Brightness change by light device") - # - self.li_device.set(self.li_device.KEY_BRIGHTNESS, br_state + delta) - time.sleep(DT_TOGGLE) - self.result("Virtual device state after setting brightness by light device", - br_state + delta == self.videv.get(self.videv.KEY_BRIGHTNESS)) - self.result("Light device state after setting brightness by light device", br_state + - delta == self.li_device.get(self.li_device.KEY_BRIGHTNESS)) - - self.sub_heading("Brightness change by virtual device") - # - self.videv.set(self.videv.KEY_BRIGHTNESS, br_state) - time.sleep(DT_TOGGLE) - self.result("Virtual device state after setting brightness by light device", br_state == self.videv.get(self.videv.KEY_BRIGHTNESS)) - self.result("Light device state after setting brightness by light device", - br_state == self.li_device.get(self.li_device.KEY_BRIGHTNESS)) - - self.sw_device.set(self.sw_device.KEY_OUTPUT_0, False) - time.sleep(DT_TOGGLE) - - def test_color_temp(self, test=TEST_FULL): - self.heading("Color temperature test (%s)" % self.videv.topic) - # - ct_state = self.li_device.get(self.li_device.KEY_COLOR_TEMP) - delta = -3 if ct_state > 5 else 3 - - self.sw_device.set(self.sw_device.KEY_OUTPUT_0, True) - time.sleep(DT_TOGGLE) - - for i in range(0, 2): - self.sub_heading("Color temperature change by light device") - # - self.li_device.set(self.li_device.KEY_COLOR_TEMP, ct_state + delta) - time.sleep(DT_TOGGLE) - self.result("Virtual device state after setting color temperature by light device", - ct_state + delta == self.videv.get(self.videv.KEY_COLOR_TEMP)) - self.result("Light device state after setting color temperature by light device", ct_state + - delta == self.li_device.get(self.li_device.KEY_COLOR_TEMP)) - - self.sub_heading("Color temperature change by virtual device") - # - self.videv.set(self.videv.KEY_COLOR_TEMP, ct_state) - time.sleep(DT_TOGGLE) - self.result("Virtual device state after setting color temperature by light device", - ct_state == self.videv.get(self.videv.KEY_COLOR_TEMP)) - self.result("Light device state after setting color temperature by light device", - ct_state == self.li_device.get(self.li_device.KEY_COLOR_TEMP)) - - self.sw_device.set(self.sw_device.KEY_OUTPUT_0, False) - time.sleep(DT_TOGGLE) - - -class testcase_synchronisation(testcase): - def __init__(self, sw_master, br_master, ct_master, *follower): - super().__init__() - self.sw_master = sw_master - self.br_master = br_master - self.ct_master = ct_master - self.follower = follower - self.__test_list__ = [] - if sw_master is not None: - self.__test_list__.append('test_power_on_off_sync') - if br_master is not None: - self.__test_list__.append('test_brightness_sync') - - def test_power_on_off_sync(self, test=TEST_FULL): - self.heading("Power On/ Off sychronisation test") - # - # set sw_master to slave state as precondition - f_state = self.follower[0].get(self.follower[0].KEY_OUTPUT_0) - self.sw_master.set(self.sw_master.KEY_OUTPUT_0, f_state) - time.sleep(DT_TOGGLE) - for i in range(0, 2): - self.sub_heading("State change of sw_master device") - # - self.sw_master.set(self.sw_master.KEY_OUTPUT_0, not f_state) - time.sleep(DT_TOGGLE) - f_state = not f_state - for fo in self.follower: - self.result("Follower device state after switching (%s)" % fo.topic, - f_state == fo.get(fo.KEY_OUTPUT_0)) - - def test_brightness_sync(self, test=TEST_FULL): - self.heading("Power On/ Off sychronisation test") - # - # set precondition - sw_state = self.sw_master.get(self.sw_master.KEY_OUTPUT_0) - self.sw_master.set(self.sw_master.KEY_OUTPUT_0, True) - time.sleep(DT_TOGGLE) - - target = self.follower[0].get(self.follower[0].KEY_BRIGHTNESS) - delta = 15 if target < 50 else -15 - for i in range(0, 2): - target = target + delta - self.sub_heading("State change of br_master device") - # - self.br_master.set(self.br_master.KEY_BRIGHTNESS, target) - time.sleep(DT_TOGGLE) - for fo in self.follower: - self.result("Follower device brightness after change (%s)" % fo.topic, - target == fo.get(fo.KEY_BRIGHTNESS)) - delta = -delta - - # reset changes of precondition - self.sw_master.set(self.sw_master.KEY_OUTPUT_0, sw_state) - time.sleep(DT_TOGGLE) - - -class testcase_heating(testcase): - def __init__(self, videv, valve): - self.__videv__ = videv - self.__valve__ = valve - self.__default_temperature__ = config.DEFAULT_TEMPERATURE.get(self.__valve__.topic) - self.__test_list__ = ["test_user_temperature_setpoint", "test_default_temperature", ] - - def test_user_temperature_setpoint(self, test=TEST_FULL): - self.heading("User temperature setpoint test (%s)" % self.__videv__.topic) - # - mtemp = round(self.__valve__.TEMP_RANGE[0] + (self.__valve__.TEMP_RANGE[1] - self.__valve__.TEMP_RANGE[0]) / 2, 1) - setp = self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT) - delta = 5 if setp < mtemp else -5 - - for i in range(0, 2): - self.sub_heading("Setpoint change by valve device") - # - self.__valve__.set(self.__valve__.KEY_TEMPERATURE_SETPOINT, setp + delta) - time.sleep(DT_TOGGLE) - self.result("Virtual device valve temperature after setting temperature by valve device", - setp + delta == self.__videv__.get(self.__videv__.KEY_VALVE_TEMPERATURE_SETPOINT)) - self.result("Virtual device user temperature after setting temperature by valve device", - setp + delta == self.__videv__.get(self.__videv__.KEY_USER_TEMPERATURE_SETPOINT)) - - self.sub_heading("Setpoint change by videv device") - # - self.__videv__.set(self.__videv__.KEY_USER_TEMPERATURE_SETPOINT, setp) - time.sleep(DT_TOGGLE) - self.result("Valve device temperature setpoint after setting temperature by videv device", - setp == self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT)) - self.result("Virtual device valve temperature after setting temperature by videv device", - setp == self.__videv__.get(self.__videv__.KEY_VALVE_TEMPERATURE_SETPOINT)) - - def test_default_temperature(self, test=TEST_FULL): - self.heading("Default temperature setpoint test (%s)" % self.__videv__.topic) - # - dtemp = config.DEFAULT_TEMPERATURE.get(self.__valve__.topic) - mtemp = round(self.__valve__.TEMP_RANGE[0] + (self.__valve__.TEMP_RANGE[1] - self.__valve__.TEMP_RANGE[0]) / 2, 1) - ptemp = dtemp + (5 if dtemp < mtemp else -5) - - self.sub_heading("Setting setpoint to a value unequal default as precondition") - self.__valve__.set(self.__valve__.KEY_TEMPERATURE_SETPOINT, ptemp) - time.sleep(DT_TOGGLE) - self.result("Valve device temperature setpoint after setting precondition temperature", - ptemp == self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT)) - - self.sub_heading("Triggering default temperature by videv device") - self.__videv__.set(self.__videv__.KEY_SET_DEFAULT_TEMPERATURE, None) - time.sleep(DT_TOGGLE) - self.result("Valve device temperature setpoint after setting default temperature", - dtemp == self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT)) - - def test_summer_mode(self, test=TEST_FULL): - pass - - def test_away_mode(self, test=TEST_FULL): - pass - - def test_boost_mode(self, test=TEST_FULL): - pass - if test == TEST_FULL: - # test boost timer - pass + tc(tcel) + simulation.devices.OUTPUT_ACTIVE = True diff --git a/tests/all.py b/tests/all.py new file mode 100644 index 0000000..b3e1f2e --- /dev/null +++ b/tests/all.py @@ -0,0 +1,139 @@ +import distro +import getpass +import inspect +import jinja2 +import json +import os +import platform +import report +from tests import test_collection +from tests.heating import testcase_heating +from tests.light import testcase_light +from tests.synchronisation import testcase_synchronisation +from unittest import jsonlog + +try: + from config import APP_NAME as ROOT_LOGGER_NAME +except ImportError: + ROOT_LOGGER_NAME = 'root' + + +class test_smarthome(object): + def __init__(self, rooms): + self.__init__tcl__() + # add testcases for switching devices + for name in rooms.getmembers(): + obj = rooms.getobjbyname(name) + if obj.__class__.__name__ == "videv_light": + common_name = '.'.join(name.split('.')[:-1]) + '.' + name.split('.')[-1][6:] + try: + li_device = rooms.getobjbyname(common_name + '_zigbee') if obj.enable_brightness or obj.enable_color_temp else None + except AttributeError: + li_device = rooms.getobjbyname(common_name + '_zigbee_1') if obj.enable_brightness or obj.enable_color_temp else None + try: + sw_device = rooms.getobjbyname(common_name) if obj.enable_state else None + except AttributeError: + # must be a device without switching device + sw_device = li_device + setattr(self, common_name.replace('.', '_'), testcase_light(self.tcl, obj, sw_device, li_device)) + # add testcases for heating devices + for name in rooms.getmembers(): + obj = rooms.getobjbyname(name) + if obj.__class__.__name__ == "videv_heating": + common_name = '.'.join(name.split('.')[:-1]) + '.' + name.split('.')[-1][6:] + heat_device = rooms.getobjbyname(common_name + '_valve') + setattr(self, common_name.replace('.', '_'), testcase_heating(self.tcl, obj, heat_device)) + # synchronisation + # gfw.dirk.amplifier with cd_player + self.gfw_dirk_cd_player_amplifier_sync = testcase_synchronisation( + self.tcl, + rooms.gfw.dirk.cd_player, None, None, + rooms.gfw.dirk.amplifier) + # gfw.floor.main_light_2 with gfw.floor.main_light_1 + self.gfw_floor_main_light_sync = testcase_synchronisation( + self.tcl, + rooms.gfw.floor.main_light, rooms.gfw.floor.videv_main_light, rooms.gfw.floor.videv_main_light, + rooms.gfw.floor.main_light_zigbee_1, rooms.gfw.floor.main_light_zigbee_2 + ) + # ffe.diningroom.floorlamp with ffe.dinigroom.main_light + self.ffe_diningroom_main_light_floor_lamp_sync = testcase_synchronisation( + self.tcl, + rooms.ffe.diningroom.main_light, None, None, + rooms.ffe.diningroom.floor_lamp) + # ffe.livingroom.floorlamp_[1-6] with ffe.livingroom.main_light + self.ffe_livingroom_main_light_floor_lamp_sync = testcase_synchronisation( + self.tcl, + rooms.ffe.livingroom.main_light, rooms.ffe.livingroom.videv_floor_lamp, rooms.ffe.livingroom.videv_floor_lamp, + *[getattr(rooms.ffe.livingroom, "floor_lamp_zigbee_%d" % i) for i in range(1, 7)] + ) + # add test collection + self.all = test_collection(self) + + def __init__tcl__(self): + system_info = {} + system_info[jsonlog.SYSI_ARCHITECTURE] = platform.architecture()[0] + system_info[jsonlog.SYSI_MACHINE] = platform.machine() + system_info[jsonlog.SYSI_HOSTNAME] = platform.node() + system_info[jsonlog.SYSI_DISTRIBUTION] = distro.name() + " " + distro.version() + " (" + distro.codename() + ")" + system_info[jsonlog.SYSI_SYSTEM] = platform.system() + system_info[jsonlog.SYSI_KERNEL] = platform.release() + ' (%s)' % platform.version() + system_info[jsonlog.SYSI_USERNAME] = getpass.getuser() + system_info[jsonlog.SYSI_PATH] = os.path.abspath(os.path.basename(__file__)) + + self.tcl = report.testSession(['__unittest__', 'unittest', ROOT_LOGGER_NAME]) + self.tcl[jsonlog.MAIN_KEY_SYSTEM_INFO] = system_info + + def __eval_tcl__(self): + path = os.path.abspath(os.path.join(os.path.basename(__file__), '..')) + + with open(os.path.join(path, "testresults", "testrun.json"), "w") as fh: + fh.write(json.dumps(self.tcl, indent=4)) + + template_path = os.path.join(path, 'templates') + template_filename = 'unittest.tex' + jenv = jinja2.Environment(loader=jinja2.FileSystemLoader(template_path)) + template = jenv.get_template(template_filename) + with open(os.path.join(path, "testresults", "testrun.tex"), "w") as fh: + fh.write(template.render(data=self.tcl, details=False)) + with open(os.path.join(path, "testresults", "testrun_full.tex"), "w") as fh: + fh.write(template.render(data=self.tcl, details=True)) + + def __del__(self): + try: + self.__eval_tcl__() + except: + pass + + def getmembers(self, prefix=''): + rv = [] + for name, obj in inspect.getmembers(self): + if prefix: + full_name = prefix + '.' + name + else: + full_name = name + if not name.startswith('_'): + try: + if obj.__class__.__bases__[0].__name__ == "testcase" or obj.__class__.__name__ == "test_collection": + rv.append(full_name) + else: + rv.extend(obj.getmembers(full_name)) + except AttributeError: + pass + return rv + + def getobjbyname(self, name): + if name.startswith("test."): + name = name[5:] + obj = self + for subname in name.split('.'): + obj = getattr(obj, subname) + return obj + + def command(self, full_command): + try: + parameter = " " + full_command.split(' ')[1] + except IndexError: + parameter = "" + command = full_command.split(' ')[0].split('.')[-1] + parameter + device_name = '.'.join(full_command.split(' ')[0].split('.')[:-1]) + self.getobjbyname(device_name).command(command) diff --git a/tests/heating.py b/tests/heating.py new file mode 100644 index 0000000..09f1f78 --- /dev/null +++ b/tests/heating.py @@ -0,0 +1,129 @@ +import config +import report +from tests import testcase, DT_TOGGLE +import time +from unittest.test import equivalency_chk, greater_chk + + +class testcase_heating(testcase): + def __init__(self, tcl, videv, valve): + self.tcl = tcl + self.__videv__ = videv + self.__valve__ = valve + self.__default_temperature__ = config.DEFAULT_TEMPERATURE.get(self.__valve__.topic) + self.__test_list__ = ["test_user_temperature_setpoint", "test_default_temperature", "test_summer_mode", "test_away_mode", "test_boost_mode"] + + def test_user_temperature_setpoint(self, tcel=report.TCEL_FULL): + self.tcl.testCase("User temperature setpoint test for device and virtual device: %s" % + self.__valve__.topic, tcel, self.__test_user_temperature_setpoint__, tcel) + + def __test_user_temperature_setpoint__(self, tLogger, tcel): + mtemp = round(self.__valve__.TEMP_RANGE[0] + (self.__valve__.TEMP_RANGE[1] - self.__valve__.TEMP_RANGE[0]) / 2, 1) + setp = self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT) + delta = 5 if setp < mtemp else -5 + + for i in range(0, 2): + self.__valve__.set(self.__valve__.KEY_TEMPERATURE_SETPOINT, setp + delta) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing valve temperature setpoint to '%.1f'", setp + delta) + equivalency_chk(self.__videv__.get(self.__videv__.KEY_VALVE_TEMPERATURE_SETPOINT), + setp + delta, tLogger, "Virtual device valve temperature") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_USER_TEMPERATURE_SETPOINT), + setp + delta, tLogger, "Virtual device user temperature") + # + self.__videv__.set(self.__videv__.KEY_USER_TEMPERATURE_SETPOINT, setp) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing videv user temperature setpoint to '%.1f'", setp) + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT), setp, tLogger, "Valve device temperature setpoint") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_VALVE_TEMPERATURE_SETPOINT), setp, tLogger, "Virtual device valve temperature") + + def test_default_temperature(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Default temperature test for device and virtual device: %s" % + self.__valve__.topic, tcel, self.__test_default_temperature__, tcel) + + def __test_default_temperature__(self, tLogger, tcel): + dtemp = config.DEFAULT_TEMPERATURE.get(self.__valve__.topic) + mtemp = round(self.__valve__.TEMP_RANGE[0] + (self.__valve__.TEMP_RANGE[1] - self.__valve__.TEMP_RANGE[0]) / 2, 1) + ptemp = dtemp + (5 if dtemp < mtemp else -5) + + self.__valve__.set(self.__valve__.KEY_TEMPERATURE_SETPOINT, ptemp) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions (Valve setpoint to %.1f)", ptemp) + + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT) != dtemp, + True, tLogger, "Valve temperature setpoint (is not default temperature)") + self.__videv__.set(self.__videv__.KEY_SET_DEFAULT_TEMPERATURE, None) + time.sleep(DT_TOGGLE) + tLogger.debug("Triggering set to default temperature (%.1f)", dtemp) + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT), dtemp, tLogger, "Valve temperature setpoint") + + def test_summer_mode(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Summer mode test: %s" % self.__valve__.topic, tcel, self.__test_summer_mode__, tcel) + + def __test_summer_mode__(self, tLogger, tcel): + self.__videv__.set(self.__videv__.KEY_SET_DEFAULT_TEMPERATURE, None) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions (Default setpoint)") + + vtemp = self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT) + + equivalency_chk(self.__videv__.get(self.__videv__.KEY_SUMMER_MODE), False, tLogger, "Summer mode") + self.__videv__.set(self.__videv__.KEY_SUMMER_MODE, True) + time.sleep(DT_TOGGLE) + tLogger.debug("Activating summer mode") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_SUMMER_MODE), True, tLogger, "Summer mode") + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT), 5, tLogger, "Temperature setpoint") + + self.__videv__.set(self.__videv__.KEY_SUMMER_MODE, False) + time.sleep(DT_TOGGLE) + tLogger.debug("Deactivating summer mode") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_SUMMER_MODE), False, tLogger, "Summer mode") + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT), vtemp, tLogger, "Temperature setpoint") + + def test_away_mode(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Away mode test: %s" % self.__valve__.topic, tcel, self.__test_away_mode__, tcel) + + def __test_away_mode__(self, tLogger, tcel): + self.__videv__.set(self.__videv__.KEY_SET_DEFAULT_TEMPERATURE, None) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions (Default setpoint)") + + vtemp = self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT) + + equivalency_chk(self.__videv__.get(self.__videv__.KEY_AWAY_MODE), False, tLogger, "Away mode") + self.__videv__.set(self.__videv__.KEY_AWAY_MODE, True) + time.sleep(DT_TOGGLE) + tLogger.debug("Activating away mode") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_AWAY_MODE), True, tLogger, "Away mode") + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT), vtemp - 5, tLogger, "Temperature setpoint") + + self.__videv__.set(self.__videv__.KEY_AWAY_MODE, False) + time.sleep(DT_TOGGLE) + tLogger.debug("Deactivating away mode") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_AWAY_MODE), False, tLogger, "Away mode") + equivalency_chk(self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT), vtemp, tLogger, "Temperature setpoint") + + def test_boost_mode(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Boost mode test: %s" % self.__valve__.topic, tcel, self.__test_boost_mode__, tcel) + + def __test_boost_mode__(self, tLogger, tcel): + self.__videv__.set(self.__videv__.KEY_SET_DEFAULT_TEMPERATURE, None) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions (Default setpoint)") + + vtemp = self.__valve__.get(self.__valve__.KEY_TEMPERATURE_SETPOINT) + + equivalency_chk(self.__videv__.get(self.__videv__.KEY_BOOST_TIMER), 0, tLogger, "Boost timer") + self.__videv__.set(self.__videv__.KEY_START_BOOST, None) + time.sleep(DT_TOGGLE) + tLogger.debug("Activating boost mode") + greater_chk(self.__videv__.get(self.__videv__.KEY_BOOST_TIMER), 0, tLogger, "Boost timer") + + self.__videv__.set(self.__videv__.KEY_SET_DEFAULT_TEMPERATURE, None) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting postconditions (Default setpoint)") + equivalency_chk(self.__videv__.get(self.__videv__.KEY_BOOST_TIMER), 0, tLogger, "Boost timer") + + if tcel == report.TCEL_FULL: + # test boost timer + pass diff --git a/tests/light.py b/tests/light.py new file mode 100644 index 0000000..96b5653 --- /dev/null +++ b/tests/light.py @@ -0,0 +1,92 @@ +import report +from tests import testcase, DT_TOGGLE +import time +from unittest.test import equivalency_chk + + +class testcase_light(testcase): + def __init__(self, tcl, videv, sw_device, li_device): + self.tcl = tcl + self.videv = videv + self.sw_device = sw_device + self.li_device = li_device + self.__test_list__ = [] + if self.videv.enable_state: + self.__test_list__.append('test_power_on_off') + if self.videv.enable_brightness: + self.__test_list__.append('test_brightness') + if self.videv.enable_color_temp: + self.__test_list__.append('test_color_temp') + + def test_power_on_off(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Power On/ Off test for device and virtual device: %s" % self.sw_device.topic, tcel, self.__test_power_on_off__, tcel) + + def __test_power_on_off__(self, tLogger, tcel): + sw_state = self.sw_device.get(self.sw_device.KEY_OUTPUT_0) + + for i in range(0, 2): + equivalency_chk(self.videv.get(self.videv.KEY_OUTPUT_0), sw_state, tLogger, "Virtual device state") + self.sw_device.set(self.sw_device.KEY_OUTPUT_0, not sw_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing switching device state to '%s'", not sw_state) + equivalency_chk(self.videv.get(self.videv.KEY_OUTPUT_0), not sw_state, tLogger, "Virtual device state") + # + equivalency_chk(self.sw_device.get(self.sw_device.KEY_OUTPUT_0), not sw_state, tLogger, "Switching device state") + self.videv.set(self.videv.KEY_OUTPUT_0, sw_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing virtual device state to '%s'", sw_state) + equivalency_chk(self.sw_device.get(self.sw_device.KEY_OUTPUT_0), sw_state, tLogger, "Switching device state") + + def test_brightness(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Brightness test for device and virtual device: %s" % self.li_device.topic, tcel, self.__test_brightness__, tcel) + + def __test_brightness__(self, tLogger, tcel): + br_state = self.li_device.get(self.li_device.KEY_BRIGHTNESS) + delta = -15 if br_state > 50 else 15 + self.sw_device.set(self.sw_device.KEY_OUTPUT_0, True) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions (Power on)") + + for i in range(0, 2): + equivalency_chk(self.videv.get(self.videv.KEY_BRIGHTNESS), br_state, tLogger, "Virtual device brightness") + self.li_device.set(self.li_device.KEY_BRIGHTNESS, br_state + delta) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing light device brightness to '%d'", br_state + delta) + equivalency_chk(self.videv.get(self.videv.KEY_BRIGHTNESS), br_state + delta, tLogger, "Virtual device brightness") + # + equivalency_chk(self.li_device.get(self.li_device.KEY_BRIGHTNESS), br_state + delta, tLogger, "Light device brightness") + self.videv.set(self.videv.KEY_BRIGHTNESS, br_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing virtual device brightness to '%d'", br_state) + equivalency_chk(self.li_device.get(self.li_device.KEY_BRIGHTNESS), br_state, tLogger, "Light device brightness") + # + self.sw_device.set(self.sw_device.KEY_OUTPUT_0, False) + time.sleep(DT_TOGGLE) + tLogger.debug("Resetting precondition (Power off)") + + def test_color_temp(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Color temperature test for device and virtual device: %s" % self.li_device.topic, tcel, self.__test_color_temp__, tcel) + + def __test_color_temp__(self, tLogger, tcel): + ct_state = self.li_device.get(self.li_device.KEY_COLOR_TEMP) + delta = -3 if ct_state > 5 else 3 + self.sw_device.set(self.sw_device.KEY_OUTPUT_0, True) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions (Power on)") + + for i in range(0, 2): + equivalency_chk(self.videv.get(self.videv.KEY_COLOR_TEMP), ct_state, tLogger, "Virtual device color temperature") + self.li_device.set(self.li_device.KEY_COLOR_TEMP, ct_state + delta) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing light device color temperature to '%d'", ct_state) + equivalency_chk(self.videv.get(self.videv.KEY_COLOR_TEMP), ct_state + delta, tLogger, "Virtual device color temperature") + # + equivalency_chk(self.li_device.get(self.li_device.KEY_COLOR_TEMP), ct_state + delta, tLogger, "Light device brightness") + self.videv.set(self.videv.KEY_COLOR_TEMP, ct_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing virtual device color temperature to '%d'", ct_state) + equivalency_chk(self.li_device.get(self.li_device.KEY_COLOR_TEMP), ct_state, tLogger, "Light device brightness") + # + self.sw_device.set(self.sw_device.KEY_OUTPUT_0, False) + time.sleep(DT_TOGGLE) + tLogger.debug("Resetting precondition (Power off)") diff --git a/tests/synchronisation.py b/tests/synchronisation.py new file mode 100644 index 0000000..f436110 --- /dev/null +++ b/tests/synchronisation.py @@ -0,0 +1,90 @@ +import report +from tests import testcase, DT_TOGGLE +import time +from unittest.test import equivalency_chk + + +class testcase_synchronisation(testcase): + def __init__(self, tcl, sw_master, br_master, ct_master, *follower): + super().__init__() + self.tcl = tcl + self.sw_master = sw_master + self.br_master = br_master + self.ct_master = ct_master + self.follower = follower + # + self.__test_list__ = [] + if sw_master is not None: + self.__test_list__.append('test_power_on_off_sync') + if br_master is not None: + self.__test_list__.append('test_brightness_sync') + if ct_master is not None: + self.__test_list__.append('test_color_temp_sync') + + def test_power_on_off_sync(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Power On/ Off synchronisation test: %s" % self.sw_master.topic, tcel, self.__test_power_on_off_sync__, tcel) + + def __test_power_on_off_sync__(self, tLogger, tcel): + f_state = self.follower[0].get(self.follower[0].KEY_OUTPUT_0) + self.sw_master.set(self.sw_master.KEY_OUTPUT_0, f_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions for master device '%s'", f_state) + + for i in range(0, 2): + f_state = not f_state + self.sw_master.set(self.sw_master.KEY_OUTPUT_0, f_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing master device state to '%s'", f_state) + + for fo in self.follower: + equivalency_chk(fo.get(fo.KEY_OUTPUT_0), f_state, tLogger, "Follower device (%s) state" % fo.topic) + + def test_brightness_sync(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Brightness synchronisation test: %s" % self.br_master.topic, tcel, self.__test_brightness_sync__, tcel) + + def __test_brightness_sync__(self, tLogger, tcel): + sw_state = self.sw_master.get(self.sw_master.KEY_OUTPUT_0) + self.sw_master.set(self.sw_master.KEY_OUTPUT_0, True) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions for master device '%s' (Power on)", True) + + target = self.follower[0].get(self.follower[0].KEY_BRIGHTNESS) + delta = 15 if target < 50 else -15 + for i in range(0, 2): + target = target + delta + self.br_master.set(self.br_master.KEY_BRIGHTNESS, target) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing master device brightness to '%d'", target) + for fo in self.follower: + equivalency_chk(fo.get(fo.KEY_BRIGHTNESS), target, tLogger, "Follower device (%s) brightness" % fo.topic) + delta = -delta + + # reset changes of precondition + self.sw_master.set(self.sw_master.KEY_OUTPUT_0, sw_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Resetting preconditions for master device '%s' (Power off)", sw_state) + + def test_color_temp_sync(self, tcel=report.TCEL_FULL): + self.tcl.testCase("Color temperature synchronisation test: %s" % self.ct_master.topic, tcel, self.__test_color_temp_sync__, tcel) + + def __test_color_temp_sync__(self, tLogger, tcel): + sw_state = self.sw_master.get(self.sw_master.KEY_OUTPUT_0) + self.sw_master.set(self.sw_master.KEY_OUTPUT_0, True) + time.sleep(DT_TOGGLE) + tLogger.debug("Setting preconditions for master device '%s' (Power on)", True) + + target = self.follower[0].get(self.follower[0].KEY_COLOR_TEMP) + delta = 3 if target < 5 else -3 + for i in range(0, 2): + target = target + delta + self.ct_master.set(self.br_master.KEY_COLOR_TEMP, target) + time.sleep(DT_TOGGLE) + tLogger.debug("Changing master device color temperature to '%d'", target) + for fo in self.follower: + equivalency_chk(fo.get(fo.KEY_COLOR_TEMP), target, tLogger, "Follower device (%s) color temperature" % fo.topic) + delta = -delta + + # reset changes of precondition + self.sw_master.set(self.sw_master.KEY_OUTPUT_0, sw_state) + time.sleep(DT_TOGGLE) + tLogger.debug("Resetting preconditions for master device '%s' (Power off)", sw_state) diff --git a/unittest b/unittest new file mode 160000 index 0000000..a73c8f8 --- /dev/null +++ b/unittest @@ -0,0 +1 @@ +Subproject commit a73c8f8c3523df17eeddad6297d1454c16fc4552