Gelöst: Ofensteuerung Drooff fire+

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

nw378
Beiträge: 296
Answers: 5
Registriert: 22. Sep 2018 10:38

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Ja, genau. Als nächstes werde ich die Werte in Zahlen ändern, per Influxdb sammeln und per Grafana (als Diagramm) aufhübschen.

Die größere nächste Challenge ist dann, dass auf der Seite http://192.168.178.48/fireplus2.php Buttons zur Bedienung sind: ECO/Normal/Power.

Wie lassen sich diese wohl per OpenHAB steuern?

Quellcode der Seite:

Code: Alles auswählen

<!doctype html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<meta name="author" content="IEP GmbH">
		<meta name="description" content="">
		<title>fire+ Bedienung</title>
		<link rel="icon" type="image/png" sizes="32x32" href="favicon.ico">
		
		<link rel="apple-touch-icon" sizes="57x57" href="icon/apple-icon-57x57.png">
		<link rel="apple-touch-icon" sizes="60x60" href="icon/apple-icon-60x60.png">
		<link rel="apple-touch-icon" sizes="72x72" href="icon/apple-icon-72x72.png">
		<link rel="apple-touch-icon" sizes="76x76" href="icon/apple-icon-76x76.png">
		<link rel="apple-touch-icon" sizes="114x114" href="icon/apple-icon-114x114.png">
		<link rel="apple-touch-icon" sizes="120x120" href="icon/apple-icon-120x120.png">
		<link rel="apple-touch-icon" sizes="144x144" href="icon/apple-icon-144x144.png">
		<link rel="apple-touch-icon" sizes="152x152" href="icon/apple-icon-152x152.png">
		<link rel="apple-touch-icon" sizes="180x180" href="icon/apple-icon-180x180.png">
		<meta name="apple-mobile-web-app-title" content="fire+">
		<meta name="apple-mobile-web-app-capable" content="yes">
		
		<link rel="stylesheet" href="css/my_eas.css" />
		<link rel="stylesheet" href="css/eas.css" />
		<link rel="stylesheet" href="css/jquery.mobile.icons-1.4.5.min.css" />
		<link rel="stylesheet" href="css/jquery.mobile.structure-1.4.5.min.css" />
		
		<link rel="manifest" href="manifest.json">
		<meta name="msapplication-config" content="browserconfig.xml" />

		<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="excanvas.min.js"></script><![endif]-->
		<script language="javascript" type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
		<script language="javascript" type="text/javascript" src="js/jquery.mobile-1.4.5.min.js"></script>
		<script language="javascript" type="text/javascript" src="js/jquery.flot.min.js"></script>
		<script language="javascript" type="text/javascript" src="js/jquery.flot.time.min.js"></script>
		<script language="javascript" type="text/javascript" src="js/jquery.flot.resize.min.js"></script>
		<script language="javascript" type="text/javascript" src="js/sprache.js"></script>


		<script type="text/javascript">

		var Fernbedienung  = 0 ;
		var strPanelAlt = "" ;
		var intPanel ;
		
		// Wenn das Dokument geladen ist, werden alle 2 s neue Werte geholt
		$(document).ready(function() {
			SpracheUmschalten( "ger" ) ;
			// einmal am Anfang aufrufen, dann alle 2s
			aktualisierePanel();
			// Änderung des Sliderswertes, Daten an EAS senden
			$("#Helligkeit").on("slidestop", function(e){
			 DataChange(); 
			});
			
			// alle 2 s die Daten per Ajax neu laden
			var refreshId = setInterval(function() {
				aktualisierePanel();
			}, 2000);

			$.ajaxSetup({ cache: false });
		});

		function aktualisierePanel() {
			$.ajax({ type: "GET",   
				dataType: "json",
				url: "php/easpanel.php",
				async: false,
				success : function(panelAntwort)
				{
					strPanel = panelAntwort ;
				},
				error: function( text ) {
					alert( "Kommunikationsproblem Panel zum Server!" );
				}
			});
			SetzeButton();
		}

		function SetzeButton() {
			if ( strPanel.length > 11 ) {
				if ( strPanel != strPanelAlt ){
					strPanelAlt = strPanel ;
					intPanel = strPanel.split("\n") ;
					intPanel.pop() ; // letzte Element ist leer, löschen
					Fernbedienung = intPanel[1] ;
					
					if ( intPanel[0] == 1 && Fernbedienung == 0 ) {
						switch( intPanel[2]) {
							case "1": 
								document.getElementById('Betrieb1').checked = true;
								document.getElementById('Betrieb1').disabled = false;
								document.getElementById('Betrieb2').disabled = true;
								document.getElementById('Betrieb3').disabled = true;
								document.getElementById('Betrieb4').disabled = true;
								break;
							case "2": 
								document.getElementById('Betrieb2').checked = true;
								document.getElementById('Betrieb2').disabled = false;
								document.getElementById('Betrieb1').disabled = true;
								document.getElementById('Betrieb3').disabled = true;
								document.getElementById('Betrieb4').disabled = true;
								break;
							case "3": 
								document.getElementById('Betrieb3').checked = true;
								document.getElementById('Betrieb3').disabled = false;
								document.getElementById('Betrieb1').disabled = true;
								document.getElementById('Betrieb2').disabled = true;
								document.getElementById('Betrieb4').disabled = true;
								break;
							case "4": 
								document.getElementById('Betrieb4').checked = true;
								document.getElementById('Betrieb4').disabled = false;
								document.getElementById('Betrieb1').disabled = true;
								document.getElementById('Betrieb2').disabled = true;
								document.getElementById('Betrieb3').disabled = true;
								break;
						}

						switch( intPanel[3]) {
							case "4": 
								document.getElementById('Leistung1').checked = true;
								document.getElementById('Leistung1').disabled = false;
								document.getElementById('Leistung2').disabled = true;
								break;
							case "8": 
								document.getElementById('Leistung2').checked = true;
								document.getElementById('Leistung2').disabled = false;
								document.getElementById('Leistung1').disabled = true;
								break;
						}

						if ( intPanel[10] == 1 ){
							// LED sind an
							document.getElementById('LED1').checked = true;
							document.getElementById('LED1').disabled = false;
							document.getElementById('LED2').disabled = true;
						}
						else {
							// LED sind aus
							document.getElementById('LED2').checked = true;
							document.getElementById('LED2').disabled = false;
							document.getElementById('LED1').disabled = true;
						}
						
						document.getElementById('Helligkeit').value = intPanel[4];
						$("#Helligkeit").slider("disable");
						$("#Helligkeit").slider("refresh");
					}
					else {
						// Bedienung über WEB-Oberfläche, alle Elemente enablen
						document.getElementById('Betrieb1').disabled = true;
						document.getElementById('Betrieb2').disabled = false;
						document.getElementById('Betrieb3').disabled = false;
						document.getElementById('Betrieb4').disabled = false;
						document.getElementById('Leistung1').disabled = false;
						document.getElementById('Leistung2').disabled = false;
						document.getElementById('LED1').disabled = false;
						document.getElementById('LED2').disabled = false;
						switch( intPanel[2]) {
							case "1": 
								document.getElementById('Betrieb1').checked = true;
								break;
							case "2": 
								document.getElementById('Betrieb2').checked = true;
								break;
							case "3": 
								document.getElementById('Betrieb3').checked = true;
								break;
							case "4": 
								document.getElementById('Betrieb4').checked = true;
								break;
						}

						switch( intPanel[3]) {
							case "4": 
								document.getElementById('Leistung1').checked = true;
								break;
							case "8": 
								document.getElementById('Leistung2').checked = true;
								break;
						}

						if ( intPanel[10] == 1 ){
							// LED sind an
							document.getElementById('LED1').checked = true;
						}
						else {
							// LED sind aus
							document.getElementById('LED2').checked = true;
						}
						
						document.getElementById('Helligkeit').value = intPanel[4];
						$("#Helligkeit").slider("enable");
						$("#Helligkeit").slider("refresh");
					}
					if ( intPanel[0] == 1 ) {
						if ( Fernbedienung == 0 ) {
							$('#FeTa').html('<button class="ui-btn ui-icon-refresh ui-btn-icon-top ui-btn-corner-all ui-nodisk-icon ui-alt-icon" onclick="FernbedienungChange();">Fernbedienung über Webvisu</button>') ;
						}
						else {
							$('#FeTa').html('<button class="ui-btn ui-icon-lock ui-btn-icon-top ui-nodisk-icon ui-alt-icon" onclick="FernbedienungChange();">Panelbedienung am Ofen</button>') ;
						}
					}
					else {
						$('#FeTa').html('') ;
					}
					if ( ( parseFloat( intPanel[5] ) < 100 ) && ( document.getElementById('AB2').checked == true ) ) {
						// Temperatur unter 100° und Glutabbrand aktiv, auf Gluterhaltung umschalten
						document.getElementById('AB1').checked = true; // Gluterhaltung
						DataChange() ;
					}
					else {
						// Ofen brennt, Kunde kann wählen!
						if ( intPanel[11] == 0 ){
							// Gluterhaltung
							document.getElementById('AB1').checked = true;
						}
						else {
							// Nachbrennen
							document.getElementById('AB2').checked = true;
						}
					}
					
					$("input[type='radio']").checkboxradio("refresh"); // RadioButtons aktualisieren
					
				}
			}
		}
		
		function FernbedienungChange() {
			Fernbedienung = ( (Fernbedienung == 1) ? 0 : 1 );
			DataChange();
		}

		function DataChange() {
			var Betrieb = $('input[name=Betrieb]:checked').val();
			var Leistung = $('input[name=Leistung]:checked').val();
			var Helligkeit = $('#Helligkeit').val();
			var Bedienung = Fernbedienung;
			var LED = $('input[name=LED]:checked').val();
			var AB = $('input[name=AB]:checked').val();
			$.ajax({
				type: "POST",
				url: "php/easpanelW.php",
				cache: false,
				data: {Betrieb: Betrieb, Leistung: Leistung, Helligkeit: Helligkeit, Bedienung: Bedienung, LED: LED, AB: AB},
				error: function( text ) {alert( "Daten konnten nicht geschrieben werden!" );}
			});
		}

		function DatenSchutz() {
			window.location = "fireplus8.php" ;
		}

		function English() {
			SpracheUmschalten('gb') ;
			document.images["1"].src = "images/de-middle.gif" ;
			document.images["2"].src = "images/gb-middle-grau.gif" ;
		}

		function Deutsch() {
			SpracheUmschalten('ger') ;
			document.images["1"].src = "images/de-middle-grau.gif" ;
			document.images["2"].src = "images/gb-middle.gif" ;
		}
	
	</script>

	</head>
	<body>

      <div data-role="page" data-theme="a" style="min-width:22em">
			<div data-role="header">
				<h1><i>fire</i>+</h1>
			</div>

			<div class="ui-grid-a" id="Sprache">
				<div style="width:20%" class="ui-block-a">
					<div class="ui-body" id="Logo">
						<a href=https://www.drooff-kaminofen.de/ rel="external" target="_blank"><img src="images/DROOFF_Logo50.png" alt="Drooff Logo"/></a>
					</div>
				</div>
				<div style="width:80%" class="ui-block-b">
					<div class="ui-body">
						<a style="float:right;margin-top:0.2em; margin-left:1em;padding: 0.2em;font-size:12.5px" href="#" onclick="DatenSchutz()" class="ui-btn">Datenschutz</a>
						<a style="float:right;margin:4px" href="#" onclick="English()" id="English"><img src="images/gb-middle.gif" alt="english version"></a>
						<a style="float:right;margin:4px" href="#" onclick="Deutsch()" id="Deutsch"><img src="images/de-middle-grau.gif" alt="deutsche Version"></a>
					</div>
				</div>
			</div>

			<div data-role="navbar" id="Oben" data-iconpos="top">
				<ul>
					<li><a href="index.php" data-icon="home" data-ajax="false">Home</a></li>
					<li><a href="#" data-icon="edit" class="ui-btn-active" data-ajax="false">Bedienung</a></li>
					<li><a href="fireplus1.php" data-icon="action" data-ajax="false">History</a></li>
					<li><a href="fireplus3.php" data-icon="gear" data-ajax="false">Service</a></li>
				</ul>
			</div>

			<div id="Oben" style="margin-top:30px">
				<div class="ui-field-contain" data-position="inline">
					<form>
						<fieldset data-role="controlgroup" data-type="horizontal">
							<input name="Betrieb" id="Betrieb1" value="1" type="radio" onclick="DataChange();" >
							<label style="width:7em" for="Betrieb1"><span class="ui-icon-myicon0 inlineIcon ui-btn-icon-notext"></span>Service</label>
							<input name="Betrieb" id="Betrieb2" value="2" checked="checked" type="radio" onclick="DataChange();">
							<label style="width:7em" for="Betrieb2"><span class="ui-btn-icon-notext ui-icon-myicon1 inlineIcon"></span>ECO</label>
							<input name="Betrieb" id="Betrieb3" value="3" type="radio" onclick="DataChange();" >
							<label style="width:7em" for="Betrieb3"><span class="ui-btn-icon-notext ui-icon-myicon2 inlineIcon"></span>Normal</label>
							<input name="Betrieb" id="Betrieb4" value="4" type="radio" onclick="DataChange();" >
							<label style="width:7em" for="Betrieb4"><span class="ui-btn-icon-notext ui-icon-myicon3 inlineIcon"></span>Power</label>
						</fieldset>
					</form>
				</div>
				<div class="ui-field-contain" data-position="inline">
					<form>
						<fieldset data-role="controlgroup" data-type="horizontal">
							<input name="Leistung" id="Leistung1" value="4" checked="checked" type="radio" onclick="DataChange();">
							<label style="width:7em" for="Leistung1"><span class="ui-btn-icon-notext ui-icon-myicon4 inlineIcon"></span>4 kW</label>
							<input name="Leistung" id="Leistung2" value="8" type="radio" onclick="DataChange();" >
							<label style="width:7em" for="Leistung2"><span class="ui-btn-icon-notext ui-icon-myicon5 inlineIcon"></span>8 kW</label>
						</fieldset>
					</form>
				</div>

				<div class="ui-field-contain" data-position="inline">
					<form>
						<fieldset data-role="controlgroup" data-type="horizontal">
							<input name="AB" id="AB1" value="0" checked="checked" type="radio" onclick="DataChange();">
							<label style="width:7em" for="AB1">Gluterhaltung</label>
							<input name="AB" id="AB2" value="1" type="radio" onclick="DataChange();" >
							<label style="width:7em" for="AB2">Glutabbrand</label>
						</fieldset>
					</form>
				</div>

				<div id="Unten">
					<div class="ui-field-contain" data-position="inline">
						<form>
							<fieldset data-role="controlgroup" data-type="horizontal">
								<input name="LED" id="LED1" value="1" checked="checked" type="radio" onclick="DataChange();">
								<label style="width:7em" for="LED1">LED-Band an</label>
								<input name="LED" id="LED2" value="0" type="radio" onclick="DataChange();" >
								<label style="width:7em" for="LED2">LED-Band aus</label>
							</fieldset>
						</form>
					</div>
					<div class="ui-body">
						<label for="Helligkeit">Helligkeit:</label>
						<input id="Helligkeit" type="range" name="Helligkeit" min="20" max="100" step="10" value="50" data-theme="a" class="ui-responsive" onclick="DataChange();">
					</div>
				</div>

				<div id="FeTa">
					<button class="ui-btn ui-icon-refresh ui-btn-icon-left ui-btn-corner-all ui-nodisk-icon ui-alt-icon" onclick="FernbedienungChange();">Fernbedienung</button>
				</div>
			</div>
		</div>
	</body>
