Seite 4 von 5

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 16:50
von Nordmann
Hallo zusammen,

muss mich doch noch einmal melden :oops:

Meine Rules sehen jetzt folgendermaßen aus:

Code: Alles auswählen

rule "Counter Rule"

when 
    Item Hamsterkontakt changed from OPEN to CLOSED
then
        if (Counter.state == NULL) {
            Counter.postUpdate(0)
        } else {
        	Counter.postUpdate(((Counter.state as DecimalType) + 1)*0.96)

        }
end


rule "Counter Rule Null"

when 
    Time cron "/10 * * * * ?"  // Nur für Testzwecke - soll später auf Mitternacht gestellt werden!
    					// Jetzt sind es 10 Sekunden!
then
		Counter_All.postUpdate (Counter.state as DecimalType)
		//Counter_Summe.postUpdate ((Counter_Summe.state as DecimalType) + (Counter_All.state as DecimalType))

		if (Counter.state >= 0) {
            Counter.postUpdate(0)
        } 
end
Was ich jetzt hin bekomme ist, dass der Counter richtig zählt.
Wenn die Rule "Counter Rule Null" aufgerufen wird setzt die Rule den Counter (Tagescounter) auf null und
in Counter_All wird der Wert übergeben, sodass der vorherigen Tageswert angezeigt wird.

Was ich jedoch noch möchte ist mir den Gesamtwert mit "Counter_Summe" anzeigen lassen.
Wenn ich jedoch folgende Zeile einfüge wird der Tageswert (Counter) und er Vortageswert (Counter_All) nicht mehr zurückgesetzt sondern weitergezählt.

Code: Alles auswählen

		//Counter_Summe.postUpdate ((Counter_Summe.state as DecimalType) + (Counter_All.state as DecimalType))
Und es kommt folgende Fehlermeldung:

Code: Alles auswählen

2017-11-26 16:51:40.020 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Counter Rule Null: org.eclipse.smarthome.core.library.types.DecimalType
Was mache ich da falsch?

Danke für Eure nochmalige Hilfe!

Gruß
Jörg

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 17:56
von seppy
Hi,
also wie ich vermutet habe ist da noch ein Problem vorhanden. Ich denke, dass die Prüfung auf NULL nicht funktioniert und dann der Cast auf DecimalType nicht funktioniert. Zum Anderen zählt Deine Regel nur jede zweite Runde, da die Regel nur beim "öffnen" des Kontaktes zählt.

Prüf mal bitte (am Besten auf der Karaf Console) ob Dein neues Item auch noch NULL ist
Grüße,
Seppy

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 18:03
von seppy
Ach und noch was, warum arbeitest Du nicht mit Persistence um Deine Stats zu bauen? Das wäre sehr viel sinniger.

Grüße,
Seppy

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 20:15
von Nordmann
Hallo Seppy,

ich habe die ganze Sache jetzt folgendermaßen "gelöst":

Code: Alles auswählen

rule "Counter Rule"

when 
    Item Hamsterkontakt changed from CLOSED to OPEN	
then
        if (Counter.state == NULL) {
            Counter.postUpdate(0)
        } else {
        	Counter.postUpdate (((Counter.state as DecimalType) + 1)*0.98646)

        }
end


rule "Counter Rule Null"

when 
    	Time cron "/10 * * * * ?"
	
then
		Counter_All.postUpdate (Counter.state as DecimalType)
		//Counter_Summe.postUpdate (Counter_Summe.state as DecimalType) + (Counter_All.state as DecimalType)

		if (Counter.state >= 0) {
            Counter.postUpdate(0)
        } 
end


rule "Counter Rule Summe"

when 
    Time cron "/10 * * * * ?"
then
        if (Counter_Summe.state == NULL) {
            Counter_Summe.postUpdate(0)
        } else {
        	Counter_Summe.postUpdate ((Counter_Summe.state as DecimalType) + (Counter_All.state as DecimalType))

        }
end
Die Cronjobs brauche ich ja nur, um die einzelnen Counter auf 0 (Counter_All) zu setzen bzw. hoch zu zählen (Counter_Summe).
Über meine mysql.persist schreibe ich die Daten in die MySQL Datenbank; das funktioniert auch schon :-)

