Seite 1 von 1

Rules: Heizungssteuerung Temperatur

Verfasst: 29. Apr 2021 20:33
von Oldman
openHAB 3.0.2


ich komme von der Homematic und habe wahrscheinlich einen Denkfehler.
Ich möchte auf Grund eines Thermostatwertes z.b. kleiner 20° C das Heizventil starten.
In Rules bei "When" starte ich "Add Trigger", wähle das Thing TempBar. (das ist ein Homematic Thermometer).
Jetzt kommt mein Problem: Bei Status changed kann ich nur from to auswählen.
Wie kann ich sagen: Wenn aktuelle Temperatur <20° dann Schalte die Heizung ein?

Wo habe ich einen Denkfehler.

Re: Rules: Heizungssteuerung Temperatur

Verfasst: 29. Apr 2021 21:41
von udo1toni
Du wählst weder from noch to. Stattdessen nutzt Du einfach nur changed. Damit triggert die Rule schon mal bei jeder Änderung.
Nun hast Du zwei Möglichkeiten. Entweder, Du verwendest zwei Rules, in der einen Rule schaltest Du ein, in der anderen aus, dann setzt Du zusätzlich noch ein "but only if" ein, dort definierst Du für die Einschaltrule das kleiner als 20 und für die Ausschaltrule das größer als 21 (z.B.)

Nachteil: Du brauchst jeweils zwei Rules.

Alternativ startest Du ein Script, in dem Du dann entscheidest, ob die Keizung ein-, aus-, oder überhaupt nicht geschaltet wird.

Re: Rules: Heizungssteuerung Temperatur

Verfasst: 1. Mai 2021 16:47
von Oldman
Danke schon mal für den Tipp.
Jetzt kommt das nächste Problem: Wie startet die Regel automatisch.
Ich habe folgende Rule, die auf Status IDLE steht und wenn ich auf den Pfeil nach rechts klicke läuft das Script einwandfrei ab.
When
When Thermometer chenged

Then
execute a given script
if item state item Thermometer < "23"
do send command "ON" to item TestschalterOSRAM

Re: Rules: Heizungssteuerung Temperatur

Verfasst: 1. Mai 2021 23:51
von udo1toni
Zeig mal bitte den Code (Copy&Paste von Text ist besser, als etwas zu tippen, was entfernt etwas mit der Realität zu tun hat).

Re: Rules: Heizungssteuerung Temperatur

Verfasst: 2. Mai 2021 17:23
von Oldman
Hallo und einen schönen Nachmittag

Ich habe den Code mit "Design" erstellt und hier ist der erzeugte Code:

triggers:
- id: "3"
configuration:
itemName: Temperature2TZ2000a476raq2
type: core.ItemStateChangeTrigger
conditions:
- inputs: {}
id: "4"
configuration:
itemName: TestschalterOSRAM_OnOff
state: OFF
operator: <
type: core.ItemStateCondition
actions:
- inputs: {}
id: "2"
configuration:
blockSource: <xml xmlns="https://developers.google.com/blockly/xml"><block
type="controls_if" id="GcWQevSU-Mu6=4cfJ)T*" x="279" y="268"><value
name="IF0"><block type="logic_compare" id="xx+jSrQ/Y_JK$7711hId"><field
name="OP">LT</field><value name="A"><block type="oh_getitem_state"
id="H-J]q/xTO5jbn9}YIxvY"><value name="itemName"><shadow type="oh_item"
id="A/qfm[iWiG?ZqqzqR;5+"><field
name="itemName">Temperature2TZ2000a476raq2_Temperature</field></shadow></value></block></value><value
name="B"><block type="text" id="c=DM0Vy75z[]~b}9@Y(0"><field
name="TEXT">23</field></block></value></block></value><statement
name="DO0"><block type="oh_event" id="[ZoyoR3F_}s~j[LqIl#e"><field
name="eventType">sendCommand</field><value name="value"><shadow
type="text" id="NBl;V9~i[|(HI30IPMP?"><field
name="TEXT">ON</field></shadow></value><value name="itemName"><shadow
type="oh_item" id="Ya229n?.o91wwzvXH=P4"><field
name="itemName">TestschalterOSRAM</field></shadow></value></block></statement></block></xml>
type: application/javascript
script: >
if
(itemRegistry.getItem('Temperature2TZ2000a476raq2_Temperature').getState()
< '23') {
events.sendCommand('TestschalterOSRAM', 'ON');
}
type: script.ScriptAction
- inputs: {}
id: "1"
configuration:
blockSource: <xml xmlns="https://developers.google.com/blockly/xml"><block
type="controls_if" id="I=x(1OjRujp#kdZ5xr+;" x="204" y="65"><value
name="IF0"><block type="logic_compare" id="riVMNBd@-+j^cmr}@l,c"><field
name="OP">GT</field><value name="A"><block type="oh_getitem_state"
id="Dm7K#N#14UnkqOR#Tj^)"><value name="itemName"><shadow type="oh_item"
id="YL?8[^}j8!R6v+}y/Xg^"><field
name="itemName">Temperature2TZ2000a476raq2_Temperature</field></shadow></value></block></value><value
name="B"><block type="text" id="V,e;L9yU(`vPDnk@0g~U"><field
name="TEXT">23</field></block></value></block></value><statement
name="DO0"><block type="oh_event" id="9F09EnV~6KT0TkkULPT("><field
name="eventType">sendCommand</field><value name="value"><shadow
type="text" id="2zGu+%S;GxM8yY0t8}`/"><field
name="TEXT">OFF</field></shadow></value><value name="itemName"><shadow
type="oh_item" id="t^v]%8o6J}Czk63XJ~5n"><field
name="itemName">TestschalterOSRAM</field></shadow></value></block></statement></block></xml>
type: application/javascript
script: >
if
(itemRegistry.getItem('Temperature2TZ2000a476raq2_Temperature').getState()
> '23') {
events.sendCommand('TestschalterOSRAM', 'OFF');
}
type: script.ScriptAction


