String to Split

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Thommy2012
Beiträge: 85
Registriert: 11. Apr 2018 09:55
Answers: 0

String to Split

Beitrag von Thommy2012 »

Hallo zusammen,

ich hole mir Via RSS Feed die Aktuellen Heizölpreise.

Jetzt möchte ich den String Aufschlüsseln ,das ich nur den Preis pro 100 Liter bekomme. Hier werde ich aber irgendwie nicht schlau. Am besten wäre es noch den String in Number umzuwandeln ,damit ich sie mir dann auf der Ulanzi Uhr anzeigen lassen kann.
Ich bräuchte quasi nur die frei Haus:109,14 als Number

Habe in der Klammer nach .split auch schon folgendes probiert ("\\|") , ("|")

Das wäre der code

Code: Alles auswählen

rule "String in Teilstring"
when
    Item testschalter changed to ON
then
    var String strTeil1 = RSSFeedLatestDescription1.state.toString.split(",").get(0)
    var String strTeil2 = RSSFeedLatestDescription1.state.toString.split(",").get(1)
    var String strTeil3 = RSSFeedLatestDescription1.state.toString.split(",").get(2)
    
    logInfo("strings","Teil1: {} Teil2: {} Teil3: {}",strTeil1,strTeil2,strTeil3)

    Anzeige1.postUpdate(strTeil1)
    Anzeige2.postUpdate(strTeil2)
    Anzeige3.postUpdate(strTeil3)
    
end
RSSFeedLatestDescription1 inhalt = Aktueller Preis f�r 3000 Liter Heiz�l im PLZ-Gebiet 36329 frei Haus: 109,14 Euro/100 Ltr. (inkl. MwSt.)<BR/>
<p>Hinweis: Preise f�r andere Produkte und Mengen, sowie f�r weitere
Abladestellen ermittelt Ihnen unser Preisrechner <A HREF="https://www.enxa.de/index.php?plz_selec ... enxa.de</A>


Anzeige 1 Inhalt =Aktueller Preis f�r 3000 Liter Heiz�l im PLZ-Gebiet 36329 frei Haus: 109


Anzeige 2 Inhalt = 14 Euro/100 Ltr. (inkl. MwSt.)<BR/>
<p>Hinweis: Preise f�r andere Produkte und Mengen

Anzeige 3 Inhalt =sowie f�r weitere
Abladestellen ermittelt Ihnen unser Preisrechner <A HREF="https://www.enxa.de/index.php?plz_selec ... enxa.de</A>


ich hoffe Ihr könnt mich ein bisschen unterstützen.

Danke

Harka
Beiträge: 310
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: String to Split

Beitrag von Harka »

Moin,
Teil doch nach ": " und nimm vom 2.Teil nach dem Splitten mittels " Euro" den 1. Teil. Nun noch das Komma durch einen Punkt ersetzen und als Zahl abspeichern (ggf. noch floatValue nutzen?) Hab es mal mit Javascipt erstellt, wobei ich dort sogar noch eine Abkürzung kenne. Dies hier sollte sich auch leicht in eine DSL-Rule umsetzen lassen. Am Ende Fehlerabsicherung nicht vergessen, falls der Feed nur Müll liefert o.ä.

Code: Alles auswählen

Eingang = 'Aktueller Preis f�r 3000 Liter Heiz�l im PLZ-Gebiet 36329 frei Haus: 109,14 Euro/100 Ltr. (inkl. MwSt.)<BR/> <p>Hinweis: Preise f�r andere Produkte und Mengen, sowie f�r weitere Abladestellen ermittelt Ihnen unser Preisrechner <A HREF="https://www.enxa.de/index.php?plz_selec ... enxa.de</A>';
strTeil1 = String(Eingang.split(': ')[1]);
strTeil2 = strTeil1.split(' Euro');
console.info((strTeil2[0]).replaceAll(',','.'));

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

Re: String to Split

Beitrag von udo1toni »

Also, der geposteten Text wird so sicherlich nicht als RSS-Feed kommen. Kannst Du mal ein konkretes Beispiel zeigen? Dazu musst Du bitte den Quelltext der RSS-Ausgabe als Code markiert hier einfügen. Zur Orientierung: Da dürfen eigentlich weder Umlaute noch exotische Sonderzeichen auftauchen, Zeichen wie � sollten also eher nicht vorkommen. Es ist natürlich möglich, dass die Schnittstelle schlecht programmiert ist :)

Per REGEX wäre mein erster Versuch:

Code: Alles auswählen

REGEX:.*Haus: (\d+,\d+) Euro/100 .*
Da openHAB das Komma als Punkt braucht, müsstest Du noch eine Transformation z.B. mit JS anhängen, die sich dann darum kümmert, das Komma zu ersetzen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: String to Split