Einziger Nachteil bei der ganze Sache, wenn das System zum Beispiel restart wird (sudo systemctl restart openhab2
) wird, werden alle Counter auf 0 gesetzt, die aktuellen werte gehen also verloren :-(

Gruß
Jörg

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 21:16
von seppy
Hi,
Einziger Nachteil bei der ganze Sache, wenn das System zum Beispiel restart wird (sudo systemctl restart openhab2
) wird, werden alle Counter auf 0 gesetzt, die aktuellen werte gehen also verloren :-(
genau deswegen solltest Du Dir die Persistence Funktionen anschauen, denn über die meisten Fragen die Du Dir stellst haben sich auch schon andere Gedanken gemacht ;) :
http://docs.openhab.org/configuration/p ... -and-rules
Grüße,
Seppy

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 21:49
von Nordmann
Hallo Seppy,

danke für den Hinweis.
Ich werde mir die Sache mit den "Persistence Funktionen" zu Gemüte führen :P und das jetzige "Konstrukt" überarbeiten!
Wenn's so weit ist und funktioniert poste ich das Ergebnis :-)

Auf jeden Fall noch einmal vielen Dank an Dich,
Deine Tipps haben mich echt weiter gebracht!

Ich wünsche noch einen schönen Abend!

Gruß
Jörg

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 21:51
von seppy
Viel Erfolg und ich bin mal gespannt was der Hamster so läuft ...


Gesendet von iPhone mit Tapatalk

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 22:00
von Nordmann
Hallo Seppy,

werde nächste Woche den Fensterkontakt am Hamsterrad befestigen
und dann schaun wir mal was unsere Lusie so wegstrampelt :-)

Gruß
Jörg

Re: Projekt Hamsterrad ......

Verfasst: 26. Nov 2017 23:42
von Nordmann
Und nochmal ich!

Mir ist gerade aufgefallen, dass meine Kreisumfangsberechnung nicht stimmt.
Wenn ich den Counter so angebe

Code: Alles auswählen

Counter.postUpdate (((Counter.state as DecimalType) + 1)*0.98646)
wird der errechnete Kreisumfang bei jedem Kontakt immer kleiner und bleibt nicht konstant.
Eine Umdrehung des Rades ist aber nicht genau 1 Meter, sondern nur 0,98646 Meter.
Nun könnte man natürlich sagen "gemessen am Erdumfang ist das ja gar nichts", stimmt,
aber ich würde gerne wissen wie ich den genauen Umfang einer Umdrehung ausrechnen kann.

Meine Rule sieht im Augenblick so aus:

Code: Alles auswählen

rule "Counter Rule"

when 
    Item Hamsterkontakt changed from CLOSED to OPEN
then
        if (Counter.state == NULL) {
            Counter.postUpdate(0)
        } else {
        	Counter.postUpdate (((Counter.state as DecimalType) + 1))
        }
end


rule "Counter Rule Null"

when 
    	Time cron "57 59 23 * * ?"
	
then
		Counter_All.postUpdate (Counter.state as DecimalType)
		//Counter_Summe.postUpdate (Counter_Summe.state as DecimalType) + (Counter_All.state as DecimalType)

		if (Counter.state >= 0) {
            Counter.postUpdate(0)
        } 
end


rule "Counter Rule Summe"

when 
    Time cron "58 59 23 * * ?"
then
        if (Counter_Summe.state == NULL) {
            Counter_Summe.postUpdate(0)
        } else {
        	Counter_Summe.postUpdate ((Counter_Summe.state as DecimalType) + (Counter_All.state as DecimalType))

        }
end
Meine mysql.persist sieht so aus, ich glaube das ist das was Seppy meinte, oder?

Code: Alles auswählen

	// Hamsterzähler
	Counter : strategy = everyChange, restoreOnStartup
	Counter_All : strategy = everyChange, restoreOnStartup
	Counter_Summe : strategy = everyChange, restoreOnStartup
	Counter_Summe : strategy = Midnight, restoreOnStartup	
	}
Wobei

Code: Alles auswählen

Counter_Summe : strategy = Midnight, restoreOnStartup
im Augenblick nur zur Sicherheit gesetzt wurde.

Also ich habe an einigen Stellen versucht "rumzuschrauben", hat aber außer ein paar Errors nicht's gebracht.
Vielleicht hat einer von Euch DIE Idee.

Gute Nacht.

Gruß
Jörg

Re: Projekt Hamsterrad ......

Verfasst: 27. Nov 2017 16:37
von Cyrelian
Nordmann hat geschrieben: 26. Nov 2017 23:42 Und nochmal ich!

Mir ist gerade aufgefallen, dass meine Kreisumfangsberechnung nicht stimmt.
Wenn ich den Counter so angebe

Code: Alles auswählen

Counter.postUpdate (((Counter.state as DecimalType) + 1)*0.98646)
wird der errechnete Kreisumfang bei jedem Kontakt immer kleiner und bleibt nicht konstant.
Eine Umdrehung des Rades ist aber nicht genau 1 Meter, sondern nur 0,98646 Meter.
Nun könnte man natürlich sagen "gemessen am Erdumfang ist das ja gar nichts", stimmt,
aber ich würde gerne wissen wie ich den genauen Umfang einer Umdrehung ausrechnen kann.
Hi Jörg,

ich würde erstmal runden ;) also auf 0,99. Was ist aber noch nicht verstanden habe ist, wie der Umfang kleiner werden kann. Du Addierst immer eine ganze Zahl (1). Die Summe also der (Counter.state) wird dann mit dem Umfang multipliziert. Der Umfang ist ja fest auf 0,98646 gesetzt. Woran machst Du fest, dass er kleiner wird?

CU
Cyrelian