NEWS
[Linux Shell-Skript] WLAN-Wetterstation
-
@langer Ich nehme an durch den "bösen" root stimmen die Userrechte so nicht mehr.
Eigentlich sollte es so aussehen (bei mir läuft es unter User/Gruppe sborg )
wobei "wetterstation.js" uninteressant ist und bei der "sh" -rwxr--r-- völlig genügt, außer man arbeitet wirklich mit Gruppen.
Auch wenn es nerven mag, als User arbeiten und bei ev. nötigen Rechten halt ein "sudo" davor. -
@liv-in-sky sagte in [Linux Shell-Skript] WLAN-Wetterstation:
script ist upgedated und läuft für jede dp-version
habs getestet, wirft aber Fehler aus.
12:12:36.575 error javascript.0 (31206) script.js.Wetter.Wettertabelle: SyntaxError: Unexpected token ] in JSON at position 0 12:12:36.575 error javascript.0 (31206) at script.js.Wetter.Wettertabelle:56:83 12:12:36.576 error javascript.0 (31206) at dataStuff (script.js.Wetter.Wettertabelle:50:15) 12:12:36.576 error javascript.0 (31206) at main (script.js.Wetter.Wettertabelle:153:4)
-
ich habe 3 werte umgewandelt mit [..] und als object type "object" statt "string" im raw geändert
läuft bei mir
hast du das in object umwandeln gemacht ?
-
@liv-in-sky sagte in [Linux Shell-Skript] WLAN-Wetterstation:
hast du das in object umwandeln gemacht ?
Ja, schon gestern
So schaut das Script jetzt aus.
Eventuell siehst du einen copy/paste Fehler.// @liv-in-sky 4.10.2021 11:45 //forum: https://forum.iobroker.net/topic/38286/vis-tabelle-f%C3%BCr-wlan-wetterstation const dataInputPath="0_userdata.0.Statistik.Wetter.Data"; //SEHR WICHTIG !!!!!!!!! const inhaltFarbe="black" const inhaltHintergrund="lightgray" const monatFarbe="black" const hintergrund="gray" const htmlFarbTableBorderColor="black"; const abstandZelle=6; const htmlRahmenLinien="all" const htmlSchriftgroessehtmlSchriftart="" //nicht verwendbar! const htmlFarbFelderschrift="red"; //nicht verwendbar! const htmlSchriftgroesse="14px"; const htmlSchriftart="Ubuntu-Light"//"RobotoCondensed-Regular"; //oder z.b. "Helvetica" const weite="auto"; //oder "500px" let myTable="table bordercolor=\""+htmlFarbTableBorderColor+"\" border=\"2px\" cellspacing=\""+abstandZelle+"\" cellpadding=\""+abstandZelle+"\" width=\""+weite+"\" rules=\""+htmlRahmenLinien+"\" style=\"color:"+htmlFarbFelderschrift+"; font-size:"+htmlSchriftgroesse+ "; font-family:"+htmlSchriftart+";\""; const varData={ Tiefstwert: { einheit:"°C", name:"Minimum Temperatur"}, Hoechstwert: { einheit:"°C", name:"Maximum Temperatur"}, Temp_Durchschnitt:{ einheit:"°C", name:"Durchschnittstemperatur"}, Max_Windboe: { einheit:'km/h', name:"Max Windböe"}, Max_Regenmenge: { einheit:'l/m2', name:"Max. Regen/Tag"}, Regenmenge_Monat: { einheit:'l/m2', name:"Regen"}, heisse_Tage: { einheit:"", name:'Heiße Tage (über 30°C)'}, Sommertage: { einheit:"", name:"Sommertage (über 25°C)"}, warme_Tage: { einheit:"", name:"Warme Tage (über 20°C)"}, kalte_Tage: { einheit:"", name:"Kalte Tage (Max. unter 10°C)"}, Frost_Tage: { einheit:"", name:"Frosttage (Min. unter 0°C)"}, Eistage: { einheit:"", name:"Eistage (Max. unter 0°C)"}, sehr_kalte_Tage: { einheit:"", name:"Sehr kalte Tage (Min. unter -10°C)"} } const monate =["JANUAR","FEBRUAR","MÄRZ","APRIL","MAI","JUNI","JULI","AUGUST","SEPTEMBER","OKTOBER","NOVEMBER","DEZEMBER"]; //--------------------------nix mehr ändern ab hier-------------------------------------- let myObj; let myArrAll=[] let myArrErstellt=[] let tableContent; let monWahlVIS; let lastThree; //---------------------------------------------------------------------------------------- function dataStuff(){ let myArrAll=[] let mySelector=dataInputPath+'.*.*' $(mySelector).each(function(id, i) { let ida=id.split("."); let lang=ida.length; let jahri=lang-2; let moni=lang-1; let obj2 = { jahr: ida[jahri]}; let obj3 = { monat: ida[moni]}; let formathelp= getState(id).val let helper; if (typeof(formathelp)=="object") {helper=getState(id).val[0];} else{helper=JSON.parse(getState(id).val)} helper={ ...helper, ...obj2, ...obj3} myArrAll.push(JSON.stringify(helper)) }); //log(myArrAll) tableContent = "" myObj=JSON.parse("["+myArrAll.toString()+"]") if (lastThree==0) { //KOPFZEILE let choseMonth=monate[monWahlVIS-1] let choseMonthArr=choseMonth.split('') let test="" for (let i=0;i<choseMonthArr.length;i++){ // log(choseMonthArr[i]) test=test+choseMonthArr[i]+` ` } //log(test) //tableContent+='<td class=\"test-klein\" rowspan=\"14\"\">'+choseMonth+'</td><td>Wetterwerte</td>' tableContent+='<td class=\"myWetterStation\" width=\"25px\" style=\"color:'+monatFarbe+';font-size:26px; background-color:'+hintergrund+' ; vertical-align:middle; text-align:center \" rowspan=\"14\"\">'+test+'</td><td style=\"color:'+monatFarbe+'; background-color:'+hintergrund+'"\>Wetterwerte</td>' for (let i=0;i<myObj.length;i++) { if(parseInt(myObj[i].monat)==monWahlVIS){ tableContent += '<td style=\"color:'+monatFarbe+'; background-color:'+hintergrund+'"\ align=center>' + myObj[i].jahr+'</td>'} }; tableContent="<tr style=\"font-weight\:bold\">"+tableContent+"</tr>" //RESTZEILEN for(var index in varData){ tableContent+='<td style=\"color:'+inhaltFarbe+'; background-color:'+inhaltHintergrund+'\">'+varData[index].name+'</td>' for (let i=0;i<myObj.length;i++) { if(myObj[i].monat==monWahlVIS){ tableContent += '<td style=\"color:'+inhaltFarbe+'; background-color:'+inhaltHintergrund+'\" align=right>' + myObj[i][index] + ' '+ varData[index].einheit+'</td>'} }; tableContent="<tr>"+tableContent+"</tr>" } } //lastThree else { //log(myObj[0].monat) myObj.sort(function (alpha, beta) { if (parseInt(alpha.monat) > parseInt(beta.monat)) return 1; if (parseInt(beta.monat) > parseInt(alpha.monat)) return -1; return 0;}); // log(myObj[0].monat) //KOPFZEILE LASTTHREE let choseJahr=lastThree.toString()//formatDate(getDateObject((new Date().getTime())), "JJJJ")//monate[monWahlVIS-1] let choseMonthArr=choseJahr.split('') let test="" for (let i=0;i<choseMonthArr.length;i++){ // log(choseMonthArr[i]) test=test+choseMonthArr[i]+` ` } //log(test) //tableContent+='<td class=\"test-klein\" rowspan=\"14\"\">'+choseMonth+'</td><td>Wetterwerte</td>' tableContent+='<td class=\"myWetterStation\" width=\"25px\" style=\"color:'+monatFarbe+';font-size:26px; background-color:'+hintergrund+' ; vertical-align:middle; text-align:center \" rowspan=\"14\"\">'+test+'</td><td style=\"color:'+monatFarbe+'; background-color:'+hintergrund+'"\>Wetterwerte</td>' for (let i=0;i<myObj.length;i++) { if( parseInt(myObj[i].jahr)==parseInt(choseJahr) && (parseInt(myObj[i].monat)==parseInt(monWahlVIS) || parseInt(myObj[i].monat)==parseInt(monWahlVIS)-1 || parseInt(myObj[i].monat)==parseInt(monWahlVIS)-2)){ tableContent += '<td style=\"color:'+monatFarbe+'; background-color:'+hintergrund+'"\ align=center>' + monate[parseInt(myObj[i].monat)-1]+'</td>';} }; tableContent="<tr style=\"font-weight\:bold\">"+tableContent+"</tr>" //RESTZEILEN for(var index in varData){ tableContent+='<td style=\"color:'+inhaltFarbe+'; background-color:'+inhaltHintergrund+'\">'+varData[index].name+'</td>' for (let i=0;i<myObj.length;i++) { if( parseInt(myObj[i].jahr)==parseInt(choseJahr) && (parseInt(myObj[i].monat)==parseInt(monWahlVIS) || parseInt(myObj[i].monat)==parseInt(monWahlVIS)-1 || parseInt(myObj[i].monat)==parseInt(monWahlVIS)-2)){ tableContent += '<td style=\"color:'+inhaltFarbe+'; background-color:'+inhaltHintergrund+'\" align=right>' + myObj[i][index] + ' '+ varData[index].einheit+'</td>'} }; tableContent="<tr>"+tableContent+"</tr>" } } tableContent = '<'+myTable+' ><tbody>'+tableContent+'</tbody></table >' //log(tableContent) setState("javascript." + instance + ".Wetterstation.MonthlyDaten",tableContent) } //-------------------------------------------------------------------------------------------------- async function main() { if (!(await existsStateAsync("javascript." + instance + ".Wetterstation.MonthlyDaten"))) { await createStateAsync("Wetterstation.MonthlyDaten", "leer", {type: "string", name: "MonthlyDaten", role: "value", read: true, write: true, } ); } if (!(await existsStateAsync("javascript." + instance + ".Wetterstation.MonatAuswahl"))) { await createStateAsync("Wetterstation.MonatAuswahl", 10, {type: "number", name: "MonatAuswahl", role: "value", read: true, write: true, } ); } if (!(await existsStateAsync("javascript." + instance + ".Wetterstation.AuswahlJahr"))) { await createStateAsync("Wetterstation.AuswahlJahr", 0, {type: "number", name: "AuswahlJahr", role: "value", read: true, write: true, } ); } lastThree = (await getStateAsync("javascript." + instance + ".Wetterstation.AuswahlJahr")).val //? lastThree=true : lastThree=false; monWahlVIS=((await getStateAsync("javascript." + instance + ".Wetterstation.MonatAuswahl")).val ) dataStuff(); } //----------------------------------------------------------------------------------------------------- main() on({id: "javascript." + instance + ".Wetterstation.MonatAuswahl", change: "any"}, async function (obj) { main() }); on({id: "javascript." + instance + ".Wetterstation.AuswahlJahr", change: "any"}, async function (obj) { main() }); schedule(' */30 * * * *', function() { setState("javascript." + instance + ".Wetterstation.MonatAuswahl", parseInt(formatDate(getDateObject((new Date().getTime())), "MM"))) ; setStateDelayed("javascript." + instance + ".Wetterstation.AuswahlJahr", parseInt(formatDate(getDateObject((new Date().getTime())), "JJJJ")),10000) ; });
-
@liv-in-sky sagte in [Linux Shell-Skript] WLAN-Wetterstation:
läuft bei mir
Sorry @Negalein , lüppt bei mir auch.
Hast du ev. aus Versehen bei einem der Datenpunkte ein [ oder ] zu wenig/viel? -
@liv-in-sky @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Hast du ev. aus Versehen bei einem der Datenpunkte ein [ oder ] zu wenig/viel?
Haaaa, tatsächlich.
Hatte 1x in der 1. Zeile[
mit]
vertauscht.Kleiner Fehler-----große Auswirkung
PS: schon Bier gekauft
-
läuft also - dann is ja gut
-
[OFF Topic]
Ich bin nun wieder hin- und hergerissen. Zum einen ist es für mich nicht selbstverständlich, zum anderen hat es aber in meinen Augen immer einen schalen Beigeschmack. Wie man es macht ist es aber eh immer verkehrt.Aber ich bin älter und so erzogen worden. Many Thx @CW ( ) für die Spende. Es wird aber Kaffee werden, da ich Alk weitest meiden soll
...und Schal: es braucht sich wirklich keiner deswegen genötigt zu sehen etwas spenden zu müssen. Ich will mich einfach nur bedanken. Es macht nichts besser oder schlechter, ich mach das gerne weil ich es (mehr oder minder gut) kann, zum Teil selbst nutze und an anderer Stelle auch von der Arbeit Anderer profitiere....und jetzt kam dein Post dazwischen während ich hier tippe und du es selbst schon teilweise verraten hast, also Danke @Negalein
-
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
..und Schal: es braucht sich wirklich keiner deswegen genötigt zu sehen etwas spenden zu müssen. Ich will mich einfach nur bedanken.
Naja, das mach ich gerne. Gute Arbeit soll belohnt werden.
@liv-in-sky dürfte sich auch mal ein Kaffeekonto zulegen. Wäre längst überfällig! -
@liv-in-sky Hi, ich hab dein (neues) Script auch im Einsatz. In der VIS ist bei mir die Tabelle ganz rechts. kann ich die irgendwie besser/schöner positionieren? Oder hab ich da was verbaselt?
LG Rainer -
hast du mal ein bild, was du meinst
-
@liv-in-sky Hier ein Screenshot. Bitte nicht über die angezeigten Daten wundern. Meinem NUC war es gestern nicht so gut :
Sollten wir hierzu den Kanal wechseln?
-
@rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Hier ein Screenshot
Widgets markieren und beliebig verschieben
-
@Negalein Danke. Ich hab mit der VIS noch nicht viel am Hut. Dass das so einfach ist - manOman, ich muss noch viel lernen.
-
@rene55 du meinst rechts auf der seite - und nicht innerhalb der tabelle
das macht man eigentlich durch die breite des widgets - hast du da was geändert - oder evtl hast du beim widget setting was eingestellt
im script gibt es nur const weite - und die sollte auto sein
-
@liv-in-sky Ja genau, das meinte ich. @Negalein hat mir schon geholfen, die Tabelle und die Steuerelemente nach links zu rücken. Geändert habe ich nur die Datenpunkte, die bei mir alle in 0_userdata liegen. Das hat (erstaunlich) gut funktioniert. Auch von mir nochmal Danke für das Script.
-
Ich bin es leid, das ich immer Problem mit den Rechten bekomme.
Nun meine Bitte:
Ich möchte alles neu aufsetzten und beschreibe den Weg den ich gehe. Sollte hier schon ein Fehler bestehen, bitte ich um Hilfe.
Also, ich nehme 3 Pi 4 mit 4gb RAM, 125gb SSD-Platte sowie einen Fujitsu E920 als Anzeige. Als Bildschirm ein 24“ Touch-Screen angeschlossen am Fujitsu.
Alle Pi’s sind so eingestellt das sie von SSD und nicht von einer Micro-SD Karte booten.
1 Pi als Master, die beiden anderen als Slave.
Auf allen Pi’s wird Raspbian aufgespielt mit dem „User“ pi und natürlich einem neuen Password.
Frage 1: der User „pi“ ist doch nicht automatisch „Root“ oder?
Auf allen wird auch „SSH“ freigegeben und „update“ und „upgrade“ ausgeführt.
Mit Putty wird auf allen 3 Pi’s ioBroker installiert und zwar mit folgenden Befehl:curl -sL https://iobroker.net/install.sh | bash -
Auf dem „Master“ wird Multihost freigegeben und auf den „Slaves“ über „connect“ verbunden!
Bei der Installation von Adaptern in ioBroker habe ich bisher keine Probleme gehabt, darum weiter mit der Wetterstation.
Nach der Installationsanleitung auf github habe ich alles gemacht aber keinen Erfolg.Bei „./wetterstation.sh –debug“ bekomme ich folgende Fehlermeldung:
-bash: ./wetterstation.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden
Bei „sudo systemctl status wetterstation“:
pi@pi-iobroker:/home/iobroker $ sudo systemctl status wetterstation ● wetterstation.service - Service für ioBroker Wetterstation Loaded: loaded (/etc/systemd/system/wetterstation.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Tue 2021-10-05 11:04:52 CEST; 7s ago Process: 14097 ExecStart=/home/iobroker/wetterstation.sh (code=exited, status=203/EXEC) Main PID: 14097 (code=exited, status=203/EXEC) Okt 05 11:04:52 pi-iobroker systemd[1]: Started Service für ioBroker Wetterstation. Okt 05 11:04:52 pi-iobroker systemd[14097]: wetterstation.service: Failed to execute command: No such file or directory Okt 05 11:04:52 pi-iobroker systemd[14097]: wetterstation.service: Failed at step EXEC spawning /home/iobroker/wetterstation.sh: No such file or directory Okt 05 11:04:52 pi-iobroker systemd[1]: wetterstation.service: Main process exited, code=exited, status=203/EXEC Okt 05 11:04:52 pi-iobroker systemd[1]: wetterstation.service: Failed with result 'exit-code'.
Bei „ls -la“ kommt
pi@pi-iobroker:/home/iobroker $ ls -la insgesamt 128 drwxr-xr-x 4 iobroker iobroker 4096 Okt 5 09:44 . drwxr-xr-x 4 root root 4096 Okt 4 16:56 .. -rw-r--r-- 1 iobroker iobroker 220 Apr 18 2019 .bash_logout -rw-r--r-- 1 iobroker iobroker 3523 Mai 7 16:42 .bashrc drwx------ 3 iobroker iobroker 4096 Okt 5 07:45 .config drwxr-xr-x 4 iobroker iobroker 4096 Okt 5 09:56 .npm -rw-r--r-- 1 iobroker iobroker 807 Apr 18 2019 .profile -rw-r--r-- 1 iobroker iobroker 5738 Okt 5 07:49 wetterstation.conf -rwxr-xr-x 1 iobroker iobroker 14766 Okt 5 07:42 wetterstation.sh -rw-r--r-- 1 iobroker iobroker 63070 Okt 5 07:42 wetterstation.sub -rwxr-xr-x 1 iobroker iobroker 8421 Okt 4 17:11 ws_updater.sh
Was bekomme ich da nicht richtig hin?
MfG
Wastl -
Frage 1: der User „pi“ ist doch nicht automatisch „Root“ oder?
Nein, aber der user 'pi' (mit der UserID / uid) 1000 ist als sudoer voreingestellt, der dann per vorangesetztem 'sudo' für den nachfolgenden Befehl die root-Rechte erlangen kann.
Bei „./wetterstation.sh –debug“ bekomme ich folgende Fehlermeldung:
-bash: ./wetterstation.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefundenDazu musst du im Verzechnis stehen, in dem auch das skript wetterstation ausführbar liegt. Offenbar stehst du nicht im richtigen Verzeichnis oder der user hat keine ausreichenden Rechte an dem skript.
Ich würde den user pi der Gruppe iobroker hinzufügen:
sudo usermod -aG iobroker pi
Danach den pi einmal ausloggen und wieder anmelden.
-
@thomas-braun sagte in [Linux Shell-Skript] WLAN-Wetterstation:
„./wetterstation.sh –debug
Ich stehe im Verzeichnis
pi@pi-iobroker:/home/iobroker $ dir wetterstation.conf wetterstation.sh wetterstation.sub ws_updater.sh pi@pi-iobroker:/home/iobroker $ ./wetterstation.sh –debug -bash: ./wetterstation.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden pi@pi-iobroker:/home/iobroker $
Also die Reihenfolge der Installation ist somit nicht falsch?
MfG
Wastl -
@langer mach mal anstatt "dir" "ls -la"
file wetterstation.sh
und dann
dos2unix wetterstation.*
könnte vielleicht helfen. Ist aber nur eine Vermutung.