Dei siste dagane har eg satt opp Grafana og lagde nokre ganske kule dashboards for å ha bedre kontroll på energi og klima. Her er det hovedsaklig sensordata frå Netatmo og Tibber via playgrounds men om de ser nøye etter er også pådraget på ventilasjonsanlegget indikert med grafikk, og det er mulig å sjå korleis CO2 nivået responderer på dette. (Ventilasjonsanlegget er igjen styrt via hjemmemodus via Smart implant.)
[Grafana]
{
"Id": "mL0ytxCIUFGfNsA",
"ClassId": "mL0ytxCIUFGfNsA",
"Author": "",
"Version": 0,
"CreatedAt": "2022-12-03T00:32:32.512217442+01:00",
"UpdatedAt": "2023-01-01T21:43:38.939565383+01:00",
"Name": "Villavent boost",
"Group": "klima",
"Description": "",
"Nodes": [
{
"Id": "1",
"Type": "trigger",
"Label": "soverom evt.sensor.report",
"SuccessTransition": "2",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:evt/rt:dev/rn:netatmo/ad:1/sv:sensor_co2/ad:0300000cd376",
"Service": "sensor_co2",
"ServiceInterface": "evt.sensor.report",
"Config": {
"ConnectorID": "",
"InputVariableType": "",
"IsValueFilterEnabled": false,
"LookupServiceNameAndLocation": false,
"PropFilterName": "",
"PropFilterValue": "",
"RegisterAsVirtualService": false,
"Timeout": 0,
"ValueFilter": {
"Value": null,
"ValueType": "float"
},
"ValueJPath": "",
"ValueJPathResultType": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": null
},
"Ui": {
"nodeType": "",
"x": 209,
"y": 182
},
"TypeAlias": "Trigger"
},
{
"Id": "2",
"Type": "transform",
"Label": "soverom_margin = co2_limit-input",
"SuccessTransition": "3",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": "co2_limit-input",
"IsRVariableGlobal": false,
"IsTargetVariableGlobal": false,
"IsTargetVariableInMemory": true,
"LVariableName": "",
"RValue": {
"Value": 0,
"ValueType": "int"
},
"RVariableName": "",
"Rtype": "var",
"TargetVariableName": "soverom_margin",
"TargetVariableType": "float",
"Template": "",
"TransformType": "calc",
"ValueMapping": [],
"XPathMapping": []
},
"Ui": {
"nodeType": "",
"x": 213,
"y": 348
},
"TypeAlias": "Transform"
},
{
"Id": "3",
"Type": "if",
"Label": "soverom_margin < 0",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": [
{
"BooleanOperator": "",
"LeftVariableIsGlobal": false,
"LeftVariableName": "soverom_margin",
"Operand": "lt",
"RightVariable": {
"Value": 0,
"ValueType": "float"
}
}
],
"FalseTransition": "11",
"TrueTransition": "4"
},
"Ui": {
"nodeType": "",
"x": 228,
"y": 531
},
"TypeAlias": "If condition"
},
{
"Id": "4",
"Type": "action",
"Label": "DI2 = true",
"SuccessTransition": "15",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_bin_switch/ad:48_5",
"Service": "out_bin_switch",
"ServiceInterface": "cmd.binary.set",
"Config": {
"DefaultValue": {
"Value": true,
"ValueType": "bool"
},
"IsVariableGlobal": false,
"Props": {},
"RegisterAsVirtualService": false,
"ResponseToTopic": "",
"VariableName": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": {}
},
"Ui": {
"nodeType": "",
"x": 432,
"y": 832
},
"TypeAlias": "Action"
},
{
"Id": "7",
"Type": "action",
"Label": "DI2 = false",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_bin_switch/ad:48_5",
"Service": "out_bin_switch",
"ServiceInterface": "cmd.binary.set",
"Config": {
"DefaultValue": {
"Value": false,
"ValueType": "bool"
},
"IsVariableGlobal": false,
"Props": {},
"RegisterAsVirtualService": false,
"ResponseToTopic": "",
"VariableName": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": {}
},
"Ui": {
"nodeType": "",
"x": 862,
"y": 1053
},
"TypeAlias": "Action"
},
{
"Id": "8",
"Type": "trigger",
"Label": "barnerom evt.sensor.report",
"SuccessTransition": "9",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:evt/rt:dev/rn:netatmo/ad:1/sv:sensor_co2/ad:0300000b91c2",
"Service": "sensor_co2",
"ServiceInterface": "evt.sensor.report",
"Config": {
"ConnectorID": "",
"InputVariableType": "",
"IsValueFilterEnabled": false,
"LookupServiceNameAndLocation": false,
"PropFilterName": "",
"PropFilterValue": "",
"RegisterAsVirtualService": false,
"Timeout": 0,
"ValueFilter": {
"Value": null,
"ValueType": "float"
},
"ValueJPath": "",
"ValueJPathResultType": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": null
},
"Ui": {
"nodeType": "",
"x": 511,
"y": 186
},
"TypeAlias": "Trigger"
},
{
"Id": "9",
"Type": "transform",
"Label": "barnerom_margin = co2_limit-input",
"SuccessTransition": "10",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": "co2_limit-input",
"IsRVariableGlobal": false,
"IsTargetVariableGlobal": false,
"IsTargetVariableInMemory": true,
"LVariableName": "",
"RValue": {
"Value": 0,
"ValueType": "int"
},
"RVariableName": "",
"Rtype": "var",
"TargetVariableName": "barnerom_margin",
"TargetVariableType": "float",
"Template": "",
"TransformType": "calc",
"ValueMapping": [],
"XPathMapping": []
},
"Ui": {
"nodeType": "",
"x": 508,
"y": 368
},
"TypeAlias": "Transform"
},
{
"Id": "10",
"Type": "if",
"Label": "barnerom_margin < 0",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": [
{
"BooleanOperator": "",
"LeftVariableIsGlobal": false,
"LeftVariableName": "barnerom_margin",
"Operand": "lt",
"RightVariable": {
"Value": 0,
"ValueType": "float"
}
}
],
"FalseTransition": "11",
"TrueTransition": "4"
},
"Ui": {
"nodeType": "",
"x": 499,
"y": 535
},
"TypeAlias": "If condition"
},
{
"Id": "11",
"Type": "if",
"Label": "max(*_margin) > 200",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": [
{
"BooleanOperator": "and",
"LeftVariableIsGlobal": false,
"LeftVariableName": "soverom_margin",
"Operand": "gt",
"RightVariable": {
"Value": 200,
"ValueType": "float"
}
},
{
"BooleanOperator": "and",
"LeftVariableIsGlobal": false,
"LeftVariableName": "barnerom_margin",
"Operand": "gt",
"RightVariable": {
"Value": 200,
"ValueType": "float"
}
},
{
"BooleanOperator": "and",
"LeftVariableIsGlobal": false,
"LeftVariableName": "stue_margin",
"Operand": "gt",
"RightVariable": {
"Value": 200,
"ValueType": "float"
}
},
{
"BooleanOperator": "",
"LeftVariableIsGlobal": false,
"LeftVariableName": "kontor_margin",
"Operand": "gt",
"RightVariable": {
"Value": 200,
"ValueType": "float"
}
}
],
"FalseTransition": "",
"TrueTransition": "7"
},
"Ui": {
"nodeType": "",
"x": 870,
"y": 857
},
"TypeAlias": "If condition"
},
{
"Id": "12",
"Type": "trigger",
"Label": "stue evt.sensor.report",
"SuccessTransition": "13",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:evt/rt:dev/rn:netatmo/ad:1/sv:sensor_co2/ad:70ee507fd620",
"Service": "sensor_co2",
"ServiceInterface": "evt.sensor.report",
"Config": {
"ConnectorID": "",
"InputVariableType": "",
"IsValueFilterEnabled": false,
"LookupServiceNameAndLocation": false,
"PropFilterName": "",
"PropFilterValue": "",
"RegisterAsVirtualService": false,
"Timeout": 0,
"ValueFilter": {
"Value": null,
"ValueType": "float"
},
"ValueJPath": "",
"ValueJPathResultType": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": null
},
"Ui": {
"nodeType": "",
"x": 815,
"y": 188
},
"TypeAlias": "Trigger"
},
{
"Id": "13",
"Type": "transform",
"Label": "stue_margin = co2_limit-input",
"SuccessTransition": "14",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": "co2_limit-input",
"IsRVariableGlobal": false,
"IsTargetVariableGlobal": false,
"IsTargetVariableInMemory": true,
"LVariableName": "",
"RValue": {
"Value": 0,
"ValueType": "int"
},
"RVariableName": "",
"Rtype": "var",
"TargetVariableName": "stue_margin",
"TargetVariableType": "float",
"Template": "",
"TransformType": "calc",
"ValueMapping": [],
"XPathMapping": []
},
"Ui": {
"nodeType": "",
"x": 823,
"y": 378
},
"TypeAlias": "Transform"
},
{
"Id": "14",
"Type": "if",
"Label": "stue_margin < 0",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": [
{
"BooleanOperator": "",
"LeftVariableIsGlobal": false,
"LeftVariableName": "stue_margin",
"Operand": "lt",
"RightVariable": {
"Value": 0,
"ValueType": "float"
}
}
],
"FalseTransition": "11",
"TrueTransition": "4"
},
"Ui": {
"nodeType": "",
"x": 817,
"y": 554
},
"TypeAlias": "If condition"
},
{
"Id": "15",
"Type": "rate_limit",
"Label": "Maximum 1 per hour",
"SuccessTransition": "16",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Action": "skip",
"Limit": 1,
"TimeInterval": 3600
},
"Ui": {
"nodeType": "",
"x": 420,
"y": 1007
},
"TypeAlias": "Rate limit"
},
{
"Id": "16",
"Type": "action",
"Label": "Publish timeline",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:cmd/rt:app/rn:time_owl/ad:1",
"Service": "time_owl",
"ServiceInterface": "cmd.timeline.set",
"Config": {
"DefaultValue": {
"Value": {
"message_en": "Ventilation boosted to increase air quality. ",
"message_no": "-",
"sender": "flow"
},
"ValueType": "str_map"
},
"IsVariableGlobal": false,
"Props": {},
"RegisterAsVirtualService": false,
"VariableName": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": {}
},
"Ui": {
"nodeType": "timeline_action",
"x": 421,
"y": 1201
},
"TypeAlias": "Timeline"
},
{
"Id": "17",
"Type": "trigger",
"Label": "kontor evt.sensor.report",
"SuccessTransition": "18",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "pt:j1/mt:evt/rt:dev/rn:netatmo/ad:1/sv:sensor_co2/ad:0300000cb8ba",
"Service": "sensor_co2",
"ServiceInterface": "evt.sensor.report",
"Config": {
"ConnectorID": "",
"InputVariableType": "",
"IsValueFilterEnabled": false,
"LookupServiceNameAndLocation": false,
"PropFilterName": "",
"PropFilterValue": "",
"RegisterAsVirtualService": false,
"Timeout": 0,
"ValueFilter": {
"Value": null,
"ValueType": "float"
},
"ValueJPath": "",
"ValueJPathResultType": "",
"VirtualServiceGroup": "",
"VirtualServiceProps": null
},
"Ui": {
"nodeType": "",
"x": 1126,
"y": 184
},
"TypeAlias": "Trigger"
},
{
"Id": "18",
"Type": "transform",
"Label": "kontor_margin = co2_limit-input",
"SuccessTransition": "19",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": "co2_limit-input",
"IsRVariableGlobal": false,
"IsTargetVariableGlobal": false,
"IsTargetVariableInMemory": true,
"LVariableName": "",
"RValue": {
"Value": 0,
"ValueType": "int"
},
"RVariableName": "",
"Rtype": "var",
"TargetVariableName": "kontor_margin",
"TargetVariableType": "float",
"Template": "",
"TransformType": "calc",
"ValueMapping": [],
"XPathMapping": []
},
"Ui": {
"nodeType": "",
"x": 1107,
"y": 383
},
"TypeAlias": "Transform"
},
{
"Id": "19",
"Type": "if",
"Label": "kontor_margin < 0",
"SuccessTransition": "",
"TimeoutTransition": "",
"ErrorTransition": "",
"Address": "",
"Service": "",
"ServiceInterface": "",
"Config": {
"Expression": [
{
"BooleanOperator": "",
"LeftVariableIsGlobal": false,
"LeftVariableName": "kontor_margin",
"Operand": "lt",
"RightVariable": {
"Value": 0,
"ValueType": "float"
}
}
],
"FalseTransition": "11",
"TrueTransition": "4"
},
"Ui": {
"nodeType": "",
"x": 1113,
"y": 566
},
"TypeAlias": "If condition"
}
],
"Settings": null,
"IsDisabled": false,
"IsDefault": false,
"ParallelExecution": "parallel"
}
Eg har foreløpig satt øvre settpunkt for digital inngang 2 (høy-høy) ved 1000ppm og nedre ved 800ppm. Det fungerar kjempebra, så framover kjem eg nok til å eksperimentera vidare med settpunkta og nedjustera normal viftehastigheit, med formål å redusera energiforbruket og bedre inneklima i form av økt relativ luftfukt (og evt utvida logikken for å hensynta sistnemnde).