RuuviTag Pro 4in1 in VanPi-Core integrieren

Hallo

ich habe mir den RuuviTag Pro 4in1 zugelegt und wollte diesen in VanPi-Core integrieren!
Dieser Pro 4in1 stellt zusätzlich noch den Luftdruck dar.
Wie/Wo kann ich diesen Druckwert in NR (Python?) erfassen/erstellen um ihn weiter zu verarbeiten um ihn dann darzustellen zu können?
Auf der Infoseite, kann ich mir den 3.Wert schon anzeigen lassen, nur der reale Messwert fehlt noch.

Gruß Peter

Moin,

im Backend im BLE Bereich, gibt es ein Gruppe mit Ruvvi. Ich meine das Skript List schon alle 4 Punkte aus, den Luftdruck müsstest du dir nur aus den daten ziehen.

Einfach mal hier ein Debug dran hängen.

Gruß Wulle

Hallo Wulle,

danke für den Hinweis! Ich bin gerade dabei mich durch den Ruuvi-Bereich durch zu forschen.

Nach meiner Findung gebe ich Dir eine Rückmeldung zu meinem Ergebnis.

Gruß Peter

Hallo Wulle,

meine Tests haben nun folgendes ergeben:

  1. Anschluss von 2*Ruuvitag Pro 3in1, Anzeige im Dashboard ok

  2. Anschluss von 2*Ruuvitag Pro 4in1, nach den Ergänzungen von “Node:Compare Tags” Bild 1, durch die gelb markierene Zeilen (ohne // Auskommentierung), Anzeige im Dashboard ok

  3. je ein Anschluss RuuviTag Pro 3in1 und 4in1,

a) markierte Zeilen (mit // Kommentiert), Anzeige Dashboard ok, Bild 2

b) nach den Ergänzungen von “Node:Compare Tags” durch die gelb markierten Zeilen (ohne // Auskommentierung), Anzeige im Dashboard leer und "Node:Compare tags meldet: function error: siehe letztes Bild.

Gibt es eine Möglichkeit, wenn, wie beim Pro 3in (pressure=0) den Fehler per (if, then else) abzufange

Ruuvi1: 3in1, Ruuvi2: 4in1

Fehlermeldung Compare Tags.

Gibt es eine Möglichkeit, wenn, wie beim Pro 3in1 (pressure=0) den Fehler per (if, then else) abzufange? Wenn möglich, dann wie?

Über eine Rückmeldung würde ich mich sehr freuen.

Gruß Peter

Du bist schon auf der richtigen Spur, du brauchst einen Null-Check.
Die Variante mit beiden RuuviTags aktiv (3in1 und 4in1) wirft den Fehler, weil versucht wird die Funktion toFixed() auf “Null” anzuwenden für die 3in1 und damit crasht die Funktion, denn toFixed() kann nur auf Zahlen (“Number”) angewandt werden.

Wenn wir also davon ausgehen, dass pressure immer entweder Null ist oder eine Nummer, kannst du einfach checken ob es eine Nummer ist und dann dementsprechend die Values setzen:

Also in beiden Zeilen:
"pressure": (typeof ruuvitag.pressure === "number") ? ruuvitag.pressure.toFixed(1) + "hPa" : "",

Dann sollte entweder der tatsächliche Wert angezeigt werden, oder ein leeres Feld, aber die Funktion crasht nicht mehr

Hallo Vincent,

Danke für die Hilfe, und es hat funktioniert!!

Gruß Peter

Hallo Peter,

ich habe, dank deines Beitrags auch meinen neuen Ruuvi 4 in 1 zum laufen gebracht. Danke!

Die Anzeige ist wie bei Dir auf dem Bild.

Aber wie hast Du dann weitergemacht, lässt Du den Luftdruck noch in anderen Fenstern anzeigen?
Muss ich das in einem anderen Flow machen?

Gruß
Roland

Du kannst doch so viele Anzeigen dahinter hängen wie du möchtest,
und in der Anzeige gibst du an auf welcher Seite sie erscheint.

Ich bin noch nicht so fit mit NodeRed…

Danke für die Info!

Was mir bezüglich des Luftdrucks noch eingefallen ist, den will ich noch umrechnen, dass er auf “Normal-Null” (Meereshöhe) umgerechnet wird, da er sonst nicht wirklich aussagekräftig ist.

Gruß
Roland

Dazu benötigst du die höhe, die kannst du eventuell aus dem gps ziehen.
Und dann geht das so.
Faustformel (für geringe Höhen, schnell & einfach)

Für Höhen bis ca. 1000 Meter gilt als grobe Näherung:

  • Der Luftdruck nimmt um ca. 1 hPa pro 10 Meter Höhenunterschied ab (bzw. zu, wenn man tiefer geht).

[image]Freie Universität Berlin

Berechnung:

  1. Berechne den Höhenunterschied in Metern (Höhe über NN).
  2. Teile den Höhenunterschied durch 10.
  3. Addiere diesen Wert zum gemessenen Luftdruck (in hPa), um auf NN zu kommen.

Beispiel:

  • Gemessener Luftdruck in 500 m Höhe: 950 hPa
  • Höhenkorrektur: 500 m / 10 = 50 hPa
  • Luftdruck auf NN = 950 hPa + 50 hPa = 1000 hPa
    :wink:ki

Ja, die Formel kenne ich, hatte es nur vergessen direkt mit einzgeben…

Mal schauen werde ich die Tage mal angehen, muss am We noch bisschen Elektro verkabeln.

Dafür fahren wir an die Mosel, hoffe ich hab alles dabei :wink:

Ich hatte nix besseres zu tun, hier regnet es in Strömen :wink:

[{"id":"4a0e027c2d05bed7","type":"ui_gauge","z":"7251fa91e7e8f813","name":"Luftdruck NN","group":"6785c9b7f3b3e0bd","order":3,"width":6,"height":6,"gtype":"gage","title":"Luftdruck NN","label":"hPa","format":"{{msg.payload}} hPa","min":"900","max":"1060","colors":["#ff0000","#00ff00","#00ff00"],"seg1":"980","seg2":"1100","diff":false,"className":"","x":990,"y":540,"wires":[]},{"id":"8d3879dca83fb2d6","type":"ui_text","z":"7251fa91e7e8f813","group":"b8db3199.f0dbe","order":19,"width":0,"height":0,"name":"Luftdruck NN","label":"Luftdruck NN","format":"{{msg.payload}}.hPa","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1150,"y":540,"wires":[]},{"id":"a041aab0780f245f","type":"function","z":"7251fa91e7e8f813","name":"Luftdruck NN","func":"let druck = msg.payload.pressure_hPa | 2;\nlet hoehe = global.get (\"GV_Höhe\");\nlet hk = hoehe/10;\nlet druckNN = druck + hk;\nmsg.payload = druckNN\n\n\nreturn msg;\n\n/*\nHöhenkorrektur: 500 m / 10 = 50 hPa\nLuftdruck auf NN = 950 hPa + 50 hPa = 1000 hPa\n*/","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":830,"y":540,"wires":[["8d3879dca83fb2d6","4a0e027c2d05bed7","68e4cef0a8851b3d"]]},{"id":"68e4cef0a8851b3d","type":"debug","z":"7251fa91e7e8f813","name":"debug 171","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":990,"y":600,"wires":[]},{"id":"6785c9b7f3b3e0bd","type":"ui_group","name":"Test","tab":"e138f72fc5a1808e","order":3,"disp":true,"width":"12","collapse":false,"className":""},{"id":"b8db3199.f0dbe","type":"ui_group","name":"Temperature","tab":"deee53a800de461d","order":4,"disp":true,"width":"6","collapse":true,"className":""},{"id":"e138f72fc5a1808e","type":"ui_tab","name":"Test","icon":"build","order":45,"disabled":false,"hidden":false},{"id":"deee53a800de461d","type":"ui_tab","name":"Info","icon":"mi-info","order":2,"disabled":false,"hidden":false}]


Ich bekomme den Druck aus eimem BME280, daher wirst du den Eingangs Payload und den get.global für die Höhe ändern müssen.

Hallo Arno,

Danke!

Möchte nicht wissen, was das Forum ohne Leute wie Dich machen würde :star_struck:

Ich werde es versuchen einzubinden. Höhenangabe bekomme ich vom Teltonika Router, der sendet alles ins MQTT und von dort holt sich auch Vanpi für die Map heraus… Ich mag auch noch irgendwann die Fahrtrichtung mit anzeigen fürs parken, dass ich sehe woher die Sonne normal kommt/steht am Tag (Bei anreise in der Nacht für Solar)

Aktuell habe ich gerade remote einen 3D Druck gestartet, für Shellys mit Wagoklemmen und Hutschienen Montage, hoffentlich wird der fertig bevor meine Partnerin los fährt.

Mit den Teilen mag ich Boiler und Co schalten und auslesen, mal schauen wie lange so ein Shelly durch hält, wobei ich bis auf den Boiler alles nur ohne Last schalten werde!

Gruß

Roland

die Shelly halten ohne Probleme … nur hat so ein Shelly ca 1W verbrauch was sich in der Mehrzahl ganz schön am Standby verbrauch addiert

Moin Roland
meinst du soetwas???

Dazu musst du deine Palette erweitern
node-red-contrib-compass

Das Auto muss dazu fahren, um eine genauere Anzeige zu bekommen im Stillstand funktioniert das nicht richtig.
Edit:
Ich habe das noch mal überarbeitet, hab das eben bei der Fahrt getest, der Pfeil zeigte in die falsche Richtung, und ich habe noch etwas reingebracht das bei geschwindigkeit unter 6 Kmh die Daten nicht an die Gauge weitergeleitet werden. Da das ja kein Magnetischer Sensor ist, spinnt die Anzeige im Stillstand.

[{"id":"78fde06682e35be7","type":"function","z":"2f9d5339148076f5","name":"berechnung","func":"// Speichern des vorherigen Punktes im context\nvar prev = context.get('prev') || {lat: msg.payload.lat, lon: msg.payload.lon};\n\nvar lat1 = prev.lat * Math.PI / 180;\nvar lat2 = msg.payload.lat * Math.PI / 180;\nvar lon1 = prev.lon * Math.PI / 180;\nvar lon2 = msg.payload.lon * Math.PI / 180;\n\n// Berechnung der Differenz\nvar dLon = (lon2 - lon1);\n\n// Richtung berechnen\nvar y = Math.sin(dLon) * Math.cos(lat2);\nvar x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);\nvar bearing = Math.atan2(y, x) * 180 / Math.PI;\n\n// Ergebnis normalisieren (0-360 Grad)\nmsg.payload.heading = (bearing + 360) % 360;\n\n// Aktuellen Punkt für nächste Berechnung speichern\ncontext.set('prev', {lat: msg.payload.lat, lon: msg.payload.lon});\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":2040,"wires":[["afd6f886a2153612","a48886a240904630","3ca68826ac647fed"]]},{"id":"b8dc2fd90eebbce8","type":"inject","z":"2f9d5339148076f5","name":"360","props":[{"p":"payload.heading","v":"360","vt":"num"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":370,"y":2160,"wires":[["afd6f886a2153612","a48886a240904630"]]},{"id":"565e3e3485fd0104","type":"inject","z":"2f9d5339148076f5","name":"90","props":[{"p":"payload.heading","v":"90","vt":"num"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":370,"y":2220,"wires":[["afd6f886a2153612","a48886a240904630"]]},{"id":"4206f25681dbcf8c","type":"inject","z":"2f9d5339148076f5","name":"180","props":[{"p":"payload.heading","v":"180","vt":"num"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":370,"y":2280,"wires":[["afd6f886a2153612","a48886a240904630"]]},{"id":"956d731418d6c353","type":"inject","z":"2f9d5339148076f5","name":"270","props":[{"p":"payload.heading","v":"270","vt":"num"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":370,"y":2340,"wires":[["afd6f886a2153612","a48886a240904630"]]},{"id":"7219bd077fd83373","type":"ui_gauge","z":"2f9d5339148076f5","name":"Compas","group":"e797d7dc72663634","order":3,"width":0,"height":0,"gtype":"compass","title":"Compas","label":"{{msg.payload.unit}}","format":"{{msg.payload.value}}°","min":"360","max":"0","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","diff":false,"className":"","x":1060,"y":2220,"wires":[]},{"id":"ca6b7a3f0369dc1f","type":"debug","z":"2f9d5339148076f5","name":"debug 63","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":1040,"y":2040,"wires":[]},{"id":"00316a9dc61c0127","type":"function","z":"2f9d5339148076f5","name":"function 1","func":"let unit = (msg.payload.description);\nlet speed = global.get(\"GV_Geschw\");\n\n\n    msg.payload = unit;\n    global.set(\"direction\",unit)\n    return msg;\n  \n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":2100,"wires":[["3a6e303991abe252"]]},{"id":"3a6e303991abe252","type":"debug","z":"2f9d5339148076f5","name":"debug 64","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1040,"y":2100,"wires":[]},{"id":"a48886a240904630","type":"function","z":"2f9d5339148076f5","name":"function 2","func":"let unit = global.get(\"direction\");\nlet value = msg.payload.heading;\nvalue = Math.round(value);\nlet speed = global.get(\"GV_Geschw\");\n\nif (speed >= 6){\nmsg.payload={\n    \"unit\":unit,\n    \"value\":value\n}\nreturn ([msg, null])\n}\nif (speed <6){\n    return ([null,msg])\n}\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":2220,"wires":[["7219bd077fd83373","55ebec98b18d73f1"]]},{"id":"afd6f886a2153612","type":"compass-point","z":"2f9d5339148076f5","direction":"toCompass","subset":"secondary","language":"de","inputField":"payload.heading","outputField":"payload","name":"","x":820,"y":2040,"wires":[["ca6b7a3f0369dc1f","00316a9dc61c0127"]]},{"id":"3ca68826ac647fed","type":"debug","z":"2f9d5339148076f5","name":"debug 173","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":390,"y":2100,"wires":[]},{"id":"2a4913dbfc0cb56c","type":"comment","z":"2f9d5339148076f5","name":"node-red-contrib-compass","info":"","x":810,"y":2000,"wires":[]},{"id":"08e238fa385eef45","type":"inject","z":"2f9d5339148076f5","name":"7 kmh","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"7","payloadType":"num","x":210,"y":2200,"wires":[["3421f0b92f57602a"]]},{"id":"8a2a3bbfd7724bd3","type":"inject","z":"2f9d5339148076f5","name":"5 kmh","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"5","payloadType":"num","x":210,"y":2260,"wires":[["3421f0b92f57602a"]]},{"id":"55ebec98b18d73f1","type":"debug","z":"2f9d5339148076f5","name":"debug 65","active":false,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1020,"y":2300,"wires":[]},{"id":"3421f0b92f57602a","type":"function","z":"2f9d5339148076f5","name":"function 3","func":"global.set(\"GV_Geschw\",msg.payload);\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":220,"y":2340,"wires":[[]]},{"id":"e797d7dc72663634","type":"ui_group","name":"Schalter","tab":"c0f2413f38763126","order":1,"disp":true,"width":6,"collapse":false},{"id":"c0f2413f38763126","type":"ui_tab","name":"GPS","icon":"map","order":38,"disabled":false,"hidden":false}]

Aktuell ist mir derVerbrauch noch egal…

Neh im ersten, wir haben den Multiplus2 3000, den mag ich wenn er nicht benötigt wird abschalten. Ich habe einen Shelly 4Pm besortgt, jedoch denke ich, dass ich nicht möchte, dass der auch mit aus geht, darum wechsle ich doch wieder zu den einkanal die mit 12v laufen, das zumindest die Geräte dauerhaft erreichbar sind (wer’s braucht…) Ich mag halt möglichst von vielen Geräten den Verbrauch haben um ein Überblick zu haben wo was hinläuft, wie Zuhause halt mit Homeassistant…

Aktuell brauche ich nachts ca 25ah, Tagsüber hab ich durch das 455Wp Panel genug Leistung, selbst bei bedeckten Himmel kommt genug rein um langsam zu laden. Der 300Ah LFP ist meist voll.

Natürlich ändert sich das, wenn wir unterwegs sind und später mal auch mit Induktion kochen, da muss ich dann schon schauen was wir tun können. Da wir aber kein Problem mit Campingplatze haben gehen wir zur Not auch mal dort hin oder laden per Booster bis zu den nächsten Stellplätzen.

Schon wieder …

Wann stellst du dein System mal live vor?

Ich mag schon garnicht mehr Fragen was Du noch alles anlaufen hast!:zany_face:

Ich überlege halt ob man einfach die Sonne irgendwie “abbilden” kann, so dass man halt erahnen kann ob der Baum rechts stört oder nicht…

hat er vorigen september beim treffen von pekaway gezeigt :stuck_out_tongue: