Ankündigung

Einklappen
Keine Ankündigung bisher.

Heizungssteuerung über Schaltaktor in Abhängigkeit einer gewählten Temperatur

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Heizungssteuerung über Schaltaktor in Abhängigkeit einer gewählten Temperatur

    Liebe Community

    ich versuche in OH3 im UI eine Regel zu erstellen, damit die Heizung (eine Elektroheizung, die über einen Shelly ein- und ausgeschaltet wird) in Abhängigkeit einer gewählten Temperatur schaltet.
    Ich möchte eine Zieltemperatur eingeben (item "solltemp_bad", Type: Number:Temperature) und ein ShellyHT Temperaturmesser (item "Shelly_HT_Bad_Temperatur", Type: Number:Temperature Point>Measurement) misst die Raumtemperatur.

    Nun soll die Heizung einschalten, wenn die Temperatur unter Zieltemperatur (0.5°C drunter) fällt und ausschalten, wenn sie die Zieltemperatur erreicht. Weil es in einem Ferienhaus ist, habe ich noch einen Dummyschalter (item "heizung_schalten", Type: Switch, Point) angelegt, damit ich die Regel der Heizungen grundsätzlich ein- und ausschalten kann.

    Ich stehe komplett auf dem Schlauch bezüglich der Regel. Ich habe Regeln bereits ohne UI erstellt und das ging eigentlich gut. Ich habe bei den im UI erstellten Regeln einfach den Durchblick nicht.
    Ich danke euch herzlich für Hilfestellungen und grüsse herzlich.

    Moadin

    Code:
    configuration: {}
    triggers:
      - id: "2"
        configuration:
          itemName: heizung_schalten
          state: ON
        type: core.ItemStateUpdateTrigger
    conditions:
      - inputs: {}
        id: "4"
        configuration:
          itemName: Shelly_HT_Bad_Temperatur
          state: number.solltemp_bad
          operator: <
        type: core.ItemStateCondition
    actions:
      - inputs: {}
        id: "3"
        configuration:
          command: ON
          itemName: ShellyPlus_1PM_Bad_Betrieb
        type: core.ItemCommandAction​
    ​
    10.10.2023, 16:08 Ich habe die Regel soeben ein wenig geändert. Bin ich auf dem richtigen Weg?
    Zuletzt geändert von Moadin; 10.07.2023, 15:08.

    #2
    Nein, das geht so nicht.
    Die UI Rules haben drei verschiedene Bereiche, das sind der When Part (die Trigger), der Then Part (die Actions) und der But-Only-If Part (die Voraussetzungen).
    Du kannst damit erstaunlich viel erreichen, hast aber recht enge Grenzen. Es ist beispielsweise nicht möglich, in einem der drei Bereiche etwas dynamisch zu konfigurieren (wie bei Dir gewünscht... Temperaturgrenze einstellbar)
    Der zweite Punkt ist, der Trigger ist der falsche. Es ist völlig (nun ja, fast) egal, ob der Schalter gerade geschaltet wird. Die Rule muss bei Änderung der Raumtemperatur schalten (oder eben nicht, falls die Automatik aus ist - die Schalterstellung ist also ein Teil von But-Only-If)
    Außerdem brauchst Du mindestens noch eine zweite Rule, die sich um das Ausschalten kümmert - das ist großer Quatsch.

    Du kannst die Rule dennoch über die UI erstellen, wirst aber um Code nicht herum kommen - in der einen oder anderen Form.

    Code:
    configuration: {}
    triggers:
      - id: "1"
        configuration:
          itemName: Shelly_HT_Bad_Temperatur
        type: core.ItemStateChangedTrigger
      - id: "2"
        configuration:
          itemName: heizung_schalten
        type: core.ItemStateChangedTrigger
    conditions:
      - inputs: {}
    actions:
      - inputs: {}
        id: "3"
        configuration:
          type: application/vnd.openhab.dsl.rule
          script: var soll = ShellyPlus_1PM_Bad_Betrieb.state
            var nTempIs = (Shelly_HT_Bad_Temperatur.state as Number).floatValue
            var nTempSoll = (solltemp_bad.state as Number).floatValue
            if(nTempIs < nTempSoll - 0.5)
                soll = ON
            if(nTempIs >= nTempSoll)
                soll = OFF
    ​        if(heizung_schalten.state == OFF)
                soll = OFF
            if(ShellyPlus_1PM_Bad_Betrieb.state != soll)
                ShellyPlus_1PM_Bad_Betrieb.sendCommand(soll.toString)
        type: script.ScriptAction​
    Eine Rule (per UI angelegt), die sich um alle möglichen Situationen kümmert. Sie triggert, wenn sich die Temperatur ändert oder der Schalter umgelegt wird.
    Anschließend bestimmt sie über die vier Items den Sollwert der Heizung.
    Falls der Sollwert vom Istwert abweichst, sendet sie einen Schaltbefehl.
    Du kannst diese Rule natürlich auch mit Blockly erstellen, wenn Du um die Eingabe von Zeichen herum kommen willst (ganz ist es aber nicht zu vermeiden...)

    Kommentar


      #3
      Vielen Dank Udo, cool. Sogar mit meinen Bezeichnungen drin.

      Wenn ich das nun als Rule erfasse, erscheint die Fehlermeldung "Implicit map keys need to be on a single line".
      Können die Bedingungen "if" ohne Trennung hintereinander stehen? Dürfen zwei unterschiedliche Typ-Varianten unterhalb der configuration stehen?

      Entschuldige die unwissenden Fragen. Ich verstehe die Programmierung grundsätzlich (die Variablen und dann die if-Schlaufen), aber ich weiss nicht was mit Type gemeint ist.

      Ich danke bereits im Voraus herzlich für weitere Unterstützung.

      Kommentar


        #4
        Hmm... Die Fehlermeldung sagt mir erst mal nichts...

        Welche exakte Version von openHAB nutzt Du denn? Ich probiere das heute Abend mal auf meinem Testsystem aus...

        Kommentar


          #5
          Deine Nachfrage nach der Version von openHAB hat das Problem zu Tage gebracht. Ich nutze scheinbar 4.0.0 M3.
          Ich werde heute Abend auf ein Stable wechseln, hoffe das kann ich auch per Fernzugriff via Terminal. Melde mich wieder wenn ich eine Stable-Version verwende.
          Ich habe auf dem RaspberryPi ein generelles Update gemacht, kann es sein, dass dann auch openHAB ein Update erfährt? Ich bin der Meinung Openhab 3 von den Imagedateien direkt von der Raspi-Site auf der SD Karte installiert zu haben.

          Ich habe soeben nochmals versucht das Build neu auf einen Raspi zu spielen (über die Website von raspberrypi). Es wird automatisch immer 4.0.0.M4 genommen. Eine andere Version lädt es gar nicht drauf. Oder der Raspi aktualisiert sich selbständig.

          Ich habe nun einen anderen Raspi genommen mit openHAB 3.4.4 Es gibt die Fehlermeldung auch dort. Sie lautet: YAMLSemanticError: Implicit map keys need to be on a single line
          Zuletzt geändert von Moadin; 11.07.2023, 19:08.

          Kommentar


            #6
            Ich habe den Code in ChatGPT eingegeben. Es hatte scheinbar ein paar unsichtbare Zeichen drin.
            Code:
            configuration: {}
            triggers:
              - id: "1"
                configuration:
                  itemName: Shelly_HT_Bad_Temperatur
                type: core.ItemStateChangedTrigger
              - id: "2"
                configuration:
                  itemName: heizung_schalten
                type: core.ItemStateChangedTrigger
            conditions:
              - inputs: {}
            actions:
              - inputs: {}
                id: "3"
                configuration:
                  type: application/vnd.openhab.dsl.rule
                  script: |
                    var soll = ShellyPlus_1PM_Bad_Betrieb.state
                    var nTempIs = (Shelly_HT_Bad_Temperatur.state as Number).floatValue
                    var nTempSoll = (solltemp_bad.state as Number).floatValue
                    if(nTempIs < nTempSoll - 0.5)
                        soll = ON
                    if(nTempIs >= nTempSoll)
                        soll = OFF
                    if(heizung_schalten.state == OFF)
                        soll = OFF
                    if(ShellyPlus_1PM_Bad_Betrieb.state != soll)
                        ShellyPlus_1PM_Bad_Betrieb.sendCommand(soll.toString)
                type: script.ScriptAction​
            Hoffe der funktioniert nun. :-)

            Kommentar


              #7
              Ah, fast... es fehlte der senkrechte Strich nach script: Das kommt davon, wenn man meint, so ein paar Zeilen Code "mal eben" hinschreiben zu können...

              Version 4.0.0 M4 -> Ja, das openHABian Image installiert seit etwa einem Monat als Default (!) die Version 4.0.0 als Milestone.
              Möglichkeit 1: den entsprechenden Eintrag in der openhabian.conf anpassen. Hier handelt es sich um die Version des Repositories, aus dem openhabian-config eingerichtet wird. statt main muss man dort openHAB3 angeben. Das geht aber nur, solange openHAB noch nicht installiert wurde, und ich meine, dass die openhabian.conf nicht in der ersten Partition (die von Windows aus errreichbar ist) liegt. Man müsste also zunächst die zweite Partition der SD-Karte in ein laufendes GNU/Linux System mounten, um dann dort im Verzeichnis ./etc/ die Datei anzupassen. Falls sich auf der ersten Partition eine openhabian.conf befindet, wird die Datei vermutlich beim ersten Start von der Partition ans Ziel kopiert, dann könnte man die Änderung auch von Windows aus machen (ich habe openHABian noch nie auf dem Raspberry installiert...)

              Oder (das geht immer) man startet openhabian-config und wählt unter Punkt 40 -> 42 das "Upgrade to openHAB 3" aus...

              openHAB3.4.4 läuft auch unter Java17, man müsste hier also kein Downgrade vornehmen.

              Kommentar


                #8
                Ich habe das System nun auf 3.3.4 downgegradet und erhalte immer noch eine Fehlermeldung, die gleiche wie auf einem 4.0.0 System: "Error while saving rule: Server Error".
                im Logfile sehe ich folgende Meldungen:


                2023-07-12 15:03:38.933 [ERROR] [internal.JSONResponseExceptionMapper] - Unexpected exception occurred while processing REST request.

                java.lang.IllegalStateException: The ID must not be null.

                Ich weiss nun nicht genau was ich damit anfangen soll. Ich danke für eine weitere Hilfestellung.

                Kommentar


                  #9
                  Das ist aber ein Fehler, der mit der Rule nichts zu tun hat.

                  Kommentar


                    #10
                    Vielen Dank für den Hinweis. Ich versuche mich nun diesbezüglich schlau zu machen. Komisch ist, dass der Fehler egal auf welchem System auftritt. Auf zwei unterschiedlichen Raspberry's.
                    Vielen Dank nochmals für Deine super Hilfe Udo1toni!

                    Kommentar


                      #11
                      Ach, Mist...

                      Ich hätte mal gleich den Code bei mir eintippen sollen...
                      Code:
                      configuration: {}
                      triggers:
                        - id: "1"
                          configuration:
                            itemName: Shelly_HT_Bad_Temperatur
                          type: core.ItemStateChangeTrigger
                        - id: "2"
                          configuration:
                            itemName: heizung_schalten
                          type: core.ItemCommandTrigger
                        - id: "3"
                          configuration:
                            itemName: solltemp_bad
                          type: core.ItemStateChangeTrigger
                      ​conditions: []
                      actions:
                        - inputs: {}
                          id: "4"
                          configuration:
                            type: application/vnd.openhab.dsl.rule
                            script: |-
                              var soll = ShellyPlus_1PM_Bad_Betrieb.state
                              var nTempIs = (Shelly_HT_Bad_Temperatur.state as Number).floatValue
                              var nTempSoll = (solltemp_bad.state as Number).floatValue
                              if(nTempIs < nTempSoll - 0.5)
                                  soll = ON
                              if(nTempIs >= nTempSoll)
                                  soll = OFF
                              if(heizung_schalten.state == OFF)
                                  soll = OFF
                              if(ShellyPlus_1PM_Bad_Betrieb.state != soll)
                                  ShellyPlus_1PM_Bad_Betrieb.sendCommand(soll.toString)
                          type: script.ScriptAction
                      ​
                      So sollte es jetzt passen. Natürlich sollte die Heizung auch unmittelbar schalten, wenn man die Solltemperatur verstellt
                      Zuletzt geändert von udo1toni; 13.07.2023, 22:55.

                      Kommentar


                        #12
                        Es scheint zu funktionieren, super!! Vielen herzlichen Dank!

                        Kommentar

                        Lädt...
                        X