</html>
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

Also, die Funktion, die zur Änderung aufgerufen wird, ist dieser Teil des Codes:

Code: Alles auswählen

		function DataChange() {
			var Betrieb = $('input[name=Betrieb]:checked').val();
			var Leistung = $('input[name=Leistung]:checked').val();
			var Helligkeit = $('#Helligkeit').val();
			var Bedienung = Fernbedienung;
			var LED = $('input[name=LED]:checked').val();
			var AB = $('input[name=AB]:checked').val();
			$.ajax({
				type: "POST",
				url: "php/easpanelW.php",
				cache: false,
				data: {Betrieb: Betrieb, Leistung: Leistung, Helligkeit: Helligkeit, Bedienung: Bedienung, LED: LED, AB: AB},
				error: function( text ) {alert( "Daten konnten nicht geschrieben werden!" );}
			});
		}
Die URL ist also diese: php/easpanelW.php, und sie wird mit POST aufgerufen. Die Daten werden vorher in ein JSON Objekt verpackt, eben

Code: Alles auswählen

{Betrieb: Betrieb, Leistung: Leistung, Helligkeit: Helligkeit, Bedienung: Bedienung, LED: LED, AB: AB}
wobei der jeweils zweite Begriff die Variable ist. Das JSON Objekt kannst Du der Einfachheit halber als String zusammensetzen. Wenn Du dann den entsprechenden Schalter in der openHAB-Oberfläche betätigst, muss eine Rule auf received command triggern. Dann werden die Status der einzelnen Items ausgelesen, das JSON Objekt erstellt und an das String Item geschickt, welches mit dem send-Channel verknüpft ist.

