rpi444 Das ist eine Gute Idee. Das werde ich versuchen. Vielen Dank!
Der_Imperator Ein root user ist leider nicht eingerichtet.
rpi444 Das ist eine Gute Idee. Das werde ich versuchen. Vielen Dank!
Der_Imperator Ein root user ist leider nicht eingerichtet.
Da muss ich mal kramen, aber bestimmt. Aber das rebooten löst doch mein Problem der defekten "sudoers_policy" noch nicht, oder?
rpi444 Danke für den Hinweis. Ich hab's direkt mal ausprobiert, da SysRQ schon aktiviert war. Leider erhalte ich nach: echo b | sudo tee /proc/sysrq-trigger dann die gleiche Fehler Meldung (siehe oben)
Das hatte ich schon vermutet. Leider weiß ich nicht wo ich eine intakte "sudoers_policy" herbekomme.
geht leider nicht. Hab's dreimal versucht. -> "su: Authentication failure"
Danke für Eure schnelle Reaktion!
fred0815 :
ich habe openhabian als Betriebssystem
und ich erhalte folgende Ausgabe:
Ich habe leider nur den einen Pi4 mit openhabian.
den Check kann ich leider nicht ausführen, da ja sudo nicht mehr funktioniert.
Der Befehl reboot funktioniert beim mir nur mit sudo.
Guten Morgen liebes Forum,
seit einiger Zeit kann ich auf meinem PI4 mit openhabian keine sudo-Befehle mehr ausführen, das heißt, dass ich nicht einmal einen reboot ausführen kann. Ich erhalte folgenden fehler:
sudo: error in /etc/sudo.conf, line 0 while loading plugin "sudoers_policy"
sudo: unable to load /usr/lib/sudo/sudoers.so: /usr/lib/sudo/sudoers.so: invalid ELF header
sudo: fatal error, unable to load plugins
Bei meinen Recherchen bin ich darauf gestoßen, das vermutlich die entsprechende Datei beschädigt ist. Gibt es irgendeine Möglichkeit das zu reparieren, ohne das ich den Pi neu aufsetzen muss.
Besten Dank im Voraus für Eure Hilfe
Franky07 ich habe das genauso wie Du gemacht. Mit dem Unterschied, dass ich die Option Boardverwalter nicht hatte. Keine Ahnung warum. Nach der Installation der Version 1.8.19, wie oben beschrieben, habe ich nun die Option.
md_fg Danke für den Hinweis. Zwischenzeitlich hab ich ein Update der IDE nach folgender Anleitung vorgenommen:
https://www.raspberrypi-spy.co.uk/2020/12/instal…n-raspberry-pi/
Die Versionsangabe von 2:1.0.5 ist etwas irreführend. Scheint auf jeden Fall uralt zu sein. Nun habe ich Version 1.8.19 installiert und die entsprechenden Optionen sind verfügbar.
danke für die Rückmedung. So etwas habe ich schon vermutet. Mir ist nur nicht klar wie genau.
Das steht in der Datei:
board=uno
browser=mozilla
browser.linux=mozilla
build.verbose=false
console=true
console.auto_clear=true
console.error.file=stderr.txt
console.length=500
console.lines=4
console.output.file=stdout.txt
editor.antialias=false
editor.caret.blink=true
editor.divider.size=0
editor.divider.size.windows=2
editor.external=false
editor.font=Monospaced,plain,12
editor.font.macosx=Monaco,plain,10
editor.indent=true
editor.invalid=false
editor.keys.alternative_cut_copy_paste=true
editor.keys.alternative_cut_copy_paste.macosx=false
editor.keys.home_and_end_travel_far=false
editor.keys.home_and_end_travel_far.macosx=true
editor.keys.shift_backspace_is_delete=true
editor.languages.current=de
editor.tabs.expand=true
editor.tabs.size=2
editor.update_extension=true
editor.window.height.default=600
editor.window.height.min=290
editor.window.width.default=500
editor.window.width.min=400
export.applet.separate_jar_files=false
export.application.fullscreen=false
export.application.platform=true
export.application.platform.linux=true
export.application.platform.macosx=true
export.application.platform.windows=true
export.application.stop=true
export.delete_target_folder=true
last.screen.height=1200
last.screen.width=1920
last.sketch.count=0
launcher=xdg-open
platform.auto_file_type_associations=true
preproc.color_datatype=true
preproc.enhanced_casting=true
preproc.imports.list=java.applet.*,java.awt.Dimension,java.awt.Frame,java.awt.event.MouseEvent,java.awt.event.KeyEvent,java.awt.event.FocusEvent,java.awt.Image,java.io.*,java.net.*,java.text.*,java.util.*,java.util.zip.*,java.util.regex.*
preproc.output_parse_tree=false
preproc.save_build_files=false
preproc.substitute_floats=true
preproc.substitute_unicode=true
preproc.web_colors=true
programmer=arduino:avrispmkii
run.display=1
run.options=
run.options.memory=false
run.options.memory.initial=64
run.options.memory.maximum=256
run.present.bgcolor=#666666
run.present.exclusive=false
run.present.exclusive.macosx=true
run.present.stop.color=#cccccc
run.window.bgcolor=#DFDFDF
serial.databits=8
serial.debug_rate=9600
serial.parity=N
serial.port=COM1
serial.stopbits=1
sketchbook.path=/home/pi/sketchbook
target=arduino
update.check=true
update.id=9051235584657298541
update.last=1670872286467
upload.using=bootloader
upload.verbose=false
upload.verify=true
Display More
Hallo Zusammen,
ich möchte einen ESP8266 mittels eines Raspberry PI4 mit 8GB programmieren. Die Installation der Arduino IDE hat funktioniert. Im nächsten Schritt wollte ich in der Bordverwalter URL die entsprechenden Pfade eintragen. Leider fehlt die Möglichkeit dazu bei den Einstellungen. Stattdessen steht an der entsprechenden Stelle der Hinweis: "Mehr Einstellungen können direkt in der Datei geändert werden /.../.../preferences.txt" In der Datei finde ich aber keinen entsprechenden Eintrag. Eine Suche im Internet ergab nichts brauchbares. Offenbar taucht das Problem nur selten oder gar nicht auf. Ich hoffe sehr das mir hier trotzdem jemand helfen kann.
Viele Grüße Hanson
P.S. die installierte Version der Arduino IDE ist: 2:1.0.5
Hallo an Alle,
ich würde gern ein selbst geschriebenes Programm, dass einen Solar-Inverter ausliest und mir die Daten an openhab schickt automatisch nach jedem Neustart starten.
Ich dachte an einen cron job mittels @reboot leider funktioniert es nicht uns ich weiß nicht warum.
hier meine crontab:
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
@reboot root cd /etc/programmieren/Inverter_auslesen && ./Solar_Inverter start
Display More
und die Solar_Inverter Datei:
#!/bin/bash
if [ $# -ne 1 ]
then
echo -e "only one parameter is needed type ~ Solar_Inverter start~ to start the service\nor ~Solar_Inverter stop~ to stop it"
fi
if [ "$1" = "start" ]
then
echo "Just an empty file as dummy to stop the inverter programm\n If this file exists the programm will shut down\n The file is created aufter starting the programm.">Solar_Inverter.txt
sudo nohup ./Inverter_0-2.bin &
echo "Solar_Inverter communication started ..."
elif [ "$1" = "stop" ]
then
rm Solar_Inverter.txt
echo "Solar_Inverter communication stopped ..."
else
echo "unknown parameter - type ~Solar_Inverter start~ or ~Solar_Inverter stop~"
fi
Display More
das programm starte ich normalerweise von Hand so:
gefolgt von:
Ich probiere jetzt schon eine Weile herum, komme aber auf keinen grünen Zweig. Für helfende Tipps währe ich sehr dankbar.
Geht klar. Ihr ebenso.
Hier noch der Code (aufbauend auf den zuvor verlinkten Code-Beispielen) mit dem ich nach Invertern suche, die über USB (hidraw) verbunden sind und deren ID auslese. Der Sinn dahinter ist, dass man für ein 3-Phasiges Netz min. 3 Inverter parallel schalten muss. Diese wollen natürlich alle ausgelesen werden. Eine Erweiterung der Suche nach ttyUSBx, ist trivial denke ich. Sicher der Programmierstil ist bestimmt nicht der edelste, aber ersollte einigermaßen nachvollziehbar sein. Nochmals vielen Dank und bis zum nächsten Erkenntnis-Event
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h> // setup serialport
#include <errno.h> // Error numbers
#include <strings.h>
#include <string.h>
#include <time.h>
// variable declaration
int start = 0;
int n;
int cmd_length;
int fd; /* File Descriptor /handle for Port */
int hidraw_number = 0;
int i; // Simple Counter
int sent;
long int started;
char *devicename;
char hidraw_number_char[15];
char hidraw_path[15];
char *startbit = 0;
char *endbit = 0;
char write_QID[]= {0x51, 0x49, 0x44, 0xd6, 0xea, 0xd} ; /* Command for getting Inverter ID */
char read_QID[200]; // Buffer for reading Inverter ID
char Response_length_QID=200;
char first_sign_of_response[20];
FILE* pfilehandle;
// function declaration
int check_port();
int open_port();
int get_QID();
int main(void)
{
while(1){
//strcpy(first_sign_of_response,"(");
check_port();
usleep(500);
}
}
int check_port()
{
printf("Checking for connented Inverterts -- \n");
while(hidraw_number <=9)
{
sprintf(hidraw_number_char,"%d",hidraw_number); // konvert from int to char
strcpy (hidraw_path, "/dev/hidraw"); // fill variable with path as text
devicename = strcat(hidraw_path,hidraw_number_char); //combine path and number into string
printf("Checking chanel: %s",devicename);
if((pfilehandle = fopen(devicename, "r")) != NULL) // check if coressponding file exists
// "/dev/hidraw0-9" max 9 Inverters in parralel
// or series circuit
{
open_port();
get_QID();
}
else
{
{
printf(" -- not connected\n");
}
}
hidraw_number++;
}
hidraw_number = 0;
return 0;
}
int open_port()
{
/*
*
* RS232-Parameter
* - 2400 baud
* - 8 bits/byte
* - no parity
* - no handshake
* - 1 stop bit
*/
//struct termios settings;
fd = open(devicename, O_RDWR | O_NONBLOCK);
if (fd == -1)
{
printf("INVERTER: Unable to open device file (errno=%d)", errno);
}
speed_t baud = B2400;
struct termios settings;
tcgetattr(fd, &settings);
cfsetospeed(&settings,baud);
settings.c_cflag &= ~PARENB;
settings.c_cflag &= ~CSTOPB; // 1 stop bit
settings.c_cflag &= ~CSIZE;
settings.c_cflag |= CS8 | CLOCAL; // 8 bits
// settings.c_lflag = ICANON; // canonical mode
settings.c_oflag &= ~OPOST; // raw output
tcsetattr(fd, TCSANOW, &settings); // apply the settings
tcflush(fd, TCOFLUSH);
return(fd);
}
int get_QID()
{
cmd_length = sizeof write_QID;
sent = write(fd,write_QID,cmd_length);
sleep(1);
start = 1;
time(&started);
do
{
n = read(fd,(void*)read_QID+i,120-i);
if (n < 0)
{
if (time(NULL) - started > 8)
{
printf("INVERTER: read timeout");
break;
}
else
{
usleep(100);
continue;
}
}
i += n;
startbit = (char *)&read_QID[0];
endbit = strchr(startbit, '\r');
} while(endbit == NULL);
printf(" -- Inverter-ID: %s\n",read_QID);
close(fd);
n = 0;
i = 0;
return 0;
}
Display More
Guten Abend,
danke für Eure Unterstützung. Das letzte Code-Beispiel und die Kommentare habens's gebracht.
Ich kann jetzt schon mal die ID des Inverters auslesen.
dann habe ich deinen Vorschlag offensichtlich falsch verstanden, denn ich versuche genau dass, was du geraten hast.
@__deets__ Das mein C etwas eingerostet und rudimentär ist mag sein, aber mich frustriert das ganz und gar nicht.
Erkenntnis ist die größte Form des Entertainments
Also meine Schleife zur Abfrage sieht jetzt wie folgt aus:
char read_QID[200]; // Buffer for reading Inverter ID
char Response_length_QID=200;
char first_sign_of_response[20];
int get_QID()
{
cmd_length = sizeof write_QID;
sent = write(fd,write_QID,cmd_length);
sleep(1);
start = 1;
time(&started);
do
{
anz = read(fd,&read_QID[i],1);
if (anz < 0)
{
if (time(NULL) - started > 5)
{
printf("INVERTER: read timeout");
break;
//continue;
}
else
{
//while(strcmp(&read_QID[i],first_sign_of_response) != 0)
//{
//printf("Aktuelles Zeichen: %d\n",read_QID[i]);
// wait for first Sign of response
//}
usleep(100);
continue;
}
}
printf("Incoming sign: %d\n",read_QID[i]);
if(strcmp(&read_QID[i],first_sign_of_response) != 0)
{
start = 1;
}
if (start == 1)
{
printf("Nr. %d of %d): %d\n",i,Response_length_QID,read_QID[i]);
i ++;
}
} while (i<=Response_length_QID);
printf("Inverter-ID: %s\n",read_QID);
return 0;
}
Display More
Das Auslesen funktioniert auch anfangs, aber immer nach Zeichen Nr. 2 wird das Programm mit der Meldung "INVERTER: read timeout" abgebrochen. Mir ist aber völlig unklar warum? Ansonsten scheint das zeichenweise Auslesen mit der Schleife prinzipiell zu funktionieren.
Habt ihr vielleicht eine Idee, was ich falsch mache?
Guten morgen,
und vielen Dank für die Hinweise an eine Schleife zum Einlesen haben ich auch schon gedacht. Ich merke aber das ich mich erst wieder in C hineinfuchsen muss. Ist alles schon lange her.
Ich bastel gerade an dem Code. Ich konnte auch schon ganze Antworten empfangen. Leider nicht immer vollständig. Mein Gedanke war jetzt einzelne Bytes lesen und prüfen wann das Startzeichen kommt. Eure Hinweise helfen also sehr
Hallo Bernd666,
QuoteEs sollte so sein: "anz = read(fd, &input, sizeof (input) );"
Das hat leider nichts geändert. Auch den Antwortbuffer habe ich schon auf 100 erhöht - ohne Erfolg.