String zu Number Transformation für Chart Item

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
cammymyra
Beiträge: 15
Registriert: 19. Jul 2019 10:43
Answers: 0

String zu Number Transformation für Chart Item

Beitrag von cammymyra »

Moin,

ich gebe es auf. Ich scheitere wohl an einer banalen Aufgabe meine Temperatur und Luftfeuchtigkeit, welche über einen DHT22 via MQTT reinkommt (vom Arduino an den Raspi) in ein Chart Objekt darzustellen.

Dazu die Items:

Code: Alles auswählen

String TemperatureTechnikUG "Temperatur [%d °C]" <temperature> { mqtt="<[broker:stat/UG/Technik/Temperature:state:default]" }
Number NumberTemperatureTechnikUG
//String TemperatureIndexTechnikUG "Temperatur Index [%d °C]" <temperature> { mqtt="<[broker:stat/UG/Technik/TemperatureIndex:state:default]" }
String HumidityTechnikUG "relative Luftfeuchte [%d %%]" <humidity> { mqtt="<[broker:stat/UG/Technik/Humidity:state:default]" }
Number NumberHumidityTechnikUG
Sitemap:

Code: Alles auswählen

			Frame label="Technikraum" {
				Default item=TemperatureTechnikUG label="Temperatur [%s °C]" icon="temperature"
				//Default item=TemperatureIndexTechnikUG label="Temperatur Index [%d °C]" icon="temperature"
				Default item=HumidityTechnikUG label="relative Luftfeuchte [%s %%]" icon="humidity"
				Text label="Verläufe Technik UG" icon="line" {
					Frame label="Temperatur" {
						Switch item=PeriodTemp label="Zeiteinheit" icon="time" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Jahr"]
						Chart item=NumberTemperatureTechnikUG period=h refresh=7200 visibility=[PeriodTemp==0, PeriodTemp=="Uninitialized"]
						Chart item=NumberTemperatureTechnikUG period=D refresh=14400 visibility=[PeriodTemp==1]
						Chart item=NumberTemperatureTechnikUG period=W refresh=14400 visibility=[PeriodTemp==2]
						Chart item=NumberTemperatureTechnikUG period=Y refresh=14400 visibility=[PeriodTemp==3]
					}
					Frame label="Luftfeuchtigkeit" {
						Switch item=PeriodHum label="Zeiteinheit" icon="time" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Jahr"]
						Chart item=NumberHumidityTechnikUG period=h refresh=7200 visibility=[PeriodHum==0, PeriodHum=="Uninitialized"]
						Chart item=NumberHumidityTechnikUG period=D refresh=14400 visibility=[PeriodHum==1]
						Chart item=NumberHumidityTechnikUG period=W refresh=14400 visibility=[PeriodHum==2]
						Chart item=NumberHumidityTechnikUG period=Y refresh=14400 visibility=[PeriodHum==3]
					}	
				}
rrd4j.persist:

Code: Alles auswählen

Strategies {
	everyMinute : "0 * * * * ?"
    default = everyChange
}

Items {
    NumberTemperatureTechnikUG : strategy = everyChange, everyMinute, restoreOnStartup
    NumberHumidityTechnikUG : strategy = everyChange, everyMinute, restoreOnStartup
}
rule:

Code: Alles auswählen

rule "Transformation Temperatur String2Double"
when 
    Item TemperatureTechnikUG changed
then
    if (log) logInfo('rules','String2Double: Temperatur Technik UG')
    NumberTemperatureTechnikUG = Double::parseDouble(TemperatureTechnikUG.state.toString)
end

rule "Transformation Luftfeuchtigkeit String2Double"
when 
    Item HumidityTechnikUG changed
then
    if (log) logInfo('rules','String2Double: Humidity Technik UG')
    NumberHumidityTechnikUG = Double::parseDouble(HumidityTechnikUG.state.toString)
end
Folgender Fehler wird immer wieder geworfen:
2021-02-25 16:23:22.347 [vent.ItemStateChangedEvent] - HumidityTechnikUG changed from 71.60 to 71.50

2021-02-25 16:23:22.354 [INFO ] [eclipse.smarthome.model.script.rules] - String2Double: Humidity Technik UG

2021-02-25 16:23:22.365 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Transformation Luftfeuchtigkeit String2Double': An error occurred during the script execution: Cannot assign a value in null context.

Ich habe verstanden für Chart benötige ich ein Item vom Type Number, daher die Transformation. Warum dies aber scheitert, da komme ich einfach nicht drauf. Hat einer eine Idee?

Besten danke.

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: String zu Number Transformation für Chart Item

Beitrag von udo1toni »

Warum schreibst Du den Wert überhaupt in einen String? Das mqtt Binding kann durchaus Zahlen direkt als number Channel zur Verfügung stellen.


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

cammymyra
Beiträge: 15
Registriert: 19. Jul 2019 10:43
Answers: 0

Re: String zu Number Transformation für Chart Item

Beitrag von cammymyra »

Weil die Arduino lib für MQTT nur Strings behandelt.

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: String zu Number Transformation für Chart Item

Beitrag von udo1toni »

Das spielt aber doch gar keine Rolle... mqtt Payloads sind immer Strings, egal, was sich im String befindet. das mqtt Binding macht die Übersetzung automatisch.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

cammymyra
Beiträge: 15
Registriert: 19. Jul 2019 10:43
Answers: 0

Re: String zu Number Transformation für Chart Item

Beitrag von cammymyra »

Ach so, jetzt habe ich verstanden was gemeint war.
Habe es angepasst und die Rule entfernt.

Leider wird das Chart trotzdem nicht befüllt :(

Zu Testzwecken nur für die Luftfeuchte geändert:

Code: Alles auswählen

Frame label="Luftfeuchtigkeit" {
Switch item=PeriodHum label="Zeiteinheit" icon="time" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Jahr"]
Chart item=HumidityTechnikUG period=h refresh=7200 visibility=[PeriodHum==0, PeriodHum=="Uninitialized"]
Chart item=HumidityTechnikUG period=D refresh=14400 visibility=[PeriodHum==1]
Chart item=HumidityTechnikUG period=W refresh=14400 visibility=[PeriodHum==2]
Chart item=HumidityTechnikUG period=Y refresh=14400 visibility=[PeriodHum==3]
}
Die Strategie:

Code: Alles auswählen

Strategies {
	everyMinute : "0 * * * * ?"
    default = everyChange
}

Items {
    NumberTemperatureTechnikUG : strategy = everyChange, everyMinute, restoreOnStartup
    HumidityTechnikUG : strategy = everyChange, everyMinute, restoreOnStartup
}
rrd4j.cfg

Code: Alles auswählen

<defname>.items=NumberTemperatureTechnikUG,HumidityTechnikUG
item:

Code: Alles auswählen

Number HumidityTechnikUG "relative Luftfeuchte [%d %%]" <humidity> { mqtt="<[broker:stat/UG/Technik/Humidity:state:default]" }

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: String zu Number Transformation für Chart Item

Beitrag von udo1toni »

Also, in rrd4j.cfg musst Du keine Konfiguration vornehmen.

Um den Fehler einzugrenzen, solltest Du geordnet vorgehen.

Zuerst mal: funktioniert die Anbindung mqtt -> openHAB korrekt? (d.h. kommen Werte in openHAb an?
Es wäre übrigens sinnvoll, das mqtt V2 Binding zu nutzen, spätestens, wenn Du irgendwann auf OH3 umstellen willst, sind V1 Bindings keine Option mehr.

Als nächster Schritt (wenn die rrd4j.cfg wieder in ihrem Ursprungszustand ist) wäre sicherzustellen, dass rrd4j Daten speichert. Ein erstes Indiz wäre, dass eine Datei mit dem Namen des Items und der Endung .rrd im Verzeichnis $OPENHAB_USERDATA/persistence/rrd4j/ angelegt wurde und das Zugriffsdatum immer die aktuelle Zeit enhält (weil ja minütlich Daten geschrieben werden).
Funktioniert das soweit, aber es werden dennoch keine Graphen gezeichnet, wäre eine Möglichkeit, die entsprechende Datei zu löschen und openHAB neu zu starten.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

cammymyra
Beiträge: 15
Registriert: 19. Jul 2019 10:43
Answers: 0

Re: String zu Number Transformation für Chart Item

Beitrag von cammymyra »

Ja, ich könnte zu mqtt v2 gehen, aber dazu bin ich bisher noch nicht gekommen. Es funktioniert bisher auch einwandfrei. Aber steht auf meiner ToDo Liste.

Ich habe mal deine Anweisungen Ausprobiert:
- rrd4j.conf wieder alles auskommentiert:

Code: Alles auswählen

# configure specific rrd properties for given items in this file.
# please refer to the documentation available at
# https://www.openhab.org/addons/persistence/rrd4j/
#
# default_numeric and default_other are internally defined defnames and are used as
# defaults when no other defname applies

#<defname>.def=[ABSOLUTE|COUNTER|DERIVE|GAUGE],<heartbeat>,[<min>|U],[<max>|U],<step>
#<defname>.archives=[AVERAGE|MIN|MAX|LAST|FIRST|TOTAL],<xff>,<steps>,<rows>
#TechnikUG.def=GAUGE,600,U,U,10
#TechnikUG.archives=AVERAGE,0.5,1,360:AVERAGE,0.5,6,10080:AVERAGE,0.5,90,36500:AVERAGE,0.5,360,43800:AVERAGE,0.5,8640,3650
#TechnikUG.items=TemperatureTechnikUG,HumidityTechnikUG
mqtt Binding liefert Daten:

Code: Alles auswählen

2021-02-27 10:06:52.808 [vent.ItemStateChangedEvent] - TemperatureTechnikUG changed from 22.00 to 22.10
2021-02-27 10:07:01.816 [vent.ItemStateChangedEvent] - HumidityTechnikUG changed from 64.70 to 64.80
2021-02-27 10:07:10.809 [vent.ItemStateChangedEvent] - HumidityTechnikUG changed from 64.80 to 64.70
2021-02-27 10:07:37.813 [vent.ItemStateChangedEvent] - TemperatureTechnikUG changed from 22.10 to 22.00
Die *.rrd files werden zyklisch geupdated:
  • HumidityTechnikUG.rrd
    TemperatureTechnikUG.rrd
Beide Files werden zyklisch geupdated im Minutentakt
Habe diese auch gelöscht, wurde dann relativ schnell wieder generiert.

Leider auch nach einem Neustart kein Erfolg. Immer noch keine Anzeige :(

Gibt es eine Möglichkeit zu sehen ob das Objekt Chart überhaupt irgend etwas empfängt?

cammymyra
Beiträge: 15
Registriert: 19. Jul 2019 10:43
Answers: 0

Re: String zu Number Transformation für Chart Item

Beitrag von cammymyra »

Endlich mein Problem gefunden.

service="rrd4j" hat gefehlt.

Code: Alles auswählen

					Frame label="Temperatur" {
						Switch item=PeriodTemp label="Zeiteinheit" icon="time" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Jahr"]
						Chart item=TemperatureTechnikUG  period=h service="rrd4j" refresh=7200 visibility=[PeriodTemp==0, PeriodTemp=="Uninitialized"]
						Chart item=TemperatureTechnikUG  period=D service="rrd4j" refresh=14400 visibility=[PeriodTemp==1]
						Chart item=TemperatureTechnikUG  period=W service="rrd4j" refresh=14400 visibility=[PeriodTemp==2]
						Chart item=TemperatureTechnikUG  period=Y service="rrd4j" refresh=14400 visibility=[PeriodTemp==3]
					}
Ich habe eine weitere Datenbank im System, daher war rrd4j nicht als Default hinterlegt.
Jetzt läufts.

Antworten