<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Dipl.-Ing. Michael J. Raber</title>
	<atom:link href="https://michael-raber.de/feed" rel="self" type="application/rss+xml" />
	<link>https://michael-raber.de/</link>
	<description>Technology Blog</description>
	<lastBuildDate>Mon, 17 Apr 2023 20:02:26 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://michael-raber.de/wp-content/uploads/2023/02/cropped-mjr_logo_gmbh_150x150px_web-32x32.png</url>
	<title>Dipl.-Ing. Michael J. Raber</title>
	<link>https://michael-raber.de/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Luftfeuchte und Temperatur mit Arduino, DHT11 und Anzeigemodul</title>
		<link>https://michael-raber.de/luftfeuchte-und-temperatur-mit-arduino-und-dht11-mit-anzeigemodul</link>
					<comments>https://michael-raber.de/luftfeuchte-und-temperatur-mit-arduino-und-dht11-mit-anzeigemodul#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Mon, 17 Apr 2023 19:52:58 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<guid isPermaLink="false">https://michael-raber.de/?p=383</guid>

					<description><![CDATA[<p>In Vorbereitung eines größeren Projekts &#8211; die Spannung steigt &#8211; hab ich mit verschiedenen Grundlagen-Themen beschäftigt und hier ist das Ergebnis: Mit einem Arduino Mega 2560, einem 16&#215;2 LCD-Display mit ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/luftfeuchte-und-temperatur-mit-arduino-und-dht11-mit-anzeigemodul">Luftfeuchte und Temperatur mit Arduino, DHT11 und Anzeigemodul</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In Vorbereitung eines größeren Projekts &#8211; die Spannung steigt &#8211; hab ich mit verschiedenen Grundlagen-Themen beschäftigt und hier ist das Ergebnis:</p>
<p>Mit einem Arduino Mega 2560, einem 16&#215;2 LCD-Display mit I2C-Ansteuerung, sowie mit einem DHT11-Sensor für Luftfeuchte und Temperatur habe ich eine minimalistische Anzeige realisiert.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-389 size-large" src="https://michael-raber.de/wp-content/uploads/2023/04/IMG_0396-1024x768.jpg" alt="" width="800" height="600" srcset="https://michael-raber.de/wp-content/uploads/2023/04/IMG_0396-1024x768.jpg 1024w, https://michael-raber.de/wp-content/uploads/2023/04/IMG_0396-300x225.jpg 300w, https://michael-raber.de/wp-content/uploads/2023/04/IMG_0396-768x576.jpg 768w, https://michael-raber.de/wp-content/uploads/2023/04/IMG_0396-1536x1152.jpg 1536w, https://michael-raber.de/wp-content/uploads/2023/04/IMG_0396-2048x1536.jpg 2048w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>Das Foto zeigt alle Komponenten:</p>
<ul>
<li>Arduino Mega 2560 mit Stromversorgung (und Programmierung) via USB</li>
<li>16&#215;2 LCD-Display mit I2C-Ansteuerung basierend auf LCM1602</li>
<li>DHT11-Sensor für Luftfeuchte und Temparatur mit 10kΩ-Wiederstand zu beschalten</li>
</ul>
<p>So sieht die Beschaltung aus:</p>
<ul>
<li>Der <strong>DHT11</strong>-Sensor wird zwischen Pin 1(links) und Pin 2 mit einem 10kΩ-Widerstand überbrückt.</li>
<li>Pin 1 wird dann auf 5V am Arduino geschaltet.</li>
<li>Pin 2 geht auf A2 am Arduino (oder einen anderen Pin, dazu muss das Programm angepasst werden.</li>
<li>Pin 3 bleibt frei</li>
<li>Pin 4 geht auf GND</li>
</ul>
<p>Das <strong>Display</strong> wird beim Arduino Mega 2560 jeweils mit den analogen Pins beschaltet. Bei anderen Arduino-Modellen muss hier ggfls. eine andere Beschaltung gewählt werden.</p>
<ul>
<li>5V auf 5V (bzw. VCC genannt am Display)</li>
<li>GND auf GND</li>
<li>SCL and SCL (Clock)</li>
<li>SDA an SDA (Signal)</li>
</ul>
<p><img decoding="async" class="size-medium wp-image-386 aligncenter" src="https://michael-raber.de/wp-content/uploads/2023/04/Steckplatine-272x300.png" alt="" width="272" height="300" srcset="https://michael-raber.de/wp-content/uploads/2023/04/Steckplatine-272x300.png 272w, https://michael-raber.de/wp-content/uploads/2023/04/Steckplatine.png 630w" sizes="(max-width: 272px) 100vw, 272px" /></p>
<p>Jetzt fehlt noch der Code für den Arduino:</p>
<div>
<pre><span style="font-size: 8pt;">#include &lt;Wire.h&gt;</span>
<span style="font-size: 8pt;">#include &lt;LiquidCrystal_I2C.h&gt;  // Library fuer LCD</span>
<span style="font-size: 8pt;">#include &lt;DHT.h&gt; // Library für DHT11</span>
<span style="font-size: 8pt;">#define DHTPIN A2 // DHT11 an PIN 2  </span>
<span style="font-size: 8pt;">#define DHTTYPE DHT11 // Sensortyp</span>

<span style="font-size: 8pt;">DHT dht(DHTPIN, DHTTYPE);  //Der Sensor wird ab jetzt mit „dth“ angesprochen</span>

<span style="font-size: 8pt;">LiquidCrystal_I2C lcd(0x27, 16, 2);  // I2C Addresse 0x27, 16x2 </span>

<span style="font-size: 8pt;">void setup() {</span>
<span style="font-size: 8pt;">  lcd.init(); // LCD initialisieren</span>
<span style="font-size: 8pt;">  lcd.backlight(); //Hintergrundbeleuchtung einschalten</span>
<span style="font-size: 8pt;">  lcd.setCursor(0, 0); // Cursor oben links</span>
<span style="font-size: 8pt;">  lcd.println("Temp \337C  Luftf % "); // Überschrift setzen mit codiertem Grad-Zeichen</span>
<span style="font-size: 8pt;">  lcd.setCursor(0, 1); // Cursor in zweite Zeile</span>
<span style="font-size: 8pt;">  lcd.print("Init Sensor"); // Warten anzeigen</span>
<span style="font-size: 8pt;">  Serial.begin(9600); // Serielle Verbindung initiieren</span>
<span style="font-size: 8pt;">  dht.begin(); // Sensor starten</span>
<span style="font-size: 8pt;">  delay(2000); //Zwei Sekunden warten bis der Sensor bereit ist</span>
<span style="font-size: 8pt;">}</span>

<span style="font-size: 8pt;">void loop() {</span>
<span style="font-size: 8pt;">  lcd.setCursor(0, 0); // Cursor oben links</span>
<span style="font-size: 8pt;">  lcd.println("Temp \337C  Luftf % "); // Überschrift setzen mit codiertem Grad-Zeichen</span>
<span style="font-size: 8pt;">  lcd.setCursor(0, 1); // Cursor in zweite Zeile</span>
<span style="font-size: 8pt;">  delay(1000);  // Eine Sekunde warten bis zur nächsten Messung</span>
<span style="font-size: 8pt;">  float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und speichern</span>
<span style="font-size: 8pt;">  float Temperatur = dht.readTemperature(); //die Temperatur auslesen und speichern</span>
<span style="font-size: 8pt;">  lcd.print(" "+ String(Temperatur) + "    " + String(Luftfeuchtigkeit) +"   "); // Ausgabe</span>
<span style="font-size: 8pt;">}</span></pre>
</div>
<p>Zur richtigen Funktion müssen die entsprechenden Libraries passend zu den Hardware-Komponenten hochgeladen werden.</p>
<p>&nbsp;</p>
<p>Der Beitrag <a href="https://michael-raber.de/luftfeuchte-und-temperatur-mit-arduino-und-dht11-mit-anzeigemodul">Luftfeuchte und Temperatur mit Arduino, DHT11 und Anzeigemodul</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/luftfeuchte-und-temperatur-mit-arduino-und-dht11-mit-anzeigemodul/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Zugriff auf MongoDB mittels C#</title>
		<link>https://michael-raber.de/mongodb-und-c-sharp</link>
					<comments>https://michael-raber.de/mongodb-und-c-sharp#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Mon, 06 Feb 2023 19:28:55 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=306</guid>

					<description><![CDATA[<p>Im folgenden Beitrag wird ein rudimentärer Zugriff auf eine MongoDB-Datenbank mittels C# beschrieben. Ich denke anhand der gegebenen Informationen, kann der informierte Leser weitere Schlüsse ziehen und komplexere Dinge realisieren. ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/mongodb-und-c-sharp">Zugriff auf MongoDB mittels C#</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Im folgenden Beitrag wird ein rudimentärer Zugriff auf eine MongoDB-Datenbank mittels C# beschrieben. Ich denke anhand der gegebenen Informationen, kann der informierte Leser weitere Schlüsse ziehen und komplexere Dinge realisieren. Bei Fragen: bitte gerne Kommentare Hinterlassen.</p>



<p>Im ersten Schritt müssen die entsprechenden Treiber für MongoDB geladen werden. Dazu nutzt man den NuGet-Paketmanager, der in VisualStudio enthalten ist (sofern man ihn bereits installiert hat):</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://michael-raber.de/wp-content/uploads/2023/02/Mongo1.png" alt="" class="wp-image-308" width="840" height="279" srcset="https://michael-raber.de/wp-content/uploads/2023/02/Mongo1.png 842w, https://michael-raber.de/wp-content/uploads/2023/02/Mongo1-300x100.png 300w, https://michael-raber.de/wp-content/uploads/2023/02/Mongo1-768x255.png 768w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption class="wp-element-caption">MongoDB-Treiber-Liste</figcaption></figure>



<p>Im nächsten Schritt sind dann die folgenden Komponenten im Quellcode notwendig. Zunächst der Verweis auf den Treiber:</p>



<pre class="wp-block-code"><code>using MongoDB.Driver;
using MongoDB.Bson;</code></pre>



<p>Die URI der MongoDB-Instanz mit der gearbeitet werden soll, wird in einer Umgebungsvariable abgelegt:</p>



<pre class="wp-block-code"><code>Environment.SetEnvironmentVariable("MONGODB_URI", "mongodb://IP-Adresse:27017/?retryWrites=true&amp;w=majority");</code></pre>



<p>Damit sind alle Voraussetzungen gegeben, um mit den MongoDB-Daten zu arbeiten. Im folgenden Beispiel-Code werden Daten von einer Collection zur anderen kopiert:</p>



<pre class="wp-block-code"><code>// Der Connection-String wird aus der Umgebungsvariable gelesen
           var connectionString = Environment.GetEnvironmentVariable("MONGODB_URI");

// Falls nicht vorhanden, endet das Programm mit Fehler
           if (connectionString == null)
            {
                Console.WriteLine("You must set your 'MONGODB_URI' environmental variable. See\n\t https://www.mongodb.com/docs/drivers/go/current/usage-examples/#environment-variable");
                Environment.Exit(0);
            }

// Ein neuer MongoDB-Client wird auf Basis des Connection-String (auf Datenbank "default" definiert und eine Collection "collection_from" daraus ausgewählt
            var client = new MongoClient(connectionString);
            var collection = client.GetDatabase("default").GetCollection&lt;BsonDocument&gt;("collection_from");

// Mit einem einfachen Filter werden Datensätze/Dokumente ausgewählt, die gelesen werden sollen. Hier Dokumente mit "Test" in der Eigenschaft "dataset"
            var filter = Builders&lt;BsonDocument&gt;.Filter.eq("dataset", "Test");
// Und die Dokumente werden gezählt
            var documentcount = collection.Find(filter).CountDocuments();


// Die Dokumente werden in eine Liste geladen
            var DocList = collection.Find(filter).ToList();

// Und die Ziel-Collection definiert
            var collection2 = client.GetDatabase("default").GetCollection&lt;BsonDocument&gt;("collection_to");

// Die einzelnen Dokumente werden in einer Schleife in die Ziel-Collection geschrieben
            for (var i = 0; i &lt; DocList.Count; i++)
            {
                Console.WriteLine(i + " von " + documentcount + ": "  +DocList&#091;i]);
                collection2.InsertOne(DocList&#091;i]);
                ;
            }</code></pre>



<p>Damit sind wir schon am Ende eines einfachen Beispiels. Die Idee dahinter war auch ein einfacher Performance-Test. Meine MongoDB läuft in einem Docker-Container auf einer kleinen QNAP. Trotz einer knappen Million Dokumente war das ganze in einer vertretbaren Zeit erledigt. Das ganze diente zur Vorbereitung eines Proof-of-concept für ein künftiges Projekt der <a href="https://mjr.gmbh" target="_blank" rel="noreferrer noopener">MJR GmbH</a> und kann somit als erfolgreich abgehakt werden.</p>
<p>Der Beitrag <a href="https://michael-raber.de/mongodb-und-c-sharp">Zugriff auf MongoDB mittels C#</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/mongodb-und-c-sharp/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Einfache Alexa-Sprachausgabe mit NodeRed</title>
		<link>https://michael-raber.de/einfache-sprachausgabe-auf-alexa-mit-node-red</link>
					<comments>https://michael-raber.de/einfache-sprachausgabe-auf-alexa-mit-node-red#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Fri, 06 Jan 2023 13:34:13 +0000</pubDate>
				<category><![CDATA[Amazon Alexa]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=288</guid>

					<description><![CDATA[<p>Im folgenden wird beschrieben, wie man auf einfache Weise eine Sprachausgabe auf Alexa aus Node Red konfiguriert. Basis dafür ist der Node node-red-contrib-alexa-remote2. Ansonsten werden keine weiteren zusätzlichen Nodes benötigt. ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/einfache-sprachausgabe-auf-alexa-mit-node-red">Einfache Alexa-Sprachausgabe mit NodeRed</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-left">Im folgenden wird beschrieben, wie man auf einfache Weise eine Sprachausgabe auf Alexa aus Node Red konfiguriert. Basis dafür ist der Node <a href="https://flows.nodered.org/node/node-red-contrib-alexa-remote2" target="_blank" rel="noreferrer noopener nofollow">node-red-contrib-alexa-remote2</a>. Ansonsten werden keine weiteren zusätzlichen Nodes benötigt.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="410" height="103" src="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-2.png" alt="Alexa Sprachausgabe mit Node Red" class="wp-image-293" srcset="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-2.png 410w, https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-2-300x75.png 300w" sizes="(max-width: 410px) 100vw, 410px" /></figure></div>


<p>Im Screenshot sieht man zunächst das Test-Setup um einen fixen Text auszugeben. Mit einem inject-Node wird die Ausgabe getriggert. Die Ausgabe selbst wird mit einem Node <strong><em>alexa-remote-routine</em></strong> realisiert:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="462" height="152" src="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-5.png" alt="Alexa Sprachausgabe mit Node Red" class="wp-image-297" srcset="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-5.png 462w, https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-5-300x99.png 300w" sizes="(max-width: 462px) 100vw, 462px" /></figure></div>


<p>Dieser Node muss nun konfiguriert werden. Hier werden einerseits Angaben zur Sprachausgabe benötigt. Vorher muss aber auch Alexa mit Node Red bekannt gemacht werden. Hier sind die Properties mit dem vorausgefüllten Feldern:<br>&#8211; Der Name kann frei vergeben werden<br>&#8211; Der Amazon Account muss zuvor angelegt werden. Infos dazu weiter unten<br>&#8211; Dann muss als Aktion <strong><em>Speak</em></strong> ausgewählt werden. Hier sind aber noch viele andere Optionen möglich<br>&#8211; <strong><em>Regular</em></strong> bedeutet eine normale Ansage, bei <strong><em>Announcement</em></strong> wird vorher noch ein Signalton abgespielt<br>&#8211; Dann muss natürlich der zu sprechende Text angegeben werden. In diesem einfachen Beispiel ist es ein fixer Text, aber über <strong><em>msg.payload </em></strong>kann natürlich auch ein variabler Text generiert werden.<br>&#8211; Im letzten Feld ist dann noch anzugeben auf welchem Gerät die Sprachausgabe erfolgen soll. Die verfügbaren Geräte werden über den Amazon Account, den wir als nächstes konfigurieren, zur Verfügung gestellt.</p>



<p></p>



<p></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="554" height="438" src="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-3.png" alt="Alexa Sprachausgabe mit Node Red" class="wp-image-294" srcset="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-3.png 554w, https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-3-300x237.png 300w" sizes="(max-width: 554px) 100vw, 554px" /></figure></div>


<p>So sieht der fertig konfigurierte Amazon-Account aus:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="511" height="795" src="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-4.png" alt="Alexa Sprachausgabe mit Node Red" class="wp-image-295" srcset="https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-4.png 511w, https://michael-raber.de/wp-content/uploads/2023/01/Alexa-Node-Red-4-193x300.png 193w" sizes="(max-width: 511px) 100vw, 511px" /></figure></div>


<p>Auch hier wird zunächst ein Name angegeben. Die weiteren Felder können für deutsche Accounts so übernommen werden. Lediglich die IP-Adresse muss auf die Adresse des Node Red Servers angepasst werden. Die Details sind wieder <a href="https://flows.nodered.org/node/node-red-contrib-alexa-remote2" target="_blank" rel="noreferrer noopener nofollow">hier</a> zu finden.</p>
<p>Der Beitrag <a href="https://michael-raber.de/einfache-sprachausgabe-auf-alexa-mit-node-red">Einfache Alexa-Sprachausgabe mit NodeRed</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/einfache-sprachausgabe-auf-alexa-mit-node-red/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Werkzeughalter für Anycubic i3 Mega S</title>
		<link>https://michael-raber.de/werkzeughalter-anycubic-i3-mega</link>
					<comments>https://michael-raber.de/werkzeughalter-anycubic-i3-mega#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Wed, 01 Sep 2021 21:30:54 +0000</pubDate>
				<category><![CDATA[3D-Druck]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=230</guid>

					<description><![CDATA[<p>Mit diesem Blog stelle ich mein Design für einen Werkzeughalter für den Anycubic i3 Mega zur Verfügung. Alle Informationen, die hier zur Verfügung gestellt werden, sind besten Wissens und Gewissens ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/werkzeughalter-anycubic-i3-mega">Werkzeughalter für Anycubic i3 Mega S</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Mit diesem Blog stelle ich mein Design für einen Werkzeughalter für den Anycubic i3 Mega zur Verfügung. Alle Informationen, die hier zur Verfügung gestellt werden, sind besten Wissens und Gewissens aufbereitet. Allerdings übernehme ich keine Garantie für die Funktion oder irgendwelche Probleme oder Schäden. Um einen ersten Eindruck zu vermitteln, hier ein paar Fotos der Konstruktion und des Endprodukts. Neben den Werkzeugen habe ich noch ein wenig Platz für Kleinteile geschaffen, der für Klemmen fürs Filament und die Ersatz-Führungen für den Extruder gedacht sind. Ich habe den Halter mit doppelseitigem Klebeband montiert und es hält schon eine Weile ohne Probleme. Wer auf Nummer Sicher gehen will kann zusätzlich noch Schrauben verwenden. Zwei Bohrungen dafür sind vorgesehen.</p>



<div class="wp-block-jetpack-slideshow aligncenter" data-autoplay="true" data-delay="3" data-effect="slide"><div class="wp-block-jetpack-slideshow_container swiper-container"><ul class="wp-block-jetpack-slideshow_swiper-wrapper swiper-wrapper"><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" decoding="async" width="994" height="772" alt="" class="wp-block-jetpack-slideshow_image wp-image-233" data-id="233" src="https://michael-raber.de/wp-content/uploads/2021/09/Fusion-360-Skizze-1.png" srcset="https://michael-raber.de/wp-content/uploads/2021/09/Fusion-360-Skizze-1.png 994w, https://michael-raber.de/wp-content/uploads/2021/09/Fusion-360-Skizze-1-300x233.png 300w, https://michael-raber.de/wp-content/uploads/2021/09/Fusion-360-Skizze-1-768x596.png 768w" sizes="(max-width: 994px) 100vw, 994px" /><figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">Fusion 360</figcaption></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" decoding="async" width="755" height="455" alt="Anycubic i3 Mega Werkzeughalter Cura" class="wp-block-jetpack-slideshow_image wp-image-234" data-id="234" src="https://michael-raber.de/wp-content/uploads/2021/09/Cura.png" srcset="https://michael-raber.de/wp-content/uploads/2021/09/Cura.png 755w, https://michael-raber.de/wp-content/uploads/2021/09/Cura-300x181.png 300w" sizes="(max-width: 755px) 100vw, 755px" /><figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">Cura</figcaption></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" decoding="async" width="1024" height="353" alt="Anycubic i3 Mega Werkzeughalter" class="wp-block-jetpack-slideshow_image wp-image-236" data-id="236" src="https://michael-raber.de/wp-content/uploads/2021/09/Foto-1024x353.jpg" srcset="https://michael-raber.de/wp-content/uploads/2021/09/Foto-1024x353.jpg 1024w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-300x103.jpg 300w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-768x265.jpg 768w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-1536x530.jpg 1536w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-2048x706.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">Das Endprodukt &#8230;</figcaption></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" decoding="async" width="1024" height="768" alt="Anycubic i3 Mega Werkzeughalter mit Werkzeugen" class="wp-block-jetpack-slideshow_image wp-image-235" data-id="235" src="https://michael-raber.de/wp-content/uploads/2021/09/Foto-mit-Werkzeugen-1024x768.jpg" srcset="https://michael-raber.de/wp-content/uploads/2021/09/Foto-mit-Werkzeugen-1024x768.jpg 1024w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-mit-Werkzeugen-300x225.jpg 300w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-mit-Werkzeugen-768x576.jpg 768w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-mit-Werkzeugen-1536x1152.jpg 1536w, https://michael-raber.de/wp-content/uploads/2021/09/Foto-mit-Werkzeugen-2048x1536.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">&#8230; mit Werkzeugen</figcaption></figure></li></ul><a class="wp-block-jetpack-slideshow_button-prev swiper-button-prev swiper-button-white" role="button"></a><a class="wp-block-jetpack-slideshow_button-next swiper-button-next swiper-button-white" role="button"></a><a aria-label="Pause Slideshow" class="wp-block-jetpack-slideshow_button-pause" role="button"></a><div class="wp-block-jetpack-slideshow_pagination swiper-pagination swiper-pagination-white"></div></div></div>



<p>Das ganze Projekt kann man Schritt für Schritt nachvollziehen, von der Konstruktion in Fusion 360, über die STL-Datei bis zum Cura-Projekt. Bitte beachten: man muss das Bauteil schräg in den Bauraum legen, ansonsten passt es nicht.</p>
<p>Hier findest Du die notwendigen Dateien zum Download (natürlich hier insbesondere ohne Gewähr):</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link" href="https://michael-raber.de/wp-content/uploads/2021/09/Anycubic-Werkzeughalter.zip" target="_blank" rel="noreferrer noopener">Hier klicken zum Download aller Projektdateien (Fusion 360, STL und Cura-Projekt)</a></div>
</div>



<p></p>
<p>Der Beitrag <a href="https://michael-raber.de/werkzeughalter-anycubic-i3-mega">Werkzeughalter für Anycubic i3 Mega S</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/werkzeughalter-anycubic-i3-mega/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ERP-Systeme &#8211; Wichtig zu wissen&#8230;</title>
		<link>https://michael-raber.de/erp-systeme</link>
					<comments>https://michael-raber.de/erp-systeme#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Fri, 27 Aug 2021 13:16:37 +0000</pubDate>
				<category><![CDATA[Professional IT und Business]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=221</guid>

					<description><![CDATA[<p>Dieser Blogbeitrag beschäftigt sich mit ERP-Systemen, gibt einen Überblick was deren Aufgabe ist, was man dazu wissen muss und verweist auf weiterführende Informationen. Was bedeutet ERP? ERP steht für Enterprise ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/erp-systeme">ERP-Systeme &#8211; Wichtig zu wissen&#8230;</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Dieser Blogbeitrag beschäftigt sich mit ERP-Systemen, gibt einen Überblick was deren Aufgabe ist, was man dazu wissen muss und verweist auf weiterführende Informationen.</p>



<h2 class="wp-block-heading">Was bedeutet ERP?</h2>



<p>ERP steht für <strong>Enterprise Resource Planning</strong> und damit für eine Software, die eine vollumfängliche Planung aller Ressourcen im Unternehmen ermöglicht. </p>
<p>Es ist nicht ganz einfach bei der Auswahl eines ERP-Systems die richtige Wahl zu treffen. Verschiedene Aspekte sind dazu zu beachten. Der Blog-Beitrag der <a href="https://mjr.gmbh" target="_blank" rel="noopener">MJR GmbH</a> zeigt ein wichtiges Entscheidungskriterium: <a href="https://mjr.gmbh/blog/erp-onpremise-vs-cloud/" target="_blank" rel="noopener">OnPremise (d.h. lokal installiert) oder in der Cloud</a> (also &#8222;gemietet beim Anbieter&#8220;). In einem weiteren Beitrag werden <a href="https://mjr.gmbh/blog/opensource-erp-wegweiser-zum-richtigen-erp-system/" target="_blank" rel="noopener">kostenlose ERP-Systeme</a> (sogenannte Open Source ERP-Systeme) behandelt.</p>
<p>Der Beitrag <a href="https://michael-raber.de/erp-systeme">ERP-Systeme &#8211; Wichtig zu wissen&#8230;</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/erp-systeme/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>XML-Dokumente mittels SQL erstellen</title>
		<link>https://michael-raber.de/xml-dokumente-mittels-sql-erstellen</link>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Thu, 03 Jun 2021 20:50:41 +0000</pubDate>
				<category><![CDATA[IBM i (AS/400)]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=198</guid>

					<description><![CDATA[<p>In einigen wenigen Schritten können Sie Ihre Tabelleninhalte mithilfe von SQL ins XML-Format übersetzen.  Dazu benötigt man lediglich zwei SQL-Statements und ein CL-Kommando. Wir beginnen zunächst mit den Vorarbeiten um ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/xml-dokumente-mittels-sql-erstellen">XML-Dokumente mittels SQL erstellen</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h1 class="has-text-align-center wp-block-heading"><span style="font-size: 16px;">In einigen wenigen Schritten können Sie Ihre Tabelleninhalte mithilfe von SQL ins XML-Format übersetzen.</span></h1>



<p><img loading="lazy" decoding="async" class="aligncenter wp-image-204" src="https://michael-raber.de/wp-content/uploads/2021/06/xmlwithsql-300x200.png" alt="XML aus SQL erstellt" width="700" height="467" srcset="https://michael-raber.de/wp-content/uploads/2021/06/xmlwithsql-300x200.png 300w, https://michael-raber.de/wp-content/uploads/2021/06/xmlwithsql.png 700w" sizes="(max-width: 700px) 100vw, 700px" /></p>



<div>
<p> Dazu benötigt man lediglich zwei SQL-Statements und ein CL-Kommando. Wir beginnen zunächst mit den Vorarbeiten um unsere Beispiel-Tabelle zu erstellen. Sie besteht aus drei Feldern und für unser Beispiel schreiben wir gleich drei Datensätze:</p>
<pre>CREATE TABLE qtemp.TESTXML (FIELD1 CHAR (10 ) , FIELD2 CHAR (256 ), FIELD3 NUMERIC (10 , 3));
INSERT INTO qtemp.TESTXML VALUES('Record1', 'Description1', 1);
INSERT INTO qtemp.TESTXML VALUES('Record2', 'Description2', 2);
INSERT INTO qtemp.TESTXML VALUES('Record3', 'Description3', 3);</pre>
<p>Damit erhalten wir unsere Beispiel-Daten, die wir nun in XML umsetzen wollen.</p>
<table border="3">
<tbody>
<tr>
<td>Record1</td>
<td>Description1</td>
<td>1.000</td>
</tr>
<tr>
<td>Record2</td>
<td>Description2</td>
<td>2.000</td>
</tr>
<tr>
<td>Record3</td>
<td>Description3</td>
<td>3.000</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Dazu erstellen wir eine temporäre Tabelle, die unsere XML-Daten aufnimmt:</p>
<pre>create table qtemp.myxml as (select xmlserialize( 
                                    xmlelement(NAME "MyXMLRecord", xmlelement(NAME "RecNbr", field3), 
                                    xmlelement(NAME "RecordName", trim(field1)),
                                    xmlelement(NAME "RecordDescription", trim(field2))) 
                              as char(1024)) as "XMLResult" from qtemp.testxml) with data;

</pre>
<p>Mit diesem SQL-Statement stehen unsere Daten in einer Tabelle und wir müssen sie lediglich in eine Textdatei im IFS ausgeben. Dazu dient ein CL-Kommando:</p>
<pre>CPYTOIMPF FROMFILE(MYXML) TOSTMF('/myxml.xml') MBROPT(*REPLACE) FROMCCSID(1252) RCDDLM(*CRLF) STRDLM(*NONE)</pre>
<p>Damit steht der Inhalt in XML-Format in einer Datei wie folgt zur Verfügung:</p>
<pre>&lt;MyXMLRecord&gt;&lt;RecNbr&gt;1.000&lt;/RecNbr&gt;&lt;RecordName&gt;Record1&lt;/RecordName&gt;&lt;RecordDescription&gt;Description1&lt;/RecordDescription&gt;&lt;/MyXMLRecord&gt; 
&lt;MyXMLRecord&gt;&lt;RecNbr&gt;2.000&lt;/RecNbr&gt;&lt;RecordName&gt;Record2&lt;/RecordName&gt;&lt;RecordDescription&gt;Description2&lt;/RecordDescription&gt;&lt;/MyXMLRecord&gt; 
&lt;MyXMLRecord&gt;&lt;RecNbr&gt;3.000&lt;/RecNbr&gt;&lt;RecordName&gt;Record3&lt;/RecordName&gt;&lt;RecordDescription&gt;Description3&lt;/RecordDescription&gt;&lt;/MyXMLRecord&gt;</pre>
<p>Auch die Darstellung in XML-Tabellenform ist möglich, dazu können die jeweiligen Schlüsselworte &#8222;tr&#8220; und &#8222;td&#8220; für die Zeile beziehungsweise für die Spalte verwendet werden.</p>
<pre class="displaycode">select <strong>xmlserialize</strong>(
  content <strong>xmlelement</strong>(
    name "tr",
    xmlelement(name "td", field1),
    xmlelement(name "td", field2),
    xmlelement(name "td", field3),
  )
  as clob(120)
) as "result"
from qtemp.myxml</pre>
<p>Das Ergebnis sieht dann wie folgt aus:</p>
<pre>&lt;tr&gt;&lt;td&gt;Record1&lt;/td&gt;&lt;td&gt;Description1&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Record2&lt;/td&gt;&lt;td&gt;Description2&lt;/td&gt;&lt;td&gt;2.000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Record3&lt;/td&gt;&lt;td&gt;Description3&lt;/td&gt;&lt;td&gt;3.000&lt;/td&gt;&lt;/tr&gt;</pre>
<p>Alternativ kann dasselbe Ergebnis erzielt werden, indem die XMLFOREST-Funktion verwendet wird. Diese funktioniert wie eine Ansammlung von xmlelement-Funktionen und kann dementsprechend angewandt werden.</p>
<pre class="displaycode">select <strong>xmlserialize</strong>(
  content <strong>xmlelement</strong>(
    name "tr",
    xmlforest(
      field1 as "td",
      field2 as "td",
      field3 as "td"
    )
  )
  as clob(120)
) as "result"
from qtemp.myxml</pre>
<p>Möchten wir den Knoten nun zusätzlich noch Attribute zuordnen, können wir das mithilfe der XMLATTRIBUTES-Funktion tun.</p>
<pre class="displaycode">select <strong>xmlserialize</strong>(
  content <strong>xmlelement</strong>(
    name "tr",
    xmlelement(name "td", xmlattributes('center' as "align"), field1),
    xmlelement(name "td", xmlattributes('center' as "align"), field2),
    xmlelement(name "td", xmlattributes('center' as "align"), field3),
  )
  as clob(120)
) as "result"</pre>
<p>Das Ergebnis sieht dann dementsprechend aus, in der Tabelle werden alle Zelleninhalte mittig formatiert:</p>
<pre>&lt;tr&gt;&lt;td align="center"&gt;Record1&lt;/td&gt;&lt;td align="center"&gt;Description1&lt;/td&gt;&lt;td align="center"&gt;1.000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;Record2&lt;/td&gt;&lt;td align="center"&gt;Description2&lt;/td&gt;&lt;td align="center"&gt;2.000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;Record3&lt;/td&gt;&lt;td align="center"&gt;Description3&lt;/td&gt;&lt;td align="center"&gt;3.000&lt;/td&gt;&lt;/tr&gt;</pre>
</div>
<p>Der Beitrag <a href="https://michael-raber.de/xml-dokumente-mittels-sql-erstellen">XML-Dokumente mittels SQL erstellen</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Alexa über Node-Red steuern</title>
		<link>https://michael-raber.de/alexa-ueber-node-red-steuern</link>
					<comments>https://michael-raber.de/alexa-ueber-node-red-steuern#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Wed, 04 Nov 2020 21:50:52 +0000</pubDate>
				<category><![CDATA[Amazon Alexa]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=135</guid>

					<description><![CDATA[<p>Der folgende Artikel zeigt eine Minimal-Konfiguration um Alexa via Node-Red zu steuern. Mit diesem Beispiel wir ein einfacher Aufruf &#8222;Spiel SWR3&#8220; generiert. Mit dem gleichen Verfahren können aber jegliche andere ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/alexa-ueber-node-red-steuern">Alexa über Node-Red steuern</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Der folgende Artikel zeigt eine Minimal-Konfiguration um Alexa via Node-Red zu steuern. Mit diesem Beispiel wir ein einfacher Aufruf &#8222;Spiel SWR3&#8220; generiert. Mit dem gleichen Verfahren können aber jegliche andere Skills angesteuert werden.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="283" height="124" src="https://michael-raber.de/wp-content/uploads/2020/11/Alexa_NodeRed.png" alt="" class="wp-image-137"/></figure></div>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><img loading="lazy" decoding="async" src="https://michael-raber.de/wp-content/uploads/2020/11/RoutineNodeLeer.png" alt="" class="wp-image-139" width="379" height="274" srcset="https://michael-raber.de/wp-content/uploads/2020/11/RoutineNodeLeer.png 419w, https://michael-raber.de/wp-content/uploads/2020/11/RoutineNodeLeer-300x217.png 300w" sizes="(max-width: 379px) 100vw, 379px" /></figure></div>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><img loading="lazy" decoding="async" src="https://michael-raber.de/wp-content/uploads/2020/11/AlexaKonfiguration.png" alt="" class="wp-image-140" width="269" height="391" srcset="https://michael-raber.de/wp-content/uploads/2020/11/AlexaKonfiguration.png 342w, https://michael-raber.de/wp-content/uploads/2020/11/AlexaKonfiguration-206x300.png 206w" sizes="(max-width: 269px) 100vw, 269px" /></figure></div>



<p>Die komplette Konfiguration steckt in einem Node<a href="https://flows.nodered.org/node/node-red-contrib-alexa-remote2-v2" target="_blank" rel="noopener"><strong><em> alexa-remote-routine</em> </strong></a>und dessen Konfigurations-Node. Diesen erreicht man nach dem Einfügen des Routine-Node (links), der zunächst leer ist und durch klicken auf den markierten Stift erreicht man die Konfiguration. Die Angaben im unteren Bereich spezifizieren die Anmeldungsdaten und entsprechen den deutschen Gegebenheiten. <em><strong>Auth Method</strong></em> muss auf Proxy stehen. Die <em><strong>IP-Adresse</strong></em> muss die Adresse des Node-Red-Servers sein. Der <em><strong>Port</strong></em> wird später für die Proxy-Authentifizierung verwendet. Der <em><strong>FilePath</strong></em> enthält einen Dateinamen in dem die Authentifizierung gespeichert wird. Ist dieser Schritt erledigt kann man deployen und den Routine-Node selbst bearbeiten. Zuvor muss aber noch die Anmeldung an Amazon erfolgen. Dies geschieht bei der Proxy-Anmeldung, indem man über den Webbrowser den Host auf dem Node-Red-Server aufruft. In unserem Beispiel ist das. http://192.168.178.16:3456. Die Adresse muss natürlich entsprechend auf die IP-Adresse des eigenen Node-Red-Servers angepasst werden. Dort wird dann die Amazon-Anmeldung angezeigt, die man einmalig mit User und Passwort durchführt. Nach dem ersten Start wird dies auch unterhalb des Node angezeigt. So sollte es am Ende aussehen:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="423" height="256" src="https://michael-raber.de/wp-content/uploads/2020/11/RoutineNode.png" alt="" class="wp-image-142" srcset="https://michael-raber.de/wp-content/uploads/2020/11/RoutineNode.png 423w, https://michael-raber.de/wp-content/uploads/2020/11/RoutineNode-300x182.png 300w" sizes="(max-width: 423px) 100vw, 423px" /></figure>



<p>Der Account muss mit Alexa verbunden werden. Dies ist der vorher definiert Node-Red Konfigurations-Node. Mit Launch Skill wird ausgewählt, daß man eben einen Skill ausführen will. Dahinter wird dann aus den vorhandenen Skills der gewünschte &#8211; hier SWR3 &#8211; ausgewählt. Und am Ende muss man dem System noch sagen auf welchem Alexa-Gerät &#8211; hier Michaels Echo &#8211; der Alexa-Skill ausgeführt werden soll. Dann nur noch den Node-Red-Flow deployen und das ein Klick auf den Button im Dashboard und der Echo spielt SWR3. Es gibt noch viele weitere Möglichkeiten Alexa über Node-Red anzusprechen. Das Bild unten zeigt die Optionen. Dem Spieltrieb sind keinerlei Grenzen gesetzt. Ein schöner Gag ist natürlich irgendwo am Dashboard zu sitzen und Alexa sprechen zu lassen. Prinzipiell lassen sich alle möglichen Alexa-Skills so ansprechen. Der Phantasie des Anwenders sind keine Grenzen gesetzt. Ich wünsche viel Spaß beim Ausprobieren.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="113" height="482" src="https://michael-raber.de/wp-content/uploads/2020/11/StartOptionen.png" alt="" class="wp-image-146" srcset="https://michael-raber.de/wp-content/uploads/2020/11/StartOptionen.png 113w, https://michael-raber.de/wp-content/uploads/2020/11/StartOptionen-70x300.png 70w" sizes="(max-width: 113px) 100vw, 113px" /></figure></div>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339.png" alt="MJR GmbH, Knittlingen" class="wp-image-6" width="252" height="158" srcset="https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339.png 539w, https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339-300x189.png 300w" sizes="(max-width: 252px) 100vw, 252px" /><figcaption><a href="https://mjr.gmbh" target="_blank" rel="noreferrer noopener">Für professionelle Unterstützung besuchen Sie bitte https://mjr.gmbh</a></figcaption></figure>





<p></p>
<p>Der Beitrag <a href="https://michael-raber.de/alexa-ueber-node-red-steuern">Alexa über Node-Red steuern</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/alexa-ueber-node-red-steuern/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MongoDB-Reporting mit Excel</title>
		<link>https://michael-raber.de/mongodb-reporting-mit-excel</link>
					<comments>https://michael-raber.de/mongodb-reporting-mit-excel#respond</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Sat, 26 Sep 2020 20:43:44 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=104</guid>

					<description><![CDATA[<p>Am Beispiel meiner Wetterstationsdaten aus dem vorherigen Artikel zur MongoDB-Anbindung einer Homematic Wetterstation via NodeRed habe ich mit einfachen Mitteln ein Reporting gebaut. Das hat erstmal Prototypen-Status, zeigt aber das ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/mongodb-reporting-mit-excel">MongoDB-Reporting mit Excel</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Am Beispiel meiner Wetterstationsdaten aus dem vorherigen Artikel zur <a href="https://michael-raber.de/homematic-wetterstation-mit-nodered-und-mongodb">MongoDB-Anbindung einer Homematic Wetterstation via NodeRed</a> habe ich mit einfachen Mitteln ein Reporting gebaut. Das hat erstmal Prototypen-Status, zeigt aber das Setup in hoffentlich nachvollziehbarer Form.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="992" height="219" src="https://michael-raber.de/wp-content/uploads/2020/09/Excel.png" alt="" class="wp-image-106" srcset="https://michael-raber.de/wp-content/uploads/2020/09/Excel.png 992w, https://michael-raber.de/wp-content/uploads/2020/09/Excel-300x66.png 300w, https://michael-raber.de/wp-content/uploads/2020/09/Excel-768x170.png 768w" sizes="(max-width: 992px) 100vw, 992px" /><figcaption>Beispiel-Daten aus MongoDB</figcaption></figure>



<p><strong>MongoDB-Verbindung</strong>&nbsp;</p>
<p>Der erste Schritt ist der Zugriff auf die MongoDB-Daten. Dazu wird der MongoDB-BI-Connector lokal auf dem PC installiert. Mehr Informationen zur Installation findet man auf der <a href="https://docs.mongodb.com/bi-connector/master/" target="_blank" rel="noopener noreferrer">MongoDB-Website</a>. Wenn dieser installiert ist wechselt man ins Installationsverzeichnis und startet den Connector mit folgendem Befehl:</p>
<pre>mongosqld.exe --mongo-uri mongodb://192.168.178.18:27017</pre>
<p>Dabei muss natürlich die IP-Adresse an den vorhandenen MongoDB-Server angepasst werden. Damit wird &#8211; wie der Name vermuten läßt &#8211; ein SQL-Zugriff auf die MongoDB-Daten möglich. Im nächsten Schritt muss nun der ODBC-Zugriff erstellt werden.</p>
<p>Das sieht wie folgt aus:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="421" height="413" src="https://michael-raber.de/wp-content/uploads/2020/09/ODBC.png" alt="" class="wp-image-110" srcset="https://michael-raber.de/wp-content/uploads/2020/09/ODBC.png 421w, https://michael-raber.de/wp-content/uploads/2020/09/ODBC-300x294.png 300w" sizes="(max-width: 421px) 100vw, 421px" /></figure></div>



<p>Wichtig an dieser Stelle ist die oben markierte Angabe der Datenbank. Diese ist zwingend erforderlich um einen Zugriff zu ermöglichen. Zu beachten ist an dieser Stelle auch, daß nicht die IP-Adresse des MongoDB-Servers angegeben wird, sondern &#8222;localhost&#8220;, weil der MongoDB-Connector auf dem lokalen PC läuft. Das muss gegebenenfalls angepasst werden. Damit ist nun der Zugriff auf die Daten aus Excel, oder jeder anderen Anwendung die ODBC unterstützt möglich.&nbsp;</p>



<p>Datenanpassungen</p>
<p>In der Regel sind die Rohdaten einer solchen Datenquelle nicht umbedingt tauglich. Es ist noch etwas Feintuning notwendig. Dies ist anhand zweier Beispiel einfach erklärt.</p>
<ol>
<li>In meinem Fall war der Zeitpunkt der Messung als Timestamp erfasst und so in MongoDB hinterlegt. Für die Auswertung will ich aber tageweise zusammenfassen und die gesamte Regenmenge und die Durchschnittstemperatur auswerten. Dazu muss ich aus dem Timestamp das Datum extrahieren. Das funktioniert in Excel mit einer Formel:
<pre> =WENN(B6013&lt;&gt;"";DATUM(LINKS(weather[@datetime];4);TEIL(weather[@datetime];6;2);TEIL(weather[@datetime];9;2));"")</pre>
Man erkennt, daß aus dem Timestamp 2020-08-06T21:28:46.824 das Datum 06.08.2020 errechnet wird.</li>
<li>Die Regenmenge wird in der Homematic Wetterstation kumuliert und ich habe noch keinen Trick gefunden das zu korrigieren. Also rechnen wir einfach Zeile für Zeile die Differenzmenge zur vorherigen Zeile.</li>
</ol>
<p>Diese neu berechneten Spalten werden einfach rechts angefügt und dann für die Auswertung verwendet. Am Ende entsteht folgendes Pivot-Chart:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="447" src="https://michael-raber.de/wp-content/uploads/2020/09/Excel-Chart-1024x447.png" alt="" class="wp-image-116" srcset="https://michael-raber.de/wp-content/uploads/2020/09/Excel-Chart-1024x447.png 1024w, https://michael-raber.de/wp-content/uploads/2020/09/Excel-Chart-300x131.png 300w, https://michael-raber.de/wp-content/uploads/2020/09/Excel-Chart-768x335.png 768w, https://michael-raber.de/wp-content/uploads/2020/09/Excel-Chart.png 1435w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Auf der linken Seite ist die Pivot-Tabelle zu erkennen, die als Basis für das Pivot-Chart rechts dient. In blauer Farbe sieht man die Regenmenge &#8211; summiert pro Tag &#8211; und in rot die Durchschnittstemperatur des jeweiligen Tages.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339.png" alt="MJR GmbH, Knittlingen" class="wp-image-6" width="208" height="131" srcset="https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339.png 539w, https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339-300x189.png 300w" sizes="(max-width: 208px) 100vw, 208px" /><figcaption><a href="https://mjr.gmbh" target="_blank" rel="noreferrer noopener">Für professionelle Unterstützung besuchen Sie bitte https://mjr.gmbh</a></figcaption></figure>
<p>Der Beitrag <a href="https://michael-raber.de/mongodb-reporting-mit-excel">MongoDB-Reporting mit Excel</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/mongodb-reporting-mit-excel/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Homematic Wetterstation mit NodeRed und MongoDB</title>
		<link>https://michael-raber.de/homematic-wetterstation-mit-nodered-und-mongodb</link>
					<comments>https://michael-raber.de/homematic-wetterstation-mit-nodered-und-mongodb#comments</comments>
		
		<dc:creator><![CDATA[Michael Raber]]></dc:creator>
		<pubDate>Thu, 24 Sep 2020 18:05:11 +0000</pubDate>
				<category><![CDATA[Homematic]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">http://michael-raber.de/?p=75</guid>

					<description><![CDATA[<p>In einem kleinen Bastelprojekt habe ich mich mit der Anbindung der Homematic Wetterstation an NodeRed beschäftigt um ein Dashboard zu bauen, das alle signifikanten Werte anzeigt. Am Ende habe ich ...</p>
<p>Der Beitrag <a href="https://michael-raber.de/homematic-wetterstation-mit-nodered-und-mongodb">Homematic Wetterstation mit NodeRed und MongoDB</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In einem kleinen Bastelprojekt habe ich mich mit der Anbindung der Homematic Wetterstation an NodeRed beschäftigt um ein Dashboard zu bauen, das alle signifikanten Werte anzeigt. Am Ende habe ich noch eine Schippe draufgelegt und speichere alle Werte einmal pro Minute in einer MongoDB als json-File. Der Plan für das nächste Projekt steht schon. Die Visualisierung der Daten. Aber das kommt dann im nächsten Schritt. Hier könnt Ihr lesen was bisher geschah:</p>



<p><strong>Die Hardware</strong></p>
<p>Um es einfach zu halten war die Überlegung eine vorhandene Hardware zu nehmen. Die erste Überlegung war ein Raspberry Pi. Nachdem dann aber mit NodeRed und MongoDB schon zwei Anwendungen auf dem Plan standen und klar war, daß es wahrscheinlich mehr wird fiel meine Wahl auf die vorhandene QNAP mit der App ContainerStation. Die ist schnell installiert und stellt eine komplette Docker-Umgebung zur Verfügung und ist einfach zu verwalten. Außerdem ist der zusätzliche Stromverbrauch nicht relevant. So habe ich erstmal zwei Container erstellt:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="138" src="https://michael-raber.de/wp-content/uploads/2020/09/Docker-1024x138.png" alt="" class="wp-image-78" srcset="https://michael-raber.de/wp-content/uploads/2020/09/Docker-1024x138.png 1024w, https://michael-raber.de/wp-content/uploads/2020/09/Docker-300x40.png 300w, https://michael-raber.de/wp-content/uploads/2020/09/Docker-768x103.png 768w, https://michael-raber.de/wp-content/uploads/2020/09/Docker.png 1122w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Damit war der erste Schritt gemacht. In ein paar langen Abenden mit viel Testen, so manchen Fehlversuch entstand dann der NodeRed-Flow. An dieser Stelle erkläre ich den einen oder anderen Abschnitt. Wer mehr wissen will darf mich gerne kontaktieren. Den kompletten Quellcode findet Ihr am Ende des Artikels.</p>
<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="241" src="https://michael-raber.de/wp-content/uploads/2020/09/flow1-1024x241.png" alt="" class="wp-image-85" srcset="https://michael-raber.de/wp-content/uploads/2020/09/flow1-1024x241.png 1024w, https://michael-raber.de/wp-content/uploads/2020/09/flow1-300x71.png 300w, https://michael-raber.de/wp-content/uploads/2020/09/flow1-768x181.png 768w, https://michael-raber.de/wp-content/uploads/2020/09/flow1.png 1027w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Zum grundsätzlichen Design</strong></p>
<p>Anhand des oben gezeigten Ausschnitts eine kurze Erklärung was passiert. Der Injektor triggert einmal pro Minute das Auslesen der Daten von der Station. Ganz oben ist noch eine Anzeige von Datum und Zeit mit der Info, daß gerade eine Aktualisierung stattgefunden hat. Darunter seht Ihr ein paar Beispiele. Der Rest der Werte funktioniert sinngemäß genau so.</p>
<p>Temperatur Nordseite ist mein Carport (ein separater Sensor), Temperatur Wetterstation der Sensor in der Wetterstation und Luftfeuchtigkeit kommt ebenfalls aus der Wetterstation. Alle werden vom Injektor minütlich getriggert und geben ihre Werte direkt an das Dashboard aus.</p>
<p>Dazu werden diverse Werte in globalen Variablen gespeichert. Die werden dann später zusammen ausgelesen und an MongoDB gesandt. Die Erklärung wie das funktioniert findet Ihr dann unten.</p>
<p>Noch ein Hinweis: die Darstellung der Windrichtung habe ich <a href="https://flows.nodered.org/flow/b9a57175ac5a5e240c9916bcce136dca" target="_blank" rel="noopener noreferrer">hier</a> gefunden.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="776" height="51" src="https://michael-raber.de/wp-content/uploads/2020/09/flow2.png" alt="" class="wp-image-86" srcset="https://michael-raber.de/wp-content/uploads/2020/09/flow2.png 776w, https://michael-raber.de/wp-content/uploads/2020/09/flow2-300x20.png 300w, https://michael-raber.de/wp-content/uploads/2020/09/flow2-768x50.png 768w" sizes="(max-width: 776px) 100vw, 776px" /></figure>



<p><strong>Die Übergabe an MongoDB</strong></p>
<p>Der Screenshot oben zeigt nun die Übergabe an MongoDB. Getriggert wird der Prozess vom gleichen Injektor, nur mit einer Sekunde Verzögerung weil ich festgestellt habe, daß die Laufzeit der einzelnen Teilprozesse nicht unendlich schnell ist, sondern eben eine Weile braucht. Mit der Sekunde Verzögerung läuft es stabil. Dieser Schritt liest nun alle vorher gespeicherten Werte aus und schiebt sie in den MongoDB-Connector. Den Inhalt von Read global all sieht so aus.</p>



<pre class="wp-block-code"><code>msg.payload= {
    "dataset":      "weather@home",
    "datetime":     new Date().toISOString().replace("Z", ""),
    "speed":        global.get("wind_speed"),
    "degrees":      global.get("wind_degrees"),
    "temperature":  global.get("temperature"),
    "humidity":     global.get("humidity"),
    "rain":         global.get("rain"),
    "sunshine":     global.get("sunshine")
}
return msg;</code></pre>



<p>Zur Erklärung:</p>
<ul>
<li>dataset dient dazu den Datensatz-Typ zu indentifizieren, falls man mal auf die Idee kommt noch weitere Daten in die gleiche MongoDB-Datenbank zu kippen.</li>
<li>datetime baut einfach einen lesbaren Timestamp um das aktuelle Datum und die Uhrzeit in den Datensatz zu schreiben. Erbsenzähler werden bemerken, daß es eine Sekunde zu spät ist.</li>
<li>Die weiteren Elemente erklären sich selbst.</li>
</ul>



<p><strong>Die MongoDB-Daten</strong></p>
<p>Schaut man mit MongoDB-Compass nun in die Daten findet man folgendes:</p>



<pre class="wp-block-code"><code>{"_id":{"$oid":"5f26f5c16b2b680018b5737f"},"dataset":"weather@home","datetime":"2020-08-02T17:20:01.981","speed":5.2,"degrees":115,"temperature":25.7,"humidity":53,"rain":21.8}</code></pre>



<p>Die ID wird automatisch generiert. Der Rest erklärt sich wohl selbst. Am 2.8.2020 um 17:20 kam der Wind aus Südost (115°) mit 5,2 km/h. Die Temperatur betrug 25,7°C und die relative Luftfeuchtigkeit 53%. Das mit dem Regen ist so eine Sache. Die Wetterstation kumuliert nur, so daß man am Ende immer im Diagramm nachsehen muss was sich verändert hat. So sieht das am Ende dann aus. Bei Regen sieht man den leichten Knick, da hab ich noch keine Zeit gefunden es schöner darzustellen.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="861" height="882" src="https://michael-raber.de/wp-content/uploads/2020/09/Dashboard.png" alt="" class="wp-image-94" srcset="https://michael-raber.de/wp-content/uploads/2020/09/Dashboard.png 861w, https://michael-raber.de/wp-content/uploads/2020/09/Dashboard-293x300.png 293w, https://michael-raber.de/wp-content/uploads/2020/09/Dashboard-768x787.png 768w" sizes="(max-width: 861px) 100vw, 861px" /></figure>



<p><strong>Der MongoDB-Connector</strong></p>
<p>Weil ich eine Weile daran rumgefummelt habe, hier auch noch die Konfiguration des MongoDB-Connectors:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="375" height="217" src="https://michael-raber.de/wp-content/uploads/2020/09/MongoDB-connector1.png" alt="" class="wp-image-95" srcset="https://michael-raber.de/wp-content/uploads/2020/09/MongoDB-connector1.png 375w, https://michael-raber.de/wp-content/uploads/2020/09/MongoDB-connector1-300x174.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="374" height="278" src="https://michael-raber.de/wp-content/uploads/2020/09/MongoDB-connector2.png" alt="" class="wp-image-96" srcset="https://michael-raber.de/wp-content/uploads/2020/09/MongoDB-connector2.png 374w, https://michael-raber.de/wp-content/uploads/2020/09/MongoDB-connector2-300x223.png 300w" sizes="(max-width: 374px) 100vw, 374px" /></figure>



<p><strong>Der Quellcode</strong></p>
<p>Ihr könnt den Quellcode einfach mit Copy-Paste in NodeRed übernehmen. Es wird erst einmal Fehlermeldungen hageln, weil Libraries fehlen. Ihr braucht folgende Nodes:</p>
<ul>
<li>node-red-contrib-ccu : ccu-get-value</li>
<li>node-red-contrib-calc : calculator</li>
<li>node-red-dashboard</li>
<li>node-red-contrib-mongodb2 : mongodb2 in</li>
<li>und was ich noch vergessen habe&#8230;&nbsp;</li>
</ul>



<pre class="wp-block-code"><code>&#091;{"id":"94def7bc.2e58a8","type":"ui_chart","z":"7b4de25e.70997c","name":"Carport","group":"9776c587.104478","order":4,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1240,"y":100,"wires":&#091;&#091;]]},{"id":"b0eb282d.1b4da8","type":"ui_gauge","z":"7b4de25e.70997c","name":"","group":"9776c587.104478","order":3,"width":0,"height":0,"gtype":"gage","title":"Carport","label":"°C","format":"{{value}}","min":"-20","max":"40","colors":&#091;"#b3b3b3","#b3b3b3","#b3b3b3"],"seg1":"","seg2":"","x":1240,"y":140,"wires":&#091;]},{"id":"908d8769.e00808","type":"inject","z":"7b4de25e.70997c","name":"","props":&#091;{"p":"payload"}],"repeat":"60","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":100,"wires":&#091;&#091;"c28f71ad.942d6","b0e748f0.b98f08","a31a6bb4.0edd28","e5033442.7bfc18","59dd648a.e6c23c","efb9937b.c0717","e471621b.992d5","541cb8b1.914eb8","2b870f94.b5ed5","efab3e71.1ba38","dad422e8.df014","7445881c.7de198"]]},{"id":"fdf93300.3555b","type":"ui_chart","z":"7b4de25e.70997c","name":"Wetterstation","group":"9776c587.104478","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1250,"y":180,"wires":&#091;&#091;]]},{"id":"f65ad2f8.f2366","type":"ui_gauge","z":"7b4de25e.70997c","name":"","group":"9776c587.104478","order":1,"width":0,"height":0,"gtype":"gage","title":"Wetterstation","label":"°C","format":"{{value}}","min":"-20","max":"40","colors":&#091;"#b3b3b3","#b3b3b3","#b3b3b3"],"seg1":"","seg2":"","x":1250,"y":220,"wires":&#091;]},{"id":"ee11ed8d.3f254","type":"ui_chart","z":"7b4de25e.70997c","name":"Luftfeuchtigkeit","group":"b9dd5626.717fb8","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1260,"y":260,"wires":&#091;&#091;]]},{"id":"44009e30.7acbb","type":"ui_gauge","z":"7b4de25e.70997c","name":"Luftfeuchtigkeit","group":"b9dd5626.717fb8","order":1,"width":0,"height":0,"gtype":"gage","title":"","label":"%rF","format":"{{value}}","min":"0","max":"100","colors":&#091;"#b3b3b3","#b3b3b3","#b3b3b3"],"seg1":"","seg2":"","x":1260,"y":300,"wires":&#091;]},{"id":"271a38ba.406138","type":"ui_template","z":"7b4de25e.70997c","group":"17a5813f.47654f","name":"Wind","order":3,"width":4,"height":4,"format":"&lt;!--\npass msg.payload.degrees, msg.payload.speed, msg.payload.speed_unit\n-->\n&lt;script>\n    // Watch the incoming message and convert the degrees to a human readable compass direction\n    (function(scope){\n        scope.$watch('msg', function(msg) {\n            if(typeof(msg) === \"object\"){\n                // Convert the degrees to cardinal directions\n                var deg = msg.payload.degrees;\n                var dirs = &#091;\"N\",\"NNE\",\"NE\",\"ENE\",\"E\",\"ESE\",\"SE\",\"SSE\",\"S\",\"SSW\",\"SW\",\"WSW\",\"W\",\"WNW\",\"NW\",\"NNW\",\"N\"];\n                var idx = Math.round(deg*(dirs.length-1)/360);\n                scope.direction = dirs&#091;idx];\n                \n                \n                // Keep track of the highest speed value, giving it 40 as a rough starting point.\n                // Works okay for MPH and KTS, but KM/H will show purple at a lower speed than the rest\n                scope.max_val = (msg.payload.speed > scope.max_val ? msg.payload.speed : 40);\n                \n                scope.p_speed = msg.payload.speed;\n                scope.p_max_val = scope.max_val;\n                var low_colors = &#091;\n                    '#FFFFFF', // white\n                    '#d6f7ff', // light blue\n                    '#85ffd2', // blue green\n                    '#61ff6e' // green 10mph\n                    ];\n                var high_colors = &#091;\n                    '#61ff6e', // green 10mph\n                    '#d5ff61', // green yellow\n                    '#fffc61', // yellow\n                    '#ffe561', // yellow orange 20mph\n                    '#ffcd61', // orange\n                    '#ffad61', // orange red\n                    '#ff7661', // red\n                    '#ff61dd', // red purple\n                    '#e261ff' // purple\n                ];\n                \n                if(msg.payload.speed &lt;= 10){\n                    scope.color = low_colors&#091;Math.round(msg.payload.speed*(low_colors.length-1)/10)];\n                }else{\n                    scope.color = high_colors&#091;Math.round(msg.payload.speed*(high_colors.length-1) / scope.max_val)];\n                }\n                \n                //$(\".compass_container\").css(\"background-color\",scope.color);\n            }\n    \t});\n    })(scope);\n    \n    // Hacks to improve the layout and make it scale\n    $(document).ready(function(){\n        setTimeout(function () {\n            // Remove the auto scrolling from the parent node\n            $(\".compass_container\").parent().css(\"overflow\",\"hidden\");\n        \n            // Adjust the color to match the theme base color by looking up the toolbar header background color;\n            $(\".compass_container .triangle\").css(\"border-bottom-color\",$(\"md-toolbar\").css(\"background-color\"));\n        \n            // Scale the compass into the box that it's being rendered in\n            // This CSS hack helps make sure the line &amp; font size scales appropriately\n            // Based on the node's grid size\n            $(\".compass_container\").each(function(k,v){\n                var scaleWidth = $(v).parent().width() / $(v).width();\n                var scaleHeight = $(v).parent().height() / $(v).height();\n        \n                var translateX = ($(v).width() - $(v).parent().width()) / 2;\n                var translateY = ($(v).height() - $(v).parent().height()) / 2;\n        \n                $(v).css(\"transform\",\"translate(-\"+translateX+\"px,-\"+translateY+\"px) scale(\"+scaleWidth+\",\"+scaleHeight+\") \");\n            });\n            \n            $(\".compass_container\").css(\"display\",\"block\"); // Unhide it now that it's resized\n        }, 1000);\n    });\n&lt;/script>\n&lt;style>\n     @import url(https://fonts.googleapis.com/css?family=Dosis:200,400,500,600);\n     \n     .compass_container{\n        transition: 1s ease-in-out;\n        position: relative;\n        display: none;\n        width: 500px;\n        height: 500px;\n        border-radius: 100%;\n        font-family: 'Dosis';\n        font-size: 80px;\n        box-shadow: inset 0px 0px 0px 30px #777; \n        background-color: {{color}};\n     }\n     \n     .compass_container .compass_header{\n        font-weight: bold;\n        position: absolute;\n        text-align: center;\n        width: 100%;\n        font-size: 75%;\n        top: -15px\n     }\n     .compass_container .text_container{\n        height: 100%;\n        width: 100%;\n        padding: 0px;\n        display: block;\n        border-radius: 100%;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n     }\n     \n     .compass_container .arrow{\n        transition: 1s ease-in-out;\n        width: 100%;\n        height: 100%;\n        display: block;\n        position: absolute;\n        top: 0;\n     }\n     \n     .compass_container .arrow .triangle{\n        width: 0;\n\t\theight: 0;\n\t\tborder-left: 45px solid transparent;\n\t\tborder-right: 45px solid transparent;\n\t\tborder-bottom: 90px solid black;\n\t\tposition: absolute;\n\t\ttop: -15px;\n\t\tleft: 50%;\n\t\tmargin-left: -45px;\n\t\tz-index: 99;\n     }\n&lt;/style>\n\n&lt;div class=\"compass_container\" style=\"\">\n    &lt;div class=\"compass_header\">N&lt;/div>\n  \n    &lt;div class=\"nr-dashboard-text text_container\">\n    \n        &lt;div class=\"direction\" style=\"font-size: 120%\">{{direction}}&lt;/div>\n        &lt;div style=\"flex-direction: row; font-weight: bold;\">\n            &lt;span style=\"font-size: 100%\">{{msg.payload.speed}}&lt;/span>\n            &lt;span style=\"font-size: 75%\">{{msg.payload.speed_unit}}&lt;/span>\n        &lt;/div>\n    &lt;/div>\n    &lt;div class=\"arrow\" style=\"transform: rotate({{msg.payload.degrees}}deg);\">\n      &lt;div class=\"triangle\">&lt;/div>\n    &lt;/div>\n&lt;/div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"local","x":1230,"y":620,"wires":&#091;&#091;]]},{"id":"b37a73b4.30a2b","type":"ui_chart","z":"7b4de25e.70997c","name":"Regen","group":"31df2a88.c71916","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1230,"y":700,"wires":&#091;&#091;]]},{"id":"22c131f5.6262de","type":"ui_gauge","z":"7b4de25e.70997c","name":"Regen","group":"31df2a88.c71916","order":1,"width":0,"height":0,"gtype":"gage","title":"","label":"mm","format":"{{value}}","min":"0","max":"100","colors":&#091;"#b3b3b3","#b3b3b3","#b3b3b3"],"seg1":"","seg2":"","x":1230,"y":740,"wires":&#091;]},{"id":"c28f71ad.942d6","type":"change","z":"7b4de25e.70997c","name":"Aktuelle Zeit","rules":&#091;{"t":"set","p":"payload","pt":"msg","to":"$now()","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":40,"wires":&#091;&#091;"3f7f7270.76744e"]]},{"id":"3f7f7270.76744e","type":"ui_toast","z":"7b4de25e.70997c","position":"top right","displayTime":"5","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"Daten Wetterstation werden aktualisiert","name":"Info Aktualisierung","x":1270,"y":40,"wires":&#091;]},{"id":"7d1a9f89.e5aec","type":"ui_chart","z":"7b4de25e.70997c","name":"","group":"17a5813f.47654f","order":6,"width":0,"height":0,"label":"Geschwindigkeit","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1260,"y":520,"wires":&#091;&#091;]]},{"id":"9e76976c.0fb0a8","type":"ui_chart","z":"7b4de25e.70997c","name":"","group":"17a5813f.47654f","order":6,"width":0,"height":0,"label":"Richtung","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"360","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1240,"y":380,"wires":&#091;&#091;]]},{"id":"60804d97.4c2a34","type":"ui_chart","z":"7b4de25e.70997c","name":"","group":"17a5813f.47654f","order":6,"width":0,"height":0,"label":"Schwankungsbreite","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1270,"y":460,"wires":&#091;&#091;]]},{"id":"c5926040.007b","type":"calculator","z":"7b4de25e.70997c","name":"in Stunden","inputMsgField":"payload","outputMsgField":"payload","operation":"div","constant":"60","x":710,"y":900,"wires":&#091;&#091;"c57f58eb.f3c358"]]},{"id":"cd474a9c.6d2728","type":"function","z":"7b4de25e.70997c","name":"Save global wind speed","func":"global.set(\"wind_speed\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":560,"wires":&#091;&#091;]]},{"id":"1288c4a5.c6470b","type":"function","z":"7b4de25e.70997c","name":"Save global wind degrees","func":"global.set(\"wind_degrees\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":420,"wires":&#091;&#091;]]},{"id":"8652e4db.3a1488","type":"function","z":"7b4de25e.70997c","name":"Read global","func":"msg.payload= {\n    \"speed\":  global.get(\"wind_speed\", msg.payload),\n    \"speed_unit\":  \"km/h\",\n    \"degrees\": global.get(\"wind_degrees\", msg.payload)\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":730,"y":620,"wires":&#091;&#091;"271a38ba.406138"]]},{"id":"b0e748f0.b98f08","type":"delay","z":"7b4de25e.70997c","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":480,"y":620,"wires":&#091;&#091;"8652e4db.3a1488"]]},{"id":"ab919d.84691e6","type":"ui_text","z":"7b4de25e.70997c","group":"17a5813f.47654f","order":4,"width":0,"height":0,"name":"","label":"Richtung","format":"{{msg.payload}}°","layout":"row-center","x":1240,"y":420,"wires":&#091;]},{"id":"d813c6d.3ec8738","type":"mongodb2 in","z":"7b4de25e.70997c","service":"_ext_","configNode":"ded7e336.d1b6a","name":"","collection":"weather","operation":"insert","x":1290,"y":980,"wires":&#091;&#091;]]},{"id":"a31a6bb4.0edd28","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Regen","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"RAINING","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":450,"y":820,"wires":&#091;&#091;"48328040.21b36"]]},{"id":"48328040.21b36","type":"ui_led","z":"7b4de25e.70997c","group":"31df2a88.c71916","order":3,"width":"0","height":"0","label":"Aktuell Regen","labelPlacement":"left","labelAlignment":"left","colorForValue":&#091;{"color":"red","value":"false","valueType":"bool"},{"color":"green","value":"true","valueType":"bool"}],"allowColorForValueInMessage":false,"name":"Regen ja/nein","x":1260,"y":820,"wires":&#091;]},{"id":"e5033442.7bfc18","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Windgeschwindigkeit","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"WIND_SPEED","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":500,"y":520,"wires":&#091;&#091;"cd474a9c.6d2728","7d1a9f89.e5aec"]]},{"id":"59dd648a.e6c23c","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Windrichtung","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"WIND_DIR","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":470,"y":380,"wires":&#091;&#091;"1288c4a5.c6470b","9e76976c.0fb0a8","ab919d.84691e6"]]},{"id":"efb9937b.c0717","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Luftfeuchtigkeit","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"HUMIDITY","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":480,"y":240,"wires":&#091;&#091;"ee11ed8d.3f254","44009e30.7acbb","103262c6.617a1d"]]},{"id":"e471621b.992d5","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Temperatur Nordseite","ccuConfig":"2a777c1f.56a194","iface":"BidCos-RF","channel":"MEQ0281105:1 HM-WDS30-T-O MEQ0281105:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"TEMPERATURE","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":500,"y":120,"wires":&#091;&#091;"94def7bc.2e58a8","b0eb282d.1b4da8"]]},{"id":"541cb8b1.914eb8","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Temperatur Wetterstation","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"ACTUAL_TEMPERATURE","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":510,"y":180,"wires":&#091;&#091;"fdf93300.3555b","f65ad2f8.f2366","43ea39b8.382548"]]},{"id":"2b870f94.b5ed5","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Regenzähler","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"RAIN_COUNTER","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":470,"y":680,"wires":&#091;&#091;"b37a73b4.30a2b","22c131f5.6262de","cf243cac.b0688"]]},{"id":"efab3e71.1ba38","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Schwankungsbreite","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"WIND_DIR_RANGE","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":490,"y":460,"wires":&#091;&#091;"60804d97.4c2a34"]]},{"id":"dad422e8.df014","type":"ccu-get-value","z":"7b4de25e.70997c","name":"Sonnenscheindauer","ccuConfig":"2a777c1f.56a194","iface":"HmIP-RF","channel":"00185BE98B4117:1 HmIP-SWO-PR 00185BE98B4117:1","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"SUNSHINEDURATION","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":500,"y":900,"wires":&#091;&#091;"c5926040.007b"]]},{"id":"cf243cac.b0688","type":"function","z":"7b4de25e.70997c","name":"Save global rain","func":"global.set(\"rain\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":740,"wires":&#091;&#091;]]},{"id":"103262c6.617a1d","type":"function","z":"7b4de25e.70997c","name":"Save global humidity","func":"global.set(\"humidity\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":760,"y":300,"wires":&#091;&#091;]]},{"id":"43ea39b8.382548","type":"function","z":"7b4de25e.70997c","name":"Save global temperature","func":"global.set(\"temperature\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":220,"wires":&#091;&#091;]]},{"id":"b3049ac4.c1d6a8","type":"function","z":"7b4de25e.70997c","name":"Read global all","func":"msg.payload= {\n    \"dataset\":      \"weather@home\",\n    \"datetime\":     new Date().toISOString().replace(\"Z\", \"\"),\n    \"speed\":        global.get(\"wind_speed\"),\n    \"degrees\":      global.get(\"wind_degrees\"),\n    \"temperature\":  global.get(\"temperature\"),\n    \"humidity\":     global.get(\"humidity\"),\n    \"rain\":         global.get(\"rain\"),\n    \"sunshine\":     global.get(\"sunshine\")\n}\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":700,"y":980,"wires":&#091;&#091;"d813c6d.3ec8738"]]},{"id":"7445881c.7de198","type":"delay","z":"7b4de25e.70997c","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":480,"y":980,"wires":&#091;&#091;"b3049ac4.c1d6a8"]]},{"id":"f752ea37.3ace28","type":"ui_chart","z":"7b4de25e.70997c","name":"Sonnenschein","group":"a5a9324f.1293c","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":&#091;"#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1260,"y":880,"wires":&#091;&#091;]]},{"id":"95750765.2c75e8","type":"ui_gauge","z":"7b4de25e.70997c","name":"Sonnenschein","group":"a5a9324f.1293c","order":1,"width":0,"height":0,"gtype":"gage","title":"","label":"Stunden","format":"{{value}}","min":"0","max":"100","colors":&#091;"#b3b3b3","#b3b3b3","#b3b3b3"],"seg1":"","seg2":"","x":1260,"y":920,"wires":&#091;]},{"id":"c57f58eb.f3c358","type":"function","z":"7b4de25e.70997c","name":"Save global sunshine","func":"global.set(\"sunshine\", msg.payload-global.get(\"sunshine_midnight\"))\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":920,"y":900,"wires":&#091;&#091;"f752ea37.3ace28","95750765.2c75e8"]]},{"id":"9776c587.104478","type":"ui_group","z":"","name":"Temperatur","tab":"8f4b65b7.2c4c98","order":2,"disp":true,"width":"6","collapse":false},{"id":"b9dd5626.717fb8","type":"ui_group","z":"","name":"Luftfeuchtigkeit","tab":"8f4b65b7.2c4c98","order":2,"disp":true,"width":"6","collapse":false},{"id":"17a5813f.47654f","type":"ui_group","z":"","name":"Wind","tab":"8f4b65b7.2c4c98","order":4,"disp":true,"width":"6","collapse":false},{"id":"31df2a88.c71916","type":"ui_group","z":"","name":"Regen","tab":"8f4b65b7.2c4c98","order":5,"disp":true,"width":"6","collapse":false},{"id":"ded7e336.d1b6a","type":"mongodb2","z":"","uri":"mongodb://192.168.178.18:27017/mjr_demo","name":"MongoDB","options":"","parallelism":""},{"id":"2a777c1f.56a194","type":"ccu-connection","z":"","name":"192.168.178.11","host":"192.168.178.11","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":false,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"","rpcServerHost":"192.168.178.16","rpcBinPort":"2089","rpcXmlPort":"2090","queueTimeout":"5000","queuePause":"250","contextStore":"memory"},{"id":"a5a9324f.1293c","type":"ui_group","z":"","name":"Sonnenschein","tab":"8f4b65b7.2c4c98","order":5,"disp":true,"width":"6","collapse":false},{"id":"8f4b65b7.2c4c98","type":"ui_tab","z":"","name":"Wetter@home","icon":"wi-wu-mostlysunny","order":1,"disabled":false,"hidden":false}]</code></pre>



<p>Dieser Artikel ist ohne jegliche Garantie. Professionelle IT-Unterstützung finden Sie bei der <a href="https://mjr.gmbh">MJR GmbH</a>.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339.png" alt="MJR GmbH, Knittlingen" class="wp-image-6" width="198" height="125" srcset="https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339.png 539w, https://michael-raber.de/wp-content/uploads/2020/06/logo_transparent_539x339-300x189.png 300w" sizes="(max-width: 198px) 100vw, 198px" /><figcaption><a href="https://mjr.gmbh" target="_blank" rel="noreferrer noopener">Für professionelle Unterstützung besuchen Sie bitte https://mjr.gmbh</a></figcaption></figure>
<p>Der Beitrag <a href="https://michael-raber.de/homematic-wetterstation-mit-nodered-und-mongodb">Homematic Wetterstation mit NodeRed und MongoDB</a> erschien zuerst auf <a href="https://michael-raber.de">Dipl.-Ing. Michael J. Raber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://michael-raber.de/homematic-wetterstation-mit-nodered-und-mongodb/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