Beitrag von peter-pan »

Ich hab mal mit deinen Daten (z.T. etwas abgewandelt) herum gespielt. Ich habe dabei, ähnlich wie Udo, mit der Umwandlung des Textes experimentiert. Allerdings mit "replace" und mit einem etwas abgespeckten Item "RSSFeedLatestDescription1"(da fehlt etwas an der Url - ich bekomme da einen Fehler).

Die DSL-Regel sieht dann so aus:

Code: Alles auswählen

rule "String in Teilstring"
when
    Item Dummy_6 changed to ON
then
    RSSFeedLatestDescription1.postUpdate("Aktueller Preis für 3000 Liter Heizöl im PLZ-Gebiet 36329 frei Haus: 109,14 Euro/100 Ltr. (inkl. MwSt.)<BR/>
<p>Hinweis: Preise für andere Produkte und Mengen, sowie für weitere
Abladestellen ermittelt Ihnen unser Preisrechner <A HREF" )
    var strTeil1 = RSSFeedLatestDescription1.state.toString.replace("Aktueller Preis","- Aktueller Preis").replace(" frei Haus: "," - frei Haus: - ").replace(" Euro/100 Ltr."," - Euro/100 Ltr. -").replace(",",".")
    var strTeil2 = strTeil1.split('-').get(3)
    var strTeil3 = Float::parseFloat(strTeil1.split('-').get(4))
    var strTeil4 = strTeil1.split('-').get(5)
    logInfo("strings","Teil1: {} ",strTeil1)
    logInfo("strings","Teil2: {} Teil3: {} Teil4: {}",strTeil2, strTeil3, strTeil4)

end
Das Item:

Code: Alles auswählen

String   RSSFeedLatestDescription1 "RSS-Feed"    // Item für Test-Rule
Als Ergebnis erhalte ich dann im Log:

Code: Alles auswählen

2023-08-29 22:19:15.789 [INFO ] [rg.openhab.core.model.script.strings] - Teil1: - Aktueller Preis für 3000 Liter Heizöl im PLZ-Gebiet 36329 - frei Haus: - 109.14 - Euro/100 Ltr. - (inkl. MwSt.)<BR/>
<p>Hinweis: Preise für andere Produkte und Mengen. sowie für weitere
Abladestellen ermittelt Ihnen unser Preisrechner <A HREF 

2023-08-29 22:19:15.792 [INFO ] [rg.openhab.core.model.script.strings] - Teil2:  frei Haus:  Teil3: 109.14 Teil4:  Euro/100 Ltr. 
Vielleicht hilft dir das weiter.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Thommy2012
Beiträge: 85
Registriert: 11. Apr 2018 09:55
Answers: 0

Re: String to Split

Beitrag von Thommy2012 »

udo1toni hat geschrieben: 29. Aug 2023 18:51 Also, der geposteten Text wird so sicherlich nicht als RSS-Feed kommen. Kannst Du mal ein konkretes Beispiel zeigen? Dazu musst Du bitte den Quelltext der RSS-Ausgabe als Code markiert hier einfügen. Zur Orientierung: Da dürfen eigentlich weder Umlaute noch exotische Sonderzeichen auftauchen, Zeichen wie � sollten also eher nicht vorkommen. Es ist natürlich möglich, dass die Schnittstelle schlecht programmiert ist :)

Per REGEX wäre mein erster Versuch:

Code: Alles auswählen

REGEX:.*Haus: (\d+,\d+) Euro/100 .*
Da openHAB das Komma als Punkt braucht, müsstest Du noch eine Transformation z.B. mit JS anhängen, die sich dann darum kümmert, das Komma zu ersetzen.
Also der code sieht so aus

Code: Alles auswählen

feed:feed:heizoel [URL="https://preisrechner.enxa.de/rss.php?zone=36329",refresh=60]

die ausgabe so

Code: Alles auswählen

Aktueller Preis f�r 3000 Liter Heiz�l im PLZ-Gebiet 36329 frei Haus: 109,14 Euro/100 Ltr. (inkl. MwSt.)<BR/>
            <p>Hinweis: Preise f�r andere Produkte und Mengen, sowie f�r weitere
            Abladestellen ermittelt Ihnen unser Preisrechner <A HREF="https://www.enxa.de/index.php?plz_select=36329">www.enxa.de</A></p>

Thommy2012
Beiträge: 85
Registriert: 11. Apr 2018 09:55
Answers: 0

Re: String to Split

Beitrag von Thommy2012 »