Noch zur Ergänzung...

Code: Alles auswählen

   Betrieb: 1-4 (1 = Service, 2 = ECO, 3 = Normal, 4 = Power)
  Leistung: 4, 8 (4 = 4 kW, 8 = 8 kW)
Helligkeit: 20 - 100, Schrittweite 10 (aber eventuell geht es auch in kleineren Schritten)
 Bedienung: 0, 1 (0 = keine Fernbedienung, 1 = Fernbedienung)
       LED: 0, 1 (0 = LED-Band aus, 1 = LED-Band an)
        AB: 0, 1 (0 = Gluterhaltung, 1 = Glutabbrand)
Aus dem Code extrahiert :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Answers: 5
Registriert: 22. Sep 2018 10:38

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Oha... ich glaube, da brauche ich mal ein sehr verregnetes Wochenende, um das umzusetzen.
Wird wohl nicht mein letzter Hilferuf hierzu sein, mit JSON und send-Channel bin ich nicht vertraut. ;-)

Über den Teilerfolg bin ich aber schon sehr happy. Die Philosophie von OH ist ja, alles in einem System zu verheiraten.
Und da finde ich es total unpraktisch, jedes System mit einer eigenen App zu steuern.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

Ich denke nicht, dass das so wild wird.
Ein Number Item für Betrieb
Ein Item für Leistung. Das kann Number oder auch Switch sein. Number bietet sich an, weil die Rückmeldung totsicher all diese Items auch schon beinhaltet und Du musst lediglich in der ersten Rule das Item passend einsetzen.
Die weiteren Items kann man auch mit Number abbilden, aus den gleichen Gründen (bis auf das "aus", was ja eher mit ON und OFF abzubilden wäre)