------
Servus
Dieter

Re: Rules: Heizungssteuerung Temperatur

Verfasst: 3. Mai 2021 00:29
von udo1toni
Du hättest den Code besser in Code Tags gefasst. Der Code wurde von der Forensoftware falsch umgebrochen. Korrekt wird der Code so aussehen:

Code: Alles auswählen

triggers:
- id: "3"
  configuration:
  itemName: Temperature2TZ2000a476raq2
  type: core.ItemStateChangeTrigger
  conditions:
  - inputs: {}
  id: "4"
    configuration:
    itemName: TestschalterOSRAM_OnOff
    state: OFF
    operator: <
    type: core.ItemStateCondition
    actions:
    - inputs: {}
    id: "2"
      configuration:
      blockSource: <xml xmlns="https://developers.google.com/blockly/xml">
        <block type="controls_if" id="GcWQevSU-Mu6=4cfJ)T*" x="279" y="268">
          <value name="IF0">
            <block type="logic_compare" id="xx+jSrQ/Y_JK$7711hId">
              <field name="OP">LT</field>
              <value name="A">
                <block type="oh_getitem_state" id="H-J]q/xTO5jbn9}YIxvY">
                  <value name="itemName">
                    <shadow type="oh_item" id="A/qfm[iWiG?ZqqzqR;5+">
                      <field name="itemName">Temperature2TZ2000a476raq2_Temperature</field>
                    </shadow>
                  </value>
                </block>
              </value>
              <value name="B">
                <block type="text" id="c=DM0Vy75z[]~b}9@Y(0">
                  <field name="TEXT">23</field>
                </block>
              </value>
            </block>
          </value>
          <statement name="DO0">
            <block type="oh_event" id="[ZoyoR3F_}s~j[LqIl#e">
              <field name="eventType">sendCommand</field>
              <value name="value">
                <shadow type="text" id="NBl;V9~i[|(HI30IPMP?">
                  <field name="TEXT">ON</field>
                </shadow>
              </value>
              <value name="itemName">
                <shadow type="oh_item" id="Ya229n?.o91wwzvXH=P4">
                  <field name="itemName">TestschalterOSRAM</field>
                </shadow>
              </value>
            </block>
          </statement>
        </block>
      </xml>
      type: application/javascript
      script: >
        if(itemRegistry.getItem('Temperature2TZ2000a476raq2_Temperature').getState() < '23') {
          events.sendCommand('TestschalterOSRAM', 'ON');
        }
    type: script.ScriptAction
    - inputs: {}
    id: "1"
      configuration:
      blockSource: <xml xmlns="https://developers.google.com/blockly/xml">
        <block type="controls_if" id="I=x(1OjRujp#kdZ5xr+;" x="204" y="65">
          <value name="IF0">
            <block type="logic_compare" id="riVMNBd@-+j^cmr}@l,c">
              <field name="OP">GT</field>
              <value name="A">
                <block type="oh_getitem_state" id="Dm7K#N#14UnkqOR#Tj^)">
                  <value name="itemName">
                    <shadow type="oh_item" id="YL?8[^}j8!R6v+}y/Xg^">
                      <field name="itemName">Temperature2TZ2000a476raq2_Temperature</field>
                    </shadow>
                  </value>
                </block>
              </value>
              <value name="B">
                <block type="text" id="V,e;L9yU(`vPDnk@0g~U">
                  <field name="TEXT">23</field>
                </block>
              </value>
            </block>
          </value>
          <statement name="DO0">
            <block type="oh_event" id="9F09EnV~6KT0TkkULPT(">
              <field name="eventType">sendCommand</field>
              <value name="value">
                <shadow type="text" id="2zGu+%S;GxM8yY0t8}`/">
                  <field name="TEXT">OFF</field>
                </shadow>
              </value>
              <value name="itemName">
                <shadow type="oh_item" id="t^v]%8o6J}Czk63XJ~5n">
                  <field name="itemName">TestschalterOSRAM</field>
                </shadow>
              </value>
            </block>
          </statement>
        </block>
      </xml>
      type: application/javascript
      script: >
        if(itemRegistry.getItem('Temperature2TZ2000a476raq2_Temperature').getState() > '23') {
          events.sendCommand('TestschalterOSRAM', 'OFF');
        }
    type: script.ScriptAction
