Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Fragen zum Skripten mit ioBroker.javascript
Antworten
Benutzeravatar
wendy2702
guru
Beiträge: 2721
Registriert: 18.01.2016, 22:12
Wohnort: Herzogenrath

Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Beitrag von wendy2702 » 20.04.2018, 09:36

Hi,

ich würde gerne mit Blockly / Javascript folgendes umsetzen.

Bei Überschußeinspeisung meiner PV-Anlage um Wert X soll die Warmwassertemperatur von 45 Grad auf 60 Grad angehoben werden. Anheben der WW-Temp bewirkt ein einschalten des Kompressors und erhöht damit meinen Eigenverbrauch. (ich erhalte leider für den verkauften Strom nicht mehr soviel)

Ich betreibe eine Waterkotte Wärmepumpe welche ich Seriel Ansteuern und auslesen kann. Mit diesem Script und dem HEX String kann ich die WW-Temp auf 60 grad stellen:
Spoiler: Show hidden text

Code: Alles auswählen

createState('Waterkotte.Daten.WW_TEMP_Change_feedback');

// To use the `ByteLength` parser:
const SerialPort = require('serialport');
const ByteLength = SerialPort.parsers.ByteLength;

var buffer = new Buffer(14);
buffer[0] = 0x10;
buffer[1] = 0x02;
buffer[2] = 0x01;
buffer[3] = 0x13;
buffer[4] = 0x01;
buffer[5] = 0x3b;
buffer[6] = 0x00;
buffer[7] = 0x00;
buffer[8] = 0x70;
buffer[9] = 0x42;
buffer[10] = 0x10;
buffer[11] = 0x03;
buffer[12] = 0xd0;
buffer[13] = 0x77;
const port = new SerialPort("/dev/ttyUSB0", {
    baudRate: 9600,
    dataBits : 8,
    parity : 'none',
    stopBits: 1
//  flowControl : false
}, function (err) {
    if (err) {
//        port.close();
        return console.log('Error1: ', err.message);
    }

    const parser = port.pipe(new ByteLength({ length: 11 }));
    parser.on('data', function (data) {
		console.log('Data received: ' + data.toString('hex'));
		var daten = data.toString('hex');
		setState('Waterkotte.Daten.WW_TEMP_Change_feedback', daten, true);
		//port.close();
	});

	// Flush input
	port.flush();

	// send Data
	    port.write(buffer, function(err) {
		    if (err) {
			    return console.log('Error on write: ', err.message);
		    }
    
		    console.log('Daten send');
// 		    port.close();
        });
    });
    
port.on('open', function() {
	console.log('Connected');
});

port.on('error', function(err) {
	console.log('Error2: ', err.message);
//	port.close();
});

// close port if the script stopped (to be able to open it again)
onStop(function (callback) {
	if (port && port.isOpen) {
		port.close();
		console.log('port closed');
	}
});
Mit diesem Script welches jede Minute zur 12 Sekunde ausgeführt wird lese ich etliche Daten aus der Wärmepumpe aus:
Spoiler: Show hidden text

Code: Alles auswählen

createState('Waterkotte.Daten.Abfrage_Rohdaten');

// To use the `ByteLength` parser:
const SerialPort = require('serialport');
const ByteLength = SerialPort.parsers.ByteLength;

var buffer = new Buffer(12);
buffer[0] = 0x10;
buffer[1] = 0x02;
buffer[2] = 0x01;
buffer[3] = 0x15;
buffer[4] = 0x00;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0xf3;
buffer[8] = 0x10;
buffer[9] = 0x03;
buffer[10] = 0x7c;
buffer[11] = 0x32;
const port = new SerialPort("/dev/ttyUSB0", {
    baudRate: 9600,
    dataBits : 8,
    parity : 'none',
    stopBits: 1
//  flowControl : false
}, function (err) {
    if (err) {
//        port.close();
        return console.log('Error1: ', err.message);
    }

    const parser = port.pipe(new ByteLength({ length: 253 }));
    parser.on('data', function (data) {
		console.log('Data received: ' + data.toString('hex'));
		var daten = data.toString('hex');
		setState('Waterkotte.Daten.Abfrage_Rohdaten', daten, true);
		//port.close();
	});

	// Flush input
	port.flush();

	// send Data
	    port.write(buffer, function(err) {
		    if (err) {
			    return console.log('Error on write: ', err.message);
		    }
    
		    console.log('Daten send');
// 		    port.close();
        });
    });
    
port.on('open', function() {
	console.log('Connected');
});

port.on('error', function(err) {
	console.log('Error2: ', err.message);
//	port.close();
});

// close port if the script stopped (to be able to open it again)
onStop(function (callback) {
	if (port && port.isOpen) {
		port.close();
		console.log('port closed');
	}
});
Startet man jetzt beide Scripte zufällig Gleichzeitig oder das eine während das andere noch aktiv ist bekomme ich den Serialport nicht mehr geschlossen und muss den PI rebooten.