Ich habe mich gerade mal ein bisschen an den beiden Quelltexten entlang gehangelt und glaube, nun zu verstehen, wie das alles zusammenwirkt.
Deine Daten von php/easpanel.php sind so zu verstehen:

Code: Alles auswählen

0 <- Steuerprio
1 <- Fernbedienung
2 <- Betrieb
4 <- Leistung
50 <- Helligkeit
24 <- Temperatur g1
1.6 <- Luftschieber g2
-1.1 <- FeinZug g3
aus <- showled
0 <- error
1 <- LEDs
0 <- Gluterhaltung
0 <- pbarvalue
Die ersten beiden Punkte werden gemeinsam ausgewertet. Wenn Steuerprio auf 1 steht und Fernbedienung auf 0, ist die Weboberfläche gesperrt. Die Bedienung erfolgt am Ofen. Steht die Fernbedienung auf 1, erfolgt die Steuerung über die Webvisu. Was es bedeutet, wenn die Steuerprio auf 0 steht, ist mir allerdings bisher nicht klar.
showled kann verschiedene Texte annehmen, Gruen, Gelb, Violett, Orange (jeweils optional mit dem Zusatz "blinkt") oder aus. Die Farben stehen für verschiedene Meldungen Regelbetrieb, Holz nachlegen, Gluterhaltung, Glutabbrand und Standby
error meldet verschiedene Fehlerzustände

