Seite 2 von 2

Re: [Gelöst] Ganz einfache Umrechnung

Verfasst: 29. Jul 2020 13:05
von JuergenA
Hallo @Peter-Pan,

sieht soweit sehr gut aus. Ich dachte es gibt vielleicht noch die Möglichkeit wie in Java der Variablen verschiedene Formatierungs-Attribute mitzugeben, dann hätte ich das ja gleich in der Rule machen könne. Besteht vielleicht noch die Möglichkeit in der visibility[] mehrere Attribute abzufragen? wie z.b. wenn ertrag >0 und ertrag < 1000, dann könnte ich schön auf Wh und kWh und MWh umswitchen.

Gruß

Jürgen

Re: [Gelöst] Ganz einfache Umrechnung

Verfasst: 29. Jul 2020 17:57
von JuergenA
Nun habe ich es anders gemacht:

hier die solarlog.items:

Code: Alles auswählen

//Solarlog auslesen und in Variablen speichern
DateTime   SolarLog500Lastupdate           "Messzeitpunkt: [Datum: %1$td.%1$tm.%1$ty Uhrzeit: %1$tH:%1$tM:%1$tS]"           <time>         {channel="solarlog:meter:d554e9f6:lastupdate"}
Number     SolarLog500Pac                  "akt. Leistung AC: [%.0f W]"                                                     <energy>       {channel="solarlog:meter:d554e9f6:pac"}
Number     SolarLog500Pdc                  "akt. Leistung DC: [%.0f W]"                                                     <energy>       {channel="solarlog:meter:d554e9f6:pdc"}
Number     SolarLog500Uac                  "akt. Spannung AC: [%.0f V]"                                                     <energy>       {channel="solarlog:meter:d554e9f6:uac"}
Number     SolarLog500Udc                  "akt. Spannung DC: [%.0f V]"                                                     <energy>       {channel="solarlog:meter:d554e9f6:udc"}
Number     SolarLog500Yieldday             "Ertrag heute:"                                                                  <line>         {channel="solarlog:meter:d554e9f6:yieldday"}
Number     SolarLog500Yieldyesterday       "Ertrag gestern:"                                                                <line>         {channel="solarlog:meter:d554e9f6:yieldyesterday"}
Number     SolarLog500Yieldmonth           "Ertrag Monat:"                                                                  <line>         {channel="solarlog:meter:d554e9f6:yieldmonth"}
Number     SolarLog500Yieldyear            "Ertrag Jahr"                                                                    <line>         {channel="solarlog:meter:d554e9f6:yieldyear"}
Number     SolarLog500Yieldtotal           "Ertrag Gesamt"                                                                  <line>         {channel="solarlog:meter:d554e9f6:yieldtotal"}
Number     SolarLog500Totalpower           "installierte Leistung:"                                                         <solarplant>   {channel="solarlog:meter:d554e9f6:totalpower"}

//Variablen für die Umrechnung von Wh in kWh in MWh
Number SolarLog500Yieldday_umgerechnet                                                                                      <line>   
Number SolarLog500Yieldyesterday_umgerechnet                                                                                <line>
Number SolarLog500Yieldmonth_umgerechnet                                                                                    <line>
Number SolarLog500Yieldyear_umgerechnet                                                                                     <line>
Number SolarLog500Yieldtotal_umgerechnet                                                                                    <line> 

//Anzeigewert ( 1=Wh , 2=kWh , 3=MWh )
Number Anzeige_day
Number Anzeige_yesterday
Number Anzeige_month
Number Anzeige_year
Number Anzeige_total
dann hier die solarlog.rules:

Code: Alles auswählen

rule "Wh_in_kWh_in_MWh"
when 
    Item SolarLog500Yieldday received update or
    Item SolarLog500Yieldyesterday received update or
    Item SolarLog500Yieldmonth  received update or
    Item SolarLog500Yieldyear received update or
    Item SolarLog500Yieldtotal received update