Mit den Einrückungen bin ich mir nicht zu 100% sicher, beim xml-Teil ist es nicht wichtig, erhöht aber die Lesbarkeit, im yaml-Teil des Codes sind sie hingegen essentieller Bestandteil.

Der wesentliche Teil der Rule ist ohnehin der "übersetzte" Code unterhalb des Script-Tags, und er ist tatsächlich nur zweimal drei Zeilen lang, eigentlich sind es sogar nur jeweils zwei Zeilen:

Code: Alles auswählen

if(itemRegistry.getItem('Temperature2TZ2000a476raq2_Temperature').getState() < '23') {
    events.sendCommand('TestschalterOSRAM', 'ON');
}
if(itemRegistry.getItem('Temperature2TZ2000a476raq2_Temperature').getState() > '23') {
    events.sendCommand('TestschalterOSRAM', 'OFF');
}
Und was mir dabei auffällt: die Zahlen stehen in Anführungszeichen. Gewöhnlich bedeutet das, der wert ist als String zu betrachten. Ein String kann nicht "größer" oder "kleiner" sein als ein anderer String (jedenfalls nicht, ohne dass man vorher Vereinbarungen über die Art des Vergleichs getroffen hat). Da ich noch nicht mit Blockly gearbeitet habe, kann ich nicht beurteilen, ob das ein Eingabefehler ist oder eine Missinterpretation meinerseits.

Re: Rules: Heizungssteuerung Temperatur

Verfasst: 15. Mai 2021 12:37
von Oldman
So, ich habe wieder mal Zeit um mich um mein OPenHAB zu kümmern.
Ich habe meinen Thermostat gewechselt. (TUYA raus und Homematic rein.)
------------------------------------------------
Wenn ich die Rule angelegt habe, dann zeigt mir openHAB den Status IDLE (grün).
Klicke ich auf den blauen Pfeil, dann wechselt der Status auf RUNNING(gelb),
dar Strom wird ein oder ausgeschalten
und der Status geht zurück auf IDLE.

Ich nehme daher an, dass alles richtig erstellt wurde.

Jetzt meine (dumme) Frage: Muss ich die Rule irgendwo aktivieren (so wie bei Homamatic), denn automatisch schaltet sich beim Temperaturwechsel gar nichts? Oder wo kann ich weiter suchen?

Re: Rules: Heizungssteuerung Temperatur // Gelöst

Verfasst: 16. Mai 2021 10:20
von Oldman
Ich habe meinen Fehler gefunden:

Bei der Bedingung hatte ich "a thing status changes" angeklickt.
richtig war:
"an item state changes".

und jetzt geht es .