Code: Alles auswählen

@1: Temperaturfühler defekt?
@2: Feinzugmessung defekt?
@3: Luftschieber defekt?
@4: Wahlschalter?
@5: Kaminzug?
@6: Luftschieber klemmt?
@7: Temperaturfühler defekt?
@8: Temperaturfühler defekt?
@9: Kein Zug im Kamin!
@' + error + ': Unbekannter Fehler
Genau diese Texte könnte man also problemlos ebenfalls in openHAB anzeigen. Einzig der letzte Punkt bedeutet dabei einen höheren Aufwand. Aber auch das lässt sich relativ schlank erledigen. Mein Ansatz hierzu wäre ein mapping der Zahlen nach Text. In der Oberfläche käme dann noch eine bedingte Darstellung dazu, welche bei Werten über 9 aktiv wird.
pbarvalue ist eine Progressbar, welche vermutlich beim Anfahren der Anlage den Fortschritt anzeigt. Wobei mir nicht so ganz klar ist, warum man dort eine Obergrenze setzen kann.

ein ähnliches Spiel kann man noch mit den Settings machen, wobei ich da keine Daten habe, aber das Prinzip ist auch klar,
Der 2. Wert gibt Tmax an, der 7. Wert steht für den Maximalwert der ProgressBar und der 5. Wert gibt an, ob es einen Feinzug gibt oder nicht.