then
    if(SolarLog500Yieldday.state instanceof Number && SolarLog500Yieldyesterday.state instanceof Number && SolarLog500Yieldmonth.state instanceof Number && SolarLog500Yieldyear.state instanceof Number && SolarLog500Yieldtotal.state instanceof Number)
       
        //Ertrag heute
        if((SolarLog500Yieldday.state >= 0) && (SolarLog500Yieldday.state < 1000))
            { 
                SolarLog500Yieldday_umgerechnet.postUpdate(SolarLog500Yieldday.state as Number)
                Anzeige_day.sendCommand(1)
            }
        if((SolarLog500Yieldday.state >= 1000) && (SolarLog500Yieldday.state < 1000000))
            { 
                SolarLog500Yieldday_umgerechnet.postUpdate((SolarLog500Yieldday.state as Number)/1000)
                Anzeige_day.sendCommand(2)
            }
        if((SolarLog500Yieldday.state >= 1000000))
            { 
                SolarLog500Yieldday_umgerechnet.postUpdate((SolarLog500Yieldday.state as Number)/1000000)
                Anzeige_day.sendCommand(3) 
            }

        //Ertrag gestern
        if((SolarLog500Yieldyesterday.state >= 0) && (SolarLog500Yieldyesterday.state < 1000)) 
            { 
                SolarLog500Yieldyesterday_umgerechnet.postUpdate(SolarLog500Yieldyesterday.state as Number)
                Anzeige_yesterday.sendCommand(1)
            }
        if((SolarLog500Yieldyesterday.state >= 1000) && (SolarLog500Yieldyesterday.state < 1000000)) 
            { 
                SolarLog500Yieldyesterday_umgerechnet.postUpdate((SolarLog500Yieldyesterday.state as Number)/1000) 
                Anzeige_yesterday.sendCommand(2)
            }
        if((SolarLog500Yieldyesterday.state >= 1000000))
            { 
                SolarLog500Yieldyesterday_umgerechnet.postUpdate((SolarLog500Yieldyesterday.state as Number)/1000000)
                Anzeige_yesterday.sendCommand(3)
            }

        //Ertrag Monat
         if((SolarLog500Yieldmonth.state >= 0) && (SolarLog500Yieldmonth.state < 1000)) 
            { 
                SolarLog500Yieldmonth_umgerechnet.postUpdate(SolarLog500Yieldmonth.state as Number) 
                Anzeige_month.sendCommand(1)
            }
        if((SolarLog500Yieldmonth.state >= 1000) && (SolarLog500Yieldmonth.state < 1000000)) 
            { 
                SolarLog500Yieldmonth_umgerechnet.postUpdate((SolarLog500Yieldmonth.state as Number)/1000)
                Anzeige_month.sendCommand(2) 
            }
        if((SolarLog500Yieldmonth.state >= 1000000))
            { 
                SolarLog500Yieldmonth_umgerechnet.postUpdate((SolarLog500Yieldmonth.state as Number)/1000000) 
                Anzeige_month.sendCommand(3)
            }

        //Ertrag Jahr
        if((SolarLog500Yieldyear.state >= 0) && (SolarLog500Yieldyear.state < 1000)) 
            { 
                SolarLog500Yieldyear_umgerechnet.postUpdate(SolarLog500Yieldyear.state as Number)
                Anzeige_year.sendCommand(1)
            }
        if((SolarLog500Yieldyear.state >= 1000) && (SolarLog500Yieldyear.state < 1000000)) 
            { 
                SolarLog500Yieldyear_umgerechnet.postUpdate((SolarLog500Yieldyear.state as Number)/1000) 
                Anzeige_year.sendCommand(2)
            }
        if((SolarLog500Yieldyear.state >= 1000000))
            { 
                SolarLog500Yieldyear_umgerechnet.postUpdate((SolarLog500Yieldyear.state as Number)/1000000) 
                Anzeige_year.sendCommand(3)
            }

        //Ertrag Total
        if((SolarLog500Yieldtotal.state >= 0) && (SolarLog500Yieldtotal.state < 1000)) 
            { 
                SolarLog500Yieldtotal_umgerechnet.postUpdate(SolarLog500Yieldtotal.state as Number)
                Anzeige_total.sendCommand(1)
            }
        if((SolarLog500Yieldtotal.state >= 1000) && (SolarLog500Yieldtotal.state < 1000000)) 
            { 
                SolarLog500Yieldtotal_umgerechnet.postUpdate((SolarLog500Yieldtotal.state as Number)/1000) 
                Anzeige_total.sendCommand(2)
            }
        if((SolarLog500Yieldtotal.state >= 1000000))
            { 
                SolarLog500Yieldtotal_umgerechnet.postUpdate((SolarLog500Yieldtotal.state as Number)/1000000) 
                Anzeige_total.sendCommand(3)
            }
end
und zu guter letzt die sidemap:

Code: Alles auswählen