peter-pan hat geschrieben: 29. Aug 2023 22:21 Ich hab mal mit deinen Daten (z.T. etwas abgewandelt) herum gespielt. Ich habe dabei, ähnlich wie Udo, mit der Umwandlung des Textes experimentiert. Allerdings mit "replace" und mit einem etwas abgespeckten Item "RSSFeedLatestDescription1"(da fehlt etwas an der Url - ich bekomme da einen Fehler).

Die DSL-Regel sieht dann so aus:

Code: Alles auswählen

rule "String in Teilstring"
when
    Item Dummy_6 changed to ON
then
    RSSFeedLatestDescription1.postUpdate("Aktueller Preis für 3000 Liter Heizöl im PLZ-Gebiet 36329 frei Haus: 109,14 Euro/100 Ltr. (inkl. MwSt.)<BR/>
<p>Hinweis: Preise für andere Produkte und Mengen, sowie für weitere
Abladestellen ermittelt Ihnen unser Preisrechner <A HREF" )
    var strTeil1 = RSSFeedLatestDescription1.state.toString.replace("Aktueller Preis","- Aktueller Preis").replace(" frei Haus: "," - frei Haus: - ").replace(" Euro/100 Ltr."," - Euro/100 Ltr. -").replace(",",".")
    var strTeil2 = strTeil1.split('-').get(3)
    var strTeil3 = Float::parseFloat(strTeil1.split('-').get(4))
    var strTeil4 = strTeil1.split('-').get(5)
    logInfo("strings","Teil1: {} ",strTeil1)
    logInfo("strings","Teil2: {} Teil3: {} Teil4: {}",strTeil2, strTeil3, strTeil4)

end
Das Item:

Code: Alles auswählen

String   RSSFeedLatestDescription1 "RSS-Feed"    // Item für Test-Rule
Als Ergebnis erhalte ich dann im Log:

Code: Alles auswählen

2023-08-29 22:19:15.789 [INFO ] [rg.openhab.core.model.script.strings] - Teil1: - Aktueller Preis für 3000 Liter Heizöl im PLZ-Gebiet 36329 - frei Haus: - 109.14 - Euro/100 Ltr. - (inkl. MwSt.)<BR/>
<p>Hinweis: Preise für andere Produkte und Mengen. sowie für weitere
Abladestellen ermittelt Ihnen unser Preisrechner <A HREF 

2023-08-29 22:19:15.792 [INFO ] [rg.openhab.core.model.script.strings] - Teil2:  frei Haus:  Teil3: 109.14 Teil4:  Euro/100 Ltr. 
Vielleicht hilft dir das weiter.


Hat perfekt geklappt. Das hätte ich nie hinbekommen. Vielen Dank Peter-Pan

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

Re: String to Split

Beitrag von udo1toni »

Nur zur Ergänzung...

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel> 

	<title>enxa.de - das innovative Energieportal</title> 
	<link>https://www.enxa.de</link> 
	<description>Teuer heizen ist out. Unser Preissystem ermittelt für Sie ganz unkompliziert und kostenlos den günstigsten enxa-Partnerhändler Ihrer Region. Nutzen Sie das große Händlernetzwerk, um günstiger zu heizen.</description> 
	<language>de-de</language> 
	<pubDate>Sun, 01 May 2011 00:00:01 +0200</pubDate>
	<lastBuildDate>Wed, 30 Aug 2023 15:15:30 +0200</lastBuildDate>
	<atom:link href="https://www.enxa.de/rss.php?zone=36329" rel="self" type="application/rss+xml" />
	<docs>https://www.enxa.de/rss.php</docs>
	<generator>Enxa Rss Feeder</generator>
	<managingEditor>info@enxa.de (Enxa GmbH)</managingEditor>
	<webMaster>info@enxa.de (Enxa GmbH)</webMaster>

	     
			<item> 
				<title>enxa-Heizölpreis für 30. August 2023 00:00 Uhr im PLZ-Gebiet 36329</title>     
				<link>https://www.enxa.de/rss.php?zone=36329</link>     
				<pubDate>Wed, 30 Aug 2023 00:00:36 +0200</pubDate> 
				<guid isPermaLink="false">preisfeed40097</guid>
				<description  xml:space="preserve">
				<![CDATA[
					
			Aktueller Preis für 3000 Liter Heizöl im PLZ-Gebiet 36329 frei Haus: 109,14 Euro/100 Ltr. (inkl. MwSt.)<BR/>
			<p>Hinweis: Preise für andere Produkte und Mengen, sowie für weitere
			Abladestellen ermittelt Ihnen unser Preisrechner <A HREF="https://www.enxa.de/index.php?plz_select=36329">www.enxa.de</A></p>
		
				]]>
				</description> 
			</item> 
		  

</channel> 
</rss> 
 
DAS ist was angeliefert wird...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: String to Split

Beitrag von peter-pan »

...freut mich das es geklappt hat.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Antworten