Damit das nicht so schnell passiert habe ich mal angefangen ein Blockly zu bauen:
WW_60_PV_Ueberschuss.jpg
Allerdings fällt mir gerade nicht ein wie ich es anstellen muss damit:

a) das Script zur Temp Anhebung nicht zufällig aktiviert wird kurz bevor die Abfrage läuft. Aktuell Prüfe ich ja nur ob es Aktiv ist oder nicht.

b) ein toggeln verhindern kann denn wenn z.B. die Einspeisung länger als 5 Minuten unter den Wert x fällt soll die Temp mit einem weiteren Script wieder auf 45 Grad gesetzt werden.

Grundsätzliche Frage: Kann man in Blockly den Serial Port direkt ansprechen und dann z.B. auch den Hex String senden?

Bin für jegliche Hilfe dankbar.
Bitte keine Fragen per PN, die gehören ins Forum!

Benutzeravatar
wendy2702
guru
Beiträge: 2721
Registriert: 18.01.2016, 22:12
Wohnort: Herzogenrath

Re: Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Beitrag von wendy2702 » 03.05.2018, 13:21

OK.

Da ich hier nicht weitergekommen bin und es zeitweise immer noch passiert das der Port nicht sauber geschlossen wird eine andere Frage.

Wenn der Port "offen" bleibt kommt im Logfile dieser Eintrag:

Code: Alles auswählen

Error1:
Das ganze kann ich wie schon geschrieben durch einen restart des PI beseitigen aber scheinbar auch durch einen restart der Javascript instanz.

Wie kann ich das logfile auf diesen Eintrag überwachen und im Falle das der Fehler auftritt die JS-Instanz neu starten?
Bitte keine Fragen per PN, die gehören ins Forum!

Karl_999
starter
Beiträge: 87
Registriert: 21.11.2017, 22:09

Re: Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Beitrag von Karl_999 » 03.05.2018, 17:53

Wenn die Skripte nicht gleichzeitig laufen dürfen / sollen, empfiehlt es sich eine Hilfsvariable (genauer ein Semaphor https://de.wikipedia.org/wiki/Semaphor_(Informatik)) einzuführen (z.B. Skript_x_aktiv).
Das Semaphor fragt man dann einfach ab und setzt sie dann im Skript entsprechend

Code: Alles auswählen

Skript_2:
if not (Skript_1_aktiv) {
	Skript_2_aktiv = true;
	... // hier wird vieles gemacht 
	Skript_2_aktiv = false; // wenn alles durch ist
	}
Dabei ist aber wichtig, dass auch die Ausnahmen sauber abgefangen und die dort ebenfalls die Aktiv-Kennung zurückgesetzt wird.
Das Ganze dann in gleicher Form für das zweite Skript.

Natürlich lässt sich das auch in Blockly umsetzen.

Benutzeravatar
wendy2702
guru
Beiträge: 2721
Registriert: 18.01.2016, 22:12
Wohnort: Herzogenrath

Re: Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Beitrag von wendy2702 » 03.05.2018, 18:05

Danke für deine Antwort.

Das muss ich mir mal ansehen. Mein erster Blockly Versuch hat noch nicht so geklappt.
Bitte keine Fragen per PN, die gehören ins Forum!

Benutzeravatar
Dutchman
guru
Beiträge: 3094
Registriert: 07.01.2016, 23:42

Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Beitrag von Dutchman » 03.05.2018, 21:59

wendy2702 hat geschrieben:Danke für deine Antwort.

Das muss ich mir mal ansehen. Mein erster Blockly Versuch hat noch nicht so geklappt.
Mit blockly währe wohl die einfachste Lösung ein object zu erstellen was dir sagt ob der port besetzt ist oder nicht.

zB:

- object 1 : Port_Blocked_Script_1
- object 2 : Port_Blocked_Script_2

Wird Script 1 aktiviert setzt du erst das object auf true, ist das Script fertig und schließt den Port wieder auf false

Das 2te Script könnte durch Trigger false ausgelöst werden und setzt Dan dan das andere object auf true und wen es fertig ist mit einer Verzögerung auf false. Damit triggerst du Dan wieder das erste Script.

Mal als idee


-------------------------
Send from mobile device
Das schöne ios hat Auto Korrektur zum k****

Wer Schreibfehler findet darf sie behalten oder auf eBay verkaufen, mindest Umsatz 10% für die community

Benutzeravatar
wendy2702
guru
Beiträge: 2721
Registriert: 18.01.2016, 22:12
Wohnort: Herzogenrath

Re: Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss

Beitrag von wendy2702 » 04.05.2018, 07:58

Ich werde mir mal was zusammen klicken, testen und zu 99,9% wieder fragen :D
Bitte keine Fragen per PN, die gehören ins Forum!

Antworten