Text label="Solarlog" icon="solarplant"
    {
        Text item=SolarLog500Lastupdate
        Text item=SolarLog500Totalpower
        Text item=SolarLog500Pac
        Text item=SolarLog500Pdc  
        Text item=SolarLog500Uac
        Text item=SolarLog500Udc

        //Ertrag heute:
        Text item=SolarLog500Yieldday_umgerechnet label="Ertrag heute: [%.2f Wh]"  visibility=[Anzeige_day==1]
        Text item=SolarLog500Yieldday_umgerechnet label="Ertrag heute: [%.2f kWh]"  visibility=[Anzeige_day==2]
        Text item=SolarLog500Yieldday_umgerechnet label="Ertrag heute: [%.2f MWh]"  visibility=[Anzeige_day==3]
       
        //Ertrag gestern:
        Text item=SolarLog500Yieldyesterday_umgerechnet label="Ertrag gestern: [%.2f Wh]"  visibility=[Anzeige_yesterday==1]
        Text item=SolarLog500Yieldyesterday_umgerechnet label="Ertrag gestern: [%.2f kWh]"  visibility=[Anzeige_yesterday==2]
        Text item=SolarLog500Yieldyesterday_umgerechnet label="Ertrag gestern: [%.2f MWh]"  visibility=[Anzeige_yesterday==3]
        
        //Ertrag Monat:
        Text item=SolarLog500Yieldmonth_umgerechnet label="Ertrag Monat: [%.2f Wh]"  visibility=[Anzeige_month==1]
        Text item=SolarLog500Yieldmonth_umgerechnet label="Ertrag Monat: [%.2f kWh]"  visibility=[Anzeige_month==2]
        Text item=SolarLog500Yieldmonth_umgerechnet label="Ertrag Monat: [%.2f MWh]"  visibility=[Anzeige_month==3]
        
        //Ertrag Jahr:
        Text item=SolarLog500Yieldyear_umgerechnet label="Ertrag Jahr: [%.2f Wh]"  visibility=[Anzeige_year==1]        
        Text item=SolarLog500Yieldyear_umgerechnet label="Ertrag Jahr: [%.2f kWh]"  visibility=[Anzeige_year==2]
        Text item=SolarLog500Yieldyear_umgerechnet label="Ertrag Jahr: [%.2f MWh]"  visibility=[Anzeige_year==3]

        //Ertrag Gesamt:
        Text item=SolarLog500Yieldtotal_umgerechnet label="Ertrag Total: [%.2f Wh]"  visibility=[Anzeige_total==1]
        Text item=SolarLog500Yieldtotal_umgerechnet label="Ertrag Total: [%.2f kWh]"  visibility=[Anzeige_total==2]
        Text item=SolarLog500Yieldtotal_umgerechnet label="Ertrag Total: [%.2f MWh]"  visibility=[Anzeige_total==3]
    }        
Somit wird alles sauber umgeschaltet angefangen in Wh dann in kWh und zu guter letzt in MWh. Aber nichts desto trotz suche ich immer noch nach einer vielleicht besseren Variante um der Variablen die Formatierung via Attribut mitzugeben.

Re: [Gelöst] Ganz einfache Umrechnung

Verfasst: 29. Jul 2020 23:01
von udo1toni
Ja, das ist natürlich etwas umständlich. :) Also, mal abgesehen davon, dass mir die Rule etwas lang aussieht (ohne sie jetzt genau angeschaut zu haben gehe ich stark davon aus, dass ich sie mindestens um 50% eindampfen kann...)

Ich habe es noch nie probiert, aber es sollte auch möglich sein, Proxy Items als UoM Items zu definieren (also Number:Power wattStunden "Leistung [%.1f %unit%]").
Leider wird das aber am Anzeigeproblem nichts ändern, denn Du musst weiterhin mittels visibility zwischen Wh, kWh und MWh umschalten.

Ich habe das bei mir anders gelöst. Ich schreibe die Leistung mitsamt der Einheit über ein Script in eine String Variable - Ich lasse mir mit einem Widget so aktuelle Leistung, Tagesertrag, Jahresertrag und Komplettertrag anzeigen. Sieht dann so aus:
energy.png

Re: [Gelöst] Ganz einfache Umrechnung

Verfasst: 29. Jul 2020 23:21
von peter-pan
...ich dachte mir schon, dass es mit den "Watt" zu Problemen kommen könnte, aber du hast das ja, sehr gut gelöst. Es gibt sicher auch noch andere Möglichkeiten, z.B. kann man das Ausabe-Item als String definieren und die Aufbereitung der Werte in einer Regel definieren.
Ein Beispiel:

Code: Alles auswählen

rule "moondistances"
    when
        Item Dummy4 changed to ON or
        Item Date_distance changed      // Item defined in astro.items  and changed every five minutes(300 sec.) by astro.things
    then
        Date_Kilometer_actual.postUpdate(Date_distance.state.format("%1$ta, %1$td.%1$tb. ") + " / " + Kilometer_distance.state.format("%,.0f km").toString)
        Date_Kilometer_perigee.postUpdate(Date_perigee.state.format("%1$ta, %1$td.%1$tb. ") + " / " + Kilometer_perigee.state.format("%,.0f km").toString)
        Date_Kilometer_apogee.postUpdate(Date_apogee.state.format("%1$ta, %1$td.%1$tb. ") + " / " + Kilometer_apogee.state.format("%,.0f km").toString)
        mooncount = mooncount + 1
        if (mooncount == 1 ) {   //Log every 2 hours - just to inform that rule is still alive
            logInfo("astro-rules" + '_99'," Moondistance updated every 5 Minutes by \"astro.things \" " + Date_distance.state + " / " + mooncount + " Log every 2 hours")
        }
        if (mooncount >= 24) {       //refresh counter
            mooncount = 0
       }
end
Das Ergebnis sieht dann so aus:
astro.jpg
Also ein formatiertes Datums-Item und ein formatiertes Number-Item zu einem String zusammengesetzt. Könnte das ein Ansatz sein ?

Edit: Sorry während ich noch hin- und her überlegt habe und nach einem Beispiel aus meinem SetUp gesucht habe, hat Udo das schon auf den Punkt gebracht.