Behov styring av ventilasjon

Jeg ønsker å behov styre ventilasjon utifra CO2 verdier målt av netatmo.
Co2 over 700 i ett av to rom starter høyere hastighet.
Co2 under 550 i begge rom stopper høyere hastighet.

Noen som har prøvd det før i futurehome ?
Da er det thingsplex som gjelder ?
Gjorde det før med bra resultat i smartthings. (Men så forsvant støtte for netatmo… der )

Når ventilasjonsanlegget er på går det på lav hastighet hvis ikke annet er valgt.
Ventilasjonsanlegget har 3 hastigher lav/normal/max
Dette kan en endre via potensiallfrie rele.
Dette har jeg gjort slik at en smartplugg slår å ett lite rele for å velge normal hastighet.
En annen smartplugg slår på ett lite rele som starter max hastighet.
Max hastighet brukes stort sett ved dusjing, for å få ut fukt.
Anlegget har kryssveksler, så ikke så høy virkningsgrad.
Dermed går mye varme ut om en kjører høyere hastighet enn nødvendig.

{
  "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).

Kjører for øvrig villaventen på normal til vanlig og justerer ned til lav-lav (DI3) ved borte/feriemodus, samt høy-lav (DI1) ifbm. peisfyring. På villavent har DI1 har prioritet, deretter DI2, DI3 og til slutt normal.