Weiterhin gibt es eine Seite php/Ausschalten.php, welche mittels POST und Data 1 die fire+ ausschalten kann, so der Ofen auf Standby steht.

Letztlich muss nur der Code nachgebaut werden, ungefähr so:

Code: Alles auswählen

rule "sende Befehl zur fire+"
when
    Item firePlus_Out2  received command or
    Item firePlus_Out3  received command or
    Item firePlus_Out4  received command or
    Item firePlus_Out5  received command or
    Item firePlus_Out11 received command or
    Item firePlus_Out12 received command
then
    val Betrieb    = firePlus_Out3.state.toString
    val Leistung   = firePlus_Out4.state.toString
    val Helligkeit = firePlus_Out5.state.toString
    val Bedienung  = firePlus_Out2.state.toString
    val LED        = firePlus_Out11.state.toString
    val AB         = firePlus_Out12.state.toString
    val strJSON = "{Betrieb: "+Betrieb+", Leistung: "+Leistung+", Helligkeit: "+Helligkeit+", Bedienung: "+Bedienung+", LED: "+LED+", AB: "+AB+"}"
    firePlus_send.sendCommand(strJSON)
end
Diese Rule ist natürlich nur ein erster Schritt, quick & dirty. Die Rule sollte auf jeden Fall prüfen, ob die übernommenen Werte passen, gegebenenfalls default Werte eintragen oder sich weigern, den Befehl abzusetzen usw.
Aber um zu testen, ob es grundsätzlch funktioniert, sollte die Rule schon ausreichen. Die Variablen könnte man etwas schöner benennen, auch wenn das so passen sollte, aber das Auge möchte ja auch genießen. ;)
Was natürlich ins Auge fällt, ist, dass wir glatt sechs Items haben, die diese Rule triggern. da wäre es also schön, ein Group Item zu haben, in dem exakt diese sechs Items zusammengefasst sind. Dann kann der Trigger nämlich als

Code: Alles auswählen

    Member of firePlus_commands received command
geschrieben werden.
weiterhin wäre es evtl. sinnvoll, einen Befehl nur dann zu senden, wenn das auch notwendig ist. Das bedeutet, wir müssen den letzten Befehl auf gleiche Weise zusammensetzen. Im Zweifel können wir diese Variable beim Empfangen des Status erzeugen, damit auch extern gesendete Befehle mit berücksichtigt werden. Im Prinzip läuft das dann genauso, nur eben beim Receive. Wir bilden das komplette JSON in dem Moment, wo die Werte empfangen werden und speichern es z.B. in einem weiteren String Item firePlus_lastCommand. Nun können wir in der Rule noch eine Abfrage einbauen:

Code: Alles auswählen

if(strJSON != firePlus_lastCommand.state.toString)
    firePlus_send.sendCommand(strJSON)
else
    logInfo("firePlus","Befehl, der gesendet werden soll, stimmt mit aktuellem Zustand überein!")
Ich bemerke gerade, dass ich den Respekt vor Technik verliere... ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Answers: 5
Registriert: 22. Sep 2018 10:38

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Einfach genial! Sowohl der technische Sachverstand als auch Dein Aufwand, sich um solche Herausforderungen zu kümmern. Chapeau!! :o

Zum Senden des firePlus_send.sendCommand(strJSON) habe ich ein weiteres HTTP URL Thing angelegt, mit einem String Channel "php/easpanelW.php" Irgendwie muss das ja zurück zum Ofen. Ob das so richtig ist?

