Ankündigung

Einklappen
Keine Ankündigung bisher.

Bewässerungsventile nacheinander aktivieren

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

    #16
    Hallo zusammen,

    ich muss diesen Threat doch noch einmal nach oben holen.

    Seit einiger Zeit habe ich nun VSC weiter konfiguriert und auch die Fehlererkennung liefert mehr Ergebnisse.
    Bei der Rule aus dem letzten Threat bekomme ich nun 2 Fehler angezeigt, die ich bisher nicht beseitigt bekommen habe

    1)
    Code:
    nWater [COLOR=#d35400]+=[/COLOR] 1
    Type mismatch: cannot convert from BigDecimal to Number(org.eclipse.xtext.xbase.validation.IssueCod es.incompatible_types)
    2)
    Code:
    if (nTime <= [COLOR=#d35400]Wasserhahn_Dauer.state[/COLOR]) {
    Type mismatch: cannot convert from State to Number(org.eclipse.xtext.xbase.validation.IssueCod es.incompatible_types)
    Hoffe hier hat jemand einen Tipp?

    VG
    Joerg

    Kommentar


      #17
      Auch, wenn der Code dadurch wieder länger wird, konnte ich die Fehlermelrdungen wie folgt beseitigen

      Zitat von JoergA Beitrag anzeigen
      1)
      Code:
      nWater [COLOR=#d35400]+=[/COLOR] 1
      Code:
      nWater = nWater + 1
      Zitat von JoergA Beitrag anzeigen
      2)
      Code:
      if (nTime <= [COLOR=#d35400]Wasserhahn_Dauer.state[/COLOR]) {
      Code:
      (nTime <= Wasserhahn_Dauer.state as DecimalType)
      Kann dies evtl. an der neuen openAHB 2.5.3-snapshot liegen? Ich meinde, dass dies im vergangenen Herbst nicht angemeckert wurde. Nachdem ich die Gardena Geräte eingewintert hatte, habe ich die Things/Items auskommentiert und ebenfalls auch die Regeln.

      In der Zwischenzeit bin ich von 2.4.x auf die 2.5.3-snapshot gewechselt und habe dies gestern wieder in Betrieb nehmen wollen.

      Kommentar


        #18
        Rein interessehalber: darf ich mal fragen, welche Bewässerungsventile du einsetzt. Mist ist nämlich gerade die Idee gekommen, dass ich das auch haben möchte

        Kommentar


          #19
          Zitat von JoergA Beitrag anzeigen
          Auch, wenn der Code dadurch wieder länger wird, konnte ich die Fehlermelrdungen wie folgt beseitigen

          Code:
          nWater = nWater + 1
          Code:
          (nTime <= Wasserhahn_Dauer.state as DecimalType)
          Kann dies evtl. an der neuen openAHB 2.5.3-snapshot liegen? Ich meinde, dass dies im vergangenen Herbst nicht angemeckert wurde. Nachdem ich die Gardena Geräte eingewintert hatte, habe ich die Things/Items auskommentiert und ebenfalls auch die Regeln.

          In der Zwischenzeit bin ich von 2.4.x auf die 2.5.3-snapshot gewechselt und habe dies gestern wieder in Betrieb nehmen wollen.
          Die kurze Schreibweise += funktioniert nur noch bei Integer Variablen (ich bin mir ziemlich sicher, dass das mal anders war...)
          Noch kürzer wäre in dem Zusammenhang ++, das sollte auch funktionieren. also die drei Zeilen
          Code:
          nWater = nWater + 1
          nWater += 1
          nWater ++
          sollten funktionsidentisch sein, solange nWater als var Integer definiert ist.

          Das Typecasting ist auch so eine Sache. Es gibt immer wieder verschiedenes Verhalten seitens openHAB. Grundsätzlich sollte man versuchen, Zahlen als Number zu casten, falls das fehlschlägt, auf DecimalType ausweichen. Typecasting muss oft (aber nicht immer) geklammert werden.

          Kommentar


            #20
            Zitat von thoern Beitrag anzeigen
            Rein interessehalber: darf ich mal fragen, welche Bewässerungsventile du einsetzt. Mist ist nämlich gerade die Idee gekommen, dass ich das auch haben möchte
            Sicher, ich nutze das Gardena System. Eine Bewässerungsbox mit entsprechenden Gardena Ventilen und einer Smart Irrigation Control. Dazu einen Sensor zur Messung der Bodenfeuchte etc.

            Kommentar


              #21
              Zitat von udo1toni Beitrag anzeigen
              Die kurze Schreibweise += funktioniert nur noch bei Integer Variablen (ich bin mir ziemlich sicher, dass das mal anders war...)
              Noch kürzer wäre in dem Zusammenhang ++, das sollte auch funktionieren. also die drei Zeilen
              Code:
              nWater = nWater + 1
              nWater += 1
              nWater ++
              sollten funktionsidentisch sein, solange nWater als var Integer definiert ist.
              Ich habe dies ja "nur" übernommen und bin echt kein Spezialist bei den einzelnen Typen und wirklich dankbar für Deine/Eure Hilfe
              Bisher ist dies wie folgt definiert (hatte ich nicht mit angegeben, da der Code von Dir war )
              var Number nWater = 0
              Also müsste dies
              var Number nWater as Integer = 0
              lauten?

              Kommentar


                #22
                Zitat von JoergA Beitrag anzeigen
                Also müsste dies
                var Number nWater as Integer = 0


                lauten?
                Nein, Number ist genauso ein Typ wie Integer. Es müsste also
                Code:
                var Integer nWater = 0
                heißen. Wobei das kleine n für Numer steht, also müsste die Variable umbenannt werden in iWater. Aber das ist nicht zwingend, ich mache das in meinem Code halt, um mich selbst an den Typ zu erinnern...

                Kommentar


                  #23
                  Ich habe dies dann angepast um auch diese Veriante zu testen

                  Code:
                  var Integer iWater = 0
                  iWater +[COLOR=#c0392b]=[/COLOR] 1
                  Type mismatch: cannot convert from int to Integer
                  (org.eclipse.xtext.xbase.validation.IssueCodes.inc ompatible_types)

                  Code:
                  var Integer iWater = 0
                  iWater ++ [COLOR=#c0392b]1[/COLOR]
                  This expression is not allowed in this context, since it doesn't cause any side effects.
                  (org.eclipse.xtext.xbase.validation.IssueCodes.inv alid_inner_expression)

                  Kommentar


                    #24
                    Hmm... dann wurde da erheblich was geändert. int wäre ein Primitive, die Kurzschreibweise hat definitiv mal mit Objekten funktioniert. Primitives verlangsamen den Start von openHAB, da der Code beim Kompilieren zusätzliche Optimierungsläufe braucht.
                    Dann ist zukünftig die Schreibweise eher ungünstig.

                    Trotzdem, der Vollständigkeit halber, so wird des dann funktionieren:
                    Code:
                    var int iWater = 0
                    iWater += 1
                    iWater ++
                    nicht
                    Code:
                    iWater ++ 1

                    Kommentar


                      #25
                      Hmm, verlangsamen wollen wir ja schon gar nichts ;-) und zusätzlich mit der falschen Schreinbweise einen Fehler eingebaut :-/

                      Code:
                      var Integer iWater = 0
                      
                      und dann in der Rule
                      
                      iWater ++
                      Dies wirft zumindest keine Fehler aus und ist - wenn ich das richtig zusammenbekommen - keine Primitive?

                      Ob es den funktioniert wird sich - zumindest bei mir - zeigen, sobal das Gardena Binding reworked ist. Da ich mit diese Rule ja die Irrigation Control steuere, welches derzeit nicht läuft.

                      Aber trotzdem schon einen Dank

                      Kommentar


                        #26
                        Also entweder funktioniert beides oder keines von beiden... Die Geschwindigkeitseinbußen betreffen vor allem den Start des Systems, und auch dann kommt es sehr auf die Menge verwendeter Variablen und Konstanten an. Ich hab auch schon gelesen, dass die starke Typisierung (wesentlich) langsamer ist, als keine Typisierung einzusetzen, aber es gibt eben diverse Stellen, wo man sich dann andere Probleme einhandelt.

                        Irgendwas ist ja immer...

                        Kommentar


                          #27
                          Komplettes Rework notwendig =>> Danke Gardena

                          Wenn das neue Binding fertig ist, poste ich ein Update

                          Kommentar


                            #28
                            So, nachdem sich nun das gesamte Binding geändert hat, sind die folgenden Änderungen für die Bewässerungssteuerung zu berücksichtigen.
                            a) es dürfen nur 2 Ventile der Irrigation Control gleichzeitig aktiv sein => für diese Rule kein Problem, da genau dies nur für 10 Sekunden der Fall ist
                            b) Das senden eines Zahlenwerts öffnet nicht mehr direkt das Ventil => habe ich geändert, das der Wert trotzdem in das richtige Item übergeben wird
                            c) Es muss ein separater Start Befehl gesendet werden => eingebaut

                            Nach wie vor beendet das Ventil nach Abluaf der Zeit automatisch, dennoch muss ein bei einem vorzeitigen Beenden die Ventile geschlossen werden. Dies kann einzeln erfolgen, oder es gibt nun auch eine zentralen Befehl "ValveSet". Jedoch müsste ja auch eine aktive Water Control ggfs beendet werden. Seltsamerweise hat auch diese bei einem Ventil ein ValveSet, evtl. gibt es diese ja auch mit zweien (habe ich noch nicht geschaut)

                            Prinzipiell läuft diese Rule, jedoch ..... wird zum Ende nicht der Bereich zum kontrollierten beenden duchlaufen und somit wird der myIrrigationSwitchVis Button nicht umgesetzt :-/

                            Items
                            Code:
                            /* Gardena Smart Home Gruppen */
                            Group:Switch gVentEnable    "Ventil erlauben"
                            Group:Switch gVentile       "Ventile"
                            Group:Switch gVentStart     "Alle Ventile - Start"
                            Group:Number gVentTimer     "Einschaltdauer"
                            
                            /* Gardena Smart Home */
                            Switch Sw_Bewaesserung          "Bewässerungsautomatik" <tap>
                            Switch Sw_ManIrrigation         "Manuelle Bewässerung" <faucet> {autoupdate="false"}
                            Switch Sw_TerrasseIrrigation    "Terrassenbewässerung" <faucet>
                            Switch myIrrigationSwitchVis
                            
                            /* GARDENA smart Irrigation Control */
                            Switch VentEnable_1     "Aqua Contour [%s]" <faucet> (gVentEnable)
                            Switch VentEnable_2     "Rasenfläche [%s]"  <faucet> (gVentEnable)
                            Switch VentEnable_3     "Hecke [%s]"        <faucet> (gVentEnable)
                            
                            Number Irrigation_Timer_1 "Timer Aqua Contour [%d Min]" <time> (gVentTimer)
                            Number Irrigation_Timer_2 "Timer Rasenfläche [%d Min]" <time> (gVentTimer)
                            Number Irrigation_Timer_3 "Timer Hecke [%d Min]" <time> (gVentTimer)
                            
                            //Ventil Befehle
                            Number:Time IC_Valve1_Cmd_Duration "Aqua Contour" <time> (gVentile, Valves, Gardena) {channel="gardena:irrigation_control:home:Irrigati on:valve_1_commands#commandDuration"}
                            Number:Time IC_Valve2_Cmd_Duration "Rasenfläche" <time> (gVentile, Valves, Gardena) {channel="gardena:irrigation_control:home:Irrigati on:valve_2_commands#commandDuration"}
                            Number:Time IC_Valve3_Cmd_Duration "Hecke" <time> (gVentile, Valves, Gardena) {channel="gardena:irrigation_control:home:Irrigati on:valve_3_commands#commandDuration"}
                            
                            Switch IC_Valve1_Cmd_Start "Starte Bewässerung []" <faucet> (gVentStart) {channel="gardena:irrigation_control:home:Irrigati on:valve_1_commands#start_seconds_to_override"}
                            Switch IC_Valve2_Cmd_Start "Starte Bewässerung []" <faucet> (gVentStart) {channel="gardena:irrigation_control:home:Irrigati on:valve_2_commands#start_seconds_to_override"}
                            Switch IC_Valve3_Cmd_Start "Starte Bewässerung []" <faucet> (gVentStart) {channel="gardena:irrigation_control:home:Irrigati on:valve_3_commands#start_seconds_to_override"}
                            
                            Switch IC_Valve1_Cmd_Stop "Stoppe Bewässerung []" <faucet> {channel="gardena:irrigation_control:home:Irrigati on:valve_1_commands#stop_until_next_task"}
                            Switch IC_Valve2_Cmd_Stop "Stoppe Bewässerung []" <faucet> {channel="gardena:irrigation_control:home:Irrigati on:valve_2_commands#stop_until_next_task"}
                            Switch IC_Valve3_Cmd_Stop "Stoppe Bewässerung []" <faucet> {channel="gardena:irrigation_control:home:Irrigati on:valve_3_commands#stop_until_next_task"}
                            
                            //Ventilsatz Eigenschaften
                            Switch IC_ValveSet_Cmd_Stop "[]" (gVentStop) {channel="gardena:irrigation_control:home:Irrigati on:valveSet_commands#stop_until_next_task"}
                            
                            Number Irrigation_Dauer "Beregnungsdauer [%d Min]"
                            
                            /* GARDENA smart Water Control */
                            Number:Time WC_Valve_Cmd_Duration "Command Duration [%d min]" {channel="gardena:water_control:home:Aussenzapfste lle:valve_commands#commandDuration"}
                            Switch WC_Valve_Cmd_Start "Watering Timer [%d min]" {channel="gardena:water_control:home:Aussenzapfste lle:valve_commands#start_seconds_to_override"}
                            
                            /* GARDENA smart Sensor */
                            Number Sensor_SoilHumidity "Bodenfeuchtigkeit [%d %%]" <humidity> (Gardena, Humidity_Chart) {channel="gardena:sensor:home:Sensor:sensor#soilHu midity"}
                            Rule
                            Code:
                            var Timer t_green = null            //Timer, für Rasen Bewässerung
                            var Timer tWater = null                //Timer, für Rasen Bewässerung
                            var Integer iWater = 0
                            
                            rule GreenIrrigation
                            when
                                Time cron "0 30 05 ? * MON-SAT" or
                                Time cron "0 00 06 ? * SUN" or
                                Item Sw_ManIrrigation received command
                            then
                                if(receivedCommand == OFF) {                                                //OFF-Teil
                                    tWater?.cancel                                                          // timer beenden, falls vorhanden
                                    tWater = null                                                           // Zeiger löschen
                                    gVentStop.members.forEach[v | v.sendCommand(OFF)]                       // und alle Ventile schließen
                                    myIrrigationSwitchVis.postUpdate(ON)
                                    pushNotification("Bewässerung manuell beendet", "Stop: " + now)
                            
                                    return; // nur zur Sicherheit; der nachfolgende Code wird gar nicht durchlaufen.
                                } else {
                                    if((Sensor_SoilHumidity.state as Number).intValue < (Sensor_Level.state as Number)) {    //if(Sensor_humidity.state < Sensor_Level.state)  // eigentlich: if((Sensor_humidity.state as Number) < (Sensor_Level.state as Number)) {
                                        if(receivedCommand == ON) {
                                            pushNotification("Manuelle Bewässerung", "Start: " + now)
                                            logInfo("Gardena", "Manuelle Bewässerung - Start.")
                                        } else if(Sw_Bewaesserung.state == ON && Holiday.state == OFF) {
                                            pushNotification("Automatische Bewässerung", "Bodenfeuchtigkeit: " + Sensor_SoilHumidity.state + " - Start: " + now)
                                            logInfo("Gardena", "Automatische Bewässerung - Start.")
                                        } else if(Sw_Bewaesserung.state == ON && Holiday.state == ON) {
                                            pushNotification("Automatische Bewässerung", "Bewässerung Start abgebrochen, heute ist " + SpecialDay + " " + now)
                                            logInfo("Gardena", "Bewässerung Start abgebrochen, heute ist: {}", SpecialDay.state)
                                            return; // nur zur Sicherheit; der nachfolgende Code wird gar nicht durchlaufen.
                                        } else {
                                            logInfo("Gardena", "Bewässerung Start abgebrochen!")
                                            myIrrigationSwitchVis.postUpdate(ON)                                                        // nur zur Sicherheit, sollte eigentlich ON sein
                                            return; // nur zur Sicherheit; der nachfolgende Code wird gar nicht durchlaufen.
                                        }
                                        // Beregnungsroutine starten
                                        myIrrigationSwitchVis.postUpdate(OFF)
                                        iWater = 0                                                                                             // Zähler mit 0 initialisieren
                                        tWater = createTimer(now, [ |                                                                         // timer mit code initialisieren und ausführen
                                            var Number nTime = 10                                                                             // Default Einschaltzeit definieren
                                            iWater ++                                                                                       // Zähler erhöhen
                                            var gVent = gVentile.members.filter[i | i.name.contains(iWater.toString)]                         // Ventil bestimmen
                                            var gTime = gVentTimer.members.filter[i | i.name.contains(iWater.toString)]                       // Zeit bestimmen
                                            if(gTime.size > 0) {                                                                              // Zeit existiert
                                                if(gTime.head.state instanceof Number)                                                        // und ist eine gültige Zahl
                                                    nTime = gTime.head.state as Number                                                        // Defaultwert überschreiben
                                                if(gVent.size > 0) {                                                                          // Ventil existiert 
                            pushNotification("Irrigation gVent ", gVent.size.toString)
                                                    if(gVentEnable.members.filter[i | i.name.contains(iWater.toString)].head.state == ON) {    // und soll aktiviert werden
                                                        gVent.head.sendCommand(nTime)                                                         // Gardena Timer setzen
                                                        gVentStart.members.filter[s | s.name.contains(iWater.toString)].head.sendCommand(ON)
                                                        pushNotification("Bewässerung", gVent.head.label + " für " + nTime + " Min.")
                                                        if (gVent.head.label == "Hecke" && Sw_TerrasseIrrigation.state == ON) {
                                                            if (nTime <= (WC_Valve_Cmd_Duration.state as Number).intValue) {
                                                                WC_Valve_Cmd_Duration.sendCommand(nTime.intValue)
                                                                pushNotification("Automatische Bewässerung", "Wert angeglichen an Hecke: " + nTime + " Min.")
                                                            }
                                                            WC_Valve_Cmd_Start.sendCommand(ON)
                                                            pushNotification("Automatische Bewässerung", "Terrasse ab jetzt für " + WC_Valve_Cmd_Duration.state + " Min.")
                                                        } else if (gVent.head.label == "Hecke" && Sw_TerrasseIrrigation.state == OFF) {
                                                            pushNotification("Automatische Bewässerung", "Terrasse nicht aktiviert")
                                                        }
                                                        tWater.reschedule(now.plusMinutes(nTime.intValue).minusSeconds(10))                   // und 10 Sekunden vor Ablauf Gardena Timer nächster Schritt
                                                    } else {
                                                        tWater.reschedule(now.plusSeconds(5))                                                  //falls Ventil inaktiv aber Wert gesetzt
                                                    }
                                                } else {                                                                                      // kein weiterer Timer vorhanden, also
                                                    tWater = null                                                                             // Zeiger löschen
                                                    gVentile.members.forEach[v | v.sendCommand(0)]                                            // und alle Ventile explizit schließen
                                                    myIrrigationSwitchVis.postUpdate(ON)
                                                    pushNotification("Automatische Bewässerung", "Beendet um: {}.", now.toString)
                                                }
                                            }
                                        ])
                                        
                                    } else {
                                        logInfo("Gardena", "Bewässerung Start abgebrochen, da Bodenfeuchte mit {} ausreichend!", Sensor_SoilHumidity.state.toString)
                                        pushNotification("Bewässerung", "Start abgebrochen, da Bodenfeuchte mit " + Sensor_SoilHumidity.state + " ausreichend!")
                                    }
                                }
                            end


                            udo1toni
                            In dieser Konstellation funktioniert bei mir "iWater ++" wogegen "iWater += 1" einen Fehler liefert
                            Code:
                            Type mismatch: cannot convert from int to Integer
                            Viele Grüße
                            Jörg

                            Kommentar

                            Lädt...
                            X