Code: Alles auswählen

UID: http:url:8e11e39c9a
label: HTTP URL Thing Drooff Send
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: " http://192.168.178.48/"
  delay: 0
  stateMethod: POST
  refresh: 2
  commandMethod: POST
  contentType: application/json
  timeout: 3000
  bufferSize: 2048
channels:
  - id: drooff_send
    channelTypeUID: http:string
    label: drooff_send
    description: ""
    configuration:
      stateExtension: php/easpanelW.php
der Code verweist ja darauf:

Code: Alles auswählen

$.ajax({
				type: "POST",
				url: "php/easpanelW.php",
				cache: false,
				data: {Betrieb: Betrieb, Leistung: Leistung, Helligkeit: Helligkeit, Bedienung: Bedienung, LED: LED, AB: AB},
				error: function( text ) {alert( "Daten konnten nicht geschrieben werden!" );}
				
Und diesen String dann mit dem firePlus_send Item verknüpft.

Leider klappt das Rückschreiben noch nicht, bzw. kommt beim Ofen wohl nicht korrekt an.

PS: Du brauchst keinen Respekt vor der Technik, die Technik braucht Respekt vor Dir! :lol:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

Du brauchst kein weiteres Thing, die Base URL ist ja keine andere. Stattdessen brauchst Du einen zweiten Channel.
Nun musst Du aufpassen, dass Du den Rest der URL php/easpanelW.php in der commandExtension einträgst, nicht in der stateExtension. Der Channel ist write only. Im Gegenzug ist die Rückmeldung read only.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Answers: 5
Registriert: 22. Sep 2018 10:38

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Den zweiten Channel habe ich dementsprechend angelegt. Die Änderungen werden aber noch nicht übernommen.

Ich werde mal versuchen, die Seite php/easpanelW.php auszulesen, während sie von der "App" befeuert wird, vllt. liegt es ja nur an der Formatierung.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

nw378
Beiträge: 296
Answers: 5
Registriert: 22. Sep 2018 10:38

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Hallo Udo,

ich krame mal dieses alte Thema hervor, da ich immer noch keine Lösung für das Senden der Parameter gefunden habe.

Ich habe mal den ajax Befehl versucht in CURL zu übersetzen:

Code: Alles auswählen

curl -X POST --header "Content-Type: application/json" --url 'http://192.168.178.48/php/easpanelW.php' --data '{Betrieb: 3, Leistung: 4, Helligkeit: 70, Bedienung: 0, LED: 1, AB: 0}'
Außer einem Piepsen des Ofens erhalte ich jedoch keine Rückmeldung. Die gesendeten Parameter werden nicht übernommen.

Ich habe auch mit "Content-Type: text/plain" und Anführungszeichen ("Betrieb") herum experimentiert, keine Chance...

Hast Du evtl. noch einen heißen Tip?
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

nw378
Beiträge: 296
Answers: 5
Registriert: 22. Sep 2018 10:38

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Ich bin einen (großen) Schritt weiter.

mit diesem CURL klappt es:

Code: Alles auswählen

curl 'http://192.168.178.48/php/easpanelW.php' \
  -H 'Accept: */*' \
  -H 'Accept-Language: de,de-DE;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
  -H 'DNT: 1' \
  -H 'Origin: http://192.168.178.48' \
  -H 'Referer: http://192.168.178.48/fireplus2.php' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0' \
  -H 'X-Requested-With: XMLHttpRequest' \
  --data-raw 'Betrieb=2&Leistung=4&Helligkeit=70&Bedienung=1&LED=1&AB=0' \
  --insecure
Vermutlich ist einiges davon überflüssig (User-Agent z.B.)?

Wie bekomme ich dies noch mit den ganzen Headern in HTTP Channel? Die erste Hürde ist der Content-Type, openhab lässt nur folgendes auswählen:
content.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

Ich bin mir nicht sicher, aber schau mal in die advanced Options des http Thing, dort solltest Du den Header "beliebig" setzen können. Mein Tipp für den Inhaltstyp wäre application/xml, aber vielleicht ginge auch text/xml.
Wenn es so nicht funktioniert, bliebe vermutlich noch, ein externes Script zu schreiben, welches dann z.B. per exec Addon aufgerufen werden könnte.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten